List<ShaderLibFile> CompileShaderSource(Spire::Compiler::CompileResult & compileResult, const CoreLib::String & src, Spire::Compiler::CompileOptions & options) { Spire::Compiler::NamingCounter = 0; RefPtr<ShaderCompiler> compiler = CreateShaderCompiler(); List<CompileUnit> units; HashSet<String> processedUnits; List<String> unitsToInclude; unitsToInclude.Add(L""); processedUnits.Add(L""); auto predefUnit = compiler->Parse(compileResult, LibIncludeString, L"stdlib"); for (int i = 0; i < unitsToInclude.Count(); i++) { auto inputFileName = unitsToInclude[i]; try { String source = src; if (i > 0) source = File::ReadAllText(inputFileName); auto unit = compiler->Parse(compileResult, source, Path::GetFileName(inputFileName)); units.Add(unit); if (unit.SyntaxNode) { for (auto inc : unit.SyntaxNode->Usings) { String includeFile = Path::Combine(Path::GetDirectoryName(inputFileName), inc.Content); if (processedUnits.Add(includeFile)) { unitsToInclude.Add(includeFile); } } } } catch (IOException) { compileResult.GetErrorWriter()->Error(1, L"cannot open file '" + Path::GetFileName(inputFileName) + L"'.", CodePosition(0, 0, L"")); } } units.Add(predefUnit); return CompileUnits(compileResult, compiler.Ptr(), units, options); }
IShaderCompiler * Device::NewShaderCompiler() { return CreateShaderCompiler(EShaderLang::GLSL); }