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:
Philip Rebohle 2020-03-18 13:40:37 +01:00 committed by Hans-Kristian Arntzen
parent 3709ae1dd8
commit fda155b965
3 changed files with 21 additions and 21 deletions

View File

@ -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;
}
}

View File

@ -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)
{

View File

@ -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
{