@@ -111,6 +111,7 @@ namespace nbl::system::json {
111111 { " shaderStage" , shaderStage },
112112 { " spirvVersion" , spirvVersion },
113113 { " optimizerPasses" , p.optimizerPasses },
114+ { " optimizerIsExtraPasses" , p.optimizerIsExtraPasses },
114115 { " debugFlags" , debugFlags },
115116 { " preprocessorArgs" , p.preprocessorArgs },
116117 };
@@ -122,6 +123,7 @@ namespace nbl::system::json {
122123 j.at (" shaderStage" ).get_to (shaderStage);
123124 j.at (" spirvVersion" ).get_to (spirvVersion);
124125 j.at (" optimizerPasses" ).get_to (p.optimizerPasses );
126+ j.at (" optimizerIsExtraPasses" ).get_to (p.optimizerIsExtraPasses );
125127 j.at (" debugFlags" ).get_to (debugFlags);
126128 j.at (" preprocessorArgs" ).get_to (p.preprocessorArgs );
127129 p.stage = static_cast <IShader::E_SHADER_STAGE>(shaderStage);
@@ -502,6 +504,43 @@ core::smart_refctd_ptr<IShader> nbl::asset::IShaderCompiler::compileToSPIRV(cons
502504 return IShaderCompiler::writeDepfile (params, dependencies, options.preprocessorOptions .includeFinder , options.preprocessorOptions .logger );
503505 };
504506
507+ auto saveToFile = [&](const std::string& filePath, const void * buffer, size_t size, const char * loggerName)
508+ {
509+ core::smart_refctd_ptr<system::IFile> saveFile;
510+
511+ system::ISystem::future_t <core::smart_refctd_ptr<system::IFile>> future;
512+ // Ensure it doesn't exist
513+ m_system->deleteFile (filePath + " _temp" );
514+ m_system->createFile (future, filePath + " _temp" , system::IFile::ECF_WRITE);
515+ if (future.wait ())
516+ {
517+ future.acquire ().move_into (saveFile);
518+ if (saveFile)
519+ {
520+ system::IFile::success_t succ;
521+ saveFile->write (succ, buffer, 0 , size);
522+ if (!succ)
523+ {
524+ options.preprocessorOptions .logger .log (std::string (" Failed Writing To Temp " ) + loggerName + " File." , nbl::system::ILogger::ELL_ERROR);
525+ return ;
526+ }
527+ saveFile = nullptr ; // drop handle first
528+ m_system->deleteFile (filePath);
529+ auto renameResult = m_system->moveFileOrDirectory (filePath + " _temp" , filePath);
530+ if (renameResult)
531+ {
532+ options.preprocessorOptions .logger .log (std::string (" Failed Saving " ) + loggerName + " File. Check it's not open." , nbl::system::ILogger::ELL_ERROR);
533+ // Clean up
534+ m_system->deleteFile (filePath + " _temp" );
535+ }
536+ }
537+ else
538+ options.preprocessorOptions .logger .log (std::string (" Failed Creating " ) + loggerName + " File." , nbl::system::ILogger::ELL_ERROR);
539+ }
540+ else
541+ options.preprocessorOptions .logger .log (std::string (" Failed Creating " ) + loggerName + " File." , nbl::system::ILogger::ELL_ERROR);
542+ };
543+
505544 CCache::SEntry entry;
506545 if (options.readCache || options.writeCache )
507546 entry = CCache::SEntry (code, options);
@@ -519,6 +558,22 @@ core::smart_refctd_ptr<IShader> nbl::asset::IShaderCompiler::compileToSPIRV(cons
519558 auto shader = found->decompressShader ();
520559 if (depfileEnabled && !writeDepfileFromDependencies (found->dependencies ))
521560 return nullptr ;
561+ if (!options.spvOutputPath .empty ())
562+ saveToFile (options.spvOutputPath , shader->getContent ()->getPointer (), shader->getContent ()->getSize (), " SPIR-V" );
563+ // Entry doesn't store preprocessed shader, so preprocess it
564+ if (!options.preprocessedOutputPath .empty ())
565+ {
566+ // copy shader contents
567+ std::string shaderContents = found->mainFileContents ;
568+ auto stage = options.stage ;
569+ // Create a copy, cache hit means dependencies haven't changed but there is no function that takes a const pointer. This is meant for debug anyway.
570+ auto deps = found->dependencies ;
571+ auto preprocessedShader = preprocessShader (std::move (shaderContents), stage, options.preprocessorOptions , &deps);
572+ if (preprocessedShader.empty ())
573+ options.preprocessorOptions .logger .log (" Failed to preprocess shader for output." , nbl::system::ILogger::ELL_ERROR);
574+ else
575+ saveToFile (options.preprocessedOutputPath , preprocessedShader.data (), preprocessedShader.size (), " Preprocessed Shader" );
576+ }
522577 return shader;
523578 }
524579 }
0 commit comments