vkd3d: Fix root descriptor indexing.

The packed descriptor index is no longer needed, and causes issues in
case a game sets a root signature, then binds a root descriptor, and
then sets a different root signature which maps the given root parameter
index to a different descriptor since we may now read undefined data
when updating push descriptors.

Fixes #366.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-11-06 15:19:59 +01:00 committed by Hans-Kristian Arntzen
parent 6b37d36de4
commit 408fed0910
3 changed files with 4 additions and 11 deletions

View File

@ -3132,9 +3132,8 @@ 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 struct vkd3d_root_descriptor_info *descriptors)
VkDescriptorSet vk_descriptor_set, const struct vkd3d_root_descriptor_info *descriptor)
{
const struct vkd3d_root_descriptor_info *descriptor = &descriptors[root_parameter->descriptor.packed_descriptor];
bool is_buffer, is_defined;
is_buffer = descriptor->vk_descriptor_type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
@ -3309,7 +3308,7 @@ static void d3d12_command_list_update_root_descriptors(struct d3d12_command_list
if (!vk_write_descriptor_set_from_root_descriptor(list,
&descriptor_writes[descriptor_write_count], root_parameter,
descriptor_set, bindings->root_descriptors))
descriptor_set, &bindings->root_descriptors[root_parameter_index]))
continue;
descriptor_write_count += 1;
@ -5164,7 +5163,7 @@ static void d3d12_command_list_set_root_descriptor(struct d3d12_command_list *li
ssbo = d3d12_device_use_ssbo_root_descriptors(list->device);
root_parameter = root_signature_get_root_descriptor(root_signature, index);
descriptor = &bindings->root_descriptors[root_parameter->descriptor.packed_descriptor];
descriptor = &bindings->root_descriptors[index];
null_descriptors = list->device->device_info.robustness2_features.nullDescriptor;
if (ssbo || root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_CBV)

View File

@ -482,7 +482,6 @@ static HRESULT d3d12_root_signature_init_push_constants(struct d3d12_root_signat
struct vkd3d_descriptor_set_context
{
uint32_t packed_descriptor_index;
uint32_t binding_index;
uint32_t vk_set;
uint32_t vk_binding;
@ -665,9 +664,7 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign
param = &root_signature->parameters[i];
param->parameter_type = p->ParameterType;
param->descriptor.binding = binding;
param->descriptor.packed_descriptor = context->packed_descriptor_index;
context->packed_descriptor_index += 1;
context->binding_index += 1;
context->vk_binding += 1;
}
@ -821,7 +818,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
set_layouts[context.vk_set] = root_signature->vk_sampler_descriptor_layout;
root_signature->sampler_descriptor_set = context.vk_set;
context.packed_descriptor_index = 0;
context.vk_binding = 0;
context.vk_set += 1;
}
@ -880,7 +876,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
set_layouts[context.vk_set] = root_signature->vk_root_descriptor_layout;
root_signature->root_descriptor_set = context.vk_set;
context.packed_descriptor_index = 0;
context.vk_binding = 0;
context.vk_set += 1;
}

View File

@ -818,7 +818,6 @@ struct d3d12_root_constant
struct d3d12_root_descriptor
{
struct vkd3d_shader_resource_binding *binding;
uint32_t packed_descriptor;
};
struct d3d12_root_parameter
@ -1200,7 +1199,7 @@ struct vkd3d_pipeline_bindings
uint64_t descriptor_heap_dirty_mask;
/* Needed when VK_KHR_push_descriptor is not available. */
struct vkd3d_root_descriptor_info root_descriptors[D3D12_MAX_ROOT_COST / 2];
struct vkd3d_root_descriptor_info root_descriptors[D3D12_MAX_ROOT_COST];
uint64_t root_descriptor_dirty_mask;
uint64_t root_descriptor_active_mask;