diff options
| author | degasus <wickmarkus@web.de> | 2014-01-23 18:40:56 +0100 |
|---|---|---|
| committer | degasus <wickmarkus@web.de> | 2014-01-23 18:40:56 +0100 |
| commit | bfd0b7275e8dee8a72563a1b897e7e53b09c9076 (patch) | |
| tree | bb20309a18244be0da333940ce61dc0329412b50 /Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | |
| parent | 650bae12e1ddbebe992714db9b3eb9d38f2621fe (diff) | |
| parent | 1ff681a41284a757db9dfaa23b93c03aeb2c88f7 (diff) | |
Merge branch 'StreamBuffers'
This branch drops our temporary buffer in VertexLoaderBase.
Instead, every backend now must provide a buffer to convert vertices and indices.
D3D just uses a temporary buffer like before.
OGL maps the gpu based buffer and stream to them directly.
So this will avoid an unneeded memcpy on OGL backend.
Diffstat (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 38 |
1 files changed, 14 insertions, 24 deletions
diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 51b6e05063..000398c787 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)); - } + auto buffer = s_buffer->Map(s_ubo_buffer_size, s_ubo_align); + + memcpy(buffer.first, + &PixelShaderManager::constants, sizeof(PixelShaderConstants)); + + memcpy(buffer.first + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), + &VertexShaderManager::constants, sizeof(VertexShaderConstants)); + + s_buffer->Unmap(s_ubo_buffer_size); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->m_buffer, buffer.second, + sizeof(PixelShaderConstants)); + glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->m_buffer, buffer.second + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), + sizeof(VertexShaderConstants)); PixelShaderManager::dirty = false; VertexShaderManager::dirty = false; @@ -481,7 +471,7 @@ void ProgramShaderCache::Init(void) // 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 - s_buffer = new StreamBuffer(GL_UNIFORM_BUFFER, UBO_LENGTH); + s_buffer = StreamBuffer::Create(GL_UNIFORM_BUFFER, UBO_LENGTH); } // Read our shader cache, only if supported |
