summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--slang-gfx.h148
-rw-r--r--tools/gfx/cuda/render-cuda.cpp55
-rw-r--r--tools/gfx/d3d12/render-d3d12.cpp97
-rw-r--r--tools/gfx/debug-layer.cpp166
-rw-r--r--tools/gfx/debug-layer.h63
-rw-r--r--tools/gfx/immediate-renderer-base.cpp92
-rw-r--r--tools/gfx/renderer-shared.cpp50
-rw-r--r--tools/gfx/renderer-shared.h34
-rw-r--r--tools/gfx/vulkan/render-vk.cpp111
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();