diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2021-02-17 18:42:23 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-17 18:42:23 -0800 |
| commit | b1e376fa1e7dd0ff59991bdf1d3d859d3b63a74a (patch) | |
| tree | 94245294fd9e569ed5a231afff44bd5e06203078 /tools/gfx/renderer-shared.cpp | |
| parent | bdb0c0bb4c22b7956e1d8062c5bdde1caab44255 (diff) | |
Streamline shader object creation (#1717)
This change kind of rolls together two different simplifications:
1. The `createShaderObject()` shouldn't really need to take an `IShaderObjectLayout` because it could just take the `slang::TypeLayoutReflection` instead and create the shader-object layout behind the scenes.
2. For that matter, it needn't take a `slang::TypeLayoutReflection` either, becaues it could just take a `slang::TypeReflection` and query the layout of that type behind the scenes.
The combination of these two changes means:
* `IShaderObjectLayout` is gone from the public API, as is `createShaderObjectLayout()`
* `createShaderObject()` directly takes a `slang::TypeReflection` and allocates a shader object of that type
The result is simpler and more streamlined application code.
Note that under the hood the implementation still has shader-object layouts, using the `ShaderObjectLayoutBase` class. A few locations had to change to use `RefPtr`s instead of `ComPtr`s now that the class is no longer a public COM-lite API type.
The hope is that this change makes it easier to allocate/cache layouts for things like specialized types "under the hood," as is needed to implement parameter setting for static specialization.
Diffstat (limited to 'tools/gfx/renderer-shared.cpp')
| -rw-r--r-- | tools/gfx/renderer-shared.cpp | 32 |
1 files changed, 24 insertions, 8 deletions
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; |
