vkd3d-shader/msl: Allow binding to descriptor arrays.

This requires merging adjacent bindings in the Metal shader runner,
mostly like 805a4bc1e8 did for the
d3d12 backend.
This commit is contained in:
Giovanni Mascellani
2025-10-20 22:57:40 +02:00
committed by Henri Verbeet
parent 82619e81c3
commit eaabd2ffd7
Notes: Henri Verbeet 2025-10-30 20:00:07 +01:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1757
2 changed files with 28 additions and 7 deletions

View File

@@ -226,14 +226,22 @@ static bool msl_get_binding(const struct msl_generator *gen, const struct vkd3d_
continue;
if (binding->register_space != descriptor->register_space)
continue;
if (binding->register_index != register_idx)
if (binding->register_index > descriptor->register_index)
continue;
if (descriptor->count != ~0u && binding->binding.count < descriptor->count)
continue;
if (descriptor->count != ~0u
&& binding->binding.count - descriptor->count < descriptor->register_index - binding->register_index)
continue;
if (descriptor->count == ~0u
&& binding->binding.count <= descriptor->register_index - binding->register_index)
continue;
if (!msl_check_shader_visibility(gen, binding->shader_visibility))
continue;
if ((binding->flags & flags) != flags)
continue;
*idx = binding->binding.binding;
*idx = register_idx + binding->binding.binding - binding->register_index;
return true;
}

View File

@@ -387,8 +387,8 @@ static bool compile_shader(struct metal_runner *runner, enum shader_type type, s
struct vkd3d_shader_interface_info interface_info = {.type = VKD3D_SHADER_STRUCTURE_TYPE_INTERFACE_INFO};
struct vkd3d_shader_compile_info info = {.type = VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO};
struct vkd3d_shader_resource_binding bindings[MAX_RESOURCES + MAX_SAMPLERS + 1 /* CBV */];
struct vkd3d_shader_resource_binding *binding;
unsigned int i;
struct vkd3d_shader_resource_binding *binding, *base_binding = NULL;
unsigned int i, binding_idx = 0;
char *messages;
int ret;
@@ -422,9 +422,10 @@ static bool compile_shader(struct metal_runner *runner, enum shader_type type, s
binding->shader_visibility = VKD3D_SHADER_VISIBILITY_ALL;
binding->flags = VKD3D_SHADER_BINDING_FLAG_BUFFER;
binding->binding.set = 0;
binding->binding.binding = interface_info.binding_count;
binding->binding.binding = binding_idx;
binding->binding.count = 1;
++interface_info.binding_count;
++binding_idx;
}
for (i = 0; i < runner->r.resource_count; ++i)
@@ -448,9 +449,20 @@ static bool compile_shader(struct metal_runner *runner, enum shader_type type, s
else
binding->flags = VKD3D_SHADER_BINDING_FLAG_IMAGE;
binding->binding.set = 0;
binding->binding.binding = interface_info.binding_count;
binding->binding.binding = binding_idx;
binding->binding.count = 1;
if (base_binding && base_binding->type == binding->type && base_binding->flags == binding->flags
&& base_binding->register_index + base_binding->binding.count == resource->r.desc.slot)
{
++base_binding->binding.count;
++binding_idx;
break;
}
base_binding = binding;
++interface_info.binding_count;
++binding_idx;
break;
case RESOURCE_TYPE_RENDER_TARGET:
@@ -470,9 +482,10 @@ static bool compile_shader(struct metal_runner *runner, enum shader_type type, s
binding->shader_visibility = VKD3D_SHADER_VISIBILITY_ALL;
binding->flags = 0;
binding->binding.set = 0;
binding->binding.binding = interface_info.binding_count;
binding->binding.binding = binding_idx;
binding->binding.count = 1;
++interface_info.binding_count;
++binding_idx;
}
interface_info.bindings = bindings;