vkd3d: Adjust descriptor types if CBV_AS_SSBO is set.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
parent
3709ae1dd8
commit
fda155b965
|
@ -2730,7 +2730,7 @@ void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
|
||||||
}
|
}
|
||||||
|
|
||||||
descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_CBV;
|
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)
|
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)
|
if (set_info->heap_type == descriptor_heap->desc.Type)
|
||||||
{
|
{
|
||||||
VkDescriptorPoolSize *vk_pool_size = &vk_pool_sizes[pool_count++];
|
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;
|
vk_pool_size->descriptorCount = descriptor_heap->desc.NumDescriptors;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
static VkDescriptorType vk_descriptor_type_from_d3d12_range_type(const struct vkd3d_bindless_state *bindless_state,
|
||||||
bool is_buffer)
|
D3D12_DESCRIPTOR_RANGE_TYPE type, bool is_buffer)
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
|
@ -221,7 +221,7 @@ static VkDescriptorType vk_descriptor_type_from_d3d12_range_type(D3D12_DESCRIPTO
|
||||||
case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
|
case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
|
||||||
return is_buffer ? VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
|
return is_buffer ? VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
|
||||||
case D3D12_DESCRIPTOR_RANGE_TYPE_CBV:
|
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:
|
case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER:
|
||||||
return VK_DESCRIPTOR_TYPE_SAMPLER;
|
return VK_DESCRIPTOR_TYPE_SAMPLER;
|
||||||
default:
|
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,
|
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)
|
||||||
{
|
{
|
||||||
|
struct vkd3d_bindless_state *bindless_state = &root_signature->device->bindless_state;
|
||||||
VkDescriptorSetLayoutBinding *vk_binding_info;
|
VkDescriptorSetLayoutBinding *vk_binding_info;
|
||||||
struct vkd3d_shader_resource_binding binding;
|
struct vkd3d_shader_resource_binding binding;
|
||||||
struct d3d12_root_descriptor_table *table;
|
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 (d3d12_root_signature_descriptor_range_is_bindless(root_signature->device, range->RangeType))
|
||||||
{
|
{
|
||||||
if (vkd3d_bindless_state_find_binding(&root_signature->device->bindless_state,
|
if (vkd3d_bindless_state_find_binding(bindless_state, range->RangeType, VKD3D_SHADER_BINDING_FLAG_BUFFER, &binding.binding))
|
||||||
range->RangeType, VKD3D_SHADER_BINDING_FLAG_BUFFER, &binding.binding))
|
|
||||||
{
|
{
|
||||||
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_BUFFER;
|
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_BUFFER;
|
||||||
table->first_binding[table->binding_count++] = binding;
|
table->first_binding[table->binding_count++] = binding;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vkd3d_bindless_state_find_binding(&root_signature->device->bindless_state,
|
if (vkd3d_bindless_state_find_binding(bindless_state, range->RangeType, VKD3D_SHADER_BINDING_FLAG_IMAGE, &binding.binding))
|
||||||
range->RangeType, VKD3D_SHADER_BINDING_FLAG_IMAGE, &binding.binding))
|
|
||||||
{
|
{
|
||||||
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_IMAGE;
|
binding.flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_IMAGE;
|
||||||
table->first_binding[table->binding_count++] = binding;
|
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;
|
VkDescriptorSetLayoutBinding vk_binding;
|
||||||
vk_binding.binding = binding.binding.binding = context->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.descriptorCount = 1;
|
||||||
vk_binding.stageFlags = stage_flags_from_visibility(p->ShaderVisibility);
|
vk_binding.stageFlags = stage_flags_from_visibility(p->ShaderVisibility);
|
||||||
vk_binding.pImmutableSamplers = NULL;
|
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)
|
if (is_srv || is_uav)
|
||||||
{
|
{
|
||||||
vk_binding.binding = binding.binding.binding = context->vk_binding++;
|
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;
|
binding.flags = VKD3D_SHADER_BINDING_FLAG_IMAGE;
|
||||||
|
|
||||||
table->first_binding[table->binding_count++] = binding;
|
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;
|
VkDescriptorSetLayoutBinding vk_binding;
|
||||||
vk_binding.binding = binding.binding.binding = context->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.descriptorCount = 1;
|
||||||
vk_binding.stageFlags = stage_flags_from_visibility(p->ShaderVisibility);
|
vk_binding.stageFlags = stage_flags_from_visibility(p->ShaderVisibility);
|
||||||
vk_binding.pImmutableSamplers = NULL;
|
vk_binding.pImmutableSamplers = NULL;
|
||||||
|
@ -2822,6 +2821,8 @@ static HRESULT vkd3d_bindless_state_add_binding(struct vkd3d_bindless_state *bin
|
||||||
VkDescriptorBindingFlagsEXT vk_binding_flags;
|
VkDescriptorBindingFlagsEXT vk_binding_flags;
|
||||||
VkResult vr;
|
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->heap_type = d3d12_descriptor_heap_type_from_range_type(range_type);
|
||||||
set_info->range_type = range_type;
|
set_info->range_type = range_type;
|
||||||
set_info->binding_flag = binding_flag;
|
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_flags_info.pBindingFlags = &vk_binding_flags;
|
||||||
|
|
||||||
vk_binding_info.binding = 0;
|
vk_binding_info.binding = 0;
|
||||||
vk_binding_info.descriptorType = vk_descriptor_type_from_d3d12_range_type(range_type,
|
vk_binding_info.descriptorType = set_info->vk_descriptor_type;
|
||||||
binding_flag & VKD3D_SHADER_BINDING_FLAG_BUFFER);
|
|
||||||
vk_binding_info.descriptorCount = d3d12_max_descriptor_count_from_range_type(range_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.stageFlags = VK_SHADER_STAGE_ALL;
|
||||||
vk_binding_info.pImmutableSamplers = NULL;
|
vk_binding_info.pImmutableSamplers = NULL;
|
||||||
|
@ -2961,12 +2961,6 @@ bool vkd3d_bindless_state_find_binding(const struct vkd3d_bindless_state *bindle
|
||||||
return false;
|
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,
|
static void vkd3d_uav_clear_pipelines_cleanup(struct vkd3d_uav_clear_pipelines *pipelines,
|
||||||
struct d3d12_device *device)
|
struct d3d12_device *device)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1180,6 +1180,7 @@ enum vkd3d_bindless_flags
|
||||||
|
|
||||||
struct vkd3d_bindless_set_info
|
struct vkd3d_bindless_set_info
|
||||||
{
|
{
|
||||||
|
VkDescriptorType vk_descriptor_type;
|
||||||
D3D12_DESCRIPTOR_HEAP_TYPE heap_type;
|
D3D12_DESCRIPTOR_HEAP_TYPE heap_type;
|
||||||
D3D12_DESCRIPTOR_RANGE_TYPE range_type;
|
D3D12_DESCRIPTOR_RANGE_TYPE range_type;
|
||||||
enum vkd3d_shader_binding_flag binding_flag;
|
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,
|
D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag,
|
||||||
struct vkd3d_shader_descriptor_binding *binding) DECLSPEC_HIDDEN;
|
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
|
struct vkd3d_format_compatibility_list
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue