vkd3d: Introduce root signature flag to determine push descriptor usage.

For now this is enbaled based on device capabilities, but future changes
may require this to be disabled for certain root signatures.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-03-12 15:10:43 +01:00 committed by Hans-Kristian Arntzen
parent d515e3efa7
commit e899b96c10
3 changed files with 22 additions and 11 deletions

View File

@ -2947,16 +2947,15 @@ static void d3d12_command_list_update_root_descriptors(struct d3d12_command_list
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;
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 vkd3d_vulkan_info *vk_info = &list->device->vk_info;
VkWriteDescriptorSet descriptor_writes[D3D12_MAX_ROOT_COST / 2]; VkWriteDescriptorSet descriptor_writes[D3D12_MAX_ROOT_COST / 2];
const struct d3d12_root_parameter *root_parameter; const struct d3d12_root_parameter *root_parameter;
VkDescriptorSet descriptor_set = VK_NULL_HANDLE; VkDescriptorSet descriptor_set = VK_NULL_HANDLE;
unsigned int descriptor_write_count = 0; unsigned int descriptor_write_count = 0;
unsigned int root_parameter_index; unsigned int root_parameter_index;
if (!vk_info->KHR_push_descriptor) if (!(root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS))
{ {
/* Ensure that we populate all descriptors if VK_KHR_push_descriptor is unavailable */ /* Ensure that we populate all descriptors if push descriptors cannot be used */
bindings->root_descriptor_dirty_mask |= bindings->root_descriptor_active_mask & root_signature->root_descriptor_mask; bindings->root_descriptor_dirty_mask |= bindings->root_descriptor_active_mask & root_signature->root_descriptor_mask;
descriptor_set = d3d12_command_allocator_allocate_descriptor_set( descriptor_set = d3d12_command_allocator_allocate_descriptor_set(
@ -2981,7 +2980,7 @@ static void d3d12_command_list_update_root_descriptors(struct d3d12_command_list
if (!descriptor_write_count) if (!descriptor_write_count)
return; return;
if (vk_info->KHR_push_descriptor) if (root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS)
{ {
VK_CALL(vkCmdPushDescriptorSetKHR(list->vk_command_buffer, bind_point, VK_CALL(vkCmdPushDescriptorSetKHR(list->vk_command_buffer, bind_point,
root_signature->vk_pipeline_layout, root_signature->root_descriptor_set, root_signature->vk_pipeline_layout, root_signature->root_descriptor_set,

View File

@ -723,9 +723,9 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign
const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info, const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info,
struct vkd3d_descriptor_set_context *context, VkDescriptorSetLayout *vk_set_layout) struct vkd3d_descriptor_set_context *context, VkDescriptorSetLayout *vk_set_layout)
{ {
const struct vkd3d_vulkan_info *vk_info = &root_signature->device->vk_info;
VkDescriptorSetLayoutBinding *vk_binding_info, *vk_binding; VkDescriptorSetLayoutBinding *vk_binding_info, *vk_binding;
struct vkd3d_shader_resource_binding *binding; struct vkd3d_shader_resource_binding *binding;
VkDescriptorSetLayoutCreateFlags vk_flags;
struct d3d12_root_parameter *param; struct d3d12_root_parameter *param;
unsigned int i, j; unsigned int i, j;
HRESULT hr; HRESULT hr;
@ -775,8 +775,10 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign
context->vk_binding += 1; context->vk_binding += 1;
} }
hr = vkd3d_create_descriptor_set_layout(root_signature->device, vk_flags = root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS
vk_info->KHR_push_descriptor ? VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR : 0, ? VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR : 0;
hr = vkd3d_create_descriptor_set_layout(root_signature->device, vk_flags,
info->root_descriptor_count, vk_binding_info, vk_set_layout); info->root_descriptor_count, vk_binding_info, vk_set_layout);
vkd3d_free(vk_binding_info); vkd3d_free(vk_binding_info);
@ -841,6 +843,7 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
{ {
const struct vkd3d_bindless_state *bindless_state = &device->bindless_state; const struct vkd3d_bindless_state *bindless_state = &device->bindless_state;
VkDescriptorSetLayout set_layouts[VKD3D_MAX_DESCRIPTOR_SETS]; VkDescriptorSetLayout set_layouts[VKD3D_MAX_DESCRIPTOR_SETS];
const struct vkd3d_vulkan_info *vk_info = &device->vk_info;
struct vkd3d_descriptor_set_context context; struct vkd3d_descriptor_set_context context;
struct d3d12_root_signature_info info; struct d3d12_root_signature_info info;
unsigned int i; unsigned int i;
@ -906,6 +909,13 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
context.vk_set += 1; context.vk_set += 1;
} }
if (FAILED(hr = d3d12_root_signature_init_push_constants(root_signature, desc, &info,
&root_signature->push_constant_range)))
goto fail;
if (vk_info->KHR_push_descriptor)
root_signature->flags |= VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS;
if (FAILED(hr = d3d12_root_signature_init_root_descriptors(root_signature, desc, if (FAILED(hr = d3d12_root_signature_init_root_descriptors(root_signature, desc,
&info, &context, &root_signature->vk_root_descriptor_layout))) &info, &context, &root_signature->vk_root_descriptor_layout)))
goto fail; goto fail;
@ -920,10 +930,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
context.vk_set += 1; context.vk_set += 1;
} }
if (FAILED(hr = d3d12_root_signature_init_push_constants(root_signature, desc, &info,
&root_signature->push_constant_range)))
goto fail;
if (FAILED(hr = d3d12_root_signature_init_root_descriptor_tables(root_signature, desc, if (FAILED(hr = d3d12_root_signature_init_root_descriptor_tables(root_signature, desc,
&info, &context, &root_signature->vk_packed_descriptor_layout))) &info, &context, &root_signature->vk_packed_descriptor_layout)))
goto fail; goto fail;

View File

@ -702,6 +702,11 @@ enum vkd3d_root_descriptor_table_flag
VKD3D_ROOT_DESCRIPTOR_TABLE_HAS_PACKED_DESCRIPTORS = 0x00000001u, VKD3D_ROOT_DESCRIPTOR_TABLE_HAS_PACKED_DESCRIPTORS = 0x00000001u,
}; };
enum vkd3d_root_signature_flag
{
VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS = 0x00000001u,
};
struct d3d12_root_descriptor_table struct d3d12_root_descriptor_table
{ {
uint32_t table_index; uint32_t table_index;
@ -757,6 +762,7 @@ struct d3d12_root_signature
uint64_t root_descriptor_mask; uint64_t root_descriptor_mask;
D3D12_ROOT_SIGNATURE_FLAGS d3d12_flags; D3D12_ROOT_SIGNATURE_FLAGS d3d12_flags;
unsigned int flags; /* vkd3d_root_signature_flag */
unsigned int binding_count; unsigned int binding_count;
struct vkd3d_shader_resource_binding *bindings; struct vkd3d_shader_resource_binding *bindings;