vkd3d: Move bindless SSBO out of MUTABLE set and fill both descriptors.

We will need separate descriptor sets to be able to handle typed vs
untyped buffer workarounds.

Also writes multiple descriptors for buffers views to make sure MUTABLE
and SSBO sets are filled (or TEXEL_BUFFER + SSBO for non-mutable).

Applications often get this wrong and use raw buffer in shader where
typed view was written and vice versa.
To mitigate this, just write a typed and untyped view together.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2021-01-13 14:17:05 +01:00
parent 6bddcb4352
commit 97e0d8e751
3 changed files with 160 additions and 151 deletions

View File

@ -3476,7 +3476,7 @@ static void d3d12_desc_copy_single(struct d3d12_desc *dst, struct d3d12_desc *sr
{
needs_update = true;
}
else if ((metadata.flags & VKD3D_DESCRIPTOR_FLAG_VIEW) == 0)
else if (metadata.flags & VKD3D_DESCRIPTOR_FLAG_OFFSET_RANGE)
{
needs_update =
dst->info.buffer.offset != src->info.buffer.offset ||
@ -4064,7 +4064,7 @@ void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
descriptor->metadata.cookie = resource ? resource->cookie : 0;
descriptor->metadata.set_info_mask = 1u << info_index;
descriptor->metadata.flags = 0;
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_OFFSET_RANGE;
descriptor->info.buffer = descriptor_info.buffer;
vkd3d_init_write_descriptor_set(&vk_write, descriptor,
@ -4087,20 +4087,11 @@ static unsigned int vkd3d_view_flags_from_d3d12_buffer_srv_flags(D3D12_BUFFER_SR
return 0;
}
static bool vkd3d_buffer_srv_use_raw_ssbo(struct d3d12_device *device,
const D3D12_SHADER_RESOURCE_VIEW_DESC *desc)
{
bool raw = !!(desc->Buffer.Flags & D3D12_BUFFER_SRV_FLAG_RAW);
return d3d12_device_use_ssbo_raw_buffer(device) &&
((desc->Format == DXGI_FORMAT_UNKNOWN && desc->Buffer.StructureByteStride) || raw);
}
static void vkd3d_buffer_view_get_bound_range_ssbo(struct d3d12_desc *descriptor,
struct d3d12_device *device, struct d3d12_resource *resource,
VkDeviceSize offset, VkDeviceSize range, VkDescriptorBufferInfo *vk_buffer)
VkDeviceSize offset, VkDeviceSize range, VkDescriptorBufferInfo *vk_buffer,
struct vkd3d_bound_buffer_range *bound_range)
{
struct vkd3d_bound_buffer_range ssbo_range;
if (resource)
{
VkDeviceSize alignment = d3d12_device_get_ssbo_alignment(device);
@ -4112,8 +4103,8 @@ static void vkd3d_buffer_view_get_bound_range_ssbo(struct d3d12_desc *descriptor
vk_buffer->offset = resource->heap_offset + aligned_begin;
vk_buffer->range = aligned_end - aligned_begin;
ssbo_range.byte_offset = offset - aligned_begin;
ssbo_range.byte_count = range;
bound_range->byte_offset = offset - aligned_begin;
bound_range->byte_count = range;
}
else
{
@ -4121,17 +4112,8 @@ static void vkd3d_buffer_view_get_bound_range_ssbo(struct d3d12_desc *descriptor
vk_buffer->offset = 0;
vk_buffer->range = VK_WHOLE_SIZE;
ssbo_range.byte_offset = 0;
ssbo_range.byte_count = 0;
}
ssbo_range.element_offset = 0;
ssbo_range.element_count = 0;
if (device->bindless_state.flags & VKD3D_SSBO_OFFSET_BUFFER)
{
struct vkd3d_bound_buffer_range *buffer_ranges = descriptor->heap->buffer_ranges.host_ptr;
buffer_ranges[descriptor->heap_offset] = ssbo_range;
bound_range->byte_offset = 0;
bound_range->byte_count = 0;
}
}
@ -4139,9 +4121,9 @@ static bool vkd3d_buffer_view_get_aligned_view(struct d3d12_desc *descriptor,
struct d3d12_device *device, struct d3d12_resource *resource,
DXGI_FORMAT format, unsigned int vk_flags,
VkDeviceSize first_element, VkDeviceSize num_elements,
VkDeviceSize structured_stride, struct vkd3d_view **view)
VkDeviceSize structured_stride, struct vkd3d_bound_buffer_range *bound_range,
struct vkd3d_view **view)
{
struct vkd3d_bound_buffer_range typed_range = { 0, 0, 0, 0 };
const struct vkd3d_format *vkd3d_format;
VkDeviceSize max_resource_elements;
VkDeviceSize max_element_headroom;
@ -4184,13 +4166,13 @@ static bool vkd3d_buffer_view_get_aligned_view(struct d3d12_desc *descriptor,
{
FIXME("Application is attempting to use more elements in a typed buffer (%llu) than supported by device (%llu).\n",
(unsigned long long)num_elements, (unsigned long long)max_elements);
typed_range.element_offset = 0;
typed_range.element_count = num_elements;
bound_range->element_offset = 0;
bound_range->element_count = num_elements;
}
else if (num_elements >= max_resource_elements)
{
typed_range.element_offset = 0;
typed_range.element_count = num_elements;
bound_range->element_offset = 0;
bound_range->element_count = num_elements;
}
else
{
@ -4204,15 +4186,12 @@ static bool vkd3d_buffer_view_get_aligned_view(struct d3d12_desc *descriptor,
end_range = (first_element + num_elements + element_align - 1) & ~(element_align - 1);
end_range = min(end_range, max_resource_elements);
typed_range.element_offset = first_element - begin_range;
typed_range.element_count = num_elements;
bound_range->element_offset = first_element - begin_range;
bound_range->element_count = num_elements;
first_element = begin_range;
num_elements = end_range - begin_range;
}
typed_range.byte_offset = typed_range.element_offset * element_size;
typed_range.byte_count = typed_range.element_count * element_size;
}
if (!vkd3d_create_buffer_view_for_resource(device, resource, format,
@ -4220,12 +4199,6 @@ static bool vkd3d_buffer_view_get_aligned_view(struct d3d12_desc *descriptor,
structured_stride, vk_flags, view))
return false;
if (device->bindless_state.flags & VKD3D_TYPED_OFFSET_BUFFER)
{
struct vkd3d_bound_buffer_range *buffer_ranges = descriptor->heap->buffer_ranges.host_ptr;
buffer_ranges[descriptor->heap_offset] = typed_range;
}
return true;
}
@ -4235,10 +4208,12 @@ static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor,
{
struct vkd3d_null_resources *null_resources = &device->null_resources;
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
union vkd3d_descriptor_info descriptor_info;
struct vkd3d_bound_buffer_range bound_range = { 0, 0, 0, 0 };
union vkd3d_descriptor_info descriptor_info[2];
VkDescriptorType vk_descriptor_type;
VkWriteDescriptorSet vk_write[2];
struct vkd3d_view *view = NULL;
VkWriteDescriptorSet vk_write;
uint32_t vk_write_count = 0;
struct vkd3d_view_key key;
uint32_t info_index;
@ -4254,73 +4229,92 @@ static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor,
return;
}
if (vkd3d_buffer_srv_use_raw_ssbo(device, desc))
descriptor->metadata.set_info_mask = 0;
descriptor->metadata.flags = 0;
if (d3d12_device_use_ssbo_raw_buffer(device))
{
VkDeviceSize stride = desc->Format == DXGI_FORMAT_UNKNOWN
? desc->Buffer.StructureByteStride : sizeof(uint32_t);
? desc->Buffer.StructureByteStride :
vkd3d_get_format(device, desc->Format, false)->byte_count;
vkd3d_buffer_view_get_bound_range_ssbo(descriptor, device, resource,
desc->Buffer.FirstElement * stride, desc->Buffer.NumElements * stride,
&descriptor_info.buffer);
&descriptor_info[vk_write_count].buffer, &bound_range);
info_index = vkd3d_bindless_state_find_set_info_index(&device->bindless_state,
VKD3D_BINDLESS_SET_SRV | VKD3D_BINDLESS_SET_RAW_SSBO);
descriptor->info.buffer = descriptor_info.buffer;
descriptor->info.buffer = descriptor_info[vk_write_count].buffer;
descriptor->metadata.cookie = resource ? resource->cookie : 0;
descriptor->metadata.set_info_mask = 1u << info_index;
descriptor->metadata.flags = 0;
descriptor->metadata.set_info_mask |= 1u << info_index;
descriptor->metadata.flags |= VKD3D_DESCRIPTOR_FLAG_OFFSET_RANGE;
if (device->bindless_state.flags & VKD3D_SSBO_OFFSET_BUFFER)
descriptor->metadata.flags |= VKD3D_DESCRIPTOR_FLAG_BUFFER_OFFSET;
vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
vkd3d_init_write_descriptor_set(&vk_write[vk_write_count], descriptor,
vkd3d_bindless_state_binding_from_info_index(&device->bindless_state, info_index),
vk_descriptor_type, &descriptor_info[vk_write_count]);
vk_write_count++;
}
else
if (resource)
{
if (resource)
{
unsigned int vk_flags = vkd3d_view_flags_from_d3d12_buffer_srv_flags(desc->Buffer.Flags);
if (!vkd3d_buffer_view_get_aligned_view(descriptor, device, resource, desc->Format, vk_flags,
desc->Buffer.FirstElement, desc->Buffer.NumElements, desc->Buffer.StructureByteStride, &view))
return;
}
else if (!device->device_info.robustness2_features.nullDescriptor)
{
key.view_type = VKD3D_VIEW_TYPE_BUFFER;
key.u.buffer.buffer = null_resources->vk_buffer;
key.u.buffer.format = vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false);
key.u.buffer.offset = 0;
key.u.buffer.size = VKD3D_NULL_BUFFER_SIZE;
unsigned int vk_flags = vkd3d_view_flags_from_d3d12_buffer_srv_flags(desc->Buffer.Flags);
if (!vkd3d_buffer_view_get_aligned_view(descriptor, device, resource, desc->Format, vk_flags,
desc->Buffer.FirstElement, desc->Buffer.NumElements, desc->Buffer.StructureByteStride,
&bound_range, &view))
return;
}
else if (!device->device_info.robustness2_features.nullDescriptor)
{
key.view_type = VKD3D_VIEW_TYPE_BUFFER;
key.u.buffer.buffer = null_resources->vk_buffer;
key.u.buffer.format = vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false);
key.u.buffer.offset = 0;
key.u.buffer.size = VKD3D_NULL_BUFFER_SIZE;
if (!(view = vkd3d_view_map_create_view(&device->null_resources.view_map, device, &key)))
return;
}
descriptor_info.buffer_view = view ? view->vk_buffer_view : VK_NULL_HANDLE;
info_index = vkd3d_bindless_state_find_set_info_index(&device->bindless_state,
VKD3D_BINDLESS_SET_SRV | VKD3D_BINDLESS_SET_BUFFER);
descriptor->info.view = view;
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_info_mask = 1u << info_index;
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_VIEW;
if (device->bindless_state.flags & VKD3D_TYPED_OFFSET_BUFFER)
descriptor->metadata.flags |= VKD3D_DESCRIPTOR_FLAG_BUFFER_OFFSET;
vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
if (!(view = vkd3d_view_map_create_view(&device->null_resources.view_map, device, &key)))
return;
}
vkd3d_init_write_descriptor_set(&vk_write, descriptor,
descriptor_info[vk_write_count].buffer_view = view ? view->vk_buffer_view : VK_NULL_HANDLE;
info_index = vkd3d_bindless_state_find_set_info_index(&device->bindless_state,
VKD3D_BINDLESS_SET_SRV | VKD3D_BINDLESS_SET_BUFFER);
descriptor->info.view = view;
/* Typed cookie takes precedence over raw cookie.
* The typed cookie is more unique than raw cookie,
* since raw cookie is just the ID3D12Resource. */
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_info_mask |= 1u << info_index;
descriptor->metadata.flags |= VKD3D_DESCRIPTOR_FLAG_VIEW;
if (device->bindless_state.flags & VKD3D_TYPED_OFFSET_BUFFER)
descriptor->metadata.flags |= VKD3D_DESCRIPTOR_FLAG_BUFFER_OFFSET;
vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
vkd3d_init_write_descriptor_set(&vk_write[vk_write_count], descriptor,
vkd3d_bindless_state_binding_from_info_index(&device->bindless_state, info_index),
vk_descriptor_type, &descriptor_info);
vk_descriptor_type, &descriptor_info[vk_write_count]);
vk_write_count++;
if (descriptor->metadata.flags & VKD3D_DESCRIPTOR_FLAG_BUFFER_OFFSET)
{
struct vkd3d_bound_buffer_range *buffer_ranges = descriptor->heap->buffer_ranges.host_ptr;
buffer_ranges[descriptor->heap_offset] = bound_range;
}
#ifdef VKD3D_ENABLE_DESCRIPTOR_QA
vkd3d_descriptor_debug_write_descriptor(descriptor->heap, descriptor->heap_offset, vk_write.descriptorType, descriptor->metadata.cookie);
vkd3d_descriptor_debug_write_descriptor(descriptor->heap, descriptor->heap_offset, vk_descriptor_type, descriptor->metadata.cookie);
#endif
VK_CALL(vkUpdateDescriptorSets(device->vk_device, 1, &vk_write, 0, NULL));
if (vk_write_count)
VK_CALL(vkUpdateDescriptorSets(device->vk_device, vk_write_count, vk_write, 0, NULL));
}
static void vkd3d_create_texture_srv(struct d3d12_desc *descriptor,
@ -4538,25 +4532,18 @@ VkDeviceAddress vkd3d_get_buffer_device_address(struct d3d12_device *device, VkB
return VK_CALL(vkGetBufferDeviceAddressKHR(device->vk_device, &address_info));
}
static bool vkd3d_buffer_uav_use_raw_ssbo(struct d3d12_device *device,
const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc)
{
bool raw = !!(desc->Buffer.Flags & D3D12_BUFFER_UAV_FLAG_RAW);
return d3d12_device_use_ssbo_raw_buffer(device) &&
((desc->Format == DXGI_FORMAT_UNKNOWN && desc->Buffer.StructureByteStride) || raw);
}
static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_device *device,
struct d3d12_resource *resource, struct d3d12_resource *counter_resource,
const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc)
{
struct vkd3d_null_resources *null_resources = &device->null_resources;
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
union vkd3d_descriptor_info descriptor_info[2];
struct vkd3d_bound_buffer_range bound_range = { 0, 0, 0, 0 };
union vkd3d_descriptor_info descriptor_info[3];
unsigned int flags, vk_write_count = 0;
VkDescriptorType vk_descriptor_type;
VkDeviceAddress uav_counter_address;
VkWriteDescriptorSet vk_write[2];
VkWriteDescriptorSet vk_write[3];
struct vkd3d_view *view = NULL;
VkBufferView uav_counter_view;
struct vkd3d_view_key key;
@ -4577,74 +4564,92 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_
/* Handle UAV itself */
flags = vkd3d_view_flags_from_d3d12_buffer_uav_flags(desc->Buffer.Flags);
if (vkd3d_buffer_uav_use_raw_ssbo(device, desc))
descriptor->metadata.set_info_mask = 0;
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_UAV_COUNTER;
if (d3d12_device_use_ssbo_raw_buffer(device))
{
VkDescriptorBufferInfo *buffer_info = &descriptor_info[vk_write_count].buffer;
VkDeviceSize stride = desc->Format == DXGI_FORMAT_UNKNOWN
? desc->Buffer.StructureByteStride : sizeof(uint32_t);
? desc->Buffer.StructureByteStride :
vkd3d_get_format(device, desc->Format, false)->byte_count;
vkd3d_buffer_view_get_bound_range_ssbo(descriptor, device, resource,
desc->Buffer.FirstElement * stride, desc->Buffer.NumElements * stride,
buffer_info);
buffer_info, &bound_range);
info_index = vkd3d_bindless_state_find_set_info_index(&device->bindless_state,
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_RAW_SSBO);
descriptor->info.buffer = *buffer_info;
descriptor->metadata.cookie = resource ? resource->cookie : 0;
descriptor->metadata.set_info_mask = 1u << info_index;
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_UAV_COUNTER;
descriptor->metadata.set_info_mask |= 1u << info_index;
descriptor->metadata.flags |= VKD3D_DESCRIPTOR_FLAG_OFFSET_RANGE;
if (device->bindless_state.flags & VKD3D_SSBO_OFFSET_BUFFER)
descriptor->metadata.flags |= VKD3D_DESCRIPTOR_FLAG_BUFFER_OFFSET;
vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
vkd3d_init_write_descriptor_set(&vk_write[vk_write_count], descriptor,
vkd3d_bindless_state_binding_from_info_index(&device->bindless_state, info_index),
vk_descriptor_type, &descriptor_info[vk_write_count]);
vk_write_count++;
}
else
if (resource)
{
if (resource)
{
if (!vkd3d_buffer_view_get_aligned_view(descriptor, device, resource, desc->Format, flags,
desc->Buffer.FirstElement, desc->Buffer.NumElements,
desc->Buffer.StructureByteStride, &view))
return;
}
else if (!device->device_info.robustness2_features.nullDescriptor)
{
key.view_type = VKD3D_VIEW_TYPE_BUFFER;
key.u.buffer.buffer = null_resources->vk_storage_buffer;
key.u.buffer.format = vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false);
key.u.buffer.offset = 0;
key.u.buffer.size = VKD3D_NULL_BUFFER_SIZE;
if (!vkd3d_buffer_view_get_aligned_view(descriptor, device, resource, desc->Format, flags,
desc->Buffer.FirstElement, desc->Buffer.NumElements,
desc->Buffer.StructureByteStride, &bound_range, &view))
return;
}
else if (!device->device_info.robustness2_features.nullDescriptor)
{
key.view_type = VKD3D_VIEW_TYPE_BUFFER;
key.u.buffer.buffer = null_resources->vk_storage_buffer;
key.u.buffer.format = vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false);
key.u.buffer.offset = 0;
key.u.buffer.size = VKD3D_NULL_BUFFER_SIZE;
if (!(view = vkd3d_view_map_create_view(&device->null_resources.view_map, device, &key)))
return;
}
info_index = vkd3d_bindless_state_find_set_info_index(&device->bindless_state,
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_BUFFER);
descriptor->info.view = view;
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_info_mask = 1u << info_index;
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_VIEW | VKD3D_DESCRIPTOR_FLAG_UAV_COUNTER;
if (device->bindless_state.flags & VKD3D_TYPED_OFFSET_BUFFER)
descriptor->metadata.flags |= VKD3D_DESCRIPTOR_FLAG_BUFFER_OFFSET;
descriptor_info[vk_write_count].buffer_view = view ? view->vk_buffer_view : VK_NULL_HANDLE;
vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
if (!(view = vkd3d_view_map_create_view(&device->null_resources.view_map, device, &key)))
return;
}
#ifdef VKD3D_ENABLE_DESCRIPTOR_QA
vkd3d_descriptor_debug_write_descriptor(descriptor->heap, descriptor->heap_offset, vk_descriptor_type, descriptor->metadata.cookie);
#endif
info_index = vkd3d_bindless_state_find_set_info_index(&device->bindless_state,
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_BUFFER);
descriptor->info.view = view;
/* Typed cookie takes precedence over raw cookie.
* The typed cookie is more unique than raw cookie,
* since raw cookie is just the ID3D12Resource. */
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_info_mask |= 1u << info_index;
descriptor->metadata.flags |= VKD3D_DESCRIPTOR_FLAG_VIEW;
if (device->bindless_state.flags & VKD3D_TYPED_OFFSET_BUFFER)
descriptor->metadata.flags |= VKD3D_DESCRIPTOR_FLAG_BUFFER_OFFSET;
descriptor_info[vk_write_count].buffer_view = view ? view->vk_buffer_view : VK_NULL_HANDLE;
vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
vkd3d_init_write_descriptor_set(&vk_write[vk_write_count], descriptor,
vkd3d_bindless_state_binding_from_info_index(&device->bindless_state, info_index),
vk_descriptor_type, &descriptor_info[vk_write_count]);
vk_write_count++;
if (descriptor->metadata.flags & VKD3D_DESCRIPTOR_FLAG_BUFFER_OFFSET)
{
struct vkd3d_bound_buffer_range *buffer_ranges = descriptor->heap->buffer_ranges.host_ptr;
buffer_ranges[descriptor->heap_offset] = bound_range;
}
#ifdef VKD3D_ENABLE_DESCRIPTOR_QA
vkd3d_descriptor_debug_write_descriptor(descriptor->heap, descriptor->heap_offset, vk_descriptor_type, descriptor->metadata.cookie);
#endif
/* Handle UAV counter */
uav_counter_view = VK_NULL_HANDLE;
uav_counter_address = 0;

