From 1e0aabf4b28f48bfbfee7b1a9c08031892c004d0 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 2 Jan 2018 22:04:50 -0800 Subject: no-codegen compile flag and global generics reflection (#347) * no-codegen compile flag and global generics reflection 1. Add SLANG_COMPILE_FLAG_NO_CODEGEN (-no-codegen) compiler flag to skip code generation stage, so that a shader that uses global generic type parmameters can be parsed, checked and introspected without knowing the final specialization. 2. Add reflection API to query for global generic type parameters, global parameters of generic type, and the generic type parameter index related to a global generic parameter. 3. Add a reflection test case for global generic type parameters. * add expected result for global-type-params test case. * fix reflection json output. * fix branch condition errors * fix expected result for global-type-params.slang * fix expected test case output --- tools/slang-reflection-test/main.cpp | 66 ++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) (limited to 'tools') diff --git a/tools/slang-reflection-test/main.cpp b/tools/slang-reflection-test/main.cpp index 2b5477b4a..90be8f5c7 100644 --- a/tools/slang-reflection-test/main.cpp +++ b/tools/slang-reflection-test/main.cpp @@ -117,6 +117,7 @@ static void emitReflectionVarBindingInfoJSON( CASE(SPECIALIZATION_CONSTANT, specializationConstant); CASE(MIXED, mixed); CASE(REGISTER_SPACE, registerSpace); + CASE(GENERIC, generic); #undef CASE default: @@ -287,7 +288,8 @@ static void emitReflectionTypeInfoJSON( PrettyWriter& writer, slang::TypeReflection* type) { - switch( type->getKind() ) + auto kind = type->getKind(); + switch(kind) { case slang::TypeReflection::Kind::SamplerState: write(writer, "\"kind\": \"samplerState\""); @@ -456,6 +458,14 @@ static void emitReflectionTypeInfoJSON( } break; + case slang::TypeReflection::Kind::GenericTypeParameter: + write(writer, "\"kind\": \"GenericTypeParameter\",\n"); + emitReflectionNameInfoJSON(writer, type->getName()); + break; + case slang::TypeReflection::Kind::Interface: + write(writer, "\"kind\": \"Interface\",\n"); + emitReflectionNameInfoJSON(writer, type->getName()); + break; default: assert(!"unhandled case"); break; @@ -555,6 +565,16 @@ static void emitReflectionTypeLayoutInfoJSON( writer, typeLayout->getElementTypeLayout()); break; + case slang::TypeReflection::Kind::GenericTypeParameter: + write(writer, "\"kind\": \"GenericTypeParameter\""); + write(writer, ",\n"); + emitReflectionNameInfoJSON(writer, typeLayout->getName()); + break; + case slang::TypeReflection::Kind::Interface: + write(writer, "\"kind\": \"Interface\",\n"); + write(writer, ",\n"); + emitReflectionNameInfoJSON(writer, typeLayout->getName()); + break; } // TODO: emit size info for types @@ -662,6 +682,33 @@ Range range(T end) return Range(T(0), end); } +static void emitReflectionTypeParamJSON( + PrettyWriter& writer, + slang::TypeParameterReflection* typeParam) +{ + write(writer, "{\n"); + indent(writer); + emitReflectionNameInfoJSON(writer, typeParam->getName()); + write(writer, ",\n"); + write(writer, "constraints: \n"); + write(writer, "[\n"); + indent(writer); + auto constraintCount = typeParam->getConstraintCount(); + for (auto ee : range(constraintCount)) + { + if (ee != 0) write(writer, ",\n"); + write(writer, "{\n"); + indent(writer); + emitReflectionTypeInfoJSON(writer, typeParam->getConstraintByIndex(ee)); + dedent(writer); + write(writer, "\n}"); + } + dedent(writer); + write(writer, "\n]"); + dedent(writer); + write(writer, "\n}"); +} + static void emitReflectionEntryPointJSON( PrettyWriter& writer, slang::EntryPointReflection* entryPoint) @@ -700,7 +747,6 @@ static void emitReflectionEntryPointJSON( dedent(writer); write(writer, "\n]"); } - if (entryPoint->usesAnySampleRateInput()) { write(writer, ",\n\"usesAnySampleRateInput\": true"); @@ -763,6 +809,22 @@ static void emitReflectionJSON( write(writer, "\n]"); } + auto genParamCount = programReflection->getTypeParameterCount(); + if (genParamCount) + { + write(writer, ",\n\"typeParams\":\n"); + write(writer, "[\n"); + indent(writer); + for (auto ee : range(genParamCount)) + { + if (ee != 0) write(writer, ",\n"); + + auto typeParam = programReflection->getTypeParameterByIndex(ee); + emitReflectionTypeParamJSON(writer, typeParam); + } + dedent(writer); + write(writer, "\n]"); + } dedent(writer); write(writer, "\n}\n"); } -- cgit v1.2.3