vkd3d: Store descriptor type with root descriptors.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
parent
1c76072819
commit
4841630876
|
@ -3139,39 +3139,25 @@ static void d3d12_command_list_update_descriptor_table_offsets(struct d3d12_comm
|
|||
|
||||
static bool vk_write_descriptor_set_from_root_descriptor(struct d3d12_command_list *list,
|
||||
VkWriteDescriptorSet *vk_descriptor_write, const struct d3d12_root_parameter *root_parameter,
|
||||
VkDescriptorSet vk_descriptor_set, const union vkd3d_descriptor_info *descriptors)
|
||||
VkDescriptorSet vk_descriptor_set, const struct vkd3d_root_descriptor_info *descriptors)
|
||||
{
|
||||
const union vkd3d_descriptor_info *descriptor = &descriptors[root_parameter->descriptor.packed_descriptor];
|
||||
bool is_defined;
|
||||
const struct vkd3d_root_descriptor_info *descriptor = &descriptors[root_parameter->descriptor.packed_descriptor];
|
||||
bool is_buffer, is_defined;
|
||||
|
||||
switch (root_parameter->parameter_type)
|
||||
{
|
||||
case D3D12_ROOT_PARAMETER_TYPE_CBV:
|
||||
vk_descriptor_write->descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
is_defined = !!descriptor->buffer.buffer;
|
||||
break;
|
||||
case D3D12_ROOT_PARAMETER_TYPE_SRV:
|
||||
vk_descriptor_write->descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
|
||||
is_defined = !!descriptor->buffer_view;
|
||||
break;
|
||||
case D3D12_ROOT_PARAMETER_TYPE_UAV:
|
||||
vk_descriptor_write->descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
|
||||
is_defined = !!descriptor->buffer_view;
|
||||
break;
|
||||
default:
|
||||
ERR("Invalid root descriptor %#x.\n", root_parameter->parameter_type);
|
||||
return false;
|
||||
}
|
||||
is_buffer = descriptor->vk_descriptor_type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
|
||||
|| descriptor->vk_descriptor_type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
|
||||
is_defined = is_buffer ? !!descriptor->info.buffer.buffer : !!descriptor->info.buffer_view;
|
||||
|
||||
vk_descriptor_write->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
vk_descriptor_write->pNext = NULL;
|
||||
vk_descriptor_write->dstSet = vk_descriptor_set;
|
||||
vk_descriptor_write->dstBinding = root_parameter->descriptor.binding->binding.binding;
|
||||
vk_descriptor_write->dstArrayElement = 0;
|
||||
vk_descriptor_write->descriptorType = descriptor->vk_descriptor_type;
|
||||
vk_descriptor_write->descriptorCount = 1;
|
||||
vk_descriptor_write->pImageInfo = NULL;
|
||||
vk_descriptor_write->pBufferInfo = &descriptor->buffer;
|
||||
vk_descriptor_write->pTexelBufferView = &descriptor->buffer_view;
|
||||
vk_descriptor_write->pBufferInfo = &descriptor->info.buffer;
|
||||
vk_descriptor_write->pTexelBufferView = &descriptor->info.buffer_view;
|
||||
return is_defined || list->device->device_info.robustness2_features.nullDescriptor;
|
||||
}
|
||||
|
||||
|
@ -5225,7 +5211,7 @@ static void d3d12_command_list_set_root_descriptor(struct d3d12_command_list *li
|
|||
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
|
||||
const struct vkd3d_vulkan_info *vk_info = &list->device->vk_info;
|
||||
const struct d3d12_root_parameter *root_parameter;
|
||||
union vkd3d_descriptor_info *descriptor;
|
||||
struct vkd3d_root_descriptor_info *descriptor;
|
||||
struct d3d12_resource *resource;
|
||||
VkBufferView vk_buffer_view;
|
||||
bool null_descriptors;
|
||||
|
@ -5236,29 +5222,34 @@ static void d3d12_command_list_set_root_descriptor(struct d3d12_command_list *li
|
|||
|
||||
if (root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_CBV)
|
||||
{
|
||||
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
|
||||
if (gpu_address)
|
||||
{
|
||||
resource = vkd3d_gpu_va_allocator_dereference(&list->device->gpu_va_allocator, gpu_address);
|
||||
descriptor->buffer.buffer = resource->vk_buffer;
|
||||
descriptor->buffer.offset = gpu_address - resource->gpu_address;
|
||||
descriptor->buffer.range = min(resource->desc.Width - descriptor->buffer.offset,
|
||||
descriptor->info.buffer.buffer = resource->vk_buffer;
|
||||
descriptor->info.buffer.offset = gpu_address - resource->gpu_address;
|
||||
descriptor->info.buffer.range = min(resource->desc.Width - descriptor->info.buffer.offset,
|
||||
vk_info->device_limits.maxUniformBufferRange);
|
||||
}
|
||||
else if (null_descriptors)
|
||||
{
|
||||
descriptor->buffer.buffer = VK_NULL_HANDLE;
|
||||
descriptor->buffer.offset = 0;
|
||||
descriptor->buffer.range = 0;
|
||||
descriptor->info.buffer.buffer = VK_NULL_HANDLE;
|
||||
descriptor->info.buffer.offset = 0;
|
||||
descriptor->info.buffer.range = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
descriptor->buffer.buffer = list->device->null_resources.vk_buffer;
|
||||
descriptor->buffer.offset = 0;
|
||||
descriptor->buffer.range = VK_WHOLE_SIZE;
|
||||
descriptor->info.buffer.buffer = list->device->null_resources.vk_buffer;
|
||||
descriptor->info.buffer.offset = 0;
|
||||
descriptor->info.buffer.range = VK_WHOLE_SIZE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
descriptor->vk_descriptor_type = root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_SRV
|
||||
? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
|
||||
|
||||
if (gpu_address)
|
||||
{
|
||||
if (!vkd3d_create_raw_buffer_view(list->device, gpu_address, &vk_buffer_view))
|
||||
|
@ -5274,15 +5265,15 @@ static void d3d12_command_list_set_root_descriptor(struct d3d12_command_list *li
|
|||
return;
|
||||
}
|
||||
|
||||
descriptor->buffer_view = vk_buffer_view;
|
||||
descriptor->info.buffer_view = vk_buffer_view;
|
||||
}
|
||||
else if (null_descriptors)
|
||||
{
|
||||
descriptor->buffer_view = VK_NULL_HANDLE;
|
||||
descriptor->info.buffer_view = VK_NULL_HANDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
descriptor->buffer_view = root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_SRV
|
||||
descriptor->info.buffer_view = root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_SRV
|
||||
? list->device->null_resources.vk_buffer_view
|
||||
: list->device->null_resources.vk_storage_buffer_view;
|
||||
}
|
||||
|
|
|
@ -1182,6 +1182,12 @@ union vkd3d_descriptor_info
|
|||
VkDescriptorImageInfo image;
|
||||
};
|
||||
|
||||
struct vkd3d_root_descriptor_info
|
||||
{
|
||||
VkDescriptorType vk_descriptor_type;
|
||||
union vkd3d_descriptor_info info;
|
||||
};
|
||||
|
||||
struct vkd3d_pipeline_bindings
|
||||
{
|
||||
const struct d3d12_root_signature *root_signature;
|
||||
|
@ -1194,7 +1200,7 @@ struct vkd3d_pipeline_bindings
|
|||
uint64_t descriptor_heap_dirty_mask;
|
||||
|
||||
/* Needed when VK_KHR_push_descriptor is not available. */
|
||||
union vkd3d_descriptor_info root_descriptors[D3D12_MAX_ROOT_COST / 2];
|
||||
struct vkd3d_root_descriptor_info root_descriptors[D3D12_MAX_ROOT_COST / 2];
|
||||
uint64_t root_descriptor_dirty_mask;
|
||||
uint64_t root_descriptor_active_mask;
|
||||
|
||||
|
|
Loading…
Reference in New Issue