vkd3d: Rework descriptor set lookup.

This is no longer performance-critical, so in order to simplify changing
the binding model, remove hard-coded descriptor set numbers and instead
look them up based on the requested descriptor properties.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-10-03 21:49:09 +02:00 committed by Hans-Kristian Arntzen
parent bffadd1f23
commit 07e6687f6a
4 changed files with 50 additions and 68 deletions

View File

@ -5113,14 +5113,15 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetDescriptorHeaps(d3d12_comman
struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList(iface);
struct vkd3d_bindless_state *bindless_state = &list->device->bindless_state;
bool dirty_uav_counters = false;
unsigned int i, j, set_index;
uint64_t dirty_mask = 0;
unsigned int i, j;
TRACE("iface %p, heap_count %u, heaps %p.\n", iface, heap_count, heaps);
for (i = 0; i < heap_count; i++)
{
struct d3d12_descriptor_heap *heap = unsafe_impl_from_ID3D12DescriptorHeap(heaps[i]);
unsigned int set_index = 0;
if (!heap)
continue;
@ -5130,8 +5131,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetDescriptorHeaps(d3d12_comman
if (bindless_state->set_info[j].heap_type != heap->desc.Type)
continue;
set_index = d3d12_descriptor_heap_set_index_from_binding(&bindless_state->set_info[j]);
list->descriptor_heaps[j] = heap->vk_descriptor_sets[set_index];
list->descriptor_heaps[j] = heap->vk_descriptor_sets[set_index++];
dirty_mask |= 1ull << j;
}

View File

@ -3499,7 +3499,8 @@ void d3d12_desc_copy(struct d3d12_desc *dst, struct d3d12_desc *src,
}
else
{
uint32_t set_index = d3d12_descriptor_heap_uav_counter_set_index();
uint32_t set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_COUNTER);
vk_copy = &vk_copies[copy_count++];
vk_copy->sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
@ -3935,7 +3936,8 @@ void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
vk_descriptor_type = vkd3d_bindless_state_get_cbv_descriptor_type(&device->bindless_state);
descriptor->metadata.cookie = resource ? resource->cookie : 0;
descriptor->metadata.set_index = d3d12_descriptor_heap_cbv_set_index();
descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_CBV, VKD3D_SHADER_BINDING_FLAG_BUFFER);
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED;
descriptor->info.buffer = descriptor_info.buffer;
@ -4000,7 +4002,8 @@ static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor,
descriptor->info.view = view;
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_index = d3d12_descriptor_heap_srv_set_index(true);
descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_BUFFER);
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW;
vkd3d_init_write_descriptor_set(&vk_write, descriptor, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, &descriptor_info);
@ -4157,7 +4160,8 @@ static void vkd3d_create_texture_srv(struct d3d12_desc *descriptor,
descriptor->info.view = view;
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_index = d3d12_descriptor_heap_srv_set_index(false);
descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_IMAGE);
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW;
vkd3d_init_write_descriptor_set(&vk_write, descriptor, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, &descriptor_info);
@ -4259,7 +4263,8 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_
descriptor->info.view = view;
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_index = d3d12_descriptor_heap_uav_set_index(true);
descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_BUFFER);
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW | VKD3D_DESCRIPTOR_FLAG_UAV_COUNTER;
descriptor_info[vk_write_count].buffer_view = view ? view->vk_buffer_view : VK_NULL_HANDLE;
@ -4302,7 +4307,8 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_
}
else
{
uint32_t set_index = d3d12_descriptor_heap_uav_counter_set_index();
uint32_t set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_COUNTER);
descriptor_info[vk_write_count].buffer_view = view ? view->vk_counter_view : VK_NULL_HANDLE;
vkd3d_init_write_descriptor_set(&vk_write[vk_write_count], descriptor,
@ -4427,7 +4433,8 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
descriptor->info.view = view;
descriptor->metadata.cookie = view ? view->cookie : 0;
descriptor->metadata.set_index = d3d12_descriptor_heap_uav_set_index(false);
descriptor->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_IMAGE);
descriptor->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW;
vkd3d_init_write_descriptor_set(&vk_write, descriptor, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptor_info);
@ -4721,7 +4728,8 @@ void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
sampler->info.view = view;
sampler->metadata.cookie = view->cookie;
sampler->metadata.set_index = d3d12_descriptor_heap_sampler_set_index();
sampler->metadata.set_index = vkd3d_bindless_state_find_set(&device->bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, VKD3D_SHADER_BINDING_FLAG_IMAGE);
sampler->metadata.flags = VKD3D_DESCRIPTOR_FLAG_DEFINED | VKD3D_DESCRIPTOR_FLAG_VIEW;
descriptor_info.image.sampler = view->vk_sampler;
@ -5341,7 +5349,7 @@ static HRESULT d3d12_descriptor_heap_create_uav_counter_buffer(struct d3d12_desc
static HRESULT d3d12_descriptor_heap_init(struct d3d12_descriptor_heap *descriptor_heap,
struct d3d12_device *device, const D3D12_DESCRIPTOR_HEAP_DESC *desc)
{
unsigned int i;
unsigned int i, set_index = 0;
HRESULT hr;
memset(descriptor_heap, 0, sizeof(*descriptor_heap));
@ -5363,10 +5371,8 @@ static HRESULT d3d12_descriptor_heap_init(struct d3d12_descriptor_heap *descript
if (set_info->heap_type == desc->Type)
{
unsigned int set_index = d3d12_descriptor_heap_set_index_from_binding(set_info);
if (FAILED(hr = d3d12_descriptor_heap_create_descriptor_set(descriptor_heap,
set_info, &descriptor_heap->vk_descriptor_sets[set_index])))
set_info, &descriptor_heap->vk_descriptor_sets[set_index++])))
goto fail;
}
}
@ -5489,31 +5495,6 @@ void d3d12_descriptor_heap_cleanup(struct d3d12_descriptor_heap *descriptor_heap
VK_CALL(vkDestroyDescriptorPool(device->vk_device, descriptor_heap->vk_descriptor_pool, NULL));
}
unsigned int d3d12_descriptor_heap_set_index_from_binding(const struct vkd3d_bindless_set_info *set)
{
switch (set->range_type)
{
case D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER:
return d3d12_descriptor_heap_sampler_set_index();
case D3D12_DESCRIPTOR_RANGE_TYPE_CBV:
return d3d12_descriptor_heap_cbv_set_index();
case D3D12_DESCRIPTOR_RANGE_TYPE_SRV:
return d3d12_descriptor_heap_srv_set_index(
set->binding_flag & VKD3D_SHADER_BINDING_FLAG_BUFFER);
case D3D12_DESCRIPTOR_RANGE_TYPE_UAV:
return set->binding_flag & VKD3D_SHADER_BINDING_FLAG_COUNTER
? d3d12_descriptor_heap_uav_counter_set_index()
: d3d12_descriptor_heap_uav_set_index(set->binding_flag & VKD3D_SHADER_BINDING_FLAG_BUFFER);
default:
WARN("Unhandled descriptor range type %d.\n", set->range_type);
return 0;
}
}
/* ID3D12QueryHeap */
static inline struct d3d12_query_heap *impl_from_ID3D12QueryHeap(ID3D12QueryHeap *iface)
{

View File

@ -3518,3 +3518,30 @@ bool vkd3d_bindless_state_find_binding(const struct vkd3d_bindless_state *bindle
return false;
}
unsigned int vkd3d_bindless_state_find_set(const struct vkd3d_bindless_state *bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag)
{
D3D12_DESCRIPTOR_HEAP_TYPE heap_type;
unsigned int i, set_index = 0;
heap_type = range_type == D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER
? D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER
: D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
for (i = 0; i < bindless_state->set_count; i++)
{
const struct vkd3d_bindless_set_info *set_info = &bindless_state->set_info[i];
if (set_info->heap_type == heap_type)
{
if (set_info->range_type == range_type && set_info->binding_flag == binding_flag)
return set_index;
set_index++;
}
}
ERR("No set found for range type %u, flag %#x.", range_type, binding_flag);
return 0;
}

View File

@ -756,39 +756,11 @@ HRESULT d3d12_descriptor_heap_create(struct d3d12_device *device,
void d3d12_descriptor_heap_cleanup(struct d3d12_descriptor_heap *descriptor_heap);
struct d3d12_descriptor_heap *unsafe_impl_from_ID3D12DescriptorHeap(ID3D12DescriptorHeap *iface);
static inline unsigned int d3d12_descriptor_heap_sampler_set_index()
{
return 0;
}
static inline unsigned int d3d12_descriptor_heap_cbv_set_index()
{
return 0;
}
static inline unsigned int d3d12_descriptor_heap_srv_set_index(bool is_buffer)
{
return 1 + (is_buffer ? 0 : 1);
}
static inline unsigned int d3d12_descriptor_heap_uav_set_index(bool is_buffer)
{
return 3 + (is_buffer ? 0 : 1);
}
static inline unsigned int d3d12_descriptor_heap_uav_counter_set_index()
{
return 5;
}
static inline uint32_t d3d12_desc_heap_offset(const struct d3d12_desc *dst)
{
return dst->heap_offset;
}
unsigned int d3d12_descriptor_heap_set_index_from_binding(const struct vkd3d_bindless_set_info *set);
unsigned int d3d12_descriptor_heap_set_index_from_magic(uint32_t magic, bool is_buffer);
/* ID3D12QueryHeap */
struct d3d12_query_heap
{
@ -1626,6 +1598,8 @@ void vkd3d_bindless_state_cleanup(struct vkd3d_bindless_state *bindless_state,
bool vkd3d_bindless_state_find_binding(const struct vkd3d_bindless_state *bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag,
struct vkd3d_shader_descriptor_binding *binding);
unsigned int vkd3d_bindless_state_find_set(const struct vkd3d_bindless_state *bindless_state,
D3D12_DESCRIPTOR_RANGE_TYPE range_type, enum vkd3d_shader_binding_flag binding_flag);
static inline VkDescriptorType vkd3d_bindless_state_get_cbv_descriptor_type(const struct vkd3d_bindless_state *bindless_state)
{