diff --git a/renderdoc/api/replay/gl_pipestate.h b/renderdoc/api/replay/gl_pipestate.h index f5206a491..cbe4ea3bc 100644 --- a/renderdoc/api/replay/gl_pipestate.h +++ b/renderdoc/api/replay/gl_pipestate.h @@ -146,6 +146,16 @@ struct GLPipelineState }; rdctype::array UniformBuffers; + struct Feedback + { + ResourceId Obj; + ResourceId BufferBinding[4]; + uint64_t Offset[4]; + uint64_t Size[4]; + bool32 Active; + bool32 Paused; + } m_Feedback; + struct Rasterizer { struct Viewport diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index e7d4b5192..58d073edd 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -1156,6 +1156,34 @@ void GLReplay::SavePipelineState() } } + RDCEraseEl(pipe.m_Feedback); + + GLuint feedback = 0; + gl.glGetIntegerv(eGL_TRANSFORM_FEEDBACK_BINDING, (GLint*)&feedback); + + if(feedback != 0) + { + pipe.m_Feedback.Obj = rm->GetID(FeedbackRes(ctx, feedback)); + + GLint maxCount = 0; + gl.glGetIntegerv(eGL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxCount); + + for(int i=0; i < (int)ARRAY_COUNT(pipe.m_Feedback.BufferBinding) && i < maxCount; i++) + { + GLuint buffer = 0; + gl.glGetIntegeri_v(eGL_TRANSFORM_FEEDBACK_BUFFER_BINDING, i, (GLint*)&buffer);pipe.m_Feedback.BufferBinding[i] = rm->GetID(BufferRes(ctx, buffer)); + gl.glGetInteger64i_v(eGL_TRANSFORM_FEEDBACK_BUFFER_START, i, (GLint64*)&pipe.m_Feedback.Offset[i]); + gl.glGetInteger64i_v(eGL_TRANSFORM_FEEDBACK_BUFFER_SIZE, i, (GLint64*)&pipe.m_Feedback.Size[i]); + } + + GLint p=0; + gl.glGetIntegerv(eGL_TRANSFORM_FEEDBACK_BUFFER_PAUSED, &p); + pipe.m_Feedback.Paused = (p != 0); + + gl.glGetIntegerv(eGL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE, &p); + pipe.m_Feedback.Active = (p != 0); + } + for(int i=0; i < 6; i++) { size_t num = RDCMIN(128, rs.Subroutines[i].numSubroutines); diff --git a/renderdocui/Interop/GLPipelineState.cs b/renderdocui/Interop/GLPipelineState.cs index 07a771f58..ac905862c 100644 --- a/renderdocui/Interop/GLPipelineState.cs +++ b/renderdocui/Interop/GLPipelineState.cs @@ -161,6 +161,22 @@ namespace renderdoc [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] public Buffer[] UniformBuffers; + [StructLayout(LayoutKind.Sequential)] + public class Feedback + { + ResourceId Obj; + [CustomMarshalAs(CustomUnmanagedType.FixedArray, FixedLength = 4)] + ResourceId[] BufferBinding; + [CustomMarshalAs(CustomUnmanagedType.FixedArray, FixedLength = 4)] + UInt64[] Offset; + [CustomMarshalAs(CustomUnmanagedType.FixedArray, FixedLength = 4)] + UInt64[] Size; + bool Active; + bool Paused; + }; + [CustomMarshalAs(CustomUnmanagedType.CustomClass)] + public Feedback m_Feedback; + [StructLayout(LayoutKind.Sequential)] public class Rasterizer {