diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2011-12-11 04:11:57 -0600 |
|---|---|---|
| committer | Jordan Woyak <jordan.woyak@gmail.com> | 2011-12-11 04:28:02 -0600 |
| commit | 031c523fbab44d92fbd01993c1d44a0e8713139e (patch) | |
| tree | 2f9a1c89ced003cb34071158f1fb3bf025302822 /Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | |
| parent | fbef258dab883492d306fc29823229616a090b41 (diff) | |
have separate variables/functions for VS/PS ubo stuff, array was confusing.
Diffstat (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp')
| -rw-r--r-- | Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index adaa4babc3..3be1e76aff 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -23,7 +23,8 @@ namespace OGL { GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0; ProgramShaderCache::PCache ProgramShaderCache::pshaders; - GLuint ProgramShaderCache::UBOBuffers[2]; + GLuint ProgramShaderCache::s_ps_ubo; + GLuint ProgramShaderCache::s_vs_ubo; std::pair<u64, u64> ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { @@ -138,22 +139,21 @@ namespace OGL CurrentShaderProgram = ShaderPair; CurrentProgram = entry.program.glprogid; } - void ProgramShaderCache::SetUniformObjects(int Buffer, unsigned int offset, const float *f, unsigned int count) - { - assert(Buffer > 1); - static int _Buffer = -1; - if(_Buffer != Buffer) + + void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) { - _Buffer = Buffer; - glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[_Buffer]); + glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); + glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, count * sizeof(float) * 4, f); + glBindBuffer(GL_UNIFORM_BUFFER, 0); } - // Query for the offsets of each block variable - - // glBufferSubData expects data in bytes, so multiply count by four - // Expects the offset in bytes as well, so multiply by *4 *4 since we are passing in a vec4 location - glBufferSubData(GL_UNIFORM_BUFFER, offset * 4 * 4, count * 4 * 4, f); - + + void ProgramShaderCache::SetMultiVSConstant4fv(unsigned int offset, const float *f, unsigned int count) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); + glBufferSubData(GL_UNIFORM_BUFFER, offset * sizeof(float) * 4, count * sizeof(float) * 4, f); + glBindBuffer(GL_UNIFORM_BUFFER, 0); } + GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } GLint ProgramShaderCache::GetAttr(int num) @@ -173,32 +173,35 @@ namespace OGL { GLint Align; glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &Align); - - glGenBuffers(2, UBOBuffers); - - glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[0]); + // We multiply by *4*4 because we need to get down to basic machine units. // So multiply by four to get how many floats we have from vec4s // Then once more to get bytes - glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_PENVCONST_END * 4 * 4, Align), NULL, GL_DYNAMIC_DRAW); + glGenBuffers(1, &s_ps_ubo); + glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); + glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_PENVCONST_END * sizeof(float) * 4, Align), NULL, GL_DYNAMIC_DRAW); + glGenBuffers(1, &s_vs_ubo); + glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); + glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_VENVCONST_END * sizeof(float) * 4, Align), NULL, GL_DYNAMIC_DRAW); + + glBindBuffer(GL_UNIFORM_BUFFER, 0); // Now bind the buffer to the index point // We know PS is 0 since we have it statically set in the shader - glBindBufferBase(GL_UNIFORM_BUFFER, 1, UBOBuffers[0]); - // Repeat for VS shader - glBindBuffer(GL_UNIFORM_BUFFER, UBOBuffers[1]); - glBufferData(GL_UNIFORM_BUFFER, ROUND_UP(C_VENVCONST_END * 4 * 4, Align), NULL, GL_DYNAMIC_DRAW); - glBindBufferBase(GL_UNIFORM_BUFFER, 2, UBOBuffers[1]); + glBindBufferBase(GL_UNIFORM_BUFFER, 1, s_ps_ubo); + glBindBufferBase(GL_UNIFORM_BUFFER, 2, s_vs_ubo); } } + void ProgramShaderCache::Shutdown(void) { PCache::iterator iter = pshaders.begin(); - for (; iter != pshaders.end(); iter++) + for (; iter != pshaders.end(); ++iter) iter->second.Destroy(); pshaders.clear(); - if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) - glDeleteBuffers(2, UBOBuffers); + + glDeleteBuffers(1, &s_ps_ubo); + glDeleteBuffers(1, &s_ps_ubo); } } |
