diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.cpp b/src/microsoft/vulkan/dzn_cmd_buffer.cpp index 5e7f7ffcf89..c5a7bdcf0a8 100644 --- a/src/microsoft/vulkan/dzn_cmd_buffer.cpp +++ b/src/microsoft/vulkan/dzn_cmd_buffer.cpp @@ -828,7 +828,7 @@ dzn_cmd_buffer_alloc_internal_buf(dzn_cmd_buffer *cmdbuf, ID3D12Resource **out) { dzn_device *device = container_of(cmdbuf->vk.base.device, dzn_device, vk); - ComPtr res; + ID3D12Resource *res; *out = NULL; /* Align size on 64k (the default alignment) */ @@ -863,10 +863,11 @@ dzn_cmd_buffer_alloc_internal_buf(dzn_cmd_buffer *cmdbuf, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (!entry) { cmdbuf->error = vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY); + res->Release(); return cmdbuf->error; } - entry->res = res.Detach(); + entry->res = res; list_addtail(&entry->link, &cmdbuf->internal_bufs); *out = entry->res; return VK_SUCCESS; diff --git a/src/microsoft/vulkan/dzn_device.cpp b/src/microsoft/vulkan/dzn_device.cpp index 2fabb186538..f84926b03d8 100644 --- a/src/microsoft/vulkan/dzn_device.cpp +++ b/src/microsoft/vulkan/dzn_device.cpp @@ -336,14 +336,14 @@ dzn_physical_device_cache_caps(dzn_physical_device *pdev) .NodeMask = 0, }; - ComPtr cmdqueue; - + ID3D12CommandQueue *cmdqueue; pdev->dev->CreateCommandQueue(&queue_desc, IID_PPV_ARGS(&cmdqueue)); uint64_t ts_freq; cmdqueue->GetTimestampFrequency(&ts_freq); pdev->timestamp_period = 1000000000.0f / ts_freq; + cmdqueue->Release(); } static void @@ -901,21 +901,28 @@ dzn_EnumeratePhysicalDevices(VkInstance inst, VK_FROM_HANDLE(dzn_instance, instance, inst); if (!instance->physical_devices_enumerated) { - ComPtr factory = dxgi_get_factory(false); - ComPtr adapter(NULL); + IDXGIFactory4 *factory = dxgi_get_factory(false); + IDXGIAdapter1 *adapter = NULL; for (UINT i = 0; SUCCEEDED(factory->EnumAdapters1(i, &adapter)); ++i) { DXGI_ADAPTER_DESC1 desc; adapter->GetDesc1(&desc); if (instance->debug_flags & DZN_DEBUG_WARP) { - if ((desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) == 0) + if ((desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) == 0) { + adapter->Release(); continue; + } } VkResult result = - dzn_physical_device_create(instance, adapter.Get(), &desc); - if (result != VK_SUCCESS) + dzn_physical_device_create(instance, adapter, &desc); + + adapter->Release(); + if (result != VK_SUCCESS) { + factory->Release(); return result; + } } + factory->Release(); } VK_OUTARRAY_MAKE_TYPED(VkPhysicalDevice, out, pPhysicalDevices, @@ -1788,7 +1795,7 @@ dzn_device_create_root_sig(dzn_device *device, { dzn_instance *instance = container_of(device->vk.physical->instance, dzn_instance, vk); - ComPtr sig, error; + ID3DBlob *sig, *error; if (FAILED(instance->d3d12.serialize_root_sig(desc, &sig, &error))) { @@ -1801,6 +1808,7 @@ dzn_device_create_root_sig(dzn_device *device, error_msg); } + error->Release(); return NULL; } @@ -1808,9 +1816,12 @@ dzn_device_create_root_sig(dzn_device *device, if (FAILED(device->dev->CreateRootSignature(0, sig->GetBufferPointer(), sig->GetBufferSize(), - IID_PPV_ARGS(&root_sig)))) + IID_PPV_ARGS(&root_sig)))) { + sig->Release(); return NULL; + } + sig->Release(); return root_sig; } diff --git a/src/microsoft/vulkan/dzn_private.h b/src/microsoft/vulkan/dzn_private.h index d6145dfaa0c..adb32295845 100644 --- a/src/microsoft/vulkan/dzn_private.h +++ b/src/microsoft/vulkan/dzn_private.h @@ -55,12 +55,9 @@ #define D3D12_IGNORE_SDK_LAYERS #include -#include #include "spirv_to_dxil.h" -using Microsoft::WRL::ComPtr; - #define DZN_SWAP(a, b) \ do { \ auto __tmp = a; \ diff --git a/src/microsoft/vulkan/dzn_query.cpp b/src/microsoft/vulkan/dzn_query.cpp index c16ae0abe39..cecf0aed4f4 100644 --- a/src/microsoft/vulkan/dzn_query.cpp +++ b/src/microsoft/vulkan/dzn_query.cpp @@ -264,16 +264,19 @@ dzn_GetQueryPoolResults(VkDevice device, uint64_t available = 0; if (flags & VK_QUERY_RESULT_WAIT_BIT) { - ComPtr query_fence(NULL); + ID3D12Fence *query_fence = NULL; uint64_t query_fence_val = 0; while (true) { mtx_lock(&qpool->queries_lock); - query_fence = ComPtr(query->fence); + if (query->fence) { + query_fence = query->fence; + query_fence->AddRef(); + } query_fence_val = query->fence_value; mtx_unlock(&qpool->queries_lock); - if (query_fence.Get()) + if (query_fence) break; /* Check again in 10ms. @@ -283,16 +286,23 @@ dzn_GetQueryPoolResults(VkDevice device, } query_fence->SetEventOnCompletion(query_fence_val, NULL); + query_fence->Release(); available = UINT64_MAX; } else { + ID3D12Fence *query_fence = NULL; mtx_lock(&qpool->queries_lock); - ComPtr query_fence(query->fence); + if (query->fence) { + query_fence = query->fence; + query_fence->AddRef(); + } uint64_t query_fence_val = query->fence_value; mtx_unlock(&qpool->queries_lock); - if (query_fence.Get() && - query_fence->GetCompletedValue() >= query_fence_val) - available = UINT64_MAX; + if (query_fence) { + if (query_fence->GetCompletedValue() >= query_fence_val) + available = UINT64_MAX; + query_fence->Release(); + } } if (qpool->heap_type != D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS) { diff --git a/src/microsoft/vulkan/dzn_util.cpp b/src/microsoft/vulkan/dzn_util.cpp index f18776be2fb..ce428984f62 100644 --- a/src/microsoft/vulkan/dzn_util.cpp +++ b/src/microsoft/vulkan/dzn_util.cpp @@ -67,7 +67,7 @@ dxgi_get_factory(bool debug) return factory; } -static ComPtr +static ID3D12Debug * get_debug_interface() { typedef HRESULT(WINAPI *PFN_D3D12_GET_DEBUG_INTERFACE)(REFIID riid, void **ppFactory); @@ -85,7 +85,7 @@ get_debug_interface() return NULL; } - ComPtr debug; + ID3D12Debug *debug; if (FAILED(D3D12GetDebugInterface(IID_PPV_ARGS(&debug)))) { mesa_loge("D3D12GetDebugInterface failed\n"); return NULL; @@ -97,19 +97,25 @@ get_debug_interface() void d3d12_enable_debug_layer() { - ComPtr debug = get_debug_interface(); - if (debug) + ID3D12Debug *debug = get_debug_interface(); + if (debug) { debug->EnableDebugLayer(); + debug->Release(); + } } void d3d12_enable_gpu_validation() { - ComPtr debug = get_debug_interface(); - ComPtr debug3; - if (debug && - SUCCEEDED(debug->QueryInterface(IID_PPV_ARGS(&debug3)))) - debug3->SetEnableGPUBasedValidation(true); + ID3D12Debug *debug = get_debug_interface(); + if (debug) { + ID3D12Debug3 *debug3; + if (SUCCEEDED(debug->QueryInterface(IID_PPV_ARGS(&debug3)))) { + debug3->SetEnableGPUBasedValidation(true); + debug3->Release(); + } + debug->Release(); + } } ID3D12Device1 *