Skip to content

Commit e7d092c

Browse files
committed
Check format/sample support for creating MSAA <-> Array renderpasses
1 parent 5c934f5 commit e7d092c

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

renderdoc/driver/vulkan/vk_debug.cpp

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -917,6 +917,20 @@ VulkanDebugManager::VulkanDebugManager(WrappedVulkan *driver, VkDevice dev)
917917
attDesc.format = formats[f];
918918
stages[1].module = modules[MS2ARR];
919919

920+
// initialise to NULL
921+
m_DepthMS2ArrayPipe[f] = NULL;
922+
for(size_t s = 0; s < ARRAY_COUNT(sampleCounts); s++)
923+
m_DepthArray2MSPipe[f][s] = NULL;
924+
925+
// if the format isn't supported at all, bail out and don't try to create anything
926+
if(!(m_pDriver->GetFormatProperties(attDesc.format).optimalTilingFeatures &
927+
VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))
928+
{
929+
RDCDEBUG("Depth copies MSAA -> Array not supported for format %s",
930+
ToStr::Get(attDesc.format).c_str());
931+
continue;
932+
}
933+
920934
VkRenderPass rp;
921935

922936
vkr = m_pDriver->vkCreateRenderPass(dev, &rpinfo, NULL, &rp);
@@ -931,13 +945,22 @@ VulkanDebugManager::VulkanDebugManager(WrappedVulkan *driver, VkDevice dev)
931945
m_pDriver->vkDestroyRenderPass(dev, rp, NULL);
932946

933947
stages[1].module = modules[ARR2MS];
948+
msaa.sampleShadingEnable = true;
949+
msaa.minSampleShading = 1.0f;
934950

935951
for(size_t s = 0; s < ARRAY_COUNT(sampleCounts); s++)
936952
{
937953
attDesc.samples = sampleCounts[s];
938954
msaa.rasterizationSamples = sampleCounts[s];
939-
msaa.sampleShadingEnable = true;
940-
msaa.minSampleShading = 1.0f;
955+
956+
// if this sample count isn't supported, don't create it
957+
if(!(m_pDriver->GetDeviceProps().limits.framebufferDepthSampleCounts &
958+
(uint32_t)attDesc.samples))
959+
{
960+
RDCDEBUG("Depth copies Array -> MSAA not supported for sample count %u on format %s",
961+
attDesc.samples, ToStr::Get(attDesc.format).c_str());
962+
continue;
963+
}
941964

942965
vkr = m_pDriver->vkCreateRenderPass(dev, &rpinfo, NULL, &rp);
943966
RDCASSERTEQUAL(vkr, VK_SUCCESS);
@@ -949,12 +972,13 @@ VulkanDebugManager::VulkanDebugManager(WrappedVulkan *driver, VkDevice dev)
949972
RDCASSERTEQUAL(vkr, VK_SUCCESS);
950973

951974
m_pDriver->vkDestroyRenderPass(dev, rp, NULL);
952-
953-
attDesc.samples = VK_SAMPLE_COUNT_1_BIT;
954-
msaa.sampleShadingEnable = false;
955-
msaa.minSampleShading = 0.0f;
956-
msaa.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
957975
}
976+
977+
attDesc.samples = VK_SAMPLE_COUNT_1_BIT;
978+
msaa.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
979+
980+
msaa.sampleShadingEnable = false;
981+
msaa.minSampleShading = 0.0f;
958982
}
959983

960984
// restore pipeline state to normal

renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1472,6 +1472,11 @@ VkResult WrappedVulkan::vkCreateDevice(VkPhysicalDevice physicalDevice,
14721472
ObjDisp(physicalDevice)
14731473
->GetPhysicalDeviceFeatures(Unwrap(physicalDevice), &m_PhysicalDeviceData.features);
14741474

1475+
for(int i = VK_FORMAT_BEGIN_RANGE + 1; i < VK_FORMAT_END_RANGE; i++)
1476+
ObjDisp(physicalDevice)
1477+
->GetPhysicalDeviceFormatProperties(Unwrap(physicalDevice), VkFormat(i),
1478+
&m_PhysicalDeviceData.fmtprops[i]);
1479+
14751480
m_PhysicalDeviceData.readbackMemIndex =
14761481
m_PhysicalDeviceData.GetMemoryIndex(~0U, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, 0);
14771482
m_PhysicalDeviceData.uploadMemIndex =

0 commit comments

Comments
 (0)