vkd3d: Do not create query pool for inline query types.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2021-01-15 16:46:17 +01:00 committed by Philip Rebohle
parent 7b524590ab
commit c6095e740d
1 changed files with 41 additions and 58 deletions

View File

@ -6168,84 +6168,68 @@ HRESULT d3d12_query_heap_create(struct d3d12_device *device, const D3D12_QUERY_H
struct d3d12_query_heap *object; struct d3d12_query_heap *object;
VkQueryPoolCreateInfo pool_info; VkQueryPoolCreateInfo pool_info;
D3D12_RESOURCE_DESC buffer_desc; D3D12_RESOURCE_DESC buffer_desc;
size_t data_size;
VkResult vr; VkResult vr;
HRESULT hr; HRESULT hr;
if (!(object = vkd3d_malloc(sizeof(*object)))) if (!(object = vkd3d_malloc(sizeof(*object))))
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
memset(object, 0, sizeof(*object));
object->ID3D12QueryHeap_iface.lpVtbl = &d3d12_query_heap_vtbl; object->ID3D12QueryHeap_iface.lpVtbl = &d3d12_query_heap_vtbl;
object->refcount = 1; object->refcount = 1;
object->device = device; object->device = device;
object->desc = *desc; object->desc = *desc;
object->initialized = 0;
pool_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO; if (!d3d12_query_heap_type_is_inline(desc->Type))
pool_info.pNext = NULL;
pool_info.flags = 0;
pool_info.queryCount = desc->Count;
switch (desc->Type)
{ {
case D3D12_QUERY_HEAP_TYPE_OCCLUSION: pool_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
pool_info.queryType = VK_QUERY_TYPE_OCCLUSION; pool_info.pNext = NULL;
pool_info.pipelineStatistics = 0; pool_info.flags = 0;
break; pool_info.queryCount = desc->Count;
case D3D12_QUERY_HEAP_TYPE_TIMESTAMP: switch (desc->Type)
pool_info.queryType = VK_QUERY_TYPE_TIMESTAMP; {
pool_info.pipelineStatistics = 0; case D3D12_QUERY_HEAP_TYPE_TIMESTAMP:
break; pool_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
pool_info.pipelineStatistics = 0;
break;
case D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS: case D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS:
pool_info.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS; pool_info.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
pool_info.pipelineStatistics = VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT pool_info.pipelineStatistics = VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT
| VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT
| VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT
| VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT
| VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT
| VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT
| VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT
| VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT
| VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT | VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT
| VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT
| VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT; | VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT;
break; break;
case D3D12_QUERY_HEAP_TYPE_SO_STATISTICS: default:
if (!device->vk_info.transform_feedback_queries) WARN("Invalid query heap type %u.\n", desc->Type);
{
FIXME("Transform feedback queries are not supported by Vulkan implementation.\n");
vkd3d_free(object); vkd3d_free(object);
return E_NOTIMPL; return E_INVALIDARG;
} }
pool_info.queryType = VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT; if ((vr = VK_CALL(vkCreateQueryPool(device->vk_device, &pool_info, NULL, &object->vk_query_pool))) < 0)
pool_info.pipelineStatistics = 0; {
break; WARN("Failed to create Vulkan query pool, vr %d.\n", vr);
default:
WARN("Invalid query heap type %u.\n", desc->Type);
vkd3d_free(object); vkd3d_free(object);
return E_INVALIDARG; return hresult_from_vk_result(vr);
}
} }
else
if ((vr = VK_CALL(vkCreateQueryPool(device->vk_device, &pool_info, NULL, &object->vk_query_pool))) < 0)
{
WARN("Failed to create Vulkan query pool, vr %d.\n", vr);
vkd3d_free(object);
return hresult_from_vk_result(vr);
}
if ((data_size = (d3d12_query_heap_type_get_data_size(desc->Type) * desc->Count)))
{ {
memset(&heap_properties, 0, sizeof(heap_properties)); memset(&heap_properties, 0, sizeof(heap_properties));
heap_properties.Type = D3D12_HEAP_TYPE_DEFAULT; heap_properties.Type = D3D12_HEAP_TYPE_DEFAULT;
buffer_desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; buffer_desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
buffer_desc.Alignment = 0; buffer_desc.Alignment = 0;
buffer_desc.Width = data_size; buffer_desc.Width = d3d12_query_heap_type_get_data_size(desc->Type) * desc->Count;
buffer_desc.Height = 1; buffer_desc.Height = 1;
buffer_desc.DepthOrArraySize = 1; buffer_desc.DepthOrArraySize = 1;
buffer_desc.MipLevels = 1; buffer_desc.MipLevels = 1;
@ -6269,11 +6253,10 @@ HRESULT d3d12_query_heap_create(struct d3d12_device *device, const D3D12_QUERY_H
vkd3d_free(object); vkd3d_free(object);
return hr; return hr;
} }
}
else /* Explicit initialization is not required for these since
{ * we can expect the buffer to be zero-initialized. */
object->vk_memory = VK_NULL_HANDLE; object->initialized = 1;
object->vk_buffer = VK_NULL_HANDLE;
} }
if (FAILED(hr = vkd3d_private_store_init(&object->private_store))) if (FAILED(hr = vkd3d_private_store_init(&object->private_store)))