This will help with the creation of image views where the aspect of the view doesn't necessarly match the aspect of the image plane.
Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> --- src/intel/vulkan/anv_blorp.c | 2 +- src/intel/vulkan/anv_image.c | 26 +++++++++----------------- src/intel/vulkan/anv_private.h | 2 +- src/intel/vulkan/genX_cmd_buffer.c | 21 ++++++++------------- 4 files changed, 19 insertions(+), 32 deletions(-) diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index 29bddc46bda..319e7929c82 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -200,7 +200,7 @@ get_blorp_surf_for_anv_image(const struct anv_device *device, uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); if (layout != ANV_IMAGE_LAYOUT_EXPLICIT_AUX) - aux_usage = anv_layout_to_aux_usage(&device->info, image, aspect, layout); + aux_usage = anv_layout_to_aux_usage(&device->info, image, plane, layout); const struct anv_surface *surface = &image->planes[plane].surface; *blorp_surf = (struct blorp_surf) { diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index b2ca1fdacbd..df1b025d248 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -803,7 +803,7 @@ void anv_GetImageSubresourceLayout( enum isl_aux_usage anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, const struct anv_image * const image, - const VkImageAspectFlagBits aspect, + const uint32_t plane, const VkImageLayout layout) { /* Validate the inputs. */ @@ -814,13 +814,6 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, /* The layout of a NULL image is not properly defined. */ assert(image != NULL); - /* The aspect must be exactly one of the image aspects. */ - assert(util_bitcount(aspect) == 1 && (aspect & image->aspects)); - - /* Determine the optimal buffer. */ - - uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); - /* If there is no auxiliary surface allocated, we must use the one and only * main buffer. */ @@ -831,7 +824,7 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, assert(image->tiling == VK_IMAGE_TILING_OPTIMAL); /* Stencil has no aux */ - assert(aspect != VK_IMAGE_ASPECT_STENCIL_BIT); + assert(image->format->planes[plane].aspect != VK_IMAGE_ASPECT_STENCIL_BIT); switch (layout) { @@ -856,7 +849,7 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, case VK_IMAGE_LAYOUT_GENERAL: case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - if (aspect == VK_IMAGE_ASPECT_DEPTH_BIT) { + if (image->format->planes[plane].aspect == VK_IMAGE_ASPECT_DEPTH_BIT) { /* This buffer could be a depth buffer used in a transfer operation. * BLORP currently doesn't use HiZ for transfer operations so we must * use the main buffer for this layout. TODO: Enable HiZ in BLORP. @@ -875,7 +868,7 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, assert((image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) == 0); /* Fall-through */ case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - if (aspect == VK_IMAGE_ASPECT_DEPTH_BIT) { + if (image->format->planes[plane].aspect == VK_IMAGE_ASPECT_DEPTH_BIT) { if (anv_can_sample_with_hiz(devinfo, image)) return ISL_AUX_USAGE_HIZ; else @@ -903,7 +896,7 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, /* Rendering Layouts */ case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - assert(aspect & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV); + assert(image->format->planes[plane].aspect & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV); if (image->planes[plane].aux_usage == ISL_AUX_USAGE_NONE) { assert(image->samples == 1); return ISL_AUX_USAGE_CCS_D; @@ -914,7 +907,7 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL: - assert(aspect == VK_IMAGE_ASPECT_DEPTH_BIT); + assert(image->format->planes[plane].aspect == VK_IMAGE_ASPECT_DEPTH_BIT); return ISL_AUX_USAGE_HIZ; case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR: @@ -966,7 +959,7 @@ anv_layout_to_fast_clear_type(const struct gen_device_info * const devinfo, * default depth value. */ enum isl_aux_usage aux_usage = - anv_layout_to_aux_usage(devinfo, image, aspect, layout); + anv_layout_to_aux_usage(devinfo, image, plane, layout); return aux_usage == ISL_AUX_USAGE_HIZ ? ANV_FAST_CLEAR_DEFAULT_VALUE : ANV_FAST_CLEAR_NONE; } @@ -1391,10 +1384,9 @@ anv_CreateImageView(VkDevice _device, iview->planes[vplane].general_sampler_surface_state.state = alloc_surface_state(device); enum isl_aux_usage general_aux_usage = - anv_layout_to_aux_usage(&device->info, image, 1UL << iaspect_bit, - VK_IMAGE_LAYOUT_GENERAL); + anv_layout_to_aux_usage(&device->info, image, iplane, VK_IMAGE_LAYOUT_GENERAL); enum isl_aux_usage optimal_aux_usage = - anv_layout_to_aux_usage(&device->info, image, 1UL << iaspect_bit, + anv_layout_to_aux_usage(&device->info, image, iplane, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); anv_image_fill_surface_state(device, image, 1ULL << iaspect_bit, diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 621f65ff33f..c390aee7cb2 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -2931,7 +2931,7 @@ anv_image_copy_to_shadow(struct anv_cmd_buffer *cmd_buffer, enum isl_aux_usage anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, const struct anv_image *image, - const VkImageAspectFlagBits aspect, + const uint32_t plane, const VkImageLayout layout); enum anv_fast_clear_type diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 0446d704e6d..2b4507f5344 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -249,8 +249,7 @@ color_attachment_compute_aux_usage(struct anv_device * device, } att_state->aux_usage = - anv_layout_to_aux_usage(&device->info, iview->image, - VK_IMAGE_ASPECT_COLOR_BIT, + anv_layout_to_aux_usage(&device->info, iview->image, 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); /* If we don't have aux, then we should have returned early in the layer @@ -400,8 +399,7 @@ depth_stencil_attachment_compute_aux_usage(struct anv_device *device, return; const enum isl_aux_usage first_subpass_aux_usage = - anv_layout_to_aux_usage(&device->info, iview->image, - VK_IMAGE_ASPECT_DEPTH_BIT, + anv_layout_to_aux_usage(&device->info, iview->image, 0, pass_att->first_subpass_layout); if (first_subpass_aux_usage != ISL_AUX_USAGE_HIZ) return; @@ -457,11 +455,9 @@ transition_depth_buffer(struct anv_cmd_buffer *cmd_buffer, VkImageLayout final_layout) { const bool hiz_enabled = ISL_AUX_USAGE_HIZ == - anv_layout_to_aux_usage(&cmd_buffer->device->info, image, - VK_IMAGE_ASPECT_DEPTH_BIT, initial_layout); + anv_layout_to_aux_usage(&cmd_buffer->device->info, image, 0, initial_layout); const bool enable_hiz = ISL_AUX_USAGE_HIZ == - anv_layout_to_aux_usage(&cmd_buffer->device->info, image, - VK_IMAGE_ASPECT_DEPTH_BIT, final_layout); + anv_layout_to_aux_usage(&cmd_buffer->device->info, image, 0, final_layout); enum isl_aux_op hiz_op; if (hiz_enabled && !enable_hiz) { @@ -1063,9 +1059,9 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer, } const enum isl_aux_usage initial_aux_usage = - anv_layout_to_aux_usage(devinfo, image, aspect, initial_layout); + anv_layout_to_aux_usage(devinfo, image, plane, initial_layout); const enum isl_aux_usage final_aux_usage = - anv_layout_to_aux_usage(devinfo, image, aspect, final_layout); + anv_layout_to_aux_usage(devinfo, image, plane, final_layout); /* The current code assumes that there is no mixing of CCS_E and CCS_D. * We can handle transitions between CCS_D/E to and from NONE. What we @@ -1388,7 +1384,7 @@ genX(BeginCommandBuffer)( enum isl_aux_usage aux_usage = anv_layout_to_aux_usage(&cmd_buffer->device->info, iview->image, - VK_IMAGE_ASPECT_DEPTH_BIT, layout); + 0, layout); cmd_buffer->state.hiz_enabled = aux_usage == ISL_AUX_USAGE_HIZ; } @@ -3628,8 +3624,7 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer, transition_depth_buffer(cmd_buffer, image, att_state->current_layout, target_layout); att_state->aux_usage = - anv_layout_to_aux_usage(&cmd_buffer->device->info, image, - VK_IMAGE_ASPECT_DEPTH_BIT, target_layout); + anv_layout_to_aux_usage(&cmd_buffer->device->info, image, 0, target_layout); } att_state->current_layout = target_layout; -- 2.19.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev