From b26aa5936ddecbac8848befd9d59a984d2608a96 Mon Sep 17 00:00:00 2001 From: vladislavbelov Date: Tue, 26 Apr 2022 18:25:52 +0000 Subject: [PATCH] Avoids scoped binding of the already bound backend buffer. This was SVN commit r26831. --- .../backend/gl/DeviceCommandContext.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/source/renderer/backend/gl/DeviceCommandContext.cpp b/source/renderer/backend/gl/DeviceCommandContext.cpp index fe6e2bb4c1..8f30a51066 100644 --- a/source/renderer/backend/gl/DeviceCommandContext.cpp +++ b/source/renderer/backend/gl/DeviceCommandContext.cpp @@ -149,7 +149,10 @@ CDeviceCommandContext::CDeviceCommandContext(CDevice* device) glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, 0); for (std::pair& unit : m_BoundTextures) - unit.first = unit.second = 0; + { + unit.first = GL_TEXTURE_2D; + unit.second = 0; + } for (size_t index = 0; index < m_VertexAttributeFormat.size(); ++index) { m_VertexAttributeFormat[index].active = false; @@ -976,11 +979,23 @@ CDeviceCommandContext::ScopedBufferBind::ScopedBufferBind( m_CacheIndex = static_cast(buffer->GetType()); const GLenum target = BufferTypeToGLTarget(buffer->GetType()); const GLuint handle = buffer->GetHandle(); - glBindBufferARB(target, handle); + if (m_DeviceCommandContext->m_BoundBuffers[m_CacheIndex].first == target && + m_DeviceCommandContext->m_BoundBuffers[m_CacheIndex].second == handle) + { + // Use an invalid index as a sign that we don't need to restore the + // bound buffer. + m_CacheIndex = m_DeviceCommandContext->m_BoundBuffers.size(); + } + else + { + glBindBufferARB(target, handle); + } } CDeviceCommandContext::ScopedBufferBind::~ScopedBufferBind() { + if (m_CacheIndex >= m_DeviceCommandContext->m_BoundBuffers.size()) + return; glBindBufferARB( m_DeviceCommandContext->m_BoundBuffers[m_CacheIndex].first, m_DeviceCommandContext->m_BoundBuffers[m_CacheIndex].second);