vkd3d: Refactor descriptor updates.

We might have to emit to different bind point than our binding entry
suggests due to DXR, so pass down information explicitly to leaf
functions.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2021-03-03 12:18:22 +01:00
parent eeaca4a500
commit b162e5ec72
1 changed files with 50 additions and 38 deletions

View File

@ -4162,9 +4162,8 @@ static bool d3d12_command_list_update_graphics_pipeline(struct d3d12_command_lis
}
static void d3d12_command_list_update_descriptor_table_offsets(struct d3d12_command_list *list,
VkPipelineBindPoint bind_point)
struct vkd3d_pipeline_bindings *bindings, VkPipelineLayout layout, VkShaderStageFlags push_stages)
{
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
const struct d3d12_root_signature *root_signature = bindings->root_signature;
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
const struct vkd3d_shader_descriptor_table *table;
@ -4183,11 +4182,10 @@ static void d3d12_command_list_update_descriptor_table_offsets(struct d3d12_comm
}
/* Set descriptor offsets */
if (bindings->layout.vk_push_stages)
if (push_stages)
{
VK_CALL(vkCmdPushConstants(list->vk_command_buffer,
bindings->layout.vk_pipeline_layout,
bindings->layout.vk_push_stages,
layout, push_stages,
root_signature->descriptor_table_offset,
root_signature->descriptor_table_count * sizeof(uint32_t),
table_offsets));
@ -4243,9 +4241,9 @@ static bool vk_write_descriptor_set_and_inline_uniform_block(VkWriteDescriptorSe
}
static void d3d12_command_list_update_descriptor_heaps(struct d3d12_command_list *list,
VkPipelineBindPoint bind_point)
struct vkd3d_pipeline_bindings *bindings, VkPipelineBindPoint vk_bind_point,
VkPipelineLayout layout)
{
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
while (bindings->descriptor_heap_dirty_mask)
@ -4254,22 +4252,22 @@ static void d3d12_command_list_update_descriptor_heaps(struct d3d12_command_list
if (list->descriptor_heaps[heap_index])
{
VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, bind_point,
bindings->layout.vk_pipeline_layout, heap_index, 1,
VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, vk_bind_point,
layout, heap_index, 1,
&list->descriptor_heaps[heap_index], 0, NULL));
}
}
}
static void d3d12_command_list_update_static_samplers(struct d3d12_command_list *list,
VkPipelineBindPoint bind_point)
struct vkd3d_pipeline_bindings *bindings, VkPipelineBindPoint vk_bind_point,
VkPipelineLayout layout)
{
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
const struct d3d12_root_signature *root_signature = bindings->root_signature;
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, bind_point,
bindings->layout.vk_pipeline_layout,
VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, vk_bind_point,
layout,
root_signature->sampler_descriptor_set,
1, &bindings->static_sampler_set, 0, NULL));
@ -4277,15 +4275,15 @@ static void d3d12_command_list_update_static_samplers(struct d3d12_command_list
}
static void d3d12_command_list_update_root_constants(struct d3d12_command_list *list,
VkPipelineBindPoint bind_point)
struct vkd3d_pipeline_bindings *bindings,
VkPipelineLayout layout, VkShaderStageFlags push_stages)
{
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
const struct d3d12_root_signature *root_signature = bindings->root_signature;
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
const struct vkd3d_shader_root_constant *root_constant;
unsigned int root_parameter_index;
if (!bindings->layout.vk_push_stages)
if (!push_stages)
{
bindings->root_constant_dirty_mask = 0;
return;
@ -4297,8 +4295,7 @@ static void d3d12_command_list_update_root_constants(struct d3d12_command_list *
root_constant = root_signature_get_32bit_constants(root_signature, root_parameter_index);
VK_CALL(vkCmdPushConstants(list->vk_command_buffer,
bindings->layout.vk_pipeline_layout,
bindings->layout.vk_push_stages,
layout, push_stages,
root_constant->constant_index * sizeof(uint32_t),
root_constant->constant_count * sizeof(uint32_t),
&bindings->root_constants[root_constant->constant_index]));
@ -4312,9 +4309,8 @@ union root_parameter_data
};
static unsigned int d3d12_command_list_fetch_root_descriptor_vas(struct d3d12_command_list *list,
VkPipelineBindPoint bind_point, union root_parameter_data *dst_data)
struct vkd3d_pipeline_bindings *bindings, union root_parameter_data *dst_data)
{
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
const struct d3d12_root_signature *root_signature = bindings->root_signature;
uint64_t root_descriptor_mask = root_signature->root_descriptor_raw_va_mask;
unsigned int va_idx = 0;
@ -4332,9 +4328,8 @@ static unsigned int d3d12_command_list_fetch_root_descriptor_vas(struct d3d12_co
}
static void d3d12_command_list_fetch_inline_uniform_block_data(struct d3d12_command_list *list,
VkPipelineBindPoint bind_point, union root_parameter_data *dst_data)
struct vkd3d_pipeline_bindings *bindings, union root_parameter_data *dst_data)
{
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
const struct d3d12_root_signature *root_signature = bindings->root_signature;
uint64_t root_constant_mask = root_signature->root_constant_mask;
const struct vkd3d_shader_root_constant *root_constant;
@ -4373,9 +4368,9 @@ static void d3d12_command_list_fetch_inline_uniform_block_data(struct d3d12_comm
}
static void d3d12_command_list_update_root_descriptors(struct d3d12_command_list *list,
VkPipelineBindPoint bind_point)
struct vkd3d_pipeline_bindings *bindings, VkPipelineBindPoint vk_bind_point,
VkPipelineLayout layout, VkShaderStageFlags push_stages)
{
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
const struct d3d12_root_signature *root_signature = bindings->root_signature;
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
VkWriteDescriptorSetInlineUniformBlockEXT inline_uniform_block_write;
@ -4403,7 +4398,7 @@ static void d3d12_command_list_update_root_descriptors(struct d3d12_command_list
{
/* If any raw VA descriptor is dirty, we need to update all of them. */
if (root_signature->root_descriptor_raw_va_mask & bindings->root_descriptor_dirty_mask)
va_count = d3d12_command_list_fetch_root_descriptor_vas(list, bind_point, &root_parameter_data);
va_count = d3d12_command_list_fetch_root_descriptor_vas(list, bindings, &root_parameter_data);
/* TODO bind null descriptors for inactive root descriptors. */
dirty_push_mask =
@ -4429,7 +4424,7 @@ static void d3d12_command_list_update_root_descriptors(struct d3d12_command_list
if (root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_INLINE_UNIFORM_BLOCK)
{
d3d12_command_list_fetch_inline_uniform_block_data(list, bind_point, &root_parameter_data);
d3d12_command_list_fetch_inline_uniform_block_data(list, bindings, &root_parameter_data);
vk_write_descriptor_set_and_inline_uniform_block(&descriptor_writes[descriptor_write_count],
&inline_uniform_block_write, descriptor_set, root_signature, &root_parameter_data);
@ -4439,8 +4434,7 @@ static void d3d12_command_list_update_root_descriptors(struct d3d12_command_list
else if (va_count && bindings->layout.vk_push_stages)
{
VK_CALL(vkCmdPushConstants(list->vk_command_buffer,
bindings->layout.vk_pipeline_layout,
bindings->layout.vk_push_stages,
layout, push_stages,
0, va_count * sizeof(*root_parameter_data.root_descriptor_vas),
root_parameter_data.root_descriptor_vas));
}
@ -4452,14 +4446,14 @@ static void d3d12_command_list_update_root_descriptors(struct d3d12_command_list
{
VK_CALL(vkUpdateDescriptorSets(list->device->vk_device,
descriptor_write_count, descriptor_writes, 0, NULL));
VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, bind_point,
bindings->layout.vk_pipeline_layout, root_signature->root_descriptor_set,
VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, vk_bind_point,
layout, root_signature->root_descriptor_set,
1, &descriptor_set, 0, NULL));
}
else
{
VK_CALL(vkCmdPushDescriptorSetKHR(list->vk_command_buffer, bind_point,
bindings->layout.vk_pipeline_layout, root_signature->root_descriptor_set,
VK_CALL(vkCmdPushDescriptorSetKHR(list->vk_command_buffer, vk_bind_point,
layout, root_signature->root_descriptor_set,
descriptor_write_count, descriptor_writes));
}
}
@ -4469,33 +4463,51 @@ static void d3d12_command_list_update_descriptors(struct d3d12_command_list *lis
{
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
const struct d3d12_root_signature *rs = bindings->root_signature;
VkPipelineBindPoint vk_bind_point;
VkShaderStageFlags push_stages;
VkPipelineLayout layout;
if (!rs)
return;
if (list->active_bind_point == VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR)
{
/* We might have to emit to RT bind point,
* but we pretend we're in compute bind point. */
layout = bindings->rt_layout.vk_pipeline_layout;
push_stages = bindings->rt_layout.vk_push_stages;
}
else
{
layout = bindings->layout.vk_pipeline_layout;
push_stages = bindings->layout.vk_push_stages;
}
vk_bind_point = list->active_bind_point;
if (bindings->descriptor_heap_dirty_mask)
d3d12_command_list_update_descriptor_heaps(list, bind_point);
d3d12_command_list_update_descriptor_heaps(list, bindings, vk_bind_point, layout);
if (bindings->dirty_flags & VKD3D_PIPELINE_DIRTY_STATIC_SAMPLER_SET)
d3d12_command_list_update_static_samplers(list, bind_point);
d3d12_command_list_update_static_samplers(list, bindings, vk_bind_point, layout);
if (rs->flags & VKD3D_ROOT_SIGNATURE_USE_INLINE_UNIFORM_BLOCK)
{
/* Root constants and descriptor table offsets are part of the root descriptor set */
if (bindings->root_descriptor_dirty_mask || bindings->root_constant_dirty_mask
|| (bindings->dirty_flags & VKD3D_PIPELINE_DIRTY_DESCRIPTOR_TABLE_OFFSETS))
d3d12_command_list_update_root_descriptors(list, bind_point);
d3d12_command_list_update_root_descriptors(list, bindings, vk_bind_point, layout, push_stages);
}
else
{
if (bindings->root_descriptor_dirty_mask)
d3d12_command_list_update_root_descriptors(list, bind_point);
d3d12_command_list_update_root_descriptors(list, bindings, vk_bind_point, layout, push_stages);
if (bindings->root_constant_dirty_mask)
d3d12_command_list_update_root_constants(list, bind_point);
d3d12_command_list_update_root_constants(list, bindings, layout, push_stages);
if (bindings->dirty_flags & VKD3D_PIPELINE_DIRTY_DESCRIPTOR_TABLE_OFFSETS)
d3d12_command_list_update_descriptor_table_offsets(list, bind_point);
d3d12_command_list_update_descriptor_table_offsets(list, bindings, layout, push_stages);
}
}