From e899b96c10d7a431b142103986b169910ba53675 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 12 Mar 2020 15:10:43 +0100 Subject: [PATCH] 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 --- libs/vkd3d/command.c | 7 +++---- libs/vkd3d/state.c | 20 +++++++++++++------- libs/vkd3d/vkd3d_private.h | 6 ++++++ 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 4bae8adf..f16f78b0 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -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]; 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_vulkan_info *vk_info = &list->device->vk_info; VkWriteDescriptorSet descriptor_writes[D3D12_MAX_ROOT_COST / 2]; const struct d3d12_root_parameter *root_parameter; VkDescriptorSet descriptor_set = VK_NULL_HANDLE; unsigned int descriptor_write_count = 0; 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; 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) 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, root_signature->vk_pipeline_layout, root_signature->root_descriptor_set, diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 50ac433b..79685414 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -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, 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; struct vkd3d_shader_resource_binding *binding; + VkDescriptorSetLayoutCreateFlags vk_flags; struct d3d12_root_parameter *param; unsigned int i, j; HRESULT hr; @@ -775,8 +775,10 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign context->vk_binding += 1; } - hr = vkd3d_create_descriptor_set_layout(root_signature->device, - vk_info->KHR_push_descriptor ? VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR : 0, + vk_flags = root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS + ? 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); 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; VkDescriptorSetLayout set_layouts[VKD3D_MAX_DESCRIPTOR_SETS]; + const struct vkd3d_vulkan_info *vk_info = &device->vk_info; struct vkd3d_descriptor_set_context context; struct d3d12_root_signature_info info; unsigned int i; @@ -906,6 +909,13 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa 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, &info, &context, &root_signature->vk_root_descriptor_layout))) goto fail; @@ -920,10 +930,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa 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, &info, &context, &root_signature->vk_packed_descriptor_layout))) goto fail; diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 8b703157..29793f3a 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -702,6 +702,11 @@ enum vkd3d_root_descriptor_table_flag 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 { uint32_t table_index; @@ -757,6 +762,7 @@ struct d3d12_root_signature uint64_t root_descriptor_mask; D3D12_ROOT_SIGNATURE_FLAGS d3d12_flags; + unsigned int flags; /* vkd3d_root_signature_flag */ unsigned int binding_count; struct vkd3d_shader_resource_binding *bindings;