View File

@ -3486,11 +3486,13 @@ static uint32_t d3d12_max_host_descriptor_count_from_heap_type(struct d3d12_devi
static uint32_t vkd3d_bindless_build_mutable_type_list(VkDescriptorType *list, uint32_t flags)
{
uint32_t count = 0;
if ((flags & VKD3D_BINDLESS_CBV) && !(flags & VKD3D_BINDLESS_CBV_AS_SSBO))
list[count++] = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
if (flags & VKD3D_BINDLESS_CBV)
{
list[count++] = flags & VKD3D_BINDLESS_CBV_AS_SSBO ?
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
}
if (flags & (VKD3D_BINDLESS_CBV_AS_SSBO | VKD3D_BINDLESS_RAW_SSBO))
list[count++] = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
/* SSBO for untyped UAV is deliberately left out since it has its own descriptor set. */
if (flags & VKD3D_BINDLESS_UAV)
{
@ -3774,11 +3776,12 @@ HRESULT vkd3d_bindless_state_init(struct vkd3d_bindless_state *bindless_state,
if (bindless_state->flags & VKD3D_BINDLESS_MUTABLE_TYPE)
{
/* If we can, prefer to use one universal descriptor type which works for any descriptor. */
/* If we can, prefer to use one universal descriptor type which works for any descriptor.
* The exception is SSBOs since we need to workaround buggy applications which create typed buffers,
* but assume they can be read as untyped buffers. */
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
VKD3D_BINDLESS_SET_CBV | VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_SRV |
VKD3D_BINDLESS_SET_BUFFER | VKD3D_BINDLESS_SET_IMAGE |
((bindless_state->flags & VKD3D_BINDLESS_RAW_SSBO) ? VKD3D_BINDLESS_SET_RAW_SSBO : 0) |
VKD3D_BINDLESS_SET_MUTABLE | extra_bindings,
VK_DESCRIPTOR_TYPE_MUTABLE_VALVE)))
goto fail;
@ -3805,15 +3808,15 @@ HRESULT vkd3d_bindless_state_init(struct vkd3d_bindless_state *bindless_state,
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_IMAGE,
VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)))
goto fail;
}
if (bindless_state->flags & VKD3D_BINDLESS_RAW_SSBO)
{
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_SRV |
VKD3D_BINDLESS_SET_RAW_SSBO,
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)))
goto fail;
}
if (bindless_state->flags & VKD3D_BINDLESS_RAW_SSBO)
{
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_SRV |
VKD3D_BINDLESS_SET_RAW_SSBO,
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)))
goto fail;
}
if (!(bindless_state->flags & VKD3D_RAW_VA_UAV_COUNTER))

View File

@ -636,6 +636,7 @@ enum vkd3d_descriptor_flag
VKD3D_DESCRIPTOR_FLAG_VIEW = (1 << 0),
VKD3D_DESCRIPTOR_FLAG_UAV_COUNTER = (1 << 1),
VKD3D_DESCRIPTOR_FLAG_BUFFER_OFFSET = (1 << 2),
VKD3D_DESCRIPTOR_FLAG_OFFSET_RANGE = (1 << 3),
};
struct vkd3d_descriptor_binding