diff --git a/src/freedreno/vulkan/tu_clear_blit.c b/src/freedreno/vulkan/tu_clear_blit.c index 9dba871a703..db6ecd2cc72 100644 --- a/src/freedreno/vulkan/tu_clear_blit.c +++ b/src/freedreno/vulkan/tu_clear_blit.c @@ -144,17 +144,17 @@ r2d_clear_value(struct tu_cs *cs, VkFormat format, const VkClearValue *val) static void r2d_src(struct tu_cmd_buffer *cmd, struct tu_cs *cs, - const struct tu_image_view *iview, + const struct fdl6_view *iview, uint32_t layer, VkFilter filter) { - uint32_t src_info = iview->view.SP_PS_2D_SRC_INFO; + uint32_t src_info = iview->SP_PS_2D_SRC_INFO; if (filter != VK_FILTER_NEAREST) src_info |= A6XX_SP_PS_2D_SRC_INFO_FILTER; tu_cs_emit_pkt4(cs, REG_A6XX_SP_PS_2D_SRC_INFO, 5); tu_cs_emit(cs, src_info); - tu_cs_emit(cs, iview->view.SP_PS_2D_SRC_SIZE); + tu_cs_emit(cs, iview->SP_PS_2D_SRC_SIZE); tu_cs_image_ref_2d(cs, iview, layer, true); tu_cs_emit_pkt4(cs, REG_A6XX_SP_PS_2D_SRC_FLAGS, 3); @@ -198,10 +198,10 @@ r2d_src_buffer(struct tu_cmd_buffer *cmd, } static void -r2d_dst(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer) +r2d_dst(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer) { tu_cs_emit_pkt4(cs, REG_A6XX_RB_2D_DST_INFO, 4); - tu_cs_emit(cs, iview->view.RB_2D_DST_INFO); + tu_cs_emit(cs, iview->RB_2D_DST_INFO); tu_cs_image_ref_2d(cs, iview, layer, false); tu_cs_emit_pkt4(cs, REG_A6XX_RB_2D_DST_FLAGS, 3); @@ -854,13 +854,13 @@ r3d_src_common(struct tu_cmd_buffer *cmd, static void r3d_src(struct tu_cmd_buffer *cmd, struct tu_cs *cs, - const struct tu_image_view *iview, + const struct fdl6_view *iview, uint32_t layer, VkFilter filter) { - r3d_src_common(cmd, cs, iview->view.descriptor, - iview->view.layer_size * layer, - iview->view.ubwc_layer_size * layer, + r3d_src_common(cmd, cs, iview->descriptor, + iview->layer_size * layer, + iview->ubwc_layer_size * layer, filter); } @@ -928,17 +928,17 @@ r3d_src_gmem(struct tu_cmd_buffer *cmd, } static void -r3d_dst(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer) +r3d_dst(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer) { tu_cs_emit_pkt4(cs, REG_A6XX_RB_MRT_BUF_INFO(0), 6); - tu_cs_emit(cs, iview->view.RB_MRT_BUF_INFO); + tu_cs_emit(cs, iview->RB_MRT_BUF_INFO); tu_cs_image_ref(cs, iview, layer); tu_cs_emit(cs, 0); tu_cs_emit_pkt4(cs, REG_A6XX_RB_MRT_FLAG_BUFFER(0), 3); tu_cs_image_flag_ref(cs, iview, layer); - tu_cs_emit_regs(cs, A6XX_RB_RENDER_CNTL(.flag_mrts = iview->view.ubwc_enabled)); + tu_cs_emit_regs(cs, A6XX_RB_RENDER_CNTL(.flag_mrts = iview->ubwc_enabled)); } static void @@ -1088,14 +1088,14 @@ struct blit_ops { void (*src)( struct tu_cmd_buffer *cmd, struct tu_cs *cs, - const struct tu_image_view *iview, + const struct fdl6_view *iview, uint32_t layer, VkFilter filter); void (*src_buffer)(struct tu_cmd_buffer *cmd, struct tu_cs *cs, VkFormat vk_format, uint64_t va, uint32_t pitch, uint32_t width, uint32_t height); - void (*dst)(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer); + void (*dst)(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer); void (*dst_buffer)(struct tu_cs *cs, VkFormat vk_format, uint64_t va, uint32_t pitch); void (*setup)(struct tu_cmd_buffer *cmd, struct tu_cs *cs, @@ -1246,7 +1246,7 @@ tu6_clear_lrz(struct tu_cmd_buffer *cmd, } static void -tu_image_view_copy_blit(struct tu_image_view *iview, +tu_image_view_copy_blit(struct fdl6_view *iview, struct tu_image *image, VkFormat format, const VkImageSubresourceLayers *subres, @@ -1262,7 +1262,8 @@ tu_image_view_copy_blit(struct tu_image_view *iview, aspect_mask = VK_IMAGE_ASPECT_COLOR_BIT; } - tu_image_view_init(iview, &(VkImageViewCreateInfo) { + struct tu_image_view iview2; + tu_image_view_init(&iview2, &(VkImageViewCreateInfo) { .image = tu_image_to_handle(image), .viewType = z_scale ? VK_IMAGE_VIEW_TYPE_3D : VK_IMAGE_VIEW_TYPE_2D, .format = format, @@ -1276,10 +1277,34 @@ tu_image_view_copy_blit(struct tu_image_view *iview, .layerCount = 1, }, }, false); + + const struct fdl_layout *layout = + &image->layout[tu6_plane_index(image->vk_format, aspect_mask)]; + + if (aspect_mask != VK_IMAGE_ASPECT_COLOR_BIT) + format = tu6_plane_format(format, tu6_plane_index(format, aspect_mask)); + + fdl6_view_init(iview, &layout, &(struct fdl_view_args) { + .iova = image->bo->iova + image->bo_offset, + .base_array_layer = subres->baseArrayLayer + layer, + .layer_count = 1, + .base_miplevel = subres->mipLevel, + .level_count = 1, + .format = tu_format_for_aspect(tu_vk_format_to_pipe_format(format), + aspect_mask), + .swiz = { + /* image_to_buffer from d24s8 with stencil aspect mask writes out to r8 */ + stencil_read ? PIPE_SWIZZLE_W : PIPE_SWIZZLE_X, + PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W + }, + .type = z_scale ? FDL_VIEW_TYPE_3D : FDL_VIEW_TYPE_2D, + }, false); + + assert(memcmp(iview, &iview2.view, sizeof(iview2.view)) == 0); } static void -tu_image_view_copy(struct tu_image_view *iview, +tu_image_view_copy(struct fdl6_view *iview, struct tu_image *image, VkFormat format, const VkImageSubresourceLayers *subres, @@ -1291,7 +1316,7 @@ tu_image_view_copy(struct tu_image_view *iview, } static void -tu_image_view_blit(struct tu_image_view *iview, +tu_image_view_blit(struct fdl6_view *iview, struct tu_image *image, const VkImageSubresourceLayers *subres, uint32_t layer) @@ -1399,7 +1424,7 @@ tu6_blit_image(struct tu_cmd_buffer *cmd, A6XX_GRAS_2D_SRC_BR_Y(MAX2(info->srcOffsets[0].y, info->srcOffsets[1].y) - 1)); } - struct tu_image_view dst, src; + struct fdl6_view dst, src; tu_image_view_blit(&dst, dst_image, &info->dstSubresource, MIN2(info->dstOffsets[0].z, info->dstOffsets[1].z)); @@ -1527,7 +1552,7 @@ tu_copy_buffer_to_image(struct tu_cmd_buffer *cmd, info->imageSubresource.aspectMask, 0, false, dst_image->layout[0].ubwc, dst_image->layout[0].nr_samples); - struct tu_image_view dst; + struct fdl6_view dst; tu_image_view_copy(&dst, dst_image, dst_image->vk_format, &info->imageSubresource, offset.z, false); for (uint32_t i = 0; i < layers; i++) { @@ -1601,7 +1626,7 @@ tu_copy_image_to_buffer(struct tu_cmd_buffer *cmd, ops->setup(cmd, cs, dst_format, VK_IMAGE_ASPECT_COLOR_BIT, 0, false, false, VK_SAMPLE_COUNT_1_BIT); - struct tu_image_view src; + struct fdl6_view src; tu_image_view_copy(&src, src_image, src_image->vk_format, &info->imageSubresource, offset.z, stencil_read); for (uint32_t i = 0; i < layers; i++) { @@ -1748,7 +1773,7 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, use_staging_blit = true; } - struct tu_image_view dst, src; + struct fdl6_view dst, src; if (use_staging_blit) { tu_image_view_copy(&dst, dst_image, dst_format, &info->dstSubresource, dst_offset.z, false); @@ -1793,7 +1818,7 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, return; } - struct tu_image_view staging; + struct fdl6_view staging; tu_image_view_copy(&staging, &staging_image, src_format, &staging_subresource, 0, false); @@ -2011,7 +2036,7 @@ tu_CmdResolveImage(VkCommandBuffer commandBuffer, coords(ops, cs, &info->dstOffset, &info->srcOffset, &info->extent); - struct tu_image_view dst, src; + struct fdl6_view dst, src; tu_image_view_blit(&dst, dst_image, &info->dstSubresource, info->dstOffset.z); tu_image_view_blit(&src, src_image, &info->srcSubresource, info->srcOffset.z); @@ -2055,8 +2080,8 @@ resolve_sysmem(struct tu_cmd_buffer *cmd, r2d_src_stencil(cmd, cs, src, i, VK_FILTER_NEAREST); r2d_dst_stencil(cs, dst, i); } else { - ops->src(cmd, cs, src, i, VK_FILTER_NEAREST); - ops->dst(cs, dst, i); + ops->src(cmd, cs, &src->view, i, VK_FILTER_NEAREST); + ops->dst(cs, &dst->view, i); } ops->run(cmd, cs); } @@ -2125,7 +2150,7 @@ clear_image(struct tu_cmd_buffer *cmd, u_minify(image->layout[0].height0, range->baseMipLevel + j) }); - struct tu_image_view dst; + struct fdl6_view dst; tu_image_view_copy_blit(&dst, image, format, &(VkImageSubresourceLayers) { .aspectMask = aspect_mask, .mipLevel = range->baseMipLevel + j, @@ -2581,7 +2606,7 @@ clear_sysmem_attachment(struct tu_cmd_buffer *cmd, else r2d_dst_stencil(cs, iview, i); } else { - ops->dst(cs, iview, i); + ops->dst(cs, &iview->view, i); } ops->run(cmd, cs); } @@ -2685,10 +2710,10 @@ tu_emit_blit(struct tu_cmd_buffer *cmd, A6XX_RB_BLIT_BASE_GMEM(attachment->gmem_offset_stencil)); } else { tu_cs_emit(cs, iview->view.RB_BLIT_DST_INFO); - tu_cs_image_ref_2d(cs, iview, 0, false); + tu_cs_image_ref_2d(cs, &iview->view, 0, false); tu_cs_emit_pkt4(cs, REG_A6XX_RB_BLIT_FLAG_DST, 3); - tu_cs_image_flag_ref(cs, iview, 0); + tu_cs_image_flag_ref(cs, &iview->view, 0); tu_cs_emit_regs(cs, A6XX_RB_BLIT_BASE_GMEM(attachment->gmem_offset)); @@ -2768,7 +2793,7 @@ store_cp_blit(struct tu_cmd_buffer *cmd, if (separate_stencil) r2d_dst_stencil(cs, iview, 0); else - r2d_dst(cs, iview, 0); + r2d_dst(cs, &iview->view, 0); tu_cs_emit_regs(cs, A6XX_SP_PS_2D_SRC_INFO( @@ -2820,7 +2845,7 @@ store_3d_blit(struct tu_cmd_buffer *cmd, if (separate_stencil) r3d_dst_stencil(cs, iview, 0); else - r3d_dst(cs, iview, 0); + r3d_dst(cs, &iview->view, 0); r3d_src_gmem(cmd, cs, iview, format, gmem_offset, cpp); diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index d12e7dfc603..2084ccd7b8c 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -216,14 +216,14 @@ tu6_emit_zs(struct tu_cmd_buffer *cmd, tu_cs_emit_pkt4(cs, REG_A6XX_RB_DEPTH_BUFFER_INFO, 6); tu_cs_emit(cs, A6XX_RB_DEPTH_BUFFER_INFO(.depth_format = fmt).value); - tu_cs_image_ref(cs, iview, 0); + tu_cs_image_ref(cs, &iview->view, 0); tu_cs_emit(cs, attachment->gmem_offset); tu_cs_emit_regs(cs, A6XX_GRAS_SU_DEPTH_BUFFER_INFO(.depth_format = fmt)); tu_cs_emit_pkt4(cs, REG_A6XX_RB_DEPTH_FLAG_BUFFER_BASE, 3); - tu_cs_image_flag_ref(cs, iview, 0); + tu_cs_image_flag_ref(cs, &iview->view, 0); tu_cs_emit_regs(cs, A6XX_GRAS_LRZ_BUFFER_BASE(.bo = iview->image->bo, .bo_offset = iview->image->bo_offset + iview->image->lrz_offset), @@ -239,7 +239,7 @@ tu6_emit_zs(struct tu_cmd_buffer *cmd, tu_cs_image_stencil_ref(cs, iview, 0); tu_cs_emit(cs, attachment->gmem_offset_stencil); } else { - tu_cs_image_ref(cs, iview, 0); + tu_cs_image_ref(cs, &iview->view, 0); tu_cs_emit(cs, attachment->gmem_offset); } } else { @@ -264,14 +264,14 @@ tu6_emit_mrt(struct tu_cmd_buffer *cmd, tu_cs_emit_pkt4(cs, REG_A6XX_RB_MRT_BUF_INFO(i), 6); tu_cs_emit(cs, iview->view.RB_MRT_BUF_INFO); - tu_cs_image_ref(cs, iview, 0); + tu_cs_image_ref(cs, &iview->view, 0); tu_cs_emit(cs, cmd->state.pass->attachments[a].gmem_offset); tu_cs_emit_regs(cs, A6XX_SP_FS_MRT_REG(i, .dword = iview->view.SP_FS_MRT_REG)); tu_cs_emit_pkt4(cs, REG_A6XX_RB_MRT_FLAG_BUFFER_ADDR(i), 3); - tu_cs_image_flag_ref(cs, iview, 0); + tu_cs_image_flag_ref(cs, &iview->view, 0); } tu_cs_emit_regs(cs, diff --git a/src/freedreno/vulkan/tu_image.c b/src/freedreno/vulkan/tu_image.c index 66c17585228..ccb7a4f825f 100644 --- a/src/freedreno/vulkan/tu_image.c +++ b/src/freedreno/vulkan/tu_image.c @@ -51,7 +51,7 @@ tu6_plane_count(VkFormat format) } } -static VkFormat +VkFormat tu6_plane_format(VkFormat format, uint32_t plane) { switch (format) { @@ -67,7 +67,7 @@ tu6_plane_format(VkFormat format, uint32_t plane) } } -static uint32_t +uint32_t tu6_plane_index(VkFormat format, VkImageAspectFlags aspect_mask) { switch (aspect_mask) { @@ -82,7 +82,7 @@ tu6_plane_index(VkFormat format, VkImageAspectFlags aspect_mask) } } -static enum pipe_format +enum pipe_format tu_format_for_aspect(enum pipe_format format, VkImageAspectFlags aspect_mask) { switch (format) { @@ -192,11 +192,11 @@ tu6_texswiz(const VkComponentMapping *comps, } void -tu_cs_image_ref(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer) +tu_cs_image_ref(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer) { - tu_cs_emit(cs, iview->view.PITCH); - tu_cs_emit(cs, iview->view.layer_size >> 6); - tu_cs_emit_qw(cs, iview->view.base_addr + iview->view.layer_size * layer); + tu_cs_emit(cs, iview->PITCH); + tu_cs_emit(cs, iview->layer_size >> 6); + tu_cs_emit_qw(cs, iview->base_addr + iview->layer_size * layer); } void @@ -208,18 +208,18 @@ tu_cs_image_stencil_ref(struct tu_cs *cs, const struct tu_image_view *iview, uin } void -tu_cs_image_ref_2d(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer, bool src) +tu_cs_image_ref_2d(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer, bool src) { - tu_cs_emit_qw(cs, iview->view.base_addr + iview->view.layer_size * layer); + tu_cs_emit_qw(cs, iview->base_addr + iview->layer_size * layer); /* SP_PS_2D_SRC_PITCH has shifted pitch field */ - tu_cs_emit(cs, iview->view.PITCH << (src ? 9 : 0)); + tu_cs_emit(cs, iview->PITCH << (src ? 9 : 0)); } void -tu_cs_image_flag_ref(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer) +tu_cs_image_flag_ref(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer) { - tu_cs_emit_qw(cs, iview->view.ubwc_addr + iview->view.ubwc_layer_size * layer); - tu_cs_emit(cs, iview->view.FLAG_BUFFER_PITCH); + tu_cs_emit_qw(cs, iview->ubwc_addr + iview->ubwc_layer_size * layer); + tu_cs_emit(cs, iview->FLAG_BUFFER_PITCH); } void diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h index e251dccde62..f8ea52e03ee 100644 --- a/src/freedreno/vulkan/tu_private.h +++ b/src/freedreno/vulkan/tu_private.h @@ -1439,6 +1439,13 @@ tu_get_levelCount(const struct tu_image *image, : range->levelCount; } +VkFormat tu6_plane_format(VkFormat format, uint32_t plane); + +uint32_t tu6_plane_index(VkFormat format, VkImageAspectFlags aspect_mask); + +enum pipe_format tu_format_for_aspect(enum pipe_format format, + VkImageAspectFlags aspect_mask); + struct tu_image_view { struct vk_object_base base; @@ -1472,13 +1479,13 @@ struct tu_sampler { }; void -tu_cs_image_ref(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer); +tu_cs_image_ref(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer); void -tu_cs_image_ref_2d(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer, bool src); +tu_cs_image_ref_2d(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer, bool src); void -tu_cs_image_flag_ref(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer); +tu_cs_image_flag_ref(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer); void tu_cs_image_stencil_ref(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer);