diff options
| author | lucy96chen <47800040+lucy96chen@users.noreply.github.com> | 2021-12-08 11:38:14 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-08 11:38:14 -0800 |
| commit | 9606401e1de1002e3ad070bc5c6384fa5bc4d9ff (patch) | |
| tree | 7a557a14fadf5220a34f6df9faf1a5535100743f /tools/gfx-unit-test/get-shared-handle.cpp | |
| parent | 90d8af888b40c83b33f9f0c037bd2ab8c19a35f4 (diff) | |
D3D12 and Vulkan to CUDA Texture Sharing (#2038)
Diffstat (limited to 'tools/gfx-unit-test/get-shared-handle.cpp')
| -rw-r--r-- | tools/gfx-unit-test/get-shared-handle.cpp | 125 |
1 files changed, 0 insertions, 125 deletions
diff --git a/tools/gfx-unit-test/get-shared-handle.cpp b/tools/gfx-unit-test/get-shared-handle.cpp deleted file mode 100644 index 8b991f15c..000000000 --- a/tools/gfx-unit-test/get-shared-handle.cpp +++ /dev/null @@ -1,125 +0,0 @@ -#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" - -using namespace gfx; - -namespace gfx_test -{ - void sharedHandleTestImpl(IDevice* srcDevice, IDevice* dstDevice, UnitTestContext* context) - { - // Create a shareable buffer using srcDevice, get its handle, then create a buffer using the handle using - // dstDevice. Read back the buffer and check that its contents are correct. - const int numberCount = 4; - float initialData[] = { 0.0f, 1.0f, 2.0f, 3.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; - bufferDesc.isShared = true; - - ComPtr<IBufferResource> srcBuffer; - GFX_CHECK_CALL_ABORT(srcDevice->createBufferResource( - bufferDesc, - (void*)initialData, - srcBuffer.writeRef())); - - InteropHandle sharedHandle; - GFX_CHECK_CALL_ABORT(srcBuffer->getSharedHandle(&sharedHandle)); - ComPtr<IBufferResource> dstBuffer; - GFX_CHECK_CALL_ABORT(dstDevice->createBufferFromSharedHandle(sharedHandle, bufferDesc, dstBuffer.writeRef())); - // Reading back the buffer from srcDevice to make sure it's been filled in before reading anything back from dstDevice - // TODO: Implement actual synchronization (and not this hacky solution) - compareComputeResult(srcDevice, srcBuffer, Slang::makeArray<float>(0.0f, 1.0f, 2.0f, 3.0f)); - - InteropHandle testHandle; - GFX_CHECK_CALL_ABORT(dstBuffer->getNativeResourceHandle(&testHandle)); - IBufferResource::Desc* testDesc = dstBuffer->getDesc(); - SLANG_CHECK(testDesc->elementSize == sizeof(float)); - SLANG_CHECK(testDesc->sizeInBytes == numberCount * sizeof(float)); - compareComputeResult(dstDevice, dstBuffer, Slang::makeArray<float>(0.0f, 1.0f, 2.0f, 3.0f)); - - // Check that dstBuffer can be successfully used in a compute dispatch using dstDevice. - Slang::ComPtr<ITransientResourceHeap> transientHeap; - ITransientResourceHeap::Desc transientHeapDesc = {}; - transientHeapDesc.constantBufferSize = 4096; - GFX_CHECK_CALL_ABORT( - dstDevice->createTransientResourceHeap(transientHeapDesc, transientHeap.writeRef())); - - ComPtr<IShaderProgram> shaderProgram; - slang::ProgramLayout* slangReflection; - GFX_CHECK_CALL_ABORT(loadComputeProgram(dstDevice, shaderProgram, "compute-trivial", "computeMain", slangReflection)); - - ComputePipelineStateDesc pipelineDesc = {}; - pipelineDesc.program = shaderProgram.get(); - ComPtr<gfx::IPipelineState> pipelineState; - GFX_CHECK_CALL_ABORT( - dstDevice->createComputePipelineState(pipelineDesc, pipelineState.writeRef())); - - ComPtr<IResourceView> bufferView; - IResourceView::Desc viewDesc = {}; - viewDesc.type = IResourceView::Type::UnorderedAccess; - viewDesc.format = Format::Unknown; - GFX_CHECK_CALL_ABORT(dstDevice->createBufferView(dstBuffer, viewDesc, bufferView.writeRef())); - - { - ICommandQueue::Desc queueDesc = { ICommandQueue::QueueType::Graphics }; - auto queue = dstDevice->createCommandQueue(queueDesc); - - auto commandBuffer = transientHeap->createCommandBuffer(); - auto encoder = commandBuffer->encodeComputeCommands(); - - auto rootObject = encoder->bindPipeline(pipelineState); - - ShaderCursor rootCursor(rootObject); - // Bind buffer view to the entry point. - rootCursor.getPath("buffer").setResource(bufferView); - - encoder->dispatchCompute(1, 1, 1); - encoder->endEncoding(); - commandBuffer->close(); - queue->executeCommandBuffer(commandBuffer); - queue->waitOnHost(); - } - - compareComputeResult( - dstDevice, - dstBuffer, - Slang::makeArray<float>(1.0f, 2.0f, 3.0f, 4.0f)); - } - - void sharedHandleTestAPI(UnitTestContext* context, Slang::RenderApiFlag::Enum srcApi, Slang::RenderApiFlag::Enum dstApi) - { - auto srcDevice = createTestingDevice(context, srcApi); - auto dstDevice = createTestingDevice(context, dstApi); - if (!srcDevice || !dstDevice) - { - SLANG_IGNORE_TEST; - } - - sharedHandleTestImpl(srcDevice, dstDevice, context); - } -#if SLANG_WIN64 - SLANG_UNIT_TEST(sharedHandleD3D12ToCUDA) - { - sharedHandleTestAPI(unitTestContext, Slang::RenderApiFlag::D3D12, Slang::RenderApiFlag::CUDA); - } - -#if SLANG_WINDOWS_FAMILY // TODO: Remove when Linux support is added - SLANG_UNIT_TEST(sharedHandleVulkanToCUDA) - { - sharedHandleTestAPI(unitTestContext, Slang::RenderApiFlag::Vulkan, Slang::RenderApiFlag::CUDA); - } -#endif -#endif -} |
