Add fallback to VK_FORMAT_D24_UNORM_S8_UINT in pixel history

* Not all devices will support D32S8, so we need to fall back to D24S8 if
  needed. One or the other must be supported.
This commit is contained in:
baldurk committed 2020-05-15 19:03:27 +01:00
1 parent 5b5bd49a43
commit ec881a600c
1 file changed
+18 -6
+18 -6
View File
@@ -74,6 +74,7 @@ struct PixelHistoryResources
// Used for offscreen rendering for draw call events.
VkImage colorImage;
VkImageView colorImageView;
VkFormat dsFormat;
VkImage dsImage;
VkImageView dsImageView;
VkDeviceMemory gpuMem;
@@ -112,6 +113,7 @@ struct PixelHistoryCallbackInfo
VkImageView subImageView;
// Image used to get stencil counts.
VkFormat dsFormat;
VkImage dsImage;
VkImageView dsImageView;
@@ -625,7 +627,7 @@ protected:
}
VkAttachmentDescription dsAtt = {};
dsAtt.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
dsAtt.format = m_CallbackInfo.dsFormat;
dsAtt.samples = m_CallbackInfo.samples;
dsAtt.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
dsAtt.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
@@ -1132,7 +1134,7 @@ struct VulkanColorAndStencilCallback : public VulkanPixelHistoryCallback
CopyPixelParams params = {};
params.srcImage = m_CallbackInfo.dsImage;
params.srcImageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
params.srcImageFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
params.srcImageFormat = m_CallbackInfo.dsFormat;
params.depthCopy = true;
// Copy stencil value that indicates the number of fragments ignoring
// shader discard.
@@ -2064,7 +2066,7 @@ struct VulkanPixelHistoryPerFragmentCallback : VulkanPixelHistoryCallback
depthCopyParams.depthCopy = true;
depthCopyParams.srcImage = m_CallbackInfo.dsImage;
depthCopyParams.srcImageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
depthCopyParams.srcImageFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
depthCopyParams.srcImageFormat = m_CallbackInfo.dsFormat;
CopyImagePixel(cmd, depthCopyParams,
storeOffset + offsetof(struct PixelHistoryValue, depth));
}
@@ -2491,6 +2493,14 @@ bool VulkanDebugManager::PixelHistorySetupResources(PixelHistoryResources &resou
VkDeviceSize totalMemorySize = 0;
VkFormat dsFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
if(!(m_pDriver->GetFormatProperties(dsFormat).optimalTilingFeatures &
VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))
dsFormat = VK_FORMAT_D24_UNORM_S8_UINT;
RDCDEBUG("Using depth-stencil format %s", ToStr(dsFormat).c_str());
// Create Images
VkImageCreateInfo imgInfo = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO};
imgInfo.imageType = VK_IMAGE_TYPE_2D;
@@ -2520,7 +2530,7 @@ bool VulkanDebugManager::PixelHistorySetupResources(PixelHistoryResources &resou
m_pDriver->vkGetImageMemoryRequirements(dev, colorImage, &colorImageMrq);
totalMemorySize = colorImageMrq.size;
imgInfo.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
imgInfo.format = dsFormat;
imgInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
@@ -2560,7 +2570,7 @@ bool VulkanDebugManager::PixelHistorySetupResources(PixelHistoryResources &resou
RDCASSERTEQUAL(vkr, VK_SUCCESS);
viewInfo.image = dsImage;
viewInfo.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
viewInfo.format = dsFormat;
viewInfo.subresourceRange = {VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, 0, 1, 0, 1};
vkr = m_pDriver->vkCreateImageView(m_Device, &viewInfo, NULL, &dsImageView);
@@ -2598,7 +2608,7 @@ bool VulkanDebugManager::PixelHistorySetupResources(PixelHistoryResources &resou
RDCASSERTEQUAL(vkr, VK_SUCCESS);
viewInfo.image = dsImage;
viewInfo.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
viewInfo.format = dsFormat;
viewInfo.subresourceRange = {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1};
vkr = m_pDriver->vkCreateImageView(m_Device, &viewInfo, NULL, &depthOnlyImageView);
@@ -2645,6 +2655,7 @@ bool VulkanDebugManager::PixelHistorySetupResources(PixelHistoryResources &resou
resources.colorImage = colorImage;
resources.colorImageView = colorImageView;
resources.dsFormat = dsFormat;
resources.dsImage = dsImage;
resources.dsImageView = dsImageView;
resources.gpuMem = gpuMem;
@@ -2940,6 +2951,7 @@ rdcarray<PixelModification> VulkanReplay::PixelHistory(rdcarray<EventUsage> even
callbackInfo.subImage = resources.colorImage;
callbackInfo.subImageView = resources.colorImageView;
callbackInfo.dsImage = resources.dsImage;
callbackInfo.dsFormat = resources.dsFormat;
callbackInfo.dsImageView = resources.dsImageView;
callbackInfo.dstBuffer = resources.dstBuffer;