From 586d6cb588399817177d5ced6325dd649d45466c Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 13 Aug 2024 10:38:10 +0200 Subject: [PATCH] radv/meta: create cleari layouts on-demand Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/meta/radv_meta_bufimage.c | 120 ++++++++++++++--------- 1 file changed, 74 insertions(+), 46 deletions(-) diff --git a/src/amd/vulkan/meta/radv_meta_bufimage.c b/src/amd/vulkan/meta/radv_meta_bufimage.c index b2507431a3c..09275e0d91d 100644 --- a/src/amd/vulkan/meta/radv_meta_bufimage.c +++ b/src/amd/vulkan/meta/radv_meta_bufimage.c @@ -842,12 +842,48 @@ build_nir_cleari_compute_shader(struct radv_device *dev, bool is_3d, int samples return b.shader; } +static VkResult +create_cleari_layout(struct radv_device *device) +{ + VkResult result = VK_SUCCESS; + + if (!device->meta_state.cleari.img_ds_layout) { + const VkDescriptorSetLayoutBinding binding = { + .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, + }; + + result = radv_meta_create_descriptor_set_layout(device, 1, &binding, &device->meta_state.cleari.img_ds_layout); + if (result != VK_SUCCESS) + return result; + } + + if (!device->meta_state.cleari.img_p_layout) { + const VkPushConstantRange pc_range = { + .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, + .size = 20, + }; + + result = radv_meta_create_pipeline_layout(device, &device->meta_state.cleari.img_ds_layout, 1, &pc_range, + &device->meta_state.cleari.img_p_layout); + } + + return result; +} + static VkResult create_cleari_pipeline(struct radv_device *device, bool is_3d, int samples, VkPipeline *pipeline) { - nir_shader *cs = build_nir_cleari_compute_shader(device, is_3d, samples); VkResult result; + result = create_cleari_layout(device); + if (result != VK_SUCCESS) + return result; + + nir_shader *cs = build_nir_cleari_compute_shader(device, is_3d, samples); + result = radv_meta_create_compute_pipeline(device, cs, device->meta_state.cleari.img_p_layout, pipeline); ralloc_free(cs); return result; @@ -889,27 +925,6 @@ radv_device_init_meta_cleari_state(struct radv_device *device, bool on_demand) { VkResult result; - const VkDescriptorSetLayoutBinding binding = { - .binding = 0, - .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, - .descriptorCount = 1, - .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, - }; - - result = radv_meta_create_descriptor_set_layout(device, 1, &binding, &device->meta_state.cleari.img_ds_layout); - if (result != VK_SUCCESS) - return result; - - const VkPushConstantRange pc_range = { - .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, - .size = 20, - }; - - result = radv_meta_create_pipeline_layout(device, &device->meta_state.cleari.img_ds_layout, 1, &pc_range, - &device->meta_state.cleari.img_p_layout); - if (result != VK_SUCCESS) - return result; - if (on_demand) return VK_SUCCESS; @@ -974,10 +989,47 @@ build_nir_cleari_r32g32b32_compute_shader(struct radv_device *dev) return b.shader; } +static VkResult +create_cleari_r32g32b32_layout(struct radv_device *device) +{ + VkResult result = VK_SUCCESS; + + if (!device->meta_state.cleari_r32g32b32.img_ds_layout) { + const VkDescriptorSetLayoutBinding binding = { + .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, + }; + + result = radv_meta_create_descriptor_set_layout(device, 1, &binding, + &device->meta_state.cleari_r32g32b32.img_ds_layout); + if (result != VK_SUCCESS) + return result; + } + + if (!device->meta_state.cleari_r32g32b32.img_p_layout) { + const VkPushConstantRange pc_range = { + .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, + .size = 16, + }; + + result = radv_meta_create_pipeline_layout(device, &device->meta_state.cleari_r32g32b32.img_ds_layout, 1, + &pc_range, &device->meta_state.cleari_r32g32b32.img_p_layout); + } + + return result; +} + static VkResult create_cleari_r32g32b32_pipeline(struct radv_device *device, VkPipeline *pipeline) { VkResult result; + + result = create_cleari_r32g32b32_layout(device); + if (result != VK_SUCCESS) + return result; + nir_shader *cs = build_nir_cleari_r32g32b32_compute_shader(device); result = radv_meta_create_compute_pipeline(device, cs, device->meta_state.cleari_r32g32b32.img_p_layout, pipeline); @@ -1010,30 +1062,6 @@ fail: static VkResult radv_device_init_meta_cleari_r32g32b32_state(struct radv_device *device, bool on_demand) { - VkResult result; - - const VkDescriptorSetLayoutBinding binding = { - .binding = 0, - .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, - .descriptorCount = 1, - .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, - }; - - result = - radv_meta_create_descriptor_set_layout(device, 1, &binding, &device->meta_state.cleari_r32g32b32.img_ds_layout); - if (result != VK_SUCCESS) - return result; - - const VkPushConstantRange pc_range = { - .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, - .size = 16, - }; - - result = radv_meta_create_pipeline_layout(device, &device->meta_state.cleari_r32g32b32.img_ds_layout, 1, &pc_range, - &device->meta_state.cleari_r32g32b32.img_p_layout); - if (result != VK_SUCCESS) - return result; - if (on_demand) return VK_SUCCESS;