diff options
| author | Ryan Houdek <Sonicadvance1@Gmail.com> | 2013-10-16 11:27:58 +0000 |
|---|---|---|
| committer | Ryan Houdek <Sonicadvance1@Gmail.com> | 2013-10-16 11:27:58 +0000 |
| commit | f0bf5aa1132e17f84659f6fcbbbd71d9c3e459fd (patch) | |
| tree | 11f1abedb6afb14b11facbef847dd7fdba4b71e0 /Source/Core/VideoBackends | |
| parent | c234dc97c00cf5d47313478ef3896a52b461fef1 (diff) | |
Fix rendering on Adreno and Mali. This adds a new DriverDetails bug to know if the bufferstreaming is broken. Thanks degasus for fixing this.
Diffstat (limited to 'Source/Core/VideoBackends')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/Src/ProgramShaderCache.cpp | 29 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp | 3 |
2 files changed, 24 insertions, 8 deletions
diff --git a/Source/Core/VideoBackends/OGL/Src/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/Src/ProgramShaderCache.cpp index 51f41c063b..40eb206903 100644 --- a/Source/Core/VideoBackends/OGL/Src/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/Src/ProgramShaderCache.cpp @@ -198,12 +198,29 @@ void ProgramShaderCache::UploadConstants() if(PixelShaderManager::dirty || VertexShaderManager::dirty) { s_buffer->Alloc(s_ubo_buffer_size); - - 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)); - + 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)); + } + PixelShaderManager::dirty = false; VertexShaderManager::dirty = false; diff --git a/Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp b/Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp index 983d82103f..8eda452b32 100644 --- a/Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp +++ b/Source/Core/VideoBackends/OGL/Src/StreamBuffer.cpp @@ -34,8 +34,7 @@ StreamBuffer::StreamBuffer(u32 type, size_t size, StreamType uploadType) } if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERDATA) - && !DriverDetails::HasBug(DriverDetails::BUG_ISPOWERVR) - && !DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA)) + || DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTREAM)) m_uploadtype = BUFFERDATA; else if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERSUBDATA)) m_uploadtype = BUFFERSUBDATA; |
