diff options
| author | Yong He <yonghe@outlook.com> | 2022-01-21 10:17:39 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-21 10:17:39 -0800 |
| commit | f85bc7ae98486b37518958e659f659f1ff9b125c (patch) | |
| tree | b18f40a62ac51ee77bdf651a6d9a26f277019ab4 /tools/gfx/renderer-shared.h | |
| parent | 11d248293f1b56a790faadead1e3d94de81f29a2 (diff) | |
GFX: seperated ShaderTable. (#2090)
Diffstat (limited to 'tools/gfx/renderer-shared.h')
| -rw-r--r-- | tools/gfx/renderer-shared.h | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/tools/gfx/renderer-shared.h b/tools/gfx/renderer-shared.h index 33d51e9ad..6baade085 100644 --- a/tools/gfx/renderer-shared.h +++ b/tools/gfx/renderer-shared.h @@ -39,6 +39,7 @@ struct GfxGUID static const Slang::Guid IID_IQueryPool; static const Slang::Guid IID_IAccelerationStructure; static const Slang::Guid IID_IFence; + static const Slang::Guid IID_IShaderTable; }; // We use a `BreakableReference` to avoid the cyclic reference situation in gfx implementation. @@ -1186,7 +1187,7 @@ public: } public: SLANG_COM_OBJECT_IUNKNOWN_ALL - ITransientResourceHeap* getInterface(const Slang::Guid& guid) + ITransientResourceHeap* getInterface(const Slang::Guid& guid) { if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_ITransientResourceHeap) return static_cast<ITransientResourceHeap*>(this); @@ -1194,6 +1195,48 @@ public: } }; +class ShaderTableBase + : public IShaderTable + , public Slang::ComObject +{ +public: + Slang::List<Slang::String> m_entryPointNames; + uint32_t m_rayGenShaderCount; + uint32_t m_missShaderCount; + uint32_t m_hitGroupCount; + + Slang::Dictionary<PipelineStateBase*, Slang::RefPtr<BufferResource>> m_deviceBuffers; + + SLANG_COM_OBJECT_IUNKNOWN_ALL + IShaderTable* getInterface(const Slang::Guid& guid) + { + if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_IShaderTable) + return static_cast<IShaderTable*>(this); + return nullptr; + } + + virtual Slang::RefPtr<BufferResource> createDeviceBuffer( + PipelineStateBase* pipeline, + TransientResourceHeapBase* transientHeap, + IResourceCommandEncoder* encoder) = 0; + + BufferResource* getOrCreateBuffer( + PipelineStateBase* pipeline, + TransientResourceHeapBase* transientHeap, + IResourceCommandEncoder* encoder) + { + if (auto ptr = m_deviceBuffers.TryGetValue(pipeline)) + { + return ptr->Ptr(); + } + auto result = createDeviceBuffer(pipeline, transientHeap, encoder); + m_deviceBuffers[pipeline] = result; + return result; + } + + Result init(const IShaderTable::Desc& desc); +}; + // Renderer implementation shared by all platforms. // Responsible for shader compilation, specialization and caching. class RendererBase : public IDevice, public Slang::ComObject @@ -1256,6 +1299,11 @@ public: // Provides a default implementation that returns SLANG_E_NOT_AVAILABLE for platforms // without ray tracing support. + virtual SLANG_NO_THROW Result SLANG_MCALL + createShaderTable(const IShaderTable::Desc& desc, IShaderTable** outTable) override; + + // Provides a default implementation that returns SLANG_E_NOT_AVAILABLE for platforms + // without ray tracing support. virtual SLANG_NO_THROW Result SLANG_MCALL createRayTracingPipelineState( const RayTracingPipelineStateDesc& desc, IPipelineState** outState) override; |
