anv/formats: Relax usage checks if EXTENDED_USAGE_BIT is set
Reviewed-by: Ivan Briano <ivan.briano@intel.com> Reviewed-by: Connor Abbott <cwabbott0@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14153>
This commit is contained in:

committed by
Marge Bot

parent
9b28b76e85
commit
13fc698cef
@@ -1083,6 +1083,22 @@ anv_get_image_format_properties(
|
|||||||
break;
|
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) {
|
if (info->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
|
||||||
/* We support modifiers only for "simple" (that is, non-array
|
/* We support modifiers only for "simple" (that is, non-array
|
||||||
* non-mipmapped single-sample) 2D images.
|
* 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 &&
|
if (isl_mod_info->aux_usage == ISL_AUX_USAGE_CCS_E &&
|
||||||
!anv_formats_ccs_e_compatible(devinfo, info->flags, info->format,
|
!anv_formats_ccs_e_compatible(devinfo, info->flags, info->format,
|
||||||
info->tiling, info->usage,
|
info->tiling, image_usage,
|
||||||
format_list_info)) {
|
format_list_info)) {
|
||||||
goto unsupported;
|
goto unsupported;
|
||||||
}
|
}
|
||||||
@@ -1122,44 +1138,55 @@ anv_get_image_format_properties(
|
|||||||
(format_feature_flags & (VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR |
|
(format_feature_flags & (VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR |
|
||||||
VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR)) &&
|
VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR)) &&
|
||||||
!(info->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
|
!(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)) {
|
isl_format_supports_multisampling(devinfo, format->planes[0].isl_format)) {
|
||||||
sampleCounts = isl_device_get_sample_counts(&physical_device->isl_dev);
|
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 |
|
if (!(format_feature_flags & (VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR |
|
||||||
VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR))) {
|
VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR))) {
|
||||||
goto unsupported;
|
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 |
|
if (!(format_feature_flags & (VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR |
|
||||||
VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR))) {
|
VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR))) {
|
||||||
goto unsupported;
|
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)) {
|
if (!(format_feature_flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR)) {
|
||||||
goto unsupported;
|
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)) {
|
if (!(format_feature_flags & VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR)) {
|
||||||
goto unsupported;
|
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)) {
|
if (!(format_feature_flags & VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR)) {
|
||||||
goto unsupported;
|
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)) {
|
if (!(format_feature_flags & VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR)) {
|
||||||
goto unsupported;
|
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. */
|
/* 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
|
/* Ignore this flag because it was removed from the
|
||||||
* provisional_I_20150910 header.
|
* provisional_I_20150910 header.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user