diff options
Diffstat (limited to 'source/slang')
| -rw-r--r-- | source/slang/slang-compiler-options.cpp | 35 | ||||
| -rw-r--r-- | source/slang/slang-compiler-options.h | 7 | ||||
| -rw-r--r-- | source/slang/slang-options.cpp | 15 |
3 files changed, 48 insertions, 9 deletions
diff --git a/source/slang/slang-compiler-options.cpp b/source/slang/slang-compiler-options.cpp index c01d3fb9c..4350bcf0d 100644 --- a/source/slang/slang-compiler-options.cpp +++ b/source/slang/slang-compiler-options.cpp @@ -18,6 +18,22 @@ void CompilerOptionSet::load(uint32_t count, slang::CompilerOptionEntry* entries value.stringValue2 = entries[i].value.stringValue1; } add(entries[i].name, value); + + // When we see option EmitSpirvDirectly or EmitSpirvViaGLSL, we will need to + // translate them to EmitSpirvMethod. + if (entries[i].name == slang::CompilerOptionName::EmitSpirvDirectly && value.intValue) + { + set(slang::CompilerOptionName::EmitSpirvMethod, SLANG_EMIT_SPIRV_DIRECTLY); + } + else if (entries[i].name == slang::CompilerOptionName::EmitSpirvViaGLSL && value.intValue) + { + SlangEmitSpirvMethod current = + getEnumOption<SlangEmitSpirvMethod>(slang::CompilerOptionName::EmitSpirvMethod); + if (current != SLANG_EMIT_SPIRV_DEFAULT) + { + set(CompilerOptionName::EmitSpirvMethod, SLANG_EMIT_SPIRV_VIA_GLSL); + } + } } } @@ -181,10 +197,10 @@ SlangTargetFlags CompilerOptionSet::getTargetFlags() result |= SLANG_TARGET_FLAG_DUMP_IR; if (getBoolOption(CompilerOptionName::GenerateWholeProgram)) result |= SLANG_TARGET_FLAG_GENERATE_WHOLE_PROGRAM; - if (!getBoolOption(CompilerOptionName::EmitSpirvViaGLSL)) - result |= SLANG_TARGET_FLAG_GENERATE_SPIRV_DIRECTLY; if (getBoolOption(CompilerOptionName::ParameterBlocksUseRegisterSpaces)) result |= SLANG_TARGET_FLAG_PARAMETER_BLOCKS_USE_REGISTER_SPACES; + if (shouldEmitSPIRVDirectly()) + result |= SLANG_TARGET_FLAG_GENERATE_SPIRV_DIRECTLY; return result; } @@ -193,10 +209,19 @@ void CompilerOptionSet::setTargetFlags(SlangTargetFlags flags) set(CompilerOptionName::DumpIr, (flags & SLANG_TARGET_FLAG_DUMP_IR) != 0); set(CompilerOptionName::GenerateWholeProgram, (flags & SLANG_TARGET_FLAG_GENERATE_WHOLE_PROGRAM) != 0); + if ((flags & SLANG_TARGET_FLAG_GENERATE_SPIRV_DIRECTLY) != 0) - set(CompilerOptionName::EmitSpirvViaGLSL, false); + set(CompilerOptionName::EmitSpirvMethod, SLANG_EMIT_SPIRV_DIRECTLY); else - set(CompilerOptionName::EmitSpirvViaGLSL, true); + { + // We allow to set this flag only when users are not setting the + // the spirv emit method via CompilerOptionName. + SlangEmitSpirvMethod current = + getEnumOption<SlangEmitSpirvMethod>(CompilerOptionName::EmitSpirvMethod); + if (current != SLANG_EMIT_SPIRV_DIRECTLY) + set(CompilerOptionName::EmitSpirvMethod, SLANG_EMIT_SPIRV_VIA_GLSL); + } + set(CompilerOptionName::ParameterBlocksUseRegisterSpaces, (flags & SLANG_TARGET_FLAG_PARAMETER_BLOCKS_USE_REGISTER_SPACES) != 0); } @@ -210,7 +235,7 @@ void CompilerOptionSet::addTargetFlags(SlangTargetFlags flags) set(CompilerOptionName::GenerateWholeProgram, true); if ((flags & SLANG_TARGET_FLAG_GENERATE_SPIRV_DIRECTLY) != 0) - set(CompilerOptionName::EmitSpirvDirectly, true); + set(CompilerOptionName::EmitSpirvMethod, SLANG_EMIT_SPIRV_DIRECTLY); if ((flags & SLANG_TARGET_FLAG_PARAMETER_BLOCKS_USE_REGISTER_SPACES) != 0) set(CompilerOptionName::ParameterBlocksUseRegisterSpaces, true); diff --git a/source/slang/slang-compiler-options.h b/source/slang/slang-compiler-options.h index 3c1c76816..c28bbe83d 100644 --- a/source/slang/slang-compiler-options.h +++ b/source/slang/slang-compiler-options.h @@ -334,9 +334,10 @@ struct CompilerOptionSet bool shouldEmitSPIRVDirectly() { - if (getBoolOption(CompilerOptionName::EmitSpirvViaGLSL)) - return false; - return true; + SlangEmitSpirvMethod emitSpvMethod = + getEnumOption<SlangEmitSpirvMethod>(CompilerOptionName::EmitSpirvMethod); + + return (emitSpvMethod != SlangEmitSpirvMethod::SLANG_EMIT_SPIRV_VIA_GLSL); } bool shouldUseScalarLayout() diff --git a/source/slang/slang-options.cpp b/source/slang/slang-options.cpp index 969ce4143..bc83afe65 100644 --- a/source/slang/slang-options.cpp +++ b/source/slang/slang-options.cpp @@ -2728,7 +2728,20 @@ SlangResult OptionsParser::_parse(int argc, char const* const* argv) case OptionKind::EmitSpirvViaGLSL: case OptionKind::EmitSpirvDirectly: { - getCurrentTarget()->optionSet.add(optionKind, true); + SlangEmitSpirvMethod selectMethod = (optionKind == OptionKind::EmitSpirvViaGLSL) + ? SLANG_EMIT_SPIRV_VIA_GLSL + : SLANG_EMIT_SPIRV_DIRECTLY; + + SlangEmitSpirvMethod currentMethod = + getCurrentTarget()->optionSet.getEnumOption<SlangEmitSpirvMethod>( + OptionKind::EmitSpirvMethod); + // When both flag turns on, spirv-direcly mode will always take higher priority. + // By default (value 0), spirv-via-glsl mode is used, and any input flag can + // override the default value. + if (selectMethod > currentMethod) + { + getCurrentTarget()->optionSet.set(OptionKind::EmitSpirvMethod, selectMethod); + } } break; case OptionKind::SPIRVCoreGrammarJSON: |
