summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-02-06 14:34:19 -0800
committerGitHub <noreply@github.com>2023-02-06 14:34:19 -0800
commit5ede9a3b739a62a46fa408b19e12cf3f72730f1d (patch)
tree676b5c23b867b6ad94117c547befe65ffa6548ba
parente893a831d7f64eb52e76df087190247f43b150ae (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.h18
-rw-r--r--tools/gfx/cuda/cuda-command-encoder.cpp5
-rw-r--r--tools/gfx/cuda/cuda-command-encoder.h4
-rw-r--r--tools/gfx/d3d12/d3d12-command-encoder.cpp69
-rw-r--r--tools/gfx/d3d12/d3d12-command-encoder.h20
-rw-r--r--tools/gfx/debug-layer/debug-command-encoder.cpp32
-rw-r--r--tools/gfx/debug-layer/debug-command-encoder.h18
-rw-r--r--tools/gfx/immediate-renderer-base.cpp23
-rw-r--r--tools/gfx/vulkan/vk-command-encoder.cpp71
-rw-r--r--tools/gfx/vulkan/vk-command-encoder.h22
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,