diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 09e8109f0..2847f1139 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -732,21 +732,13 @@ FetchBuffer GLReplay::GetBuffer(ResourceId id) ret.ID = m_pDriver->GetResourceManager()->GetOriginalID(id); - if(res.curType == eGL_NONE) - { - ret.byteSize = 0; - ret.creationFlags = 0; - ret.customName = true; - ret.name = ""; - ret.length = 0; - ret.structureSize = 0; - return ret; - } - GLint prevBind = 0; - gl.glGetIntegerv(BufferBinding(res.curType), &prevBind); + if(res.curType != eGL_NONE) + { + gl.glGetIntegerv(BufferBinding(res.curType), &prevBind); - gl.glBindBuffer(res.curType, res.resource.name); + gl.glBindBuffer(res.curType, res.resource.name); + } ret.structureSize = 0; @@ -768,11 +760,24 @@ FetchBuffer GLReplay::GetBuffer(ResourceId id) case eGL_TEXTURE_BUFFER: case eGL_TRANSFORM_FEEDBACK_BUFFER: case eGL_ATOMIC_COUNTER_BUFFER: break; + case eGL_NONE: + break; // could be from a 'create' DSA call which didn't ever bind the buffer to an + // explicit type default: RDCERR("Unexpected buffer type %s", ToStr::Get(res.curType).c_str()); } - GLint size; - gl.glGetBufferParameteriv(res.curType, eGL_BUFFER_SIZE, &size); + GLint size = 0; + // if the type is NONE it's probably a DSA created buffer + if(res.curType == eGL_NONE) + { + // if we have the DSA entry point + if(gl.GetHookset().glGetNamedBufferParameterivEXT) + gl.glGetNamedBufferParameterivEXT(res.resource.name, eGL_BUFFER_SIZE, &size); + } + else + { + gl.glGetBufferParameteriv(res.curType, eGL_BUFFER_SIZE, &size); + } ret.byteSize = ret.length = (uint32_t)size; @@ -796,7 +801,8 @@ FetchBuffer GLReplay::GetBuffer(ResourceId id) ret.name = str; - gl.glBindBuffer(res.curType, prevBind); + if(res.curType != eGL_NONE) + gl.glBindBuffer(res.curType, prevBind); return ret; } diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index 84ce5e127..e9276e06e 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -3885,8 +3885,12 @@ bool WrappedOpenGL::Serialise_glVertexArrayElementBuffer(GLuint vaobj, GLuint bu // referenced // at all in the actual frame if(bid != ResourceId() && GetResourceManager()->HasLiveResource(bid)) + { buffer = GetResourceManager()->GetLiveResource(bid).name; + m_Buffers[GetResourceManager()->GetLiveID(bid)].curType = eGL_ELEMENT_ARRAY_BUFFER; + } + // use ARB_direct_state_access functions here as we use EXT_direct_state_access elsewhere. If // we are running without ARB_dsa support, these functions are emulated in the obvious way. This // is @@ -3950,7 +3954,10 @@ bool WrappedOpenGL::Serialise_glVertexArrayBindVertexBufferEXT(GLuint vaobj, GLu GLuint live = 0; if(id != ResourceId() && GetResourceManager()->HasLiveResource(id)) + { live = GetResourceManager()->GetLiveResource(id).name; + m_Buffers[GetResourceManager()->GetLiveID(id)].curType = eGL_ARRAY_BUFFER; + } m_Real.glVertexArrayBindVertexBufferEXT(vaobj, idx, live, (GLintptr)offs, (GLsizei)str); } @@ -4055,9 +4062,14 @@ bool WrappedOpenGL::Serialise_glVertexArrayVertexBuffers(GLuint vaobj, GLuint fi if(m_State <= EXECUTING) { if(id != ResourceId() && GetResourceManager()->HasLiveResource(id)) + { bufs[i] = GetResourceManager()->GetLiveResource(id).name; + m_Buffers[GetResourceManager()->GetLiveID(id)].curType = eGL_ARRAY_BUFFER; + } else + { bufs[i] = 0; + } offs[i] = (GLintptr)offset; str[i] = (GLsizei)stride; }