diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2011-12-11 05:13:05 -0600 |
|---|---|---|
| committer | Jordan Woyak <jordan.woyak@gmail.com> | 2011-12-11 05:29:15 -0600 |
| commit | 5ae1f674f56851466b57ad9986a835e85eb3909c (patch) | |
| tree | 67dfd5e8f3f56f6f8bbb3b9ed78433490b361f67 /Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | |
| parent | 16b58a8825cae61d9f48aebfaa29182f0c687538 (diff) | |
make use of glMapBuffer to set ubo data
Diffstat (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp')
| -rw-r--r-- | Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index dd4fd6923f..df01055e65 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -25,6 +25,8 @@ namespace OGL ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLuint ProgramShaderCache::s_ps_ubo; GLuint ProgramShaderCache::s_vs_ubo; + float* ProgramShaderCache::s_ps_mapped_data; + float* ProgramShaderCache::s_vs_mapped_data; std::pair<u64, u64> ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { @@ -142,18 +144,55 @@ namespace OGL void ProgramShaderCache::SetMultiPSConstant4fv(unsigned int offset, const float *f, unsigned int count) { - 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); + if (!s_ps_mapped_data) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); + s_ps_mapped_data = reinterpret_cast<float*>(glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY)); + glBindBuffer(GL_UNIFORM_BUFFER, 0); + + if (!s_ps_mapped_data) + PanicAlert("glMapBuffer"); + } + + std::copy(f, f + count * 4, s_ps_mapped_data + offset * 4); } 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); + if (!s_vs_mapped_data) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); + s_vs_mapped_data = reinterpret_cast<float*>(glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY)); + glBindBuffer(GL_UNIFORM_BUFFER, 0); + + if (!s_vs_mapped_data) + PanicAlert("glMapBuffer"); + } + + std::copy(f, f + count * 4, s_vs_mapped_data + offset * 4); + } + + void ProgramShaderCache::FlushConstants() + { + if (s_ps_mapped_data) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_ps_ubo); + if (!glUnmapBuffer(GL_UNIFORM_BUFFER)) + PanicAlert("glUnmapBuffer"); + s_ps_mapped_data = NULL; + } + + if (s_vs_mapped_data) + { + glBindBuffer(GL_UNIFORM_BUFFER, s_vs_ubo); + if (!glUnmapBuffer(GL_UNIFORM_BUFFER)) + PanicAlert("glUnmapBuffer"); + s_vs_mapped_data = NULL; + } + glBindBuffer(GL_UNIFORM_BUFFER, 0); } - + GLuint ProgramShaderCache::GetCurrentProgram(void) { return CurrentProgram; } GLint ProgramShaderCache::GetAttr(int num) @@ -200,8 +239,11 @@ namespace OGL iter->second.Destroy(); pshaders.clear(); + // "A buffer object's mapped data store is automatically unmapped when the buffer object is deleted" glDeleteBuffers(1, &s_ps_ubo); - glDeleteBuffers(1, &s_ps_ubo); + glDeleteBuffers(1, &s_vs_ubo); + s_ps_ubo = s_vs_ubo = 0; + s_ps_mapped_data = s_vs_mapped_data = NULL; } } |
