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;