diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp index c75af8cb5..908e0e09a 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp @@ -261,6 +261,21 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState ubo->setInstantTooltips(true); } + { + RDHeaderView *header = new RDHeaderView(Qt::Horizontal, this); + ui->xfbBuffers->setHeader(header); + + ui->xfbBuffers->setColumns( + {tr("Slot"), tr("Buffer"), tr("Byte Length"), tr("Offset"), tr("Go")}); + header->setColumnStretchHints({1, 4, 3, 2, -1}); + + header->setMinimumSectionSize(40); + + ui->xfbBuffers->setClearSelectionOnFocusLoss(true); + ui->xfbBuffers->setInstantTooltips(true); + ui->xfbBuffers->setHoverIconColumn(4, action, action_hover); + } + { RDHeaderView *header = new RDHeaderView(Qt::Horizontal, this); ui->viewports->setHeader(header); @@ -348,7 +363,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState ui->viAttrs->setFont(Formatter::PreferredFont()); ui->viBuffers->setFont(Formatter::PreferredFont()); - ui->gsFeedback->setFont(Formatter::PreferredFont()); + ui->xfbBuffers->setFont(Formatter::PreferredFont()); ui->vsShader->setFont(Formatter::PreferredFont()); ui->vsTextures->setFont(Formatter::PreferredFont()); ui->vsSamplers->setFont(Formatter::PreferredFont()); @@ -1281,9 +1296,9 @@ void GLPipelineStateViewer::setState() setShaderState(state.m_CS, ui->csShader, ui->csTextures, ui->csSamplers, ui->csUBOs, ui->csSubroutines, ui->csReadWrite); - vs = ui->gsFeedback->verticalScrollBar()->value(); - ui->gsFeedback->beginUpdate(); - ui->gsFeedback->clear(); + vs = ui->xfbBuffers->verticalScrollBar()->value(); + ui->xfbBuffers->beginUpdate(); + ui->xfbBuffers->clear(); ui->xfbObj->setText(ToQStr(state.m_Feedback.Obj)); if(state.m_Feedback.Active) { @@ -1314,15 +1329,14 @@ void GLPipelineStateViewer::setState() if(!usedSlot) setInactiveRow(node); - ui->gsFeedback->addTopLevelItem(node); + ui->xfbBuffers->addTopLevelItem(node); } } } - ui->gsFeedback->verticalScrollBar()->setValue(vs); - ui->gsFeedback->clearSelection(); - ui->gsFeedback->endUpdate(); + ui->xfbBuffers->verticalScrollBar()->setValue(vs); + ui->xfbBuffers->clearSelection(); + ui->xfbBuffers->endUpdate(); - ui->gsFeedback->setVisible(state.m_Feedback.Active); ui->xfbGroup->setVisible(state.m_Feedback.Active); //////////////////////////////////////////////// @@ -1872,9 +1886,27 @@ void GLPipelineStateViewer::setState() } else { + bool raster = true; + bool fbo = true; + + if(state.m_VtxProcess.discard) + { + raster = fbo = false; + } + + if(state.m_GS.Object == ResourceId() && state.m_Feedback.Active) + { + ui->pipeFlow->setStageName(4, lit("XFB"), tr("Transform Feedback")); + } + else + { + ui->pipeFlow->setStageName(4, lit("GS"), tr("Geometry Shader")); + } + ui->pipeFlow->setStagesEnabled( {true, true, state.m_TCS.Object != ResourceId(), state.m_TES.Object != ResourceId(), - state.m_GS.Object != ResourceId(), true, state.m_FS.Object != ResourceId(), true, false}); + state.m_GS.Object != ResourceId() || state.m_Feedback.Active, raster, + !state.m_VtxProcess.discard && state.m_FS.Object != ResourceId(), fbo, false}); } } diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.ui b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.ui index ec047505c..62a5634cf 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.ui +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.ui @@ -2170,7 +2170,7 @@ - + QFrame::Box diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index 813b79a22..d9d26f854 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -3353,7 +3353,10 @@ void GLReplay::InitPostVSBuffers(uint32_t eventID) WrappedOpenGL &gl = *m_pDriver; if(gl.m_ActiveFeedback) + { gl.glEndTransformFeedback(); + gl.m_WasActiveFeedback = true; + } GLResourceManager *rm = m_pDriver->GetResourceManager(); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 2caf59617..a2155bca6 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -5224,6 +5224,8 @@ void WrappedOpenGL::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay { GLMarkerRegion apply("!!!!RenderDoc Internal: ApplyInitialContents"); GetResourceManager()->ApplyInitialContents(); + + m_WasActiveFeedback = false; } m_State = CaptureState::ActiveReplaying; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 97234bb72..a9feb6a2a 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -142,6 +142,7 @@ private: [MAX_QUERY_INDICES]; // first index type, second index (for some, always 0) bool m_ActiveConditional; bool m_ActiveFeedback; + bool m_WasActiveFeedback = false; ResourceId m_DeviceResourceID; GLResourceRecord *m_DeviceRecord; diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 522e32689..16327f165 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -1131,7 +1131,7 @@ void GLReplay::SavePipelineState() pipe.m_Feedback.Paused = (p != 0); gl.glGetIntegerv(eGL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE, &p); - pipe.m_Feedback.Active = (p != 0); + pipe.m_Feedback.Active = (p != 0) || m_pDriver->m_WasActiveFeedback; } for(int i = 0; i < 6; i++)