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:
parent
6b37d36de4
commit
408fed0910
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue