summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2014-01-22 18:02:55 +0100
committerdegasus <wickmarkus@web.de>2014-01-23 15:12:31 +0100
commitbe1fee6d7476459a4c1fa09e1cb5b42dc005da54 (patch)
treed32e12457204c1b528b9d620fe46a74341dd7522 /Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
parent650bae12e1ddbebe992714db9b3eb9d38f2621fe (diff)
OpenGL: change StreamBuffer in a streaming way
This is a bit slower on map_and_* because of flushing and _very_ much slower on buffer(sub)?data because of a new memcpy. But this design allow us to decode directly into a gpu buffer, eg vertexloader will profit :)
Diffstat (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp36
1 files changed, 13 insertions, 23 deletions
diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
index 51b6e05063..8f3a545261 100644
--- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
+++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
@@ -193,29 +193,19 @@ void ProgramShaderCache::UploadConstants()
{
if(PixelShaderManager::dirty || VertexShaderManager::dirty)
{
- s_buffer->Alloc(s_ubo_buffer_size);
- if (DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTREAM))
- {
- // This is just a hack to support our BUFFERDATA upload method
- // as it's broken to uploaded in a splited way
- static u8 *tmpbuffer = new u8[s_ubo_buffer_size];
- memcpy(tmpbuffer, &PixelShaderManager::constants, sizeof(PixelShaderConstants));
- memcpy(tmpbuffer+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), &VertexShaderManager::constants, sizeof(VertexShaderConstants));
- size_t offset = s_buffer->Upload(tmpbuffer, s_ubo_buffer_size);
- glBindBufferRange(GL_UNIFORM_BUFFER, 1,
- s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants));
- glBindBufferRange(GL_UNIFORM_BUFFER, 2,
- s_buffer->getBuffer(), offset+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), sizeof(VertexShaderConstants));
- }
- else
- {
- size_t offset = s_buffer->Upload((u8*)&PixelShaderManager::constants, ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align));
- glBindBufferRange(GL_UNIFORM_BUFFER, 1,
- s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants));
- offset = s_buffer->Upload((u8*)&VertexShaderManager::constants, ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align));
- glBindBufferRange(GL_UNIFORM_BUFFER, 2,
- s_buffer->getBuffer(), offset, sizeof(VertexShaderConstants));
- }
+ u8* buffer = s_buffer->Map(s_ubo_buffer_size, s_ubo_align);
+
+ memcpy(buffer,
+ &PixelShaderManager::constants, sizeof(PixelShaderConstants));
+
+ memcpy(buffer + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align),
+ &VertexShaderManager::constants, sizeof(VertexShaderConstants));
+
+ size_t offset = s_buffer->Unmap(s_ubo_buffer_size);
+ glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->getBuffer(), offset,
+ sizeof(PixelShaderConstants));
+ glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->getBuffer(), offset + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align),
+ sizeof(VertexShaderConstants));
PixelShaderManager::dirty = false;
VertexShaderManager::dirty = false;