aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorByumjinConffx <byumjin@conffx.com>2019-08-14 15:17:53 -0700
committerMark Lobodzinski <mark@lunarg.com>2019-08-20 12:18:41 -0600
commit991b606e31ccf258534a1e9231d15b2da5a6a142 (patch)
tree00311a83244d3b9f0c9f5980b397124e075dc785
parent1c74abfcad8f38800e6545afb0793069ddb342c6 (diff)
downloadvulkan-validation-layers-991b606e31ccf258534a1e9231d15b2da5a6a142.tar.gz
layers: Add VkImageCreateInfo-usage val
Adds VkImageCreateInfo-usage validation codes for FragmentDensityMap.
-rw-r--r--layers/buffer_validation.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index a55a723b5..f9e8d900f 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -1375,6 +1375,36 @@ bool CoreChecks::PreCallValidateCreateImage(VkDevice device, const VkImageCreate
"maxFramebufferHeight");
}
+ if (device_extensions.vk_ext_fragment_density_map) {
+ uint32_t ceiling_width =
+ (uint32_t)ceil((float)device_limits->maxFramebufferWidth /
+ std::max((float)phys_dev_ext_props.fragment_density_map_props.minFragmentDensityTexelSize.width, 1.0f));
+ if ((pCreateInfo->usage & VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT) && (pCreateInfo->extent.width > ceiling_width)) {
+ skip |=
+ log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
+ "VUID-VkImageCreateInfo-usage-02559",
+ "vkCreateImage(): Image usage flags include a fragment density map bit and image width (%u) exceeds the "
+ "ceiling of device "
+ "maxFramebufferWidth (%u) / minFragmentDensityTexelSize.width (%u). The ceiling value: %u",
+ pCreateInfo->extent.width, device_limits->maxFramebufferWidth,
+ phys_dev_ext_props.fragment_density_map_props.minFragmentDensityTexelSize.width, ceiling_width);
+ }
+
+ uint32_t ceiling_height =
+ (uint32_t)ceil((float)device_limits->maxFramebufferHeight /
+ std::max((float)phys_dev_ext_props.fragment_density_map_props.minFragmentDensityTexelSize.height, 1.0f));
+ if ((pCreateInfo->usage & VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT) && (pCreateInfo->extent.height > ceiling_height)) {
+ skip |=
+ log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
+ "VUID-VkImageCreateInfo-usage-02560",
+ "vkCreateImage(): Image usage flags include a fragment density map bit and image height (%u) exceeds the "
+ "ceiling of device "
+ "maxFramebufferHeight (%u) / minFragmentDensityTexelSize.height (%u). The ceiling value: %u",
+ pCreateInfo->extent.height, device_limits->maxFramebufferHeight,
+ phys_dev_ext_props.fragment_density_map_props.minFragmentDensityTexelSize.height, ceiling_height);
+ }
+ }
+
VkImageFormatProperties format_limits = {};
VkResult res = GetPDImageFormatProperties(pCreateInfo, &format_limits);
if (res == VK_ERROR_FORMAT_NOT_SUPPORTED) {