libs/vkd3d: Update descriptor table ranges only with matching descriptor types.

This commit is contained in:
Józef Kucia 2017-09-11 22:35:16 +02:00
parent a78fe60ef8
commit 8e802ed0af
3 changed files with 41 additions and 22 deletions

View File

@ -1764,11 +1764,15 @@ static void d3d12_command_list_prepare_descriptors(struct d3d12_command_list *li
}
static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_descriptor_write,
VkDescriptorImageInfo *vk_image_info, struct d3d12_desc *descriptor,
VkDescriptorSet vk_descriptor_set, uint32_t vk_binding, unsigned int index)
VkDescriptorImageInfo *vk_image_info, const struct d3d12_desc *descriptor,
uint32_t descriptor_range_magic, VkDescriptorSet vk_descriptor_set,
uint32_t vk_binding, unsigned int index)
{
const struct vkd3d_view *view = descriptor->u.view;
if (descriptor->magic != descriptor_range_magic)
return false;
vk_descriptor_write->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
vk_descriptor_write->pNext = NULL;
vk_descriptor_write->dstSet = vk_descriptor_set;
@ -1819,10 +1823,6 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des
vk_descriptor_write->pImageInfo = vk_image_info;
break;
case VKD3D_DESCRIPTOR_MAGIC_FREE:
TRACE("Descriptor %u not initialized.\n", vk_descriptor_write->dstBinding);
return false;
default:
ERR("Invalid descriptor %#x.\n", descriptor->magic);
return false;
@ -1881,7 +1881,7 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
unsigned int register_idx = range->base_register_idx + j;
/* Track UAV counters. */
if (range->type == D3D12_DESCRIPTOR_RANGE_TYPE_UAV
if (range->descriptor_magic == VKD3D_DESCRIPTOR_MAGIC_UAV
&& register_idx < ARRAY_SIZE(bindings->vk_uav_counter_views))
{
VkBufferView vk_counter_view = descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_UAV
@ -1892,7 +1892,8 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list
}
if (!vk_write_descriptor_set_from_d3d12_desc(current_descriptor_write,
current_image_info, descriptor, bindings->descriptor_set, range->binding, j))
current_image_info, descriptor, range->descriptor_magic,
bindings->descriptor_set, range->binding, j))
continue;
++descriptor_count;

View File

@ -632,12 +632,30 @@ static uint32_t d3d12_root_signature_assign_vk_bindings(struct d3d12_root_signat
return first_binding;
}
static uint32_t vkd3d_descriptor_magic_from_d3d12(D3D12_DESCRIPTOR_RANGE_TYPE type)
{
switch (type)
{
case D3D12_DESCRIPTOR_RANGE_TYPE_SRV:
return VKD3D_DESCRIPTOR_MAGIC_SRV;
case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
return VKD3D_DESCRIPTOR_MAGIC_UAV;
case D3D12_DESCRIPTOR_RANGE_TYPE_CBV:
return VKD3D_DESCRIPTOR_MAGIC_CBV;
case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER:
return VKD3D_DESCRIPTOR_MAGIC_SAMPLER;
default:
ERR("Invalid range type %#x.\n", type);
return VKD3D_DESCRIPTOR_MAGIC_FREE;
}
}
static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_root_signature *root_signature,
const D3D12_ROOT_SIGNATURE_DESC *desc, struct vkd3d_descriptor_set_context *context)
{
VkDescriptorSetLayoutBinding *cur_binding = context->current_binding;
const D3D12_DESCRIPTOR_RANGE *descriptor_range;
struct d3d12_root_descriptor_table *table;
const D3D12_DESCRIPTOR_RANGE *range;
unsigned int i, j, k, range_count;
uint32_t vk_binding;
@ -657,43 +675,43 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
for (j = 0; j < range_count; ++j)
{
descriptor_range = &p->u.DescriptorTable.pDescriptorRanges[j];
range = &p->u.DescriptorTable.pDescriptorRanges[j];
vk_binding = d3d12_root_signature_assign_vk_bindings(root_signature,
vkd3d_descriptor_type_from_d3d12_range_type(descriptor_range->RangeType),
descriptor_range->BaseShaderRegister, descriptor_range->NumDescriptors,
vkd3d_descriptor_type_from_d3d12_range_type(range->RangeType),
range->BaseShaderRegister, range->NumDescriptors,
false, true, context);
/* Unroll descriptor range. */
for (k = 0; k < descriptor_range->NumDescriptors; ++k)
for (k = 0; k < range->NumDescriptors; ++k)
{
uint32_t vk_current_binding = vk_binding + k;
if (descriptor_range->RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_SRV
|| descriptor_range->RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_UAV)
if (range->RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_SRV
|| range->RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_UAV)
{
vk_current_binding = vk_binding + 2 * k;
/* Assign binding for image view. */
if (!vk_binding_from_d3d12_descriptor_range(cur_binding,
descriptor_range, p->ShaderVisibility, false, vk_current_binding + 1))
range, p->ShaderVisibility, false, vk_current_binding + 1))
return E_NOTIMPL;
++cur_binding;
}
if (!vk_binding_from_d3d12_descriptor_range(cur_binding,
descriptor_range, p->ShaderVisibility, true, vk_current_binding))
range, p->ShaderVisibility, true, vk_current_binding))
return E_NOTIMPL;
++cur_binding;
}
table->ranges[j].offset = descriptor_range->OffsetInDescriptorsFromTableStart;
table->ranges[j].descriptor_count = descriptor_range->NumDescriptors;
table->ranges[j].offset = range->OffsetInDescriptorsFromTableStart;
table->ranges[j].descriptor_count = range->NumDescriptors;
table->ranges[j].binding = vk_binding;
table->ranges[j].type = descriptor_range->RangeType;
table->ranges[j].base_register_idx = descriptor_range->BaseShaderRegister;
table->ranges[j].descriptor_magic = vkd3d_descriptor_magic_from_d3d12(range->RangeType);
table->ranges[j].base_register_idx = range->BaseShaderRegister;
}
}

View File

@ -291,7 +291,7 @@ struct d3d12_root_descriptor_table_range
unsigned int descriptor_count;
uint32_t binding;
D3D12_DESCRIPTOR_RANGE_TYPE type;
uint32_t descriptor_magic;
unsigned int base_register_idx;
};