From 234ecf26c65a8909e91313a8b35e2a8a8bbfc0ef Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 13 May 2016 12:50:11 -0700 Subject: [PATCH] anv/image: Add an aspects field This makes several checks easier and allows us to avoid calling anv_format_for_vk_format in a number of cases. --- src/intel/vulkan/anv_image.c | 3 +++ src/intel/vulkan/anv_private.h | 3 ++- src/intel/vulkan/gen7_cmd_buffer.c | 5 ++--- src/intel/vulkan/genX_cmd_buffer.c | 7 +++---- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index fb2838924dd..6316a2aadc5 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -233,12 +233,14 @@ anv_image_create(VkDevice _device, image->tiling = pCreateInfo->tiling; if (likely(anv_format_is_color(format))) { + image->aspects |= VK_IMAGE_ASPECT_COLOR_BIT; r = make_surface(device, image, create_info, VK_IMAGE_ASPECT_COLOR_BIT); if (r != VK_SUCCESS) goto fail; } else { if (image->format->has_depth) { + image->aspects |= VK_IMAGE_ASPECT_DEPTH_BIT; r = make_surface(device, image, create_info, VK_IMAGE_ASPECT_DEPTH_BIT); if (r != VK_SUCCESS) @@ -246,6 +248,7 @@ anv_image_create(VkDevice _device, } if (image->format->has_stencil) { + image->aspects |= VK_IMAGE_ASPECT_STENCIL_BIT; r = make_surface(device, image, create_info, VK_IMAGE_ASPECT_STENCIL_BIT); if (r != VK_SUCCESS) diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index a5888d6ff4d..c3b31e612f4 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1561,6 +1561,7 @@ struct anv_image { */ VkFormat vk_format; const struct anv_format *format; + VkImageAspectFlags aspects; VkExtent3D extent; uint32_t levels; uint32_t array_size; @@ -1579,7 +1580,7 @@ struct anv_image { * Image subsurfaces * * For each foo, anv_image::foo_surface is valid if and only if - * anv_image::format has a foo aspect. + * anv_image::aspects has a foo aspect. * * The hardware requires that the depth buffer and stencil buffer be * separate surfaces. From Vulkan's perspective, though, depth and stencil diff --git a/src/intel/vulkan/gen7_cmd_buffer.c b/src/intel/vulkan/gen7_cmd_buffer.c index 03ce889088a..62d9f4644a1 100644 --- a/src/intel/vulkan/gen7_cmd_buffer.c +++ b/src/intel/vulkan/gen7_cmd_buffer.c @@ -415,9 +415,8 @@ genX(cmd_buffer_flush_dynamic_state)(struct anv_cmd_buffer *cmd_buffer) const struct anv_image_view *iview = anv_cmd_buffer_get_depth_stencil_view(cmd_buffer); const struct anv_image *image = iview ? iview->image : NULL; - const struct anv_format *anv_format = - iview ? anv_format_for_vk_format(iview->vk_format) : NULL; - const bool has_depth = iview && anv_format->has_depth; + const bool has_depth = + image && (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT); const uint32_t depth_format = has_depth ? isl_surf_get_depth_format(&cmd_buffer->device->isl_dev, &image->depth_surface.isl) : D16_UNORM; diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 0a5c404f718..a7e20da32cb 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -927,10 +927,9 @@ cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer) const struct anv_image_view *iview = anv_cmd_buffer_get_depth_stencil_view(cmd_buffer); const struct anv_image *image = iview ? iview->image : NULL; - const struct anv_format *anv_format = - iview ? anv_format_for_vk_format(iview->vk_format) : NULL; - const bool has_depth = iview && anv_format->has_depth; - const bool has_stencil = iview && anv_format->has_stencil; + const bool has_depth = image && (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT); + const bool has_stencil = + image && (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT); /* FIXME: Implement the PMA stall W/A */ /* FIXME: Width and Height are wrong */ -- 2.30.2