@@ -1144,6 +1144,12 @@ define_property(TARGET PROPERTY NBL_MOUNT_POINT_DEFINES
11441144 BRIEF_DOCS "List of preprocessor defines with mount points"
11451145)
11461146
1147+ option (NSC_DEBUG_EDIF_FILE_BIT "Add \" -fspv-debug=file\" to NSC Debug CLI" ON )
1148+ option (NSC_DEBUG_EDIF_SOURCE_BIT "Add \" -fspv-debug=source\" to NSC Debug CLI" OFF )
1149+ option (NSC_DEBUG_EDIF_LINE_BIT "Add \" -fspv-debug=line\" to NSC Debug CLI" OFF )
1150+ option (NSC_DEBUG_EDIF_TOOL_BIT "Add \" -fspv-debug=tool\" to NSC Debug CLI" ON )
1151+ option (NSC_DEBUG_EDIF_NON_SEMANTIC_BIT "Add \" -fspv-debug=vulkan-with-source\" to NSC Debug CLI" OFF )
1152+
11471153function (NBL_CREATE_NSC_COMPILE_RULES)
11481154 set (COMMENT "this code has been autogenerated with Nabla CMake NBL_CREATE_HLSL_COMPILE_RULES utility" )
11491155 set (DEVICE_CONFIG_VIEW
@@ -1178,9 +1184,34 @@ struct DeviceConfigCaps
11781184 -enable-16bit-types
11791185 -Zpr
11801186 -spirv
1181- -fspv-target -env=vulkan1.3
1187+ -fspv-target -env=vulkan1.3
1188+ -WShadow
1189+ -WConversion
1190+ $<$<CONFIG:Debug>:-O0>
1191+ $<$<CONFIG:Release>:-O3>
1192+ $<$<CONFIG:RelWithDebInfo>:-O3>
11821193 )
11831194
1195+ if (NSC_DEBUG_EDIF_FILE_BIT)
1196+ list (APPEND REQUIRED_OPTIONS $<$<CONFIG:Debug>:-fspv-debug=file>)
1197+ endif ()
1198+
1199+ if (NSC_DEBUG_EDIF_SOURCE_BIT)
1200+ list (APPEND REQUIRED_OPTIONS $<$<CONFIG:Debug>:-fspv-debug=source >)
1201+ endif ()
1202+
1203+ if (NSC_DEBUG_EDIF_LINE_BIT)
1204+ list (APPEND REQUIRED_OPTIONS $<$<CONFIG:Debug>:-fspv-debug=line>)
1205+ endif ()
1206+
1207+ if (NSC_DEBUG_EDIF_TOOL_BIT)
1208+ list (APPEND REQUIRED_OPTIONS $<$<CONFIG:Debug>:-fspv-debug=tool>)
1209+ endif ()
1210+
1211+ if (NSC_DEBUG_EDIF_NON_SEMANTIC_BIT)
1212+ list (APPEND REQUIRED_OPTIONS $<$<CONFIG:Debug>:-fspv-debug=vulkan-with-source >)
1213+ endif ()
1214+
11841215 if (NOT NBL_EMBED_BUILTIN_RESOURCES)
11851216 list (APPEND REQUIRED_OPTIONS
11861217 -I "${NBL_ROOT_PATH} /include"
@@ -1210,12 +1241,12 @@ struct DeviceConfigCaps
12101241
12111242 get_target_property (HEADER_RULE_GENERATED ${IMPL_TARGET} NBL_HEADER_GENERATED_RULE)
12121243 if (NOT HEADER_RULE_GENERATED)
1213- set (INCLUDE_DIR "$<TARGET_PROPERTY:${IMPL_TARGET} ,BINARY_DIR>/${IMPL_TARGET} /.cmake/include" )
1244+ set (INCLUDE_DIR "$<TARGET_PROPERTY:${IMPL_TARGET} ,BINARY_DIR>/${IMPL_TARGET} /.cmake/include/$<CONFIG> " )
12141245 set (INCLUDE_FILE "${INCLUDE_DIR} /$<TARGET_PROPERTY:${IMPL_TARGET} ,NBL_HEADER_PATH>" )
12151246 set (INCLUDE_CONTENT $<TARGET_PROPERTY:${IMPL_TARGET} ,NBL_HEADER_CONTENT>)
12161247
12171248 file (GENERATE OUTPUT ${INCLUDE_FILE}
1218- CONTENT ${INCLUDE_CONTENT}
1249+ CONTENT $<GENEX_EVAL: $ {INCLUDE_CONTENT}>
12191250 TARGET ${IMPL_TARGET}
12201251 )
12211252
@@ -1277,17 +1308,22 @@ namespace @IMPL_NAMESPACE@ {
12771308 foreach (INDEX RANGE ${LAST_INDEX} )
12781309 string (JSON INPUT GET "${IMPL_INPUTS} " ${INDEX} INPUT )
12791310 string (JSON BASE_KEY GET "${IMPL_INPUTS} " ${INDEX} KEY)
1280- string (JSON COMPILE_OPTIONS_LENGTH LENGTH "${IMPL_INPUTS} " ${INDEX} COMPILE_OPTIONS)
1281-
1311+
12821312 set (COMPILE_OPTIONS "" )
1283- math (EXPR LAST_CO "${COMPILE_OPTIONS_LENGTH} - 1" )
1284- foreach (COMP_IDX RANGE 0 ${LAST_CO} )
1285- string (JSON COMP_ITEM GET "${IMPL_INPUTS} " ${INDEX} COMPILE_OPTIONS ${COMP_IDX} )
1286- list (APPEND COMPILE_OPTIONS "${COMP_ITEM} " )
1287- endforeach ()
1313+ string (JSON HAS_COMPILE_OPTIONS ERROR_VARIABLE ERROR_VAR TYPE "${IMPL_INPUTS} " ${INDEX} COMPILE_OPTIONS)
1314+ if (HAS_COMPILE_OPTIONS STREQUAL "ARRAY" )
1315+ string (JSON COMPILE_OPTIONS_LENGTH LENGTH "${IMPL_INPUTS} " ${INDEX} COMPILE_OPTIONS)
1316+ if (NOT COMPILE_OPTIONS_LENGTH EQUAL 0)
1317+ math (EXPR LAST_CO "${COMPILE_OPTIONS_LENGTH} - 1" )
1318+ foreach (COMP_IDX RANGE 0 ${LAST_CO} )
1319+ string (JSON COMP_ITEM GET "${IMPL_INPUTS} " ${INDEX} COMPILE_OPTIONS ${COMP_IDX} )
1320+ list (APPEND COMPILE_OPTIONS "${COMP_ITEM} " )
1321+ endforeach ()
1322+ endif ()
1323+ endif ()
12881324
12891325 set (DEPENDS_ON "" )
1290- string (JSON HAS_DEPENDS TYPE "${IMPL_INPUTS} " ${INDEX} DEPENDS )
1326+ string (JSON HAS_DEPENDS ERROR_VARIABLE ERROR_VAR TYPE "${IMPL_INPUTS} " ${INDEX} DEPENDS )
12911327 if (HAS_DEPENDS STREQUAL "ARRAY" )
12921328 string (JSON DEPENDS_LENGTH LENGTH "${IMPL_INPUTS} " ${INDEX} DEPENDS )
12931329 if (NOT DEPENDS_LENGTH EQUAL 0)
@@ -1305,7 +1341,7 @@ namespace @IMPL_NAMESPACE@ {
13051341
13061342 set (HAS_CAPS FALSE )
13071343 set (CAPS_LENGTH 0)
1308- string (JSON CAPS_TYPE TYPE "${IMPL_INPUTS} " ${INDEX} CAPS)
1344+ string (JSON CAPS_TYPE ERROR_VARIABLE ERROR_VAR TYPE "${IMPL_INPUTS} " ${INDEX} CAPS)
13091345 if (CAPS_TYPE STREQUAL "ARRAY" )
13101346 string (JSON CAPS_LENGTH LENGTH "${IMPL_INPUTS} " ${INDEX} CAPS)
13111347 if (NOT CAPS_LENGTH EQUAL 0)
@@ -1323,12 +1359,27 @@ namespace @IMPL_NAMESPACE@ {
13231359
13241360 set (CAP_NAMES "" )
13251361 set (CAP_TYPES "" )
1362+ set (CAP_KINDS "" )
13261363 if (HAS_CAPS)
13271364 math (EXPR LAST_CAP "${CAPS_LENGTH} - 1" )
13281365 foreach (CAP_IDX RANGE 0 ${LAST_CAP} )
1366+ string (JSON CAP_KIND ERROR_VARIABLE CAP_TYPE_ERROR GET "${IMPL_INPUTS} " ${INDEX} CAPS ${CAP_IDX} kind)
13291367 string (JSON CAP_NAME GET "${IMPL_INPUTS} " ${INDEX} CAPS ${CAP_IDX} name )
13301368 string (JSON CAP_TYPE GET "${IMPL_INPUTS} " ${INDEX} CAPS ${CAP_IDX} type )
13311369
1370+ # -> TODO: improve validation, input should be string
1371+ if (CAP_TYPE_ERROR)
1372+ set (CAP_KIND limits) # I assume its limit by default (or when invalid value present, currently)
1373+ else ()
1374+ if (NOT CAP_KIND MATCHES "^(limits|features)$" )
1375+ ERROR_WHILE_PARSING_ITEM(
1376+ "Invalid CAP kind \" ${CAP_KIND} \" for ${CAP_NAME} \n "
1377+ "Allowed kinds are: limits, features"
1378+ )
1379+ endif ()
1380+ endif ()
1381+ # <-
1382+
13321383 if (NOT CAP_TYPE MATCHES "^(bool|uint16_t|uint32_t|uint64_t)$" )
13331384 ERROR_WHILE_PARSING_ITEM(
13341385 "Invalid CAP type \" ${CAP_TYPE} \" for ${CAP_NAME} \n "
@@ -1366,6 +1417,7 @@ namespace @IMPL_NAMESPACE@ {
13661417 set (CAP_VALUES_${CAP_IDX} "${VALUES} " )
13671418 list (APPEND CAP_NAMES "${CAP_NAME} " )
13681419 list (APPEND CAP_TYPES "${CAP_TYPE} " )
1420+ list (APPEND CAP_KINDS "${CAP_KIND} " )
13691421 endforeach ()
13701422 endif ()
13711423
@@ -1399,68 +1451,81 @@ namespace @IMPL_NAMESPACE@ {
13991451 nbl::core::string retval = "@BASE_KEY@";
14001452@RETVAL_EVAL@
14011453 retval += ".spv";
1402- return retval;
1454+ return "$<CONFIG>/" + retval;
14031455 }
14041456}
14051457
14061458]=])
14071459 unset (RETVAL_EVAL)
1408- foreach (CAP ${CAP_NAMES} )
1409- string (CONFIGURE [=[
1410- retval += ".@CAP@_" + std::to_string(limits.@CAP@);
1411- ]=] RETVALUE_VIEW @ONLY)
1412- string (APPEND RETVAL_EVAL "${RETVALUE_VIEW} " )
1413- endforeach (CAP)
1460+ list (LENGTH CAP_NAMES CAP_COUNT)
1461+ if (CAP_COUNT GREATER 0)
1462+ math (EXPR LAST_CAP "${CAP_COUNT} - 1" )
1463+ foreach (i RANGE ${LAST_CAP} )
1464+ list (GET CAP_NAMES ${i} CAP)
1465+ list (GET CAP_KINDS ${i} KIND)
1466+ string (CONFIGURE [=[
1467+ retval += ".@CAP@_" + std::to_string(@KIND@.@CAP@);
1468+ ]=] RETVALUE_VIEW @ONLY)
1469+ string (APPEND RETVAL_EVAL "${RETVALUE_VIEW} " )
1470+ endforeach ()
1471+ endif ()
1472+
14141473 string (CONFIGURE "${HEADER_ITEM_VIEW} " HEADER_ITEM_EVAL @ONLY)
14151474 set_property (TARGET ${IMPL_TARGET} APPEND_STRING PROPERTY NBL_HEADER_CONTENT "${HEADER_ITEM_EVAL} " )
14161475
14171476 function (GENERATE_KEYS PREFIX CAP_INDEX CAPS_EVAL_PART)
14181477 if (NUM_CAPS EQUAL 0 OR CAP_INDEX EQUAL ${NUM_CAPS} )
1478+ # generate .config file
14191479 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
1420-
1421- set (TARGET_OUTPUT "${IMPL_BINARY_DIR} /${FINAL_KEY} " )
1422- set (CONFIG_FILE "${TARGET_OUTPUT} .config" )
1480+ set (CONFIG_FILE_TARGET_OUTPUT "${IMPL_BINARY_DIR} /${FINAL_KEY} " )
1481+ set (CONFIG_FILE "${CONFIG_FILE_TARGET_OUTPUT} .config" )
14231482 set (CAPS_EVAL "${CAPS_EVAL_PART} " )
1424-
14251483 string (CONFIGURE "${DEVICE_CONFIG_VIEW} " CONFIG_CONTENT @ONLY)
14261484 file (WRITE "${CONFIG_FILE} " "${CONFIG_CONTENT} " )
14271485
1428- set (NBL_NSC_COMPILE_COMMAND
1429- "$<TARGET_FILE:nsc>"
1430- -Fc "${TARGET_OUTPUT} "
1431- ${COMPILE_OPTIONS} ${REQUIRED_OPTIONS} ${IMPL_COMMON_OPTIONS}
1432- "${CONFIG_FILE} "
1433- )
1434-
1435- add_custom_command (OUTPUT "${TARGET_OUTPUT} "
1436- COMMAND ${NBL_NSC_COMPILE_COMMAND}
1437- DEPENDS ${DEPENDS_ON}
1438- COMMENT "Creating \" ${TARGET_OUTPUT} \" "
1439- VERBATIM
1440- COMMAND_EXPAND_LISTS
1441- )
1442-
1443- set (HEADER_ONLY_LIKE "${CONFIG_FILE} " "${TARGET_INPUT} " "${TARGET_OUTPUT} " )
1444- target_sources (${IMPL_TARGET} PRIVATE ${HEADER_ONLY_LIKE} )
1445-
1446- set_source_files_properties (${HEADER_ONLY_LIKE} PROPERTIES
1447- HEADER_FILE_ONLY ON
1448- VS_TOOL_OVERRIDE None
1449- )
1450-
1451- set_source_files_properties ("${TARGET_OUTPUT} " PROPERTIES
1452- NBL_SPIRV_REGISTERED_INPUT "${TARGET_INPUT} "
1453- NBL_SPIRV_PERMUTATION_CONFIG "${CONFIG_FILE} "
1454- NBL_SPIRV_BINARY_DIR "${IMPL_BINARY_DIR} "
1455- NBL_SPIRV_ACCESS_KEY "${FINAL_KEY} "
1456- )
1457-
1458- set_property (TARGET ${IMPL_TARGET} APPEND PROPERTY NBL_SPIRV_OUTPUTS "${TARGET_OUTPUT} " )
1486+ # generate keys and commands for compiling shaders
1487+ foreach (BUILD_CONFIGURATION ${CMAKE_CONFIGURATION_TYPES} )
1488+ set (FINAL_KEY_REL_PATH "${BUILD_CONFIGURATION} /${FINAL_KEY} " )
1489+ set (TARGET_OUTPUT "${IMPL_BINARY_DIR} /${FINAL_KEY_REL_PATH} " )
1490+
1491+ set (NBL_NSC_COMPILE_COMMAND
1492+ "$<TARGET_FILE:nsc>"
1493+ -Fc "${TARGET_OUTPUT} "
1494+ ${COMPILE_OPTIONS} ${REQUIRED_OPTIONS} ${IMPL_COMMON_OPTIONS}
1495+ "${CONFIG_FILE} "
1496+ )
1497+
1498+ add_custom_command (OUTPUT "${TARGET_OUTPUT} "
1499+ COMMAND ${NBL_NSC_COMPILE_COMMAND}
1500+ DEPENDS ${DEPENDS_ON}
1501+ COMMENT "Creating \" ${TARGET_OUTPUT} \" "
1502+ VERBATIM
1503+ COMMAND_EXPAND_LISTS
1504+ )
1505+
1506+ set (HEADER_ONLY_LIKE "${CONFIG_FILE} " "${TARGET_INPUT} " "${TARGET_OUTPUT} " )
1507+ target_sources (${IMPL_TARGET} PRIVATE ${HEADER_ONLY_LIKE} )
1508+
1509+ set_source_files_properties (${HEADER_ONLY_LIKE} PROPERTIES
1510+ HEADER_FILE_ONLY ON
1511+ VS_TOOL_OVERRIDE None
1512+ )
1513+
1514+ set_source_files_properties ("${TARGET_OUTPUT} " PROPERTIES
1515+ NBL_SPIRV_REGISTERED_INPUT "${TARGET_INPUT} "
1516+ NBL_SPIRV_PERMUTATION_CONFIG "${CONFIG_FILE} "
1517+ NBL_SPIRV_BINARY_DIR "${IMPL_BINARY_DIR} "
1518+ NBL_SPIRV_ACCESS_KEY "${FINAL_KEY_REL_PATH} "
1519+ )
1520+
1521+ set_property (TARGET ${IMPL_TARGET} APPEND PROPERTY NBL_SPIRV_OUTPUTS "${TARGET_OUTPUT} " )
1522+ endforeach ()
14591523 return ()
14601524 endif ()
14611525
14621526 list (GET CAP_NAMES ${CAP_INDEX} CURRENT_CAP)
14631527 list (GET CAP_TYPES ${CAP_INDEX} CURRENT_TYPE)
1528+ list (GET CAP_KINDS ${CAP_INDEX} CURRENT_KIND)
14641529 set (VAR_NAME "CAP_VALUES_${CAP_INDEX} " )
14651530 set (VALUES "${${VAR_NAME} }" )
14661531
0 commit comments