diff options
| author | Yong He <yonghe@outlook.com> | 2024-02-20 12:24:00 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-20 12:24:00 -0800 |
| commit | 4d20fd329956ac89408b1628a8291fea01bc9a6d (patch) | |
| tree | 8e62d9c1ec05142fd25d0b31073fdb56d44691b0 /tools/gfx | |
| parent | 8e9b61e3bac69dbb37a1451b62302e688a017ced (diff) | |
Refactor compiler option representations. (#3598)
* Refactor compiler option representation.
* Fix binary compatibility.
* Add a test for specifying compiler options at link time.
* Fix binary compatibility.
* Fix binary compatibility.
* Fix backward compatibility on matrix layout.
* Fix.
* Fix.
* Fix.
* Fix gfx.
* Fix gfx.
* Fix dynamic dispatch.
* Polish.
Diffstat (limited to 'tools/gfx')
29 files changed, 199 insertions, 82 deletions
diff --git a/tools/gfx/cpu/cpu-device.cpp b/tools/gfx/cpu/cpu-device.cpp index 4b8595e82..f248cf52a 100644 --- a/tools/gfx/cpu/cpu-device.cpp +++ b/tools/gfx/cpu/cpu-device.cpp @@ -106,10 +106,11 @@ namespace cpu } Result DeviceImpl::createShaderObjectLayout( + slang::ISession* session, slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) { - RefPtr<ShaderObjectLayoutImpl> cpuLayout = new ShaderObjectLayoutImpl(this, typeLayout); + RefPtr<ShaderObjectLayoutImpl> cpuLayout = new ShaderObjectLayoutImpl(this, session, typeLayout); returnRefPtrMove(outLayout, cpuLayout); return SLANG_OK; @@ -166,7 +167,7 @@ namespace cpu if (!slangProgramLayout) return SLANG_FAIL; - RefPtr<RootShaderObjectLayoutImpl> cpuProgramLayout = new RootShaderObjectLayoutImpl(this, slangProgramLayout); + RefPtr<RootShaderObjectLayoutImpl> cpuProgramLayout = new RootShaderObjectLayoutImpl(this, slangGlobalScope->getSession(), slangProgramLayout); cpuProgramLayout->m_programLayout = slangProgramLayout; cpuProgram->layout = cpuProgramLayout; diff --git a/tools/gfx/cpu/cpu-device.h b/tools/gfx/cpu/cpu-device.h index d90ce1e8b..c7b80e26d 100644 --- a/tools/gfx/cpu/cpu-device.h +++ b/tools/gfx/cpu/cpu-device.h @@ -39,6 +39,7 @@ public: IResourceView** outView) override; virtual Result createShaderObjectLayout( + slang::ISession* session, slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) override; diff --git a/tools/gfx/cpu/cpu-shader-object-layout.cpp b/tools/gfx/cpu/cpu-shader-object-layout.cpp index 2ff89efff..4f4c33a6a 100644 --- a/tools/gfx/cpu/cpu-shader-object-layout.cpp +++ b/tools/gfx/cpu/cpu-shader-object-layout.cpp @@ -8,13 +8,13 @@ using namespace Slang; namespace cpu { -ShaderObjectLayoutImpl::ShaderObjectLayoutImpl(RendererBase* renderer, slang::TypeLayoutReflection* layout) +ShaderObjectLayoutImpl::ShaderObjectLayoutImpl(RendererBase* renderer, slang::ISession* session, slang::TypeLayoutReflection* layout) { - initBase(renderer, layout); + initBase(renderer, session, layout); m_subObjectCount = 0; m_resourceCount = 0; - + m_elementTypeLayout = _unwrapParameterGroups(layout, m_containerType); m_size = m_elementTypeLayout->getSize(); @@ -104,7 +104,7 @@ ShaderObjectLayoutImpl::ShaderObjectLayoutImpl(RendererBase* renderer, slang::Ty if (slangBindingType != slang::BindingType::ExistentialValue) { subObjectLayout = - new ShaderObjectLayoutImpl(renderer, slangLeafTypeLayout->getElementTypeLayout()); + new ShaderObjectLayoutImpl(renderer, m_slangSession, slangLeafTypeLayout->getElementTypeLayout()); } SubObjectRangeInfo subObjectRange; @@ -130,14 +130,15 @@ const char* EntryPointLayoutImpl::getEntryPointName() return m_entryPointLayout->getName(); } -RootShaderObjectLayoutImpl::RootShaderObjectLayoutImpl(RendererBase* renderer, slang::ProgramLayout* programLayout) - : ShaderObjectLayoutImpl(renderer, programLayout->getGlobalParamsTypeLayout()) +RootShaderObjectLayoutImpl::RootShaderObjectLayoutImpl(RendererBase* renderer, slang::ISession* session, slang::ProgramLayout* programLayout) + : ShaderObjectLayoutImpl(renderer, session, programLayout->getGlobalParamsTypeLayout()) , m_programLayout(programLayout) { for (UInt i =0; i< programLayout->getEntryPointCount(); i++) { m_entryPointLayouts.add(new EntryPointLayoutImpl( renderer, + session, programLayout->getEntryPointByIndex(i))); } diff --git a/tools/gfx/cpu/cpu-shader-object-layout.h b/tools/gfx/cpu/cpu-shader-object-layout.h index e421918f1..3bf2e2aa7 100644 --- a/tools/gfx/cpu/cpu-shader-object-layout.h +++ b/tools/gfx/cpu/cpu-shader-object-layout.h @@ -55,7 +55,7 @@ public: Index m_subObjectCount = 0; Index m_resourceCount = 0; - ShaderObjectLayoutImpl(RendererBase* renderer, slang::TypeLayoutReflection* layout); + ShaderObjectLayoutImpl(RendererBase* renderer, slang::ISession* session, slang::TypeLayoutReflection* layout); size_t getSize(); Index getResourceCount() const; @@ -73,8 +73,9 @@ private: public: EntryPointLayoutImpl( RendererBase* renderer, + slang::ISession* session, slang::EntryPointLayout* entryPointLayout) - : ShaderObjectLayoutImpl(renderer, entryPointLayout->getTypeLayout()) + : ShaderObjectLayoutImpl(renderer, session, entryPointLayout->getTypeLayout()) , m_entryPointLayout(entryPointLayout) {} @@ -87,7 +88,7 @@ public: slang::ProgramLayout* m_programLayout = nullptr; List<RefPtr<EntryPointLayoutImpl>> m_entryPointLayouts; - RootShaderObjectLayoutImpl(RendererBase* renderer, slang::ProgramLayout* programLayout); + RootShaderObjectLayoutImpl(RendererBase* renderer, slang::ISession* session, slang::ProgramLayout* programLayout); int getKernelIndex(UnownedStringSlice kernelName); void getKernelThreadGroupSize(int kernelIndex, UInt* threadGroupSizes); diff --git a/tools/gfx/cuda/cuda-device.cpp b/tools/gfx/cuda/cuda-device.cpp index 7f931afa1..377a5aba2 100644 --- a/tools/gfx/cuda/cuda-device.cpp +++ b/tools/gfx/cuda/cuda-device.cpp @@ -908,11 +908,12 @@ SLANG_NO_THROW Result SLANG_MCALL DeviceImpl::createQueryPool( } Result DeviceImpl::createShaderObjectLayout( + slang::ISession* session, slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) { RefPtr<ShaderObjectLayoutImpl> cudaLayout; - cudaLayout = new ShaderObjectLayoutImpl(this, typeLayout); + cudaLayout = new ShaderObjectLayoutImpl(this, session, typeLayout); returnRefPtrMove(outLayout, cudaLayout); return SLANG_OK; } diff --git a/tools/gfx/cuda/cuda-device.h b/tools/gfx/cuda/cuda-device.h index bfaf1be6e..e711dc261 100644 --- a/tools/gfx/cuda/cuda-device.h +++ b/tools/gfx/cuda/cuda-device.h @@ -73,6 +73,7 @@ public: IQueryPool** outPool) override; virtual Result createShaderObjectLayout( + slang::ISession* session, slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) override; diff --git a/tools/gfx/cuda/cuda-shader-object-layout.cpp b/tools/gfx/cuda/cuda-shader-object-layout.cpp index eacae0fc0..f527d78de 100644 --- a/tools/gfx/cuda/cuda-shader-object-layout.cpp +++ b/tools/gfx/cuda/cuda-shader-object-layout.cpp @@ -9,11 +9,11 @@ using namespace Slang; namespace cuda { -ShaderObjectLayoutImpl::ShaderObjectLayoutImpl(RendererBase* renderer, slang::TypeLayoutReflection* layout) +ShaderObjectLayoutImpl::ShaderObjectLayoutImpl(RendererBase* renderer, slang::ISession* session, slang::TypeLayoutReflection* layout) { m_elementTypeLayout = _unwrapParameterGroups(layout, m_containerType); - initBase(renderer, m_elementTypeLayout); + initBase(renderer, session, m_elementTypeLayout); // Compute the binding ranges that are used to store // the logical contents of the object in memory. These will relate @@ -101,7 +101,7 @@ ShaderObjectLayoutImpl::ShaderObjectLayoutImpl(RendererBase* renderer, slang::Ty if (slangBindingType != slang::BindingType::ExistentialValue) { subObjectLayout = - new ShaderObjectLayoutImpl(renderer, slangLeafTypeLayout->getElementTypeLayout()); + new ShaderObjectLayoutImpl(renderer, session, slangLeafTypeLayout->getElementTypeLayout()); } SubObjectRangeInfo subObjectRange; @@ -118,13 +118,14 @@ BindingRangeInfo ShaderObjectLayoutImpl::getBindingRange(Index index) { return m Index ShaderObjectLayoutImpl::getBindingRangeCount() const { return m_bindingRanges.getCount(); } RootShaderObjectLayoutImpl::RootShaderObjectLayoutImpl(RendererBase* renderer, slang::ProgramLayout* inProgramLayout) - : ShaderObjectLayoutImpl(renderer, inProgramLayout->getGlobalParamsTypeLayout()) + : ShaderObjectLayoutImpl(renderer, inProgramLayout->getSession(), inProgramLayout->getGlobalParamsTypeLayout()) , programLayout(inProgramLayout) { for (UInt i = 0; i < programLayout->getEntryPointCount(); i++) { entryPointLayouts.add(new ShaderObjectLayoutImpl( renderer, + programLayout->getSession(), programLayout->getEntryPointByIndex(i)->getTypeLayout())); } diff --git a/tools/gfx/cuda/cuda-shader-object-layout.h b/tools/gfx/cuda/cuda-shader-object-layout.h index 5d3a2d52a..edec0c352 100644 --- a/tools/gfx/cuda/cuda-shader-object-layout.h +++ b/tools/gfx/cuda/cuda-shader-object-layout.h @@ -50,7 +50,7 @@ public: Index m_subObjectCount = 0; Index m_resourceCount = 0; - ShaderObjectLayoutImpl(RendererBase* renderer, slang::TypeLayoutReflection* layout); + ShaderObjectLayoutImpl(RendererBase* renderer, slang::ISession* session, slang::TypeLayoutReflection* layout); Index getResourceCount() const; Index getSubObjectCount() const; diff --git a/tools/gfx/d3d11/d3d11-device.cpp b/tools/gfx/d3d11/d3d11-device.cpp index 96a5043fb..20e17b082 100644 --- a/tools/gfx/d3d11/d3d11-device.cpp +++ b/tools/gfx/d3d11/d3d11-device.cpp @@ -1413,12 +1413,13 @@ Result DeviceImpl::createProgram( } Result DeviceImpl::createShaderObjectLayout( + slang::ISession* session, slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) { RefPtr<ShaderObjectLayoutImpl> layout; SLANG_RETURN_ON_FAIL(ShaderObjectLayoutImpl::createForElementType( - this, typeLayout, layout.writeRef())); + this, session, typeLayout, layout.writeRef())); returnRefPtrMove(outLayout, layout); return SLANG_OK; } diff --git a/tools/gfx/d3d11/d3d11-device.h b/tools/gfx/d3d11/d3d11-device.h index 608411912..42fffa3c9 100644 --- a/tools/gfx/d3d11/d3d11-device.h +++ b/tools/gfx/d3d11/d3d11-device.h @@ -59,6 +59,7 @@ public: const IQueryPool::Desc& desc, IQueryPool** outPool) override; virtual Result createShaderObjectLayout( + slang::ISession* session, slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) override; virtual Result createShaderObject(ShaderObjectLayoutBase* layout, IShaderObject** outObject) diff --git a/tools/gfx/d3d11/d3d11-shader-object-layout.cpp b/tools/gfx/d3d11/d3d11-shader-object-layout.cpp index 8032719b0..70204e4c0 100644 --- a/tools/gfx/d3d11/d3d11-shader-object-layout.cpp +++ b/tools/gfx/d3d11/d3d11-shader-object-layout.cpp @@ -180,6 +180,7 @@ Result ShaderObjectLayoutImpl::Builder::setElementTypeLayout(slang::TypeLayoutRe auto elementTypeLayout = slangLeafTypeLayout->getElementTypeLayout(); createForElementType( m_renderer, + m_session, elementTypeLayout, subObjectLayout.writeRef()); } @@ -198,6 +199,7 @@ Result ShaderObjectLayoutImpl::Builder::setElementTypeLayout(slang::TypeLayoutRe { createForElementType( m_renderer, + m_session, pendingTypeLayout, subObjectLayout.writeRef()); @@ -233,10 +235,11 @@ SlangResult ShaderObjectLayoutImpl::Builder::build(ShaderObjectLayoutImpl** outL Result ShaderObjectLayoutImpl::createForElementType( RendererBase* renderer, + slang::ISession* session, slang::TypeLayoutReflection* elementType, ShaderObjectLayoutImpl** outLayout) { - Builder builder(renderer); + Builder builder(renderer, session); builder.setElementTypeLayout(elementType); return builder.build(outLayout); } @@ -245,7 +248,7 @@ Result ShaderObjectLayoutImpl::_init(Builder const* builder) { auto renderer = builder->m_renderer; - initBase(renderer, builder->m_elementTypeLayout); + initBase(renderer, builder->m_session, builder->m_elementTypeLayout); m_bindingRanges = builder->m_bindingRanges; m_srvRanges = builder->m_srvRanges; @@ -303,7 +306,7 @@ Result RootShaderObjectLayoutImpl::create( auto slangEntryPoint = programLayout->getEntryPointByIndex(e); RefPtr<ShaderObjectLayoutImpl> entryPointLayout; SLANG_RETURN_ON_FAIL(ShaderObjectLayoutImpl::createForElementType( - renderer, slangEntryPoint->getTypeLayout(), entryPointLayout.writeRef())); + renderer, program->getSession(), slangEntryPoint->getTypeLayout(), entryPointLayout.writeRef())); builder.addEntryPoint(slangEntryPoint->getStage(), entryPointLayout, slangEntryPoint); } @@ -322,6 +325,8 @@ Result RootShaderObjectLayoutImpl::_init(Builder const* builder) m_programLayout = builder->m_programLayout; m_entryPoints = builder->m_entryPoints; m_pendingDataOffset = builder->m_pendingDataOffset; + m_slangSession = m_program->getSession(); + return SLANG_OK; } diff --git a/tools/gfx/d3d11/d3d11-shader-object-layout.h b/tools/gfx/d3d11/d3d11-shader-object-layout.h index e029a7b76..e18c91c2e 100644 --- a/tools/gfx/d3d11/d3d11-shader-object-layout.h +++ b/tools/gfx/d3d11/d3d11-shader-object-layout.h @@ -107,11 +107,12 @@ public: struct Builder { public: - Builder(RendererBase* renderer) - : m_renderer(renderer) + Builder(RendererBase* renderer, slang::ISession* session) + : m_renderer(renderer), m_session(session) {} RendererBase* m_renderer; + slang::ISession* m_session; slang::TypeLayoutReflection* m_elementTypeLayout; List<BindingRangeInfo> m_bindingRanges; @@ -144,6 +145,7 @@ public: static Result createForElementType( RendererBase* renderer, + slang::ISession* session, slang::TypeLayoutReflection* elementType, ShaderObjectLayoutImpl** outLayout); @@ -216,7 +218,7 @@ public: RendererBase* renderer, slang::IComponentType* program, slang::ProgramLayout* programLayout) - : Super::Builder(renderer) + : Super::Builder(renderer, program->getSession()) , m_program(program) , m_programLayout(programLayout) {} diff --git a/tools/gfx/d3d11/d3d11-shader-object.cpp b/tools/gfx/d3d11/d3d11-shader-object.cpp index 285cc60b6..40d671843 100644 --- a/tools/gfx/d3d11/d3d11-shader-object.cpp +++ b/tools/gfx/d3d11/d3d11-shader-object.cpp @@ -495,6 +495,7 @@ Result ShaderObjectImpl::_createSpecializedLayout(ShaderObjectLayoutImpl** outLa auto renderer = getRenderer(); RefPtr<ShaderObjectLayoutImpl> layout; SLANG_RETURN_ON_FAIL(renderer->getShaderObjectLayout( + m_layout->m_slangSession, extendedType.slangType, m_layout->getContainerType(), (ShaderObjectLayoutBase**)layout.writeRef())); diff --git a/tools/gfx/d3d12/d3d12-device.cpp b/tools/gfx/d3d12/d3d12-device.cpp index cd4dfb7a3..bbf27b4f7 100644 --- a/tools/gfx/d3d12/d3d12-device.cpp +++ b/tools/gfx/d3d12/d3d12-device.cpp @@ -2034,11 +2034,13 @@ Result DeviceImpl::createProgram( } Result DeviceImpl::createShaderObjectLayout( - slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) + slang::ISession* session, + slang::TypeLayoutReflection* typeLayout, + ShaderObjectLayoutBase** outLayout) { RefPtr<ShaderObjectLayoutImpl> layout; SLANG_RETURN_ON_FAIL( - ShaderObjectLayoutImpl::createForElementType(this, typeLayout, layout.writeRef())); + ShaderObjectLayoutImpl::createForElementType(this, session, typeLayout, layout.writeRef())); returnRefPtrMove(outLayout, layout); return SLANG_OK; } diff --git a/tools/gfx/d3d12/d3d12-device.h b/tools/gfx/d3d12/d3d12-device.h index 6bbdde9d0..a38e3c68e 100644 --- a/tools/gfx/d3d12/d3d12-device.h +++ b/tools/gfx/d3d12/d3d12-device.h @@ -152,7 +152,7 @@ public: createInputLayout(IInputLayout::Desc const& desc, IInputLayout** outLayout) override; virtual Result createShaderObjectLayout( - slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) override; + slang::ISession* session, slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) override; virtual Result createShaderObject( ShaderObjectLayoutBase* layout, IShaderObject** outObject) override; virtual Result createMutableShaderObject( diff --git a/tools/gfx/d3d12/d3d12-shader-object-layout.cpp b/tools/gfx/d3d12/d3d12-shader-object-layout.cpp index c43d3881e..0c0095621 100644 --- a/tools/gfx/d3d12/d3d12-shader-object-layout.cpp +++ b/tools/gfx/d3d12/d3d12-shader-object-layout.cpp @@ -50,10 +50,11 @@ bool ShaderObjectLayoutImpl::isBindingRangeRootParameter( Result ShaderObjectLayoutImpl::createForElementType( RendererBase* renderer, + slang::ISession* session, slang::TypeLayoutReflection* elementType, ShaderObjectLayoutImpl** outLayout) { - Builder builder(renderer); + Builder builder(renderer, session); builder.setElementTypeLayout(elementType); return builder.build(outLayout); } @@ -62,7 +63,7 @@ Result ShaderObjectLayoutImpl::init(Builder* builder) { auto renderer = builder->m_renderer; - initBase(renderer, builder->m_elementTypeLayout); + initBase(renderer, builder->m_session, builder->m_elementTypeLayout); m_containerType = builder->m_containerType; @@ -223,13 +224,14 @@ Result ShaderObjectLayoutImpl::Builder::setElementTypeLayout( { if (auto pendingTypeLayout = slangLeafTypeLayout->getPendingDataTypeLayout()) { - createForElementType(m_renderer, pendingTypeLayout, subObjectLayout.writeRef()); + createForElementType(m_renderer, m_session, pendingTypeLayout, subObjectLayout.writeRef()); } } else { createForElementType( m_renderer, + m_session, slangLeafTypeLayout->getElementTypeLayout(), subObjectLayout.writeRef()); } @@ -982,7 +984,7 @@ Result RootShaderObjectLayoutImpl::create( auto slangEntryPoint = programLayout->getEntryPointByIndex(e); RefPtr<ShaderObjectLayoutImpl> entryPointLayout; SLANG_RETURN_ON_FAIL(ShaderObjectLayoutImpl::createForElementType( - device, slangEntryPoint->getTypeLayout(), entryPointLayout.writeRef())); + device, program->getSession(), slangEntryPoint->getTypeLayout(), entryPointLayout.writeRef())); builder.addEntryPoint(slangEntryPoint->getStage(), entryPointLayout); } diff --git a/tools/gfx/d3d12/d3d12-shader-object-layout.h b/tools/gfx/d3d12/d3d12-shader-object-layout.h index accd30aa9..4b46df0b0 100644 --- a/tools/gfx/d3d12/d3d12-shader-object-layout.h +++ b/tools/gfx/d3d12/d3d12-shader-object-layout.h @@ -124,11 +124,12 @@ public: struct Builder { public: - Builder(RendererBase* renderer) - : m_renderer(renderer) + Builder(RendererBase* renderer, slang::ISession* session) + : m_renderer(renderer), m_session(session) {} RendererBase* m_renderer; + slang::ISession* m_session; slang::TypeLayoutReflection* m_elementTypeLayout; List<BindingRangeInfo> m_bindingRanges; List<SubObjectRangeInfo> m_subObjectRanges; @@ -165,6 +166,7 @@ public: static Result createForElementType( RendererBase* renderer, + slang::ISession* session, slang::TypeLayoutReflection* elementType, ShaderObjectLayoutImpl** outLayout); @@ -238,7 +240,7 @@ public: RendererBase* renderer, slang::IComponentType* program, slang::ProgramLayout* programLayout) - : Super::Builder(renderer) + : Super::Builder(renderer, program->getSession()) , m_program(program) , m_programLayout(programLayout) {} diff --git a/tools/gfx/d3d12/d3d12-shader-object.cpp b/tools/gfx/d3d12/d3d12-shader-object.cpp index 5227579ce..1b7b51106 100644 --- a/tools/gfx/d3d12/d3d12-shader-object.cpp +++ b/tools/gfx/d3d12/d3d12-shader-object.cpp @@ -868,6 +868,7 @@ Result ShaderObjectImpl::_createSpecializedLayout(ShaderObjectLayoutImpl** outLa auto renderer = getRenderer(); RefPtr<ShaderObjectLayoutImpl> layout; SLANG_RETURN_ON_FAIL(renderer->getShaderObjectLayout( + m_layout->m_slangSession, extendedType.slangType, m_layout->getContainerType(), (ShaderObjectLayoutBase**)layout.writeRef())); diff --git a/tools/gfx/debug-layer/debug-device.cpp b/tools/gfx/debug-layer/debug-device.cpp index 45374b64f..44ca1de7a 100644 --- a/tools/gfx/debug-layer/debug-device.cpp +++ b/tools/gfx/debug-layer/debug-device.cpp @@ -376,6 +376,27 @@ Result DebugDevice::createShaderObject( return result; } +Result DebugDevice::createShaderObject2( + slang::ISession* session, + slang::TypeReflection* type, + ShaderObjectContainerType containerType, + IShaderObject** outShaderObject) +{ + SLANG_GFX_API_FUNC; + + RefPtr<DebugShaderObject> outObject = new DebugShaderObject(); + auto typeName = type->getName(); + auto result = + baseObject->createShaderObject2(session, type, containerType, outObject->baseObject.writeRef()); + outObject->m_typeName = typeName; + outObject->m_device = this; + outObject->m_slangType = type; + if (SLANG_FAILED(result)) + return result; + returnComPtr(outShaderObject, outObject); + return result; +} + Result DebugDevice::createMutableShaderObject( slang::TypeReflection* type, ShaderObjectContainerType containerType, @@ -396,6 +417,27 @@ Result DebugDevice::createMutableShaderObject( return result; } +Result DebugDevice::createMutableShaderObject2( + slang::ISession* session, + slang::TypeReflection* type, + ShaderObjectContainerType containerType, + IShaderObject** outShaderObject) +{ + SLANG_GFX_API_FUNC; + + RefPtr<DebugShaderObject> outObject = new DebugShaderObject(); + auto typeName = type->getName(); + auto result = + baseObject->createMutableShaderObject2(session, type, containerType, outObject->baseObject.writeRef()); + outObject->m_typeName = typeName; + outObject->m_device = this; + outObject->m_slangType = type; + if (SLANG_FAILED(result)) + return result; + returnComPtr(outShaderObject, outObject); + return result; +} + Result DebugDevice::createMutableRootShaderObject( IShaderProgram* program, IShaderObject** outRootObject) { diff --git a/tools/gfx/debug-layer/debug-device.h b/tools/gfx/debug-layer/debug-device.h index 5b8424093..90feaa37e 100644 --- a/tools/gfx/debug-layer/debug-device.h +++ b/tools/gfx/debug-layer/debug-device.h @@ -94,10 +94,20 @@ public: slang::TypeReflection* type, ShaderObjectContainerType container, IShaderObject** outObject) override; + virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObject2( + slang::ISession* session, + slang::TypeReflection* type, + ShaderObjectContainerType container, + IShaderObject** outObject) override; virtual SLANG_NO_THROW Result SLANG_MCALL createMutableShaderObject( slang::TypeReflection* type, ShaderObjectContainerType container, IShaderObject** outObject) override; + virtual SLANG_NO_THROW Result SLANG_MCALL createMutableShaderObject2( + slang::ISession* session, + slang::TypeReflection* type, + ShaderObjectContainerType container, + IShaderObject** outObject) override; virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObjectFromTypeLayout( slang::TypeLayoutReflection* typeLayout, IShaderObject** outObject) override; virtual SLANG_NO_THROW Result SLANG_MCALL createMutableShaderObjectFromTypeLayout( diff --git a/tools/gfx/open-gl/render-gl.cpp b/tools/gfx/open-gl/render-gl.cpp index c9eb1d94d..b5ab14fe8 100644 --- a/tools/gfx/open-gl/render-gl.cpp +++ b/tools/gfx/open-gl/render-gl.cpp @@ -137,6 +137,7 @@ public: IInputLayout** outLayout) override; virtual Result createShaderObjectLayout( + slang::ISession* session, slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) override; virtual Result createShaderObject(ShaderObjectLayoutBase* layout, IShaderObject** outObject) override; @@ -682,11 +683,12 @@ public: struct Builder { public: - Builder(RendererBase* renderer) - : m_renderer(renderer) + Builder(RendererBase* renderer, slang::ISession* session) + : m_renderer(renderer), m_session(session) {} RendererBase* m_renderer; + slang::ISession* m_session; slang::TypeLayoutReflection* m_elementTypeLayout; /// The container type of this shader object. When `m_containerType` is @@ -792,6 +794,7 @@ public: { createForElementType( m_renderer, + m_session, slangLeafTypeLayout->getElementTypeLayout(), subObjectLayout.writeRef()); } @@ -818,10 +821,11 @@ public: static Result createForElementType( RendererBase* renderer, + slang::ISession* session, slang::TypeLayoutReflection* elementType, ShaderObjectLayoutImpl** outLayout) { - Builder builder(renderer); + Builder builder(renderer, session); builder.setElementTypeLayout(elementType); return builder.build(outLayout); } @@ -851,7 +855,7 @@ public: { auto renderer = builder->m_renderer; - initBase(renderer, builder->m_elementTypeLayout); + initBase(renderer, builder->m_session, builder->m_elementTypeLayout); m_bindingRanges = builder->m_bindingRanges; @@ -889,7 +893,7 @@ public: RendererBase* renderer, slang::IComponentType* program, slang::ProgramLayout* programLayout) - : Super::Builder(renderer) + : Super::Builder(renderer, program->getSession()) , m_program(program) , m_programLayout(programLayout) {} @@ -939,7 +943,7 @@ public: auto slangEntryPoint = programLayout->getEntryPointByIndex(e); RefPtr<ShaderObjectLayoutImpl> entryPointLayout; SLANG_RETURN_ON_FAIL(ShaderObjectLayoutImpl::createForElementType( - renderer, slangEntryPoint->getTypeLayout(), entryPointLayout.writeRef())); + renderer, program->getSession(), slangEntryPoint->getTypeLayout(), entryPointLayout.writeRef())); builder.addEntryPoint(slangEntryPoint->getStage(), entryPointLayout); } @@ -1426,6 +1430,7 @@ public: auto renderer = getRenderer(); RefPtr<ShaderObjectLayoutImpl> layout; SLANG_RETURN_ON_FAIL(renderer->getShaderObjectLayout( + m_layout->m_slangSession, extendedType.slangType, m_layout->getContainerType(), (ShaderObjectLayoutBase**)layout.writeRef())); @@ -2898,12 +2903,13 @@ Result GLDevice::createComputePipelineState(const ComputePipelineStateDesc& inDe } Result GLDevice::createShaderObjectLayout( + slang::ISession* session, slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) { RefPtr<ShaderObjectLayoutImpl> layout; SLANG_RETURN_ON_FAIL(ShaderObjectLayoutImpl::createForElementType( - this, typeLayout, layout.writeRef())); + this, session, typeLayout, layout.writeRef())); returnRefPtrMove(outLayout, layout); return SLANG_OK; } diff --git a/tools/gfx/renderer-shared.cpp b/tools/gfx/renderer-shared.cpp index 54311dd47..911d4712c 100644 --- a/tools/gfx/renderer-shared.cpp +++ b/tools/gfx/renderer-shared.cpp @@ -524,8 +524,17 @@ SLANG_NO_THROW Result SLANG_MCALL RendererBase::createShaderObject( ShaderObjectContainerType container, IShaderObject** outObject) { + return createShaderObject2(slangContext.session, type, container, outObject); +} + +SLANG_NO_THROW Result SLANG_MCALL RendererBase::createShaderObject2( + slang::ISession* slangSession, + slang::TypeReflection* type, + ShaderObjectContainerType container, + IShaderObject** outObject) +{ RefPtr<ShaderObjectLayoutBase> shaderObjectLayout; - SLANG_RETURN_ON_FAIL(getShaderObjectLayout(type, container, shaderObjectLayout.writeRef())); + SLANG_RETURN_ON_FAIL(getShaderObjectLayout(slangSession, type, container, shaderObjectLayout.writeRef())); return createShaderObject(shaderObjectLayout, outObject); } @@ -534,8 +543,17 @@ SLANG_NO_THROW Result SLANG_MCALL RendererBase::createMutableShaderObject( ShaderObjectContainerType containerType, IShaderObject** outObject) { + return createMutableShaderObject2(slangContext.session, type, containerType, outObject); +} + +SLANG_NO_THROW Result SLANG_MCALL RendererBase::createMutableShaderObject2( + slang::ISession* slangSession, + slang::TypeReflection* type, + ShaderObjectContainerType containerType, + IShaderObject** outObject) +{ RefPtr<ShaderObjectLayoutBase> shaderObjectLayout; - SLANG_RETURN_ON_FAIL(getShaderObjectLayout(type, containerType, shaderObjectLayout.writeRef())); + SLANG_RETURN_ON_FAIL(getShaderObjectLayout(slangSession, type, containerType, shaderObjectLayout.writeRef())); return createMutableShaderObject(shaderObjectLayout, outObject); } @@ -616,7 +634,7 @@ SLANG_NO_THROW Result SLANG_MCALL RendererBase::createShaderObjectFromTypeLayout slang::TypeLayoutReflection* typeLayout, IShaderObject** outObject) { RefPtr<ShaderObjectLayoutBase> shaderObjectLayout; - SLANG_RETURN_ON_FAIL(getShaderObjectLayout(typeLayout, shaderObjectLayout.writeRef())); + SLANG_RETURN_ON_FAIL(getShaderObjectLayout(slangContext.session, typeLayout, shaderObjectLayout.writeRef())); return createShaderObject(shaderObjectLayout, outObject); } @@ -624,7 +642,7 @@ SLANG_NO_THROW Result SLANG_MCALL RendererBase::createMutableShaderObjectFromTyp slang::TypeLayoutReflection* typeLayout, IShaderObject** outObject) { RefPtr<ShaderObjectLayoutBase> shaderObjectLayout; - SLANG_RETURN_ON_FAIL(getShaderObjectLayout(typeLayout, shaderObjectLayout.writeRef())); + SLANG_RETURN_ON_FAIL(getShaderObjectLayout(slangContext.session, typeLayout, shaderObjectLayout.writeRef())); return createMutableShaderObject(shaderObjectLayout, outObject); } @@ -702,6 +720,7 @@ Result RendererBase::getTextureRowAlignment(Size* outAlignment) } Result RendererBase::getShaderObjectLayout( + slang::ISession* session, slang::TypeReflection* type, ShaderObjectContainerType container, ShaderObjectLayoutBase** outLayout) @@ -709,26 +728,30 @@ Result RendererBase::getShaderObjectLayout( switch (container) { case ShaderObjectContainerType::StructuredBuffer: - type = slangContext.session->getContainerType(type, slang::ContainerType::StructuredBuffer); + type = session->getContainerType(type, slang::ContainerType::StructuredBuffer); break; case ShaderObjectContainerType::Array: - type = slangContext.session->getContainerType(type, slang::ContainerType::UnsizedArray); + type = session->getContainerType(type, slang::ContainerType::UnsizedArray); break; default: break; } - auto typeLayout = slangContext.session->getTypeLayout(type); - return getShaderObjectLayout(typeLayout, outLayout); + auto typeLayout = session->getTypeLayout(type); + SLANG_RETURN_ON_FAIL(getShaderObjectLayout(session, typeLayout, outLayout)); + (*outLayout)->m_slangSession = session; + return SLANG_OK; } Result RendererBase::getShaderObjectLayout( - slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) + slang::ISession* session, + slang::TypeLayoutReflection* typeLayout, + ShaderObjectLayoutBase** outLayout) { RefPtr<ShaderObjectLayoutBase> shaderObjectLayout; if (!m_shaderObjectLayoutCache.tryGetValue(typeLayout, shaderObjectLayout)) { - SLANG_RETURN_ON_FAIL(createShaderObjectLayout(typeLayout, shaderObjectLayout.writeRef())); + SLANG_RETURN_ON_FAIL(createShaderObjectLayout(session, typeLayout, shaderObjectLayout.writeRef())); m_shaderObjectLayoutCache.add(typeLayout, shaderObjectLayout); } *outLayout = shaderObjectLayout.detach(); @@ -830,9 +853,10 @@ void ShaderCache::addSpecializedPipeline(PipelineKey key, Slang::RefPtr<Pipeline specializedPipelines[key] = specializedPipeline; } -void ShaderObjectLayoutBase::initBase(RendererBase* renderer, slang::TypeLayoutReflection* elementTypeLayout) +void ShaderObjectLayoutBase::initBase(RendererBase* renderer, slang::ISession* session, slang::TypeLayoutReflection* elementTypeLayout) { m_renderer = renderer; + m_slangSession = session; m_elementTypeLayout = elementTypeLayout; m_componentID = m_renderer->shaderCache.getComponentId(m_elementTypeLayout->getType()); } @@ -887,15 +911,12 @@ Result ShaderObjectBase::setExistentialHeader( // Slang runtime, so we can look up the ID for this particular conformance (which // will create it on demand). // - ComPtr<slang::ISession> slangSession; - SLANG_RETURN_ON_FAIL(getRenderer()->getSlangSession(slangSession.writeRef())); - // // Note: If the type doesn't actually conform to the required interface for // this sub-object range, then this is the point where we will detect that // fact and error out. // uint32_t conformanceID = 0xFFFFFFFF; - SLANG_RETURN_ON_FAIL(slangSession->getTypeConformanceWitnessSequentialID( + SLANG_RETURN_ON_FAIL(getLayoutBase()->m_slangSession->getTypeConformanceWitnessSequentialID( concreteType, existentialType, &conformanceID)); // // Once we have the conformance ID, then we can write it into the object diff --git a/tools/gfx/renderer-shared.h b/tools/gfx/renderer-shared.h index 5c67de885..4d88f945b 100644 --- a/tools/gfx/renderer-shared.h +++ b/tools/gfx/renderer-shared.h @@ -390,6 +390,8 @@ protected: ShaderObjectContainerType m_containerType = ShaderObjectContainerType::None; public: + ComPtr<slang::ISession> m_slangSession; + ShaderObjectContainerType getContainerType() { return m_containerType; } static slang::TypeLayoutReflection* _unwrapParameterGroups( @@ -444,7 +446,7 @@ public: return m_componentID; } - void initBase(RendererBase* renderer, slang::TypeLayoutReflection* elementTypeLayout); + void initBase(RendererBase* renderer, slang::ISession* session, slang::TypeLayoutReflection* elementTypeLayout); }; class SimpleShaderObjectData @@ -495,7 +497,6 @@ protected: // The specialized shader object type. ExtendedShaderObjectType shaderObjectType = { nullptr, kInvalidComponentID }; - Result _getSpecializedShaderObjectType(ExtendedShaderObjectType* outType); slang::TypeLayoutReflection* _getElementTypeLayout() { @@ -1265,11 +1266,23 @@ public: ShaderObjectContainerType containerType, IShaderObject** outObject) SLANG_OVERRIDE; + virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObject2( + slang::ISession* session, + slang::TypeReflection* type, + ShaderObjectContainerType containerType, + IShaderObject** outObject) SLANG_OVERRIDE; + virtual SLANG_NO_THROW Result SLANG_MCALL createMutableShaderObject( slang::TypeReflection* type, ShaderObjectContainerType containerType, IShaderObject** outObject) SLANG_OVERRIDE; + virtual SLANG_NO_THROW Result SLANG_MCALL createMutableShaderObject2( + slang::ISession* session, + slang::TypeReflection* type, + ShaderObjectContainerType containerType, + IShaderObject** outObject) SLANG_OVERRIDE; + virtual SLANG_NO_THROW Result SLANG_MCALL createShaderObjectFromTypeLayout( slang::TypeLayoutReflection* typeLayout, IShaderObject** outObject) override; @@ -1325,11 +1338,13 @@ public: slang::IBlob** outDiagnostics = nullptr); Result getShaderObjectLayout( + slang::ISession* session, slang::TypeReflection* type, ShaderObjectContainerType container, ShaderObjectLayoutBase** outLayout); Result getShaderObjectLayout( + slang::ISession* session, slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout); @@ -1345,6 +1360,7 @@ public: virtual Result createShaderObjectLayout( + slang::ISession* session, slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) = 0; diff --git a/tools/gfx/slang.slang b/tools/gfx/slang.slang index 4e2700c2c..26ad7dce0 100644 --- a/tools/gfx/slang.slang +++ b/tools/gfx/slang.slang @@ -331,17 +331,7 @@ public struct TargetDesc public enum SessionFlags { - kSessionFlags_None = 0, - - /** Use application-specific policy for semantics of the `shared` keyword. - - This is a legacy/compatibility flag to help an existing Slang client - migrate to new language features, and should *not* be used by other - clients. This feature may be removed in a future release without a - deprecation warning, and this bit may be re-used for another feature. - You have been warned. - */ - kSessionFlag_FalcorCustomSharedKeywordSemantics = 1 << 0, + kSessionFlags_None = 0 }; public struct PreprocessorMacroDesc diff --git a/tools/gfx/vulkan/vk-device.cpp b/tools/gfx/vulkan/vk-device.cpp index 4f2899f1b..e1b1eaf27 100644 --- a/tools/gfx/vulkan/vk-device.cpp +++ b/tools/gfx/vulkan/vk-device.cpp @@ -2168,11 +2168,13 @@ Result DeviceImpl::createProgram( } Result DeviceImpl::createShaderObjectLayout( - slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) + slang::ISession* session, + slang::TypeLayoutReflection* typeLayout, + ShaderObjectLayoutBase** outLayout) { RefPtr<ShaderObjectLayoutImpl> layout; SLANG_RETURN_ON_FAIL( - ShaderObjectLayoutImpl::createForElementType(this, typeLayout, layout.writeRef())); + ShaderObjectLayoutImpl::createForElementType(this, session, typeLayout, layout.writeRef())); returnRefPtrMove(outLayout, layout); return SLANG_OK; } diff --git a/tools/gfx/vulkan/vk-device.h b/tools/gfx/vulkan/vk-device.h index 9731fd1d4..89c7aa103 100644 --- a/tools/gfx/vulkan/vk-device.h +++ b/tools/gfx/vulkan/vk-device.h @@ -66,7 +66,9 @@ public: createInputLayout(IInputLayout::Desc const& desc, IInputLayout** outLayout) override; virtual Result createShaderObjectLayout( - slang::TypeLayoutReflection* typeLayout, ShaderObjectLayoutBase** outLayout) override; + slang::ISession* session, + slang::TypeLayoutReflection* typeLayout, + ShaderObjectLayoutBase** outLayout) override; virtual Result createShaderObject( ShaderObjectLayoutBase* layout, IShaderObject** outObject) override; virtual Result createMutableShaderObject( diff --git a/tools/gfx/vulkan/vk-shader-object-layout.cpp b/tools/gfx/vulkan/vk-shader-object-layout.cpp index d7f0d0fd0..d84627e86 100644 --- a/tools/gfx/vulkan/vk-shader-object-layout.cpp +++ b/tools/gfx/vulkan/vk-shader-object-layout.cpp @@ -449,7 +449,7 @@ void ShaderObjectLayoutImpl::Builder::addBindingRanges(slang::TypeLayoutReflecti auto varLayout = slangLeafTypeLayout->getElementVarLayout(); auto subTypeLayout = varLayout->getTypeLayout(); ShaderObjectLayoutImpl::createForElementType( - m_renderer, subTypeLayout, subObjectLayout.writeRef()); + m_renderer, m_session, subTypeLayout, subObjectLayout.writeRef()); } break; @@ -457,7 +457,7 @@ void ShaderObjectLayoutImpl::Builder::addBindingRanges(slang::TypeLayoutReflecti if (auto pendingTypeLayout = slangLeafTypeLayout->getPendingDataTypeLayout()) { ShaderObjectLayoutImpl::createForElementType( - m_renderer, pendingTypeLayout, subObjectLayout.writeRef()); + m_renderer, m_session, pendingTypeLayout, subObjectLayout.writeRef()); } break; } @@ -551,10 +551,11 @@ SlangResult ShaderObjectLayoutImpl::Builder::build(ShaderObjectLayoutImpl** outL Result ShaderObjectLayoutImpl::createForElementType( DeviceImpl* renderer, + slang::ISession* session, slang::TypeLayoutReflection* elementType, ShaderObjectLayoutImpl** outLayout) { - Builder builder(renderer); + Builder builder(renderer, session); builder.setElementTypeLayout(elementType); // When constructing a shader object layout directly from a reflected @@ -618,7 +619,7 @@ Result ShaderObjectLayoutImpl::_init(Builder const* builder) { auto renderer = builder->m_renderer; - initBase(renderer, builder->m_elementTypeLayout); + initBase(renderer, builder->m_session, builder->m_elementTypeLayout); m_bindingRanges = builder->m_bindingRanges; @@ -722,7 +723,7 @@ Result RootShaderObjectLayout::create( { auto slangEntryPoint = programLayout->getEntryPointByIndex(e); - EntryPointLayout::Builder entryPointBuilder(renderer); + EntryPointLayout::Builder entryPointBuilder(renderer, program->getSession()); entryPointBuilder.addEntryPointParams(slangEntryPoint); RefPtr<EntryPointLayout> entryPointLayout; diff --git a/tools/gfx/vulkan/vk-shader-object-layout.h b/tools/gfx/vulkan/vk-shader-object-layout.h index 1d2b08b6c..3f60e6b89 100644 --- a/tools/gfx/vulkan/vk-shader-object-layout.h +++ b/tools/gfx/vulkan/vk-shader-object-layout.h @@ -134,11 +134,12 @@ public: struct Builder { public: - Builder(DeviceImpl* renderer) - : m_renderer(renderer) + Builder(DeviceImpl* renderer, slang::ISession* session) + : m_renderer(renderer), m_session(session) {} DeviceImpl* m_renderer; + slang::ISession* m_session; slang::TypeLayoutReflection* m_elementTypeLayout; /// The container type of this shader object. When `m_containerType` is @@ -214,6 +215,7 @@ public: static Result createForElementType( DeviceImpl* renderer, + slang::ISession* session, slang::TypeLayoutReflection* elementType, ShaderObjectLayoutImpl** outLayout); @@ -321,8 +323,8 @@ class EntryPointLayout : public ShaderObjectLayoutImpl public: struct Builder : Super::Builder { - Builder(DeviceImpl* device) - : Super::Builder(device) + Builder(DeviceImpl* device, slang::ISession* session) + : Super::Builder(device, session) {} Result build(EntryPointLayout** outLayout); @@ -367,7 +369,7 @@ public: DeviceImpl* renderer, slang::IComponentType* program, slang::ProgramLayout* programLayout) - : Super::Builder(renderer) + : Super::Builder(renderer, program->getSession()) , m_program(program) , m_programLayout(programLayout) {} diff --git a/tools/gfx/vulkan/vk-shader-object.cpp b/tools/gfx/vulkan/vk-shader-object.cpp index 31422429b..77707eac0 100644 --- a/tools/gfx/vulkan/vk-shader-object.cpp +++ b/tools/gfx/vulkan/vk-shader-object.cpp @@ -977,6 +977,7 @@ Result ShaderObjectImpl::_createSpecializedLayout(ShaderObjectLayoutImpl** outLa auto device = getDevice(); RefPtr<ShaderObjectLayoutImpl> layout; SLANG_RETURN_ON_FAIL(device->getShaderObjectLayout( + m_layout->m_slangSession, extendedType.slangType, m_layout->getContainerType(), (ShaderObjectLayoutBase**)layout.writeRef())); |
