From 61de35bfc6c6dcc0800c1eb76180d6d4045d0ecd Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 12 Aug 2019 15:38:19 +0100 Subject: [PATCH] Pass through primitive restart state when rendering meshes --- qrenderdoc/Windows/BufferViewer.cpp | 3 +++ renderdoc/api/replay/control_types.h | 7 +++++++ renderdoc/driver/gl/gl_rendermesh.cpp | 14 ++++++++++++++ renderdoc/driver/vulkan/vk_rendermesh.cpp | 5 +---- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/qrenderdoc/Windows/BufferViewer.cpp b/qrenderdoc/Windows/BufferViewer.cpp index 4d07dd46b..647909bcf 100644 --- a/qrenderdoc/Windows/BufferViewer.cpp +++ b/qrenderdoc/Windows/BufferViewer.cpp @@ -2091,6 +2091,9 @@ void BufferViewer::OnEventChanged(uint32_t eventId) float vpWidth = qAbs(vp.width); float vpHeight = qAbs(vp.height); + m_Config.position.allowRestart = m_Ctx.CurPipelineState().IsStripRestartEnabled(); + m_Config.position.restartIndex = m_Ctx.CurPipelineState().GetStripRestartIndex(); + m_Config.fov = ui->fovGuess->value(); m_Config.aspect = (vpWidth > 0.0f && vpHeight > 0.0f) ? (vpWidth / vpHeight) : 1.0f; m_Config.highlightVert = 0; diff --git a/renderdoc/api/replay/control_types.h b/renderdoc/api/replay/control_types.h index 3622cbd27..55066e124 100644 --- a/renderdoc/api/replay/control_types.h +++ b/renderdoc/api/replay/control_types.h @@ -47,6 +47,8 @@ struct MeshFormat unproject = false; instanced = false; nearPlane = farPlane = 0.0f; + allowRestart = true; + restartIndex = 0xffffffff; } MeshFormat(const MeshFormat &o) = default; @@ -80,6 +82,8 @@ struct MeshFormat uint32_t numIndices; DOCUMENT("The number of instances to render with the same value. See :data:`instanced`."); uint32_t instStepRate; + DOCUMENT("The primitive restart index to use, if possible. See :data:`allowRestart`."); + uint32_t restartIndex; DOCUMENT("The near plane for the projection matrix."); float nearPlane; @@ -93,6 +97,9 @@ struct MeshFormat DOCUMENT("``True`` if the alpha component of this element should be used."); bool showAlpha; + + DOCUMENT("``True`` if the primitive restart index feature should be used."); + bool allowRestart; }; DECLARE_REFLECTION_STRUCT(MeshFormat); diff --git a/renderdoc/driver/gl/gl_rendermesh.cpp b/renderdoc/driver/gl/gl_rendermesh.cpp index 4327ddc8a..5bc28b1e6 100644 --- a/renderdoc/driver/gl/gl_rendermesh.cpp +++ b/renderdoc/driver/gl/gl_rendermesh.cpp @@ -68,6 +68,20 @@ void GLReplay::RenderMesh(uint32_t eventId, const std::vector &secon if(HasExt[EXT_framebuffer_sRGB]) drv.glEnable(eGL_FRAMEBUFFER_SRGB); + if(cfg.position.allowRestart) + { + if(IsGLES) + { + drv.glEnable(eGL_PRIMITIVE_RESTART_FIXED_INDEX); + } + else + { + drv.glEnable(eGL_PRIMITIVE_RESTART); + drv.glPrimitiveRestartIndex(cfg.position.restartIndex & + (0xFFFFFFFFU >> ((4 - cfg.position.indexByteStride) * 8))); + } + } + drv.glDisable(eGL_CULL_FACE); if(cfg.position.unproject) diff --git a/renderdoc/driver/vulkan/vk_rendermesh.cpp b/renderdoc/driver/vulkan/vk_rendermesh.cpp index 9da7d4d78..f96181ced 100644 --- a/renderdoc/driver/vulkan/vk_rendermesh.cpp +++ b/renderdoc/driver/vulkan/vk_rendermesh.cpp @@ -138,10 +138,7 @@ MeshDisplayPipelines VulkanDebugManager::CacheMeshDisplayPipelines(VkPipelineLay false, }; - if(IsStrip(primary.topology)) - { - ia.primitiveRestartEnable = true; - } + ia.primitiveRestartEnable = primary.allowRestart; VkRect2D scissor = {{0, 0}, {16384, 16384}};