From e3a40c7806c694c1e8d4d58e2186c30100173ff8 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Wed, 29 Jul 2015 09:21:22 -0600 Subject: layers: Add validation case for mismatched renderpass attachements and subpasses Added to the Image validation layer. --- layers/image.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'layers/image.cpp') diff --git a/layers/image.cpp b/layers/image.cpp index 4520fa14..bd5f9d81 100644 --- a/layers/image.cpp +++ b/layers/image.cpp @@ -246,6 +246,28 @@ VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceLayerProperties( pCount, pProperties); } +// Start of the Image layer proper + +// Returns TRUE if a format is a depth-compatible format +bool is_depth_format(VkFormat format) +{ + bool result = VK_FALSE; + switch (format) { + case VK_FORMAT_D16_UNORM: + case VK_FORMAT_D24_UNORM: + case VK_FORMAT_D32_SFLOAT: + case VK_FORMAT_S8_UINT: + case VK_FORMAT_D16_UNORM_S8_UINT: + case VK_FORMAT_D24_UNORM_S8_UINT: + case VK_FORMAT_D32_SFLOAT_S8_UINT: + result = VK_TRUE; + break; + default: + break; + } + return result; +} + VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage) { if(pCreateInfo->format != VK_FORMAT_UNDEFINED) @@ -330,6 +352,24 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(VkDevice device, const VkRende } } + // Any depth buffers specified as attachments? + bool depthFormatPresent = VK_FALSE; + for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) + { + depthFormatPresent |= is_depth_format(pCreateInfo->pAttachments[i].format); + } + + if (depthFormatPresent == VK_FALSE) { + // No depth attachment is present, validate that subpasses set depthStencilAttachment to VK_ATTACHMENT_UNUSED; + for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) { + if (pCreateInfo->pSubpasses[i].depthStencilAttachment.attachment != VK_ATTACHMENT_UNUSED) { + std::stringstream ss; + ss << "vkCreateRenderPass has no depth/stencil attachment, yet subpass[" << i << "] has VkSubpassDescription::depthStencilAttachment value that is not VK_ATTACHMENT_UNUSED"; + log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, 1, "IMAGE", ss.str().c_str()); + } + } + } + VkResult result = get_dispatch_table(image_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pRenderPass); return result; -- cgit v1.2.3