diff options
Diffstat (limited to 'tools/render-test')
| -rw-r--r-- | tools/render-test/render-test-main.cpp | 34 | ||||
| -rw-r--r-- | tools/render-test/shader-renderer-util.cpp | 11 |
2 files changed, 42 insertions, 3 deletions
diff --git a/tools/render-test/render-test-main.cpp b/tools/render-test/render-test-main.cpp index 4c05422ee..89bb25871 100644 --- a/tools/render-test/render-test-main.cpp +++ b/tools/render-test/render-test-main.cpp @@ -392,8 +392,38 @@ SlangResult _assignVarsFromLayout( case ShaderInputType::Object: { auto typeName = entry.objectDesc.typeName; - auto slangType = slangReflection->findTypeByName(typeName.getBuffer()); - auto slangTypeLayout = slangReflection->getTypeLayout(slangType); + slang::TypeLayoutReflection* slangTypeLayout = 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); + } + else + { + // if the user did not specify what type to allocate, + // then we will infer the type from the type of the + // value pointed to by `entryCursor`. + // + slangTypeLayout = entryCursor.getTypeLayout(); + switch(slangTypeLayout->getKind()) + { + default: + break; + + case slang::TypeReflection::Kind::ConstantBuffer: + case slang::TypeReflection::Kind::ParameterBlock: + // If the cursor is pointing at a constant buffer + // or parameter block, then we assume the user + // actually means to allocate an object based on + // the element type of the block. + // + slangTypeLayout = slangTypeLayout->getElementTypeLayout(); + break; + } + } ComPtr<IShaderObjectLayout> shaderObjectLayout = renderer->createShaderObjectLayout(slangTypeLayout); ComPtr<IShaderObject> shaderObject = diff --git a/tools/render-test/shader-renderer-util.cpp b/tools/render-test/shader-renderer-util.cpp index c90d197f4..ad3812ae3 100644 --- a/tools/render-test/shader-renderer-util.cpp +++ b/tools/render-test/shader-renderer-util.cpp @@ -182,6 +182,7 @@ ComPtr<ISamplerState> _createSamplerState(IRenderer* renderer, const int textureBindFlags = IResource::BindFlag::NonPixelShaderResource | IResource::BindFlag::PixelShaderResource; List<IDescriptorSetLayout::SlotRangeDesc> slotRangeDescs; + List<Index> mapEntryToSlotRange; if(addedConstantBuffer) { @@ -196,6 +197,7 @@ ComPtr<ISamplerState> _createSamplerState(IRenderer* renderer, const ShaderInputLayoutEntry& srcEntry = srcEntries[i]; SLANG_ASSERT(srcEntry.onlyCPULikeBinding == false); + mapEntryToSlotRange.add(slotRangeDescs.getCount()); IDescriptorSetLayout::SlotRangeDesc slotRangeDesc; switch (srcEntry.type) @@ -252,6 +254,10 @@ ComPtr<ISamplerState> _createSamplerState(IRenderer* renderer, slotRangeDesc.type = DescriptorSlotType::Sampler; break; + case ShaderInputType::Object: + // We ignore the `Object` case here, knowing that it is meant for the shader-object path. + continue; + default: assert(!"Unhandled type"); return SLANG_FAIL; @@ -290,7 +296,7 @@ ComPtr<ISamplerState> _createSamplerState(IRenderer* renderer, { const ShaderInputLayoutEntry& srcEntry = srcEntries[i]; - auto rangeIndex = i + (addedConstantBuffer ? 1 : 0); + auto rangeIndex = mapEntryToSlotRange[i]; switch (srcEntry.type) { @@ -407,6 +413,9 @@ ComPtr<ISamplerState> _createSamplerState(IRenderer* renderer, } break; + case ShaderInputType::Object: + break; + default: assert(!"Unhandled type"); return SLANG_FAIL; |
