From 2fcb574c908980db23c120095c54501bf9c550f5 Mon Sep 17 00:00:00 2001 From: vlj <vljn@ovi.com> Date: Mon, 4 Aug 2014 01:45:08 +0200 Subject: [PATCH] Automate UBO fix detection. It only concerns Intel Sandy Bridge (maybe Ivy Bridge ?) gpu on Windows. --- src/config/user_config.hpp | 3 - src/graphics/callbacks.cpp | 2 +- src/graphics/glwrap.cpp | 2 +- src/graphics/irr_driver.cpp | 7 + src/graphics/irr_driver.hpp | 6 + src/graphics/render.cpp | 2 +- src/graphics/render_lighting.cpp | 2 +- src/graphics/rtts.cpp | 4 +- src/graphics/shaders.cpp | 213 ++++++++---------- src/graphics/shaders.hpp | 4 +- .../dialogs/custom_video_settings.cpp | 7 +- 11 files changed, 112 insertions(+), 140 deletions(-) diff --git a/src/config/user_config.hpp b/src/config/user_config.hpp index bf65f4633..6faba839d 100644 --- a/src/config/user_config.hpp +++ b/src/config/user_config.hpp @@ -446,9 +446,6 @@ namespace UserConfigParams PARAM_PREFIX BoolUserConfigParam m_high_definition_textures PARAM_DEFAULT(BoolUserConfigParam(true, "enable_high_definition_textures", &m_video_group, "Enable high definition textures")); - PARAM_PREFIX BoolUserConfigParam m_ubo_disabled - PARAM_DEFAULT(BoolUserConfigParam(false, "disable_ubo_support", - &m_video_group, "Disable UBO support")); PARAM_PREFIX BoolUserConfigParam m_glow PARAM_DEFAULT(BoolUserConfigParam(false, "enable_glow", &m_video_group, "Enable Glow")); diff --git a/src/graphics/callbacks.cpp b/src/graphics/callbacks.cpp index d8487deea..bfbb6180b 100644 --- a/src/graphics/callbacks.cpp +++ b/src/graphics/callbacks.cpp @@ -220,7 +220,7 @@ void SunLightProvider::OnSetConstants(IMaterialRendererServices *srv, int) m_wind[1] += winddir.Z; srv->setVertexShaderConstant("wind", m_wind, 2); - if (UserConfigParams::m_shadows && !UserConfigParams::m_ubo_disabled) + if (UserConfigParams::m_shadows) { srv->setVertexShaderConstant("shadowmat", m_shadowmat.pointer(), 16); } diff --git a/src/graphics/glwrap.cpp b/src/graphics/glwrap.cpp index 08089b0d7..8b4ff6e79 100644 --- a/src/graphics/glwrap.cpp +++ b/src/graphics/glwrap.cpp @@ -274,7 +274,7 @@ GLuint LoadShader(const char * file, unsigned type) std::string Code = versionString; std::ifstream Stream(file, std::ios::in); Code += "//" + std::string(file) + "\n"; - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) Code += "#define UBO_DISABLED\n"; if (irr_driver->hasVSLayerExtension()) Code += "#define VSLayer\n"; diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index 6808684f1..18b27f59f 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -454,6 +454,13 @@ void IrrDriver::initDevice() Log::info("IrrDriver", "OpenGL vendor: %s", glGetString(GL_VENDOR)); Log::info("IrrDriver", "OpenGL renderer: %s", glGetString(GL_RENDERER)); Log::info("IrrDriver", "OpenGL version string: %s", glGetString(GL_VERSION)); + + m_need_ubo_workaround = false; +#ifdef WIN32 + // Fix for Intel Sandy Bridge on Windows which supports GL up to 3.1 only + if (strstr((const char *)glGetString(GL_VENDOR), "Intel") != nullptr && (GLMajorVersion == 3 && GLMinorVersion == 1)) + m_need_ubo_workaround = true; +#endif } m_glsl = (GLMajorVersion > 3 || (GLMajorVersion == 3 && GLMinorVersion >= 1)); diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp index 8118f0948..a36b1945e 100644 --- a/src/graphics/irr_driver.hpp +++ b/src/graphics/irr_driver.hpp @@ -196,6 +196,7 @@ class IrrDriver : public IEventReceiver, public NoCopy private: int GLMajorVersion, GLMinorVersion; bool hasVSLayer; + bool m_need_ubo_workaround; /** The irrlicht device. */ IrrlichtDevice *m_device; /** Irrlicht scene manager. */ @@ -279,6 +280,11 @@ public: return 120; } + bool needUBOWorkaround() const + { + return m_need_ubo_workaround; + } + bool hasVSLayerExtension() const { return hasVSLayer; diff --git a/src/graphics/render.cpp b/src/graphics/render.cpp index bf8f29a63..2b3bb5903 100644 --- a/src/graphics/render.cpp +++ b/src/graphics/render.cpp @@ -279,7 +279,7 @@ void IrrDriver::renderScene(scene::ICameraSceneNode * const camnode, unsigned po // To avoid wrong culling, use the largest view possible m_scene_manager->setActiveCamera(m_suncam); if (!m_mipviz && !m_wireframe && UserConfigParams::m_dynamic_lights && - UserConfigParams::m_shadows && !UserConfigParams::m_ubo_disabled && hasShadow) + UserConfigParams::m_shadows && !irr_driver->needUBOWorkaround() && hasShadow) renderShadows(); m_scene_manager->setActiveCamera(camnode); PROFILER_POP_CPU_MARKER(); diff --git a/src/graphics/render_lighting.cpp b/src/graphics/render_lighting.cpp index 2622c3f76..8253ef4cb 100644 --- a/src/graphics/render_lighting.cpp +++ b/src/graphics/render_lighting.cpp @@ -171,7 +171,7 @@ void IrrDriver::renderLights(unsigned pointlightcount) if (!World::getWorld() || World::getWorld()->getTrack()->hasShadows()) { ScopedGPUTimer timer(irr_driver->getGPUTimer(Q_SUN)); - if (World::getWorld() && UserConfigParams::m_shadows && !UserConfigParams::m_ubo_disabled) + if (World::getWorld() && UserConfigParams::m_shadows && !irr_driver->needUBOWorkaround()) m_post_processing->renderShadowedSunlight(sun_ortho_matrix, m_rtts->getShadowDepthTex()); else m_post_processing->renderSunlight(); diff --git a/src/graphics/rtts.cpp b/src/graphics/rtts.cpp index c2611a805..aa6ecb6e2 100644 --- a/src/graphics/rtts.cpp +++ b/src/graphics/rtts.cpp @@ -226,7 +226,7 @@ RTT::RTT(size_t width, size_t height) somevector.push_back(RenderTargetTextures[RTT_TMP_128]); FrameBuffers.push_back(new FrameBuffer(somevector, 128, 128)); - if (UserConfigParams::m_shadows && !UserConfigParams::m_ubo_disabled) + if (UserConfigParams::m_shadows && !irr_driver->needUBOWorkaround()) { shadowColorTex = generateRTT3D(GL_TEXTURE_2D_ARRAY, 1024, 1024, 4, GL_R8, GL_RED, GL_UNSIGNED_BYTE); shadowDepthTex = generateRTT3D(GL_TEXTURE_2D_ARRAY, 1024, 1024, 4, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); @@ -265,7 +265,7 @@ RTT::~RTT() { glDeleteTextures(RTT_COUNT, RenderTargetTextures); glDeleteTextures(1, &DepthStencilTexture); - if (UserConfigParams::m_shadows && !UserConfigParams::m_ubo_disabled) + if (UserConfigParams::m_shadows && !irr_driver->needUBOWorkaround()) { delete m_shadow_FBO; glDeleteTextures(1, &shadowColorTex); diff --git a/src/graphics/shaders.cpp b/src/graphics/shaders.cpp index 48c1f7731..e8c71ea05 100644 --- a/src/graphics/shaders.cpp +++ b/src/graphics/shaders.cpp @@ -491,16 +491,15 @@ namespace UtilShader glEnableVertexAttribArray(attrib_position); glVertexAttribPointer(attrib_position, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0); uniform_color = glGetUniformLocation(Program, "color"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + } void ColoredLine::setUniforms(const irr::video::SColor &col) { - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) bypassUBO(Program); glUniform4i(uniform_color, col.getRed(), col.getGreen(), col.getBlue(), col.getAlpha()); glUniformMatrix4fv(glGetUniformLocation(Program, "ModelMatrix"), 1, GL_FALSE, core::IdentityMatrix.pointer()); @@ -609,11 +608,10 @@ namespace MeshShader GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/encode_normal.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_pass1.frag").c_str()); AssignUniforms("ModelMatrix", "InverseModelMatrix"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + TU_tex = 0; AssignTextureUnit(Program, TexUnit(TU_tex, "tex")); } @@ -625,11 +623,10 @@ namespace MeshShader GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/encode_normal.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/objectref_pass1.frag").c_str()); AssignUniforms("ModelMatrix", "InverseModelMatrix", "TextureMatrix"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + TU_tex = 0; AssignTextureUnit(Program, TexUnit(TU_tex, "tex")); } @@ -652,11 +649,10 @@ namespace MeshShader GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/encode_normal.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/normalmap.frag").c_str()); AssignUniforms("ModelMatrix", "InverseModelMatrix"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + TU_normalmap = 1; TU_glossy = 0; AssignTextureUnit(Program, TexUnit(TU_normalmap, "normalMap"), TexUnit(TU_glossy, "DiffuseForAlpha")); @@ -671,11 +667,9 @@ namespace MeshShader GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_pass1.frag").c_str()); TU_tex = 0; AssignTextureUnit(Program, TexUnit(TU_tex, "tex")); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); } InstancedObjectRefPass1Shader::InstancedObjectRefPass1Shader() @@ -687,11 +681,9 @@ namespace MeshShader GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/objectref_pass1.frag").c_str()); TU_tex = 0; AssignTextureUnit(Program, TexUnit(TU_tex, "tex")); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); } InstancedGrassPass1Shader::InstancedGrassPass1Shader() @@ -704,11 +696,9 @@ namespace MeshShader AssignUniforms("windDir"); TU_tex = 0; AssignTextureUnit(Program, TexUnit(TU_tex, "tex")); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); } // Solid Lit pass shaders @@ -719,11 +709,10 @@ namespace MeshShader GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_pass2.frag").c_str()); AssignUniforms("ModelMatrix", "TextureMatrix", "ambient"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + TU_Albedo = 3; AssignTextureUnit(Program, @@ -751,11 +740,9 @@ namespace MeshShader TexUnit(TU_Albedo, "Albedo") ); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + } InstancedObjectRefPass2Shader::InstancedObjectRefPass2Shader() @@ -806,11 +793,10 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_unlit.frag").c_str()); AssignUniforms("ModelMatrix"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + TU_tex = 3; AssignTextureUnit(Program, TexUnit(TU_tex, "tex")); @@ -823,11 +809,10 @@ namespace MeshShader GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/objectref_pass2.frag").c_str()); AssignUniforms("ModelMatrix", "TextureMatrix", "ambient"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + TU_Albedo = 3; AssignTextureUnit(Program, @@ -886,11 +871,10 @@ namespace MeshShader GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getPosFromUVDepth.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/objectpass_spheremap.frag").c_str()); AssignUniforms("ModelMatrix", "InverseModelMatrix", "ambient"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + TU_tex = 3; AssignTextureUnit(Program, @@ -955,11 +939,10 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/transparent.frag").c_str()); AssignUniforms("ModelMatrix", "TextureMatrix"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + TU_tex = 0; AssignTextureUnit(Program, TexUnit(TU_tex, "tex")); @@ -971,11 +954,10 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/transparentfog.frag").c_str()); AssignUniforms("ModelMatrix", "TextureMatrix", "fogmax", "startH", "endH", "start", "end", "col"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + TU_tex = 0; AssignTextureUnit(Program, TexUnit(TU_tex, "tex")); @@ -1028,16 +1010,14 @@ namespace MeshShader GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/colorize.frag").c_str()); uniform_MM = glGetUniformLocation(Program, "ModelMatrix"); uniform_col = glGetUniformLocation(Program, "col"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); } void ColorizeShader::setUniforms(const core::matrix4 &ModelMatrix, float r, float g, float b) { - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) bypassUBO(Program); glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer()); glUniform3f(uniform_col, r, g, b); @@ -1237,11 +1217,9 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/displace.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str()); AssignUniforms("ModelMatrix"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); } DisplaceMaskShader *DisplaceMaskShaderInstance; @@ -1283,11 +1261,9 @@ namespace MeshShader attrib_position = glGetAttribLocation(Program, "Position"); uniform_MM = glGetUniformLocation(Program, "ModelMatrix"); uniform_tex = glGetUniformLocation(Program, "tex"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); glGenVertexArrays(1, &cubevao); glBindVertexArray(cubevao); @@ -1300,7 +1276,7 @@ namespace MeshShader void SkyboxShader::setUniforms(const core::matrix4 &ModelMatrix, const core::vector2df &screen, unsigned TU_tex) { - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) bypassUBO(Program); glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer()); glUniform1i(uniform_tex, TU_tex); @@ -1318,11 +1294,10 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/frustrum.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/coloredquad.frag").c_str()); attrib_position = glGetAttribLocation(Program, "Position"); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); + uniform_color = glGetUniformLocation(Program, "color"); uniform_idx = glGetUniformLocation(Program, "idx"); @@ -1396,7 +1371,7 @@ namespace LightShader void PointLightShader::setUniforms(const core::vector2df &screen, unsigned spec, unsigned TU_ntex, unsigned TU_dtex) { - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) bypassUBO(Program); glUniform1f(uniform_spec, 200); @@ -1740,16 +1715,14 @@ namespace FullScreenShader uniform_direction = glGetUniformLocation(Program, "direction"); uniform_col = glGetUniformLocation(Program, "col"); vao = createFullScreenVAO(Program); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); } void SunLightShader::setUniforms(const core::vector3df &direction, float r, float g, float b, unsigned TU_ntex, unsigned TU_dtex) { - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) bypassUBO(Program); glUniform3f(uniform_direction, direction.X, direction.Y, direction.Z); glUniform3f(uniform_col, r, g, b); @@ -1810,16 +1783,14 @@ namespace FullScreenShader uniform_direction = glGetUniformLocation(Program, "direction"); uniform_col = glGetUniformLocation(Program, "col"); vao = createFullScreenVAO(Program); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); } void ShadowedSunLightShader::setUniforms(const core::vector3df &direction, float r, float g, float b, unsigned TU_ntex, unsigned TU_dtex, unsigned TU_shadowtex) { - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) bypassUBO(Program); glUniform3f(uniform_direction, direction.X, direction.Y, direction.Z); glUniform3f(uniform_col, r, g, b); @@ -1849,16 +1820,14 @@ namespace FullScreenShader uniform_direction = glGetUniformLocation(Program, "direction"); uniform_col = glGetUniformLocation(Program, "col"); vao = createVAO(Program); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); } void ShadowedSunLightDebugShader::setUniforms(const core::vector3df &direction, float r, float g, float b, unsigned TU_ntex, unsigned TU_dtex, unsigned TU_shadowtex) { - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) bypassUBO(Program); glUniform3f(uniform_direction, direction.X, direction.Y, direction.Z); glUniform3f(uniform_col, r, g, b); @@ -2189,11 +2158,9 @@ namespace FullScreenShader uniform_noise_texture = glGetUniformLocation(Program, "noise_texture"); uniform_samplePoints = glGetUniformLocation(Program, "samplePoints[0]"); vao = createFullScreenVAO(Program); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); // SSAOSamples[4 * i] and SSAOSamples[4 * i + 1] can be negative @@ -2311,7 +2278,7 @@ namespace FullScreenShader void SSAOShader::setUniforms(const core::vector2df &screen, unsigned TU_dtex, unsigned TU_noise) { - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) bypassUBO(Program); glUniform4fv(uniform_samplePoints, 16, SSAOSamples); @@ -2343,16 +2310,14 @@ namespace FullScreenShader uniform_end = glGetUniformLocation(Program, "end"); uniform_col = glGetUniformLocation(Program, "col"); vao = createFullScreenVAO(Program); - if (!UserConfigParams::m_ubo_disabled) - { - GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); - glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - } + + GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); + glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); } void FogShader::setUniforms(float fogmax, float startH, float endH, float start, float end, const core::vector3df &col, unsigned TU_ntex) { - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) bypassUBO(Program); glUniform1f(uniform_fogmax, fogmax); glUniform1f(uniform_startH, startH); diff --git a/src/graphics/shaders.hpp b/src/graphics/shaders.hpp index 631abf54e..f16028c5f 100644 --- a/src/graphics/shaders.hpp +++ b/src/graphics/shaders.hpp @@ -128,7 +128,7 @@ public: void setUniforms(const Args & ... args) const { - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) bypassUBO(Program); UniformHelper::setUniformsHelper(uniforms, args...); } @@ -158,7 +158,7 @@ public: void setUniforms(const Args & ... args) const { - if (UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) bypassUBO(Program); UniformHelper::setUniformsHelper(uniforms, args...); } diff --git a/src/states_screens/dialogs/custom_video_settings.cpp b/src/states_screens/dialogs/custom_video_settings.cpp index 0b979dd17..f3c995af1 100644 --- a/src/states_screens/dialogs/custom_video_settings.cpp +++ b/src/states_screens/dialogs/custom_video_settings.cpp @@ -22,6 +22,7 @@ #include "guiengine/widgets/spinner_widget.hpp" #include "states_screens/options_screen_video.hpp" #include "utils/translation.hpp" +#include "graphics/irr_driver.hpp" #include <IGUIEnvironment.h> @@ -51,7 +52,6 @@ void CustomVideoSettingsDialog::beforeAddingWidgets() { getWidget<CheckBoxWidget>("anim_gfx")->setState( UserConfigParams::m_graphical_effects ); getWidget<CheckBoxWidget>("weather_gfx")->setState( UserConfigParams::m_weather_effects ); - getWidget<CheckBoxWidget>("ubo")->setState(!UserConfigParams::m_ubo_disabled); getWidget<CheckBoxWidget>("dof")->setState(UserConfigParams::m_dof); getWidget<CheckBoxWidget>("hd-textures")->setState(UserConfigParams::m_high_definition_textures); @@ -83,7 +83,7 @@ void CustomVideoSettingsDialog::beforeAddingWidgets() shadows->addLabel( _("Disabled") ); // 0 shadows->addLabel( _("low") ); // 1 shadows->addLabel( _("high") ); // 2 - if (!UserConfigParams::m_ubo_disabled) + if (irr_driver->needUBOWorkaround()) shadows->setValue(UserConfigParams::m_shadows); else shadows->setValue(0); @@ -150,9 +150,6 @@ GUIEngine::EventPropagation CustomVideoSettingsDialog::processEvent(const std::s UserConfigParams::m_weather_effects = getWidget<CheckBoxWidget>("weather_gfx")->getState(); - UserConfigParams::m_ubo_disabled = - !getWidget<CheckBoxWidget>("ubo")->getState(); - UserConfigParams::m_high_definition_textures = getWidget<CheckBoxWidget>("hd-textures")->getState();