mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-12-15 08:03:30 -08:00
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:
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
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user