diff options
| author | lucy96chen <47800040+lucy96chen@users.noreply.github.com> | 2021-10-04 09:46:33 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-04 09:46:33 -0700 |
| commit | b3dfe383c6d31ff3dbd76dcfb32de8d536382f3e (patch) | |
| tree | 06efb21869df7ccdca6d98ab4217b8bf75dfdd2f /tools/gfx-unit-test | |
| parent | 35bca4cc432613af3926da3bed217a6baa9cbd26 (diff) | |
Get native handles for TextureResource and BufferResource (#1960)
* Added getNativeHandle() to TextureResource and BufferResource; Implemented getNativeHandle() in Vulkan and D3D12; Added new unit test files for the aforementioned implementation
* Added missing getNativeHandle() implementations to renderer-shared.cpp and CUDA
* Finished new getNativeHandle() unit tests for ITextureResource and IBufferResource; Modified ICommandQueue and ICommandBuffer unit tests to call QueryInterface to convert to IUnknown then back and compare resulting pointers for equality
* Unit tests updated and pass locally
* Cast m_buffer.m_buffer and m_image to uint64_t
Diffstat (limited to 'tools/gfx-unit-test')
| -rw-r--r-- | tools/gfx-unit-test/existing-device-handle-test.cpp | 8 | ||||
| -rw-r--r-- | tools/gfx-unit-test/get-buffer-resource-handle-test.cpp | 102 | ||||
| -rw-r--r-- | tools/gfx-unit-test/get-cmd-buffer-handle-test.cpp (renamed from tools/gfx-unit-test/get-buffer-handle-test.cpp) | 14 | ||||
| -rw-r--r-- | tools/gfx-unit-test/get-cmd-queue-handle-test.cpp (renamed from tools/gfx-unit-test/get-queue-handle-test.cpp) | 14 | ||||
| -rw-r--r-- | tools/gfx-unit-test/get-texture-resource-handle-test.cpp | 94 |
5 files changed, 216 insertions, 16 deletions
diff --git a/tools/gfx-unit-test/existing-device-handle-test.cpp b/tools/gfx-unit-test/existing-device-handle-test.cpp index a8ebb67c9..2a4ffea26 100644 --- a/tools/gfx-unit-test/existing-device-handle-test.cpp +++ b/tools/gfx-unit-test/existing-device-handle-test.cpp @@ -100,7 +100,7 @@ namespace gfx_test { if ((api & context->enabledApis) == 0) { - return SLANG_IGNORE_TEST; + SLANG_IGNORE_TEST; } Slang::ComPtr<IDevice> device; IDevice::Desc deviceDesc = {}; @@ -116,7 +116,7 @@ namespace gfx_test deviceDesc.deviceType = gfx::DeviceType::Vulkan; break; default: - return SLANG_IGNORE_TEST; + SLANG_IGNORE_TEST; } deviceDesc.slang.slangGlobalSession = context->slangGlobalSession; const char* searchPaths[] = { "", "../../tools/gfx-unit-test", "tools/gfx-unit-test" }; @@ -125,7 +125,7 @@ namespace gfx_test auto createDeviceResult = gfxCreateDevice(&deviceDesc, device.writeRef()); if (SLANG_FAILED(createDeviceResult)) { - return SLANG_IGNORE_TEST; + SLANG_IGNORE_TEST; } IDevice::NativeHandle handle = {}; @@ -136,7 +136,7 @@ namespace gfx_test auto createTestDeviceResult = gfxCreateDevice(&testDeviceDesc, testDevice.writeRef()); if (SLANG_FAILED(createTestDeviceResult)) { - return SLANG_IGNORE_TEST; + SLANG_IGNORE_TEST; } existingDeviceHandleTestImpl(testDevice, context); diff --git a/tools/gfx-unit-test/get-buffer-resource-handle-test.cpp b/tools/gfx-unit-test/get-buffer-resource-handle-test.cpp new file mode 100644 index 000000000..35ad167f2 --- /dev/null +++ b/tools/gfx-unit-test/get-buffer-resource-handle-test.cpp @@ -0,0 +1,102 @@ +#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 <d3d12.h> +#endif + +using namespace gfx; + +namespace gfx_test +{ + void getBufferResourceHandleTestImpl(IDevice* device, UnitTestContext* context) + { + const int numberCount = 1; + float initialData[] = { 0.0f }; + IBufferResource::Desc bufferDesc = {}; + bufferDesc.sizeInBytes = numberCount * sizeof(float); + bufferDesc.format = gfx::Format::Unknown; + bufferDesc.elementSize = sizeof(float); + bufferDesc.allowedStates = ResourceStateSet( + ResourceState::ShaderResource, + ResourceState::UnorderedAccess, + ResourceState::CopyDestination, + ResourceState::CopySource); + bufferDesc.defaultState = ResourceState::UnorderedAccess; + bufferDesc.cpuAccessFlags = AccessFlag::Write | AccessFlag::Read; + + ComPtr<IBufferResource> buffer; + GFX_CHECK_CALL_ABORT(device->createBufferResource( + bufferDesc, + (void*)initialData, + buffer.writeRef())); + + IBufferResource::NativeHandle handle; + GFX_CHECK_CALL_ABORT(buffer->getNativeHandle(&handle)); + if (device->getDeviceInfo().deviceType == gfx::DeviceType::Vulkan) + { + SLANG_CHECK(handle != NULL); + } +#if SLANG_WINDOWS_FAMILY + else + { + auto d3d12Handle = (ID3D12Resource*)handle; + Slang::ComPtr<IUnknown> testHandle1; + GFX_CHECK_CALL_ABORT(d3d12Handle->QueryInterface<IUnknown>(testHandle1.writeRef())); + Slang::ComPtr<ID3D12Resource> testHandle2; + GFX_CHECK_CALL_ABORT(testHandle1->QueryInterface<ID3D12Resource>(testHandle2.writeRef())); + SLANG_CHECK(d3d12Handle == testHandle2.get()); + } +#endif + } + + void getBufferResourceHandleTestAPI(UnitTestContext* context, Slang::RenderApiFlag::Enum api) + { + if ((api & context->enabledApis) == 0) + { + SLANG_IGNORE_TEST; + } + Slang::ComPtr<IDevice> 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; + } + + getBufferResourceHandleTestImpl(device, context); + } + + SLANG_UNIT_TEST(getBufferResourceHandleD3D12) + { + return getBufferResourceHandleTestAPI(unitTestContext, Slang::RenderApiFlag::D3D12); + } + + SLANG_UNIT_TEST(getBufferResourceHandleVulkan) + { + return getBufferResourceHandleTestAPI(unitTestContext, Slang::RenderApiFlag::Vulkan); + } + +} diff --git a/tools/gfx-unit-test/get-buffer-handle-test.cpp b/tools/gfx-unit-test/get-cmd-buffer-handle-test.cpp index c8bd9bca5..62a00c3c2 100644 --- a/tools/gfx-unit-test/get-buffer-handle-test.cpp +++ b/tools/gfx-unit-test/get-cmd-buffer-handle-test.cpp @@ -35,15 +35,17 @@ namespace gfx_test 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); + SLANG_CHECK(handle != NULL); } #if SLANG_WINDOWS_FAMILY else { auto d3d12Handle = (ID3D12GraphicsCommandList*)handle; - Slang::ComPtr<ID3D12CommandList> testHandle; - GFX_CHECK_CALL_ABORT(d3d12Handle->QueryInterface<ID3D12CommandList>(testHandle.writeRef())); + Slang::ComPtr<IUnknown> testHandle1; + GFX_CHECK_CALL_ABORT(d3d12Handle->QueryInterface<IUnknown>(testHandle1.writeRef())); + Slang::ComPtr<ID3D12GraphicsCommandList> testHandle2; + GFX_CHECK_CALL_ABORT(d3d12Handle->QueryInterface<ID3D12GraphicsCommandList>(testHandle2.writeRef())); + SLANG_CHECK(d3d12Handle == testHandle2.get()); } #endif } @@ -84,13 +86,13 @@ namespace gfx_test } #if SLANG_WINDOWS_FAMILY - SLANG_UNIT_TEST(getBufferHandleD3D12) + SLANG_UNIT_TEST(getCmdBufferHandleD3D12) { return getBufferHandleTestAPI(unitTestContext, Slang::RenderApiFlag::D3D12); } #endif - SLANG_UNIT_TEST(getBufferHandleVulkan) + SLANG_UNIT_TEST(getCmdBufferHandleVulkan) { return getBufferHandleTestAPI(unitTestContext, Slang::RenderApiFlag::Vulkan); } diff --git a/tools/gfx-unit-test/get-queue-handle-test.cpp b/tools/gfx-unit-test/get-cmd-queue-handle-test.cpp index f16e740bf..5e530e3f2 100644 --- a/tools/gfx-unit-test/get-queue-handle-test.cpp +++ b/tools/gfx-unit-test/get-cmd-queue-handle-test.cpp @@ -21,15 +21,17 @@ namespace gfx_test GFX_CHECK_CALL_ABORT(queue->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); + SLANG_CHECK(handle != NULL); } #if SLANG_WINDOWS_FAMILY else { auto d3d12Queue = (ID3D12CommandQueue*)handle; - Slang::ComPtr<IUnknown> testHandle; - GFX_CHECK_CALL_ABORT(d3d12Queue->QueryInterface<IUnknown>(testHandle.writeRef())); + Slang::ComPtr<IUnknown> testHandle1; + GFX_CHECK_CALL_ABORT(d3d12Queue->QueryInterface<IUnknown>(testHandle1.writeRef())); + Slang::ComPtr<ID3D12CommandQueue> testHandle2; + GFX_CHECK_CALL_ABORT(testHandle1->QueryInterface<ID3D12CommandQueue>(testHandle2.writeRef())); + SLANG_CHECK(d3d12Queue == testHandle2.get()); } #endif } @@ -69,12 +71,12 @@ namespace gfx_test getQueueHandleTestImpl(device, context); } - SLANG_UNIT_TEST(getQueueHandleD3D12) + SLANG_UNIT_TEST(getCmdQueueHandleD3D12) { return getQueueHandleTestAPI(unitTestContext, Slang::RenderApiFlag::D3D12); } - SLANG_UNIT_TEST(getQueueHandleVulkan) + SLANG_UNIT_TEST(getCmdQueueHandleVulkan) { return getQueueHandleTestAPI(unitTestContext, Slang::RenderApiFlag::Vulkan); } diff --git a/tools/gfx-unit-test/get-texture-resource-handle-test.cpp b/tools/gfx-unit-test/get-texture-resource-handle-test.cpp new file mode 100644 index 000000000..4883a28bd --- /dev/null +++ b/tools/gfx-unit-test/get-texture-resource-handle-test.cpp @@ -0,0 +1,94 @@ +#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 <d3d12.h> +#endif + +using namespace gfx; + +namespace gfx_test +{ + void getTextureResourceHandleTestImpl(IDevice* device, UnitTestContext* context) + { + ITextureResource::Desc desc = {}; + desc.type = IResource::Type::Texture2D; + desc.numMipLevels = 1; + desc.size.width = 1; + desc.size.height = 1; + desc.size.depth = 1; + desc.defaultState = ResourceState::UnorderedAccess; + desc.format = Format::RGBA_Float16; + + Slang::ComPtr<ITextureResource> buffer; + buffer = device->createTextureResource(desc); + + ITextureResource::NativeHandle handle; + GFX_CHECK_CALL_ABORT(buffer->getNativeHandle(&handle)); + if (device->getDeviceInfo().deviceType == gfx::DeviceType::Vulkan) + { + SLANG_CHECK(handle != NULL); + } +#if SLANG_WINDOWS_FAMILY + else + { + auto d3d12Handle = (ID3D12Resource*)handle; + Slang::ComPtr<IUnknown> testHandle1; + GFX_CHECK_CALL_ABORT(d3d12Handle->QueryInterface<IUnknown>(testHandle1.writeRef())); + Slang::ComPtr<ID3D12Resource> testHandle2; + GFX_CHECK_CALL_ABORT(testHandle1->QueryInterface<ID3D12Resource>(testHandle2.writeRef())); + SLANG_CHECK(d3d12Handle == testHandle2.get()); + } +#endif + } + + void getTextureResourceHandleTestAPI(UnitTestContext* context, Slang::RenderApiFlag::Enum api) + { + if ((api & context->enabledApis) == 0) + { + SLANG_IGNORE_TEST; + } + Slang::ComPtr<IDevice> 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; + } + + getTextureResourceHandleTestImpl(device, context); + } + + SLANG_UNIT_TEST(getTextureResourceHandleD3D12) + { + return getTextureResourceHandleTestAPI(unitTestContext, Slang::RenderApiFlag::D3D12); + } + + SLANG_UNIT_TEST(getTextureResourceHandleVulkan) + { + return getTextureResourceHandleTestAPI(unitTestContext, Slang::RenderApiFlag::Vulkan); + } + +} |
