diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 5f354b5e5..c8f18f399 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -580,6 +580,7 @@ private: bool m_DynVertexInput = false; bool m_DynAttachmentLoop = false; bool m_MultiView = false; + bool m_MultiViewGeometryShaders = false; bool m_MeshQueries = false; bool m_MeshShaders = false; bool m_TaskShaders = false; @@ -1571,6 +1572,7 @@ public: bool Maintenance6() const { return m_Maintenance6; } bool Maintenance9() const { return m_Maintenance9; } bool DescriptorBuffers() const { return m_DescriptorBuffers; } + bool MultiViewGeometryShaders() const { return m_MultiViewGeometryShaders; } bool MultiviewPerViewViewports() const { return m_MultiviewPerViewViewports; } VulkanRenderState &GetRenderState() { return m_RenderState; } void SetActionCB(VulkanActionCallback *cb) { m_ActionCallback = cb; } diff --git a/renderdoc/driver/vulkan/vk_overlay.cpp b/renderdoc/driver/vulkan/vk_overlay.cpp index 18ea61198..391150be8 100644 --- a/renderdoc/driver/vulkan/vk_overlay.cpp +++ b/renderdoc/driver/vulkan/vk_overlay.cpp @@ -3324,7 +3324,7 @@ ResourceId VulkanReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, D } else if(overlay == DebugOverlay::TriangleSizePass || overlay == DebugOverlay::TriangleSizeDraw) { - if(!state.rastDiscardEnable) + if(!state.rastDiscardEnable && (multiviewMask == 0 || m_pDriver->MultiViewGeometryShaders())) { VulkanRenderState prevstate = state; diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 578955599..f34efd7ed 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -2387,6 +2387,14 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(shaderDrawParameters); m_MultiView |= ext->multiview != VK_FALSE; + + if(avail.multiviewGeometryShader) + ext->multiviewGeometryShader = true; + else + RDCWARN( + "multiviewGeometryShader = false, triangle size overlay with multiview unavailable"); + + m_MultiViewGeometryShaders |= ext->multiviewGeometryShader != VK_FALSE; } END_PHYS_EXT_CHECK(); diff --git a/util/test/demos/vk/vk_multi_view.cpp b/util/test/demos/vk/vk_multi_view.cpp index 9574f13cb..eeaabbaea 100644 --- a/util/test/demos/vk/vk_multi_view.cpp +++ b/util/test/demos/vk/vk_multi_view.cpp @@ -122,6 +122,9 @@ void main() } )EOSHADER"; + + bool geometryTest = false; + void Prepare(int argc, char **argv) { features.geometryShader = VK_TRUE; @@ -137,6 +140,8 @@ void main() if(!multiview.multiview) Avail = "Multiview feature 'multiview' not available"; + geometryTest = multiview.multiviewGeometryShader == VK_TRUE; + devInfoNext = &multiview; } @@ -233,13 +238,16 @@ void main() testPipes.push_back(createGraphicsPipeline(pipeCreateInfo)); testNames.push_back("Fragment: viewIndex"); - pipeCreateInfo.stages = { - CompileShaderModule(VKDefaultVertex, ShaderLang::glsl, ShaderStage::vert, "main"), - CompileShaderModule(VKDefaultPixel, ShaderLang::glsl, ShaderStage::frag, "main"), - CompileShaderModule(multiViewGeom, ShaderLang::glsl, ShaderStage::geom, "main"), - }; - testPipes.push_back(createGraphicsPipeline(pipeCreateInfo)); - testNames.push_back("Geometry: viewIndex"); + if(geometryTest) + { + pipeCreateInfo.stages = { + CompileShaderModule(VKDefaultVertex, ShaderLang::glsl, ShaderStage::vert, "main"), + CompileShaderModule(VKDefaultPixel, ShaderLang::glsl, ShaderStage::frag, "main"), + CompileShaderModule(multiViewGeom, ShaderLang::glsl, ShaderStage::geom, "main"), + }; + testPipes.push_back(createGraphicsPipeline(pipeCreateInfo)); + testNames.push_back("Geometry: viewIndex"); + } pipeCreateInfo.stages = { CompileShaderModule(VKDefaultVertex, ShaderLang::glsl, ShaderStage::vert, "main"),