summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2021-04-05 12:38:29 -0700
committerIan Romanick <ian.d.romanick@intel.com>2021-04-05 19:24:00 -0700
commit3d709fc26e14c987f0490860689dd4fabb3624d6 (patch)
tree943be8ef71a1d05ea8722d7150bb719db507abcc
parentf79208d84a64291026649401252d92898bc2df55 (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.c6
-rw-r--r--src/intel/vulkan/anv_image.c4
-rw-r--r--src/intel/vulkan/anv_private.h19
-rw-r--r--src/intel/vulkan/genX_cmd_buffer.c2
-rw-r--r--src/intel/vulkan/genX_pipeline.c4
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;