diff options
| -rw-r--r-- | slang-gfx.h | 148 | ||||
| -rw-r--r-- | tools/gfx/cuda/render-cuda.cpp | 55 | ||||
| -rw-r--r-- | tools/gfx/d3d12/render-d3d12.cpp | 97 | ||||
| -rw-r--r-- | tools/gfx/debug-layer.cpp | 166 | ||||
| -rw-r--r-- | tools/gfx/debug-layer.h | 63 | ||||
| -rw-r--r-- | tools/gfx/immediate-renderer-base.cpp | 92 | ||||
| -rw-r--r-- | tools/gfx/renderer-shared.cpp | 50 | ||||
| -rw-r--r-- | tools/gfx/renderer-shared.h | 34 | ||||
| -rw-r--r-- | tools/gfx/vulkan/render-vk.cpp | 111 |
9 files changed, 796 insertions, 20 deletions
diff --git a/slang-gfx.h b/slang-gfx.h index 5dd3319fb..6536198e8 100644 --- a/slang-gfx.h +++ b/slang-gfx.h @@ -448,6 +448,10 @@ public: }; virtual SLANG_NO_THROW Type SLANG_MCALL getType() = 0; + + virtual SLANG_NO_THROW Result SLANG_MCALL setDebugName(const char* name) = 0; + + virtual SLANG_NO_THROW const char* SLANG_MCALL getDebugName() = 0; }; #define SLANG_UUID_IResource \ { \ @@ -492,9 +496,38 @@ struct ClearValue DepthStencilClearValue depthStencil; }; + class ITextureResource: public IResource { public: + enum class Aspect : uint32_t + { + Color = 0x00000001, + Depth = 0x00000002, + Stencil = 0x00000004, + MetaData = 0x00000008, + Plane0 = 0x00000010, + Plane1 = 0x00000020, + Plane2 = 0x00000040, + }; + + struct SubresourceRange + { + Aspect aspectMask; + uint32_t mipLevel; + uint32_t baseArrayLayer; + uint32_t layerCount; + }; + + struct Offset3D + { + uint32_t x = 0; + uint32_t y = 0; + uint32_t z = 0; + Offset3D() = default; + Offset3D(uint32_t _x, uint32_t _y, uint32_t _z) :x(_x), y(_y), z(_z) {} + }; + struct SampleDesc { int numSamples = 1; ///< Number of samples per pixel @@ -839,6 +872,29 @@ public: 0xa5cdda3c, 0x1d4e, 0x4df7, { 0x8e, 0xf2, 0xb7, 0x3f, 0xce, 0x4, 0xde, 0x3b } \ } +class IFence : public ISlangUnknown +{ +public: + enum class FenceStatus + { + Completed, + NotReady, + DeviceLost + }; + struct Desc + { + bool initiallySignaled = false; + }; + virtual SLANG_NO_THROW FenceStatus SLANG_MCALL getStatus() = 0; + virtual SLANG_NO_THROW Result SLANG_MCALL reset() = 0; + virtual SLANG_NO_THROW Result SLANG_MCALL getSharedHandle(uint64_t* outHandle) = 0; + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(void** outNativeHandle) = 0; +}; +#define SLANG_UUID_IFence \ + { \ + 0x7fe1c283, 0xd3f4, 0x48ed, { 0xaa, 0xf3, 0x1, 0x51, 0x96, 0x4e, 0x7c, 0xb5 } \ + } + struct ShaderOffset { SlangInt uniformOffset = 0; @@ -1265,6 +1321,30 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL writeTimestamp(IQueryPool* queryPool, SlangInt queryIndex) = 0; }; +struct IndirectDispatchArguments +{ + uint32_t ThreadGroupCountX; + uint32_t ThreadGroupCountY; + uint32_t ThreadGroupCountZ; +}; + +struct IndirectDrawArguments +{ + uint32_t VertexCountPerInstance; + uint32_t InstanceCount; + uint32_t StartVertexLocation; + uint32_t StartInstanceLocation; +}; + +struct IndirectDrawIndexedArguments +{ + uint32_t IndexCountPerInstance; + uint32_t InstanceCount; + uint32_t StartIndexLocation; + int32_t BaseVertexLocation; + uint32_t StartInstanceLocation; +}; + class IRenderCommandEncoder : public ICommandEncoder { public: @@ -1282,6 +1362,12 @@ public: return rootObject; } + // Sets the pipeline state with a mutable root object. The root object is allowed to change + // between this call and future draw calls. + virtual SLANG_NO_THROW Result SLANG_MCALL bindPipelineAndRootObject( + IPipelineState* state, + IShaderObject* rootObject) = 0; + virtual SLANG_NO_THROW void SLANG_MCALL setViewports(uint32_t count, const Viewport* viewports) = 0; virtual SLANG_NO_THROW void @@ -1314,6 +1400,18 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL draw(UInt vertexCount, UInt startVertex = 0) = 0; virtual SLANG_NO_THROW void SLANG_MCALL drawIndexed(UInt indexCount, UInt startIndex = 0, UInt baseVertex = 0) = 0; + virtual SLANG_NO_THROW void SLANG_MCALL drawIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) = 0; + virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) = 0; virtual SLANG_NO_THROW void SLANG_MCALL setStencilReference(uint32_t referenceValue) = 0; }; @@ -1333,7 +1431,15 @@ public: SLANG_RETURN_NULL_ON_FAIL(bindPipeline(state, &rootObject)); return rootObject; } + + // Sets the pipeline state with a mutable root object. The root object is allowed to change + // between this call and future dispatch calls. + virtual SLANG_NO_THROW Result SLANG_MCALL bindPipelineAndRootObject( + IPipelineState* state, + IShaderObject* rootObject) = 0; + virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) = 0; + virtual SLANG_NO_THROW void SLANG_MCALL dispatchComputeIndirect(IBufferResource* cmdBuffer, uint64_t offset) = 0; }; class IResourceCommandEncoder : public ICommandEncoder @@ -1345,6 +1451,21 @@ public: IBufferResource* src, size_t srcOffset, size_t size) = 0; + virtual SLANG_NO_THROW void SLANG_MCALL copyTexture( + ITextureResource* dst, + ITextureResource::SubresourceRange dstSubresource, + ITextureResource::Offset3D dstOffset, + ITextureResource* src, + ITextureResource::SubresourceRange srcSubresource, + ITextureResource::Offset3D srcOffset, + ITextureResource::Size extent) = 0; + virtual SLANG_NO_THROW void SLANG_MCALL uploadTextureData( + ITextureResource* dst, + ITextureResource::SubresourceRange subResourceRange, + ITextureResource::Offset3D offset, + ITextureResource::Offset3D extent, + ITextureResource::SubresourceData* subResourceData, + size_t subResourceDataCount) = 0; virtual SLANG_NO_THROW void SLANG_MCALL uploadBufferData(IBufferResource* dst, size_t offset, size_t size, void* data) = 0; @@ -1402,6 +1523,12 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL bindPipeline(IPipelineState* state, IShaderObject** outRootObject) = 0; + + // Binds pipeline with a mutable root object. The root object is allowed to change + // between this call and dispatchRays calls. + virtual SLANG_NO_THROW void SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* mutableRootObject) = 0; + /// Issues a dispatch command to start ray tracing workload with a ray tracing pipeline. /// `rayGenShaderName` specifies the name of the ray generation shader to launch. Pass nullptr for /// the first ray generation shader defined in `raytracingPipeline`. @@ -1493,11 +1620,12 @@ public: virtual SLANG_NO_THROW const Desc& SLANG_MCALL getDesc() = 0; virtual SLANG_NO_THROW void SLANG_MCALL - executeCommandBuffers(uint32_t count, ICommandBuffer* const* commandBuffers) = 0; - inline void executeCommandBuffer(ICommandBuffer* commandBuffer) + executeCommandBuffers(uint32_t count, ICommandBuffer* const* commandBuffers, IFence* fenceToSignal) = 0; + inline void executeCommandBuffer(ICommandBuffer* commandBuffer, IFence* fenceToSignal = nullptr) { - executeCommandBuffers(1, &commandBuffer); + executeCommandBuffers(1, &commandBuffer, fenceToSignal); } + virtual SLANG_NO_THROW void SLANG_MCALL wait() = 0; virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(NativeHandle* outHandle) = 0; @@ -1689,6 +1817,8 @@ public: /// Returns a list of features supported by the renderer. virtual SLANG_NO_THROW Result SLANG_MCALL getFeatures(const char** outFeatures, UInt bufferSize, UInt* outFeatureCount) = 0; + virtual SLANG_NO_THROW Result SLANG_MCALL getFormatSupportedResourceStates(Format format, ResourceStateSet* outStates) = 0; + virtual SLANG_NO_THROW Result SLANG_MCALL getSlangSession(slang::ISession** outSlangSession) = 0; inline ComPtr<slang::ISession> getSlangSession() @@ -1856,6 +1986,10 @@ public: ShaderObjectContainerType container, IShaderObject** outObject) = 0; + virtual SLANG_NO_THROW Result SLANG_MCALL createMutableRootShaderObject( + IShaderProgram* program, + IShaderObject** outObject) = 0; + virtual SLANG_NO_THROW Result SLANG_MCALL createProgram(const IShaderProgram::Desc& desc, IShaderProgram** outProgram) = 0; inline ComPtr<IShaderProgram> createProgram(const IShaderProgram::Desc& desc) @@ -1920,9 +2054,15 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL createAccelerationStructure( const IAccelerationStructure::CreateDesc& desc, IAccelerationStructure** outView) = 0; + + virtual SLANG_NO_THROW Result SLANG_MCALL + createFence(const IFence::Desc& desc, IFence** outFence) = 0; + + virtual SLANG_NO_THROW Result SLANG_MCALL + waitForFences(IFence** fences, uint32_t fenceCount, bool waitForAll, uint64_t timeout) = 0; }; -#define SLANG_UUID_IDevice \ +#define SLANG_UUID_IDevice \ { \ 0x715bdf26, 0x5135, 0x11eb, { 0xAE, 0x93, 0x02, 0x42, 0xAC, 0x13, 0x00, 0x02 } \ } diff --git a/tools/gfx/cuda/render-cuda.cpp b/tools/gfx/cuda/render-cuda.cpp index 47c309d34..c7b16fc66 100644 --- a/tools/gfx/cuda/render-cuda.cpp +++ b/tools/gfx/cuda/render-cuda.cpp @@ -946,6 +946,13 @@ public: return SLANG_OK; } + virtual SLANG_NO_THROW Result SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* rootObject) override + { + SLANG_UNIMPLEMENTED_X("bindPipelineAndRootObject"); + return SLANG_E_NOT_AVAILABLE; + } + virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override { m_writer->bindRootShaderObject(m_rootObject); @@ -956,6 +963,12 @@ public: { m_writer->writeTimestamp(pool, index); } + + virtual SLANG_NO_THROW void SLANG_MCALL + dispatchComputeIndirect(IBufferResource* argBuffer, uint64_t offset) override + { + SLANG_UNIMPLEMENTED_X("dispatchComputeIndirect"); + } }; ComputeCommandEncoderImpl m_computeCommandEncoder; @@ -1014,6 +1027,42 @@ public: { m_writer->writeTimestamp(pool, index); } + + virtual SLANG_NO_THROW void SLANG_MCALL copyTexture( + ITextureResource* dst, + ITextureResource::SubresourceRange dstSubresource, + ITextureResource::Offset3D dstOffset, + ITextureResource* src, + ITextureResource::SubresourceRange srcSubresource, + ITextureResource::Offset3D srcOffset, + ITextureResource::Size extent) override + { + SLANG_UNUSED(dst); + SLANG_UNUSED(dstSubresource); + SLANG_UNUSED(dstOffset); + SLANG_UNUSED(src); + SLANG_UNUSED(srcSubresource); + SLANG_UNUSED(srcOffset); + SLANG_UNUSED(extent); + SLANG_UNIMPLEMENTED_X("copyTexture"); + } + + virtual SLANG_NO_THROW void SLANG_MCALL uploadTextureData( + ITextureResource* dst, + ITextureResource::SubresourceRange subResourceRange, + ITextureResource::Offset3D offset, + ITextureResource::Offset3D extent, + ITextureResource::SubresourceData* subResourceData, + size_t subResourceDataCount) override + { + SLANG_UNUSED(dst); + SLANG_UNUSED(subResourceRange); + SLANG_UNUSED(offset); + SLANG_UNUSED(extent); + SLANG_UNUSED(subResourceData); + SLANG_UNUSED(subResourceDataCount); + SLANG_UNIMPLEMENTED_X("uploadTextureData"); + } }; ResourceCommandEncoderImpl m_resourceCommandEncoder; @@ -1081,9 +1130,11 @@ public: return m_desc; } - virtual SLANG_NO_THROW void SLANG_MCALL - executeCommandBuffers(uint32_t count, ICommandBuffer* const* commandBuffers) override + virtual SLANG_NO_THROW void SLANG_MCALL executeCommandBuffers( + uint32_t count, ICommandBuffer* const* commandBuffers, IFence* fence) override { + // TODO: implement fence. + assert(fence == nullptr); for (uint32_t i = 0; i < count; i++) { execute(static_cast<CommandBufferImpl*>(commandBuffers[i])); diff --git a/tools/gfx/d3d12/render-d3d12.cpp b/tools/gfx/d3d12/render-d3d12.cpp index cc8086080..4384cc243 100644 --- a/tools/gfx/d3d12/render-d3d12.cpp +++ b/tools/gfx/d3d12/render-d3d12.cpp @@ -3101,6 +3101,13 @@ public: { return bindPipelineImpl(state, outRootObject); } + + virtual SLANG_NO_THROW Result SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* rootObject) override + { + SLANG_UNIMPLEMENTED_X("bindPipelineAndRootObject"); + return SLANG_E_NOT_AVAILABLE; + } virtual SLANG_NO_THROW void SLANG_MCALL setViewports(uint32_t count, const Viewport* viewports) override @@ -3314,6 +3321,36 @@ public: { m_d3dCmdList->OMSetStencilRef((UINT)referenceValue); } + + virtual SLANG_NO_THROW void SLANG_MCALL drawIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) override + { + SLANG_UNUSED(maxDrawCount); + SLANG_UNUSED(argBuffer); + SLANG_UNUSED(argOffset); + SLANG_UNUSED(countBuffer); + SLANG_UNUSED(countOffset); + SLANG_UNIMPLEMENTED_X("drawIndirect"); + } + + virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) override + { + SLANG_UNUSED(maxDrawCount); + SLANG_UNUSED(argBuffer); + SLANG_UNUSED(argOffset); + SLANG_UNUSED(countBuffer); + SLANG_UNUSED(countOffset); + SLANG_UNIMPLEMENTED_X("drawIndirect"); + } }; RenderCommandEncoderImpl m_renderCommandEncoder; @@ -3361,6 +3398,13 @@ public: return bindPipelineImpl(state, outRootObject); } + virtual SLANG_NO_THROW Result SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* rootObject) override + { + SLANG_UNIMPLEMENTED_X("bindPipelineAndRootObject"); + return SLANG_E_NOT_AVAILABLE; + } + virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override { // Submit binding for compute @@ -3374,6 +3418,12 @@ public: } m_d3dCmdList->Dispatch(x, y, z); } + + virtual SLANG_NO_THROW void SLANG_MCALL + dispatchComputeIndirect(IBufferResource* argBuffer, uint64_t offset) override + { + SLANG_UNIMPLEMENTED_X("dispatchComputeIndirect"); + } }; ComputeCommandEncoderImpl m_computeCommandEncoder; @@ -3442,6 +3492,41 @@ public: { static_cast<QueryPoolImpl*>(pool)->writeTimestamp(m_commandBuffer->m_cmdList, index); } + virtual SLANG_NO_THROW void SLANG_MCALL copyTexture( + ITextureResource* dst, + ITextureResource::SubresourceRange dstSubresource, + ITextureResource::Offset3D dstOffset, + ITextureResource* src, + ITextureResource::SubresourceRange srcSubresource, + ITextureResource::Offset3D srcOffset, + ITextureResource::Size extent) override + { + SLANG_UNUSED(dst); + SLANG_UNUSED(dstSubresource); + SLANG_UNUSED(dstOffset); + SLANG_UNUSED(src); + SLANG_UNUSED(srcSubresource); + SLANG_UNUSED(srcOffset); + SLANG_UNUSED(extent); + SLANG_UNIMPLEMENTED_X("copyTexture"); + } + + virtual SLANG_NO_THROW void SLANG_MCALL uploadTextureData( + ITextureResource* dst, + ITextureResource::SubresourceRange subResourceRange, + ITextureResource::Offset3D offset, + ITextureResource::Offset3D extent, + ITextureResource::SubresourceData* subResourceData, + size_t subResourceDataCount) override + { + SLANG_UNUSED(dst); + SLANG_UNUSED(subResourceRange); + SLANG_UNUSED(offset); + SLANG_UNUSED(extent); + SLANG_UNUSED(subResourceData); + SLANG_UNUSED(subResourceDataCount); + SLANG_UNIMPLEMENTED_X("uploadTextureData"); + } }; ResourceCommandEncoderImpl m_resourceCommandEncoder; @@ -3491,6 +3576,8 @@ public: AccessFlag::Enum destAccess) override; virtual SLANG_NO_THROW void SLANG_MCALL bindPipeline(IPipelineState* state, IShaderObject** outRootObject) override; + virtual SLANG_NO_THROW void SLANG_MCALL bindPipelineAndRootObject( + IPipelineState* state, IShaderObject* rootObject) override; virtual SLANG_NO_THROW void SLANG_MCALL dispatchRays( const char* rayGenShaderName, int32_t width, @@ -3582,8 +3669,10 @@ public: } virtual SLANG_NO_THROW void SLANG_MCALL - executeCommandBuffers(uint32_t count, ICommandBuffer* const* commandBuffers) override + executeCommandBuffers(uint32_t count, ICommandBuffer* const* commandBuffers, IFence* fence) override { + // TODO: implement fence signal. + assert(fence == nullptr); ShortList<ID3D12CommandList*> commandLists; for (uint32_t i = 0; i < count; i++) { @@ -5978,6 +6067,12 @@ void D3D12Device::CommandBufferImpl::RayTracingCommandEncoderImpl::bindPipeline( bindPipelineImpl(state, outRootObject); } +void D3D12Device::CommandBufferImpl::RayTracingCommandEncoderImpl::bindPipelineAndRootObject( + IPipelineState* state, IShaderObject* rootObject) +{ + SLANG_UNIMPLEMENTED_X("bindPipelineAndRootObject"); +} + void D3D12Device::CommandBufferImpl::RayTracingCommandEncoderImpl::dispatchRays( const char* rayGenShaderName, int32_t width, diff --git a/tools/gfx/debug-layer.cpp b/tools/gfx/debug-layer.cpp index daf86b60d..19504aaa4 100644 --- a/tools/gfx/debug-layer.cpp +++ b/tools/gfx/debug-layer.cpp @@ -139,6 +139,7 @@ SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(Swapchain) SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(TransientResourceHeap) SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(QueryPool) SLANG_GFX_DEBUG_GET_INTERFACE_IMPL_PARENT(AccelerationStructure, ResourceView) +SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(Fence) #undef SLANG_GFX_DEBUG_GET_INTERFACE_IMPL @@ -177,6 +178,7 @@ SLANG_GFX_DEBUG_GET_OBJ_IMPL(Swapchain) SLANG_GFX_DEBUG_GET_OBJ_IMPL(TransientResourceHeap) SLANG_GFX_DEBUG_GET_OBJ_IMPL(QueryPool) SLANG_GFX_DEBUG_GET_OBJ_IMPL(AccelerationStructure) +SLANG_GFX_DEBUG_GET_OBJ_IMPL(Fence) #undef SLANG_GFX_DEBUG_GET_OBJ_IMPL @@ -297,6 +299,12 @@ Result DebugDevice::getFeatures(const char** outFeatures, UInt bufferSize, UInt* return baseObject->getFeatures(outFeatures, bufferSize, outFeatureCount); } +Result DebugDevice::getFormatSupportedResourceStates(Format format, ResourceStateSet* outStates) +{ + SLANG_GFX_API_FUNC; + return baseObject->getFormatSupportedResourceStates(format, outStates); +} + DebugDevice::DebugDevice() { SLANG_GFX_API_FUNC_NAME("CreateDevice"); @@ -583,6 +591,13 @@ Result DebugDevice::createMutableShaderObject( return result; } +Result DebugDevice::createMutableRootShaderObject( + IShaderProgram* program, IShaderObject** outObject) +{ + SLANG_GFX_API_FUNC; + return baseObject->createMutableRootShaderObject(program, outObject); +} + Result DebugDevice::createProgram(const IShaderProgram::Desc& desc, IShaderProgram** outProgram) { SLANG_GFX_API_FUNC; @@ -695,6 +710,22 @@ Result DebugDevice::createQueryPool(const IQueryPool::Desc& desc, IQueryPool** o return SLANG_OK; } +Result DebugDevice::createFence(const IFence::Desc& desc, IFence** outFence) +{ + SLANG_GFX_API_FUNC; + RefPtr<DebugFence> result = new DebugFence(); + SLANG_RETURN_ON_FAIL(baseObject->createFence(desc, result->baseObject.writeRef())); + returnComPtr(outFence, result); + return SLANG_OK; +} + +Result DebugDevice::waitForFences( + IFence** fences, uint32_t fenceCount, bool waitForAll, uint64_t timeout) +{ + SLANG_GFX_API_FUNC; + return baseObject->waitForFences(fences, fenceCount, waitForAll, timeout); +} + IResource::Type DebugBufferResource::getType() { SLANG_GFX_API_FUNC; @@ -709,14 +740,28 @@ IBufferResource::Desc* DebugBufferResource::getDesc() DeviceAddress DebugBufferResource::getDeviceAddress() { + SLANG_GFX_API_FUNC; return baseObject->getDeviceAddress(); } Result DebugBufferResource::getNativeHandle(NativeHandle* outHandle) { + SLANG_GFX_API_FUNC; return baseObject->getNativeHandle(outHandle); } +Result DebugBufferResource::setDebugName(const char* name) +{ + SLANG_GFX_API_FUNC; + return baseObject->setDebugName(name); +} + +const char* DebugBufferResource::getDebugName() +{ + SLANG_GFX_API_FUNC; + return baseObject->getDebugName(); +} + IResource::Type DebugTextureResource::getType() { SLANG_GFX_API_FUNC; @@ -734,6 +779,14 @@ Result DebugTextureResource::getNativeHandle(NativeHandle* outHandle) return baseObject->getNativeHandle(outHandle); } +Result DebugTextureResource::setDebugName(const char* name) +{ + return baseObject->setDebugName(name); +} + +const char* DebugTextureResource::getDebugName() { return baseObject->getDebugName(); } + + DebugCommandBuffer::DebugCommandBuffer() { SLANG_GFX_API_FUNC; @@ -891,12 +944,26 @@ Result DebugComputeCommandEncoder::bindPipeline( return result; } +Result DebugComputeCommandEncoder::bindPipelineAndRootObject( + IPipelineState* state, IShaderObject* rootObject) +{ + SLANG_GFX_API_FUNC; + return baseObject->bindPipelineAndRootObject(getInnerObj(state), getInnerObj(rootObject)); +} + void DebugComputeCommandEncoder::dispatchCompute(int x, int y, int z) { SLANG_GFX_API_FUNC; baseObject->dispatchCompute(x, y, z); } +void DebugComputeCommandEncoder::dispatchComputeIndirect( + IBufferResource* cmdBuffer, uint64_t offset) +{ + SLANG_GFX_API_FUNC; + baseObject->dispatchComputeIndirect(getInnerObj(cmdBuffer), offset); +} + void DebugComputeCommandEncoder::writeTimestamp(IQueryPool* pool, SlangInt index) { SLANG_GFX_API_FUNC; @@ -925,6 +992,13 @@ Result DebugRenderCommandEncoder::bindPipeline( return result; } +Result DebugRenderCommandEncoder::bindPipelineAndRootObject( + IPipelineState* state, IShaderObject* rootObject) +{ + SLANG_GFX_API_FUNC; + return baseObject->bindPipelineAndRootObject(getInnerObj(state), getInnerObj(rootObject)); +} + void DebugRenderCommandEncoder::setViewports(uint32_t count, const Viewport* viewports) { SLANG_GFX_API_FUNC; @@ -982,6 +1056,30 @@ void DebugRenderCommandEncoder::drawIndexed(UInt indexCount, UInt startIndex, UI baseObject->drawIndexed(indexCount, startIndex, baseVertex); } +void DebugRenderCommandEncoder::drawIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) +{ + SLANG_GFX_API_FUNC; + baseObject->drawIndirect( + maxDrawCount, getInnerObj(argBuffer), argOffset, getInnerObj(countBuffer), countOffset); +} + +void DebugRenderCommandEncoder::drawIndexedIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) +{ + SLANG_GFX_API_FUNC; + baseObject->drawIndexedIndirect( + maxDrawCount, getInnerObj(argBuffer), argOffset, getInnerObj(countBuffer), countOffset); +} + void DebugRenderCommandEncoder::setStencilReference(uint32_t referenceValue) { SLANG_GFX_API_FUNC; @@ -1063,6 +1161,39 @@ void DebugResourceCommandEncoder::bufferBarrier( baseObject->bufferBarrier(count, innerBuffers.getBuffer(), src, dst); } +void DebugResourceCommandEncoder::copyTexture( + ITextureResource* dst, + ITextureResource::SubresourceRange dstSubresource, + ITextureResource::Offset3D dstOffset, + ITextureResource* src, + ITextureResource::SubresourceRange srcSubresource, + ITextureResource::Offset3D srcOffset, + ITextureResource::Size extent) +{ + SLANG_GFX_API_FUNC; + baseObject->copyTexture( + getInnerObj(dst), + dstSubresource, + dstOffset, + getInnerObj(src), + srcSubresource, + srcOffset, + extent); +} + +void DebugResourceCommandEncoder::uploadTextureData( + ITextureResource* dst, + ITextureResource::SubresourceRange subResourceRange, + ITextureResource::Offset3D offset, + ITextureResource::Offset3D extent, + ITextureResource::SubresourceData* subResourceData, + size_t subResourceDataCount) +{ + SLANG_GFX_API_FUNC; + baseObject->uploadTextureData( + getInnerObj(dst), subResourceRange, offset, extent, subResourceData, subResourceDataCount); +} + void DebugRayTracingCommandEncoder::endEncoding() { SLANG_GFX_API_FUNC; @@ -1173,6 +1304,13 @@ void DebugRayTracingCommandEncoder::bindPipeline( *outRootObject = &commandBuffer->rootObject; } +void DebugRayTracingCommandEncoder::bindPipelineAndRootObject( + IPipelineState* state, IShaderObject* rootObject) +{ + SLANG_GFX_API_FUNC; + baseObject->bindPipelineAndRootObject(getInnerObj(state), getInnerObj(rootObject)); +} + void DebugRayTracingCommandEncoder::dispatchRays( const char* rayGenShaderName, int32_t width, @@ -1189,7 +1327,7 @@ const ICommandQueue::Desc& DebugCommandQueue::getDesc() return baseObject->getDesc(); } -void DebugCommandQueue::executeCommandBuffers(uint32_t count, ICommandBuffer* const* commandBuffers) +void DebugCommandQueue::executeCommandBuffers(uint32_t count, ICommandBuffer* const* commandBuffers, IFence* fence) { SLANG_GFX_API_FUNC; List<ICommandBuffer*> innerCommandBuffers; @@ -1215,7 +1353,7 @@ void DebugCommandQueue::executeCommandBuffers(uint32_t count, ICommandBuffer* co } } } - baseObject->executeCommandBuffers(count, innerCommandBuffers.getBuffer()); + baseObject->executeCommandBuffers(count, innerCommandBuffers.getBuffer(), getInnerObj(fence)); } void DebugCommandQueue::wait() { baseObject->wait(); } @@ -1490,4 +1628,28 @@ IResourceView::Desc* DebugAccelerationStructure::getViewDesc() return baseObject->getViewDesc(); } +IFence::FenceStatus DebugFence::getStatus() +{ + SLANG_GFX_API_FUNC; + return baseObject->getStatus(); +} + +Result DebugFence::reset() +{ + SLANG_GFX_API_FUNC; + return baseObject->reset(); +} + +Result DebugFence::getSharedHandle(uint64_t* outHandle) +{ + SLANG_GFX_API_FUNC; + return baseObject->getSharedHandle(outHandle); +} + +Result DebugFence::getNativeHandle(void** outNativeHandle) +{ + SLANG_GFX_API_FUNC; + return baseObject->getNativeHandle(outNativeHandle); +} + } // namespace gfx diff --git a/tools/gfx/debug-layer.h b/tools/gfx/debug-layer.h index aa56e5530..9be3aca20 100644 --- a/tools/gfx/debug-layer.h +++ b/tools/gfx/debug-layer.h @@ -45,6 +45,9 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL getFeatures(const char** outFeatures, UInt bufferSize, UInt* outFeatureCount) override; virtual SLANG_NO_THROW Result SLANG_MCALL + getFormatSupportedResourceStates(Format format, ResourceStateSet* outStates) override; + + virtual SLANG_NO_THROW Result SLANG_MCALL getSlangSession(slang::ISession** outSlangSession) override; virtual SLANG_NO_THROW Result SLANG_MCALL createTransientResourceHeap( const ITransientResourceHeap::Desc& desc, @@ -100,6 +103,8 @@ public: ShaderObjectContainerType container, IShaderObject** outObject) override; virtual SLANG_NO_THROW Result SLANG_MCALL + createMutableRootShaderObject(IShaderProgram* program, IShaderObject** outObject) override; + virtual SLANG_NO_THROW Result SLANG_MCALL createProgram(const IShaderProgram::Desc& desc, IShaderProgram** outProgram) override; virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState( const GraphicsPipelineStateDesc& desc, @@ -125,6 +130,10 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL createQueryPool( const IQueryPool::Desc& desc, IQueryPool** outPool) override; + virtual SLANG_NO_THROW Result SLANG_MCALL + createFence(const IFence::Desc& desc, IFence** outFence) override; + virtual SLANG_NO_THROW Result SLANG_MCALL + waitForFences(IFence** fences, uint32_t fenceCount, bool waitForAll, uint64_t timeout) override; }; class DebugQueryPool : public DebugObject<IQueryPool> @@ -149,6 +158,8 @@ public: virtual SLANG_NO_THROW Desc* SLANG_MCALL getDesc() override; virtual SLANG_NO_THROW DeviceAddress SLANG_MCALL getDeviceAddress() override; virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(NativeHandle* outHandle) override; + virtual SLANG_NO_THROW Result SLANG_MCALL setDebugName(const char* name) override; + virtual SLANG_NO_THROW const char* SLANG_MCALL getDebugName() override; }; class DebugTextureResource : public DebugObject<ITextureResource> @@ -161,6 +172,8 @@ public: virtual SLANG_NO_THROW Type SLANG_MCALL getType() override; virtual SLANG_NO_THROW Desc* SLANG_MCALL getDesc() override; virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(NativeHandle* outHandle) override; + virtual SLANG_NO_THROW Result SLANG_MCALL setDebugName(const char* name) override; + virtual SLANG_NO_THROW const char* SLANG_MCALL getDebugName() override; }; class DebugResourceView : public DebugObject<IResourceView> @@ -276,7 +289,11 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL endEncoding() override; virtual SLANG_NO_THROW Result SLANG_MCALL bindPipeline(IPipelineState* state, IShaderObject** outRootShaderObject) override; + virtual SLANG_NO_THROW Result SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* rootObject) override; virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override; + virtual SLANG_NO_THROW void SLANG_MCALL + dispatchComputeIndirect(IBufferResource* cmdBuffer, uint64_t offset) override; virtual SLANG_NO_THROW void SLANG_MCALL writeTimestamp(IQueryPool* pool, SlangInt index) override; public: @@ -290,6 +307,8 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL endEncoding() override; virtual SLANG_NO_THROW Result SLANG_MCALL bindPipeline(IPipelineState* state, IShaderObject** outRootShaderObject) override; + virtual SLANG_NO_THROW Result SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* rootObject) override; virtual SLANG_NO_THROW void SLANG_MCALL setViewports(uint32_t count, const Viewport* viewports) override; virtual SLANG_NO_THROW void SLANG_MCALL @@ -307,6 +326,18 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL draw(UInt vertexCount, UInt startVertex = 0) override; virtual SLANG_NO_THROW void SLANG_MCALL drawIndexed(UInt indexCount, UInt startIndex = 0, UInt baseVertex = 0) override; + virtual SLANG_NO_THROW void SLANG_MCALL drawIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) override; + virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) override; virtual SLANG_NO_THROW void SLANG_MCALL setStencilReference(uint32_t referenceValue) override; virtual SLANG_NO_THROW void SLANG_MCALL writeTimestamp(IQueryPool* pool, SlangInt index) override; @@ -338,6 +369,23 @@ public: IBufferResource* const* buffers, ResourceState src, ResourceState dst) override; + virtual SLANG_NO_THROW void SLANG_MCALL copyTexture( + ITextureResource* dst, + ITextureResource::SubresourceRange dstSubresource, + ITextureResource::Offset3D dstOffset, + ITextureResource* src, + ITextureResource::SubresourceRange srcSubresource, + ITextureResource::Offset3D srcOffset, + ITextureResource::Size extent) override; + + virtual SLANG_NO_THROW void SLANG_MCALL uploadTextureData( + ITextureResource* dst, + ITextureResource::SubresourceRange subResourceRange, + ITextureResource::Offset3D offset, + ITextureResource::Offset3D extent, + ITextureResource::SubresourceData* subResourceData, + size_t subResourceDataCount) override; + public: DebugCommandBuffer* commandBuffer; bool isOpen = false; @@ -374,6 +422,8 @@ public: AccessFlag::Enum destAccess) override; virtual SLANG_NO_THROW void SLANG_MCALL bindPipeline(IPipelineState* state, IShaderObject** outRootObject) override; + virtual SLANG_NO_THROW void SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* rootObject) override; virtual SLANG_NO_THROW void SLANG_MCALL dispatchRays( const char* rayGenShaderName, int32_t width, @@ -385,6 +435,17 @@ public: bool isOpen = false; }; +class DebugFence : public DebugObject<IFence> +{ +public: + SLANG_COM_OBJECT_IUNKNOWN_ALL; + IFence* getInterface(const Slang::Guid& guid); + virtual SLANG_NO_THROW FenceStatus SLANG_MCALL getStatus() override; + virtual SLANG_NO_THROW Result SLANG_MCALL reset() override; + virtual SLANG_NO_THROW Result SLANG_MCALL getSharedHandle(uint64_t* outHandle) override; + virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(void** outNativeHandle) override; +}; + class DebugTransientResourceHeap; class DebugCommandBuffer : public DebugObject<ICommandBuffer> @@ -434,7 +495,7 @@ public: ICommandQueue* getInterface(const Slang::Guid& guid); virtual SLANG_NO_THROW const Desc& SLANG_MCALL getDesc() override; virtual SLANG_NO_THROW void SLANG_MCALL - executeCommandBuffers(uint32_t count, ICommandBuffer* const* commandBuffers) override; + executeCommandBuffers(uint32_t count, ICommandBuffer* const* commandBuffers, IFence* fence) override; virtual SLANG_NO_THROW void SLANG_MCALL wait() override; virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(NativeHandle* outHandle) override; }; diff --git a/tools/gfx/immediate-renderer-base.cpp b/tools/gfx/immediate-renderer-base.cpp index 8e2e6be0c..33b545f26 100644 --- a/tools/gfx/immediate-renderer-base.cpp +++ b/tools/gfx/immediate-renderer-base.cpp @@ -153,6 +153,43 @@ public: { m_writer->writeTimestamp(pool, index); } + + virtual SLANG_NO_THROW Result SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* rootObject) override + { + SLANG_UNIMPLEMENTED_X("ImmediateRenderBase::bindPipelineAndRootObject"); + return SLANG_E_NOT_AVAILABLE; + } + + virtual SLANG_NO_THROW void SLANG_MCALL drawIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) override + { + SLANG_UNUSED(maxDrawCount); + SLANG_UNUSED(argBuffer); + SLANG_UNUSED(argOffset); + SLANG_UNUSED(countBuffer); + SLANG_UNUSED(countOffset); + SLANG_UNIMPLEMENTED_X("ImmediateRenderBase::drawIndirect"); + } + + virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) override + { + SLANG_UNUSED(maxDrawCount); + SLANG_UNUSED(argBuffer); + SLANG_UNUSED(argOffset); + SLANG_UNUSED(countBuffer); + SLANG_UNUSED(countOffset); + SLANG_UNIMPLEMENTED_X("ImmediateRenderBase::drawIndirect"); + } }; RenderCommandEncoderImpl m_renderCommandEncoder; @@ -196,12 +233,24 @@ public: return SLANG_OK; } + virtual SLANG_NO_THROW Result SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* rootObject) override + { + SLANG_UNIMPLEMENTED_X("ImmediateRenderBase::bindPipelineAndRootObject"); + return SLANG_E_NOT_AVAILABLE; + } + virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override { m_writer->bindRootShaderObject(m_commandBuffer->m_rootShaderObject); m_writer->dispatchCompute(x, y, z); } + virtual SLANG_NO_THROW void SLANG_MCALL dispatchComputeIndirect(IBufferResource* argBuffer, uint64_t offset) override + { + SLANG_UNIMPLEMENTED_X("ImmediateRenderBase::dispatchComputeIndirect"); + } + virtual SLANG_NO_THROW void SLANG_MCALL writeTimestamp(IQueryPool* pool, SlangInt index) override { m_writer->writeTimestamp(pool, index); @@ -264,6 +313,42 @@ public: ResourceState dst) override { } + + virtual SLANG_NO_THROW void SLANG_MCALL copyTexture( + ITextureResource* dst, + ITextureResource::SubresourceRange dstSubresource, + ITextureResource::Offset3D dstOffset, + ITextureResource* src, + ITextureResource::SubresourceRange srcSubresource, + ITextureResource::Offset3D srcOffset, + ITextureResource::Size extent) override + { + SLANG_UNUSED(dst); + SLANG_UNUSED(dstSubresource); + SLANG_UNUSED(dstOffset); + SLANG_UNUSED(src); + SLANG_UNUSED(srcSubresource); + SLANG_UNUSED(srcOffset); + SLANG_UNUSED(extent); + SLANG_UNIMPLEMENTED_X("copyTexture"); + } + + virtual SLANG_NO_THROW void SLANG_MCALL uploadTextureData( + ITextureResource* dst, + ITextureResource::SubresourceRange subResourceRange, + ITextureResource::Offset3D offset, + ITextureResource::Offset3D extend, + ITextureResource::SubresourceData* subResourceData, + size_t subResourceDataCount) override + { + SLANG_UNUSED(dst); + SLANG_UNUSED(subResourceRange); + SLANG_UNUSED(offset); + SLANG_UNUSED(extend); + SLANG_UNUSED(subResourceData); + SLANG_UNUSED(subResourceDataCount); + SLANG_UNIMPLEMENTED_X("uploadTextureData"); + } }; ResourceCommandEncoderImpl m_resourceCommandEncoder; @@ -408,9 +493,12 @@ public: virtual SLANG_NO_THROW const Desc& SLANG_MCALL getDesc() override { return m_desc; } - virtual SLANG_NO_THROW void SLANG_MCALL - executeCommandBuffers(uint32_t count, ICommandBuffer* const* commandBuffers) override + virtual SLANG_NO_THROW void SLANG_MCALL executeCommandBuffers( + uint32_t count, ICommandBuffer* const* commandBuffers, IFence* fence) override { + // TODO: implement fence signal. + assert(fence == nullptr); + CommandBufferInfo info = {}; for (uint32_t i = 0; i < count; i++) { diff --git a/tools/gfx/renderer-shared.cpp b/tools/gfx/renderer-shared.cpp index 791cb1859..64f3f318c 100644 --- a/tools/gfx/renderer-shared.cpp +++ b/tools/gfx/renderer-shared.cpp @@ -31,6 +31,7 @@ const Slang::Guid GfxGUID::IID_ICommandBuffer = SLANG_UUID_ICommandBuffer; const Slang::Guid GfxGUID::IID_ICommandQueue = SLANG_UUID_ICommandQueue; const Slang::Guid GfxGUID::IID_IQueryPool = SLANG_UUID_IQueryPool; const Slang::Guid GfxGUID::IID_IAccelerationStructure = SLANG_UUID_IAccelerationStructure; +const Slang::Guid GfxGUID::IID_IFence = SLANG_UUID_IFence; StageType translateStage(SlangStage slangStage) @@ -300,6 +301,30 @@ SLANG_NO_THROW bool SLANG_MCALL RendererBase::hasFeature(const char* featureName return m_features.findFirstIndex([&](Slang::String x) { return x == featureName; }) != -1; } +Result RendererBase::getFormatSupportedResourceStates(Format format, ResourceStateSet* outStates) +{ + SLANG_UNUSED(format); + outStates->add(ResourceState::AccelerationStructure); + outStates->add(ResourceState::ConstantBuffer); + outStates->add(ResourceState::CopyDestination); + outStates->add(ResourceState::CopySource); + outStates->add(ResourceState::DepthRead); + outStates->add(ResourceState::DepthWrite); + outStates->add(ResourceState::IndexBuffer); + outStates->add(ResourceState::IndirectArgument); + outStates->add(ResourceState::PreInitialized); + outStates->add(ResourceState::Present); + outStates->add(ResourceState::RenderTarget); + outStates->add(ResourceState::ResolveDestination); + outStates->add(ResourceState::ResolveSource); + outStates->add(ResourceState::ShaderResource); + outStates->add(ResourceState::StreamOutput); + outStates->add(ResourceState::Undefined); + outStates->add(ResourceState::UnorderedAccess); + outStates->add(ResourceState::VertexBuffer); + return SLANG_OK; +} + SLANG_NO_THROW Result SLANG_MCALL RendererBase::getSlangSession(slang::ISession** outSlangSession) { *outSlangSession = slangContext.session.get(); @@ -352,6 +377,31 @@ Result RendererBase::createRayTracingPipelineState(const RayTracingPipelineState return SLANG_E_NOT_AVAILABLE; } +Result RendererBase::createMutableRootShaderObject( + IShaderProgram* program, IShaderObject** outObject) +{ + SLANG_UNUSED(program); + SLANG_UNUSED(outObject); + return SLANG_E_NOT_AVAILABLE; +} + +Result RendererBase::createFence(const IFence::Desc& desc, IFence** outFence) +{ + SLANG_UNUSED(desc); + *outFence = nullptr; + return SLANG_E_NOT_AVAILABLE; +} + +Result RendererBase::waitForFences( + IFence** fences, uint32_t fenceCount, bool waitForAll, uint64_t timeout) +{ + SLANG_UNUSED(fences); + SLANG_UNUSED(fenceCount); + SLANG_UNUSED(waitForAll); + SLANG_UNUSED(timeout); + return SLANG_E_NOT_AVAILABLE; +} + Result RendererBase::getShaderObjectLayout( slang::TypeReflection* type, ShaderObjectContainerType container, diff --git a/tools/gfx/renderer-shared.h b/tools/gfx/renderer-shared.h index 51db601c9..11e80dbaa 100644 --- a/tools/gfx/renderer-shared.h +++ b/tools/gfx/renderer-shared.h @@ -38,6 +38,7 @@ struct GfxGUID static const Slang::Guid IID_ICommandQueue; static const Slang::Guid IID_IQueryPool; static const Slang::Guid IID_IAccelerationStructure; + static const Slang::Guid IID_IFence; }; // We use a `BreakableReference` to avoid the cyclic reference situation in gfx implementation. @@ -199,6 +200,7 @@ protected: {} IResource::Type m_type; + Slang::String m_debugName; }; class BufferResource : public IBufferResource, public Resource @@ -219,6 +221,15 @@ public: virtual SLANG_NO_THROW IResource::Type SLANG_MCALL getType() SLANG_OVERRIDE; virtual SLANG_NO_THROW IBufferResource::Desc* SLANG_MCALL getDesc() SLANG_OVERRIDE; virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(NativeHandle* outHandle) SLANG_OVERRIDE; + virtual SLANG_NO_THROW Result SLANG_MCALL setDebugName(const char* name) override + { + m_debugName = name; + return SLANG_OK; + } + virtual SLANG_NO_THROW const char* SLANG_MCALL getDebugName() override + { + return m_debugName.getBuffer(); + } protected: Desc m_desc; @@ -242,6 +253,15 @@ public: virtual SLANG_NO_THROW IResource::Type SLANG_MCALL getType() SLANG_OVERRIDE; virtual SLANG_NO_THROW ITextureResource::Desc* SLANG_MCALL getDesc() SLANG_OVERRIDE; virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(NativeHandle* outHandle) SLANG_OVERRIDE; + virtual SLANG_NO_THROW Result SLANG_MCALL setDebugName(const char* name) override + { + m_debugName = name; + return SLANG_OK; + } + virtual SLANG_NO_THROW const char* SLANG_MCALL getDebugName() override + { + return m_debugName.getBuffer(); + } protected: Desc m_desc; @@ -1151,6 +1171,8 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL getFeatures( const char** outFeatures, UInt bufferSize, UInt* outFeatureCount) SLANG_OVERRIDE; virtual SLANG_NO_THROW bool SLANG_MCALL hasFeature(const char* featureName) SLANG_OVERRIDE; + virtual SLANG_NO_THROW Result SLANG_MCALL + getFormatSupportedResourceStates(Format format, ResourceStateSet* outStates) override; virtual SLANG_NO_THROW Result SLANG_MCALL getSlangSession(slang::ISession** outSlangSession) SLANG_OVERRIDE; IDevice* getInterface(const Slang::Guid& guid); @@ -1181,6 +1203,18 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL createRayTracingPipelineState( const RayTracingPipelineStateDesc& desc, IPipelineState** outState) override; + // Provides a default implementation that returns SLANG_E_NOT_AVAILABLE. + virtual SLANG_NO_THROW Result SLANG_MCALL + createMutableRootShaderObject(IShaderProgram* program, IShaderObject** outObject) override; + + // Provides a default implementation that returns SLANG_E_NOT_AVAILABLE. + virtual SLANG_NO_THROW Result SLANG_MCALL + createFence(const IFence::Desc& desc, IFence** outFence) override; + + // Provides a default implementation that returns SLANG_E_NOT_AVAILABLE. + virtual SLANG_NO_THROW Result SLANG_MCALL + waitForFences(IFence** fences, uint32_t fenceCount, bool waitForAll, uint64_t timeout) override; + Result getShaderObjectLayout( slang::TypeReflection* type, ShaderObjectContainerType container, diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp index 3a1557a3c..1b538f992 100644 --- a/tools/gfx/vulkan/render-vk.cpp +++ b/tools/gfx/vulkan/render-vk.cpp @@ -3693,6 +3693,13 @@ public: return setPipelineStateImpl(pipelineState, outRootObject); } + virtual SLANG_NO_THROW Result SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* rootObject) override + { + SLANG_UNIMPLEMENTED_X("bindPipelineAndRootObject"); + return SLANG_E_NOT_AVAILABLE; + } + virtual SLANG_NO_THROW void SLANG_MCALL setViewports(uint32_t count, const Viewport* viewports) override { @@ -3873,6 +3880,36 @@ public: api.vkCmdSetStencilReference( m_vkCommandBuffer, VK_STENCIL_FRONT_AND_BACK, referenceValue); } + + virtual SLANG_NO_THROW void SLANG_MCALL drawIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) override + { + SLANG_UNUSED(maxDrawCount); + SLANG_UNUSED(argBuffer); + SLANG_UNUSED(argOffset); + SLANG_UNUSED(countBuffer); + SLANG_UNUSED(countOffset); + SLANG_UNIMPLEMENTED_X("drawIndirect"); + } + + virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( + uint32_t maxDrawCount, + IBufferResource* argBuffer, + uint64_t argOffset, + IBufferResource* countBuffer, + uint64_t countOffset) override + { + SLANG_UNUSED(maxDrawCount); + SLANG_UNUSED(argBuffer); + SLANG_UNUSED(argOffset); + SLANG_UNUSED(countBuffer); + SLANG_UNUSED(countOffset); + SLANG_UNIMPLEMENTED_X("drawIndirect"); + } }; RefPtr<RenderCommandEncoder> m_renderCommandEncoder; @@ -3907,6 +3944,13 @@ public: return setPipelineStateImpl(pipelineState, outRootObject); } + virtual SLANG_NO_THROW Result SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* rootObject) override + { + SLANG_UNIMPLEMENTED_X("bindPipelineAndRootObject"); + return SLANG_E_NOT_AVAILABLE; + } + virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override { auto pipeline = static_cast<PipelineStateImpl*>(m_currentPipeline.Ptr()); @@ -3927,6 +3971,12 @@ public: { _writeTimestamp(m_api, m_vkCommandBuffer, queryPool, index); } + + virtual SLANG_NO_THROW void SLANG_MCALL + dispatchComputeIndirect(IBufferResource* argBuffer, uint64_t offset) override + { + SLANG_UNIMPLEMENTED_X("dispatchComputeIndirect"); + } }; RefPtr<ComputeCommandEncoder> m_computeCommandEncoder; @@ -4198,6 +4248,42 @@ public: { m_commandBuffer = commandBuffer; } + + virtual SLANG_NO_THROW void SLANG_MCALL copyTexture( + ITextureResource* dst, + ITextureResource::SubresourceRange dstSubresource, + ITextureResource::Offset3D dstOffset, + ITextureResource* src, + ITextureResource::SubresourceRange srcSubresource, + ITextureResource::Offset3D srcOffset, + ITextureResource::Size extent) override + { + SLANG_UNUSED(dst); + SLANG_UNUSED(dstSubresource); + SLANG_UNUSED(dstOffset); + SLANG_UNUSED(src); + SLANG_UNUSED(srcSubresource); + SLANG_UNUSED(srcOffset); + SLANG_UNUSED(extent); + SLANG_UNIMPLEMENTED_X("copyTexture"); + } + + virtual SLANG_NO_THROW void SLANG_MCALL uploadTextureData( + ITextureResource* dst, + ITextureResource::SubresourceRange subResourceRange, + ITextureResource::Offset3D offset, + ITextureResource::Offset3D extend, + ITextureResource::SubresourceData* subResourceData, + size_t subResourceDataCount) override + { + SLANG_UNUSED(dst); + SLANG_UNUSED(subResourceRange); + SLANG_UNUSED(offset); + SLANG_UNUSED(extend); + SLANG_UNUSED(subResourceData); + SLANG_UNUSED(subResourceDataCount); + SLANG_UNIMPLEMENTED_X("uploadTextureData"); + } }; RefPtr<ResourceCommandEncoder> m_resourceCommandEncoder; @@ -4443,12 +4529,20 @@ public: } virtual SLANG_NO_THROW void SLANG_MCALL - bindPipeline(IPipelineState* pipeline, IShaderObject** outRootObject) override + bindPipeline(IPipelineState* pipeline, IShaderObject** outRootObject) override { SLANG_UNUSED(pipeline); SLANG_UNUSED(outRootObject); } + virtual SLANG_NO_THROW void SLANG_MCALL + bindPipelineAndRootObject(IPipelineState* state, IShaderObject* rootObject) override + { + SLANG_UNUSED(state); + SLANG_UNUSED(rootObject); + SLANG_UNIMPLEMENTED_X("bindPipelineAndRootObject"); + } + virtual SLANG_NO_THROW void SLANG_MCALL dispatchRays( const char* rayGenShaderName, int32_t width, @@ -4596,11 +4690,12 @@ public: return m_desc; } - virtual SLANG_NO_THROW void SLANG_MCALL - executeCommandBuffers( - uint32_t count, - ICommandBuffer* const* commandBuffers) override + virtual SLANG_NO_THROW void SLANG_MCALL executeCommandBuffers( + uint32_t count, ICommandBuffer* const* commandBuffers, IFence* fence) override { + // TODO: implement fence signaling. + assert(fence == nullptr); + if (count == 0) return; @@ -4639,9 +4734,9 @@ public: submitInfo.pSignalSemaphores = &signalSemaphore; auto commandBufferImpl = static_cast<CommandBufferImpl*>(commandBuffers[0]); - auto fence = commandBufferImpl->m_transientHeap->getCurrentFence(); - vkAPI.vkResetFences(vkAPI.m_device, 1, &fence); - vkAPI.vkQueueSubmit(m_queue, 1, &submitInfo, fence); + auto vkFence = commandBufferImpl->m_transientHeap->getCurrentFence(); + vkAPI.vkResetFences(vkAPI.m_device, 1, &vkFence); + vkAPI.vkQueueSubmit(m_queue, 1, &submitInfo, vkFence); m_pendingWaitSemaphores[0] = signalSemaphore; m_pendingWaitSemaphores[1] = VK_NULL_HANDLE; commandBufferImpl->m_transientHeap->advanceFence(); |
