Now that we have aspects stored into anv_format_plane we can just go through the list of planes of a given format and figure which one matches the aspect we're interested in.
This will come handy as when we introduce 2 different view of the same buffer for YCbCr formats. Signed-off-by: Lionel Landwerlin <[email protected]> --- src/intel/vulkan/anv_blorp.c | 9 +++-- src/intel/vulkan/anv_device.c | 4 +-- src/intel/vulkan/anv_dump.c | 2 +- src/intel/vulkan/anv_formats.c | 18 +++++++++- src/intel/vulkan/anv_image.c | 18 +++++----- src/intel/vulkan/anv_private.h | 53 +++++++++++------------------- src/intel/vulkan/genX_cmd_buffer.c | 10 +++--- 7 files changed, 58 insertions(+), 56 deletions(-) diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index 478b8e7a3db..29bddc46bda 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -197,7 +197,7 @@ get_blorp_surf_for_anv_image(const struct anv_device *device, enum isl_aux_usage aux_usage, struct blorp_surf *blorp_surf) { - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + 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); @@ -1296,7 +1296,7 @@ static enum isl_aux_usage fast_clear_aux_usage(const struct anv_image *image, VkImageAspectFlagBits aspect) { - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); if (image->planes[plane].aux_usage == ISL_AUX_USAGE_NONE) return ISL_AUX_USAGE_CCS_D; else @@ -1554,8 +1554,7 @@ anv_image_hiz_op(struct anv_cmd_buffer *cmd_buffer, { assert(aspect == VK_IMAGE_ASPECT_DEPTH_BIT); assert(base_layer + layer_count <= anv_image_aux_layers(image, aspect, level)); - assert(anv_image_aspect_to_plane(image->aspects, - VK_IMAGE_ASPECT_DEPTH_BIT) == 0); + assert(anv_format_aspect_to_plane(image->format, VK_IMAGE_ASPECT_DEPTH_BIT) == 0); struct blorp_batch batch; blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0); @@ -1749,7 +1748,7 @@ anv_image_ccs_op(struct anv_cmd_buffer *cmd_buffer, assert(base_layer + layer_count <= anv_image_aux_layers(image, aspect, level)); - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); uint32_t width_div = image->format->planes[plane].denominator_scales[0]; uint32_t height_div = image->format->planes[plane].denominator_scales[1]; uint32_t level_width = anv_minify(image->extent.width, level) / width_div; diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index ee35e013329..8fcb44370dd 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -2682,8 +2682,8 @@ void anv_GetImageMemoryRequirements2( struct anv_physical_device *pdevice = &device->instance->physicalDevice; const VkImagePlaneMemoryRequirementsInfoKHR *plane_reqs = (const VkImagePlaneMemoryRequirementsInfoKHR *) ext; - uint32_t plane = anv_image_aspect_to_plane(image->aspects, - plane_reqs->planeAspect); + uint32_t plane = anv_format_aspect_to_plane(image->format, + plane_reqs->planeAspect); assert(image->planes[plane].offset == 0); diff --git a/src/intel/vulkan/anv_dump.c b/src/intel/vulkan/anv_dump.c index 160c18c4f17..8d91111dd87 100644 --- a/src/intel/vulkan/anv_dump.c +++ b/src/intel/vulkan/anv_dump.c @@ -439,7 +439,7 @@ anv_dump_add_framebuffer(struct anv_cmd_buffer *cmd_buffer, char *filename = ralloc_asprintf(dump_ctx, "framebuffer%04d-%d%s.ppm", dump_idx, i, suffix); - unsigned plane = anv_image_aspect_to_plane(iview->image->aspects, aspect); + unsigned plane = anv_format_aspect_to_plane(iview->image->format, aspect); dump_add_image(cmd_buffer, (struct anv_image *)iview->image, aspect, iview->planes[plane].isl.base_level, iview->planes[plane].isl.base_array_layer, diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index d3a7c2be85c..90b34093820 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -445,7 +445,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_format_aspect_to_plane(format, aspect); struct anv_format_plane plane_format = format->planes[plane]; if (plane_format.isl_format == ISL_FORMAT_UNSUPPORTED) return unsupported; @@ -490,6 +490,22 @@ anv_get_format_plane(const struct gen_device_info *devinfo, VkFormat vk_format, return plane_format; } +uint32_t +anv_format_aspect_to_plane(const struct anv_format *format, VkImageAspectFlags _aspect) +{ + VkImageAspectFlags aspects = 0; + for (uint32_t p = 0; p < format->n_planes; p++) + aspects |= format->planes[p].aspect; + + VkImageAspectFlags aspect = anv_expand_aspects(aspects, _aspect); + for (uint32_t p = 0; p < format->n_planes; p++) { + if (format->planes[p].aspect & aspect) + return p; + } + + unreachable("invalid format/aspect"); +} + // Format capabilities static VkFormatFeatureFlags diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 4fa44aa8704..b2ca1fdacbd 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -128,7 +128,7 @@ choose_isl_tiling_flags(const struct anv_image_create_info *anv_info, static struct anv_surface * get_surface(struct anv_image *image, VkImageAspectFlagBits aspect) { - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); return &image->planes[plane].surface; } @@ -315,7 +315,7 @@ make_surface(const struct anv_device *dev, image->extent = anv_sanitize_image_extent(vk_info->imageType, vk_info->extent); - const unsigned plane = anv_image_aspect_to_plane(image->aspects, aspect); + const unsigned plane = anv_format_aspect_to_plane(image->format, aspect); const struct anv_format_plane plane_format = anv_get_format_plane(&dev->info, image->vk_format, aspect, image->tiling); struct anv_surface *anv_surf = &image->planes[plane].surface; @@ -700,7 +700,7 @@ VkResult anv_BindImageMemory( uint32_t aspect_bit; anv_foreach_image_aspect_bit(aspect_bit, image, image->aspects) { uint32_t plane = - anv_image_aspect_to_plane(image->aspects, 1UL << aspect_bit); + anv_format_aspect_to_plane(image->format, 1UL << aspect_bit); anv_image_bind_memory_plane(device, image, plane, mem, memoryOffset); } @@ -738,7 +738,7 @@ VkResult anv_BindImageMemory2( uint32_t aspect_bit; anv_foreach_image_aspect_bit(aspect_bit, image, aspects) { uint32_t plane = - anv_image_aspect_to_plane(image->aspects, 1UL << aspect_bit); + anv_format_aspect_to_plane(image->format, 1UL << aspect_bit); anv_image_bind_memory_plane(device, image, plane, mem, bind_info->memoryOffset); } @@ -819,7 +819,7 @@ anv_layout_to_aux_usage(const struct gen_device_info * const devinfo, /* Determine the optimal buffer. */ - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + 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. @@ -948,7 +948,7 @@ anv_layout_to_fast_clear_type(const struct gen_device_info * const devinfo, /* The aspect must be exactly one of the image aspects. */ assert(util_bitcount(aspect) == 1 && (aspect & image->aspects)); - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); /* If there is no auxiliary surface allocated, there are no fast-clears */ if (image->planes[plane].aux_surface.isl.size_B == 0) @@ -1048,7 +1048,7 @@ anv_image_fill_surface_state(struct anv_device *device, struct anv_surface_state *state_inout, struct brw_image_param *image_param_out) { - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); const struct anv_surface *surface = &image->planes[plane].surface, *aux_surface = &image->planes[plane].aux_surface; @@ -1345,7 +1345,7 @@ anv_CreateImageView(VkDevice _device, uint32_t iaspect_bit, vplane = 0; anv_foreach_image_aspect_bit(iaspect_bit, image, expanded_aspects) { uint32_t iplane = - anv_image_aspect_to_plane(image->aspects, 1UL << iaspect_bit); + anv_format_aspect_to_plane(image->format, 1UL << iaspect_bit); VkImageAspectFlags vplane_aspect = anv_plane_to_aspect(iview->aspect_mask, vplane); struct anv_format_plane format = @@ -1632,6 +1632,6 @@ anv_image_get_surface_for_aspect_mask(const struct anv_image *image, return NULL; } - uint32_t plane = anv_image_aspect_to_plane(image->aspects, sanitized_mask); + uint32_t plane = anv_format_aspect_to_plane(image->format, sanitized_mask); return &image->planes[plane].surface; } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 8f8cbb4415e..621f65ff33f 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -2561,28 +2561,8 @@ struct anv_format { bool can_ycbcr; }; -static inline uint32_t -anv_image_aspect_to_plane(VkImageAspectFlags image_aspects, - VkImageAspectFlags aspect_mask) -{ - switch (aspect_mask) { - case VK_IMAGE_ASPECT_COLOR_BIT: - case VK_IMAGE_ASPECT_DEPTH_BIT: - case VK_IMAGE_ASPECT_PLANE_0_BIT: - return 0; - case VK_IMAGE_ASPECT_STENCIL_BIT: - if ((image_aspects & VK_IMAGE_ASPECT_DEPTH_BIT) == 0) - return 0; - /* Fall-through */ - case VK_IMAGE_ASPECT_PLANE_1_BIT: - return 1; - case VK_IMAGE_ASPECT_PLANE_2_BIT: - return 2; - default: - /* Purposefully assert with depth/stencil aspects. */ - unreachable("invalid image aspect"); - } -} +uint32_t +anv_format_aspect_to_plane(const struct anv_format *format, VkImageAspectFlags aspect); static inline VkImageAspectFlags anv_plane_to_aspect(VkImageAspectFlags image_aspects, @@ -2699,7 +2679,7 @@ struct anv_image { * Image subsurfaces * * For each foo, anv_image::planes[x].surface is valid if and only if - * anv_image::aspects has a x aspect. Refer to anv_image_aspect_to_plane() + * anv_image::aspects has a x aspect. Refer to anv_format_aspect_to_plane() * to figure the number associated with a given aspect. * * The hardware requires that the depth buffer and stencil buffer be @@ -2794,7 +2774,7 @@ static inline uint8_t anv_image_aux_levels(const struct anv_image * const image, VkImageAspectFlagBits aspect) { - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); return image->planes[plane].aux_surface.isl.size_B > 0 ? image->planes[plane].aux_surface.isl.levels : 0; } @@ -2816,7 +2796,7 @@ anv_image_aux_layers(const struct anv_image * const image, */ return 0; } else { - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); return MAX2(image->planes[plane].aux_surface.isl.logical_level0_px.array_len, image->planes[plane].aux_surface.isl.logical_level0_px.depth >> miplevel); } @@ -2829,7 +2809,7 @@ anv_image_get_clear_color_addr(const struct anv_device *device, { assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV); - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); return anv_address_add(image->planes[plane].address, image->planes[plane].fast_clear_state_offset); } @@ -2856,7 +2836,7 @@ anv_image_get_compression_state_addr(const struct anv_device *device, { assert(level < anv_image_aux_levels(image, aspect)); assert(array_layer < anv_image_aux_layers(image, aspect, level)); - UNUSED uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + UNUSED uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); assert(image->planes[plane].aux_usage == ISL_AUX_USAGE_CCS_E); struct anv_address addr = @@ -2976,17 +2956,24 @@ anv_get_levelCount(const struct anv_image *image, } static inline VkImageAspectFlags -anv_image_expand_aspects(const struct anv_image *image, - VkImageAspectFlags aspects) +anv_expand_aspects(VkImageAspectFlags image_aspects, + VkImageAspectFlags selected_aspects) { /* If the underlying image has color plane aspects and * VK_IMAGE_ASPECT_COLOR_BIT has been requested, then return the aspects of * the underlying image. */ - if ((image->aspects & VK_IMAGE_ASPECT_PLANES_BITS_ANV) != 0 && - aspects == VK_IMAGE_ASPECT_COLOR_BIT) - return image->aspects; + if ((image_aspects & VK_IMAGE_ASPECT_PLANES_BITS_ANV) != 0 && + selected_aspects == VK_IMAGE_ASPECT_COLOR_BIT) + return image_aspects; + + return selected_aspects; +} - return aspects; +static inline VkImageAspectFlags +anv_image_expand_aspects(const struct anv_image *image, + VkImageAspectFlags aspects) +{ + return anv_expand_aspects(image->aspects, aspects); } static inline bool diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index ed88157170d..0446d704e6d 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -490,7 +490,7 @@ set_image_compressed_bit(struct anv_cmd_buffer *cmd_buffer, uint32_t base_layer, uint32_t layer_count, bool compressed) { - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); /* We only have compression tracking for CCS_E */ if (image->planes[plane].aux_usage != ISL_AUX_USAGE_CCS_E) @@ -742,7 +742,7 @@ anv_cmd_predicated_ccs_resolve(struct anv_cmd_buffer *cmd_buffer, enum isl_aux_op resolve_op, enum anv_fast_clear_type fast_clear_supported) { - const uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + const uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); #if GEN_GEN >= 9 anv_cmd_compute_resolve_predicate(cmd_buffer, image, @@ -958,7 +958,7 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer, if (initial_layout == final_layout) return; - uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect); + uint32_t plane = anv_format_aspect_to_plane(image->format, aspect); if (image->planes[plane].shadow_surface.isl.size_B > 0 && final_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { @@ -3447,7 +3447,7 @@ cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer) if (image && (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT)) { uint32_t depth_plane = - anv_image_aspect_to_plane(image->aspects, VK_IMAGE_ASPECT_DEPTH_BIT); + anv_format_aspect_to_plane(image->format, VK_IMAGE_ASPECT_DEPTH_BIT); const struct anv_surface *surface = &image->planes[depth_plane].surface; info.depth_surf = &surface->isl; @@ -3480,7 +3480,7 @@ cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer) if (image && (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT)) { uint32_t stencil_plane = - anv_image_aspect_to_plane(image->aspects, VK_IMAGE_ASPECT_STENCIL_BIT); + anv_format_aspect_to_plane(image->format, VK_IMAGE_ASPECT_STENCIL_BIT); const struct anv_surface *surface = &image->planes[stencil_plane].surface; info.stencil_surf = &surface->isl; -- 2.19.1 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
