From 296d7e39b1ec0c7d663c7d1c226081694dfcf273 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 23 Jul 2015 23:06:25 +0200 Subject: [PATCH] Handle glTextureBufferRangeEXT not being available * This way we don't have to require GL_ARB_texture_buffer_range as well when technically it should only be needed if the application used it. --- renderdoc/api/replay/replay_enums.h | 1 + renderdoc/driver/gl/gl_manager.cpp | 24 +++++++++++++++++++++--- renderdocui/Interop/Enums.cs | 2 ++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index 66d6f3d42..a97a7331e 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -313,6 +313,7 @@ enum DebugMessageSource eDbgSource_GeneralPerformance, eDbgSource_GCNPerformance, eDbgSource_RuntimeWarning, + eDbgSoruce_UnsupportedConfiguration, }; enum ResourceUsage diff --git a/renderdoc/driver/gl/gl_manager.cpp b/renderdoc/driver/gl/gl_manager.cpp index 969c02ba1..5c252e119 100644 --- a/renderdoc/driver/gl/gl_manager.cpp +++ b/renderdoc/driver/gl/gl_manager.cpp @@ -1660,9 +1660,27 @@ void GLResourceManager::Apply_InitialState(GLResource live, InitialContentData i } else { - // restore texbuffer only state - gl.glTextureBufferRangeEXT(live.name, eGL_TEXTURE_BUFFER, details.internalFormat, - GetLiveResource(state->texBuffer).name, state->texBufOffs, state->texBufSize); + GLuint buffer = GetLiveResource(state->texBuffer).name; + + if(gl.glTextureBufferRangeEXT) + { + // restore texbuffer only state + gl.glTextureBufferRangeEXT(live.name, eGL_TEXTURE_BUFFER, details.internalFormat, buffer, state->texBufOffs, state->texBufSize); + } + else + { + uint32_t bufSize = 0; + gl.glGetNamedBufferParameterivEXT(buffer, eGL_BUFFER_SIZE, (GLint *)&bufSize); + if(state->texBufOffs > 0 || state->texBufSize > bufSize) + { + const char *msg = "glTextureBufferRangeEXT is not supported on your GL implementation, but is needed for correct replay.\n" + "The original capture created a texture buffer with a range - replay will use the whole buffer, which is likely incorrect."; + RDCERR("%s", msg); + m_GL->AddDebugMessage(eDbgCategory_Resource_Manipulation, eDbgSeverity_High, eDbgSource_IncorrectAPIUse, msg); + } + + gl.glTextureBufferEXT(live.name, eGL_TEXTURE_BUFFER, details.internalFormat, buffer); + } } } else if(live.Namespace == eResProgram) diff --git a/renderdocui/Interop/Enums.cs b/renderdocui/Interop/Enums.cs index 86b457980..0d8b97b41 100644 --- a/renderdocui/Interop/Enums.cs +++ b/renderdocui/Interop/Enums.cs @@ -283,6 +283,7 @@ namespace renderdoc GeneralPerformance, GCNPerformance, RuntimeWarning, + UnsupportedConfiguration, }; public enum DebugMessageCategory @@ -467,6 +468,7 @@ namespace renderdoc case DebugMessageSource.GeneralPerformance: return "General Performance issues"; case DebugMessageSource.GCNPerformance: return "GCN (AMD) Performance issues"; case DebugMessageSource.RuntimeWarning: return "Issues raised while debugging"; + case DebugMessageSource.UnsupportedConfiguration: return "Unsupported Software or Hardware Configuration"; } return "Unknown Source";