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:
Henri Verbeet 2020-08-20 23:39:42 +04:30 committed by Alexandre Julliard
parent 9efcf45d7a
commit d2ffae5900
4 changed files with 49 additions and 7 deletions

View File

@ -100,6 +100,7 @@ struct vkd3d_shader_descriptor_binding
{
unsigned int set;
unsigned int binding;
unsigned int count; /* This must be 1 in this version of vkd3d-shader. */
};
enum vkd3d_shader_binding_flag

View File

@ -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))
continue;
if (current->offset)
FIXME("Atomic counter offsets are not supported yet.\n");
if (current->register_space != register_space || current->register_index != reg_idx)
continue;
if (current->register_space == register_space && current->register_index == reg_idx)
return current->binding;
if (current->offset)
{
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)
{
@ -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))
continue;
if (current->type == descriptor_type && current->register_space == register_space
&& current->register_index == reg_idx)
return current->binding;
if (current->type != descriptor_type || current->register_space != register_space
|| current->register_index != reg_idx)
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)
{
@ -2465,6 +2491,7 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
done:
binding.set = 0;
binding.count = 1;
binding.binding = compiler->binding_idx++;
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))
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,
VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, current->sampler_space, current->sampler_index);
depth = current->sampler_index != VKD3D_SHADER_DUMMY_SAMPLER_INDEX

View File

@ -72,6 +72,7 @@ enum vkd3d_shader_error
VKD3D_SHADER_ERROR_SPV_DESCRIPTOR_BINDING_NOT_FOUND = 2000,
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_INVALID_VERSION = 3001,

View File

@ -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->binding.set = context->set_index;
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,
@ -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].binding.set = context.set_index;
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
* 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.binding.set = 0;
binding.binding.binding = 0;
binding.binding.count = 1;
push_constant_range.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;
push_constant_range.offset = 0;