radv: use radv_get_shader_layout() more with ESO

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38106>
This commit is contained in:
Samuel Pitoiset
2025-10-28 10:37:22 +01:00
committed by Marge Bot
parent e5513826aa
commit f91e5c9cb7
+28 -49
View File
@@ -55,10 +55,35 @@ radv_DestroyShaderEXT(VkDevice _device, VkShaderEXT shader, const VkAllocationCa
}
static void
radv_shader_stage_init(const VkShaderCreateInfoEXT *sinfo, struct radv_shader_stage *out_stage)
radv_get_shader_layout(const VkShaderCreateInfoEXT *pCreateInfo, struct radv_shader_layout *layout)
{
uint16_t dynamic_shader_stages = 0;
layout->dynamic_offset_count = 0;
for (uint32_t i = 0; i < pCreateInfo->setLayoutCount; i++) {
VK_FROM_HANDLE(radv_descriptor_set_layout, set_layout, pCreateInfo->pSetLayouts[i]);
if (set_layout == NULL)
continue;
layout->num_sets = MAX2(i + 1, layout->num_sets);
layout->set[i].layout = set_layout;
layout->set[i].dynamic_offset_start = layout->dynamic_offset_count;
layout->dynamic_offset_count += set_layout->dynamic_offset_count;
dynamic_shader_stages |= set_layout->dynamic_shader_stages;
}
if (layout->dynamic_offset_count && (dynamic_shader_stages & pCreateInfo->stage)) {
layout->use_dynamic_descriptors = true;
}
}
static void
radv_shader_stage_init(const VkShaderCreateInfoEXT *sinfo, struct radv_shader_stage *out_stage)
{
memset(out_stage, 0, sizeof(*out_stage));
out_stage->stage = vk_to_mesa_shader_stage(sinfo->stage);
@@ -69,24 +94,7 @@ radv_shader_stage_init(const VkShaderCreateInfoEXT *sinfo, struct radv_shader_st
out_stage->spirv.data = (const char *)sinfo->pCode;
out_stage->spirv.size = sinfo->codeSize;
for (uint32_t i = 0; i < sinfo->setLayoutCount; i++) {
VK_FROM_HANDLE(radv_descriptor_set_layout, set_layout, sinfo->pSetLayouts[i]);
if (set_layout == NULL)
continue;
out_stage->layout.num_sets = MAX2(i + 1, out_stage->layout.num_sets);
out_stage->layout.set[i].layout = set_layout;
out_stage->layout.set[i].dynamic_offset_start = out_stage->layout.dynamic_offset_count;
out_stage->layout.dynamic_offset_count += set_layout->dynamic_offset_count;
dynamic_shader_stages |= set_layout->dynamic_shader_stages;
}
if (out_stage->layout.dynamic_offset_count && (dynamic_shader_stages & sinfo->stage)) {
out_stage->layout.use_dynamic_descriptors = true;
}
radv_get_shader_layout(sinfo, &out_stage->layout);
const VkShaderRequiredSubgroupSizeCreateInfoEXT *const subgroup_size =
vk_find_struct_const(sinfo->pNext, SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT);
@@ -238,35 +246,6 @@ radv_shader_object_init_compute(struct radv_shader_object *shader_obj, struct ra
return VK_SUCCESS;
}
static void
radv_get_shader_layout(const VkShaderCreateInfoEXT *pCreateInfo, struct radv_shader_layout *layout)
{
uint16_t dynamic_shader_stages = 0;
memset(layout, 0, sizeof(*layout));
layout->dynamic_offset_count = 0;
for (uint32_t i = 0; i < pCreateInfo->setLayoutCount; i++) {
VK_FROM_HANDLE(radv_descriptor_set_layout, set_layout, pCreateInfo->pSetLayouts[i]);
if (set_layout == NULL)
continue;
layout->num_sets = MAX2(i + 1, layout->num_sets);
layout->set[i].layout = set_layout;
layout->set[i].dynamic_offset_start = layout->dynamic_offset_count;
layout->dynamic_offset_count += set_layout->dynamic_offset_count;
dynamic_shader_stages |= set_layout->dynamic_shader_stages;
}
if (layout->dynamic_offset_count && (dynamic_shader_stages & pCreateInfo->stage)) {
layout->use_dynamic_descriptors = true;
}
}
static VkResult
radv_shader_object_init_binary(struct radv_device *device, struct blob_reader *blob, struct radv_shader **shader_out,
struct radv_shader_binary **binary_out)
@@ -291,7 +270,7 @@ radv_shader_object_init(struct radv_shader_object *shader_obj, struct radv_devic
const VkShaderCreateInfoEXT *pCreateInfo)
{
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radv_shader_layout layout;
struct radv_shader_layout layout = {0};
VkResult result;
radv_get_shader_layout(pCreateInfo, &layout);