From db94ee1e648ec6c02c9e190dbddfb873f8c9f14e Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 13 Aug 2024 10:04:27 +0200 Subject: [PATCH] radv/meta: create blit2d layouts on-demand Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/meta/radv_meta_blit2d.c | 93 +++++++++++++++----------- 1 file changed, 55 insertions(+), 38 deletions(-) diff --git a/src/amd/vulkan/meta/radv_meta_blit2d.c b/src/amd/vulkan/meta/radv_meta_blit2d.c index cd2db7a23b2..d24edb2a4a7 100644 --- a/src/amd/vulkan/meta/radv_meta_blit2d.c +++ b/src/amd/vulkan/meta/radv_meta_blit2d.c @@ -165,9 +165,6 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer, struct radv_meta else if (src_img) src_aspect_mask = src_img->aspect_mask; - struct blit2d_src_temps src_temps; - blit2d_bind_src(cmd_buffer, src_img, src_buf, &src_temps, src_type, depth_format, src_aspect_mask, log2_samples); - struct radv_image_view dst_iview; create_iview(cmd_buffer, dst, &dst_iview, depth_format, aspect_mask); @@ -238,6 +235,9 @@ radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer, struct radv_meta } else unreachable("Processing blit2d with multiple aspects."); + struct blit2d_src_temps src_temps; + blit2d_bind_src(cmd_buffer, src_img, src_buf, &src_temps, src_type, depth_format, src_aspect_mask, log2_samples); + radv_CmdBeginRendering(radv_cmd_buffer_to_handle(cmd_buffer), &rendering_info); radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0); @@ -470,6 +470,43 @@ radv_device_finish_meta_blit2d_state(struct radv_device *device) } } +static VkResult +meta_blit2d_create_pipe_layout(struct radv_device *device, int idx, uint32_t log2_samples) +{ + VkResult result = VK_SUCCESS; + + if (!device->meta_state.blit2d[log2_samples].ds_layouts[idx]) { + VkDescriptorType desc_type = + (idx == BLIT2D_SRC_TYPE_BUFFER) ? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; + + const VkDescriptorSetLayoutBinding binding = { + .binding = 0, + .descriptorType = desc_type, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT, + }; + + result = radv_meta_create_descriptor_set_layout(device, 1, &binding, + &device->meta_state.blit2d[log2_samples].ds_layouts[idx]); + if (result != VK_SUCCESS) + return result; + } + + if (!device->meta_state.blit2d[log2_samples].p_layouts[idx]) { + const VkPushConstantRange push_constant_ranges[] = { + {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, + {VK_SHADER_STAGE_FRAGMENT_BIT, 16, 4}, + }; + int num_push_constant_range = (idx != BLIT2D_SRC_TYPE_IMAGE || log2_samples > 0) ? 2 : 1; + + result = radv_meta_create_pipeline_layout(device, &device->meta_state.blit2d[log2_samples].ds_layouts[idx], + num_push_constant_range, push_constant_ranges, + &device->meta_state.blit2d[log2_samples].p_layouts[idx]); + } + + return result; +} + static VkResult create_color_pipeline(struct radv_device *device, enum blit2d_src_type src_type, VkFormat format, uint32_t log2_samples, VkPipeline *pipeline) @@ -477,6 +514,10 @@ create_color_pipeline(struct radv_device *device, enum blit2d_src_type src_type, VkResult result; const char *name; + result = meta_blit2d_create_pipe_layout(device, src_type, log2_samples); + if (result != VK_SUCCESS) + return result; + texel_fetch_build_func src_func; switch (src_type) { case BLIT2D_SRC_TYPE_IMAGE: @@ -625,6 +666,10 @@ create_depth_only_pipeline(struct radv_device *device, enum blit2d_src_type src_ VkResult result; const char *name; + result = meta_blit2d_create_pipe_layout(device, src_type, log2_samples); + if (result != VK_SUCCESS) + return result; + texel_fetch_build_func src_func; switch (src_type) { case BLIT2D_SRC_TYPE_IMAGE: @@ -797,6 +842,10 @@ create_stencil_only_pipeline(struct radv_device *device, enum blit2d_src_type sr VkResult result; const char *name; + result = meta_blit2d_create_pipe_layout(device, src_type, log2_samples); + if (result != VK_SUCCESS) + return result; + texel_fetch_build_func src_func; switch (src_type) { case BLIT2D_SRC_TYPE_IMAGE: @@ -958,39 +1007,14 @@ fail: return result; } -static VkResult -meta_blit2d_create_pipe_layout(struct radv_device *device, int idx, uint32_t log2_samples) -{ - VkResult result; - VkDescriptorType desc_type = - (idx == BLIT2D_SRC_TYPE_BUFFER) ? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; - const VkPushConstantRange push_constant_ranges[] = { - {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, - {VK_SHADER_STAGE_FRAGMENT_BIT, 16, 4}, - }; - int num_push_constant_range = (idx != BLIT2D_SRC_TYPE_IMAGE || log2_samples > 0) ? 2 : 1; - - const VkDescriptorSetLayoutBinding binding = { - .binding = 0, - .descriptorType = desc_type, - .descriptorCount = 1, - .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT, - }; - - result = radv_meta_create_descriptor_set_layout(device, 1, &binding, &device->meta_state.blit2d[log2_samples].ds_layouts[idx]); - if (result != VK_SUCCESS) - return result; - - return radv_meta_create_pipeline_layout(device, &device->meta_state.blit2d[log2_samples].ds_layouts[idx], - num_push_constant_range, push_constant_ranges, - &device->meta_state.blit2d[log2_samples].p_layouts[idx]); -} - VkResult radv_device_init_meta_blit2d_state(struct radv_device *device, bool on_demand) { VkResult result; + if (on_demand) + return VK_SUCCESS; + for (unsigned log2_samples = 0; log2_samples < MAX_SAMPLES_LOG2; log2_samples++) { for (unsigned src = 0; src < BLIT2D_NUM_SRC_TYPES; src++) { /* Don't need to handle copies between buffers and multisample images. */ @@ -1001,13 +1025,6 @@ radv_device_init_meta_blit2d_state(struct radv_device *device, bool on_demand) if (src == BLIT2D_SRC_TYPE_IMAGE_3D && log2_samples > 0) continue; - result = meta_blit2d_create_pipe_layout(device, src, log2_samples); - if (result != VK_SUCCESS) - return result; - - if (on_demand) - continue; - for (unsigned j = 0; j < NUM_META_FS_KEYS; ++j) { VkFormat format = radv_fs_key_format_exemplars[j]; unsigned fs_key = radv_format_meta_fs_key(device, format);