Compute shader support detected at runtime.

This commit is contained in:
vlj
2014-09-05 18:28:41 +02:00
parent 8da557d153
commit d741204ee0
4 changed files with 16 additions and 16 deletions

View File

@@ -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");
}
}

View File

@@ -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 {

View File

@@ -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
}
}

View File

@@ -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()