dzn: Split the write desc helpers in two halves

Split the write desc helpers in two halves, one taking a descriptor
offset directly, and the other one taking a descriptor set pointer.

This will allow us to pre-calculate descriptor offsets when creating
a descriptor_update template and speed up a bit the write step in that
case.

Reviewed-by: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15691>
This commit is contained in:
Boris Brezillon
2022-04-14 14:34:19 +02:00
committed by Marge Bot
parent 31dc341f3a
commit 4da5524c9b

View File

@@ -1050,6 +1050,23 @@ dzn_descriptor_set_ptr_get_heap_offset(const struct dzn_descriptor_set_layout *l
return base + ptr->elem;
}
static void
dzn_descriptor_set_write_sampler_desc(struct dzn_descriptor_set *set,
uint32_t heap_offset,
const struct dzn_sampler *sampler)
{
if (heap_offset == ~0)
return;
D3D12_DESCRIPTOR_HEAP_TYPE type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
mtx_lock(&set->pool->defragment_lock);
dzn_descriptor_heap_write_sampler_desc(&set->pool->heaps[type],
set->heap_offsets[type] + heap_offset,
sampler);
mtx_unlock(&set->pool->defragment_lock);
}
static void
dzn_descriptor_set_ptr_write_sampler_desc(struct dzn_descriptor_set *set,
const struct dzn_descriptor_set_ptr *ptr,
@@ -1059,13 +1076,7 @@ dzn_descriptor_set_ptr_write_sampler_desc(struct dzn_descriptor_set *set,
uint32_t heap_offset =
dzn_descriptor_set_ptr_get_heap_offset(set->layout, type, ptr, false);
if (heap_offset != ~0) {
mtx_lock(&set->pool->defragment_lock);
dzn_descriptor_heap_write_sampler_desc(&set->pool->heaps[type],
set->heap_offsets[type] + heap_offset,
sampler);
mtx_unlock(&set->pool->defragment_lock);
}
dzn_descriptor_set_write_sampler_desc(set, heap_offset, sampler);
}
static uint32_t
@@ -1083,6 +1094,18 @@ dzn_descriptor_set_ptr_get_dynamic_buffer_idx(const struct dzn_descriptor_set_la
return base + ptr->elem;
}
static void
dzn_descriptor_set_write_dynamic_buffer_desc(struct dzn_descriptor_set *set,
uint32_t dynamic_buffer_idx,
const struct dzn_buffer_desc *info)
{
if (dynamic_buffer_idx == ~0)
return;
assert(dynamic_buffer_idx < set->layout->dynamic_buffers.count);
set->dynamic_buffers[dynamic_buffer_idx] = *info;
}
static void
dzn_descriptor_set_ptr_write_dynamic_buffer_desc(struct dzn_descriptor_set *set,
const struct dzn_descriptor_set_ptr *ptr,
@@ -1090,11 +1113,8 @@ dzn_descriptor_set_ptr_write_dynamic_buffer_desc(struct dzn_descriptor_set *set,
{
uint32_t dynamic_buffer_idx =
dzn_descriptor_set_ptr_get_dynamic_buffer_idx(set->layout, ptr);
if (dynamic_buffer_idx == ~0)
return;
assert(dynamic_buffer_idx < set->layout->dynamic_buffers.count);
set->dynamic_buffers[dynamic_buffer_idx] = *info;
dzn_descriptor_set_write_dynamic_buffer_desc(set, dynamic_buffer_idx, info);
}
static VkDescriptorType
@@ -1108,14 +1128,14 @@ dzn_descriptor_set_ptr_get_vk_type(const struct dzn_descriptor_set_layout *layou
}
static void
dzn_descriptor_set_ptr_write_image_view_desc(struct dzn_descriptor_set *set,
const struct dzn_descriptor_set_ptr *ptr,
bool cube_as_2darray,
const struct dzn_image_view *iview)
dzn_descriptor_set_write_image_view_desc(struct dzn_descriptor_set *set,
uint32_t heap_offset,
uint32_t alt_heap_offset,
bool cube_as_2darray,
const struct dzn_image_view *iview)
{
D3D12_DESCRIPTOR_HEAP_TYPE type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
uint32_t heap_offset =
dzn_descriptor_set_ptr_get_heap_offset(set->layout, type, ptr, false);
if (heap_offset == ~0)
return;
@@ -1125,19 +1145,57 @@ dzn_descriptor_set_ptr_write_image_view_desc(struct dzn_descriptor_set *set,
false, cube_as_2darray,
iview);
VkDescriptorType vk_type = dzn_descriptor_set_ptr_get_vk_type(set->layout, ptr);
if (dzn_descriptor_type_depends_on_shader_usage(vk_type)) {
heap_offset =
dzn_descriptor_set_ptr_get_heap_offset(set->layout, type, ptr, true);
assert(heap_offset != ~0);
if (alt_heap_offset != ~0) {
dzn_descriptor_heap_write_image_view_desc(&set->pool->heaps[type],
set->heap_offsets[type] + heap_offset,
set->heap_offsets[type] + alt_heap_offset,
true, cube_as_2darray,
iview);
}
mtx_unlock(&set->pool->defragment_lock);
}
static void
dzn_descriptor_set_ptr_write_image_view_desc(struct dzn_descriptor_set *set,
const struct dzn_descriptor_set_ptr *ptr,
bool cube_as_2darray,
const struct dzn_image_view *iview)
{
D3D12_DESCRIPTOR_HEAP_TYPE type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
uint32_t heap_offset =
dzn_descriptor_set_ptr_get_heap_offset(set->layout, type, ptr, false);
uint32_t alt_heap_offset =
dzn_descriptor_set_ptr_get_heap_offset(set->layout, type, ptr, true);
dzn_descriptor_set_write_image_view_desc(set, heap_offset, alt_heap_offset,
cube_as_2darray, iview);
}
static void
dzn_descriptor_set_write_buffer_view_desc(struct dzn_descriptor_set *set,
uint32_t heap_offset,
uint32_t alt_heap_offset,
const struct dzn_buffer_view *bview)
{
if (heap_offset == ~0)
return;
D3D12_DESCRIPTOR_HEAP_TYPE type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
mtx_lock(&set->pool->defragment_lock);
dzn_descriptor_heap_write_buffer_view_desc(&set->pool->heaps[type],
set->heap_offsets[type] +
heap_offset,
false, bview);
if (alt_heap_offset != ~0) {
dzn_descriptor_heap_write_buffer_view_desc(&set->pool->heaps[type],
set->heap_offsets[type] +
alt_heap_offset,
true, bview);
}
mtx_unlock(&set->pool->defragment_lock);
}
static void
dzn_descriptor_set_ptr_write_buffer_view_desc(struct dzn_descriptor_set *set,
const struct dzn_descriptor_set_ptr *ptr,
@@ -1146,22 +1204,32 @@ dzn_descriptor_set_ptr_write_buffer_view_desc(struct dzn_descriptor_set *set,
D3D12_DESCRIPTOR_HEAP_TYPE type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
uint32_t heap_offset =
dzn_descriptor_set_ptr_get_heap_offset(set->layout, type, ptr, false);
uint32_t alt_heap_offset =
dzn_descriptor_set_ptr_get_heap_offset(set->layout, type, ptr, true);
dzn_descriptor_set_write_buffer_view_desc(set, heap_offset, alt_heap_offset, bview);
}
static void
dzn_descriptor_set_write_buffer_desc(struct dzn_descriptor_set *set,
uint32_t heap_offset,
uint32_t alt_heap_offset,
const struct dzn_buffer_desc *bdesc)
{
D3D12_DESCRIPTOR_HEAP_TYPE type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
if (heap_offset == ~0)
return;
mtx_lock(&set->pool->defragment_lock);
dzn_descriptor_heap_write_buffer_view_desc(&set->pool->heaps[type],
set->heap_offsets[type] + heap_offset,
false, bview);
dzn_descriptor_heap_write_buffer_desc(&set->pool->heaps[type],
set->heap_offsets[type] + heap_offset,
false, bdesc);
VkDescriptorType vk_type = dzn_descriptor_set_ptr_get_vk_type(set->layout, ptr);
if (dzn_descriptor_type_depends_on_shader_usage(vk_type)) {
heap_offset =
dzn_descriptor_set_ptr_get_heap_offset(set->layout, type, ptr, true);
assert(heap_offset != ~0);
dzn_descriptor_heap_write_buffer_view_desc(&set->pool->heaps[type],
set->heap_offsets[type] + heap_offset,
true, bview);
if (alt_heap_offset != ~0) {
dzn_descriptor_heap_write_buffer_desc(&set->pool->heaps[type],
set->heap_offsets[type] +
alt_heap_offset,
true, bdesc);
}
mtx_unlock(&set->pool->defragment_lock);
}
@@ -1174,24 +1242,10 @@ dzn_descriptor_set_ptr_write_buffer_desc(struct dzn_descriptor_set *set,
D3D12_DESCRIPTOR_HEAP_TYPE type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
uint32_t heap_offset =
dzn_descriptor_set_ptr_get_heap_offset(set->layout, type, ptr, false);
if (heap_offset == ~0)
return;
uint32_t alt_heap_offset =
dzn_descriptor_set_ptr_get_heap_offset(set->layout, type, ptr, true);
mtx_lock(&set->pool->defragment_lock);
dzn_descriptor_heap_write_buffer_desc(&set->pool->heaps[type],
set->heap_offsets[type] + heap_offset,
false, bdesc);
VkDescriptorType vk_type = dzn_descriptor_set_ptr_get_vk_type(set->layout, ptr);
if (dzn_descriptor_type_depends_on_shader_usage(vk_type)) {
heap_offset =
dzn_descriptor_set_ptr_get_heap_offset(set->layout, type, ptr, true);
assert(heap_offset != ~0);
dzn_descriptor_heap_write_buffer_desc(&set->pool->heaps[type],
set->heap_offsets[type] + heap_offset,
true, bdesc);
}
mtx_unlock(&set->pool->defragment_lock);
dzn_descriptor_set_write_buffer_desc(set, heap_offset, alt_heap_offset, bdesc);
}
static void