mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-06 01:50:38 +00:00
Allow for DSA style glCreate*d buffers which are never bound to a type
This commit is contained in:
@@ -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 = "<Uninitialised Buffer>";
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user