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:
parent
bffadd1f23
commit
07e6687f6a
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue