diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2021-04-05 12:38:29 -0700 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2021-04-05 19:24:00 -0700 |
commit | 3d709fc26e14c987f0490860689dd4fabb3624d6 (patch) | |
tree | 943be8ef71a1d05ea8722d7150bb719db507abcc | |
parent | f79208d84a64291026649401252d92898bc2df55 (diff) |
anv: Add and use anv_format_aspects
Some non-planar, subsampled formats need special treatment on Intel
GPUs. Rather than modify vk_format_aspects, overload it with a function
that encapsulates the Intel requirements.
-rw-r--r-- | src/intel/vulkan/anv_formats.c | 6 | ||||
-rw-r--r-- | src/intel/vulkan/anv_image.c | 4 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 19 | ||||
-rw-r--r-- | src/intel/vulkan/genX_cmd_buffer.c | 2 | ||||
-rw-r--r-- | src/intel/vulkan/genX_pipeline.c | 4 |
5 files changed, 27 insertions, 8 deletions
diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index f31ee2d888e..37ca8cf907f 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -518,7 +518,7 @@ anv_get_format_plane(const struct gen_device_info *devinfo, VkFormat vk_format, if (format == NULL) return unsupported; - uint32_t plane = anv_image_aspect_to_plane(vk_format_aspects(vk_format), aspect); + uint32_t plane = anv_image_aspect_to_plane(anv_format_aspects(vk_format), aspect); struct anv_format_plane plane_format = format->planes[plane]; if (plane_format.isl_format == ISL_FORMAT_UNSUPPORTED) return unsupported; @@ -527,7 +527,7 @@ anv_get_format_plane(const struct gen_device_info *devinfo, VkFormat vk_format, return plane_format; if (aspect & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) { - assert(vk_format_aspects(vk_format) & + assert(anv_format_aspects(vk_format) & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)); /* There's no reason why we strictly can't support depth or stencil with @@ -595,7 +595,7 @@ anv_get_image_format_features(const struct gen_device_info *devinfo, assert((isl_mod_info != NULL) == (vk_tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)); - const VkImageAspectFlags aspects = vk_format_aspects(vk_format); + const VkImageAspectFlags aspects = anv_format_aspects(vk_format); if (aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) { if (vk_tiling == VK_IMAGE_TILING_LINEAR || diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index dd53520dfc6..c672451473b 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -930,7 +930,7 @@ anv_image_create(VkDevice _device, pCreateInfo->extent); image->vk_format = pCreateInfo->format; image->format = anv_get_format(pCreateInfo->format); - image->aspects = vk_format_aspects(image->vk_format); + image->aspects = anv_format_aspects(image->vk_format); image->levels = pCreateInfo->mipLevels; image->array_size = pCreateInfo->arrayLayers; image->samples = pCreateInfo->samples; @@ -1197,7 +1197,7 @@ resolve_ahw_image(struct anv_device *device, */ image->vk_format = vk_format; image->format = anv_get_format(vk_format); - image->aspects = vk_format_aspects(image->vk_format); + image->aspects = anv_format_aspects(image->vk_format); image->n_planes = image->format->n_planes; uint32_t stride = desc.stride * diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index a6c4e09c6fe..3423b09ae1a 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -31,6 +31,7 @@ #include <assert.h> #include <stdint.h> #include "drm-uapi/i915_drm.h" +#include "vk_format.h" #ifdef HAVE_VALGRIND #include <valgrind.h> @@ -3561,6 +3562,24 @@ anv_plane_to_aspect(VkImageAspectFlags image_aspects, return VK_IMAGE_ASPECT_STENCIL_BIT; } +static inline VkImageAspectFlags +anv_format_aspects(VkFormat format) +{ + switch (format) { + case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16: + case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16: + case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16: + case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16: + case VK_FORMAT_G16B16G16R16_422_UNORM: + case VK_FORMAT_B16G16R16G16_422_UNORM: + return (VK_IMAGE_ASPECT_PLANE_0_BIT | + VK_IMAGE_ASPECT_PLANE_1_BIT); + + default: + return vk_format_aspects(format); + } +} + #define anv_foreach_image_aspect_bit(b, image, aspects) \ u_foreach_bit(b, anv_image_expand_aspects(image, aspects)) diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index c8fd7cb18f3..2598ad0e280 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -1419,7 +1419,7 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer, for (uint32_t i = 0; i < pass->attachment_count; ++i) { const struct anv_render_pass_attachment *pass_att = &pass->attachments[i]; struct anv_attachment_state *att_state = &state->attachments[i]; - VkImageAspectFlags att_aspects = vk_format_aspects(pass_att->format); + VkImageAspectFlags att_aspects = anv_format_aspects(pass_att->format); VkImageAspectFlags clear_aspects = 0; VkImageAspectFlags load_aspects = 0; diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c index 32594192134..dbe65449320 100644 --- a/src/intel/vulkan/genX_pipeline.c +++ b/src/intel/vulkan/genX_pipeline.c @@ -730,7 +730,7 @@ emit_rs_state(struct anv_graphics_pipeline *pipeline, VkFormat vk_format = pass->attachments[subpass->depth_stencil_attachment->attachment].format; assert(vk_format_is_depth_or_stencil(vk_format)); - if (vk_format_aspects(vk_format) & VK_IMAGE_ASPECT_DEPTH_BIT) { + if (anv_format_aspects(vk_format) & VK_IMAGE_ASPECT_DEPTH_BIT) { enum isl_format isl_format = anv_get_isl_format(&pipeline->base.device->info, vk_format, VK_IMAGE_ASPECT_DEPTH_BIT, @@ -1053,7 +1053,7 @@ emit_ds_state(struct anv_graphics_pipeline *pipeline, if (subpass->depth_stencil_attachment) { VkFormat depth_stencil_format = pass->attachments[subpass->depth_stencil_attachment->attachment].format; - ds_aspects = vk_format_aspects(depth_stencil_format); + ds_aspects = anv_format_aspects(depth_stencil_format); } VkPipelineDepthStencilStateCreateInfo info = *pCreateInfo; |