diff options
Diffstat (limited to 'tools/render-test/options.cpp')
| -rw-r--r-- | tools/render-test/options.cpp | 213 |
1 files changed, 84 insertions, 129 deletions
diff --git a/tools/render-test/options.cpp b/tools/render-test/options.cpp index dcf0b77b1..5d3560351 100644 --- a/tools/render-test/options.cpp +++ b/tools/render-test/options.cpp @@ -15,6 +15,10 @@ #include "../../source/core/slang-type-text-util.h" +#include "../../source/compiler-core/slang-command-line-args.h" + +#include "diagnostics.h" + namespace renderer_test { using namespace Slang; @@ -34,173 +38,135 @@ static gfx::DeviceType _toRenderType(Slang::RenderApiType apiType) } } -static SlangResult _setRendererType(DeviceType type, const char* arg, Slang::WriterHelper stdError, Options& ioOptions) -{ - if (ioOptions.deviceType != DeviceType::Unknown) - { - stdError.print("Already has renderer option set. Found '%s'\n", arg); - return SLANG_FAIL; - } - ioOptions.deviceType = type; - return SLANG_OK; -} - /* static */SlangResult Options::parse(int argc, const char*const* argv, Slang::WriterHelper stdError, Options& outOptions) { using namespace Slang; + RefPtr<CommandLineContext> cmdLineContext(new CommandLineContext); + + DiagnosticSink sink(cmdLineContext->getSourceManager(), nullptr); + sink.writer = stdError.getWriter(); + sink.setFlag(DiagnosticSink::Flag::SourceLocationLine); + outOptions = Options(); - List<const char*> positionalArgs; + CommandLineArgs args(cmdLineContext); - typedef Options::ShaderProgramType ShaderProgramType; - typedef Options::InputLanguageID InputLanguageID; + if (argc > 0) + { + // first argument is the application name + outOptions.appName = argv[0]; + args.setArgs(argv + 1, argc - 1); + } + else + { + args.setArgs(argv, argc); + } - //int argCount = argc; + SLANG_RETURN_ON_FAIL(outOptions.downstreamArgs.stripDownstreamArgs(args, 0, &sink)); - char const* const* argCursor = argv; - char const* const* argEnd = argCursor + argc; + CommandLineReader reader(&args, &sink); - // first argument is the application name - if( argCursor != argEnd ) - { - outOptions.appName = *argCursor++; - } + List<CommandLineArg> positionalArgs; + + typedef Options::ShaderProgramType ShaderProgramType; + typedef Options::InputLanguageID InputLanguageID; // now iterate over arguments to collect options - while(argCursor != argEnd) + while (reader.hasArg()) { - char const* arg = *argCursor++; - if( arg[0] != '-' ) + CommandLineArg arg = reader.getArgAndAdvance(); + const auto& argValue = arg.value; + + if(!argValue.startsWith("-")) { positionalArgs.add(arg); continue; } - if( strcmp(arg, "--") == 0 ) + if (argValue == "--") { - while(argCursor != argEnd) + while (reader.hasArg()) { - positionalArgs.add(*argCursor++); + positionalArgs.add(reader.getArgAndAdvance()); } break; } - else if( strcmp(arg, "-o") == 0 ) + else if(argValue == "-o") { - if( argCursor == argEnd ) - { - stdError.print("expected argument for '%s' option\n", arg); - return SLANG_FAIL; - } - outOptions.outputPath = *argCursor++; + SLANG_RETURN_ON_FAIL(reader.expectArg(outOptions.outputPath)); } - else if (strcmp(arg, "-profile") == 0) + else if (argValue == "-profile") { - if (argCursor == argEnd) - { - stdError.print("expected argument for '%s' option\n", arg); - return SLANG_FAIL; - } - outOptions.profileName = *argCursor++; + SLANG_RETURN_ON_FAIL(reader.expectArg(outOptions.profileName)); } - else if (strcmp(arg, "-render-features") == 0 || strcmp(arg, "-render-feature") == 0) + else if (argValue == "-render-features" || argValue == "-render-feature") { - if (argCursor == argEnd) - { - stdError.print("expected argument for '%s' option\n", arg); - return SLANG_FAIL; - } - const char* value = *argCursor++; + String features; + SLANG_RETURN_ON_FAIL(reader.expectArg(features)); List<UnownedStringSlice> values; - StringUtil::split(UnownedStringSlice(value), ',', values); + StringUtil::split(features.getUnownedSlice(), ',', values); for (const auto& value : values) { outOptions.renderFeatures.add(value); } } - else if( strcmp(arg, "-xslang") == 0 ) + else if( argValue == "-xslang" || argValue == "-compile-arg") { + // This is legacy support, should use -Xslang now // This is an option that we want to pass along to Slang - - if( argCursor == argEnd ) - { - stdError.print("expected argument for '%s' option\n", arg); - return SLANG_FAIL; - } - if( outOptions.slangArgCount == Options::kMaxSlangArgs ) - { - stdError.print("maximum number of '%s' options exceeded (%d)\n", arg, Options::kMaxSlangArgs); - return SLANG_FAIL; - } - outOptions.slangArgs[outOptions.slangArgCount++] = *argCursor++; + CommandLineArg slangArg; + SLANG_RETURN_ON_FAIL(reader.expectArg(slangArg)); + outOptions.downstreamArgs.getArgsByName("slang").add(slangArg); } - else if (strcmp(arg, "-compute") == 0) + else if (argValue == "-compute") { outOptions.shaderType = ShaderProgramType::Compute; } - else if (strcmp(arg, "-graphics") == 0) + else if (argValue == "-graphics") { outOptions.shaderType = ShaderProgramType::Graphics; } - else if (strcmp(arg, "-gcompute") == 0) + else if (argValue == "-gcompute") { outOptions.shaderType = ShaderProgramType::GraphicsCompute; } - else if (strcmp(arg, "-rt") == 0) + else if (argValue == "-rt") { outOptions.shaderType = ShaderProgramType::RayTracing; } - else if( strcmp(arg, "-use-dxil") == 0 ) + else if(argValue == "-use-dxil") { outOptions.useDXIL = true; } - else if (strcmp(arg, "-only-startup") == 0) + else if (argValue == "-only-startup") { outOptions.onlyStartup = true; } - else if (strcmp(arg, "-compile-arg") == 0) - { - if (argCursor == argEnd) - { - stdError.print("expected argument for '%s' option\n", arg); - return SLANG_FAIL; - } - - const char* compileArg = *argCursor++; - outOptions.compileArgs.add(compileArg); - } - else if (strcmp(arg, "-performance-profile") == 0) + else if (argValue == "-performance-profile") { outOptions.performanceProfile = true; } - else if (strcmp(arg, "-adapter") == 0) + else if (argValue == "-adapter") { - if (argCursor == argEnd) - { - stdError.print("expected argument for '%s' option\n", arg); - return SLANG_FAIL; - } - - outOptions.adapter = *argCursor++; + SLANG_RETURN_ON_FAIL(reader.expectArg(outOptions.adapter)); } - else if (strcmp(arg, "-output-using-type") == 0) + else if (argValue == "-output-using-type") { outOptions.outputUsingType = true; } - else if (strcmp(arg, "-compute-dispatch") == 0) + else if (argValue == "-compute-dispatch") { - if (argCursor == argEnd) - { - stdError.print("error: expecting a comma separated compute dispatch size for '%s'\n", arg); - return SLANG_FAIL; - } + CommandLineArg dispatchSize; + SLANG_RETURN_ON_FAIL(reader.expectArg(dispatchSize)); + List<UnownedStringSlice> slices; - StringUtil::split(UnownedStringSlice(*argCursor++), ',', slices); + StringUtil::split(dispatchSize.value.getUnownedSlice(), ',', slices); if (slices.getCount() != 3) { - stdError.print("error: expected 3 comma separated integers for compute dispatch size for '%s'\n", arg); + sink.diagnose(dispatchSize.loc, RenderTestDiagnostics::expectingCommaComputeDispatch); return SLANG_FAIL; } @@ -211,45 +177,35 @@ static SlangResult _setRendererType(DeviceType type, const char* arg, Slang::Wri int v = StringToInt(string); if (v < 1) { - stdError.print("error: expected 3 comma positive integers for compute dispatch size for '%s'\n", arg); + sink.diagnose(dispatchSize.loc, RenderTestDiagnostics::expectingPositiveComputeDispatch); return SLANG_FAIL; } outOptions.computeDispatchSize[i] = v; } } - else if (strcmp(arg, "-source-language") == 0) + else if (argValue == "-source-language") { - if (argCursor == argEnd) - { - stdError.print("error: expecting a source language name for '%s'\n", arg); - return SLANG_FAIL; - } - UnownedStringSlice sourceLanguageText(*argCursor++); - - SlangSourceLanguage sourceLanguage = TypeTextUtil::findSourceLanguage(sourceLanguageText); + CommandLineArg sourceLanguageName; + SLANG_RETURN_ON_FAIL(reader.expectArg(sourceLanguageName)); + + const SlangSourceLanguage sourceLanguage = TypeTextUtil::findSourceLanguage(sourceLanguageName.value.getUnownedSlice()); if (sourceLanguage == SLANG_SOURCE_LANGUAGE_UNKNOWN) { - stdError.print("error: expecting unknown source language name '%s' for '%s'\n", String(sourceLanguageText).getBuffer(), arg); + sink.diagnose(sourceLanguageName.loc, RenderTestDiagnostics::unknownSourceLanguage); return SLANG_FAIL; } outOptions.sourceLanguage = sourceLanguage; } - else if( strcmp(arg, "-no-default-entry-point") == 0 ) + else if(argValue == "-no-default-entry-point") { outOptions.dontAddDefaultEntryPoints = true; } - else if (strcmp(arg, "-nvapi-slot") == 0) + else if (argValue == "-nvapi-slot") { - if (argCursor == argEnd) - { - stdError.print("error: expecting a register name for '%s'\n", arg); - return SLANG_FAIL; - } - - outOptions.nvapiExtnSlot = (*argCursor++); + SLANG_RETURN_ON_FAIL(reader.expectArg(outOptions.nvapiExtnSlot)); } - else if (strcmp(arg, "-shaderobj") == 0) + else if (argValue == "-shaderobj") { // Note: We ignore this option because it is always enabled now. // @@ -258,11 +214,11 @@ static SlangResult _setRendererType(DeviceType type, const char* arg, Slang::Wri else { // Lookup - Slang::UnownedStringSlice argSlice(arg); + Slang::UnownedStringSlice argSlice = arg.value.getUnownedSlice(); if (argSlice.getLength() && argSlice[0] == '-') { // Look up the rendering API if set - UnownedStringSlice argName = UnownedStringSlice(argSlice.begin() + 1, argSlice.end()); + UnownedStringSlice argName = argSlice.tail(1); DeviceType deviceType = _toRenderType(RenderApiUtil::findApiTypeByName(argName)); if (deviceType != DeviceType::Unknown) @@ -272,17 +228,16 @@ static SlangResult _setRendererType(DeviceType type, const char* arg, Slang::Wri } // Lookup the target language type - DeviceType languageRenderType = - _toRenderType(RenderApiUtil::findImplicitLanguageRenderApiType(argName)); - if (languageRenderType != DeviceType::Unknown) + DeviceType targetLanguageDeviceType = _toRenderType(RenderApiUtil::findImplicitLanguageRenderApiType(argName)); + + if (targetLanguageDeviceType != DeviceType::Unknown) { - outOptions.targetLanguageDeviceType = languageRenderType; + outOptions.targetLanguageDeviceType = targetLanguageDeviceType; outOptions.inputLanguageID = (argName == "hlsl" || argName == "glsl" || argName == "cpp" || argName == "cxx" || argName == "c") ? InputLanguageID::Native : InputLanguageID::Slang; continue; } } - - stdError.print("unknown option '%s'\n", arg); + sink.diagnose(arg.loc, RenderTestDiagnostics::unknownCommandLineOption, arg.value); return SLANG_FAIL; } } @@ -295,14 +250,14 @@ static SlangResult _setRendererType(DeviceType type, const char* arg, Slang::Wri // first positional argument is source shader path if(positionalArgs.getCount()) { - outOptions.sourcePath = positionalArgs[0]; + outOptions.sourcePath = positionalArgs[0].value; positionalArgs.removeAt(0); } // any remaining arguments represent an error if(positionalArgs.getCount() != 0) { - stdError.print("unexpected arguments\n"); + sink.diagnose(positionalArgs[0].loc, RenderTestDiagnostics::unexpectedPositionalArg); return SLANG_FAIL; } |
