vkd3d-shader/msl: Pass a descriptor to msl_get_srv_binding().

This commit is contained in:
Giovanni Mascellani
2025-10-20 17:33:33 +02:00
committed by Henri Verbeet
parent 13d105c104
commit 53a349b46c
Notes: Henri Verbeet 2025-10-29 13:44:04 +01:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1807

View File

@@ -253,11 +253,11 @@ static bool msl_get_sampler_binding(const struct msl_generator *gen,
return msl_get_binding(gen, register_space, register_idx, VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, 0, idx); return msl_get_binding(gen, register_space, register_idx, VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, 0, idx);
} }
static bool msl_get_srv_binding(const struct msl_generator *gen, unsigned int register_space, static bool msl_get_srv_binding(const struct msl_generator *gen,
unsigned int register_idx, enum vkd3d_shader_resource_type resource_type, unsigned int *idx) const struct vkd3d_shader_descriptor_info1 *descriptor, unsigned int register_idx, unsigned int *idx)
{ {
return msl_get_binding(gen, register_space, register_idx, return msl_get_binding(gen, descriptor->register_space, register_idx,
VKD3D_SHADER_DESCRIPTOR_TYPE_SRV, resource_type == VKD3D_SHADER_RESOURCE_BUFFER VKD3D_SHADER_DESCRIPTOR_TYPE_SRV, descriptor->resource_type == VKD3D_SHADER_RESOURCE_BUFFER
? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE, idx); ? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE, idx);
} }
@@ -871,7 +871,7 @@ static void msl_ld(struct msl_generator *gen, const struct vkd3d_shader_instruct
uint32_t coord_mask, write_mask_size; uint32_t coord_mask, write_mask_size;
struct vkd3d_string_buffer *read; struct vkd3d_string_buffer *read;
enum vsir_data_type data_type; enum vsir_data_type data_type;
unsigned int srv_binding; unsigned int srv_binding = 0;
struct msl_dst dst; struct msl_dst dst;
if (vkd3d_shader_instruction_has_texel_offset(ins)) if (vkd3d_shader_instruction_has_texel_offset(ins))
@@ -928,13 +928,10 @@ static void msl_ld(struct msl_generator *gen, const struct vkd3d_shader_instruct
} }
coord_mask = vkd3d_write_mask_from_component_count(resource_type_info->coord_size); coord_mask = vkd3d_write_mask_from_component_count(resource_type_info->coord_size);
if (!msl_get_srv_binding(gen, resource_space, resource_idx, resource_type, &srv_binding)) if (descriptor && !msl_get_srv_binding(gen, descriptor, resource_idx, &srv_binding))
{
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_BINDING_NOT_FOUND, msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_BINDING_NOT_FOUND,
"No descriptor binding specified for SRV %u (index %u, space %u).", "No descriptor binding specified for SRV %u (index %u, space %u).",
resource_id, resource_idx, resource_space); resource_id, resource_idx, resource_space);
srv_binding = 0;
}
msl_dst_init(&dst, gen, ins, &ins->dst[0]); msl_dst_init(&dst, gen, ins, &ins->dst[0]);
read = vkd3d_string_buffer_get(&gen->string_buffers); read = vkd3d_string_buffer_get(&gen->string_buffers);
@@ -984,7 +981,7 @@ static void msl_sample(struct msl_generator *gen, const struct vkd3d_shader_inst
unsigned int sampler_id, sampler_idx, sampler_space; unsigned int sampler_id, sampler_idx, sampler_space;
const struct vkd3d_shader_descriptor_info1 *d; const struct vkd3d_shader_descriptor_info1 *d;
enum vkd3d_shader_resource_type resource_type; enum vkd3d_shader_resource_type resource_type;
unsigned int srv_binding, sampler_binding; unsigned int srv_binding = 0, sampler_binding;
uint32_t coord_mask, write_mask_size; uint32_t coord_mask, write_mask_size;
struct vkd3d_string_buffer *sample; struct vkd3d_string_buffer *sample;
enum vsir_data_type data_type; enum vsir_data_type data_type;
@@ -1052,13 +1049,10 @@ static void msl_sample(struct msl_generator *gen, const struct vkd3d_shader_inst
} }
coord_mask = vkd3d_write_mask_from_component_count(resource_type_info->coord_size); coord_mask = vkd3d_write_mask_from_component_count(resource_type_info->coord_size);
if (!msl_get_srv_binding(gen, resource_space, resource_idx, resource_type, &srv_binding)) if (d && !msl_get_srv_binding(gen, d, resource_idx, &srv_binding))
{
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_BINDING_NOT_FOUND, msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_BINDING_NOT_FOUND,
"No descriptor binding specified for SRV %u (index %u, space %u).", "No descriptor binding specified for SRV %u (index %u, space %u).",
resource_id, resource_idx, resource_space); resource_id, resource_idx, resource_space);
srv_binding = 0;
}
sampler_id = sampler->reg.idx[0].offset; sampler_id = sampler->reg.idx[0].offset;
sampler_idx = sampler->reg.idx[1].offset; sampler_idx = sampler->reg.idx[1].offset;