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

This commit is contained in:
Jannik Vogel 2017-02-18 20:46:26 +01:00 committed by Yuri Kunde Schlesner
parent 3a96dd023f
commit e594e63bb5
1 changed files with 29 additions and 28 deletions

View File

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