Make sure any time VAOs/FBOs are ref'd, we also ref the child objects

* By the logic that means we need to iterate into the VAO/FBO bound
  objects on frame start, we also need to do for bound VAOs and FBOs
  later in the frame.
* Also FBO state needs to include the actual attached objects and their
  attachment parameters, since this information is lost when we stop
  tracking FBOs.
This commit is contained in:
baldurk
2015-07-18 18:05:19 +02:00
parent 3b7a6c4dcf
commit e5c1f8ee3b
5 changed files with 228 additions and 127 deletions
+153
View File
@@ -65,11 +65,36 @@ struct FeedbackInitialData
uint64_t Size[4];
};
struct FramebufferAttachmentData
{
bool renderbuffer;
bool layered;
int32_t layer;
int32_t level;
ResourceId obj;
};
struct FramebufferInitialData
{
bool valid;
FramebufferAttachmentData Attachments[10];
GLenum DrawBuffers[8];
GLenum ReadBuffer;
static const GLenum attachmentNames[10];
};
const GLenum FramebufferInitialData::attachmentNames[10] = {
eGL_COLOR_ATTACHMENT0,
eGL_COLOR_ATTACHMENT1,
eGL_COLOR_ATTACHMENT2,
eGL_COLOR_ATTACHMENT3,
eGL_COLOR_ATTACHMENT4,
eGL_COLOR_ATTACHMENT5,
eGL_COLOR_ATTACHMENT6,
eGL_COLOR_ATTACHMENT7,
eGL_DEPTH_ATTACHMENT,
eGL_STENCIL_ATTACHMENT,
};
template<>
@@ -105,12 +130,25 @@ void Serialiser::Serialise(const char *name, FeedbackInitialData &el)
Serialise<4>("Size", el.Size);
}
template<>
void Serialiser::Serialise(const char *name, FramebufferAttachmentData &el)
{
ScopedContext scope(this, this, name, "FramebufferAttachmentData", 0, true);
Serialise("renderbuffer", el.renderbuffer);
Serialise("layered", el.layered);
Serialise("layer", el.layer);
Serialise("level", el.level);
Serialise("obj", el.obj);
}
template<>
void Serialiser::Serialise(const char *name, FramebufferInitialData &el)
{
ScopedContext scope(this, this, name, "FramebufferInitialData", 0, true);
Serialise("valid", el.valid);
Serialise<8>("DrawBuffers", el.DrawBuffers);
for(size_t i=0; i < ARRAY_COUNT(el.Attachments); i++)
Serialise("Attachments", el.Attachments[i]);
Serialise("ReadBuffer", el.ReadBuffer);
}
@@ -156,6 +194,79 @@ void Serialiser::Serialise(const char *name, TextureStateInitialData &el)
Serialise("texBufSize", el.texBufSize);
}
void GLResourceManager::MarkVAOReferenced(GLResource res, FrameRefType ref)
{
const GLHookSet &gl = m_GL->m_Real;
if(res.name)
{
MarkResourceFrameReferenced(res, ref == eFrameRef_Unknown ? eFrameRef_Unknown : eFrameRef_Read);
GLint numVBufferBindings = 16;
gl.glGetIntegerv(eGL_MAX_VERTEX_ATTRIB_BINDINGS, &numVBufferBindings);
for(GLuint i=0; i < (GLuint)numVBufferBindings; i++)
{
GLuint buffer = GetBoundVertexBuffer(gl, i);
MarkResourceFrameReferenced(BufferRes(res.Context, buffer), ref);
}
GLuint ibuffer = 0;
gl.glGetIntegerv(eGL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&ibuffer);
MarkResourceFrameReferenced(BufferRes(res.Context, ibuffer), ref);
}
}
void GLResourceManager::MarkFBOReferenced(GLResource res, FrameRefType ref)
{
if(res.name == 0)
return;
MarkResourceFrameReferenced(res, ref == eFrameRef_Unknown ? eFrameRef_Unknown : eFrameRef_Read);
const GLHookSet &gl = m_GL->m_Real;
GLint numCols = 8;
gl.glGetIntegerv(eGL_MAX_COLOR_ATTACHMENTS, &numCols);
GLenum type = eGL_TEXTURE;
GLuint name = 0;
for(int c=0; c < numCols; c++)
{
gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, GLenum(eGL_COLOR_ATTACHMENT0+c), eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name);
gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, GLenum(eGL_COLOR_ATTACHMENT0+c), eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type);
if(type == eGL_RENDERBUFFER)
MarkResourceFrameReferenced(RenderbufferRes(res.Context, name), ref);
else
MarkResourceFrameReferenced(TextureRes(res.Context, name), ref);
}
gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name);
gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type);
if(name)
{
if(type == eGL_RENDERBUFFER)
MarkResourceFrameReferenced(RenderbufferRes(res.Context, name), ref);
else
MarkResourceFrameReferenced(TextureRes(res.Context, name), ref);
}
gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name);
gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type);
if(name)
{
if(type == eGL_RENDERBUFFER)
MarkResourceFrameReferenced(RenderbufferRes(res.Context, name), ref);
else
MarkResourceFrameReferenced(TextureRes(res.Context, name), ref);
}
}
bool GLResourceManager::SerialisableResource(ResourceId id, GLResourceRecord *record)
{
if(id == m_GL->GetContextResourceID())
@@ -185,6 +296,25 @@ bool GLResourceManager::Prepare_InitialState(GLResource res, byte *blob)
gl.glBindFramebuffer(eGL_DRAW_FRAMEBUFFER, res.name);
gl.glBindFramebuffer(eGL_READ_FRAMEBUFFER, res.name);
//need to serialise out which objects are bound
GLenum type;
GLuint object;
GLint layered;
for(int i=0; i < (int)ARRAY_COUNT(data->Attachments); i++)
{
FramebufferAttachmentData &a = data->Attachments[i];
gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, data->attachmentNames[i], eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&object);
gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, data->attachmentNames[i], eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type);
gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, data->attachmentNames[i], eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &a.level);
gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, data->attachmentNames[i], eGL_FRAMEBUFFER_ATTACHMENT_LAYERED, &layered);
gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, data->attachmentNames[i], eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, &a.layer);
a.layered = (layered != 0);
a.renderbuffer = (type == eGL_RENDERBUFFER);
a.obj = GetID(a.renderbuffer ? RenderbufferRes(res.Context, object) : TextureRes(res.Context, object));
}
for(int i=0; i < (int)ARRAY_COUNT(data->DrawBuffers); i++)
gl.glGetIntegerv(GLenum(eGL_DRAW_BUFFER0 + i), (GLint *)&data->DrawBuffers[i]);
@@ -1476,6 +1606,29 @@ void GLResourceManager::Apply_InitialState(GLResource live, InitialContentData i
gl.glBindFramebuffer(eGL_DRAW_FRAMEBUFFER, live.name);
gl.glBindFramebuffer(eGL_READ_FRAMEBUFFER, live.name);
for(int i=0; i < (int)ARRAY_COUNT(data->Attachments); i++)
{
FramebufferAttachmentData &a = data->Attachments[i];
GLuint obj = a.obj == ResourceId() ? 0 : GetLiveResource(a.obj).name;
if(a.renderbuffer && obj)
{
gl.glNamedFramebufferRenderbufferEXT(live.name, data->attachmentNames[i], eGL_RENDERBUFFER, obj);
}
else
{
if(a.layered && obj)
{
gl.glNamedFramebufferTextureLayerEXT(live.name, data->attachmentNames[i], obj, a.level, a.layer);
}
else
{
gl.glNamedFramebufferTextureEXT(live.name, data->attachmentNames[i], obj, a.level);
}
}
}
// set invalid caps to GL_COLOR_ATTACHMENT0
for(int i=0; i < (int)ARRAY_COUNT(data->DrawBuffers); i++)
if(data->DrawBuffers[i] == eGL_BACK || data->DrawBuffers[i] == eGL_FRONT)
+8
View File
@@ -211,6 +211,14 @@ class GLResourceManager : public ResourceManager<GLResource, GLResourceRecord>
{
return m_SyncIDs[sync];
}
// we need to find all the children bound to VAOs/FBOs and mark them referenced. The reason for this
// is that say a VAO became high traffic and we stopped serialising buffer binds, but then it is never
// modified in a frame and none of the buffers are ever referenced. They would be eliminated from
// the log and the VAO initial state that tries to bind them would fail.
// Normally this would be handled by record parenting, but that would be a nightmare to track.
void MarkVAOReferenced(GLResource res, FrameRefType ref);
void MarkFBOReferenced(GLResource res, FrameRefType ref);
bool Prepare_InitialState(GLResource res, byte *blob);
bool Serialise_InitialState(GLResource res);
+4 -76
View File
@@ -317,30 +317,8 @@ void GLRenderState::MarkReferenced(WrappedOpenGL *gl, bool initial) const
manager->MarkResourceFrameReferenced(TextureRes(ctx, Images[i].name), initial ? eFrameRef_Unknown : eFrameRef_ReadBeforeWrite);
gl->AddMissingTrack(manager->GetID(TextureRes(ctx, Images[i].name)));
}
manager->MarkResourceFrameReferenced(VertexArrayRes(ctx, VAO), initial ? eFrameRef_Unknown : eFrameRef_Read);
// we need to find all the buffers bound to the VAO and mark them referenced to. The reason for this
// is that say a VAO became high traffic and we stopped serialising buffer binds, but then it is never
// modified in this frame and none of the buffers are ever referenced. They would be eliminated from
// the log and the VAO initial state that tries to bind them would fail.
// Normally this would be handled by record parenting, but that would be a nightmare to track for VAOs.
if(VAO)
{
GLint numVBufferBindings = 16;
gl->glGetIntegerv(eGL_MAX_VERTEX_ATTRIB_BINDINGS, &numVBufferBindings);
for(GLuint i=0; i < (GLuint)numVBufferBindings; i++)
{
GLuint buffer = GetBoundVertexBuffer(*m_Real, i);
manager->MarkResourceFrameReferenced(BufferRes(ctx, buffer), initial ? eFrameRef_Unknown : eFrameRef_Read);
}
GLuint ibuffer = 0;
gl->glGetIntegerv(eGL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&ibuffer);
manager->MarkResourceFrameReferenced(BufferRes(ctx, ibuffer), initial ? eFrameRef_Unknown : eFrameRef_Read);
}
manager->MarkVAOReferenced(VertexArrayRes(ctx, VAO), initial ? eFrameRef_Unknown : eFrameRef_Read);
manager->MarkResourceFrameReferenced(FeedbackRes(ctx, FeedbackObj), initial ? eFrameRef_Unknown : eFrameRef_Read);
@@ -367,62 +345,12 @@ void GLRenderState::MarkReferenced(WrappedOpenGL *gl, bool initial) const
for(size_t i=0; i < ARRAY_COUNT(UniformBinding); i++)
manager->MarkResourceFrameReferenced(BufferRes(ctx, UniformBinding[i].name), initial ? eFrameRef_Unknown : eFrameRef_Read);
GLint numCols = 8;
gl->glGetIntegerv(eGL_MAX_COLOR_ATTACHMENTS, &numCols);
// for the same reason as VAOs above, we need to find all the renderbuffers/textures bound to the FBOs
GLuint fbos[] = { ReadFBO, DrawFBO };
GLenum tgts[] = { eGL_READ_FRAMEBUFFER, eGL_DRAW_FRAMEBUFFER };
FrameRefType refs[] = { eFrameRef_Read, eFrameRef_ReadBeforeWrite };
manager->MarkFBOReferenced(FramebufferRes(ctx, DrawFBO), initial ? eFrameRef_Unknown : eFrameRef_ReadBeforeWrite);
// if same FBO is bound to both targets, treat it as draw only
if(ReadFBO == DrawFBO)
fbos[0] = 0;
for(size_t i=0; i < ARRAY_COUNT(fbos); i++)
{
manager->MarkResourceFrameReferenced(FramebufferRes(ctx, fbos[i]), initial ? eFrameRef_Unknown : eFrameRef_Read);
if(fbos[i])
{
GLenum type = eGL_TEXTURE;
GLuint name = 0;
for(int c=0; c < numCols; c++)
{
gl->glGetFramebufferAttachmentParameteriv(tgts[i], GLenum(eGL_COLOR_ATTACHMENT0+i), eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name);
gl->glGetFramebufferAttachmentParameteriv(tgts[i], GLenum(eGL_COLOR_ATTACHMENT0+i), eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type);
if(type == eGL_RENDERBUFFER)
manager->MarkResourceFrameReferenced(RenderbufferRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]);
else
manager->MarkResourceFrameReferenced(TextureRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]);
}
gl->glGetFramebufferAttachmentParameteriv(tgts[i], eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name);
gl->glGetFramebufferAttachmentParameteriv(tgts[i], eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type);
if(name)
{
if(type == eGL_RENDERBUFFER)
manager->MarkResourceFrameReferenced(RenderbufferRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]);
else
manager->MarkResourceFrameReferenced(TextureRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]);
}
gl->glGetFramebufferAttachmentParameteriv(tgts[i], eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name);
gl->glGetFramebufferAttachmentParameteriv(tgts[i], eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type);
if(name)
{
if(type == eGL_RENDERBUFFER)
manager->MarkResourceFrameReferenced(RenderbufferRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]);
else
manager->MarkResourceFrameReferenced(TextureRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]);
}
}
}
if(ReadFBO != DrawFBO)
manager->MarkFBOReferenced(FramebufferRes(ctx, ReadFBO), initial ? eFrameRef_Unknown : eFrameRef_Read);
}
void GLRenderState::MarkDirty(WrappedOpenGL *gl)
@@ -2705,7 +2705,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribOffsetEXT(GLuint vaobj, GLuint buff
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
if(m_State == WRITING_CAPFRAME && bufrecord)
GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read);
@@ -2735,7 +2735,7 @@ void WrappedOpenGL::glVertexAttribPointer(GLuint index, GLint size, GLenum type,
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
if(m_State == WRITING_CAPFRAME && bufrecord)
GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read);
@@ -2800,7 +2800,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribIOffsetEXT(GLuint vaobj, GLuint buf
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
if(m_State == WRITING_CAPFRAME && bufrecord)
GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read);
@@ -2830,7 +2830,7 @@ void WrappedOpenGL::glVertexAttribIPointer(GLuint index, GLint size, GLenum type
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
if(m_State == WRITING_CAPFRAME && bufrecord)
GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read);
@@ -2895,7 +2895,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribLOffsetEXT(GLuint vaobj, GLuint buf
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
if(m_State == WRITING_CAPFRAME && bufrecord)
GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read);
@@ -2925,7 +2925,7 @@ void WrappedOpenGL::glVertexAttribLPointer(GLuint index, GLint size, GLenum type
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
if(m_State == WRITING_CAPFRAME && bufrecord)
GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read);
@@ -2968,7 +2968,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribBindingEXT(GLuint vaobj, GLuint att
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBBINDING);
@@ -2995,7 +2995,7 @@ void WrappedOpenGL::glVertexAttribBinding(GLuint attribindex, GLuint bindinginde
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBBINDING);
@@ -3041,7 +3041,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribFormatEXT(GLuint vaobj, GLuint attr
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBFORMAT);
@@ -3068,7 +3068,7 @@ void WrappedOpenGL::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBFORMAT);
@@ -3113,7 +3113,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribIFormatEXT(GLuint vaobj, GLuint att
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBIFORMAT);
@@ -3140,7 +3140,7 @@ void WrappedOpenGL::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBIFORMAT);
@@ -3185,7 +3185,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribLFormatEXT(GLuint vaobj, GLuint att
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBLFORMAT);
@@ -3212,7 +3212,7 @@ void WrappedOpenGL::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBLFORMAT);
@@ -3267,7 +3267,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribDivisorEXT(GLuint vaobj, GLuint ind
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBDIVISOR);
@@ -3294,7 +3294,7 @@ void WrappedOpenGL::glVertexAttribDivisor(GLuint index, GLuint divisor)
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBDIVISOR);
@@ -3346,7 +3346,7 @@ void WrappedOpenGL::glEnableVertexArrayAttribEXT(GLuint vaobj, GLuint index)
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(ENABLEVERTEXATTRIBARRAY);
@@ -3373,7 +3373,7 @@ void WrappedOpenGL::glEnableVertexAttribArray(GLuint index)
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(ENABLEVERTEXATTRIBARRAY);
@@ -3425,7 +3425,7 @@ void WrappedOpenGL::glDisableVertexArrayAttribEXT(GLuint vaobj, GLuint index)
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(DISABLEVERTEXATTRIBARRAY);
@@ -3452,7 +3452,7 @@ void WrappedOpenGL::glDisableVertexAttribArray(GLuint index)
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(DISABLEVERTEXATTRIBARRAY);
@@ -3611,7 +3611,7 @@ void WrappedOpenGL::glBindVertexArray(GLuint array)
m_ContextRecord->AddChunk(scope.Get());
if(record)
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkVAOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
}
}
@@ -3656,7 +3656,7 @@ void WrappedOpenGL::glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer)
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
if(m_State == WRITING_CAPFRAME && bufrecord)
GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read);
@@ -3708,7 +3708,7 @@ void WrappedOpenGL::glVertexArrayBindVertexBufferEXT(GLuint vaobj, GLuint bindin
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
if(m_State == WRITING_CAPFRAME && bufrecord)
GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read);
@@ -3738,7 +3738,7 @@ void WrappedOpenGL::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLint
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
if(m_State == WRITING_CAPFRAME && bufrecord)
GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read);
@@ -3822,7 +3822,7 @@ void WrappedOpenGL::glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsiz
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(BIND_VERTEXBUFFERS);
@@ -3862,7 +3862,7 @@ void WrappedOpenGL::glBindVertexBuffers(GLuint first, GLsizei count, const GLuin
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(BIND_VERTEXBUFFERS);
@@ -3918,7 +3918,7 @@ void WrappedOpenGL::glVertexArrayVertexBindingDivisorEXT(GLuint vaobj, GLuint bi
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXBINDINGDIVISOR);
@@ -3945,7 +3945,7 @@ void WrappedOpenGL::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord))
return;
if(m_State == WRITING_CAPFRAME && varecord)
GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite);
{
SCOPED_SERIALISE_CONTEXT(VERTEXBINDINGDIVISOR);
@@ -194,7 +194,8 @@ void WrappedOpenGL::glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum atta
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read);
}
}
}
@@ -250,7 +251,8 @@ void WrappedOpenGL::glFramebufferTexture(GLenum target, GLenum attachment, GLuin
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read);
}
}
}
@@ -322,7 +324,8 @@ void WrappedOpenGL::glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum at
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read);
}
}
}
@@ -378,7 +381,8 @@ void WrappedOpenGL::glFramebufferTexture1D(GLenum target, GLenum attachment, GLe
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read);
}
}
}
@@ -450,7 +454,8 @@ void WrappedOpenGL::glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum at
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read);
}
}
}
@@ -506,7 +511,8 @@ void WrappedOpenGL::glFramebufferTexture2D(GLenum target, GLenum attachment, GLe
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read);
}
}
}
@@ -579,7 +585,8 @@ void WrappedOpenGL::glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum at
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read);
}
}
}
@@ -635,7 +642,8 @@ void WrappedOpenGL::glFramebufferTexture3D(GLenum target, GLenum attachment, GLe
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read);
}
}
}
@@ -696,7 +704,8 @@ void WrappedOpenGL::glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(RenderbufferRes(GetCtx(), renderbuffer), eFrameRef_Read);
}
}
}
@@ -743,7 +752,8 @@ void WrappedOpenGL::glFramebufferRenderbuffer(GLenum target, GLenum attachment,
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(RenderbufferRes(GetCtx(), renderbuffer), eFrameRef_Read);
}
}
}
@@ -815,7 +825,8 @@ void WrappedOpenGL::glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read);
}
}
}
@@ -871,7 +882,8 @@ void WrappedOpenGL::glFramebufferTextureLayer(GLenum target, GLenum attachment,
else
{
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read);
}
}
}
@@ -972,7 +984,7 @@ void WrappedOpenGL::glFramebufferReadBufferEXT(GLuint framebuffer, GLenum buf)
Serialise_glFramebufferReadBufferEXT(framebuffer, buf);
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite);
}
else if(m_State == WRITING_IDLE && framebuffer != 0)
{
@@ -996,7 +1008,7 @@ void WrappedOpenGL::glReadBuffer(GLenum mode)
m_ContextRecord->AddChunk(scope.Get());
if(readrecord)
GetResourceManager()->MarkResourceFrameReferenced(readrecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkFBOReferenced(readrecord->Resource, eFrameRef_ReadBeforeWrite);
}
else
{
@@ -1037,7 +1049,7 @@ void WrappedOpenGL::glBindFramebuffer(GLenum target, GLuint framebuffer)
Serialise_glBindFramebuffer(target, framebuffer);
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite);
}
if(framebuffer == 0 && m_State < WRITING)
@@ -1088,7 +1100,7 @@ void WrappedOpenGL::glFramebufferDrawBufferEXT(GLuint framebuffer, GLenum buf)
Serialise_glFramebufferDrawBufferEXT(framebuffer, buf);
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite);
}
else if(m_State == WRITING_IDLE && framebuffer != 0)
{
@@ -1112,7 +1124,7 @@ void WrappedOpenGL::glDrawBuffer(GLenum buf)
m_ContextRecord->AddChunk(scope.Get());
if(drawrecord)
GetResourceManager()->MarkResourceFrameReferenced(drawrecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkFBOReferenced(drawrecord->Resource, eFrameRef_ReadBeforeWrite);
}
else
{
@@ -1159,7 +1171,7 @@ void WrappedOpenGL::glFramebufferDrawBuffersEXT(GLuint framebuffer, GLsizei n, c
Serialise_glFramebufferDrawBuffersEXT(framebuffer, n, bufs);
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite);
}
else if(m_State == WRITING_IDLE && framebuffer != 0)
{
@@ -1186,7 +1198,7 @@ void WrappedOpenGL::glDrawBuffers(GLsizei n, const GLenum *bufs)
m_ContextRecord->AddChunk(scope.Get());
if(drawrecord)
GetResourceManager()->MarkResourceFrameReferenced(drawrecord->GetResourceID(), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkFBOReferenced(drawrecord->Resource, eFrameRef_ReadBeforeWrite);
}
else
{
@@ -1396,8 +1408,8 @@ void WrappedOpenGL::glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFr
Serialise_glBlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), readFramebuffer), eFrameRef_Read);
GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), drawFramebuffer), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), readFramebuffer), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), drawFramebuffer), eFrameRef_ReadBeforeWrite);
}
// use ARB_direct_state_access functions here as we use EXT_direct_state_access elsewhere. If
@@ -1422,8 +1434,8 @@ void WrappedOpenGL::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLi
Serialise_glBlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
m_ContextRecord->AddChunk(scope.Get());
GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), readFramebuffer), eFrameRef_Read);
GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), drawFramebuffer), eFrameRef_Read);
GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), readFramebuffer), eFrameRef_ReadBeforeWrite);
GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), drawFramebuffer), eFrameRef_ReadBeforeWrite);
}
m_Real.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);