mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
libs/vkd3d: Update descriptor table ranges only with matching descriptor types.
This commit is contained in:
parent
a78fe60ef8
commit
8e802ed0af
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user