vkd3d: Clean up heap initialization and destruction.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-04-16 22:54:49 +02:00 committed by Hans-Kristian Arntzen
parent 4d602d1958
commit 4ed642f5e6
1 changed files with 22 additions and 26 deletions

View File

@ -324,18 +324,14 @@ static ULONG STDMETHODCALLTYPE d3d12_heap_AddRef(d3d12_heap_iface *iface)
static ULONG d3d12_resource_decref(struct d3d12_resource *resource);
static void d3d12_heap_destroy(struct d3d12_heap *heap)
static void d3d12_heap_cleanup(struct d3d12_heap *heap)
{
struct d3d12_device *device = heap->device;
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
TRACE("Destroying heap %p.\n", heap);
if (heap->buffer_resource)
d3d12_resource_decref(heap->buffer_resource);
vkd3d_private_store_destroy(&heap->private_store);
VK_CALL(vkFreeMemory(device->vk_device, heap->vk_memory, NULL));
pthread_mutex_destroy(&heap->mutex);
@ -343,12 +339,19 @@ static void d3d12_heap_destroy(struct d3d12_heap *heap)
if (heap->is_private)
device = NULL;
vkd3d_free(heap);
if (device)
d3d12_device_release(device);
}
static void d3d12_heap_destroy(struct d3d12_heap *heap)
{
TRACE("Destroying heap %p.\n", heap);
d3d12_heap_cleanup(heap);
vkd3d_private_store_destroy(&heap->private_store);
vkd3d_free(heap);
}
static ULONG STDMETHODCALLTYPE d3d12_heap_Release(d3d12_heap_iface *iface)
{
struct d3d12_heap *heap = impl_from_ID3D12Heap(iface);
@ -606,8 +609,10 @@ static HRESULT d3d12_heap_init(struct d3d12_heap *heap,
D3D12_RESOURCE_DESC resource_desc;
D3D12_RESOURCE_STATES initial_resource_state;
memset(heap, 0, sizeof(*heap));
heap->ID3D12Heap_iface.lpVtbl = &d3d12_heap_vtbl;
heap->refcount = 1;
heap->device = device;
heap->is_private = !!resource;
@ -617,6 +622,9 @@ static HRESULT d3d12_heap_init(struct d3d12_heap *heap,
heap->map_count = 0;
heap->buffer_resource = NULL;
if (!heap->is_private)
d3d12_device_add_ref(heap->device);
if (!heap->desc.Properties.CreationNodeMask)
heap->desc.Properties.CreationNodeMask = 1;
if (!heap->desc.Properties.VisibleNodeMask)
@ -629,7 +637,10 @@ static HRESULT d3d12_heap_init(struct d3d12_heap *heap,
heap->desc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
if (FAILED(hr = validate_heap_desc(&heap->desc, resource)))
{
d3d12_heap_cleanup(heap);
return hr;
}
if ((rc = pthread_mutex_init(&heap->mutex, NULL)))
{
@ -637,12 +648,6 @@ static HRESULT d3d12_heap_init(struct d3d12_heap *heap,
return hresult_from_errno(rc);
}
if (FAILED(hr = vkd3d_private_store_init(&heap->private_store)))
{
pthread_mutex_destroy(&heap->mutex);
return hr;
}
buffers_allowed = !(heap->desc.Flags & D3D12_HEAP_FLAG_DENY_BUFFERS);
if (buffers_allowed && !resource)
{
@ -682,7 +687,7 @@ static HRESULT d3d12_heap_init(struct d3d12_heap *heap,
&resource_desc, initial_resource_state,
NULL, false, &heap->buffer_resource)))
{
heap->buffer_resource = NULL;
d3d12_heap_cleanup(heap);
return hr;
}
/* This internal resource should not own a reference on the device.
@ -725,22 +730,13 @@ static HRESULT d3d12_heap_init(struct d3d12_heap *heap,
heap->desc.Flags, &memory_requirements, NULL,
&heap->vk_memory, &heap->vk_memory_type);
}
if (FAILED(hr))
if (FAILED(hr) || FAILED(hr = vkd3d_private_store_init(&heap->private_store)))
{
vkd3d_private_store_destroy(&heap->private_store);
pthread_mutex_destroy(&heap->mutex);
if (heap->buffer_resource)
{
d3d12_resource_decref(heap->buffer_resource);
heap->buffer_resource = NULL;
}
d3d12_heap_cleanup(heap);
return hr;
}
heap->device = device;
if (!heap->is_private)
d3d12_device_add_ref(heap->device);
return S_OK;
}