From 1592426da5348bb3325b56bf5aa8bd426ce303bf Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 10 Jan 2018 20:50:47 +0000 Subject: [PATCH] Handle geometryShader feature being unavailable - disable lit mesh mode --- renderdoc/driver/vulkan/vk_rendermesh.cpp | 13 ++++++++++--- renderdoc/driver/vulkan/vk_shader_cache.cpp | 3 +++ .../driver/vulkan/wrappers/vk_device_funcs.cpp | 7 +++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_rendermesh.cpp b/renderdoc/driver/vulkan/vk_rendermesh.cpp index 7ac866433..f24dd4545 100644 --- a/renderdoc/driver/vulkan/vk_rendermesh.cpp +++ b/renderdoc/driver/vulkan/vk_rendermesh.cpp @@ -322,9 +322,12 @@ MeshDisplayPipelines VulkanDebugManager::CacheMeshDisplayPipelines(VkPipelineLay stages[2].stage = VK_SHADER_STAGE_GEOMETRY_BIT; pipeInfo.stageCount = 3; - vkr = vt->CreateGraphicsPipelines(Unwrap(m_Device), VK_NULL_HANDLE, 1, &pipeInfo, NULL, - &cache.pipes[MeshDisplayPipelines::ePipe_Lit]); - RDCASSERTEQUAL(vkr, VK_SUCCESS); + if(stages[2].module != VK_NULL_HANDLE) + { + vkr = vt->CreateGraphicsPipelines(Unwrap(m_Device), VK_NULL_HANDLE, 1, &pipeInfo, NULL, + &cache.pipes[MeshDisplayPipelines::ePipe_Lit]); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + } for(uint32_t i = 0; i < MeshDisplayPipelines::ePipe_Count; i++) if(cache.pipes[i] != VK_NULL_HANDLE) @@ -553,6 +556,10 @@ void VulkanReplay::RenderMesh(uint32_t eventId, const vector &second case SolidShade::Secondary: pipe = cache.pipes[MeshDisplayPipelines::ePipe_Secondary]; break; } + // can't support lit rendering without the pipeline - maybe geometry shader wasn't supported. + if(solidShadeMode == SolidShade::Lit && pipe == VK_NULL_HANDLE) + pipe = cache.pipes[MeshDisplayPipelines::ePipe_SolidDepth]; + uint32_t uboOffs = 0; MeshUBOData *data = (MeshUBOData *)m_MeshRender.UBO.Map(&uboOffs); diff --git a/renderdoc/driver/vulkan/vk_shader_cache.cpp b/renderdoc/driver/vulkan/vk_shader_cache.cpp index 8572aed05..1370b5ed1 100644 --- a/renderdoc/driver/vulkan/vk_shader_cache.cpp +++ b/renderdoc/driver/vulkan/vk_shader_cache.cpp @@ -147,6 +147,9 @@ VulkanShaderCache::VulkanShaderCache(WrappedVulkan *driver) } } + if(config.stage == SPIRVShaderStage::Geometry && !features.geometryShader) + continue; + std::string defines = ""; if(driverVersion.TexelFetchBrokenDriver()) defines += "#define NO_TEXEL_FETCH\n"; diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index c3503b67e..b83de065a 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -1082,6 +1082,13 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi // we have a fallback for this case, so no warning + if(availFeatures.geometryShader) + enabledFeatures.geometryShader = true; + else + RDCWARN( + "geometryShader = false, lit mesh rendering will not be available if rendering on this " + "device."); + if(availFeatures.robustBufferAccess) enabledFeatures.robustBufferAccess = true; else