summaryrefslogtreecommitdiff
path: root/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2013-08-23 17:52:47 +0200
committerdegasus <wickmarkus@web.de>2013-08-23 17:53:20 +0200
commitc9e13f6b7a7164ee2807cfdf64491659888994c4 (patch)
tree7419d30da8550531fe17898400c5aae1244f97ac /Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
parent1469342f8301745fb7695c5bffd0bde723419ad0 (diff)
ogl: fix ubo workaround
Diffstat (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp')
-rw-r--r--Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp40
1 files changed, 29 insertions, 11 deletions
diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
index d7cafb49ca..95c5c3f46d 100644
--- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
+++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
@@ -78,17 +78,35 @@ void SHADER::SetProgramVariables()
glUniformBlockBinding(glprogid, VSBlock_id, 2);
}
- // We cache our uniform locations for now
- // Once we move up to a newer version of GLSL, ~1.30
- // We can remove this
-
- // (Sonicadvance): For some reason this fails on my hardware
- //glGetUniformIndices(glprogid, NUM_UNIFORMS, UniformNames, UniformLocations);
- // Got to do it this crappy way.
- UniformLocations[0] = glGetUniformLocation(glprogid, UniformNames[0]);
- if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO)
- for (int a = 1; a < NUM_UNIFORMS; ++a)
- UniformLocations[a] = glGetUniformLocation(glprogid, UniformNames[a]);
+ // UBO workaround
+ for (int a = 0; a < NUM_UNIFORMS; ++a)
+ {
+ UniformLocations[a] = glGetUniformLocation(glprogid, UniformNames[a]);
+ UniformSize[a] = 0;
+ if(g_ActiveConfig.backend_info.bSupportsGLSLUBO)
+ break;
+ }
+ if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO)
+ {
+ int max_uniforms = 0;
+ char name[50];
+ int size;
+
+ glGetProgramiv(glprogid, GL_ACTIVE_UNIFORMS, &max_uniforms);
+ for(int i=0; i<max_uniforms; i++)
+ {
+ glGetActiveUniform(glprogid, i, sizeof(name), NULL, &size, NULL, name);
+ for (int a = 0; a < NUM_UNIFORMS; ++a)
+ {
+ if(strstr(name, UniformNames[a]))
+ {
+ UniformSize[a] = size;
+ break;
+ }
+ }
+ }
+ }
+
// Bind Texture Sampler
for (int a = 0; a <= 9; ++a)