Compute shader support detected at runtime.
This commit is contained in:
@@ -497,6 +497,7 @@ void IrrDriver::initDevice()
|
||||
hasBaseInstance = false;
|
||||
hasBuffserStorage = false;
|
||||
hasDrawIndirect = false;
|
||||
hasComputeShaders = false;
|
||||
// Default false value for hasVSLayer if --no-graphics argument is used
|
||||
if (!ProfileWorld::isNoGraphics())
|
||||
{
|
||||
@@ -516,6 +517,10 @@ void IrrDriver::initDevice()
|
||||
hasDrawIndirect = true;
|
||||
Log::info("GLDriver", "ARB Draw Indirect enabled");
|
||||
}
|
||||
if (GLEW_ARB_compute_shader) {
|
||||
hasComputeShaders = true;
|
||||
Log::info("GLDriver", "ARB Compute Shader enabled");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -203,6 +203,7 @@ private:
|
||||
bool hasBaseInstance;
|
||||
bool hasDrawIndirect;
|
||||
bool hasBuffserStorage;
|
||||
bool hasComputeShaders;
|
||||
bool m_need_ubo_workaround;
|
||||
bool m_need_rh_workaround;
|
||||
bool m_need_srgb_workaround;
|
||||
@@ -324,6 +325,11 @@ public:
|
||||
return hasBuffserStorage;
|
||||
}
|
||||
|
||||
bool hasARBComputeShaders() const
|
||||
{
|
||||
return hasComputeShaders;
|
||||
}
|
||||
|
||||
video::SColorf getAmbientLight() const;
|
||||
|
||||
struct GlowData {
|
||||
|
||||
@@ -337,15 +337,12 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a
|
||||
assert(in_fbo.getWidth() == auxiliary.getWidth() && in_fbo.getHeight() == auxiliary.getHeight());
|
||||
float inv_width = 1.0f / in_fbo.getWidth(), inv_height = 1.0f / in_fbo.getHeight();
|
||||
{
|
||||
#if WIN32
|
||||
if (irr_driver->getGLSLVersion() < 430)
|
||||
#endif
|
||||
if (irr_driver->hasARBComputeShaders())
|
||||
{
|
||||
auxiliary.Bind();
|
||||
FullScreenShader::Gaussian17TapHShader::getInstance()->SetTextureUnits(createVector<GLuint>(in_fbo.getRTT()[0], irr_driver->getFBO(FBO_LINEAR_DEPTH).getRTT()[0]));
|
||||
DrawFullScreenEffect<FullScreenShader::Gaussian17TapHShader>(core::vector2df(inv_width, inv_height));
|
||||
}
|
||||
#if WIN32
|
||||
else
|
||||
{
|
||||
|
||||
@@ -356,19 +353,15 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a
|
||||
FullScreenShader::ComputeGaussian17TapHShader::getInstance()->setUniforms();
|
||||
glDispatchCompute(in_fbo.getWidth() / 8, in_fbo.getHeight() / 8, 1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
{
|
||||
#if WIN32
|
||||
if (irr_driver->getGLSLVersion() < 430)
|
||||
#endif
|
||||
if (irr_driver->hasARBComputeShaders())
|
||||
{
|
||||
in_fbo.Bind();
|
||||
|
||||
FullScreenShader::Gaussian17TapVShader::getInstance()->SetTextureUnits(createVector<GLuint>(auxiliary.getRTT()[0], irr_driver->getFBO(FBO_LINEAR_DEPTH).getRTT()[0]));
|
||||
DrawFullScreenEffect<FullScreenShader::Gaussian17TapVShader>(core::vector2df(inv_width, inv_height));
|
||||
}
|
||||
#if WIN32
|
||||
else
|
||||
{
|
||||
glUseProgram(FullScreenShader::ComputeGaussian17TapVShader::getInstance()->Program);
|
||||
@@ -378,7 +371,6 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a
|
||||
FullScreenShader::ComputeGaussian17TapVShader::getInstance()->setUniforms();
|
||||
glDispatchCompute(in_fbo.getWidth() / 8, in_fbo.getHeight() / 8, 1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1727,8 +1727,8 @@ namespace FullScreenShader
|
||||
|
||||
ComputeGaussian17TapHShader::ComputeGaussian17TapHShader()
|
||||
{
|
||||
#if WIN32
|
||||
if (irr_driver->getGLSLVersion() < 420)
|
||||
|
||||
if (irr_driver->hasARBComputeShaders())
|
||||
return;
|
||||
Program = LoadProgram(
|
||||
GL_COMPUTE_SHADER, file_manager->getAsset("shaders/bilateralH.comp").c_str());
|
||||
@@ -1737,7 +1737,6 @@ namespace FullScreenShader
|
||||
TU_dest = 2;
|
||||
AssignUniforms();
|
||||
AssignTextureUnit(Program, TexUnit(TU_source, "source"), TexUnit(TU_depth, "depth"), TexUnit(TU_dest, "dest"));
|
||||
#endif
|
||||
}
|
||||
|
||||
Gaussian6HBlurShader::Gaussian6HBlurShader()
|
||||
@@ -1772,8 +1771,7 @@ namespace FullScreenShader
|
||||
|
||||
ComputeGaussian17TapVShader::ComputeGaussian17TapVShader()
|
||||
{
|
||||
#if WIN32
|
||||
if (irr_driver->getGLSLVersion() < 420)
|
||||
if (irr_driver->hasARBComputeShaders())
|
||||
return;
|
||||
Program = LoadProgram(
|
||||
GL_COMPUTE_SHADER, file_manager->getAsset("shaders/bilateralV.comp").c_str());
|
||||
@@ -1781,7 +1779,6 @@ namespace FullScreenShader
|
||||
TU_depth = 1;
|
||||
TU_dest = 2;
|
||||
AssignTextureUnit(Program, TexUnit(TU_source, "source"), TexUnit(TU_depth, "depth"), TexUnit(TU_dest, "dest"));
|
||||
#endif
|
||||
}
|
||||
|
||||
Gaussian6VBlurShader::Gaussian6VBlurShader()
|
||||
|
||||
Reference in New Issue
Block a user