Преглед изворни кода

OpenGL: Check if uniform block exists before updating it (#2581)

Jannik Vogel пре 9 година
родитељ
комит
e594e63bb5
1 измењених фајлова са 30 додато и 29 уклоњено
  1. 30 29
      src/video_core/renderer_opengl/gl_rasterizer.cpp

+ 30 - 29
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -1071,37 +1071,38 @@ void RasterizerOpenGL::SetShader() {
 
         current_shader = shader_cache.emplace(config, std::move(shader)).first->second.get();
 
-        unsigned int block_index =
-            glGetUniformBlockIndex(current_shader->shader.handle, "shader_data");
-        GLint block_size;
-        glGetActiveUniformBlockiv(current_shader->shader.handle, block_index,
-                                  GL_UNIFORM_BLOCK_DATA_SIZE, &block_size);
-        ASSERT_MSG(block_size == sizeof(UniformData),
-                   "Uniform block size did not match! Got %d, expected %zu",
-                   static_cast<int>(block_size), sizeof(UniformData));
-        glUniformBlockBinding(current_shader->shader.handle, block_index, 0);
-
-        // Update uniforms
-        SyncDepthScale();
-        SyncDepthOffset();
-        SyncAlphaTest();
-        SyncCombinerColor();
-        auto& tev_stages = Pica::g_state.regs.texturing.GetTevStages();
-        for (int index = 0; index < tev_stages.size(); ++index)
-            SyncTevConstColor(index, tev_stages[index]);
+        GLuint block_index = glGetUniformBlockIndex(current_shader->shader.handle, "shader_data");
+        if (block_index != GL_INVALID_INDEX) {
+            GLint block_size;
+            glGetActiveUniformBlockiv(current_shader->shader.handle, block_index,
+                                      GL_UNIFORM_BLOCK_DATA_SIZE, &block_size);
+            ASSERT_MSG(block_size == sizeof(UniformData),
+                       "Uniform block size did not match! Got %d, expected %zu",
+                       static_cast<int>(block_size), sizeof(UniformData));
+            glUniformBlockBinding(current_shader->shader.handle, block_index, 0);
+
+            // Update uniforms
+            SyncDepthScale();
+            SyncDepthOffset();
+            SyncAlphaTest();
+            SyncCombinerColor();
+            auto& tev_stages = Pica::g_state.regs.texturing.GetTevStages();
+            for (int index = 0; index < tev_stages.size(); ++index)
+                SyncTevConstColor(index, tev_stages[index]);
+
+            SyncGlobalAmbient();
+            for (int light_index = 0; light_index < 8; light_index++) {
+                SyncLightSpecular0(light_index);
+                SyncLightSpecular1(light_index);
+                SyncLightDiffuse(light_index);
+                SyncLightAmbient(light_index);
+                SyncLightPosition(light_index);
+                SyncLightDistanceAttenuationBias(light_index);
+                SyncLightDistanceAttenuationScale(light_index);
+            }
 
-        SyncGlobalAmbient();
-        for (int light_index = 0; light_index < 8; light_index++) {
-            SyncLightSpecular0(light_index);
-            SyncLightSpecular1(light_index);
-            SyncLightDiffuse(light_index);
-            SyncLightAmbient(light_index);
-            SyncLightPosition(light_index);
-            SyncLightDistanceAttenuationBias(light_index);
-            SyncLightDistanceAttenuationScale(light_index);
+            SyncFogColor();
         }
-
-        SyncFogColor();
     }
 }