Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/HansKristian-Work/vkd3d-proton.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2022-09-27 16:24:26 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2022-11-10 16:28:46 +0300
commitdb5db4d540cde499c684d7d5ae52ff6c96b3ba99 (patch)
tree643de476351921acd74aec8e8c0b32d7141b7c21
parent109d208d4d9ec6c56cea7402249acb62df4880ba (diff)
vkd3d: Always enable RAW_VA sets.
BDA is required now, so we never have to consider the fallback scenarios. Remove RAW_VA root signature bindings as well to clean things up further. Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
-rw-r--r--libs/vkd3d/resource.c75
-rw-r--r--libs/vkd3d/state.c51
-rw-r--r--libs/vkd3d/vkd3d_private.h30
3 files changed, 36 insertions, 120 deletions
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index f9485de6..a42e9942 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -3367,27 +3367,9 @@ void d3d12_desc_copy_range(vkd3d_cpu_descriptor_va_t dst_va, vkd3d_cpu_descripto
if (heap_type == D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV)
{
- if (device->bindless_state.flags & VKD3D_RAW_VA_AUX_BUFFER)
- {
- const VkDeviceAddress *src_vas = src.heap->raw_va_aux_buffer.host_ptr;
- VkDeviceAddress *dst_vas = dst.heap->raw_va_aux_buffer.host_ptr;
- memcpy(dst_vas + dst.offset, src_vas + src.offset, sizeof(*dst_vas) * count);
- }
- else
- {
- binding = vkd3d_bindless_state_find_set(&device->bindless_state, VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_AUX_BUFFER);
-
- vk_copy = &vk_copies[copy_count++];
- vk_copy->sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
- vk_copy->pNext = NULL;
- vk_copy->srcSet = src.heap->sets[binding.set].vk_descriptor_set;
- vk_copy->srcBinding = binding.binding;
- vk_copy->srcArrayElement = src.offset;
- vk_copy->dstSet = dst.heap->sets[binding.set].vk_descriptor_set;
- vk_copy->dstBinding = binding.binding;
- vk_copy->dstArrayElement = dst.offset;
- vk_copy->descriptorCount = count;
- }
+ const VkDeviceAddress *src_vas = src.heap->raw_va_aux_buffer.host_ptr;
+ VkDeviceAddress *dst_vas = dst.heap->raw_va_aux_buffer.host_ptr;
+ memcpy(dst_vas + dst.offset, src_vas + src.offset, sizeof(*dst_vas) * count);
if (device->bindless_state.flags & (VKD3D_TYPED_OFFSET_BUFFER | VKD3D_SSBO_OFFSET_BUFFER))
{
@@ -4558,10 +4540,12 @@ static void vkd3d_create_buffer_uav(vkd3d_cpu_descriptor_va_t desc_va, struct d3
bool mutable_uses_single_descriptor;
VkDescriptorType vk_descriptor_type;
VkDeviceAddress uav_counter_address;
+ VkDeviceAddress *counter_addresses;
VkWriteDescriptorSet vk_write[3];
struct vkd3d_view *view = NULL;
- VkBufferView uav_counter_view;
struct d3d12_desc_split d;
+ uint32_t descriptor_index;
+ VkDeviceAddress address;
uint32_t info_index;
bool desc_is_raw;
bool emit_typed;
@@ -4686,7 +4670,6 @@ static void vkd3d_create_buffer_uav(vkd3d_cpu_descriptor_va_t desc_va, struct d3
d.types->flags |= VKD3D_DESCRIPTOR_FLAG_SINGLE_DESCRIPTOR;
/* Handle UAV counter */
- uav_counter_view = VK_NULL_HANDLE;
uav_counter_address = 0;
if (resource && counter_resource)
@@ -4694,43 +4677,16 @@ static void vkd3d_create_buffer_uav(vkd3d_cpu_descriptor_va_t desc_va, struct d3
assert(d3d12_resource_is_buffer(counter_resource));
assert(desc->Buffer.StructureByteStride);
- if (device->bindless_state.flags & VKD3D_RAW_VA_AUX_BUFFER)
- {
- VkDeviceAddress address = vkd3d_get_buffer_device_address(device, counter_resource->res.vk_buffer);
- uav_counter_address = address + counter_resource->mem.offset + desc->Buffer.CounterOffsetInBytes;
- }
- else
- {
- struct vkd3d_view *view;
-
- if (!vkd3d_create_buffer_view_for_resource(device, counter_resource, DXGI_FORMAT_R32_UINT,
- desc->Buffer.CounterOffsetInBytes / sizeof(uint32_t), 1, 0, 0, &view))
- return;
-
- uav_counter_view = view->vk_buffer_view;
- }
+ address = vkd3d_get_buffer_device_address(device, counter_resource->res.vk_buffer);
+ uav_counter_address = address + counter_resource->mem.offset + desc->Buffer.CounterOffsetInBytes;
/* This is used to denote that a counter descriptor is present, irrespective of underlying descriptor type. */
descriptor_qa_flags |= VKD3D_DESCRIPTOR_QA_TYPE_RAW_VA_BIT;
}
- if (device->bindless_state.flags & VKD3D_RAW_VA_AUX_BUFFER)
- {
- VkDeviceAddress *counter_addresses = d.heap->raw_va_aux_buffer.host_ptr;
- uint32_t descriptor_index = d.offset;
- counter_addresses[descriptor_index] = uav_counter_address;
- }
- else
- {
- struct vkd3d_descriptor_binding binding = vkd3d_bindless_state_find_set(
- &device->bindless_state, VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_AUX_BUFFER);
-
- descriptor_info[vk_write_count].buffer_view = uav_counter_view;
- vkd3d_init_write_descriptor_set(&vk_write[vk_write_count], &d,
- binding,
- VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, &descriptor_info[vk_write_count]);
- vk_write_count++;
- }
+ counter_addresses = d.heap->raw_va_aux_buffer.host_ptr;
+ descriptor_index = d.offset;
+ counter_addresses[descriptor_index] = uav_counter_address;
vkd3d_descriptor_debug_write_descriptor(d.heap->descriptor_heap_info.host_ptr,
d.heap->cookie, d.offset,
@@ -5743,12 +5699,9 @@ static HRESULT d3d12_descriptor_heap_init_data_buffer(struct d3d12_descriptor_he
if (desc->Type == D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV)
{
- if (device->bindless_state.flags & VKD3D_RAW_VA_AUX_BUFFER)
- {
- raw_va_buffer_size = align(desc->NumDescriptors * sizeof(VkDeviceAddress), alignment);
- if (vkd3d_descriptor_debug_active_qa_checks())
- raw_va_buffer_size += align(VKD3D_DESCRIPTOR_DEBUG_NUM_PAD_DESCRIPTORS * sizeof(VkDeviceAddress), alignment);
- }
+ raw_va_buffer_size = align(desc->NumDescriptors * sizeof(VkDeviceAddress), alignment);
+ if (vkd3d_descriptor_debug_active_qa_checks())
+ raw_va_buffer_size += align(VKD3D_DESCRIPTOR_DEBUG_NUM_PAD_DESCRIPTORS * sizeof(VkDeviceAddress), alignment);
if (device->bindless_state.flags & (VKD3D_SSBO_OFFSET_BUFFER | VKD3D_TYPED_OFFSET_BUFFER))
offset_buffer_size = align(desc->NumDescriptors * sizeof(struct vkd3d_bound_buffer_range), alignment);
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index 301a2982..555970e4 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -365,7 +365,6 @@ struct d3d12_root_signature_info
uint32_t push_descriptor_count;
uint32_t root_constant_count;
uint32_t hoist_descriptor_count;
- bool has_raw_va_aux_buffer;
bool has_ssbo_offset_buffer;
bool has_typed_offset_buffer;
@@ -403,8 +402,6 @@ static void d3d12_root_signature_info_count_srv_uav_table(struct d3d12_root_sign
if (device->bindless_state.flags & VKD3D_BINDLESS_RAW_SSBO)
info->binding_count += 1;
- if (device->bindless_state.flags & VKD3D_RAW_VA_AUX_BUFFER)
- info->has_raw_va_aux_buffer = true;
if (device->bindless_state.flags & VKD3D_SSBO_OFFSET_BUFFER)
info->has_ssbo_offset_buffer = true;
if (device->bindless_state.flags & VKD3D_TYPED_OFFSET_BUFFER)
@@ -699,29 +696,13 @@ static void d3d12_root_signature_init_srv_uav_binding(struct d3d12_root_signatur
{
struct vkd3d_bindless_state *bindless_state = &root_signature->device->bindless_state;
enum vkd3d_bindless_set_flag range_flag;
- bool has_aux_buffer;
range_flag = vkd3d_bindless_set_flag_from_descriptor_range_type(range_type);
binding->flags = VKD3D_SHADER_BINDING_FLAG_BINDLESS | VKD3D_SHADER_BINDING_FLAG_AUX_BUFFER;
- has_aux_buffer = false;
- if (root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_RAW_VA_AUX_BUFFER)
- {
- binding->flags |= VKD3D_SHADER_BINDING_FLAG_RAW_VA;
- binding->binding = root_signature->raw_va_aux_buffer_binding;
- has_aux_buffer = true;
- }
- else if (range_type == D3D12_DESCRIPTOR_RANGE_TYPE_UAV)
- {
- /* There is no fallback heap for RTAS (SRV), this is only relevant for UAV counters. */
- if (vkd3d_bindless_state_find_binding(bindless_state, range_flag | VKD3D_BINDLESS_SET_AUX_BUFFER, &binding->binding))
- has_aux_buffer = true;
- else
- ERR("Failed to find aux buffer binding.\n");
- }
-
- if (has_aux_buffer)
- out_bindings_base[(*out_index)++] = *binding;
+ binding->flags |= VKD3D_SHADER_BINDING_FLAG_RAW_VA;
+ binding->binding = root_signature->raw_va_aux_buffer_binding;
+ out_bindings_base[(*out_index)++] = *binding;
if (vkd3d_bindless_state_find_binding(bindless_state, range_flag | VKD3D_BINDLESS_SET_BUFFER, &binding->binding))
{
@@ -876,14 +857,9 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
static void d3d12_root_signature_init_extra_bindings(struct d3d12_root_signature *root_signature,
const struct d3d12_root_signature_info *info)
{
- if (info->has_raw_va_aux_buffer)
- {
- root_signature->flags |= VKD3D_ROOT_SIGNATURE_USE_RAW_VA_AUX_BUFFER;
-
- vkd3d_bindless_state_find_binding(&root_signature->device->bindless_state,
- VKD3D_BINDLESS_SET_EXTRA_RAW_VA_AUX_BUFFER,
- &root_signature->raw_va_aux_buffer_binding);
- }
+ vkd3d_bindless_state_find_binding(&root_signature->device->bindless_state,
+ VKD3D_BINDLESS_SET_EXTRA_RAW_VA_AUX_BUFFER,
+ &root_signature->raw_va_aux_buffer_binding);
if (info->has_ssbo_offset_buffer || info->has_typed_offset_buffer)
{
@@ -5219,9 +5195,6 @@ static uint32_t vkd3d_bindless_state_get_bindless_flags(struct d3d12_device *dev
/* Always use a typed offset buffer. Otherwise, we risk ending up with unbounded size on view maps. */
flags |= VKD3D_TYPED_OFFSET_BUFFER;
- if (flags & VKD3D_BINDLESS_UAV)
- flags |= VKD3D_RAW_VA_AUX_BUFFER;
-
/* We must use root SRV and UAV due to alignment requirements for 16-bit storage,
* but root CBV is more lax. */
flags |= VKD3D_RAW_VA_ROOT_DESCRIPTOR_SRV_UAV;
@@ -5275,9 +5248,7 @@ HRESULT vkd3d_bindless_state_init(struct vkd3d_bindless_state *bindless_state,
goto fail;
}
- if (bindless_state->flags & VKD3D_RAW_VA_AUX_BUFFER)
- extra_bindings |= VKD3D_BINDLESS_SET_EXTRA_RAW_VA_AUX_BUFFER;
-
+ extra_bindings |= VKD3D_BINDLESS_SET_EXTRA_RAW_VA_AUX_BUFFER;
if (bindless_state->flags & (VKD3D_SSBO_OFFSET_BUFFER | VKD3D_TYPED_OFFSET_BUFFER))
extra_bindings |= VKD3D_BINDLESS_SET_EXTRA_OFFSET_BUFFER;
@@ -5344,14 +5315,6 @@ HRESULT vkd3d_bindless_state_init(struct vkd3d_bindless_state *bindless_state,
goto fail;
}
- if (!(bindless_state->flags & VKD3D_RAW_VA_AUX_BUFFER))
- {
- if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
- VKD3D_BINDLESS_SET_UAV | VKD3D_BINDLESS_SET_AUX_BUFFER,
- VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)))
- goto fail;
- }
-
return S_OK;
fail:
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 3bb52ae5..9de5b13e 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -53,8 +53,10 @@
#define VKD3D_MAX_SHADER_STAGES 5u
#define VKD3D_MAX_VK_SYNC_OBJECTS 4u
-#define VKD3D_MAX_DESCRIPTOR_SETS 11u
-#define VKD3D_MAX_BINDLESS_DESCRIPTOR_SETS 8u
+/* 6 types for CBV_SRV_UAV and 1 for sampler. */
+#define VKD3D_MAX_BINDLESS_DESCRIPTOR_SETS 7u
+/* The above plus one push descriptor set + static sampler set + static sampler set for local root signatures. */
+#define VKD3D_MAX_DESCRIPTOR_SETS (VKD3D_MAX_BINDLESS_DESCRIPTOR_SETS + 3u)
#define VKD3D_MAX_MUTABLE_DESCRIPTOR_TYPES 6u
#define VKD3D_TILE_SIZE 65536
@@ -1355,9 +1357,8 @@ static inline bool d3d12_query_heap_type_is_inline(D3D12_QUERY_HEAP_TYPE heap_ty
enum vkd3d_root_signature_flag
{
VKD3D_ROOT_SIGNATURE_USE_PUSH_CONSTANT_UNIFORM_BLOCK = 0x00000001u,
- VKD3D_ROOT_SIGNATURE_USE_RAW_VA_AUX_BUFFER = 0x00000002u,
- VKD3D_ROOT_SIGNATURE_USE_SSBO_OFFSET_BUFFER = 0x00000004u,
- VKD3D_ROOT_SIGNATURE_USE_TYPED_OFFSET_BUFFER = 0x00000008u,
+ VKD3D_ROOT_SIGNATURE_USE_SSBO_OFFSET_BUFFER = 0x00000002u,
+ VKD3D_ROOT_SIGNATURE_USE_TYPED_OFFSET_BUFFER = 0x00000004u,
};
enum vkd3d_pipeline_type
@@ -2858,16 +2859,15 @@ enum vkd3d_bindless_flags
VKD3D_BINDLESS_CBV = (1u << 1),
VKD3D_BINDLESS_SRV = (1u << 2),
VKD3D_BINDLESS_UAV = (1u << 3),
- VKD3D_RAW_VA_AUX_BUFFER = (1u << 4),
- VKD3D_BINDLESS_CBV_AS_SSBO = (1u << 5),
- VKD3D_BINDLESS_RAW_SSBO = (1u << 6),
- VKD3D_SSBO_OFFSET_BUFFER = (1u << 7),
- VKD3D_TYPED_OFFSET_BUFFER = (1u << 8),
- VKD3D_RAW_VA_ROOT_DESCRIPTOR_CBV = (1u << 9),
- VKD3D_RAW_VA_ROOT_DESCRIPTOR_SRV_UAV = (1u << 10),
- VKD3D_BINDLESS_MUTABLE_TYPE = (1u << 11),
- VKD3D_HOIST_STATIC_TABLE_CBV = (1u << 12),
- VKD3D_BINDLESS_MUTABLE_TYPE_RAW_SSBO = (1u << 13),
+ VKD3D_BINDLESS_CBV_AS_SSBO = (1u << 4),
+ VKD3D_BINDLESS_RAW_SSBO = (1u << 5),
+ VKD3D_SSBO_OFFSET_BUFFER = (1u << 6),
+ VKD3D_TYPED_OFFSET_BUFFER = (1u << 7),
+ VKD3D_RAW_VA_ROOT_DESCRIPTOR_CBV = (1u << 8),
+ VKD3D_RAW_VA_ROOT_DESCRIPTOR_SRV_UAV = (1u << 9),
+ VKD3D_BINDLESS_MUTABLE_TYPE = (1u << 10),
+ VKD3D_HOIST_STATIC_TABLE_CBV = (1u << 11),
+ VKD3D_BINDLESS_MUTABLE_TYPE_RAW_SSBO = (1u << 12),
};
#define VKD3D_BINDLESS_SET_MAX_EXTRA_BINDINGS 8