Mark containers like VAO or XFB as written on implicit buffer binds

This commit is contained in:
baldurk committed 2019-05-14 15:30:54 +01:00
1 parent e73bb1ff94
commit a01cd2c37b
1 file changed
+119 -18
+119 -18
View File
@@ -272,6 +272,25 @@ void WrappedOpenGL::glBindBuffer(GLenum target, GLuint buffer)
refType);
}
// binding this buffer mutates VAO state, mark it as written.
if(target == eGL_ELEMENT_ARRAY_BUFFER)
{
GLResourceRecord *varecord = cd.m_VertexArrayRecord;
if(varecord)
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
}
// binding this buffer mutates XFB state, mark it as written.
if(target == eGL_TRANSFORM_FEEDBACK_BUFFER)
{
GLResourceRecord *xfbrecord = cd.m_FeedbackRecord;
if(xfbrecord)
GetResourceManager()->MarkResourceFrameReferenced(xfbrecord->Resource,
eFrameRef_ReadBeforeWrite);
}
GetContextRecord()->AddChunk(chunk);
}
@@ -1165,18 +1184,40 @@ void WrappedOpenGL::glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
r = cd.m_BufferRecord[idx] =
GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer));
if(buffer && IsActiveCapturing(m_State))
if(IsActiveCapturing(m_State))
{
FrameRefType refType = eFrameRef_Read;
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_ReadBeforeWrite;
// 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_ReadBeforeWrite;
GetResourceManager()->MarkResourceFrameReferenced(cd.m_BufferRecord[idx]->GetResourceID(),
refType);
GetResourceManager()->MarkResourceFrameReferenced(cd.m_BufferRecord[idx]->GetResourceID(),
refType);
}
// binding this buffer mutates VAO state, mark it as written.
if(target == eGL_ELEMENT_ARRAY_BUFFER)
{
GLResourceRecord *varecord = cd.m_VertexArrayRecord;
if(varecord)
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
}
// binding this buffer mutates XFB state, mark it as written.
if(target == eGL_TRANSFORM_FEEDBACK_BUFFER)
{
GLResourceRecord *xfbrecord = cd.m_FeedbackRecord;
if(xfbrecord)
GetResourceManager()->MarkResourceFrameReferenced(xfbrecord->Resource,
eFrameRef_ReadBeforeWrite);
}
}
// it's legal to re-type buffers, generate another BindBuffer chunk to rename
@@ -1275,18 +1316,40 @@ void WrappedOpenGL::glBindBufferRange(GLenum target, GLuint index, GLuint buffer
r = cd.m_BufferRecord[idx] =
GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer));
if(buffer && IsActiveCapturing(m_State))
if(IsActiveCapturing(m_State))
{
FrameRefType refType = eFrameRef_Read;
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_ReadBeforeWrite;
// 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_ReadBeforeWrite;
GetResourceManager()->MarkResourceFrameReferenced(cd.m_BufferRecord[idx]->GetResourceID(),
refType);
GetResourceManager()->MarkResourceFrameReferenced(cd.m_BufferRecord[idx]->GetResourceID(),
refType);
}
// binding this buffer mutates VAO state, mark it as written.
if(target == eGL_ELEMENT_ARRAY_BUFFER)
{
GLResourceRecord *varecord = cd.m_VertexArrayRecord;
if(varecord)
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
}
// binding this buffer mutates XFB state, mark it as written.
if(target == eGL_TRANSFORM_FEEDBACK_BUFFER)
{
GLResourceRecord *xfbrecord = cd.m_FeedbackRecord;
if(xfbrecord)
GetResourceManager()->MarkResourceFrameReferenced(xfbrecord->Resource,
eFrameRef_ReadBeforeWrite);
}
}
// it's legal to re-type buffers, generate another BindBuffer chunk to rename
@@ -1420,6 +1483,25 @@ void WrappedOpenGL::glBindBuffersBase(GLenum target, GLuint first, GLsizei count
m_MissingTracks.insert(id);
}
}
// binding this buffer mutates VAO state, mark it as written.
if(target == eGL_ELEMENT_ARRAY_BUFFER)
{
GLResourceRecord *varecord = cd.m_VertexArrayRecord;
if(varecord)
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
}
// binding this buffer mutates XFB state, mark it as written.
if(target == eGL_TRANSFORM_FEEDBACK_BUFFER)
{
GLResourceRecord *xfbrecord = cd.m_FeedbackRecord;
if(xfbrecord)
GetResourceManager()->MarkResourceFrameReferenced(xfbrecord->Resource,
eFrameRef_ReadBeforeWrite);
}
}
for(int i = 0; buffers && i < count; i++)
@@ -1600,6 +1682,25 @@ void WrappedOpenGL::glBindBuffersRange(GLenum target, GLuint first, GLsizei coun
m_MissingTracks.insert(id);
}
}
// binding this buffer mutates VAO state, mark it as written.
if(target == eGL_ELEMENT_ARRAY_BUFFER)
{
GLResourceRecord *varecord = cd.m_VertexArrayRecord;
if(varecord)
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
}
// binding this buffer mutates XFB state, mark it as written.
if(target == eGL_TRANSFORM_FEEDBACK_BUFFER)
{
GLResourceRecord *xfbrecord = cd.m_FeedbackRecord;
if(xfbrecord)
GetResourceManager()->MarkResourceFrameReferenced(xfbrecord->Resource,
eFrameRef_ReadBeforeWrite);
}
}
else
{