Allow for DSA style glCreate*d buffers which are never bound to a type

This commit is contained in:
baldurk
2016-06-06 15:46:00 -07:00
parent a885074e9c
commit 4e7276165a
2 changed files with 34 additions and 16 deletions
+22 -16
View File
@@ -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;
}