summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-02-03 19:17:30 -0800
committerGitHub <noreply@github.com>2022-02-03 19:17:30 -0800
commitd06a78d935b2743494d47ed5cd3f36e38ac9c5ac (patch)
tree7615fd89cb826f2c463b4a221f19139d3a5d4a9d /tools
parent5eb835f0332868fd56ac14ce7560e0ae9cfafec9 (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.cpp12
-rw-r--r--tools/gfx-unit-test/get-cmd-buffer-handle-test.cpp6
-rw-r--r--tools/gfx-unit-test/get-cmd-queue-handle-test.cpp6
-rw-r--r--tools/gfx/cuda/render-cuda.cpp18
-rw-r--r--tools/gfx/d3d12/render-d3d12.cpp164
-rw-r--r--tools/gfx/debug-layer.cpp38
-rw-r--r--tools/gfx/debug-layer.h12
-rw-r--r--tools/gfx/immediate-renderer-base.cpp11
-rw-r--r--tools/gfx/mutable-shader-object.h4
-rw-r--r--tools/gfx/renderer-shared.cpp23
-rw-r--r--tools/gfx/renderer-shared.h4
-rw-r--r--tools/gfx/vulkan/render-vk.cpp55
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;
}