diff options
| author | Yong He <yonghe@outlook.com> | 2022-02-03 19:17:30 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-03 19:17:30 -0800 |
| commit | d06a78d935b2743494d47ed5cd3f36e38ac9c5ac (patch) | |
| tree | 7615fd89cb826f2c463b4a221f19139d3a5d4a9d /tools | |
| parent | 5eb835f0332868fd56ac14ce7560e0ae9cfafec9 (diff) | |
Add gfx interop to allow more direct D3D12 usage scenarios. (#2117)
* Add gfx interop to allow more direct D3D12 usage scenarios.
* Fix compile error in win32.
* gfx: Implement IFence::getNativeHandle() on d3d12.
* More GFX-D3D interop interface.
* Fix cuda.
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/gfx-unit-test/copy-texture-tests.cpp | 12 | ||||
| -rw-r--r-- | tools/gfx-unit-test/get-cmd-buffer-handle-test.cpp | 6 | ||||
| -rw-r--r-- | tools/gfx-unit-test/get-cmd-queue-handle-test.cpp | 6 | ||||
| -rw-r--r-- | tools/gfx/cuda/render-cuda.cpp | 18 | ||||
| -rw-r--r-- | tools/gfx/d3d12/render-d3d12.cpp | 164 | ||||
| -rw-r--r-- | tools/gfx/debug-layer.cpp | 38 | ||||
| -rw-r--r-- | tools/gfx/debug-layer.h | 12 | ||||
| -rw-r--r-- | tools/gfx/immediate-renderer-base.cpp | 11 | ||||
| -rw-r--r-- | tools/gfx/mutable-shader-object.h | 4 | ||||
| -rw-r--r-- | tools/gfx/renderer-shared.cpp | 23 | ||||
| -rw-r--r-- | tools/gfx/renderer-shared.h | 4 | ||||
| -rw-r--r-- | tools/gfx/vulkan/render-vk.cpp | 55 |
12 files changed, 263 insertions, 90 deletions
diff --git a/tools/gfx-unit-test/copy-texture-tests.cpp b/tools/gfx-unit-test/copy-texture-tests.cpp index fa206afda..069d20f02 100644 --- a/tools/gfx-unit-test/copy-texture-tests.cpp +++ b/tools/gfx-unit-test/copy-texture-tests.cpp @@ -222,9 +222,9 @@ namespace gfx_test RefPtr<TextureStuff> generateTextureData(int width, int height, uint32_t mipLevels, uint32_t arrayLayers) { RefPtr<TextureStuff> texture = new TextureStuff(); - for (int layer = 0; layer < arrayLayers; ++layer) + for (uint32_t layer = 0; layer < arrayLayers; ++layer) { - for (int mip = 0; mip < mipLevels; ++mip) + for (uint32_t mip = 0; mip < mipLevels; ++mip) { RefPtr<SubresourceStuff> subresource = new SubresourceStuff(); texture->subresourceObjects.add(subresource); @@ -239,10 +239,10 @@ namespace gfx_test for (int w = 0; w < mipWidth; ++w) { // 4 channels per pixel - subresource->texels[h * mipWidth + w].channels[0] = w; - subresource->texels[h * mipWidth + w].channels[1] = h; - subresource->texels[h * mipWidth + w].channels[2] = mip; - subresource->texels[h * mipWidth + w].channels[3] = layer; + subresource->texels[h * mipWidth + w].channels[0] = (float)w; + subresource->texels[h * mipWidth + w].channels[1] = (float)h; + subresource->texels[h * mipWidth + w].channels[2] = (float)mip; + subresource->texels[h * mipWidth + w].channels[3] = (float)layer; } } diff --git a/tools/gfx-unit-test/get-cmd-buffer-handle-test.cpp b/tools/gfx-unit-test/get-cmd-buffer-handle-test.cpp index 97cb9a808..120c331ed 100644 --- a/tools/gfx-unit-test/get-cmd-buffer-handle-test.cpp +++ b/tools/gfx-unit-test/get-cmd-buffer-handle-test.cpp @@ -31,16 +31,16 @@ namespace gfx_test m_commandBuffer->close(); } } closeCommandBufferRAII{ commandBuffer }; - ICommandBuffer::NativeHandle handle = 0; + InteropHandle handle = {}; GFX_CHECK_CALL_ABORT(commandBuffer->getNativeHandle(&handle)); if (device->getDeviceInfo().deviceType == gfx::DeviceType::Vulkan) { - SLANG_CHECK(handle != NULL); + SLANG_CHECK(handle.handleValue != 0); } #if SLANG_WINDOWS_FAMILY else { - auto d3d12Handle = (ID3D12GraphicsCommandList*)handle; + auto d3d12Handle = (ID3D12GraphicsCommandList*)handle.handleValue; Slang::ComPtr<IUnknown> testHandle1; GFX_CHECK_CALL_ABORT(d3d12Handle->QueryInterface<IUnknown>(testHandle1.writeRef())); Slang::ComPtr<ID3D12GraphicsCommandList> testHandle2; diff --git a/tools/gfx-unit-test/get-cmd-queue-handle-test.cpp b/tools/gfx-unit-test/get-cmd-queue-handle-test.cpp index ad439e946..0dd5ad561 100644 --- a/tools/gfx-unit-test/get-cmd-queue-handle-test.cpp +++ b/tools/gfx-unit-test/get-cmd-queue-handle-test.cpp @@ -17,16 +17,16 @@ namespace gfx_test { ICommandQueue::Desc queueDesc = { ICommandQueue::QueueType::Graphics }; auto queue = device->createCommandQueue(queueDesc); - ICommandQueue::NativeHandle handle; + InteropHandle handle; GFX_CHECK_CALL_ABORT(queue->getNativeHandle(&handle)); if (device->getDeviceInfo().deviceType == gfx::DeviceType::Vulkan) { - SLANG_CHECK(handle != NULL); + SLANG_CHECK(handle.handleValue != NULL); } #if SLANG_WINDOWS_FAMILY else { - auto d3d12Queue = (ID3D12CommandQueue*)handle; + auto d3d12Queue = (ID3D12CommandQueue*)handle.handleValue; Slang::ComPtr<IUnknown> testHandle1; GFX_CHECK_CALL_ABORT(d3d12Queue->QueryInterface<IUnknown>(testHandle1.writeRef())); Slang::ComPtr<ID3D12CommandQueue> testHandle2; diff --git a/tools/gfx/cuda/render-cuda.cpp b/tools/gfx/cuda/render-cuda.cpp index 0446dc055..cb8f779f4 100644 --- a/tools/gfx/cuda/render-cuda.cpp +++ b/tools/gfx/cuda/render-cuda.cpp @@ -944,6 +944,12 @@ public: return static_cast<ICommandBuffer*>(this); return nullptr; } + + virtual SLANG_NO_THROW Result SLANG_MCALL resetDescriptorHeaps() override + { + return SLANG_OK; + } + public: CUDADevice* m_device; @@ -1178,11 +1184,9 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL close() override {} - virtual SLANG_NO_THROW Result SLANG_MCALL - getNativeHandle(NativeHandle* outHandle) override + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override { - *outHandle = 0; - return SLANG_OK; + return SLANG_FAIL; } }; @@ -1251,11 +1255,9 @@ public: return SLANG_FAIL; } - virtual SLANG_NO_THROW Result SLANG_MCALL - getNativeHandle(NativeHandle* outHandle) override + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override { - *outHandle = (uint64_t)stream; - return SLANG_OK; + return SLANG_FAIL; } public: diff --git a/tools/gfx/d3d12/render-d3d12.cpp b/tools/gfx/d3d12/render-d3d12.cpp index 8555bb4ec..a6d02cdc3 100644 --- a/tools/gfx/d3d12/render-d3d12.cpp +++ b/tools/gfx/d3d12/render-d3d12.cpp @@ -382,6 +382,12 @@ public: { m_allocator->free(m_descriptor); } + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override + { + outHandle->api = InteropHandleAPI::D3D12CpuDescriptorHandle; + outHandle->handleValue = m_descriptor.cpuHandle.ptr; + return SLANG_OK; + } }; class ResourceViewInternalImpl @@ -398,6 +404,12 @@ public: { public: RefPtr<Resource> m_resource; + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override + { + outHandle->api = InteropHandleAPI::D3D12CpuDescriptorHandle; + outHandle->handleValue = m_descriptor.cpuHandle.ptr; + return SLANG_OK; + } }; class FramebufferLayoutImpl : public FramebufferLayoutBase @@ -461,6 +473,12 @@ public: pipelineDesc.compute = inDesc; initializeBase(pipelineDesc); } + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override + { + outHandle->api = InteropHandleAPI::D3D12; + outHandle->handleValue = reinterpret_cast<uint64_t>(m_pipelineState.get()); + return SLANG_OK; + } }; #if SLANG_GFX_HAS_DXR_SUPPORT @@ -475,6 +493,12 @@ public: pipelineDesc.rayTracing = inDesc; initializeBase(pipelineDesc); } + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override + { + outHandle->api = InteropHandleAPI::D3D12; + outHandle->handleValue = reinterpret_cast<uint64_t>(m_stateObject.get()); + return SLANG_OK; + } }; #endif @@ -3358,6 +3382,20 @@ public: return nullptr; } virtual void comFree() override { m_transientHeap.breakStrongReference(); } + + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* handle) override + { + handle->api = InteropHandleAPI::D3D12; + handle->handleValue = (uint64_t)m_cmdList.get(); + return SLANG_OK; + } + + virtual SLANG_NO_THROW Result SLANG_MCALL resetDescriptorHeaps() override + { + bindDescriptorHeaps(); + return SLANG_OK; + } + public: ComPtr<ID3D12GraphicsCommandList> m_cmdList; ComPtr<ID3D12GraphicsCommandList1> m_cmdList1; @@ -3449,29 +3487,36 @@ public: framebuffer->depthStencilView ? &framebuffer->depthStencilDescriptor : nullptr); // Issue clear commands based on render pass set up. - for (Index i = 0; i < renderPass->m_renderTargetAccesses.getCount(); i++) + for (Index i = 0; i < framebuffer->renderTargetViews.getCount(); i++) { + if (i >= renderPass->m_renderTargetAccesses.getCount()) + continue; + auto& access = renderPass->m_renderTargetAccesses[i]; // Transit resource states. { D3D12BarrierSubmitter submitter(m_d3dCmdList); auto resourceViewImpl = framebuffer->renderTargetViews[i].Ptr(); - auto textureResource = - static_cast<TextureResourceImpl*>(resourceViewImpl->m_resource.Ptr()); - D3D12_RESOURCE_STATES initialState; - if (access.initialState == ResourceState::Undefined) - { - initialState = textureResource->m_defaultState; - } - else + if (resourceViewImpl) { - initialState = D3DUtil::getResourceState(access.initialState); + auto textureResource = static_cast<TextureResourceImpl*>( + resourceViewImpl->m_resource.Ptr()); + if (textureResource) + { + D3D12_RESOURCE_STATES initialState; + if (access.initialState == ResourceState::Undefined) + { + initialState = textureResource->m_defaultState; + } + else + { + initialState = D3DUtil::getResourceState(access.initialState); + } + textureResource->m_resource.transition( + initialState, D3D12_RESOURCE_STATE_RENDER_TARGET, submitter); + } } - textureResource->m_resource.transition( - initialState, - D3D12_RESOURCE_STATE_RENDER_TARGET, - submitter); } // Clear. if (access.loadOp == IRenderPassLayout::AttachmentLoadOp::Clear) @@ -3707,12 +3752,17 @@ public: { D3D12BarrierSubmitter submitter(m_d3dCmdList); auto resourceViewImpl = m_framebuffer->renderTargetViews[i].Ptr(); + if (!resourceViewImpl) + continue; auto textureResource = static_cast<TextureResourceImpl*>(resourceViewImpl->m_resource.Ptr()); - textureResource->m_resource.transition( - D3D12_RESOURCE_STATE_RENDER_TARGET, - D3DUtil::getResourceState(access.finalState), - submitter); + if (textureResource) + { + textureResource->m_resource.transition( + D3D12_RESOURCE_STATE_RENDER_TARGET, + D3DUtil::getResourceState(access.finalState), + submitter); + } } } @@ -4593,13 +4643,6 @@ public: #endif virtual SLANG_NO_THROW void SLANG_MCALL close() override { m_cmdList->Close(); } - - virtual SLANG_NO_THROW Result SLANG_MCALL - getNativeHandle(NativeHandle* outHandle) override - { - *outHandle = (uint64_t)m_cmdList.get(); - return SLANG_OK; - } }; class FenceImpl : public FenceBase @@ -4656,8 +4699,9 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outNativeHandle) override { - outNativeHandle->handleValue = 0; - return SLANG_FAIL; + outNativeHandle->api = gfx::InteropHandleAPI::D3D12; + outNativeHandle->handleValue = (uint64_t)m_fence.get(); + return SLANG_OK; } }; @@ -4675,6 +4719,12 @@ public: } void breakStrongReferenceToDevice() { m_renderer.breakStrongReference(); } + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* handle) override + { + handle->api = InteropHandleAPI::D3D12; + handle->handleValue = (uint64_t)m_d3dQueue.get(); + return SLANG_OK; + } public: BreakableReference<D3D12Device> m_renderer; ComPtr<ID3D12Device> m_device; @@ -4767,13 +4817,6 @@ public: } return SLANG_OK; } - - virtual SLANG_NO_THROW Result SLANG_MCALL - getNativeHandle(NativeHandle* outHandle) override - { - *outHandle = (uint64_t)m_d3dQueue.get(); - return SLANG_OK; - } }; class SwapchainImpl : public D3DSwapchainBase @@ -6450,7 +6493,8 @@ Result D3D12Device::createTextureView(ITextureResource* texture, IResourceView:: RefPtr<ResourceViewImpl> viewImpl = new ResourceViewImpl(); viewImpl->m_resource = resourceImpl; viewImpl->m_desc = desc; - bool isArray = resourceImpl->getDesc()->arraySize != 0; + bool isArray = resourceImpl ? resourceImpl->getDesc()->arraySize != 0 : false; + bool isMultiSample = resourceImpl ? resourceImpl->getDesc()->sampleDesc.numSamples > 1: false; switch (desc.type) { default: @@ -6471,7 +6515,7 @@ Result D3D12Device::createTextureView(ITextureResource* texture, IResourceView:: rtvDesc.Texture1D.MipSlice = desc.renderTarget.mipSlice; break; case IResource::Type::Texture2D: - if (resourceImpl->getDesc()->sampleDesc.numSamples > 1) + if (isMultiSample) { rtvDesc.ViewDimension = isArray ? D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY : D3D12_RTV_DIMENSION_TEXTURE2DMS; @@ -6494,11 +6538,16 @@ Result D3D12Device::createTextureView(ITextureResource* texture, IResourceView:: rtvDesc.Texture3D.FirstWSlice = desc.renderTarget.arrayIndex; rtvDesc.Texture3D.WSize = desc.renderTarget.arraySize; break; + case IResource::Type::Buffer: + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_BUFFER; + break; default: return SLANG_FAIL; } m_device->CreateRenderTargetView( - resourceImpl->m_resource, &rtvDesc, viewImpl->m_descriptor.cpuHandle); + resourceImpl ? resourceImpl->m_resource.getResource() : nullptr, + &rtvDesc, + viewImpl->m_descriptor.cpuHandle); } break; @@ -6516,7 +6565,7 @@ Result D3D12Device::createTextureView(ITextureResource* texture, IResourceView:: dsvDesc.Texture1D.MipSlice = desc.renderTarget.mipSlice; break; case IResource::Type::Texture2D: - if (resourceImpl->getDesc()->sampleDesc.numSamples > 1) + if (isMultiSample) { dsvDesc.ViewDimension = isArray ? D3D12_DSV_DIMENSION_TEXTURE2DMSARRAY : D3D12_DSV_DIMENSION_TEXTURE2DMS; @@ -6536,7 +6585,9 @@ Result D3D12Device::createTextureView(ITextureResource* texture, IResourceView:: return SLANG_FAIL; } m_device->CreateDepthStencilView( - resourceImpl->m_resource, &dsvDesc, viewImpl->m_descriptor.cpuHandle); + resourceImpl ? resourceImpl->m_resource.getResource() : nullptr, + &dsvDesc, + viewImpl->m_descriptor.cpuHandle); } break; @@ -6780,14 +6831,21 @@ Result D3D12Device::createFramebuffer(IFramebuffer::Desc const& desc, IFramebuff for (uint32_t i = 0; i < desc.renderTargetCount; i++) { framebuffer->renderTargetViews[i] = static_cast<ResourceViewImpl*>(desc.renderTargetViews[i]); - framebuffer->renderTargetDescriptors[i] = - framebuffer->renderTargetViews[i]->m_descriptor.cpuHandle; - auto clearValue = - static_cast<TextureResourceImpl*>( - static_cast<ResourceViewImpl*>(desc.renderTargetViews[i])->m_resource.Ptr()) - ->getDesc() - ->optimalClearValue.color; - memcpy(&framebuffer->renderTargetClearValues[i], &clearValue, sizeof(ColorClearValue)); + framebuffer->renderTargetDescriptors[i] = + framebuffer->renderTargetViews[i]->m_descriptor.cpuHandle; + if (static_cast<ResourceViewImpl*>(desc.renderTargetViews[i])->m_resource.Ptr()) + { + auto clearValue = + static_cast<TextureResourceImpl*>( + static_cast<ResourceViewImpl*>(desc.renderTargetViews[i])->m_resource.Ptr()) + ->getDesc() + ->optimalClearValue.color; + memcpy(&framebuffer->renderTargetClearValues[i], &clearValue, sizeof(ColorClearValue)); + } + else + { + memset(&framebuffer->renderTargetClearValues[i], 0, sizeof(ColorClearValue)); + } } framebuffer->depthStencilView = static_cast<ResourceViewImpl*>(desc.depthStencilView); if (desc.depthStencilView) @@ -7258,7 +7316,10 @@ Result D3D12Device::createComputePipelineState(const ComputePipelineStateDesc& i { // Describe and create the compute pipeline state object D3D12_COMPUTE_PIPELINE_STATE_DESC computeDesc = {}; - computeDesc.pRootSignature = programImpl->m_rootObjectLayout->m_rootSignature; + computeDesc.pRootSignature = + desc.d3d12RootSignatureOverride + ? static_cast<ID3D12RootSignature*>(desc.d3d12RootSignatureOverride) + : programImpl->m_rootObjectLayout->m_rootSignature; computeDesc.CS = { programImpl->m_shaders[0].code.getBuffer(), SIZE_T(programImpl->m_shaders[0].code.getCount())}; @@ -7481,6 +7542,13 @@ public: { return m_buffer->getDeviceAddress() + m_offset; } + + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override + { + outHandle->api = InteropHandleAPI::DeviceAddress; + outHandle->handleValue = getDeviceAddress(); + return SLANG_OK; + } }; Result D3D12Device::getAccelerationStructurePrebuildInfo( diff --git a/tools/gfx/debug-layer.cpp b/tools/gfx/debug-layer.cpp index f34a77556..484729068 100644 --- a/tools/gfx/debug-layer.cpp +++ b/tools/gfx/debug-layer.cpp @@ -1007,11 +1007,18 @@ void DebugCommandBuffer::close() baseObject->close(); } -Result DebugCommandBuffer::getNativeHandle(NativeHandle* outHandle) +Result DebugCommandBuffer::getNativeHandle(InteropHandle* outHandle) { + SLANG_GFX_API_FUNC; return baseObject->getNativeHandle(outHandle); } +Result DebugCommandBuffer::resetDescriptorHeaps() +{ + SLANG_GFX_API_FUNC; + return baseObject->resetDescriptorHeaps(); +} + void DebugCommandBuffer::checkEncodersClosedBeforeNewEncoder() { if (m_renderCommandEncoder.isOpen || m_resourceCommandEncoder.isOpen || @@ -1552,7 +1559,7 @@ Result DebugCommandQueue::waitForFenceValuesOnDevice( return baseObject->waitForFenceValuesOnDevice(fenceCount, innerFences.getBuffer(), waitValues); } -Result DebugCommandQueue::getNativeHandle(NativeHandle* outHandle) +Result DebugCommandQueue::getNativeHandle(InteropHandle* outHandle) { SLANG_GFX_API_FUNC; return baseObject->getNativeHandle(outHandle); @@ -1841,6 +1848,13 @@ DeviceAddress DebugAccelerationStructure::getDeviceAddress() return baseObject->getDeviceAddress(); } +Result DebugAccelerationStructure::getNativeHandle(InteropHandle* outNativeHandle) +{ + SLANG_GFX_API_FUNC; + + return baseObject->getNativeHandle(outNativeHandle); +} + IResourceView::Desc* DebugResourceView::getViewDesc() { SLANG_GFX_API_FUNC; @@ -1848,6 +1862,20 @@ IResourceView::Desc* DebugResourceView::getViewDesc() return baseObject->getViewDesc(); } +Result DebugResourceView::getNativeHandle(InteropHandle* outNativeHandle) +{ + SLANG_GFX_API_FUNC; + + return baseObject->getNativeHandle(outNativeHandle); +} + +Result DebugSamplerState::getNativeHandle(InteropHandle* outNativeHandle) +{ + SLANG_GFX_API_FUNC; + + return baseObject->getNativeHandle(outNativeHandle); +} + IResourceView::Desc* DebugAccelerationStructure::getViewDesc() { SLANG_GFX_API_FUNC; @@ -1884,4 +1912,10 @@ DebugShaderProgram::DebugShaderProgram(const IShaderProgram::Desc& desc) m_slangProgram = desc.slangProgram; } +Result DebugPipelineState::getNativeHandle(InteropHandle* outHandle) +{ + SLANG_GFX_API_FUNC; + return baseObject->getNativeHandle(outHandle); +} + } // namespace gfx diff --git a/tools/gfx/debug-layer.h b/tools/gfx/debug-layer.h index 94f3e3f14..069895f9b 100644 --- a/tools/gfx/debug-layer.h +++ b/tools/gfx/debug-layer.h @@ -225,6 +225,7 @@ public: public: IResourceView* getInterface(const Slang::Guid& guid); virtual SLANG_NO_THROW Desc* SLANG_MCALL getViewDesc() override; + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outNativeHandle) override; }; class DebugAccelerationStructure : public DebugObject<IAccelerationStructure> @@ -235,6 +236,8 @@ public: public: IAccelerationStructure* getInterface(const Slang::Guid& guid); virtual SLANG_NO_THROW DeviceAddress SLANG_MCALL getDeviceAddress() override; + virtual SLANG_NO_THROW Result SLANG_MCALL + getNativeHandle(InteropHandle* outNativeHandle) override; virtual SLANG_NO_THROW Desc* SLANG_MCALL getViewDesc() override; }; @@ -245,7 +248,8 @@ public: public: ISamplerState* getInterface(const Slang::Guid& guid); -}; + virtual SLANG_NO_THROW Result SLANG_MCALL + getNativeHandle(InteropHandle* outNativeHandle) override;}; struct ShaderOffsetKey { @@ -574,7 +578,8 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL encodeRayTracingCommands(IRayTracingCommandEncoder** outEncoder) override; virtual SLANG_NO_THROW void SLANG_MCALL close() override; - virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(NativeHandle* outHandle) override; + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override; + virtual SLANG_NO_THROW Result SLANG_MCALL resetDescriptorHeaps() override; private: void checkEncodersClosedBeforeNewEncoder(); @@ -597,7 +602,7 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL waitOnHost() override; virtual SLANG_NO_THROW Result SLANG_MCALL waitForFenceValuesOnDevice( uint32_t fenceCount, IFence** fences, uint64_t* waitValues) override; - virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(NativeHandle* outHandle) override; + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override; }; class DebugFramebuffer @@ -635,6 +640,7 @@ public: public: IPipelineState* getInterface(const Slang::Guid& guid); + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override; }; class DebugRenderPassLayout : public DebugObject<IRenderPassLayout> diff --git a/tools/gfx/immediate-renderer-base.cpp b/tools/gfx/immediate-renderer-base.cpp index 91b89c8cf..5632eb600 100644 --- a/tools/gfx/immediate-renderer-base.cpp +++ b/tools/gfx/immediate-renderer-base.cpp @@ -30,6 +30,8 @@ public: return nullptr; } + virtual SLANG_NO_THROW Result SLANG_MCALL resetDescriptorHeaps() override { return SLANG_OK; } + public: CommandWriter m_writer; bool m_hasWriteTimestamps = false; @@ -452,11 +454,9 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL close() override { } - virtual SLANG_NO_THROW Result SLANG_MCALL - getNativeHandle(NativeHandle* outHandle) override + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override { - *outHandle = 0; - return SLANG_OK; + return SLANG_FAIL; } void execute() @@ -611,8 +611,7 @@ public: return SLANG_FAIL; } - virtual SLANG_NO_THROW Result SLANG_MCALL - getNativeHandle(NativeHandle* outHandle) override + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override { return getRenderer()->m_queue->getNativeHandle(outHandle); } diff --git a/tools/gfx/mutable-shader-object.h b/tools/gfx/mutable-shader-object.h index 182334351..54fdf87c2 100644 --- a/tools/gfx/mutable-shader-object.h +++ b/tools/gfx/mutable-shader-object.h @@ -112,6 +112,10 @@ namespace gfx this->m_layout = layoutImpl; Slang::Index subObjectCount = layoutImpl->getSubObjectCount(); this->m_objects.setCount(subObjectCount); + auto dataSize = layoutImpl->getElementTypeLayout()->getSize(); + assert(dataSize >= 0); + this->m_data.setCount(dataSize); + memset(this->m_data.getBuffer(), 0, dataSize); return SLANG_OK; } public: diff --git a/tools/gfx/renderer-shared.cpp b/tools/gfx/renderer-shared.cpp index 7ba939530..d1cedaa61 100644 --- a/tools/gfx/renderer-shared.cpp +++ b/tools/gfx/renderer-shared.cpp @@ -155,6 +155,13 @@ IResourceView* ResourceViewBase::getInterface(const Guid& guid) return nullptr; } +Result ResourceViewBase::getNativeHandle(InteropHandle* outHandle) +{ + outHandle->api = InteropHandleAPI::Unknown; + outHandle->handleValue = 0; + return SLANG_E_NOT_IMPLEMENTED; +} + ISamplerState* SamplerStateBase::getInterface(const Slang::Guid& guid) { if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_ISamplerState) @@ -162,6 +169,13 @@ ISamplerState* SamplerStateBase::getInterface(const Slang::Guid& guid) return nullptr; } +Result SamplerStateBase::getNativeHandle(InteropHandle* outHandle) +{ + outHandle->api = InteropHandleAPI::Unknown; + outHandle->handleValue = 0; + return SLANG_E_NOT_IMPLEMENTED; +} + IAccelerationStructure* AccelerationStructureBase::getInterface(const Slang::Guid& guid) { if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_IResourceView || @@ -264,13 +278,20 @@ IQueryPool* QueryPoolBase::getInterface(const Guid& guid) return nullptr; } -IPipelineState* gfx::PipelineStateBase::getInterface(const Guid& guid) +IPipelineState* PipelineStateBase::getInterface(const Guid& guid) { if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_IPipelineState) return static_cast<IPipelineState*>(this); return nullptr; } +Result PipelineStateBase::getNativeHandle(InteropHandle* outHandle) +{ + outHandle->api = InteropHandleAPI::Unknown; + outHandle->handleValue = 0; + return SLANG_E_NOT_IMPLEMENTED; +} + void PipelineStateBase::initializeBase(const PipelineStateDesc& inDesc) { desc = inDesc; diff --git a/tools/gfx/renderer-shared.h b/tools/gfx/renderer-shared.h index 6bf86e28b..a23cf9dfe 100644 --- a/tools/gfx/renderer-shared.h +++ b/tools/gfx/renderer-shared.h @@ -293,6 +293,7 @@ public: SLANG_COM_OBJECT_IUNKNOWN_ALL IResourceView* getInterface(const Slang::Guid& guid); virtual SLANG_NO_THROW Desc* SLANG_MCALL getViewDesc() override { return &m_desc; } + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override; }; class SamplerStateBase : public ISamplerState, public Slang::ComObject @@ -300,6 +301,7 @@ class SamplerStateBase : public ISamplerState, public Slang::ComObject public: SLANG_COM_OBJECT_IUNKNOWN_ALL ISamplerState* getInterface(const Slang::Guid& guid); + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override; }; class AccelerationStructureBase @@ -1067,6 +1069,8 @@ public: return static_cast<TProgram*>(m_program.Ptr()); } + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override; + protected: void initializeBase(const PipelineStateDesc& inDesc); }; diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp index 0f84df7d2..6d5516a46 100644 --- a/tools/gfx/vulkan/render-vk.cpp +++ b/tools/gfx/vulkan/render-vk.cpp @@ -470,6 +470,12 @@ public: { m_device->m_api.vkDestroySampler(m_device->m_api.m_device, m_sampler, nullptr); } + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override + { + outHandle->api = InteropHandleAPI::Vulkan; + outHandle->handleValue = (uint64_t)(m_sampler); + return SLANG_OK; + } }; class ResourceViewImpl : public ResourceViewBase @@ -505,6 +511,13 @@ public: RefPtr<TextureResourceImpl> m_texture; VkImageView m_view; VkImageLayout m_layout; + + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override + { + outHandle->api = InteropHandleAPI::Vulkan; + outHandle->handleValue = (uint64_t)(m_view); + return SLANG_OK; + } }; class TexelBufferResourceViewImpl : public ResourceViewImpl @@ -520,6 +533,12 @@ public: } RefPtr<BufferResourceImpl> m_buffer; VkBufferView m_view; + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override + { + outHandle->api = InteropHandleAPI::Vulkan; + outHandle->handleValue = (uint64_t)(m_view); + return SLANG_OK; + } }; class PlainBufferResourceViewImpl : public ResourceViewImpl @@ -532,6 +551,11 @@ public: RefPtr<BufferResourceImpl> m_buffer; VkDeviceSize offset; VkDeviceSize size; + + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override + { + return m_buffer->getNativeResourceHandle(outHandle); + } }; class AccelerationStructureImpl : public AccelerationStructureBase @@ -547,6 +571,12 @@ public: { return m_buffer->getDeviceAddress() + m_offset; } + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override + { + outHandle->api = InteropHandleAPI::Vulkan; + outHandle->handleValue = (uint64_t)(m_vkHandle); + return SLANG_OK; + } ~AccelerationStructureImpl() { if (m_device) @@ -3798,6 +3828,10 @@ public: return nullptr; } virtual void comFree() override { m_transientHeap.breakStrongReference(); } + virtual SLANG_NO_THROW Result SLANG_MCALL resetDescriptorHeaps() override + { + return SLANG_OK; + } public: VkCommandBuffer m_commandBuffer; VkCommandBuffer m_preCommandBuffer = VK_NULL_HANDLE; @@ -4552,13 +4586,14 @@ public: { VkImageCopy region = {}; region.srcSubresource.aspectMask = getAspectMask(srcSubresource.aspectMask); - region.srcSubresource.baseArrayLayer = layer + srcSubresource.baseArrayLayer; - region.srcSubresource.mipLevel = mipId + srcSubresource.mipLevel; + region.srcSubresource.baseArrayLayer = (uint32_t)(layer + srcSubresource.baseArrayLayer); + region.srcSubresource.mipLevel = (uint32_t)(mipId + srcSubresource.mipLevel); region.srcSubresource.layerCount = 1; region.srcOffset = { (int32_t)srcOffset.x, (int32_t)srcOffset.y, (int32_t)srcOffset.z }; region.dstSubresource.aspectMask = getAspectMask(dstSubresource.aspectMask); - region.dstSubresource.baseArrayLayer = layer + dstSubresource.baseArrayLayer; - region.dstSubresource.mipLevel = mipId + dstSubresource.mipLevel; + region.dstSubresource.baseArrayLayer = + (uint32_t)(layer + dstSubresource.baseArrayLayer); + region.dstSubresource.mipLevel = (uint32_t)(mipId + dstSubresource.mipLevel); region.dstSubresource.layerCount = 1; region.dstOffset = { (int32_t)dstOffset.x, (int32_t)dstOffset.y, (int32_t)dstOffset.z }; region.extent = { (uint32_t)extent.width, (uint32_t)extent.height, (uint32_t)extent.depth }; @@ -5235,10 +5270,10 @@ public: vkAPI.vkEndCommandBuffer(m_commandBuffer); } - virtual SLANG_NO_THROW Result SLANG_MCALL - getNativeHandle(NativeHandle* outHandle) override + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override { - *outHandle = (uint64_t)m_commandBuffer; + outHandle->api = InteropHandleAPI::Vulkan; + outHandle->handleValue = (uint64_t)m_commandBuffer; return SLANG_OK; } }; @@ -5297,10 +5332,10 @@ public: vkAPI.vkQueueWaitIdle(m_queue); } - virtual SLANG_NO_THROW Result SLANG_MCALL - getNativeHandle(NativeHandle* outHandle) override + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override { - *outHandle = (uint64_t)m_queue; + outHandle->api = InteropHandleAPI::D3D12; + outHandle->handleValue = (uint64_t)m_queue; return SLANG_OK; } |
