vkd3d: Allocate query pools based on type index instead of D3D12 type.

Postbuild info is a query in Vulkan, but not so in D3D12.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2021-02-24 14:59:46 +01:00
parent d88ce7cdea
commit 4365f9962f
3 changed files with 57 additions and 45 deletions

View File

@ -1905,44 +1905,37 @@ static bool d3d12_command_allocator_allocate_scratch_memory(struct d3d12_command
return true;
}
static struct vkd3d_query_pool *d3d12_command_allocator_find_active_query_pool(struct d3d12_command_allocator *allocator,
D3D12_QUERY_HEAP_TYPE heap_type)
static struct vkd3d_query_pool *d3d12_command_allocator_get_active_query_pool_from_type_index(
struct d3d12_command_allocator *allocator, uint32_t type_index)
{
uint32_t i;
static const struct
{
D3D12_QUERY_HEAP_TYPE heap_type;
uint32_t index;
}
map[] =
{
{ D3D12_QUERY_HEAP_TYPE_OCCLUSION, VKD3D_QUERY_TYPE_INDEX_OCCLUSION },
{ D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS, VKD3D_QUERY_TYPE_INDEX_PIPELINE_STATISTICS },
{ D3D12_QUERY_HEAP_TYPE_SO_STATISTICS, VKD3D_QUERY_TYPE_INDEX_TRANSFORM_FEEDBACK },
};
for (i = 0; i < ARRAY_SIZE(map); i++)
{
if (map[i].heap_type == heap_type)
return &allocator->active_query_pools[map[i].index];
}
ERR("Unhandled query heap type %u.\n", heap_type);
return NULL;
return &allocator->active_query_pools[type_index];
}
static bool d3d12_command_allocator_allocate_query(struct d3d12_command_allocator *allocator,
D3D12_QUERY_HEAP_TYPE heap_type, VkQueryPool *query_pool, uint32_t *query_index)
static uint32_t d3d12_query_heap_type_to_type_index(D3D12_QUERY_HEAP_TYPE heap_type)
{
struct vkd3d_query_pool *pool = d3d12_command_allocator_find_active_query_pool(allocator, heap_type);
switch (heap_type)
{
case D3D12_QUERY_HEAP_TYPE_OCCLUSION:
return VKD3D_QUERY_TYPE_INDEX_OCCLUSION;
case D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS:
return VKD3D_QUERY_TYPE_INDEX_PIPELINE_STATISTICS;
case D3D12_QUERY_HEAP_TYPE_SO_STATISTICS:
return VKD3D_QUERY_TYPE_INDEX_TRANSFORM_FEEDBACK;
default:
return UINT32_MAX;
}
}
if (!pool)
return false;
static bool d3d12_command_allocator_allocate_query_from_type_index(
struct d3d12_command_allocator *allocator,
uint32_t type_index, VkQueryPool *query_pool, uint32_t *query_index)
{
struct vkd3d_query_pool *pool = d3d12_command_allocator_get_active_query_pool_from_type_index(allocator, type_index);
assert(pool);
if (pool->next_index >= pool->query_count)
{
if (FAILED(d3d12_device_get_query_pool(allocator->device, heap_type, pool)))
if (FAILED(d3d12_device_get_query_pool(allocator->device, type_index, pool)))
return false;
if (vkd3d_array_reserve((void**)&allocator->query_pools, &allocator->query_pools_size,
@ -1957,6 +1950,13 @@ static bool d3d12_command_allocator_allocate_query(struct d3d12_command_allocato
return true;
}
static bool d3d12_command_allocator_allocate_query_from_heap_type(struct d3d12_command_allocator *allocator,
D3D12_QUERY_HEAP_TYPE heap_type, VkQueryPool *query_pool, uint32_t *query_index)
{
uint32_t type_index = d3d12_query_heap_type_to_type_index(heap_type);
return d3d12_command_allocator_allocate_query_from_type_index(allocator, type_index, query_pool, query_index);
}
/* ID3D12CommandList */
static inline struct d3d12_command_list *impl_from_ID3D12GraphicsCommandList(d3d12_command_list_iface *iface)
{
@ -2646,7 +2646,7 @@ static void d3d12_command_list_reset_active_query(struct d3d12_command_list *lis
if (!d3d12_command_list_add_pending_query(list, query))
return;
if (!d3d12_command_allocator_allocate_query(list->allocator,
if (!d3d12_command_allocator_allocate_query_from_heap_type(list->allocator,
query->heap->desc.Type, &query->vk_pool, &query->vk_index))
return;
@ -2675,7 +2675,7 @@ static bool d3d12_command_list_enable_query(struct d3d12_command_list *list,
query->state = VKD3D_ACTIVE_QUERY_RESET;
query->resolve_index = 0;
if (!d3d12_command_allocator_allocate_query(list->allocator,
if (!d3d12_command_allocator_allocate_query_from_heap_type(list->allocator,
heap->desc.Type, &query->vk_pool, &query->vk_index))
return false;

View File

@ -2172,29 +2172,29 @@ void d3d12_device_return_descriptor_heap_gpu_va(struct d3d12_device *device, uin
pthread_mutex_unlock(&device->mutex);
}
static HRESULT d3d12_device_create_query_pool(struct d3d12_device *device, D3D12_QUERY_HEAP_TYPE heap_type, struct vkd3d_query_pool *pool)
static HRESULT d3d12_device_create_query_pool(struct d3d12_device *device, uint32_t type_index, struct vkd3d_query_pool *pool)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
VkQueryPoolCreateInfo pool_info;
VkResult vr;
TRACE("device %p, heap_type %u, pool %p.\n", device, heap_type, pool);
TRACE("device %p, type_index %u, pool %p.\n", device, type_index, pool);
pool_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
pool_info.pNext = NULL;
pool_info.flags = 0;
pool_info.pipelineStatistics = 0;
switch (heap_type)
switch (type_index)
{
case D3D12_QUERY_HEAP_TYPE_OCCLUSION:
case VKD3D_QUERY_TYPE_INDEX_OCCLUSION:
/* Expect a large number of occlusion queries
* to be used within a single command list */
pool_info.queryType = VK_QUERY_TYPE_OCCLUSION;
pool_info.queryCount = 4096;
break;
case D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS:
case VKD3D_QUERY_TYPE_INDEX_PIPELINE_STATISTICS:
pool_info.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
pool_info.queryCount = 128;
pool_info.pipelineStatistics =
@ -2211,13 +2211,23 @@ static HRESULT d3d12_device_create_query_pool(struct d3d12_device *device, D3D12
VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT;
break;
case D3D12_QUERY_HEAP_TYPE_SO_STATISTICS:
case VKD3D_QUERY_TYPE_INDEX_TRANSFORM_FEEDBACK:
pool_info.queryType = VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT;
pool_info.queryCount = 128;
break;
case VKD3D_QUERY_TYPE_INDEX_RT_COMPACTED_SIZE:
pool_info.queryType = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR;
pool_info.queryCount = 128;
break;
case VKD3D_QUERY_TYPE_INDEX_RT_SERIALIZE_SIZE:
pool_info.queryType = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR;
pool_info.queryCount = 128;
break;
default:
ERR("Unhandled query type %u.\n", heap_type);
ERR("Unhandled query type %u.\n", type_index);
return E_INVALIDARG;
}
@ -2227,7 +2237,7 @@ static HRESULT d3d12_device_create_query_pool(struct d3d12_device *device, D3D12
return hresult_from_vk_result(vr);
}
pool->heap_type = heap_type;
pool->type_index = type_index;
pool->query_count = pool_info.queryCount;
pool->next_index = 0;
return S_OK;
@ -2242,7 +2252,7 @@ static void d3d12_device_destroy_query_pool(struct d3d12_device *device, const s
VK_CALL(vkDestroyQueryPool(device->vk_device, pool->vk_query_pool, NULL));
}
HRESULT d3d12_device_get_query_pool(struct d3d12_device *device, D3D12_QUERY_HEAP_TYPE heap_type, struct vkd3d_query_pool *pool)
HRESULT d3d12_device_get_query_pool(struct d3d12_device *device, uint32_t type_index, struct vkd3d_query_pool *pool)
{
size_t i;
@ -2250,7 +2260,7 @@ HRESULT d3d12_device_get_query_pool(struct d3d12_device *device, D3D12_QUERY_HEA
for (i = 0; i < device->query_pool_count; i++)
{
if (device->query_pools[i].heap_type == heap_type)
if (device->query_pools[i].type_index == type_index)
{
*pool = device->query_pools[i];
pool->next_index = 0;
@ -2262,7 +2272,7 @@ HRESULT d3d12_device_get_query_pool(struct d3d12_device *device, D3D12_QUERY_HEA
}
pthread_mutex_unlock(&device->mutex);
return d3d12_device_create_query_pool(device, heap_type, pool);
return d3d12_device_create_query_pool(device, type_index, pool);
}
void d3d12_device_return_query_pool(struct d3d12_device *device, const struct vkd3d_query_pool *pool)

View File

@ -1328,13 +1328,15 @@ struct vkd3d_scratch_buffer
#define VKD3D_QUERY_TYPE_INDEX_OCCLUSION (0u)
#define VKD3D_QUERY_TYPE_INDEX_PIPELINE_STATISTICS (1u)
#define VKD3D_QUERY_TYPE_INDEX_TRANSFORM_FEEDBACK (2u)
#define VKD3D_VIRTUAL_QUERY_TYPE_COUNT (3u)
#define VKD3D_QUERY_TYPE_INDEX_RT_COMPACTED_SIZE (3u)
#define VKD3D_QUERY_TYPE_INDEX_RT_SERIALIZE_SIZE (4u)
#define VKD3D_VIRTUAL_QUERY_TYPE_COUNT (5u)
#define VKD3D_VIRTUAL_QUERY_POOL_COUNT (128u)
struct vkd3d_query_pool
{
D3D12_QUERY_HEAP_TYPE heap_type;
VkQueryPool vk_query_pool;
uint32_t type_index;
uint32_t query_count;
uint32_t next_index;
};