From 6a909387c2a61cd473dc139e53dbf938c3848272 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Mon, 2 Mar 2020 10:13:14 +0100 Subject: [PATCH] v3dv: take memory format from appropriate miplevel for image load/store We were storing the format of the base miplevel in the image view and we were typically using that instead of the taking the format from the appropriate image slice. This was a problem when loading or storing a miplevel other than the base which happened to have a different format. This also removed the tiling field from the image view to avoid repeating the same mistake in the future. Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 19 +++++++++---------- src/broadcom/vulkan/v3dv_image.c | 2 -- src/broadcom/vulkan/v3dv_meta_clear.c | 15 +++++++-------- src/broadcom/vulkan/v3dv_private.h | 1 - 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 59eab90..d1c4878 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -818,6 +818,7 @@ cmd_buffer_render_pass_emit_load(struct v3dv_cmd_buffer *cmd_buffer, uint32_t buffer) { const struct v3dv_image *image = iview->image; + const struct v3d_resource_slice *slice = &image->slices[iview->base_level]; uint32_t layer_offset = v3dv_layer_offset(image, iview->base_level, iview->first_layer + layer); @@ -828,9 +829,8 @@ cmd_buffer_render_pass_emit_load(struct v3dv_cmd_buffer *cmd_buffer, load.input_image_format = iview->format->rt_type; load.r_b_swap = iview->swap_rb; - load.memory_format = iview->tiling; + load.memory_format = slice->tiling; - const struct v3d_resource_slice *slice = &image->slices[iview->base_level]; if (slice->tiling == VC5_TILING_UIF_NO_XOR || slice->tiling == VC5_TILING_UIF_XOR) { load.height_in_ub_or_stride = @@ -932,6 +932,7 @@ cmd_buffer_render_pass_emit_store(struct v3dv_cmd_buffer *cmd_buffer, const struct v3dv_image_view *iview = cmd_buffer->state.framebuffer->attachments[attachment_idx]; const struct v3dv_image *image = iview->image; + const struct v3d_resource_slice *slice = &image->slices[iview->base_level]; uint32_t layer_offset = v3dv_layer_offset(image, iview->base_level, iview->first_layer + layer); @@ -943,9 +944,8 @@ cmd_buffer_render_pass_emit_store(struct v3dv_cmd_buffer *cmd_buffer, store.output_image_format = iview->format->rt_type; store.r_b_swap = iview->swap_rb; - store.memory_format = iview->tiling; + store.memory_format = slice->tiling; - const struct v3d_resource_slice *slice = &image->slices[iview->base_level]; if (slice->tiling == VC5_TILING_UIF_NO_XOR || slice->tiling == VC5_TILING_UIF_XOR) { store.height_in_ub_or_stride = @@ -1289,16 +1289,15 @@ cmd_buffer_emit_render_pass_rcl(struct v3dv_cmd_buffer *cmd_buffer) struct v3dv_image_view *iview = state->framebuffer->attachments[attachment_idx]; + const struct v3dv_image *image = iview->image; + const struct v3d_resource_slice *slice = &image->slices[iview->base_level]; + const uint32_t *clear_color = &state->attachments[attachment_idx].clear_value.color[0]; uint32_t clear_pad = 0; - if (iview->tiling == VC5_TILING_UIF_NO_XOR || - iview->tiling == VC5_TILING_UIF_XOR) { - const struct v3dv_image *image = iview->image; - const struct v3d_resource_slice *slice = - &image->slices[iview->base_level]; - + if (slice->tiling == VC5_TILING_UIF_NO_XOR || + slice->tiling == VC5_TILING_UIF_XOR) { int uif_block_height = v3d_utile_height(image->cpp) * 2; uint32_t implicit_padded_height = diff --git a/src/broadcom/vulkan/v3dv_image.c b/src/broadcom/vulkan/v3dv_image.c index 9e16792..8901245 100644 --- a/src/broadcom/vulkan/v3dv_image.c +++ b/src/broadcom/vulkan/v3dv_image.c @@ -444,8 +444,6 @@ v3dv_CreateImageView(VkDevice _device, iview->offset = v3dv_layer_offset(image, iview->base_level, iview->first_layer); - iview->tiling = image->slices[0].tiling; - iview->vk_format = pCreateInfo->format; iview->format = v3dv_get_format(pCreateInfo->format); assert(iview->format && iview->format->supported); diff --git a/src/broadcom/vulkan/v3dv_meta_clear.c b/src/broadcom/vulkan/v3dv_meta_clear.c index 9ea2f6c..7793cbe 100644 --- a/src/broadcom/vulkan/v3dv_meta_clear.c +++ b/src/broadcom/vulkan/v3dv_meta_clear.c @@ -53,6 +53,7 @@ emit_tlb_clear_store(struct v3dv_cmd_buffer *cmd_buffer, const struct v3dv_image_view *iview = cmd_buffer->state.framebuffer->attachments[attachment_idx]; const struct v3dv_image *image = iview->image; + const struct v3d_resource_slice *slice = &image->slices[iview->base_level]; uint32_t layer_offset = v3dv_layer_offset(image, iview->base_level, iview->first_layer + layer); @@ -64,9 +65,8 @@ emit_tlb_clear_store(struct v3dv_cmd_buffer *cmd_buffer, store.output_image_format = iview->format->rt_type; store.r_b_swap = iview->swap_rb; - store.memory_format = iview->tiling; + store.memory_format = slice->tiling; - const struct v3d_resource_slice *slice = &image->slices[iview->base_level]; if (slice->tiling == VC5_TILING_UIF_NO_XOR || slice->tiling == VC5_TILING_UIF_XOR) { store.height_in_ub_or_stride = @@ -295,13 +295,12 @@ emit_tlb_clear_rcl(struct v3dv_cmd_buffer *cmd_buffer, clear_color); struct v3dv_image_view *iview = framebuffer->attachments[attachment_idx]; - uint32_t clear_pad = 0; - if (iview->tiling == VC5_TILING_UIF_NO_XOR || - iview->tiling == VC5_TILING_UIF_XOR) { - const struct v3dv_image *image = iview->image; - const struct v3d_resource_slice *slice = - &image->slices[iview->base_level]; + const struct v3dv_image *image = iview->image; + const struct v3d_resource_slice *slice = &image->slices[iview->base_level]; + uint32_t clear_pad = 0; + if (slice->tiling == VC5_TILING_UIF_NO_XOR || + slice->tiling == VC5_TILING_UIF_XOR) { int uif_block_height = v3d_utile_height(image->cpp) * 2; uint32_t implicit_padded_height = diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 1c45d99..fa55127 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -333,7 +333,6 @@ struct v3dv_image_view { VkFormat vk_format; const struct v3dv_format *format; bool swap_rb; - enum v3d_tiling_mode tiling; uint32_t internal_bpp; uint32_t internal_type; -- 2.7.4