diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index c6da2a1d6..b18652752 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -793,7 +793,7 @@ bool WrappedOpenGL::Serialise_BeginCaptureFrame(bool applyInitialState) state.FetchState(); } - state.Serialise(m_State, GetCtx(), GetResourceManager()); + state.Serialise(m_State, GetCtx(), this); if(m_State <= EXECUTING && applyInitialState) { diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index b98c4efdb..63b2a8a27 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -273,6 +273,8 @@ class WrappedOpenGL void ReplayLog(uint32_t frameID, uint32_t startEventID, uint32_t endEventID, ReplayLogType replayType); void ReadLogInitialisation(); + GLuint GetFakeBBFBO() { return m_FakeBB_FBO; } + vector &GetFrameRecord() { return m_FrameRecord; } FetchAPIEvent GetEvent(uint32_t eventID); diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index 3fd752252..d165de9cf 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -23,6 +23,7 @@ ******************************************************************************/ #include "gl_renderstate.h" +#include "gl_driver.h" GLRenderState::GLRenderState(const GLHookSet *funcs, Serialiser *ser) : m_Real(funcs) @@ -455,8 +456,9 @@ void GLRenderState::Clear() RDCEraseEl(CullFace); } -void GLRenderState::Serialise(LogState state, void *ctx, GLResourceManager *rm) +void GLRenderState::Serialise(LogState state, void *ctx, WrappedOpenGL *gl) { + GLResourceManager *rm = gl->GetResourceManager(); // TODO check GL_MAX_* m_pSerialiser->Serialise("GL_ENABLED", Enabled); @@ -522,12 +524,16 @@ void GLRenderState::Serialise(LogState state, void *ctx, GLResourceManager *rm) if(state >= WRITING) ID = rm->GetID(FramebufferRes(ctx, DrawFBO)); m_pSerialiser->Serialise("GL_DRAW_FRAMEBUFFER_BINDING", ID); if(state < WRITING && ID != ResourceId()) DrawFBO = rm->GetLiveResource(ID).name; + + if(DrawFBO == 0) DrawFBO = gl->GetFakeBBFBO(); } { ResourceId ID = ResourceId(); if(state >= WRITING) ID = rm->GetID(FramebufferRes(ctx, ReadFBO)); m_pSerialiser->Serialise("GL_READ_FRAMEBUFFER_BINDING", ID); if(state < WRITING && ID != ResourceId()) ReadFBO = rm->GetLiveResource(ID).name; + + if(ReadFBO == 0) ReadFBO = gl->GetFakeBBFBO(); } struct { IdxRangeBuffer *bufs; int count; } idxBufs[] = diff --git a/renderdoc/driver/gl/gl_renderstate.h b/renderdoc/driver/gl/gl_renderstate.h index 07e8f5d90..86b49db26 100644 --- a/renderdoc/driver/gl/gl_renderstate.h +++ b/renderdoc/driver/gl/gl_renderstate.h @@ -201,7 +201,7 @@ struct GLRenderState GLenum CullFace; // - void Serialise(LogState state, void *ctx, GLResourceManager *rm); + void Serialise(LogState state, void *ctx, WrappedOpenGL *gl); private: Serialiser *m_pSerialiser; const GLHookSet *m_Real;