vkd3d: Create buffer for query heap as necessary.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
parent
39c7f8f32d
commit
abc204cea4
|
@ -6059,6 +6059,8 @@ static ULONG STDMETHODCALLTYPE d3d12_query_heap_Release(ID3D12QueryHeap *iface)
|
||||||
vkd3d_private_store_destroy(&heap->private_store);
|
vkd3d_private_store_destroy(&heap->private_store);
|
||||||
|
|
||||||
VK_CALL(vkDestroyQueryPool(device->vk_device, heap->vk_query_pool, NULL));
|
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);
|
vkd3d_free(heap);
|
||||||
|
|
||||||
|
@ -6140,12 +6142,33 @@ struct d3d12_query_heap *unsafe_impl_from_ID3D12QueryHeap(ID3D12QueryHeap *iface
|
||||||
return impl_from_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,
|
HRESULT d3d12_query_heap_create(struct d3d12_device *device, const D3D12_QUERY_HEAP_DESC *desc,
|
||||||
struct d3d12_query_heap **heap)
|
struct d3d12_query_heap **heap)
|
||||||
{
|
{
|
||||||
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
|
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
|
||||||
|
D3D12_HEAP_PROPERTIES heap_properties;
|
||||||
struct d3d12_query_heap *object;
|
struct d3d12_query_heap *object;
|
||||||
VkQueryPoolCreateInfo pool_info;
|
VkQueryPoolCreateInfo pool_info;
|
||||||
|
D3D12_RESOURCE_DESC buffer_desc;
|
||||||
|
size_t data_size;
|
||||||
VkResult vr;
|
VkResult vr;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
@ -6208,26 +6231,62 @@ HRESULT d3d12_query_heap_create(struct d3d12_device *device, const D3D12_QUERY_H
|
||||||
return E_INVALIDARG;
|
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)))
|
if (FAILED(hr = vkd3d_private_store_init(&object->private_store)))
|
||||||
{
|
{
|
||||||
vkd3d_free(object);
|
vkd3d_free(object);
|
||||||
return hr;
|
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);
|
d3d12_device_add_ref(device);
|
||||||
|
|
||||||
TRACE("Created query heap %p.\n", object);
|
TRACE("Created query heap %p.\n", object);
|
||||||
|
|
||||||
*heap = object;
|
*heap = object;
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -772,6 +772,8 @@ struct d3d12_query_heap
|
||||||
|
|
||||||
D3D12_QUERY_HEAP_DESC desc;
|
D3D12_QUERY_HEAP_DESC desc;
|
||||||
VkQueryPool vk_query_pool;
|
VkQueryPool vk_query_pool;
|
||||||
|
VkDeviceMemory vk_memory;
|
||||||
|
VkBuffer vk_buffer;
|
||||||
uint32_t initialized;
|
uint32_t initialized;
|
||||||
|
|
||||||
struct d3d12_device *device;
|
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,
|
HRESULT d3d12_query_heap_create(struct d3d12_device *device, const D3D12_QUERY_HEAP_DESC *desc,
|
||||||
struct d3d12_query_heap **heap);
|
struct d3d12_query_heap **heap);
|
||||||
struct d3d12_query_heap *unsafe_impl_from_ID3D12QueryHeap(ID3D12QueryHeap *iface);
|
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
|
enum vkd3d_root_signature_flag
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue