@@ -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,17 @@ 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+ set (OUTPUT_PREFIX "" )
1525+ set (OUTPUT_GROUP_BY_CONFIG FALSE )
1526+ list (APPEND MODE_ARGS -P)
1527+ endif ()
1528+
15011529 set (HEADER_ITEM_VIEW [=[
15021530namespace @IMPL_NAMESPACE@ {
15031531 template<>
@@ -1506,8 +1534,8 @@ namespace @IMPL_NAMESPACE@ {
15061534 {
15071535 nbl::core::string retval = "@BASE_KEY@";
15081536@RETVAL_EVAL@
1509- retval += ".spv ";
1510- return "$<CONFIG>/ " + retval;
1537+ retval += "@OUTPUT_EXT@ ";
1538+ return "@OUTPUT_PREFIX@ " + retval;
15111539 }
15121540}
15131541
@@ -1532,15 +1560,15 @@ namespace @IMPL_NAMESPACE@ {
15321560 function (GENERATE_KEYS PREFIX CAP_INDEX CAPS_EVAL_PART )
15331561 if (NUM_CAPS EQUAL 0 OR CAP_INDEX EQUAL ${NUM_CAPS} )
15341562 # 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
1563+ set (FINAL_KEY "${BASE_KEY}${PREFIX}${OUTPUT_EXT} " )
15361564 set (CONFIG_FILE_TARGET_OUTPUT "${IMPL_BINARY_DIR} /${FINAL_KEY} " )
15371565 set (CONFIG_FILE "${CONFIG_FILE_TARGET_OUTPUT} .config" )
15381566 set (CAPS_EVAL "${CAPS_EVAL_PART} " )
15391567 string (CONFIGURE "${DEVICE_CONFIG_VIEW} " CONFIG_CONTENT @ONLY)
15401568 file (WRITE "${CONFIG_FILE} " "${CONFIG_CONTENT} " )
15411569
15421570 # generate keys and commands for compiling shaders
1543- set (FINAL_KEY_REL_PATH "$< CONFIG >/ ${FINAL_KEY} " )
1571+ set (FINAL_KEY_REL_PATH "${OUTPUT_PREFIX} ${FINAL_KEY} " )
15441572 set (TARGET_OUTPUT "${IMPL_BINARY_DIR} /${FINAL_KEY_REL_PATH} " )
15451573 set (DEPFILE_PATH "${TARGET_OUTPUT} .d" )
15461574 set (NBL_NSC_LOG_PATH "${TARGET_OUTPUT} .log" )
@@ -1553,6 +1581,7 @@ namespace @IMPL_NAMESPACE@ {
15531581 set (NBL_NSC_COMPILE_COMMAND
15541582 "$<TARGET_FILE :Nabla ::nsc >"
15551583 ${NBL_NSC_EXTRA_ARGS}
1584+ ${MODE_ARGS}
15561585 -Fc "${TARGET_OUTPUT} "
15571586 ${COMPILE_OPTIONS} ${REQUIRED_OPTIONS} ${IMPL_COMMON_OPTIONS}
15581587 ${NBL_NSC_DEPFILE_ARGS}
@@ -1600,7 +1629,7 @@ namespace @IMPL_NAMESPACE@ {
16001629 HEADER_FILE_ONLY ON
16011630 VS_TOOL_OVERRIDE None
16021631 )
1603- if (CMAKE_CONFIGURATION_TYPES )
1632+ if (CMAKE_CONFIGURATION_TYPES AND OUTPUT_GROUP_BY_CONFIG )
16041633 foreach (_CFG IN LISTS CMAKE_CONFIGURATION_TYPES )
16051634 set (TARGET_OUTPUT_IDE "${IMPL_BINARY_DIR} /${_CFG} /${FINAL_KEY} " )
16061635 set (NBL_NSC_OUT_FILES_IDE "${TARGET_OUTPUT_IDE} " "${TARGET_OUTPUT_IDE} .log" )
0 commit comments