diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/gfx/cuda/render-cuda.cpp | 11 | ||||
| -rw-r--r-- | tools/gfx/render-graphics-common.cpp | 16 | ||||
| -rw-r--r-- | tools/gfx/render-graphics-common.h | 10 | ||||
| -rw-r--r-- | tools/gfx/render.h | 24 | ||||
| -rw-r--r-- | tools/gfx/renderer-shared.cpp | 32 | ||||
| -rw-r--r-- | tools/gfx/renderer-shared.h | 26 | ||||
| -rw-r--r-- | tools/render-test/render-test-main.cpp | 11 |
7 files changed, 76 insertions, 54 deletions
diff --git a/tools/gfx/cuda/render-cuda.cpp b/tools/gfx/cuda/render-cuda.cpp index 906d553cb..a64c354b5 100644 --- a/tools/gfx/cuda/render-cuda.cpp +++ b/tools/gfx/cuda/render-cuda.cpp @@ -1348,8 +1348,9 @@ private: return SLANG_OK; } - virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObjectLayout( - slang::TypeLayoutReflection* typeLayout, IShaderObjectLayout** outLayout) override + virtual Result createShaderObjectLayout( + slang::TypeLayoutReflection* typeLayout, + ShaderObjectLayoutBase** outLayout) override { RefPtr<CUDAShaderObjectLayout> cudaLayout; cudaLayout = new CUDAShaderObjectLayout(this, typeLayout); @@ -1357,9 +1358,11 @@ private: return SLANG_OK; } - virtual SLANG_NO_THROW Result SLANG_MCALL - createShaderObject(IShaderObjectLayout* layout, IShaderObject** outObject) override + virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObject( + ShaderObjectLayoutBase* layout, + IShaderObject** outObject) override { + RefPtr<CUDAShaderObject> result = new CUDAShaderObject(); SLANG_RETURN_ON_FAIL(result->init(this, dynamic_cast<CUDAShaderObjectLayout*>(layout))); *outObject = result.detach(); diff --git a/tools/gfx/render-graphics-common.cpp b/tools/gfx/render-graphics-common.cpp index 2e35005d4..3e38b8b5a 100644 --- a/tools/gfx/render-graphics-common.cpp +++ b/tools/gfx/render-graphics-common.cpp @@ -26,7 +26,7 @@ public: struct SubObjectRangeInfo { - ComPtr<GraphicsCommonShaderObjectLayout> layout; + RefPtr<GraphicsCommonShaderObjectLayout> layout; // Index baseIndex; // Index count; Index bindingRangeIndex; @@ -317,7 +317,7 @@ public: SlangResult build(GraphicsCommonShaderObjectLayout** outLayout) { auto layout = - ComPtr<GraphicsCommonShaderObjectLayout>(new GraphicsCommonShaderObjectLayout()); + RefPtr<GraphicsCommonShaderObjectLayout>(new GraphicsCommonShaderObjectLayout()); SLANG_RETURN_ON_FAIL(layout->_init(this)); *outLayout = layout.detach(); @@ -980,7 +980,7 @@ protected: Result _writeOrdinaryData(char* dest, size_t destSize) { auto src = m_ordinaryData.getBuffer(); - auto srcSize = m_ordinaryData.getCount(); + auto srcSize = size_t(m_ordinaryData.getCount()); SLANG_ASSERT(srcSize <= destSize); @@ -1374,8 +1374,9 @@ protected: }; -Result SLANG_MCALL GraphicsAPIRenderer::createShaderObjectLayout( - slang::TypeLayoutReflection* typeLayout, IShaderObjectLayout** outLayout) +Result GraphicsAPIRenderer::createShaderObjectLayout( + slang::TypeLayoutReflection* typeLayout, + ShaderObjectLayoutBase** outLayout) { RefPtr<GraphicsCommonShaderObjectLayout> layout; SLANG_RETURN_ON_FAIL(GraphicsCommonShaderObjectLayout::createForElementType( @@ -1384,8 +1385,9 @@ Result SLANG_MCALL GraphicsAPIRenderer::createShaderObjectLayout( return SLANG_OK; } -Result SLANG_MCALL - GraphicsAPIRenderer::createShaderObject(IShaderObjectLayout* layout, IShaderObject** outObject) +Result GraphicsAPIRenderer::createShaderObject( + ShaderObjectLayoutBase* layout, + IShaderObject** outObject) { RefPtr<GraphicsCommonShaderObject> shaderObject; SLANG_RETURN_ON_FAIL(GraphicsCommonShaderObject::create(this, diff --git a/tools/gfx/render-graphics-common.h b/tools/gfx/render-graphics-common.h index 59dfb888a..e41fc6ee1 100644 --- a/tools/gfx/render-graphics-common.h +++ b/tools/gfx/render-graphics-common.h @@ -20,10 +20,12 @@ private: class GraphicsAPIRenderer : public RendererBase { public: - virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObjectLayout( - slang::TypeLayoutReflection* typeLayout, IShaderObjectLayout** outLayout) SLANG_OVERRIDE; - virtual SLANG_NO_THROW Result SLANG_MCALL - createShaderObject(IShaderObjectLayout* layout, IShaderObject** outObject) SLANG_OVERRIDE; + virtual Result createShaderObjectLayout( + slang::TypeLayoutReflection* typeLayout, + ShaderObjectLayoutBase** outLayout) SLANG_OVERRIDE; + virtual Result createShaderObject( + ShaderObjectLayoutBase* layout, + IShaderObject** outObject) SLANG_OVERRIDE; virtual SLANG_NO_THROW Result SLANG_MCALL createRootShaderObject( IShaderProgram* program, IShaderObject** outObject) SLANG_OVERRIDE; diff --git a/tools/gfx/render.h b/tools/gfx/render.h index 053f9e1e2..7b77650e8 100644 --- a/tools/gfx/render.h +++ b/tools/gfx/render.h @@ -840,14 +840,6 @@ struct ShaderOffset SlangInt bindingArrayIndex = 0; }; -class IShaderObjectLayout : public ISlangUnknown -{}; -#define SLANG_UUID_IShaderObjectLayout \ - { \ - 0x27f3f67e, 0xa49d, 0x4aae, { 0xa6, 0xd, 0xfa, 0xc2, 0x6b, 0x1c, 0x10, 0x7c } \ - } - - class IShaderObject : public ISlangUnknown { public: @@ -1220,22 +1212,12 @@ public: return layout; } - virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObjectLayout( - slang::TypeLayoutReflection* typeLayout, IShaderObjectLayout** outLayout) = 0; - - inline ComPtr<IShaderObjectLayout> createShaderObjectLayout(slang::TypeLayoutReflection* typeLayout) - { - ComPtr<IShaderObjectLayout> layout; - SLANG_RETURN_NULL_ON_FAIL(createShaderObjectLayout(typeLayout, layout.writeRef())); - return layout; - } - - virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObject(IShaderObjectLayout* layout, IShaderObject** outObject) = 0; + virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObject(slang::TypeReflection* type, IShaderObject** outObject) = 0; - inline ComPtr<IShaderObject> createShaderObject(IShaderObjectLayout* layout) + inline ComPtr<IShaderObject> createShaderObject(slang::TypeReflection* type) { ComPtr<IShaderObject> object; - SLANG_RETURN_NULL_ON_FAIL(createShaderObject(layout, object.writeRef())); + SLANG_RETURN_NULL_ON_FAIL(createShaderObject(type, object.writeRef())); return object; } diff --git a/tools/gfx/renderer-shared.cpp b/tools/gfx/renderer-shared.cpp index 741b1eba5..fdee8b776 100644 --- a/tools/gfx/renderer-shared.cpp +++ b/tools/gfx/renderer-shared.cpp @@ -21,7 +21,6 @@ const Slang::Guid GfxGUID::IID_IResource = SLANG_UUID_IResource; const Slang::Guid GfxGUID::IID_IBufferResource = SLANG_UUID_IBufferResource; const Slang::Guid GfxGUID::IID_ITextureResource = SLANG_UUID_ITextureResource; const Slang::Guid GfxGUID::IID_IRenderer = SLANG_UUID_IRenderer; -const Slang::Guid GfxGUID::IID_IShaderObjectLayout = SLANG_UUID_IShaderObjectLayout; const Slang::Guid GfxGUID::IID_IShaderObject = SLANG_UUID_IShaderObject; gfx::StageType translateStage(SlangStage slangStage) @@ -216,6 +215,30 @@ SLANG_NO_THROW Result SLANG_MCALL RendererBase::getSlangSession(slang::ISession* return SLANG_OK; } +SLANG_NO_THROW Result SLANG_MCALL RendererBase::createShaderObject(slang::TypeReflection* type, IShaderObject** outObject) +{ + RefPtr<ShaderObjectLayoutBase> shaderObjectLayout; + SLANG_RETURN_FALSE_ON_FAIL(getShaderObjectLayout(type, shaderObjectLayout.writeRef())); + return createShaderObject(shaderObjectLayout, outObject); +} + +Result RendererBase::getShaderObjectLayout( + slang::TypeReflection* type, + ShaderObjectLayoutBase** outLayout) +{ + RefPtr<ShaderObjectLayoutBase> shaderObjectLayout; + if( !m_shaderObjectLayoutCache.TryGetValue(type, shaderObjectLayout) ) + { + auto typeLayout = slangContext.session->getTypeLayout(type); + SLANG_RETURN_ON_FAIL(createShaderObjectLayout(typeLayout, shaderObjectLayout.writeRef())); + m_shaderObjectLayoutCache.Add(type, shaderObjectLayout); + } + *outLayout = shaderObjectLayout.detach(); + return SLANG_OK; +} + + + ShaderComponentID ShaderCache::getComponentId(slang::TypeReflection* type) { ComponentKey key; @@ -363,13 +386,6 @@ Result ShaderBinary::writeToBlob(ISlangBlob** outBlob) return SLANG_OK; } -IShaderObjectLayout* ShaderObjectLayoutBase::getInterface(const Slang::Guid& guid) -{ - if (guid == GfxGUID::IID_ISlangUnknown || guid == GfxGUID::IID_IShaderObjectLayout) - return static_cast<IShaderObjectLayout*>(this); - return nullptr; -} - void ShaderObjectLayoutBase::initBase(RendererBase* renderer, slang::TypeLayoutReflection* elementTypeLayout) { m_renderer = renderer; diff --git a/tools/gfx/renderer-shared.h b/tools/gfx/renderer-shared.h index 26ed5b040..7b7a6d757 100644 --- a/tools/gfx/renderer-shared.h +++ b/tools/gfx/renderer-shared.h @@ -129,7 +129,7 @@ struct ExtendedShaderObjectTypeList } }; -class ShaderObjectLayoutBase : public IShaderObjectLayout, public Slang::RefObject +class ShaderObjectLayoutBase : public Slang::RefObject { protected: RendererBase* m_renderer; @@ -137,9 +137,6 @@ protected: ShaderComponentID m_componentID = 0; public: - SLANG_REF_OBJECT_IUNKNOWN_ALL - IShaderObjectLayout* getInterface(const Slang::Guid& guid); - RendererBase* getRenderer() { return m_renderer; } slang::TypeLayoutReflection* getElementTypeLayout() @@ -163,6 +160,7 @@ protected: // The specialized shader object type. ExtendedShaderObjectType shaderObjectType = { nullptr, kInvalidComponentID }; + public: SLANG_REF_OBJECT_IUNKNOWN_ALL IShaderObject* getInterface(const Slang::Guid& guid); @@ -355,6 +353,7 @@ protected: // Responsible for shader compilation, specialization and caching. class RendererBase : public Slang::RefObject, public IRenderer { + friend class ShaderObjectBase; public: SLANG_REF_OBJECT_IUNKNOWN_ALL @@ -364,6 +363,8 @@ public: virtual SLANG_NO_THROW Result SLANG_MCALL getSlangSession(slang::ISession** outSlangSession) SLANG_OVERRIDE; IRenderer* getInterface(const Slang::Guid& guid); + virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObject(slang::TypeReflection* type, IShaderObject** outObject) SLANG_OVERRIDE; + protected: // Retrieves the currently bound unspecialized pipeline. // If the bound pipeline is not created from a Slang component, an implementation should return null. @@ -371,6 +372,21 @@ protected: ExtendedShaderObjectTypeList specializationArgs; // Given current pipeline and root shader object binding, generate and bind a specialized pipeline if necessary. Result maybeSpecializePipeline(ShaderObjectBase* inRootShaderObject); + + + virtual Result createShaderObjectLayout( + slang::TypeLayoutReflection* typeLayout, + ShaderObjectLayoutBase** outLayout) = 0; + + Result getShaderObjectLayout( + slang::TypeReflection* type, + ShaderObjectLayoutBase** outLayout); + + virtual Result createShaderObject( + ShaderObjectLayoutBase* layout, + IShaderObject** outObject) = 0; + + protected: virtual SLANG_NO_THROW SlangResult SLANG_MCALL initialize(const Desc& desc, void* inWindowHandle); protected: @@ -378,6 +394,8 @@ protected: public: SlangContext slangContext; ShaderCache shaderCache; + + Slang::Dictionary<slang::TypeReflection*, Slang::RefPtr<ShaderObjectLayoutBase>> m_shaderObjectLayoutCache; }; } diff --git a/tools/render-test/render-test-main.cpp b/tools/render-test/render-test-main.cpp index e57e3917e..8f62d8a50 100644 --- a/tools/render-test/render-test-main.cpp +++ b/tools/render-test/render-test-main.cpp @@ -397,14 +397,13 @@ SlangResult _assignVarsFromLayout( case ShaderInputType::Object: { auto typeName = entry.objectDesc.typeName; - slang::TypeLayoutReflection* slangTypeLayout = nullptr; + slang::TypeReflection* slangType = nullptr; if(typeName.getLength() != 0) { // If the input line specified the name of the type // to allocate, then we use it directly. // - auto slangType = slangReflection->findTypeByName(typeName.getBuffer()); - slangTypeLayout = slangReflection->getTypeLayout(slangType); + slangType = slangReflection->findTypeByName(typeName.getBuffer()); } else { @@ -412,7 +411,7 @@ SlangResult _assignVarsFromLayout( // then we will infer the type from the type of the // value pointed to by `entryCursor`. // - slangTypeLayout = entryCursor.getTypeLayout(); + auto slangTypeLayout = entryCursor.getTypeLayout(); switch(slangTypeLayout->getKind()) { default: @@ -428,11 +427,11 @@ SlangResult _assignVarsFromLayout( slangTypeLayout = slangTypeLayout->getElementTypeLayout(); break; } + slangType = slangTypeLayout->getType(); } - ComPtr<IShaderObjectLayout> shaderObjectLayout = renderer->createShaderObjectLayout(slangTypeLayout); ComPtr<IShaderObject> shaderObject = - renderer->createShaderObject(shaderObjectLayout); + renderer->createShaderObject(slangType); entryCursor.setObject(shaderObject); } |
