mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader: Introduce API for descriptor array bindings.
We will need this for shader model 5.1 resource arrays. However, for the time being any count other than '1' is unsupported. Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
committed by
Alexandre Julliard
parent
9efcf45d7a
commit
d2ffae5900
@ -100,6 +100,7 @@ struct vkd3d_shader_descriptor_binding
|
|||||||
{
|
{
|
||||||
unsigned int set;
|
unsigned int set;
|
||||||
unsigned int binding;
|
unsigned int binding;
|
||||||
|
unsigned int count; /* This must be 1 in this version of vkd3d-shader. */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum vkd3d_shader_binding_flag
|
enum vkd3d_shader_binding_flag
|
||||||
|
@ -2424,11 +2424,26 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
|
|||||||
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))
|
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (current->offset)
|
if (current->register_space != register_space || current->register_index != reg_idx)
|
||||||
FIXME("Atomic counter offsets are not supported yet.\n");
|
continue;
|
||||||
|
|
||||||
if (current->register_space == register_space && current->register_index == reg_idx)
|
if (current->offset)
|
||||||
return current->binding;
|
{
|
||||||
|
FIXME("Atomic counter offsets are not supported yet.\n");
|
||||||
|
vkd3d_dxbc_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_INVALID_DESCRIPTOR_BINDING,
|
||||||
|
"Descriptor binding for UAV counter %u, space %u has unsupported ‘offset’ %u.",
|
||||||
|
reg_idx, register_space, current->offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current->binding.count != 1)
|
||||||
|
{
|
||||||
|
FIXME("Descriptor arrays are not supported.\n");
|
||||||
|
vkd3d_dxbc_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_INVALID_DESCRIPTOR_BINDING,
|
||||||
|
"Descriptor binding for UAV counter %u, space %u has unsupported ‘count’ %u.",
|
||||||
|
reg_idx, register_space, current->binding.count);
|
||||||
|
}
|
||||||
|
|
||||||
|
return current->binding;
|
||||||
}
|
}
|
||||||
if (shader_interface->uav_counter_count)
|
if (shader_interface->uav_counter_count)
|
||||||
{
|
{
|
||||||
@ -2449,9 +2464,20 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
|
|||||||
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))
|
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (current->type == descriptor_type && current->register_space == register_space
|
if (current->type != descriptor_type || current->register_space != register_space
|
||||||
&& current->register_index == reg_idx)
|
|| current->register_index != reg_idx)
|
||||||
return current->binding;
|
continue;
|
||||||
|
|
||||||
|
if (current->binding.count != 1)
|
||||||
|
{
|
||||||
|
FIXME("Descriptor arrays are not supported.\n");
|
||||||
|
vkd3d_dxbc_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_INVALID_DESCRIPTOR_BINDING,
|
||||||
|
"Descriptor binding for type %#x, space %u, register %u, "
|
||||||
|
"shader type %#x has unsupported ‘count’ %u.",
|
||||||
|
descriptor_type, register_space, reg_idx, compiler->shader_type, current->binding.count);
|
||||||
|
}
|
||||||
|
|
||||||
|
return current->binding;
|
||||||
}
|
}
|
||||||
if (shader_interface->binding_count)
|
if (shader_interface->binding_count)
|
||||||
{
|
{
|
||||||
@ -2465,6 +2491,7 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
|
|||||||
|
|
||||||
done:
|
done:
|
||||||
binding.set = 0;
|
binding.set = 0;
|
||||||
|
binding.count = 1;
|
||||||
binding.binding = compiler->binding_idx++;
|
binding.binding = compiler->binding_idx++;
|
||||||
return binding;
|
return binding;
|
||||||
}
|
}
|
||||||
@ -5327,6 +5354,16 @@ static void vkd3d_dxbc_compiler_emit_combined_sampler_declarations(struct vkd3d_
|
|||||||
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))
|
if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (current->binding.count != 1)
|
||||||
|
{
|
||||||
|
FIXME("Descriptor arrays are not supported.\n");
|
||||||
|
vkd3d_dxbc_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_INVALID_DESCRIPTOR_BINDING,
|
||||||
|
"Combined descriptor binding for resource %u, space %u, "
|
||||||
|
"and sampler %u, space %u has unsupported ‘count’ %u.",
|
||||||
|
resource_index, resource_space, current->sampler_index,
|
||||||
|
current->sampler_space, current->binding.count);
|
||||||
|
}
|
||||||
|
|
||||||
d = vkd3d_dxbc_compiler_get_descriptor_info(compiler,
|
d = vkd3d_dxbc_compiler_get_descriptor_info(compiler,
|
||||||
VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, current->sampler_space, current->sampler_index);
|
VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, current->sampler_space, current->sampler_index);
|
||||||
depth = current->sampler_index != VKD3D_SHADER_DUMMY_SAMPLER_INDEX
|
depth = current->sampler_index != VKD3D_SHADER_DUMMY_SAMPLER_INDEX
|
||||||
|
@ -72,6 +72,7 @@ enum vkd3d_shader_error
|
|||||||
|
|
||||||
VKD3D_SHADER_ERROR_SPV_DESCRIPTOR_BINDING_NOT_FOUND = 2000,
|
VKD3D_SHADER_ERROR_SPV_DESCRIPTOR_BINDING_NOT_FOUND = 2000,
|
||||||
VKD3D_SHADER_ERROR_SPV_INVALID_REGISTER_TYPE = 2001,
|
VKD3D_SHADER_ERROR_SPV_INVALID_REGISTER_TYPE = 2001,
|
||||||
|
VKD3D_SHADER_ERROR_SPV_INVALID_DESCRIPTOR_BINDING = 2002,
|
||||||
|
|
||||||
VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY = 3000,
|
VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY = 3000,
|
||||||
VKD3D_SHADER_ERROR_RS_INVALID_VERSION = 3001,
|
VKD3D_SHADER_ERROR_RS_INVALID_VERSION = 3001,
|
||||||
|
@ -535,6 +535,7 @@ static void d3d12_root_signature_append_vk_binding(struct d3d12_root_signature *
|
|||||||
mapping->flags = buffer_descriptor ? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
|
mapping->flags = buffer_descriptor ? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
|
||||||
mapping->binding.set = context->set_index;
|
mapping->binding.set = context->set_index;
|
||||||
mapping->binding.binding = context->descriptor_binding++;
|
mapping->binding.binding = context->descriptor_binding++;
|
||||||
|
mapping->binding.count = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t d3d12_root_signature_assign_vk_bindings(struct d3d12_root_signature *root_signature,
|
static uint32_t d3d12_root_signature_assign_vk_bindings(struct d3d12_root_signature *root_signature,
|
||||||
@ -1478,6 +1479,7 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel
|
|||||||
state->uav_counters[j].shader_visibility = VKD3D_SHADER_VISIBILITY_COMPUTE;
|
state->uav_counters[j].shader_visibility = VKD3D_SHADER_VISIBILITY_COMPUTE;
|
||||||
state->uav_counters[j].binding.set = context.set_index;
|
state->uav_counters[j].binding.set = context.set_index;
|
||||||
state->uav_counters[j].binding.binding = context.descriptor_binding;
|
state->uav_counters[j].binding.binding = context.descriptor_binding;
|
||||||
|
state->uav_counters[j].binding.count = 1;
|
||||||
|
|
||||||
/* FIXME: For the graphics pipeline we have to take the shader
|
/* FIXME: For the graphics pipeline we have to take the shader
|
||||||
* visibility into account. */
|
* visibility into account. */
|
||||||
@ -2954,6 +2956,7 @@ HRESULT vkd3d_uav_clear_state_init(struct vkd3d_uav_clear_state *state, struct d
|
|||||||
binding.shader_visibility = VKD3D_SHADER_VISIBILITY_COMPUTE;
|
binding.shader_visibility = VKD3D_SHADER_VISIBILITY_COMPUTE;
|
||||||
binding.binding.set = 0;
|
binding.binding.set = 0;
|
||||||
binding.binding.binding = 0;
|
binding.binding.binding = 0;
|
||||||
|
binding.binding.count = 1;
|
||||||
|
|
||||||
push_constant_range.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;
|
push_constant_range.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;
|
||||||
push_constant_range.offset = 0;
|
push_constant_range.offset = 0;
|
||||||
|
Reference in New Issue
Block a user