diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index f834f86c193..ec9ba0745e6 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -1083,6 +1083,22 @@ anv_get_image_format_properties( break; } + /* From the Vulkan 1.2.199 spec: + * + * "VK_IMAGE_CREATE_EXTENDED_USAGE_BIT specifies that the image can be + * created with usage flags that are not supported for the format the + * image is created with but are supported for at least one format a + * VkImageView created from the image can have." + * + * If VK_IMAGE_CREATE_EXTENDED_USAGE_BIT is set, views can be created with + * different usage than the image so we can't always filter on usage. + * There is one exception to this below for storage. + */ + const VkImageUsageFlags image_usage = info->usage; + VkImageUsageFlags view_usage = image_usage; + if (info->flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT) + view_usage = 0; + if (info->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) { /* We support modifiers only for "simple" (that is, non-array * non-mipmapped single-sample) 2D images. @@ -1100,7 +1116,7 @@ anv_get_image_format_properties( if (isl_mod_info->aux_usage == ISL_AUX_USAGE_CCS_E && !anv_formats_ccs_e_compatible(devinfo, info->flags, info->format, - info->tiling, info->usage, + info->tiling, image_usage, format_list_info)) { goto unsupported; } @@ -1122,44 +1138,55 @@ anv_get_image_format_properties( (format_feature_flags & (VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR | VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR)) && !(info->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) && - !(info->usage & VK_IMAGE_USAGE_STORAGE_BIT) && + !(image_usage & VK_IMAGE_USAGE_STORAGE_BIT) && isl_format_supports_multisampling(devinfo, format->planes[0].isl_format)) { sampleCounts = isl_device_get_sample_counts(&physical_device->isl_dev); } - if (info->usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) { + if (view_usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) { if (!(format_feature_flags & (VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR | VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR))) { goto unsupported; } } - if (info->usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) { + if (view_usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) { if (!(format_feature_flags & (VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR | VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR))) { goto unsupported; } } - if (info->usage & VK_IMAGE_USAGE_SAMPLED_BIT) { + if (view_usage & VK_IMAGE_USAGE_SAMPLED_BIT) { if (!(format_feature_flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR)) { goto unsupported; } } - if (info->usage & VK_IMAGE_USAGE_STORAGE_BIT) { + if (image_usage & VK_IMAGE_USAGE_STORAGE_BIT) { + /* Non-power-of-two formats can never be used as storage images. We + * only check plane 0 because there are no YCbCr formats with + * non-power-of-two planes. + */ + const struct isl_format_layout *isl_layout = + isl_format_get_layout(format->planes[0].isl_format); + if (!util_is_power_of_two_or_zero(isl_layout->bpb)) + goto unsupported; + } + + if (view_usage & VK_IMAGE_USAGE_STORAGE_BIT) { if (!(format_feature_flags & VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR)) { goto unsupported; } } - if (info->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { + if (view_usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { if (!(format_feature_flags & VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR)) { goto unsupported; } } - if (info->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + if (view_usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { if (!(format_feature_flags & VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR)) { goto unsupported; } @@ -1216,11 +1243,11 @@ anv_get_image_format_properties( } } - if (info->usage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) { + if (image_usage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) { /* Nothing to check. */ } - if (info->usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) { + if (image_usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) { /* Ignore this flag because it was removed from the * provisional_I_20150910 header. */