vkd3d: Add helpers for getting root signature parameters.

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2019-04-01 11:19:49 +02:00 committed by Alexandre Julliard
parent 74fbfee611
commit 4408816e24

View File

@ -334,6 +334,39 @@ HRESULT vkd3d_fence_worker_stop(struct vkd3d_fence_worker *worker,
return S_OK; return S_OK;
} }
static const struct d3d12_root_parameter *root_signature_get_parameter(
const struct d3d12_root_signature *root_signature, unsigned int index)
{
assert(index < root_signature->parameter_count);
return &root_signature->parameters[index];
}
static const struct d3d12_root_descriptor_table *root_signature_get_descriptor_table(
const struct d3d12_root_signature *root_signature, unsigned int index)
{
const struct d3d12_root_parameter *p = root_signature_get_parameter(root_signature, index);
assert(p->parameter_type == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE);
return &p->u.descriptor_table;
}
static const struct d3d12_root_constant *root_signature_get_32bit_constants(
const struct d3d12_root_signature *root_signature, unsigned int index)
{
const struct d3d12_root_parameter *p = root_signature_get_parameter(root_signature, index);
assert(p->parameter_type == D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS);
return &p->u.constant;
}
static const struct d3d12_root_parameter *root_signature_get_root_descriptor(
const struct d3d12_root_signature *root_signature, unsigned int index)
{
const struct d3d12_root_parameter *p = root_signature_get_parameter(root_signature, index);
assert(p->parameter_type == D3D12_ROOT_PARAMETER_TYPE_CBV
|| p->parameter_type == D3D12_ROOT_PARAMETER_TYPE_SRV
|| p->parameter_type == D3D12_ROOT_PARAMETER_TYPE_UAV);
return p;
}
/* ID3D12Fence */ /* ID3D12Fence */
static struct d3d12_fence *impl_from_ID3D12Fence(ID3D12Fence *iface) static struct d3d12_fence *impl_from_ID3D12Fence(ID3D12Fence *iface)
{ {
@ -2037,8 +2070,7 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
unsigned int i, j, descriptor_count; unsigned int i, j, descriptor_count;
struct d3d12_desc *descriptor; struct d3d12_desc *descriptor;
assert(root_signature->parameters[index].parameter_type == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE); descriptor_table = root_signature_get_descriptor_table(root_signature, index);
descriptor_table = &root_signature->parameters[index].u.descriptor_table;
descriptor_count = 0; descriptor_count = 0;
for (i = 0; i < descriptor_table->range_count; ++i) for (i = 0; i < descriptor_table->range_count; ++i)
@ -2120,7 +2152,7 @@ static bool vk_write_descriptor_set_from_root_descriptor(VkWriteDescriptorSet *v
vk_descriptor_write->descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; vk_descriptor_write->descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
break; break;
default: default:
ERR("Invalid root descriptor.\n"); ERR("Invalid root descriptor %#x.\n", root_parameter->parameter_type);
return false; return false;
} }
@ -2172,7 +2204,7 @@ static void d3d12_command_list_update_push_descriptors(struct d3d12_command_list
if (!(bindings->push_descriptor_dirty_mask & (1u << i))) if (!(bindings->push_descriptor_dirty_mask & (1u << i)))
continue; continue;
root_parameter = &root_signature->parameters[i]; root_parameter = root_signature_get_root_descriptor(root_signature, i);
push_descriptor = &bindings->push_descriptors[i]; push_descriptor = &bindings->push_descriptors[i];
if (root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_CBV) if (root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_CBV)
@ -3385,7 +3417,7 @@ static void d3d12_command_list_set_descriptor_table(struct d3d12_command_list *l
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point]; struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
const struct d3d12_root_signature *root_signature = bindings->root_signature; const struct d3d12_root_signature *root_signature = bindings->root_signature;
assert(root_signature->parameters[index].parameter_type == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE); assert(root_signature_get_descriptor_table(root_signature, index));
assert(index < ARRAY_SIZE(bindings->descriptor_tables)); assert(index < ARRAY_SIZE(bindings->descriptor_tables));
bindings->descriptor_tables[index] = base_descriptor; bindings->descriptor_tables[index] = base_descriptor;
@ -3425,8 +3457,7 @@ static void d3d12_command_list_set_root_constants(struct d3d12_command_list *lis
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs; const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
const struct d3d12_root_constant *c; const struct d3d12_root_constant *c;
assert(root_signature->parameters[index].parameter_type == D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS); c = root_signature_get_32bit_constants(root_signature, index);
c = &root_signature->parameters[index].u.constant;
VK_CALL(vkCmdPushConstants(list->vk_command_buffer, root_signature->vk_pipeline_layout, VK_CALL(vkCmdPushConstants(list->vk_command_buffer, root_signature->vk_pipeline_layout,
c->stage_flags, c->offset + offset * sizeof(uint32_t), count * sizeof(uint32_t), data)); c->stage_flags, c->offset + offset * sizeof(uint32_t), count * sizeof(uint32_t), data));
} }
@ -3491,7 +3522,7 @@ static void d3d12_command_list_set_root_cbv(struct d3d12_command_list *list,
struct VkDescriptorBufferInfo buffer_info; struct VkDescriptorBufferInfo buffer_info;
struct d3d12_resource *resource; struct d3d12_resource *resource;
root_parameter = &root_signature->parameters[index]; root_parameter = root_signature_get_root_descriptor(root_signature, index);
assert(root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_CBV); assert(root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_CBV);
resource = vkd3d_gpu_va_allocator_dereference(&list->device->gpu_va_allocator, gpu_address); resource = vkd3d_gpu_va_allocator_dereference(&list->device->gpu_va_allocator, gpu_address);
@ -3556,9 +3587,8 @@ static void d3d12_command_list_set_root_descriptor(struct d3d12_command_list *li
VkDevice vk_device = list->device->vk_device; VkDevice vk_device = list->device->vk_device;
VkBufferView vk_buffer_view; VkBufferView vk_buffer_view;
root_parameter = &root_signature->parameters[index]; root_parameter = root_signature_get_root_descriptor(root_signature, index);
assert(root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_SRV assert(root_parameter->parameter_type != D3D12_ROOT_PARAMETER_TYPE_CBV);
|| root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_UAV);
/* FIXME: Re-use buffer views. */ /* FIXME: Re-use buffer views. */
if (!vkd3d_create_raw_buffer_view(list->device, gpu_address, &vk_buffer_view)) if (!vkd3d_create_raw_buffer_view(list->device, gpu_address, &vk_buffer_view))