diff options
| author | Yong He <yonghe@outlook.com> | 2023-02-06 14:34:19 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-06 14:34:19 -0800 |
| commit | 5ede9a3b739a62a46fa408b19e12cf3f72730f1d (patch) | |
| tree | 676b5c23b867b6ad94117c547befe65ffa6548ba | |
| parent | e893a831d7f64eb52e76df087190247f43b150ae (diff) | |
GFX: make dispatch commands return error code. (#2625)
* GFX: make dispatch commands return error code.
* Fix cuda.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
| -rw-r--r-- | slang-gfx.h | 18 | ||||
| -rw-r--r-- | tools/gfx/cuda/cuda-command-encoder.cpp | 5 | ||||
| -rw-r--r-- | tools/gfx/cuda/cuda-command-encoder.h | 4 | ||||
| -rw-r--r-- | tools/gfx/d3d12/d3d12-command-encoder.cpp | 69 | ||||
| -rw-r--r-- | tools/gfx/d3d12/d3d12-command-encoder.h | 20 | ||||
| -rw-r--r-- | tools/gfx/debug-layer/debug-command-encoder.cpp | 32 | ||||
| -rw-r--r-- | tools/gfx/debug-layer/debug-command-encoder.h | 18 | ||||
| -rw-r--r-- | tools/gfx/immediate-renderer-base.cpp | 23 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-command-encoder.cpp | 71 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-command-encoder.h | 22 |
10 files changed, 151 insertions, 131 deletions
diff --git a/slang-gfx.h b/slang-gfx.h index 4a53a3cf1..86ad7d5bc 100644 --- a/slang-gfx.h +++ b/slang-gfx.h @@ -1726,17 +1726,17 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL setIndexBuffer(IBufferResource* buffer, Format indexFormat, Offset offset = 0) = 0; - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL draw(GfxCount vertexCount, GfxIndex startVertex = 0) = 0; - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexed(GfxCount indexCount, GfxIndex startIndex = 0, GfxIndex baseVertex = 0) = 0; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndirect( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, IBufferResource* countBuffer = nullptr, Offset countOffset = 0) = 0; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, @@ -1745,12 +1745,12 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL setStencilReference(uint32_t referenceValue) = 0; virtual SLANG_NO_THROW Result SLANG_MCALL setSamplePositions( GfxCount samplesPerPixel, GfxCount pixelCount, const SamplePosition* samplePositions) = 0; - virtual SLANG_NO_THROW void SLANG_MCALL drawInstanced( + virtual SLANG_NO_THROW Result SLANG_MCALL drawInstanced( GfxCount vertexCount, GfxCount instanceCount, GfxIndex startVertex, GfxIndex startInstanceLocation) = 0; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedInstanced( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedInstanced( GfxCount indexCount, GfxCount instanceCount, GfxIndex startIndexLocation, @@ -1780,8 +1780,8 @@ public: // Sets the current pipeline state along with a pre-created mutable root shader object. virtual SLANG_NO_THROW Result SLANG_MCALL bindPipelineWithRootObject(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, Offset offset) = 0; + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchCompute(int x, int y, int z) = 0; + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchComputeIndirect(IBufferResource* cmdBuffer, Offset offset) = 0; }; enum class AccelerationStructureCopyMode @@ -1828,7 +1828,7 @@ public: /// Issues a dispatch command to start ray tracing workload with a ray tracing pipeline. /// `rayGenShaderIndex` specifies the index into the shader table that identifies the ray generation shader. - virtual SLANG_NO_THROW void SLANG_MCALL dispatchRays( + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchRays( GfxIndex rayGenShaderIndex, IShaderTable* shaderTable, GfxCount width, diff --git a/tools/gfx/cuda/cuda-command-encoder.cpp b/tools/gfx/cuda/cuda-command-encoder.cpp index 6911eb649..d94b40e21 100644 --- a/tools/gfx/cuda/cuda-command-encoder.cpp +++ b/tools/gfx/cuda/cuda-command-encoder.cpp @@ -193,13 +193,14 @@ SLANG_NO_THROW Result SLANG_MCALL return SLANG_OK; } -SLANG_NO_THROW void SLANG_MCALL ComputeCommandEncoderImpl::dispatchCompute(int x, int y, int z) +SLANG_NO_THROW Result SLANG_MCALL ComputeCommandEncoderImpl::dispatchCompute(int x, int y, int z) { m_writer->bindRootShaderObject(m_rootObject); m_writer->dispatchCompute(x, y, z); + return SLANG_OK; } -SLANG_NO_THROW void SLANG_MCALL +SLANG_NO_THROW Result SLANG_MCALL ComputeCommandEncoderImpl::dispatchComputeIndirect(IBufferResource* argBuffer, Offset offset) { SLANG_UNIMPLEMENTED_X("dispatchComputeIndirect"); diff --git a/tools/gfx/cuda/cuda-command-encoder.h b/tools/gfx/cuda/cuda-command-encoder.h index b73dd48c0..ab8aa8f8f 100644 --- a/tools/gfx/cuda/cuda-command-encoder.h +++ b/tools/gfx/cuda/cuda-command-encoder.h @@ -149,9 +149,9 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL bindPipelineWithRootObject(IPipelineState* state, IShaderObject* rootObject) override; - virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override; + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchCompute(int x, int y, int z) override; - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchComputeIndirect(IBufferResource* argBuffer, Offset offset) override; }; diff --git a/tools/gfx/d3d12/d3d12-command-encoder.cpp b/tools/gfx/d3d12/d3d12-command-encoder.cpp index 4c99dd5a8..167c464d6 100644 --- a/tools/gfx/d3d12/d3d12-command-encoder.cpp +++ b/tools/gfx/d3d12/d3d12-command-encoder.cpp @@ -83,7 +83,7 @@ Result PipelineCommandEncoder::_bindRenderState( auto commandList = m_d3dCmdList; auto pipelineTypeIndex = (int)newPipelineImpl->desc.type; auto programImpl = static_cast<ShaderProgramImpl*>(newPipelineImpl->m_program.Ptr()); - newPipelineImpl->ensureAPIPipelineStateCreated(); + SLANG_RETURN_ON_FAIL(newPipelineImpl->ensureAPIPipelineStateCreated()); submitter->setRootSignature(programImpl->m_rootObjectLayout->m_rootSignature); submitter->setPipelineState(newPipelineImpl); RootShaderObjectLayoutImpl* rootLayoutImpl = programImpl->m_rootObjectLayout; @@ -975,23 +975,19 @@ void RenderCommandEncoderImpl::setIndexBuffer( m_boundIndexOffset = (UINT)offset; } -void RenderCommandEncoderImpl::prepareDraw() +Result RenderCommandEncoderImpl::prepareDraw() { auto pipelineState = m_currentPipeline.Ptr(); if (!pipelineState || (pipelineState->desc.type != PipelineType::Graphics)) { - assert(!"No graphics pipeline state set"); - return; + return SLANG_FAIL; } // Submit - setting for graphics { GraphicsSubmitter submitter(m_d3dCmdList); RefPtr<PipelineStateBase> newPipeline; - if (SLANG_FAILED(_bindRenderState(&submitter, newPipeline))) - { - assert(!"Failed to bind render state"); - } + SLANG_RETURN_ON_FAIL(_bindRenderState(&submitter, newPipeline)); } m_d3dCmdList->IASetPrimitiveTopology(m_primitiveTopology); @@ -1034,19 +1030,22 @@ void RenderCommandEncoderImpl::prepareDraw() m_d3dCmdList->IASetIndexBuffer(&indexBufferView); } + return SLANG_OK; } -void RenderCommandEncoderImpl::draw(GfxCount vertexCount, GfxIndex startVertex) +Result RenderCommandEncoderImpl::draw(GfxCount vertexCount, GfxIndex startVertex) { - prepareDraw(); + SLANG_RETURN_ON_FAIL(prepareDraw()); m_d3dCmdList->DrawInstanced((uint32_t)vertexCount, 1, (uint32_t)startVertex, 0); + return SLANG_OK; } -void RenderCommandEncoderImpl::drawIndexed( +Result RenderCommandEncoderImpl::drawIndexed( GfxCount indexCount, GfxIndex startIndex, GfxIndex baseVertex) { - prepareDraw(); + SLANG_RETURN_ON_FAIL(prepareDraw()); m_d3dCmdList->DrawIndexedInstanced((uint32_t)indexCount, 1, (uint32_t)startIndex, (uint32_t)baseVertex, 0); + return SLANG_OK; } void RenderCommandEncoderImpl::endEncoding() @@ -1097,14 +1096,14 @@ void RenderCommandEncoderImpl::setStencilReference(uint32_t referenceValue) m_d3dCmdList->OMSetStencilRef((UINT)referenceValue); } -void RenderCommandEncoderImpl::drawIndirect( +Result RenderCommandEncoderImpl::drawIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, IBufferResource* countBuffer, Offset countOffset) { - prepareDraw(); + SLANG_RETURN_ON_FAIL(prepareDraw()); auto argBufferImpl = static_cast<BufferResourceImpl*>(argBuffer); auto countBufferImpl = static_cast<BufferResourceImpl*>(countBuffer); @@ -1116,16 +1115,17 @@ void RenderCommandEncoderImpl::drawIndirect( (uint64_t)argOffset, countBufferImpl ? countBufferImpl->m_resource.getResource() : nullptr, (uint64_t)countOffset); + return SLANG_OK; } -void RenderCommandEncoderImpl::drawIndexedIndirect( +Result RenderCommandEncoderImpl::drawIndexedIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, IBufferResource* countBuffer, Offset countOffset) { - prepareDraw(); + SLANG_RETURN_ON_FAIL(prepareDraw()); auto argBufferImpl = static_cast<BufferResourceImpl*>(argBuffer); auto countBufferImpl = static_cast<BufferResourceImpl*>(countBuffer); @@ -1137,6 +1137,8 @@ void RenderCommandEncoderImpl::drawIndexedIndirect( (uint64_t)argOffset, countBufferImpl ? countBufferImpl->m_resource.getResource() : nullptr, (uint64_t)countOffset); + + return SLANG_OK; } Result RenderCommandEncoderImpl::setSamplePositions( @@ -1151,34 +1153,36 @@ Result RenderCommandEncoderImpl::setSamplePositions( return SLANG_E_NOT_AVAILABLE; } -void RenderCommandEncoderImpl::drawInstanced( +Result RenderCommandEncoderImpl::drawInstanced( GfxCount vertexCount, GfxCount instanceCount, GfxIndex startVertex, GfxIndex startInstanceLocation) { - prepareDraw(); + SLANG_RETURN_ON_FAIL(prepareDraw()); m_d3dCmdList->DrawInstanced( (uint32_t)vertexCount, (uint32_t)instanceCount, (uint32_t)startVertex, (uint32_t)startInstanceLocation); + return SLANG_OK; } -void RenderCommandEncoderImpl::drawIndexedInstanced( +Result RenderCommandEncoderImpl::drawIndexedInstanced( GfxCount indexCount, GfxCount instanceCount, GfxIndex startIndexLocation, GfxIndex baseVertexLocation, GfxIndex startInstanceLocation) { - prepareDraw(); + SLANG_RETURN_ON_FAIL(prepareDraw()); m_d3dCmdList->DrawIndexedInstanced( (uint32_t)indexCount, (uint32_t)instanceCount, (uint32_t)startIndexLocation, baseVertexLocation, (uint32_t)startInstanceLocation); + return SLANG_OK; } void ComputeCommandEncoderImpl::endEncoding() { PipelineCommandEncoder::endEncodingImpl(); } @@ -1203,35 +1207,31 @@ Result ComputeCommandEncoderImpl::bindPipelineWithRootObject( return bindPipelineWithRootObjectImpl(state, rootObject); } -void ComputeCommandEncoderImpl::dispatchCompute(int x, int y, int z) +Result ComputeCommandEncoderImpl::dispatchCompute(int x, int y, int z) { // Submit binding for compute { ComputeSubmitter submitter(m_d3dCmdList); RefPtr<PipelineStateBase> newPipeline; - if (SLANG_FAILED(_bindRenderState(&submitter, newPipeline))) - { - assert(!"Failed to bind render state"); - } + SLANG_RETURN_ON_FAIL(_bindRenderState(&submitter, newPipeline)); } m_d3dCmdList->Dispatch(x, y, z); + return SLANG_OK; } -void ComputeCommandEncoderImpl::dispatchComputeIndirect(IBufferResource* argBuffer, Offset offset) +Result ComputeCommandEncoderImpl::dispatchComputeIndirect(IBufferResource* argBuffer, Offset offset) { // Submit binding for compute { ComputeSubmitter submitter(m_d3dCmdList); RefPtr<PipelineStateBase> newPipeline; - if (SLANG_FAILED(_bindRenderState(&submitter, newPipeline))) - { - assert(!"Failed to bind render state"); - } + SLANG_RETURN_ON_FAIL(_bindRenderState(&submitter, newPipeline)); } auto argBufferImpl = static_cast<BufferResourceImpl*>(argBuffer); m_d3dCmdList->ExecuteIndirect( m_renderer->dispatchIndirectCmdSignature, 1, argBufferImpl->m_resource, (uint64_t)offset, nullptr, 0); + return SLANG_OK; } #if SLANG_GFX_HAS_DXR_SUPPORT @@ -1337,7 +1337,7 @@ void RayTracingCommandEncoderImpl::bindPipeline( bindPipelineImpl(state, outRootObject); } -void RayTracingCommandEncoderImpl::dispatchRays( +Result RayTracingCommandEncoderImpl::dispatchRays( GfxIndex rayGenShaderIndex, IShaderTable* shaderTable, GfxCount width, @@ -1361,10 +1361,7 @@ void RayTracingCommandEncoderImpl::dispatchRays( } }; RayTracingSubmitter submitter(m_commandBuffer->m_cmdList4); - if (SLANG_FAILED(_bindRenderState(&submitter, newPipeline))) - { - assert(!"Failed to bind render state"); - } + SLANG_RETURN_ON_FAIL(_bindRenderState(&submitter, newPipeline)); if (newPipeline) pipeline = newPipeline.Ptr(); } @@ -1405,6 +1402,8 @@ void RayTracingCommandEncoderImpl::dispatchRays( dispatchDesc.Height = (UINT)height; dispatchDesc.Depth = (UINT)depth; m_commandBuffer->m_cmdList4->DispatchRays(&dispatchDesc); + + return SLANG_OK; } #endif diff --git a/tools/gfx/d3d12/d3d12-command-encoder.h b/tools/gfx/d3d12/d3d12-command-encoder.h index d54411e1a..9e9a8c879 100644 --- a/tools/gfx/d3d12/d3d12-command-encoder.h +++ b/tools/gfx/d3d12/d3d12-command-encoder.h @@ -177,9 +177,9 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL bindPipelineWithRootObject(IPipelineState* state, IShaderObject* rootObject) override; - virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override; + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchCompute(int x, int y, int z) override; - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchComputeIndirect(IBufferResource* argBuffer, Offset offset) override; }; @@ -250,23 +250,23 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL setIndexBuffer(IBufferResource* buffer, Format indexFormat, Offset offset = 0) override; - void prepareDraw(); - virtual SLANG_NO_THROW void SLANG_MCALL + Result prepareDraw(); + virtual SLANG_NO_THROW Result SLANG_MCALL draw(GfxCount vertexCount, GfxIndex startVertex = 0) override; - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexed(GfxCount indexCount, GfxIndex startIndex = 0, GfxIndex baseVertex = 0) override; virtual SLANG_NO_THROW void SLANG_MCALL endEncoding() override; virtual SLANG_NO_THROW void SLANG_MCALL setStencilReference(uint32_t referenceValue) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndirect( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, IBufferResource* countBuffer, Offset countOffset) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, @@ -278,13 +278,13 @@ public: GfxCount pixelCount, const SamplePosition* samplePositions) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawInstanced( + virtual SLANG_NO_THROW Result SLANG_MCALL drawInstanced( GfxCount vertexCount, GfxCount instanceCount, GfxIndex startVertex, GfxIndex startInstanceLocation) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedInstanced( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedInstanced( GfxCount indexCount, GfxCount instanceCount, GfxIndex startIndexLocation, @@ -331,7 +331,7 @@ public: { return bindPipelineWithRootObjectImpl(state, rootObject); } - virtual SLANG_NO_THROW void SLANG_MCALL dispatchRays( + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchRays( GfxIndex rayGenShaderIndex, IShaderTable* shaderTable, GfxCount width, diff --git a/tools/gfx/debug-layer/debug-command-encoder.cpp b/tools/gfx/debug-layer/debug-command-encoder.cpp index 64ebd2b46..3ddd6401f 100644 --- a/tools/gfx/debug-layer/debug-command-encoder.cpp +++ b/tools/gfx/debug-layer/debug-command-encoder.cpp @@ -46,17 +46,17 @@ Result DebugComputeCommandEncoder::bindPipelineWithRootObject( return baseObject->bindPipelineWithRootObject(getInnerObj(state), getInnerObj(rootObject)); } -void DebugComputeCommandEncoder::dispatchCompute(int x, int y, int z) +Result DebugComputeCommandEncoder::dispatchCompute(int x, int y, int z) { SLANG_GFX_API_FUNC; - baseObject->dispatchCompute(x, y, z); + return baseObject->dispatchCompute(x, y, z); } -void DebugComputeCommandEncoder::dispatchComputeIndirect( +Result DebugComputeCommandEncoder::dispatchComputeIndirect( IBufferResource* cmdBuffer, Offset offset) { SLANG_GFX_API_FUNC; - baseObject->dispatchComputeIndirect(getInnerObj(cmdBuffer), offset); + return baseObject->dispatchComputeIndirect(getInnerObj(cmdBuffer), offset); } void DebugRenderCommandEncoder::endEncoding() @@ -130,20 +130,20 @@ void DebugRenderCommandEncoder::setIndexBuffer( baseObject->setIndexBuffer(innerBuffer, indexFormat, offset); } -void DebugRenderCommandEncoder::draw(GfxCount vertexCount, GfxIndex startVertex) +Result DebugRenderCommandEncoder::draw(GfxCount vertexCount, GfxIndex startVertex) { SLANG_GFX_API_FUNC; - baseObject->draw(vertexCount, startVertex); + return baseObject->draw(vertexCount, startVertex); } -void DebugRenderCommandEncoder::drawIndexed( +Result DebugRenderCommandEncoder::drawIndexed( GfxCount indexCount, GfxIndex startIndex, GfxIndex baseVertex) { SLANG_GFX_API_FUNC; - baseObject->drawIndexed(indexCount, startIndex, baseVertex); + return baseObject->drawIndexed(indexCount, startIndex, baseVertex); } -void DebugRenderCommandEncoder::drawIndirect( +Result DebugRenderCommandEncoder::drawIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, @@ -151,11 +151,11 @@ void DebugRenderCommandEncoder::drawIndirect( Offset countOffset) { SLANG_GFX_API_FUNC; - baseObject->drawIndirect( + return baseObject->drawIndirect( maxDrawCount, getInnerObj(argBuffer), argOffset, getInnerObj(countBuffer), countOffset); } -void DebugRenderCommandEncoder::drawIndexedIndirect( +Result DebugRenderCommandEncoder::drawIndexedIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, @@ -163,7 +163,7 @@ void DebugRenderCommandEncoder::drawIndexedIndirect( Offset countOffset) { SLANG_GFX_API_FUNC; - baseObject->drawIndexedIndirect( + return baseObject->drawIndexedIndirect( maxDrawCount, getInnerObj(argBuffer), argOffset, getInnerObj(countBuffer), countOffset); } @@ -180,7 +180,7 @@ Result DebugRenderCommandEncoder::setSamplePositions( return baseObject->setSamplePositions(samplesPerPixel, pixelCount, samplePositions); } -void DebugRenderCommandEncoder::drawInstanced( +Result DebugRenderCommandEncoder::drawInstanced( GfxCount vertexCount, GfxCount instanceCount, GfxIndex startVertex, @@ -191,7 +191,7 @@ void DebugRenderCommandEncoder::drawInstanced( vertexCount, instanceCount, startVertex, startInstanceLocation); } -void DebugRenderCommandEncoder::drawIndexedInstanced( +Result DebugRenderCommandEncoder::drawIndexedInstanced( GfxCount indexCount, GfxCount instanceCount, GfxIndex startIndexLocation, @@ -483,7 +483,7 @@ Result DebugRayTracingCommandEncoder::bindPipelineWithRootObject( return baseObject->bindPipelineWithRootObject(getInnerObj(state), getInnerObj(rootObject)); } -void DebugRayTracingCommandEncoder::dispatchRays( +Result DebugRayTracingCommandEncoder::dispatchRays( GfxIndex rayGenShaderIndex, IShaderTable* shaderTable, GfxCount width, @@ -491,7 +491,7 @@ void DebugRayTracingCommandEncoder::dispatchRays( GfxCount depth) { SLANG_GFX_API_FUNC; - baseObject->dispatchRays(rayGenShaderIndex, getInnerObj(shaderTable), width, height, depth); + return baseObject->dispatchRays(rayGenShaderIndex, getInnerObj(shaderTable), width, height, depth); } } // namespace debug diff --git a/tools/gfx/debug-layer/debug-command-encoder.h b/tools/gfx/debug-layer/debug-command-encoder.h index b53a11074..395db587e 100644 --- a/tools/gfx/debug-layer/debug-command-encoder.h +++ b/tools/gfx/debug-layer/debug-command-encoder.h @@ -123,8 +123,8 @@ public: bindPipeline(IPipelineState* state, IShaderObject** outRootShaderObject) override; virtual SLANG_NO_THROW Result SLANG_MCALL bindPipelineWithRootObject(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 + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchCompute(int x, int y, int z) override; + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchComputeIndirect(IBufferResource* cmdBuffer, Offset offset) override; public: @@ -197,17 +197,17 @@ public: const Offset* offsets) override; virtual SLANG_NO_THROW void SLANG_MCALL setIndexBuffer(IBufferResource* buffer, Format indexFormat, Offset offset = 0) override; - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL draw(GfxCount vertexCount, GfxIndex startVertex = 0) override; - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexed(GfxCount indexCount, GfxIndex startIndex = 0, GfxIndex baseVertex = 0) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndirect( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, IBufferResource* countBuffer, Offset countOffset) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, @@ -218,13 +218,13 @@ public: GfxCount samplesPerPixel, GfxCount pixelCount, const SamplePosition* samplePositions) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawInstanced( + virtual SLANG_NO_THROW Result SLANG_MCALL drawInstanced( GfxCount vertexCount, GfxCount instanceCount, GfxIndex startVertex, GfxIndex startInstanceLocation) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedInstanced( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedInstanced( GfxCount indexCount, GfxCount instanceCount, GfxIndex startIndexLocation, @@ -277,7 +277,7 @@ public: bindPipeline(IPipelineState* state, IShaderObject** outRootObject) override; virtual SLANG_NO_THROW Result SLANG_MCALL bindPipelineWithRootObject(IPipelineState* state, IShaderObject* rootObject) override; - virtual SLANG_NO_THROW void SLANG_MCALL dispatchRays( + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchRays( GfxIndex rayGenShaderIndex, IShaderTable* shaderTable, GfxCount width, diff --git a/tools/gfx/immediate-renderer-base.cpp b/tools/gfx/immediate-renderer-base.cpp index 7a800d49b..94898d519 100644 --- a/tools/gfx/immediate-renderer-base.cpp +++ b/tools/gfx/immediate-renderer-base.cpp @@ -360,18 +360,20 @@ public: m_writer->setIndexBuffer(buffer, indexFormat, offset); } - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL draw(GfxCount vertexCount, GfxIndex startVertex) override { m_writer->bindRootShaderObject(m_commandBuffer->m_rootShaderObject); m_writer->draw(vertexCount, startVertex); + return SLANG_OK; } - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexed(GfxCount indexCount, GfxIndex startIndex, GfxIndex baseVertex) override { m_writer->bindRootShaderObject(m_commandBuffer->m_rootShaderObject); m_writer->drawIndexed(indexCount, startIndex, baseVertex); + return SLANG_OK; } virtual SLANG_NO_THROW void SLANG_MCALL setStencilReference(uint32_t referenceValue) override @@ -379,7 +381,7 @@ public: m_writer->setStencilReference(referenceValue); } - virtual SLANG_NO_THROW void SLANG_MCALL drawIndirect( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, @@ -392,9 +394,10 @@ public: SLANG_UNUSED(countBuffer); SLANG_UNUSED(countOffset); SLANG_UNIMPLEMENTED_X("ImmediateRenderBase::drawIndirect"); + return SLANG_OK; } - virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, @@ -407,6 +410,7 @@ public: SLANG_UNUSED(countBuffer); SLANG_UNUSED(countOffset); SLANG_UNIMPLEMENTED_X("ImmediateRenderBase::drawIndirect"); + return SLANG_OK; } virtual SLANG_NO_THROW Result SLANG_MCALL setSamplePositions( @@ -420,7 +424,7 @@ public: return SLANG_E_NOT_AVAILABLE; } - virtual SLANG_NO_THROW void SLANG_MCALL drawInstanced( + virtual SLANG_NO_THROW Result SLANG_MCALL drawInstanced( GfxCount vertexCount, GfxCount instanceCount, GfxIndex startVertex, @@ -428,9 +432,10 @@ public: { m_writer->bindRootShaderObject(m_commandBuffer->m_rootShaderObject); m_writer->drawInstanced(vertexCount, instanceCount, startVertex, startInstanceLocation); + return SLANG_OK; } - virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedInstanced( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedInstanced( GfxCount indexCount, GfxCount instanceCount, GfxIndex startIndexLocation, @@ -439,6 +444,7 @@ public: { m_writer->bindRootShaderObject(m_commandBuffer->m_rootShaderObject); m_writer->drawIndexedInstanced(indexCount, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation); + return SLANG_OK; } }; @@ -497,13 +503,14 @@ public: return SLANG_OK; } - virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchCompute(int x, int y, int z) override { m_writer->bindRootShaderObject(m_commandBuffer->m_rootShaderObject); m_writer->dispatchCompute(x, y, z); + return SLANG_OK; } - virtual SLANG_NO_THROW void SLANG_MCALL dispatchComputeIndirect(IBufferResource* argBuffer, Offset offset) override + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchComputeIndirect(IBufferResource* argBuffer, Offset offset) override { SLANG_UNIMPLEMENTED_X("ImmediateRenderBase::dispatchComputeIndirect"); } diff --git a/tools/gfx/vulkan/vk-command-encoder.cpp b/tools/gfx/vulkan/vk-command-encoder.cpp index 33cd567c7..dcd33fd19 100644 --- a/tools/gfx/vulkan/vk-command-encoder.cpp +++ b/tools/gfx/vulkan/vk-command-encoder.cpp @@ -188,18 +188,18 @@ Result PipelineCommandEncoder::setPipelineStateWithRootObjectImpl( return SLANG_OK; } -void PipelineCommandEncoder::bindRenderState(VkPipelineBindPoint pipelineBindPoint) +Result PipelineCommandEncoder::bindRenderState(VkPipelineBindPoint pipelineBindPoint) { auto& api = *m_api; // Get specialized pipeline state and bind it. // RefPtr<PipelineStateBase> newPipeline; - m_device->maybeSpecializePipeline( - m_currentPipeline, &m_commandBuffer->m_rootObject, newPipeline); + SLANG_RETURN_ON_FAIL(m_device->maybeSpecializePipeline( + m_currentPipeline, &m_commandBuffer->m_rootObject, newPipeline)); PipelineStateImpl* newPipelineImpl = static_cast<PipelineStateImpl*>(newPipeline.Ptr()); - newPipelineImpl->ensureAPIPipelineStateCreated(); + SLANG_RETURN_ON_FAIL(newPipelineImpl->ensureAPIPipelineStateCreated()); m_currentPipeline = newPipelineImpl; bindRootShaderObjectImpl(pipelineBindPoint); @@ -210,6 +210,8 @@ void PipelineCommandEncoder::bindRenderState(VkPipelineBindPoint pipelineBindPoi api.vkCmdBindPipeline(m_vkCommandBuffer, pipelineBindPoint, newPipelineImpl->m_pipeline); m_boundPipelines[pipelineBindPointId] = newPipelineImpl->m_pipeline; } + + return SLANG_OK; } void ResourceCommandEncoder::copyBuffer( @@ -1084,30 +1086,32 @@ void RenderCommandEncoder::setIndexBuffer( m_vkCommandBuffer, bufferImpl->m_buffer.m_buffer, (VkDeviceSize)offset, indexType); } -void RenderCommandEncoder::prepareDraw() +Result RenderCommandEncoder::prepareDraw() { auto pipeline = static_cast<PipelineStateImpl*>(m_currentPipeline.Ptr()); if (!pipeline) { - assert(!"Invalid render pipeline"); - return; + return SLANG_FAIL; } - bindRenderState(VK_PIPELINE_BIND_POINT_GRAPHICS); + SLANG_RETURN_ON_FAIL(bindRenderState(VK_PIPELINE_BIND_POINT_GRAPHICS)); + return SLANG_OK; } -void RenderCommandEncoder::draw(GfxCount vertexCount, GfxIndex startVertex) +Result RenderCommandEncoder::draw(GfxCount vertexCount, GfxIndex startVertex) { - prepareDraw(); + SLANG_RETURN_ON_FAIL(prepareDraw()); auto& api = *m_api; api.vkCmdDraw(m_vkCommandBuffer, vertexCount, 1, 0, 0); + return SLANG_OK; } -void RenderCommandEncoder::drawIndexed( +Result RenderCommandEncoder::drawIndexed( GfxCount indexCount, GfxIndex startIndex, GfxIndex baseVertex) { - prepareDraw(); + SLANG_RETURN_ON_FAIL(prepareDraw()); auto& api = *m_api; api.vkCmdDrawIndexed(m_vkCommandBuffer, indexCount, 1, startIndex, baseVertex, 0); + return SLANG_OK; } void RenderCommandEncoder::setStencilReference(uint32_t referenceValue) @@ -1116,7 +1120,7 @@ void RenderCommandEncoder::setStencilReference(uint32_t referenceValue) api.vkCmdSetStencilReference(m_vkCommandBuffer, VK_STENCIL_FRONT_AND_BACK, referenceValue); } -void RenderCommandEncoder::drawIndirect( +Result RenderCommandEncoder::drawIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, @@ -1124,9 +1128,10 @@ void RenderCommandEncoder::drawIndirect( Offset countOffset) { // Vulkan does not support sourcing the count from a buffer. - assert(!countBuffer); + if (countBuffer) + return SLANG_FAIL; - prepareDraw(); + SLANG_RETURN_ON_FAIL(prepareDraw()); auto& api = *m_api; auto argBufferImpl = static_cast<BufferResourceImpl*>(argBuffer); api.vkCmdDrawIndirect( @@ -1135,9 +1140,10 @@ void RenderCommandEncoder::drawIndirect( argOffset, maxDrawCount, sizeof(VkDrawIndirectCommand)); + return SLANG_OK; } -void RenderCommandEncoder::drawIndexedIndirect( +Result RenderCommandEncoder::drawIndexedIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, @@ -1145,9 +1151,11 @@ void RenderCommandEncoder::drawIndexedIndirect( Offset countOffset) { // Vulkan does not support sourcing the count from a buffer. - assert(!countBuffer); + if (countBuffer) + return SLANG_FAIL; + + SLANG_RETURN_ON_FAIL(prepareDraw()); - prepareDraw(); auto& api = *m_api; auto argBufferImpl = static_cast<BufferResourceImpl*>(argBuffer); api.vkCmdDrawIndexedIndirect( @@ -1156,6 +1164,7 @@ void RenderCommandEncoder::drawIndexedIndirect( argOffset, maxDrawCount, sizeof(VkDrawIndexedIndirectCommand)); + return SLANG_OK; } Result RenderCommandEncoder::setSamplePositions( @@ -1173,26 +1182,27 @@ Result RenderCommandEncoder::setSamplePositions( return SLANG_E_NOT_AVAILABLE; } -void RenderCommandEncoder::drawInstanced( +Result RenderCommandEncoder::drawInstanced( GfxCount vertexCount, GfxCount instanceCount, GfxIndex startVertex, GfxIndex startInstanceLocation) { - prepareDraw(); + SLANG_RETURN_ON_FAIL(prepareDraw()); auto& api = *m_api; api.vkCmdDraw( m_vkCommandBuffer, vertexCount, instanceCount, startVertex, startInstanceLocation); + return SLANG_OK; } -void RenderCommandEncoder::drawIndexedInstanced( +Result RenderCommandEncoder::drawIndexedInstanced( GfxCount indexCount, GfxCount instanceCount, GfxIndex startIndexLocation, GfxIndex baseVertexLocation, GfxIndex startInstanceLocation) { - prepareDraw(); + SLANG_RETURN_ON_FAIL(prepareDraw()); auto& api = *m_api; api.vkCmdDrawIndexed( m_vkCommandBuffer, @@ -1201,6 +1211,7 @@ void RenderCommandEncoder::drawIndexedInstanced( startIndexLocation, baseVertexLocation, startInstanceLocation); + return SLANG_OK; } void ComputeCommandEncoder::endEncoding() { endEncodingImpl(); } @@ -1217,21 +1228,21 @@ Result ComputeCommandEncoder::bindPipelineWithRootObject( return setPipelineStateWithRootObjectImpl(pipelineState, rootObject); } -void ComputeCommandEncoder::dispatchCompute(int x, int y, int z) +Result ComputeCommandEncoder::dispatchCompute(int x, int y, int z) { auto pipeline = static_cast<PipelineStateImpl*>(m_currentPipeline.Ptr()); if (!pipeline) { - assert(!"Invalid compute pipeline"); - return; + return SLANG_FAIL; } // Also create descriptor sets based on the given pipeline layout - bindRenderState(VK_PIPELINE_BIND_POINT_COMPUTE); + SLANG_RETURN_ON_FAIL(bindRenderState(VK_PIPELINE_BIND_POINT_COMPUTE)); m_api->vkCmdDispatch(m_vkCommandBuffer, x, y, z); + return SLANG_OK; } -void ComputeCommandEncoder::dispatchComputeIndirect(IBufferResource* argBuffer, Offset offset) +Result ComputeCommandEncoder::dispatchComputeIndirect(IBufferResource* argBuffer, Offset offset) { SLANG_UNIMPLEMENTED_X("dispatchComputeIndirect"); } @@ -1439,7 +1450,7 @@ Result RayTracingCommandEncoder::bindPipelineWithRootObject( return setPipelineStateWithRootObjectImpl(pipelineState, rootObject); } -void RayTracingCommandEncoder::dispatchRays( +Result RayTracingCommandEncoder::dispatchRays( GfxIndex raygenShaderIndex, IShaderTable* shaderTable, GfxCount width, @@ -1449,7 +1460,7 @@ void RayTracingCommandEncoder::dispatchRays( auto vkApi = m_commandBuffer->m_renderer->m_api; auto vkCommandBuffer = m_commandBuffer->m_commandBuffer; - bindRenderState(VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR); + SLANG_RETURN_ON_FAIL(bindRenderState(VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR)); auto rtProps = vkApi.m_rtProperties; auto shaderTableImpl = (ShaderTableImpl*)shaderTable; @@ -1492,6 +1503,8 @@ void RayTracingCommandEncoder::dispatchRays( (uint32_t)width, (uint32_t)height, (uint32_t)depth); + + return SLANG_OK; } void RayTracingCommandEncoder::endEncoding() { endEncodingImpl(); } diff --git a/tools/gfx/vulkan/vk-command-encoder.h b/tools/gfx/vulkan/vk-command-encoder.h index 1cd05e6eb..11f557433 100644 --- a/tools/gfx/vulkan/vk-command-encoder.h +++ b/tools/gfx/vulkan/vk-command-encoder.h @@ -46,7 +46,7 @@ public: Result setPipelineStateWithRootObjectImpl(IPipelineState* state, IShaderObject* inObject); - void bindRenderState(VkPipelineBindPoint pipelineBindPoint); + Result bindRenderState(VkPipelineBindPoint pipelineBindPoint); }; class ResourceCommandEncoder @@ -212,23 +212,23 @@ public: virtual SLANG_NO_THROW void SLANG_MCALL setIndexBuffer(IBufferResource* buffer, Format indexFormat, Offset offset = 0) override; - void prepareDraw(); + Result prepareDraw(); - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL draw(GfxCount vertexCount, GfxIndex startVertex = 0) override; - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexed(GfxCount indexCount, GfxIndex startIndex = 0, GfxIndex baseVertex = 0) override; virtual SLANG_NO_THROW void SLANG_MCALL setStencilReference(uint32_t referenceValue) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndirect( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, IBufferResource* countBuffer, Offset countOffset) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedIndirect( GfxCount maxDrawCount, IBufferResource* argBuffer, Offset argOffset, @@ -240,13 +240,13 @@ public: GfxCount pixelCount, const SamplePosition* samplePositions) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawInstanced( + virtual SLANG_NO_THROW Result SLANG_MCALL drawInstanced( GfxCount vertexCount, GfxCount instanceCount, GfxIndex startVertex, GfxIndex startInstanceLocation) override; - virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedInstanced( + virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedInstanced( GfxCount indexCount, GfxCount instanceCount, GfxIndex startIndexLocation, @@ -277,9 +277,9 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL bindPipelineWithRootObject( IPipelineState* pipelineState, IShaderObject* rootObject) override; - virtual SLANG_NO_THROW void SLANG_MCALL dispatchCompute(int x, int y, int z) override; + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchCompute(int x, int y, int z) override; - virtual SLANG_NO_THROW void SLANG_MCALL + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchComputeIndirect(IBufferResource* argBuffer, Offset offset) override; }; @@ -339,7 +339,7 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL bindPipelineWithRootObject( IPipelineState* pipelineState, IShaderObject* rootObject) override; - virtual SLANG_NO_THROW void SLANG_MCALL dispatchRays( + virtual SLANG_NO_THROW Result SLANG_MCALL dispatchRays( GfxIndex raygenShaderIndex, IShaderTable* shaderTable, GfxCount width, |
