From 9f89c3b2de80c49222c4a6b48e845894c4256a5d Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 3 Jan 2018 12:46:23 -0800 Subject: Add API for querying TypeLayout from a Type Added two API functions: 1. `spReflection_FindTypeByName`, which returns a DeclRefType to the struct type with the given name. The function finds from all loaded modules in a `CompileRequest` for a decl with the given name, construct a `Type` object and cache it in `CompileRequest::types` dictionary. The subsequent calls to `spReflection_FindTypeByName` with the same name will simply returned the cached Type objects. 2. `spReflection_GetTypeLayout`, which returns a `TypeLayout` for a given `Type`. This function creates and caches the `TypeLayout` in the `TargetRequest` object that is used to create the `ProgramLayout`. --- source/slang/compiler.h | 7 +++++++ source/slang/parameter-binding.cpp | 3 +++ source/slang/reflection.cpp | 41 ++++++++++++++++++++++++++++++++++++++ source/slang/type-layout.h | 2 ++ 4 files changed, 53 insertions(+) (limited to 'source') diff --git a/source/slang/compiler.h b/source/slang/compiler.h index 0e85a1088..2302c77c0 100644 --- a/source/slang/compiler.h +++ b/source/slang/compiler.h @@ -16,6 +16,7 @@ namespace Slang class CompileRequest; class ProgramLayout; class PtrType; + class TypeLayout; enum class CompilerMode { @@ -197,6 +198,9 @@ namespace Slang // in the parent compile request (indexing matches // the order they are given in the compile request) List entryPointResults; + + // TypeLayouts created on the fly by reflection API + Dictionary> typeLayouts; }; // A directory to be searched when looking for files (e.g., `#include`) @@ -255,6 +259,9 @@ namespace Slang // assocaited with a translation unit). List > entryPoints; + // Types constructed by reflection API + Dictionary> types; + // The code generation profile we've been asked to use. Profile profile; diff --git a/source/slang/parameter-binding.cpp b/source/slang/parameter-binding.cpp index 6145015f1..6dac47631 100644 --- a/source/slang/parameter-binding.cpp +++ b/source/slang/parameter-binding.cpp @@ -1786,6 +1786,8 @@ void generateParameterBindings( return; RefPtr programLayout = new ProgramLayout(); + programLayout->targetRequest = targetReq; + targetReq->layout = programLayout; // Create a context to hold shared state during the process @@ -2061,6 +2063,7 @@ RefPtr specializeProgramLayout( { RefPtr newProgramLayout; newProgramLayout = new ProgramLayout(); + newProgramLayout->targetRequest = targetReq; newProgramLayout->bindingForHackSampler = programLayout->bindingForHackSampler; newProgramLayout->hackSamplerVar = programLayout->hackSamplerVar; newProgramLayout->globalGenericParams = programLayout->globalGenericParams; diff --git a/source/slang/reflection.cpp b/source/slang/reflection.cpp index 5270df8b4..0558ff773 100644 --- a/source/slang/reflection.cpp +++ b/source/slang/reflection.cpp @@ -428,6 +428,47 @@ SLANG_API char const* spReflectionType_GetName(SlangReflectionType* inType) return nullptr; } +SLANG_API SlangReflectionType * spReflection_FindTypeByName(SlangReflection * reflection, char const * name) +{ + auto context = convert(reflection); + auto compileRequest = context->targetRequest->compileRequest; + + RefPtr result; + if (compileRequest->types.TryGetValue(name, result)) + return (SlangReflectionType*)result.Ptr(); + + Decl* resultDecl = nullptr; + for (auto module : compileRequest->loadedModulesList) + { + auto nameObj = compileRequest->getNamePool()->getName(name); + if (module->moduleDecl->memberDictionary.TryGetValue(nameObj, resultDecl)) + break; + } + if (resultDecl) + { + RefPtr declRefType = new DeclRefType(); + declRefType->declRef.decl = resultDecl; + compileRequest->types[name] = declRefType; + return (SlangReflectionType*)declRefType.Ptr(); + } + return nullptr; +} + +SLANG_API SlangReflectionTypeLayout* spReflection_GetTypeLayout( + SlangReflection* reflection, + SlangReflectionType* inType, + SlangLayoutRules /*rules*/) +{ + auto context = convert(reflection); + auto type = convert(inType); + auto layoutContext = getInitialLayoutContextForTarget(context->targetRequest); + RefPtr result; + if (context->targetRequest->typeLayouts.TryGetValue(type, result)) + return (SlangReflectionTypeLayout*)result.Ptr(); + result = CreateTypeLayout(layoutContext, type); + context->targetRequest->typeLayouts[type] = result; + return (SlangReflectionTypeLayout*)result.Ptr(); +} SLANG_API SlangReflectionType* spReflectionType_GetResourceResultType(SlangReflectionType* inType) { diff --git a/source/slang/type-layout.h b/source/slang/type-layout.h index 904dacd91..38fabb009 100644 --- a/source/slang/type-layout.h +++ b/source/slang/type-layout.h @@ -456,6 +456,8 @@ public: // a dummy sampler just to appease glslang int bindingForHackSampler = 0; RefPtr hackSamplerVar; + + TargetRequest* targetRequest = nullptr; }; struct LayoutRulesFamilyImpl; -- cgit v1.2.3