summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2021-02-17 18:42:23 -0800
committerGitHub <noreply@github.com>2021-02-17 18:42:23 -0800
commitb1e376fa1e7dd0ff59991bdf1d3d859d3b63a74a (patch)
tree94245294fd9e569ed5a231afff44bd5e06203078 /tools
parentbdb0c0bb4c22b7956e1d8062c5bdde1caab44255 (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')
-rw-r--r--tools/gfx/cuda/render-cuda.cpp11
-rw-r--r--tools/gfx/render-graphics-common.cpp16
-rw-r--r--tools/gfx/render-graphics-common.h10
-rw-r--r--tools/gfx/render.h24
-rw-r--r--tools/gfx/renderer-shared.cpp32
-rw-r--r--tools/gfx/renderer-shared.h26
-rw-r--r--tools/render-test/render-test-main.cpp11
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);
}