Mesa (main): radv: allow arbitrary swizzle modes for displayable DCC
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Aug 20 15:03:15 UTC 2021
Module: Mesa
Branch: main
Commit: 94d261029ee3cae8e499ab1c786c4fda7cfcbc65
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=94d261029ee3cae8e499ab1c786c4fda7cfcbc65
Author: Marek Olšák <marek.olsak at amd.com>
Date: Tue Aug 17 12:57:03 2021 -0400
radv: allow arbitrary swizzle modes for displayable DCC
by adding retile pipeline variants
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12430>
---
src/amd/vulkan/radv_meta_dcc_retile.c | 17 ++++++++++-------
src/amd/vulkan/radv_private.h | 2 +-
2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/src/amd/vulkan/radv_meta_dcc_retile.c b/src/amd/vulkan/radv_meta_dcc_retile.c
index 9fbd958114d..75d80e02ba8 100644
--- a/src/amd/vulkan/radv_meta_dcc_retile.c
+++ b/src/amd/vulkan/radv_meta_dcc_retile.c
@@ -115,7 +115,10 @@ radv_device_finish_meta_dcc_retile_state(struct radv_device *device)
{
struct radv_meta_state *state = &device->meta_state;
- radv_DestroyPipeline(radv_device_to_handle(device), state->dcc_retile.pipeline, &state->alloc);
+ for (unsigned i = 0; i < ARRAY_SIZE(state->dcc_retile.pipeline); i++) {
+ radv_DestroyPipeline(radv_device_to_handle(device), state->dcc_retile.pipeline[i],
+ &state->alloc);
+ }
radv_DestroyPipelineLayout(radv_device_to_handle(device), state->dcc_retile.p_layout,
&state->alloc);
radv_DestroyDescriptorSetLayout(radv_device_to_handle(device), state->dcc_retile.ds_layout,
@@ -131,9 +134,7 @@ radv_device_finish_meta_dcc_retile_state(struct radv_device *device)
* - DCC equations
* - DCC block size
*
- * BPE is always 4 at the moment and the rest is derived from the tilemode,
- * and ac_surface limits displayable DCC to at most 1 tiling mode. So in effect
- * this shader is indepedent of the surface.
+ * BPE is always 4 at the moment and the rest is derived from the tilemode.
*/
static VkResult
radv_device_init_meta_dcc_retile_state(struct radv_device *device, struct radeon_surf *surf)
@@ -197,7 +198,7 @@ radv_device_init_meta_dcc_retile_state(struct radv_device *device, struct radeon
result = radv_CreateComputePipelines(
radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache), 1,
- &vk_pipeline_info, NULL, &device->meta_state.dcc_retile.pipeline);
+ &vk_pipeline_info, NULL, &device->meta_state.dcc_retile.pipeline[surf->u.gfx9.swizzle_mode]);
if (result != VK_SUCCESS)
goto cleanup;
@@ -222,8 +223,10 @@ radv_retile_dcc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *image)
state->flush_bits |= radv_dst_access_flush(cmd_buffer, VK_ACCESS_SHADER_READ_BIT, image) |
radv_dst_access_flush(cmd_buffer, VK_ACCESS_SHADER_WRITE_BIT, image);
+ unsigned swizzle_mode = image->planes[0].surface.u.gfx9.swizzle_mode;
+
/* Compile pipelines if not already done so. */
- if (!cmd_buffer->device->meta_state.dcc_retile.pipeline) {
+ if (!cmd_buffer->device->meta_state.dcc_retile.pipeline[swizzle_mode]) {
VkResult ret =
radv_device_init_meta_dcc_retile_state(cmd_buffer->device, &image->planes[0].surface);
if (ret != VK_SUCCESS) {
@@ -237,7 +240,7 @@ radv_retile_dcc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *image)
RADV_META_SAVE_DESCRIPTORS | RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS);
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE,
- device->meta_state.dcc_retile.pipeline);
+ device->meta_state.dcc_retile.pipeline[swizzle_mode]);
struct radv_buffer buffer = {.size = image->size, .bo = image->bo, .offset = image->offset};
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 970b9907ddb..a385341a4b3 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -669,7 +669,7 @@ struct radv_meta_state {
struct {
VkDescriptorSetLayout ds_layout;
VkPipelineLayout p_layout;
- VkPipeline pipeline;
+ VkPipeline pipeline[32];
} dcc_retile;
struct {
More information about the mesa-commit
mailing list