diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index aaa4252c..fb874549 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -2730,7 +2730,7 @@ void d3d12_desc_create_cbv(struct d3d12_desc *descriptor, } descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_CBV; - descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + descriptor->vk_descriptor_type = vkd3d_bindless_state_get_cbv_descriptor_type(&device->bindless_state); } static unsigned int vkd3d_view_flags_from_d3d12_buffer_srv_flags(D3D12_BUFFER_SRV_FLAGS flags) @@ -3697,7 +3697,7 @@ static HRESULT d3d12_descriptor_heap_create_descriptor_pool(struct d3d12_descrip if (set_info->heap_type == descriptor_heap->desc.Type) { VkDescriptorPoolSize *vk_pool_size = &vk_pool_sizes[pool_count++]; - vk_pool_size->type = vk_descriptor_type_from_bindless_set_info(set_info); + vk_pool_size->type = set_info->vk_descriptor_type; vk_pool_size->descriptorCount = descriptor_heap->desc.NumDescriptors; } } diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 3e6cfc52..4a5cf2f4 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -211,8 +211,8 @@ static enum vkd3d_shader_visibility vkd3d_shader_visibility_from_d3d12(D3D12_SHA } } -static VkDescriptorType vk_descriptor_type_from_d3d12_range_type(D3D12_DESCRIPTOR_RANGE_TYPE type, - bool is_buffer) +static VkDescriptorType vk_descriptor_type_from_d3d12_range_type(const struct vkd3d_bindless_state *bindless_state, + D3D12_DESCRIPTOR_RANGE_TYPE type, bool is_buffer) { switch (type) { @@ -221,7 +221,7 @@ static VkDescriptorType vk_descriptor_type_from_d3d12_range_type(D3D12_DESCRIPTO case D3D12_DESCRIPTOR_RANGE_TYPE_UAV: return is_buffer ? VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; case D3D12_DESCRIPTOR_RANGE_TYPE_CBV: - return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + return vkd3d_bindless_state_get_cbv_descriptor_type(bindless_state); case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER: return VK_DESCRIPTOR_TYPE_SAMPLER; default: @@ -568,6 +568,7 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo 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_bindless_state *bindless_state = &root_signature->device->bindless_state; VkDescriptorSetLayoutBinding *vk_binding_info; struct vkd3d_shader_resource_binding binding; struct d3d12_root_descriptor_table *table; @@ -618,15 +619,13 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo if (d3d12_root_signature_descriptor_range_is_bindless(root_signature->device, range->RangeType)) { - if (vkd3d_bindless_state_find_binding(&root_signature->device->bindless_state, - range->RangeType, VKD3D_SHADER_BINDING_FLAG_BUFFER, &binding.binding)) + if (vkd3d_bindless_state_find_binding(bindless_state, range->RangeType, VKD3D_SHADER_BINDING_FLAG_BUFFER, &binding.binding)) { binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_BUFFER; table->first_binding[table->binding_count++] = binding; } - if (vkd3d_bindless_state_find_binding(&root_signature->device->bindless_state, - range->RangeType, VKD3D_SHADER_BINDING_FLAG_IMAGE, &binding.binding)) + if (vkd3d_bindless_state_find_binding(bindless_state, range->RangeType, VKD3D_SHADER_BINDING_FLAG_IMAGE, &binding.binding)) { binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_IMAGE; table->first_binding[table->binding_count++] = binding; @@ -644,7 +643,7 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo { VkDescriptorSetLayoutBinding vk_binding; vk_binding.binding = binding.binding.binding = context->vk_binding++; - vk_binding.descriptorType = vk_descriptor_type_from_d3d12_range_type(range->RangeType, true); + vk_binding.descriptorType = vk_descriptor_type_from_d3d12_range_type(bindless_state, range->RangeType, true); vk_binding.descriptorCount = 1; vk_binding.stageFlags = stage_flags_from_visibility(p->ShaderVisibility); vk_binding.pImmutableSamplers = NULL; @@ -663,7 +662,7 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo if (is_srv || is_uav) { vk_binding.binding = binding.binding.binding = context->vk_binding++; - vk_binding.descriptorType = vk_descriptor_type_from_d3d12_range_type(range->RangeType, false); + vk_binding.descriptorType = vk_descriptor_type_from_d3d12_range_type(bindless_state, range->RangeType, false); binding.flags = VKD3D_SHADER_BINDING_FLAG_IMAGE; table->first_binding[table->binding_count++] = binding; @@ -681,7 +680,7 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo { VkDescriptorSetLayoutBinding vk_binding; vk_binding.binding = binding.binding.binding = context->vk_binding++; - vk_binding.descriptorType = vk_descriptor_type_from_d3d12_range_type(range->RangeType, true); + vk_binding.descriptorType = vk_descriptor_type_from_d3d12_range_type(bindless_state, range->RangeType, true); vk_binding.descriptorCount = 1; vk_binding.stageFlags = stage_flags_from_visibility(p->ShaderVisibility); vk_binding.pImmutableSamplers = NULL; @@ -2822,6 +2821,8 @@ static HRESULT vkd3d_bindless_state_add_binding(struct vkd3d_bindless_state *bin VkDescriptorBindingFlagsEXT vk_binding_flags; VkResult vr; + set_info->vk_descriptor_type = vk_descriptor_type_from_d3d12_range_type(bindless_state, + range_type, binding_flag & VKD3D_SHADER_BINDING_FLAG_BUFFER); set_info->heap_type = d3d12_descriptor_heap_type_from_range_type(range_type); set_info->range_type = range_type; set_info->binding_flag = binding_flag; @@ -2837,8 +2838,7 @@ static HRESULT vkd3d_bindless_state_add_binding(struct vkd3d_bindless_state *bin vk_binding_flags_info.pBindingFlags = &vk_binding_flags; vk_binding_info.binding = 0; - vk_binding_info.descriptorType = vk_descriptor_type_from_d3d12_range_type(range_type, - binding_flag & VKD3D_SHADER_BINDING_FLAG_BUFFER); + vk_binding_info.descriptorType = set_info->vk_descriptor_type; vk_binding_info.descriptorCount = d3d12_max_descriptor_count_from_range_type(range_type); vk_binding_info.stageFlags = VK_SHADER_STAGE_ALL; vk_binding_info.pImmutableSamplers = NULL; @@ -2961,12 +2961,6 @@ bool vkd3d_bindless_state_find_binding(const struct vkd3d_bindless_state *bindle return false; } -VkDescriptorType vk_descriptor_type_from_bindless_set_info(const struct vkd3d_bindless_set_info *set_info) -{ - return vk_descriptor_type_from_d3d12_range_type(set_info->range_type, - set_info->binding_flag == VKD3D_SHADER_BINDING_FLAG_BUFFER); -} - static void vkd3d_uav_clear_pipelines_cleanup(struct vkd3d_uav_clear_pipelines *pipelines, struct d3d12_device *device) { diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 3382f829..bc2171b6 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -1180,6 +1180,7 @@ enum vkd3d_bindless_flags struct vkd3d_bindless_set_info { + VkDescriptorType vk_descriptor_type; D3D12_DESCRIPTOR_HEAP_TYPE heap_type; D3D12_DESCRIPTOR_RANGE_TYPE range_type; enum vkd3d_shader_binding_flag binding_flag; @@ -1203,7 +1204,12 @@ bool vkd3d_bindless_state_find_binding(const struct vkd3d_bindless_state *bindle D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag, struct vkd3d_shader_descriptor_binding *binding) DECLSPEC_HIDDEN; -VkDescriptorType vk_descriptor_type_from_bindless_set_info(const struct vkd3d_bindless_set_info *set_info) DECLSPEC_HIDDEN; +inline VkDescriptorType vkd3d_bindless_state_get_cbv_descriptor_type(const struct vkd3d_bindless_state *bindless_state) +{ + return bindless_state->flags & VKD3D_BINDLESS_CBV_AS_SSBO + ? VK_DESCRIPTOR_TYPE_STORAGE_BUFFER + : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; +} struct vkd3d_format_compatibility_list {