147 bool compile_failed =
false;
148 bool link_failed =
false;
155 std::vector<glslang::TShader> shaders;
156 glslang::TProgram program;
157 EShMessages messages = EShMsgDefault;
158 SetMessageOptions ( messages );
162 shaders.reserve ( mShaderCompilationUnits.size() );
163 for (
size_t i = 0; i < mShaderCompilationUnits.size(); ++i )
165 if ( !mShaderCompilationUnits[i] )
169 shaders.emplace_back (
static_cast<EShLanguage
> ( i ) );
170 std::array<const char*, 1> source{ {mShaderCompilationUnits[i]} };
171 auto stage_name = glslang::StageName (
static_cast<EShLanguage
> ( i ) );
172 shaders.back().setStringsWithLengthsAndNames ( source.data(),
nullptr, &stage_name, 1 );
173 shaders.back().setShiftSamplerBinding ( mBaseSamplerBinding[i] );
174 shaders.back().setShiftTextureBinding ( mBaseTextureBinding[i] );
175 shaders.back().setShiftImageBinding ( mBaseImageBinding[i] );
176 shaders.back().setShiftUboBinding ( mBaseUboBinding[i] );
178 shaders.back().setFlattenUniformArrays ( ( mOptions & EOptionFlattenUniformArrays ) != 0 );
180 shaders.back().setNoStorageFormat ( ( mOptions & EOptionNoStorageFormat ) != 0 );
181 if ( mOptions & EOptionAutoMapBindings )
183 shaders.back().setAutoMapBindings (
true );
185 const int defaultVersion = mOptions & EOptionDefaultDesktop ? 110 : 100;
186 glslang::DefaultTBuiltInResource.maxDrawBuffers =
true;
187 if ( !shaders.back().parse ( &glslang::DefaultTBuiltInResource, defaultVersion,
false, messages ) )
189 compile_failed =
true;
196 for (
auto& i : shaders )
198 program.addShader ( &i );
205 if ( ( ! ( mOptions & EOptionOutputPreprocessed ) && !program.link ( messages ) ) ||
206 ( ( mOptions & EOptionSpv ) && ( !program.mapIO() ) ) )
212 if ( mOptions & EOptionDumpReflection )
214 program.buildReflection();
215 program.dumpReflection();
219 if ( mOptions & EOptionSpv )
221 if ( compile_failed || link_failed )
223 for (
auto& i : shaders )
225 mLog.append ( i.getInfoLog() );
226 mLog.append ( i.getInfoDebugLog() );
228 mLog.append ( program.getInfoLog() );
229 mLog.append ( program.getInfoDebugLog() );
233 for (
int stage = 0; stage < EShLangCount; ++stage )
235 if ( program.getIntermediate ( ( EShLanguage ) stage ) )
237 mSpirV[stage].clear();
238 std::string warningsErrors;
239 spv::SpvBuildLogger logger;
240 glslang::GlslangToSpv ( *program.getIntermediate ( ( EShLanguage ) stage ), mSpirV[stage], &logger );
245 if ( compile_failed )
249 else if ( link_failed )