vkd3d: Create buffer for query heap as necessary.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2021-01-08 18:36:08 +01:00 committed by Philip Rebohle
parent 39c7f8f32d
commit abc204cea4
2 changed files with 71 additions and 9 deletions

View File

@ -6059,6 +6059,8 @@ static ULONG STDMETHODCALLTYPE d3d12_query_heap_Release(ID3D12QueryHeap *iface)
vkd3d_private_store_destroy(&heap->private_store);
VK_CALL(vkDestroyQueryPool(device->vk_device, heap->vk_query_pool, NULL));
VK_CALL(vkDestroyBuffer(device->vk_device, heap->vk_buffer, NULL));
VK_CALL(vkFreeMemory(device->vk_device, heap->vk_memory, NULL));
vkd3d_free(heap);
@ -6140,12 +6142,33 @@ struct d3d12_query_heap *unsafe_impl_from_ID3D12QueryHeap(ID3D12QueryHeap *iface
return impl_from_ID3D12QueryHeap(iface);
}
size_t d3d12_query_heap_type_get_data_size(D3D12_QUERY_HEAP_TYPE heap_type)
{
switch (heap_type)
{
case D3D12_QUERY_HEAP_TYPE_OCCLUSION:
case D3D12_QUERY_HEAP_TYPE_TIMESTAMP:
case D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP:
return sizeof(uint64_t);
case D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS:
return sizeof(D3D12_QUERY_DATA_PIPELINE_STATISTICS);
case D3D12_QUERY_HEAP_TYPE_SO_STATISTICS:
return sizeof(D3D12_QUERY_DATA_SO_STATISTICS);
default:
ERR("Unhandled query pool type %u.\n", heap_type);
return 0;
}
}
HRESULT d3d12_query_heap_create(struct d3d12_device *device, const D3D12_QUERY_HEAP_DESC *desc,
struct d3d12_query_heap **heap)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
D3D12_HEAP_PROPERTIES heap_properties;
struct d3d12_query_heap *object;
VkQueryPoolCreateInfo pool_info;
D3D12_RESOURCE_DESC buffer_desc;
size_t data_size;
VkResult vr;
HRESULT hr;
@ -6208,26 +6231,62 @@ HRESULT d3d12_query_heap_create(struct d3d12_device *device, const D3D12_QUERY_H
return E_INVALIDARG;
}
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));
heap_properties.Type = D3D12_HEAP_TYPE_DEFAULT;
buffer_desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
buffer_desc.Alignment = 0;
buffer_desc.Width = data_size;
buffer_desc.Height = 1;
buffer_desc.DepthOrArraySize = 1;
buffer_desc.MipLevels = 1;
buffer_desc.Format = DXGI_FORMAT_UNKNOWN;
buffer_desc.SampleDesc.Count = 1;
buffer_desc.SampleDesc.Quality = 0;
buffer_desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
buffer_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
if (FAILED(hr = vkd3d_create_buffer(device, &heap_properties,
D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS, &buffer_desc, &object->vk_buffer)))
{
vkd3d_free(object);
return hr;
}
if (FAILED(hr = vkd3d_allocate_buffer_memory(device, object->vk_buffer, NULL,
&heap_properties, D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS, &object->vk_memory, NULL, NULL)))
{
VK_CALL(vkDestroyBuffer(device->vk_device, object->vk_buffer, NULL));
vkd3d_free(object);
return hr;
}
}
else
{
object->vk_memory = VK_NULL_HANDLE;
object->vk_buffer = VK_NULL_HANDLE;
}
if (FAILED(hr = vkd3d_private_store_init(&object->private_store)))
{
vkd3d_free(object);
return hr;
}
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_private_store_destroy(&object->private_store);
vkd3d_free(object);
return hresult_from_vk_result(vr);
}
d3d12_device_add_ref(device);
TRACE("Created query heap %p.\n", object);
*heap = object;
return S_OK;
}

View File

@ -772,6 +772,8 @@ struct d3d12_query_heap
D3D12_QUERY_HEAP_DESC desc;
VkQueryPool vk_query_pool;
VkDeviceMemory vk_memory;
VkBuffer vk_buffer;
uint32_t initialized;
struct d3d12_device *device;
@ -782,6 +784,7 @@ struct d3d12_query_heap
HRESULT d3d12_query_heap_create(struct d3d12_device *device, const D3D12_QUERY_HEAP_DESC *desc,
struct d3d12_query_heap **heap);
struct d3d12_query_heap *unsafe_impl_from_ID3D12QueryHeap(ID3D12QueryHeap *iface);
size_t d3d12_query_heap_type_get_data_size(D3D12_QUERY_HEAP_TYPE heap_type);
enum vkd3d_root_signature_flag
{