Mark buffers referenced so they're kept alive even if deleted in-frame

* We need to have more comprehensive frame references for several reasons
  but this will handle the case where a buffer is created, bound, deleted
  before the frame ends.
This commit is contained in:
baldurk
2014-12-11 23:18:06 +00:00
parent a3d374c103
commit 9860d8bba8
@@ -134,6 +134,21 @@ void WrappedOpenGL::glBindBuffer(GLenum target, GLuint buffer)
chunk = scope.Get();
}
if(buffer)
{
FrameRefType refType = eFrameRef_Read;
// these targets write to the buffer
if(target == eGL_ATOMIC_COUNTER_BUFFER ||
target == eGL_COPY_WRITE_BUFFER ||
target == eGL_PIXEL_PACK_BUFFER ||
target == eGL_SHADER_STORAGE_BUFFER ||
target == eGL_TRANSFORM_FEEDBACK_BUFFER)
refType = eFrameRef_Write;
GetResourceManager()->MarkResourceFrameReferenced(cd.m_BufferRecord[idx]->GetResourceID(), refType);
}
m_ContextRecord->AddChunk(chunk);
}
@@ -734,6 +749,21 @@ void WrappedOpenGL::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
cd.m_BufferRecord[idx] = NULL;
else
cd.m_BufferRecord[idx] = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer));
if(buffer)
{
FrameRefType refType = eFrameRef_Read;
// these targets write to the buffer
if(target == eGL_ATOMIC_COUNTER_BUFFER ||
target == eGL_COPY_WRITE_BUFFER ||
target == eGL_PIXEL_PACK_BUFFER ||
target == eGL_SHADER_STORAGE_BUFFER ||
target == eGL_TRANSFORM_FEEDBACK_BUFFER)
refType = eFrameRef_Write;
GetResourceManager()->MarkResourceFrameReferenced(cd.m_BufferRecord[idx]->GetResourceID(), refType);
}
}
// store as transform feedback record state
@@ -806,6 +836,21 @@ void WrappedOpenGL::glBindBufferRange(GLenum target, GLuint index, GLuint buffer
cd.m_BufferRecord[idx] = NULL;
else
cd.m_BufferRecord[idx] = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer));
if(buffer)
{
FrameRefType refType = eFrameRef_Read;
// these targets write to the buffer
if(target == eGL_ATOMIC_COUNTER_BUFFER ||
target == eGL_COPY_WRITE_BUFFER ||
target == eGL_PIXEL_PACK_BUFFER ||
target == eGL_SHADER_STORAGE_BUFFER ||
target == eGL_TRANSFORM_FEEDBACK_BUFFER)
refType = eFrameRef_Write;
GetResourceManager()->MarkResourceFrameReferenced(cd.m_BufferRecord[idx]->GetResourceID(), refType);
}
}
// store as transform feedback record state
@@ -888,6 +933,20 @@ void WrappedOpenGL::glBindBuffersBase(GLenum target, GLuint first, GLsizei count
cd.m_BufferRecord[idx] = NULL;
else
cd.m_BufferRecord[idx] = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffers[0]));
FrameRefType refType = eFrameRef_Read;
// these targets write to the buffer
if(target == eGL_ATOMIC_COUNTER_BUFFER ||
target == eGL_COPY_WRITE_BUFFER ||
target == eGL_PIXEL_PACK_BUFFER ||
target == eGL_SHADER_STORAGE_BUFFER ||
target == eGL_TRANSFORM_FEEDBACK_BUFFER)
refType = eFrameRef_Write;
for(GLsizei i=0; i < count; i++)
if(buffers[i])
GetResourceManager()->MarkResourceFrameReferenced(GetResourceManager()->GetID(BufferRes(GetCtx(), buffers[i])), refType);
}
// store as transform feedback record state
@@ -986,6 +1045,20 @@ void WrappedOpenGL::glBindBuffersRange(GLenum target, GLuint first, GLsizei coun
cd.m_BufferRecord[idx] = NULL;
else
cd.m_BufferRecord[idx] = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffers[0]));
FrameRefType refType = eFrameRef_Read;
// these targets write to the buffer
if(target == eGL_ATOMIC_COUNTER_BUFFER ||
target == eGL_COPY_WRITE_BUFFER ||
target == eGL_PIXEL_PACK_BUFFER ||
target == eGL_SHADER_STORAGE_BUFFER ||
target == eGL_TRANSFORM_FEEDBACK_BUFFER)
refType = eFrameRef_Write;
for(GLsizei i=0; i < count; i++)
if(buffers[i])
GetResourceManager()->MarkResourceFrameReferenced(GetResourceManager()->GetID(BufferRes(GetCtx(), buffers[i])), refType);
}
// store as transform feedback record state