From db5db4d540cde499c684d7d5ae52ff6c96b3ba99 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Tue, 27 Sep 2022 15:24:26 +0200 Subject: 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 --- libs/vkd3d/resource.c | 75 +++++++++------------------------------------- libs/vkd3d/state.c | 51 +++++-------------------------- libs/vkd3d/vkd3d_private.h | 30 +++++++++---------- 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 -- cgit v1.2.3