Skip to content

Commit 0e3b68f

Browse files
authored
Merge pull request #1018 from Devsh-Graphics-Programming/nscFixes
NSC preprocess diagnostics and output fixes
2 parents c640685 + 195330f commit 0e3b68f

10 files changed

Lines changed: 386 additions & 106 deletions

File tree

3rdparty/boost/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ endforeach()
120120
# include will lead to ABI mismatch hence we update the target and let inherit options
121121
target_compile_definitions(boost_wave
122122
PUBLIC BOOST_WAVE_ENABLE_COMMANDLINE_MACROS=1
123-
PUBLIC BOOST_WAVE_SUPPORT_PRAGMA_ONCE=0
123+
PUBLIC BOOST_WAVE_SUPPORT_PRAGMA_ONCE=1
124124
PUBLIC BOOST_WAVE_EMIT_PRAGMA_DIRECTIVES=1
125125
PUBLIC BOOST_WAVE_SERIALIZATION=0
126126
PUBLIC BOOST_WAVE_SUPPORT_INCLUDE_NEXT=0
@@ -131,4 +131,4 @@ target_compile_definitions(boost_wave
131131

132132
set(NBL_BOOST_TARGETS
133133
${NBL_BOOST_TARGETS}
134-
PARENT_SCOPE)
134+
PARENT_SCOPE)

cmake/common.cmake

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1395,6 +1395,24 @@ namespace @IMPL_NAMESPACE@ {
13951395
list(APPEND DEPENDS_ON ${IMPL_DEPENDS})
13961396
endif()
13971397

1398+
function(ERROR_WHILE_PARSING_ITEM)
1399+
string(JSON ITEM GET "${IMPL_INPUTS}" ${INDEX})
1400+
message(FATAL_ERROR
1401+
"While parsing ${IMPL_TARGET}'s NSC compile rule\n${ITEM}\n"
1402+
${ARGV}
1403+
)
1404+
endfunction()
1405+
1406+
set(RULE_MODE compile)
1407+
string(JSON MODE_TYPE ERROR_VARIABLE MODE_ERROR TYPE "${IMPL_INPUTS}" ${INDEX} MODE)
1408+
if(NOT MODE_ERROR)
1409+
if(NOT MODE_TYPE STREQUAL "STRING")
1410+
ERROR_WHILE_PARSING_ITEM("MODE must be a string when present")
1411+
endif()
1412+
string(JSON RULE_MODE GET "${IMPL_INPUTS}" ${INDEX} MODE)
1413+
string(TOLOWER "${RULE_MODE}" RULE_MODE)
1414+
endif()
1415+
13981416
set(HAS_CAPS FALSE)
13991417
set(CAPS_LENGTH 0)
14001418
string(JSON CAPS_TYPE ERROR_VARIABLE ERROR_VAR TYPE "${IMPL_INPUTS}" ${INDEX} CAPS)
@@ -1405,13 +1423,12 @@ namespace @IMPL_NAMESPACE@ {
14051423
endif()
14061424
endif()
14071425

1408-
function(ERROR_WHILE_PARSING_ITEM)
1409-
string(JSON ITEM GET "${IMPL_INPUTS}" ${INDEX})
1410-
message(FATAL_ERROR
1411-
"While parsing ${IMPL_TARGET}'s NSC compile rule\n${ITEM}\n"
1412-
${ARGV}
1413-
)
1414-
endfunction()
1426+
if(NOT RULE_MODE MATCHES "^(compile|preprocess)$")
1427+
ERROR_WHILE_PARSING_ITEM(
1428+
"Invalid MODE \"${RULE_MODE}\"\n"
1429+
"Allowed modes are: compile, preprocess"
1430+
)
1431+
endif()
14151432

14161433
set(CAP_NAMES "")
14171434
set(CAP_TYPES "")
@@ -1498,6 +1515,15 @@ namespace @IMPL_NAMESPACE@ {
14981515

14991516
set_property(TARGET ${IMPL_TARGET} APPEND PROPERTY NBL_CANONICAL_IDENTIFIERS "${NEW_CANONICAL_IDENTIFIER}")
15001517

1518+
set(OUTPUT_EXT ".spv")
1519+
set(OUTPUT_PREFIX "$<CONFIG>/")
1520+
set(OUTPUT_GROUP_BY_CONFIG TRUE)
1521+
set(MODE_ARGS "")
1522+
if(RULE_MODE STREQUAL "preprocess")
1523+
set(OUTPUT_EXT ".preprocessed.hlsl")
1524+
list(APPEND MODE_ARGS -P)
1525+
endif()
1526+
15011527
set(HEADER_ITEM_VIEW [=[
15021528
namespace @IMPL_NAMESPACE@ {
15031529
template<>
@@ -1506,8 +1532,8 @@ namespace @IMPL_NAMESPACE@ {
15061532
{
15071533
nbl::core::string retval = "@BASE_KEY@";
15081534
@RETVAL_EVAL@
1509-
retval += ".spv";
1510-
return "$<CONFIG>/" + retval;
1535+
retval += "@OUTPUT_EXT@";
1536+
return "@OUTPUT_PREFIX@" + retval;
15111537
}
15121538
}
15131539
@@ -1532,27 +1558,29 @@ namespace @IMPL_NAMESPACE@ {
15321558
function(GENERATE_KEYS PREFIX CAP_INDEX CAPS_EVAL_PART)
15331559
if(NUM_CAPS EQUAL 0 OR CAP_INDEX EQUAL ${NUM_CAPS})
15341560
# generate .config file
1535-
set(FINAL_KEY "${BASE_KEY}${PREFIX}.spv") # always add ext even if its already there to make sure asset loader always is able to load as IShader
1561+
set(FINAL_KEY "${BASE_KEY}${PREFIX}${OUTPUT_EXT}")
15361562
set(CONFIG_FILE_TARGET_OUTPUT "${IMPL_BINARY_DIR}/${FINAL_KEY}")
15371563
set(CONFIG_FILE "${CONFIG_FILE_TARGET_OUTPUT}.config")
15381564
set(CAPS_EVAL "${CAPS_EVAL_PART}")
15391565
string(CONFIGURE "${DEVICE_CONFIG_VIEW}" CONFIG_CONTENT @ONLY)
15401566
file(WRITE "${CONFIG_FILE}" "${CONFIG_CONTENT}")
15411567

15421568
# generate keys and commands for compiling shaders
1543-
set(FINAL_KEY_REL_PATH "$<CONFIG>/${FINAL_KEY}")
1569+
set(FINAL_KEY_REL_PATH "${OUTPUT_PREFIX}${FINAL_KEY}")
15441570
set(TARGET_OUTPUT "${IMPL_BINARY_DIR}/${FINAL_KEY_REL_PATH}")
15451571
set(DEPFILE_PATH "${TARGET_OUTPUT}.d")
15461572
set(NBL_NSC_LOG_PATH "${TARGET_OUTPUT}.log")
15471573

15481574
set(NBL_NSC_DEPFILE_ARGS "")
1549-
if(NSC_USE_DEPFILE)
1575+
set(NBL_NSC_RULE_USE_DEPFILE ${NSC_USE_DEPFILE})
1576+
if(NBL_NSC_RULE_USE_DEPFILE)
15501577
set(NBL_NSC_DEPFILE_ARGS -MD -MF "${DEPFILE_PATH}")
15511578
endif()
15521579

15531580
set(NBL_NSC_COMPILE_COMMAND
15541581
"$<TARGET_FILE:Nabla::nsc>"
15551582
${NBL_NSC_EXTRA_ARGS}
1583+
${MODE_ARGS}
15561584
-Fc "${TARGET_OUTPUT}"
15571585
${COMPILE_OPTIONS} ${REQUIRED_OPTIONS} ${IMPL_COMMON_OPTIONS}
15581586
${NBL_NSC_DEPFILE_ARGS}
@@ -1562,7 +1590,7 @@ namespace @IMPL_NAMESPACE@ {
15621590
get_filename_component(NBL_NSC_INPUT_NAME "${TARGET_INPUT}" NAME)
15631591
get_filename_component(NBL_NSC_CONFIG_NAME "${CONFIG_FILE}" NAME)
15641592
set(NBL_NSC_BYPRODUCTS "${NBL_NSC_LOG_PATH}")
1565-
if(NSC_USE_DEPFILE)
1593+
if(NBL_NSC_RULE_USE_DEPFILE)
15661594
list(APPEND NBL_NSC_BYPRODUCTS "${DEPFILE_PATH}")
15671595
endif()
15681596

@@ -1582,12 +1610,12 @@ namespace @IMPL_NAMESPACE@ {
15821610
VERBATIM
15831611
COMMAND_EXPAND_LISTS
15841612
)
1585-
if(NSC_USE_DEPFILE)
1613+
if(NBL_NSC_RULE_USE_DEPFILE)
15861614
list(APPEND NBL_NSC_CUSTOM_COMMAND_ARGS DEPFILE "${DEPFILE_PATH}")
15871615
endif()
15881616
add_custom_command(${NBL_NSC_CUSTOM_COMMAND_ARGS})
15891617
set(NBL_NSC_OUT_FILES "${TARGET_OUTPUT}" "${NBL_NSC_LOG_PATH}")
1590-
if(NSC_USE_DEPFILE)
1618+
if(NBL_NSC_RULE_USE_DEPFILE)
15911619
list(APPEND NBL_NSC_OUT_FILES "${DEPFILE_PATH}")
15921620
endif()
15931621

@@ -1600,19 +1628,19 @@ namespace @IMPL_NAMESPACE@ {
16001628
HEADER_FILE_ONLY ON
16011629
VS_TOOL_OVERRIDE None
16021630
)
1603-
if(CMAKE_CONFIGURATION_TYPES)
1631+
if(CMAKE_CONFIGURATION_TYPES AND OUTPUT_GROUP_BY_CONFIG)
16041632
foreach(_CFG IN LISTS CMAKE_CONFIGURATION_TYPES)
16051633
set(TARGET_OUTPUT_IDE "${IMPL_BINARY_DIR}/${_CFG}/${FINAL_KEY}")
16061634
set(NBL_NSC_OUT_FILES_IDE "${TARGET_OUTPUT_IDE}" "${TARGET_OUTPUT_IDE}.log")
1607-
if(NSC_USE_DEPFILE)
1635+
if(NBL_NSC_RULE_USE_DEPFILE)
16081636
list(APPEND NBL_NSC_OUT_FILES_IDE "${TARGET_OUTPUT_IDE}.d")
16091637
endif()
16101638
source_group("${OUT}/${_CFG}" FILES ${NBL_NSC_OUT_FILES_IDE})
16111639
endforeach()
16121640
else()
16131641
set(TARGET_OUTPUT_IDE "${IMPL_BINARY_DIR}/${FINAL_KEY}")
16141642
set(NBL_NSC_OUT_FILES_IDE "${TARGET_OUTPUT_IDE}" "${TARGET_OUTPUT_IDE}.log")
1615-
if(NSC_USE_DEPFILE)
1643+
if(NBL_NSC_RULE_USE_DEPFILE)
16161644
list(APPEND NBL_NSC_OUT_FILES_IDE "${TARGET_OUTPUT_IDE}.d")
16171645
endif()
16181646
source_group("${OUT}" FILES ${NBL_NSC_OUT_FILES_IDE})

include/nbl/asset/utils/CHLSLCompiler.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,4 +155,4 @@ class NBL_API2 CHLSLCompiler final : public IShaderCompiler
155155

156156
#endif
157157

158-
#endif
158+
#endif

include/nbl/system/ISystem.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ class NBL_API2 ISystem : public core::IReferenceCounted
143143

144144
void unmountBuiltins();
145145
bool areBuiltinsMounted() const;
146+
size_t getMountedBuiltinArchiveCount() const;
147+
inline size_t getMountedArchiveCount() const { return m_cachedArchiveFiles.getSize(); }
146148

147149
//
148150
struct SystemInfo
@@ -205,8 +207,16 @@ class NBL_API2 ISystem : public core::IReferenceCounted
205207
//! The key is file extension
206208
core::CMultiObjectCache<std::string,core::smart_refctd_ptr<IArchiveLoader>,std::vector> perFileExt;
207209
} m_loaders;
210+
struct SBuiltinMount
211+
{
212+
core::smart_refctd_ptr<IFileArchive> archive;
213+
system::path pathAlias;
214+
};
215+
void mountBuiltin(core::smart_refctd_ptr<IFileArchive>&& archive, const system::path& pathAlias = "");
216+
bool isBuiltinMounted(const SBuiltinMount& mount) const;
208217
//
209218
core::CMultiObjectCache<system::path,core::smart_refctd_ptr<IFileArchive>> m_cachedArchiveFiles;
219+
core::vector<SBuiltinMount> m_builtinMounts;
210220

211221
private:
212222
struct SRequestParams_NOOP

src/nbl/asset/utils/CHLSLCompiler.cpp

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,13 @@ namespace nbl::wave
363363
extern nbl::core::string preprocess(std::string& code, const IShaderCompiler::SPreprocessorOptions& preprocessOptions, bool withCaching, std::function<void(nbl::wave::context&)> post);
364364
}
365365

366-
std::string CHLSLCompiler::preprocessShader(std::string&& code, IShader::E_SHADER_STAGE& stage, const SPreprocessorOptions& preprocessOptions, std::vector<std::string>& dxc_compile_flags_override, std::vector<CCache::SEntry::SPreprocessingDependency>* dependencies) const
366+
static std::string preprocessShaderImpl(
367+
std::string&& code,
368+
IShader::E_SHADER_STAGE& stage,
369+
const CHLSLCompiler::SPreprocessorOptions& preprocessOptions,
370+
std::vector<std::string>& dxc_compile_flags_override,
371+
std::vector<IShaderCompiler::CCache::SEntry::SPreprocessingDependency>* dependencies,
372+
system::ISystem* system)
367373
{
368374
const bool depfileEnabled = preprocessOptions.depfile;
369375
if (depfileEnabled)
@@ -375,7 +381,7 @@ std::string CHLSLCompiler::preprocessShader(std::string&& code, IShader::E_SHADE
375381
}
376382
}
377383

378-
std::vector<CCache::SEntry::SPreprocessingDependency> localDependencies;
384+
std::vector<IShaderCompiler::CCache::SEntry::SPreprocessingDependency> localDependencies;
379385
auto* dependenciesOut = dependencies;
380386
if (depfileEnabled && !dependenciesOut)
381387
dependenciesOut = &localDependencies;
@@ -409,19 +415,6 @@ std::string CHLSLCompiler::preprocessShader(std::string&& code, IShader::E_SHADE
409415
}
410416
);
411417

412-
// for debugging cause MSVC doesn't like to show more than 21k LoC in TextVisualizer
413-
if constexpr (false)
414-
{
415-
system::ISystem::future_t<core::smart_refctd_ptr<system::IFile>> future;
416-
m_system->createFile(future,system::path(preprocessOptions.sourceIdentifier).parent_path()/"preprocessed.hlsl",system::IFileBase::ECF_WRITE);
417-
if (auto file=future.acquire(); file&&bool(*file))
418-
{
419-
system::IFile::success_t succ;
420-
(*file)->write(succ,resolvedString.data(),0,resolvedString.size()+1);
421-
succ.getBytesProcessed(true);
422-
}
423-
}
424-
425418
if (resolvedString.empty())
426419
return resolvedString;
427420

@@ -433,14 +426,19 @@ std::string CHLSLCompiler::preprocessShader(std::string&& code, IShader::E_SHADE
433426
params.sourceIdentifier = preprocessOptions.sourceIdentifier;
434427
if (!params.sourceIdentifier.empty())
435428
params.workingDirectory = std::filesystem::path(std::string(params.sourceIdentifier)).parent_path();
436-
params.system = m_system.get();
429+
params.system = system;
437430
if (!IShaderCompiler::writeDepfile(params, *dependenciesOut, preprocessOptions.includeFinder, preprocessOptions.logger))
438431
return {};
439432
}
440433

441434
return resolvedString;
442435
}
443436

437+
std::string CHLSLCompiler::preprocessShader(std::string&& code, IShader::E_SHADER_STAGE& stage, const SPreprocessorOptions& preprocessOptions, std::vector<std::string>& dxc_compile_flags_override, std::vector<CCache::SEntry::SPreprocessingDependency>* dependencies) const
438+
{
439+
return preprocessShaderImpl(std::move(code), stage, preprocessOptions, dxc_compile_flags_override, dependencies, m_system.get());
440+
}
441+
444442
std::string CHLSLCompiler::preprocessShader(std::string&& code, IShader::E_SHADER_STAGE& stage, const SPreprocessorOptions& preprocessOptions, std::vector<CCache::SEntry::SPreprocessingDependency>* dependencies) const
445443
{
446444
std::vector<std::string> extra_dxc_compile_flags = {};

0 commit comments

Comments
 (0)