libs/vkd3d: Update Vulkan descriptor sets just before draw call.

This commit is contained in:
Józef Kucia 2017-09-05 11:53:55 +02:00
parent 36d7578093
commit 23150f6050
2 changed files with 25 additions and 1 deletions

View File

@ -1812,7 +1812,7 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des
return true;
}
static void d3d12_command_list_set_descriptor_table(struct d3d12_command_list *list,
static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list *list,
VkPipelineBindPoint bind_point, unsigned int index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor)
{
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
@ -1882,10 +1882,18 @@ static void d3d12_command_list_update_descriptors(struct d3d12_command_list *lis
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
struct d3d12_root_signature *rs = bindings->root_signature;
unsigned int i;
if (!rs || !rs->pool_size_count || !rs->vk_set_layout)
return;
for (i = 0; i < ARRAY_SIZE(bindings->descriptor_tables); ++i)
{
if (bindings->descriptor_table_dirty_mask & ((uint64_t)1 << i))
d3d12_command_list_update_descriptor_table(list, bind_point, i, bindings->descriptor_tables[i]);
}
bindings->descriptor_table_dirty_mask = 0;
bindings->in_use = true;
VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, bind_point,
rs->vk_pipeline_layout, rs->main_set, 1, &bindings->descriptor_set, 0, NULL));
@ -2571,6 +2579,19 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetGraphicsRootSignature(ID3D12
unsafe_impl_from_ID3D12RootSignature(root_signature));
}
static void d3d12_command_list_set_descriptor_table(struct d3d12_command_list *list,
VkPipelineBindPoint bind_point, unsigned int index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor)
{
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
struct d3d12_root_signature *root_signature = bindings->root_signature;
assert(root_signature->parameters[index].parameter_type == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE);
assert(index < ARRAY_SIZE(bindings->descriptor_tables));
bindings->descriptor_tables[index] = base_descriptor;
bindings->descriptor_table_dirty_mask |= (uint64_t)1 << index;
}
static void STDMETHODCALLTYPE d3d12_command_list_SetComputeRootDescriptorTable(ID3D12GraphicsCommandList *iface,
UINT root_parameter_index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor)
{

View File

@ -451,6 +451,9 @@ struct vkd3d_pipeline_bindings
VkDescriptorSet descriptor_set;
bool in_use;
D3D12_GPU_DESCRIPTOR_HANDLE descriptor_tables[D3D12_MAX_ROOT_COST];
uint64_t descriptor_table_dirty_mask;
};
/* ID3D12CommandList */