From 35bca4cc432613af3926da3bed217a6baa9cbd26 Mon Sep 17 00:00:00 2001 From: lucy96chen <47800040+lucy96chen@users.noreply.github.com> Date: Fri, 1 Oct 2021 13:08:25 -0700 Subject: Add getNativeHandle() to ICommandQueue and ICommandBuffer (#1952) * Added support for getting command buffer and command queue handles to ICommandBuffer and ICommandQueue; D3D12Device, VkDevice, and DebugDevice modifieid to implement this new functionality; immediate-renderer-base.cpp also modified to implement the new functions * Removed excess boilerplate * Changed readRef() to get() in D3D12 getNativeHandle() implementation for ICommandBuffer and ICommandQueue * Added unit tests for new getNativeHandle() implementations, unfinished * Queue test added; Minor cleanup changes * getBufferHandleTestImpl() now closes the command buffer before returning * Added getNativeHandle() implementations to CUDADevice * Added comment clarifying that the Vulkan check is checking for a null handle, which is defined to be 0 --- tools/gfx-unit-test/get-buffer-handle-test.cpp | 98 ++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 tools/gfx-unit-test/get-buffer-handle-test.cpp (limited to 'tools/gfx-unit-test/get-buffer-handle-test.cpp') diff --git a/tools/gfx-unit-test/get-buffer-handle-test.cpp b/tools/gfx-unit-test/get-buffer-handle-test.cpp new file mode 100644 index 000000000..c8bd9bca5 --- /dev/null +++ b/tools/gfx-unit-test/get-buffer-handle-test.cpp @@ -0,0 +1,98 @@ +#include "tools/unit-test/slang-unit-test.h" + +#include "slang-gfx.h" +#include "gfx-test-util.h" +#include "tools/gfx-util/shader-cursor.h" +#include "source/core/slang-basic.h" + +#if SLANG_WINDOWS_FAMILY +#include +#endif + +using namespace gfx; + +namespace gfx_test +{ + void getBufferHandleTestImpl(IDevice* device, UnitTestContext* context) + { + // We need to create a transient heap in order to create a command buffer. + Slang::ComPtr transientHeap; + ITransientResourceHeap::Desc transientHeapDesc = {}; + transientHeapDesc.constantBufferSize = 4096; + GFX_CHECK_CALL_ABORT( + device->createTransientResourceHeap(transientHeapDesc, transientHeap.writeRef())); + + auto commandBuffer = transientHeap->createCommandBuffer(); + struct CloseComandBufferRAII + { + ICommandBuffer* m_commandBuffer; + ~CloseComandBufferRAII() + { + m_commandBuffer->close(); + } + } closeCommandBufferRAII{ commandBuffer }; + ICommandBuffer::NativeHandle handle = 0; + GFX_CHECK_CALL_ABORT(commandBuffer->getNativeHandle(&handle)); + if (device->getDeviceInfo().deviceType == gfx::DeviceType::Vulkan) + { + // Check that the handle is not null, which is defined as 0. + SLANG_CHECK(handle != 0); + } +#if SLANG_WINDOWS_FAMILY + else + { + auto d3d12Handle = (ID3D12GraphicsCommandList*)handle; + Slang::ComPtr testHandle; + GFX_CHECK_CALL_ABORT(d3d12Handle->QueryInterface(testHandle.writeRef())); + } +#endif + } + + void getBufferHandleTestAPI(UnitTestContext* context, Slang::RenderApiFlag::Enum api) + { + if ((api & context->enabledApis) == 0) + { + SLANG_IGNORE_TEST; + } + Slang::ComPtr device; + IDevice::Desc deviceDesc = {}; + switch (api) + { + case Slang::RenderApiFlag::D3D11: + deviceDesc.deviceType = gfx::DeviceType::DirectX11; + break; + case Slang::RenderApiFlag::D3D12: + deviceDesc.deviceType = gfx::DeviceType::DirectX12; + break; + case Slang::RenderApiFlag::Vulkan: + deviceDesc.deviceType = gfx::DeviceType::Vulkan; + break; + default: + SLANG_IGNORE_TEST; + } + deviceDesc.slang.slangGlobalSession = context->slangGlobalSession; + const char* searchPaths[] = { "", "../../tools/gfx-unit-test", "tools/gfx-unit-test" }; + deviceDesc.slang.searchPathCount = (SlangInt)SLANG_COUNT_OF(searchPaths); + deviceDesc.slang.searchPaths = searchPaths; + auto createDeviceResult = gfxCreateDevice(&deviceDesc, device.writeRef()); + if (SLANG_FAILED(createDeviceResult)) + { + SLANG_IGNORE_TEST; + } + + getBufferHandleTestImpl(device, context); + } + +#if SLANG_WINDOWS_FAMILY + SLANG_UNIT_TEST(getBufferHandleD3D12) + { + return getBufferHandleTestAPI(unitTestContext, Slang::RenderApiFlag::D3D12); + } +#endif + + SLANG_UNIT_TEST(getBufferHandleVulkan) + { + return getBufferHandleTestAPI(unitTestContext, Slang::RenderApiFlag::Vulkan); + } + +} -- cgit v1.2.3