From 776a9ce36b060d516b4b7407a701ee7890f0bf2f Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 14 Oct 2019 12:33:42 -0400 Subject: [PATCH] turnip: Set up the correct tiling mode for small attachments. Noticed while debugging a tiling-looking issue by comparing our gmem blit setup to freedreno's. Reviewed-by: Kristian H. Kristensen --- src/freedreno/vulkan/tu_cmd_buffer.c | 8 +++++--- src/freedreno/vulkan/tu_image.c | 9 +++++++++ src/freedreno/vulkan/tu_private.h | 3 +++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index 34da6d0e88c..863c082912c 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -440,7 +440,8 @@ tu6_emit_mrt(struct tu_cmd_buffer *cmd, struct tu_cs *cs) const struct tu_image_view *iview = fb->attachments[a].attachment; const struct tu_image_level *slice = &iview->image->levels[iview->base_mip]; - const enum a6xx_tile_mode tile_mode = iview->image->tile_mode; + const enum a6xx_tile_mode tile_mode = + tu6_get_image_tile_mode(iview->image, iview->base_mip); uint32_t stride = 0; uint32_t offset = 0; @@ -610,13 +611,14 @@ tu6_emit_blit_info(struct tu_cmd_buffer *cmd, tu_cs_emit_pkt4(cs, REG_A6XX_RB_BLIT_INFO, 1); tu_cs_emit(cs, blit_info); - /* tile mode? */ const struct tu_native_format *format = tu6_get_native_format(iview->vk_format); assert(format && format->rb >= 0); + enum a6xx_tile_mode tile_mode = + tu6_get_image_tile_mode(iview->image, iview->base_mip); tu_cs_emit_pkt4(cs, REG_A6XX_RB_BLIT_DST_INFO, 5); - tu_cs_emit(cs, A6XX_RB_BLIT_DST_INFO_TILE_MODE(iview->image->tile_mode) | + tu_cs_emit(cs, A6XX_RB_BLIT_DST_INFO_TILE_MODE(tile_mode) | A6XX_RB_BLIT_DST_INFO_SAMPLES(samples) | A6XX_RB_BLIT_DST_INFO_COLOR_FORMAT(format->rb) | A6XX_RB_BLIT_DST_INFO_COLOR_SWAP(format->swap)); diff --git a/src/freedreno/vulkan/tu_image.c b/src/freedreno/vulkan/tu_image.c index 6ac1d48c188..50bd1dbbb19 100644 --- a/src/freedreno/vulkan/tu_image.c +++ b/src/freedreno/vulkan/tu_image.c @@ -39,6 +39,15 @@ image_level_linear(struct tu_image *image, int level) return w < 16; } +enum a6xx_tile_mode +tu6_get_image_tile_mode(struct tu_image *image, int level) +{ + if (image_level_linear(image, level)) + return TILE6_LINEAR; + else + return image->tile_mode; +} + /* indexed by cpp, including msaa 2x and 4x: */ static const struct { unsigned pitchalign; diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h index af1c779885e..405fa20b4f5 100644 --- a/src/freedreno/vulkan/tu_private.h +++ b/src/freedreno/vulkan/tu_private.h @@ -1297,6 +1297,9 @@ tu_get_levelCount(const struct tu_image *image, : range->levelCount; } +enum a6xx_tile_mode +tu6_get_image_tile_mode(struct tu_image *image, int level); + struct tu_image_view { struct tu_image *image; /**< VkImageViewCreateInfo::image */ -- 2.30.2