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;
|
continue;
|
||||||
if (binding->register_space != descriptor->register_space)
|
if (binding->register_space != descriptor->register_space)
|
||||||
continue;
|
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;
|
continue;
|
||||||
if (!msl_check_shader_visibility(gen, binding->shader_visibility))
|
if (!msl_check_shader_visibility(gen, binding->shader_visibility))
|
||||||
continue;
|
continue;
|
||||||
if ((binding->flags & flags) != flags)
|
if ((binding->flags & flags) != flags)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
*idx = binding->binding.binding;
|
*idx = register_idx + binding->binding.binding - binding->register_index;
|
||||||
return true;
|
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_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_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 bindings[MAX_RESOURCES + MAX_SAMPLERS + 1 /* CBV */];
|
||||||
struct vkd3d_shader_resource_binding *binding;
|
struct vkd3d_shader_resource_binding *binding, *base_binding = NULL;
|
||||||
unsigned int i;
|
unsigned int i, binding_idx = 0;
|
||||||
char *messages;
|
char *messages;
|
||||||
int ret;
|
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->shader_visibility = VKD3D_SHADER_VISIBILITY_ALL;
|
||||||
binding->flags = VKD3D_SHADER_BINDING_FLAG_BUFFER;
|
binding->flags = VKD3D_SHADER_BINDING_FLAG_BUFFER;
|
||||||
binding->binding.set = 0;
|
binding->binding.set = 0;
|
||||||
binding->binding.binding = interface_info.binding_count;
|
binding->binding.binding = binding_idx;
|
||||||
binding->binding.count = 1;
|
binding->binding.count = 1;
|
||||||
++interface_info.binding_count;
|
++interface_info.binding_count;
|
||||||
|
++binding_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < runner->r.resource_count; ++i)
|
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
|
else
|
||||||
binding->flags = VKD3D_SHADER_BINDING_FLAG_IMAGE;
|
binding->flags = VKD3D_SHADER_BINDING_FLAG_IMAGE;
|
||||||
binding->binding.set = 0;
|
binding->binding.set = 0;
|
||||||
binding->binding.binding = interface_info.binding_count;
|
binding->binding.binding = binding_idx;
|
||||||
binding->binding.count = 1;
|
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;
|
++interface_info.binding_count;
|
||||||
|
++binding_idx;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RESOURCE_TYPE_RENDER_TARGET:
|
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->shader_visibility = VKD3D_SHADER_VISIBILITY_ALL;
|
||||||
binding->flags = 0;
|
binding->flags = 0;
|
||||||
binding->binding.set = 0;
|
binding->binding.set = 0;
|
||||||
binding->binding.binding = interface_info.binding_count;
|
binding->binding.binding = binding_idx;
|
||||||
binding->binding.count = 1;
|
binding->binding.count = 1;
|
||||||
++interface_info.binding_count;
|
++interface_info.binding_count;
|
||||||
|
++binding_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface_info.bindings = bindings;
|
interface_info.bindings = bindings;
|
||||||
|
|||||||
Reference in New Issue
Block a user