diff options
author | Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> | 2021-03-09 03:41:36 +0100 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-04-08 22:29:12 +0000 |
commit | 6ff88a823bb4f6adedc4bace66add9ed1e5fe3a4 (patch) | |
tree | 9d3aca358bc19edadac250bfa0935abde9252123 | |
parent | dece117fdc2d1a1aaa95a9b445dcc214bc017c45 (diff) |
radv: Add retiling for foreign queues.
This way modifier images that don't go through the present layout
get the retile executed properly.
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9998>
-rw-r--r-- | src/amd/vulkan/radv_cmd_buffer.c | 22 | ||||
-rw-r--r-- | src/amd/vulkan/radv_image.c | 3 | ||||
-rw-r--r-- | src/amd/vulkan/radv_private.h | 3 |
3 files changed, 20 insertions, 8 deletions
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 1f98414bae1..f1751cbfc17 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -6390,6 +6390,17 @@ static void radv_init_color_image_metadata(struct radv_cmd_buffer *cmd_buffer, cmd_buffer->state.flush_bits |= flush_bits; } +static void radv_retile_transition(struct radv_cmd_buffer *cmd_buffer, + struct radv_image *image, + VkImageLayout src_layout, + VkImageLayout dst_layout, + unsigned dst_queue_mask) +{ + if (src_layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR && + (dst_layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR || + (dst_queue_mask & (1u << RADV_QUEUE_FOREIGN)))) + radv_retile_dcc(cmd_buffer, image); +} /** * Handle color image transitions for DCC/FMASK/CMASK. */ @@ -6417,9 +6428,8 @@ static void radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffe src_queue_mask, dst_queue_mask, range); - if (dst_layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR && - image->retile_map) - radv_retile_dcc(cmd_buffer, image); + if (image->retile_map) + radv_retile_transition(cmd_buffer, image, src_layout, dst_layout, dst_queue_mask); return; } @@ -6439,10 +6449,8 @@ static void radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffe fast_clear_flushed = true; } - if (src_layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR && - dst_layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR && - image->retile_map) - radv_retile_dcc(cmd_buffer, image); + if (image->retile_map) + radv_retile_transition(cmd_buffer, image, src_layout, dst_layout, dst_queue_mask); } else if (radv_image_has_cmask(image) || radv_image_has_fmask(image)) { if (radv_layout_can_fast_clear(cmd_buffer->device, image, src_layout, src_render_loop, src_queue_mask) && diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index 917713af50d..6335e502840 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -2166,7 +2166,8 @@ unsigned radv_image_queue_family_mask(const struct radv_image *image, uint32_t f return image->queue_family_mask; if (family == VK_QUEUE_FAMILY_EXTERNAL || family == VK_QUEUE_FAMILY_FOREIGN_EXT) - return (1u << RADV_MAX_QUEUE_FAMILIES) - 1u; + return ((1u << RADV_MAX_QUEUE_FAMILIES) - 1u) | + (1u << RADV_QUEUE_FOREIGN); if (family == VK_QUEUE_FAMILY_IGNORED) return 1u << queue_family; return 1u << family; diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 6c80e66b38c..643037f9285 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -662,6 +662,9 @@ struct radv_meta_state { #define RADV_QUEUE_COMPUTE 1 #define RADV_QUEUE_TRANSFER 2 +/* Not a real queue family */ +#define RADV_QUEUE_FOREIGN 3 + #define RADV_MAX_QUEUE_FAMILIES 3 #define RADV_NUM_HW_CTX (RADEON_CTX_PRIORITY_REALTIME + 1) |