diff --git a/GPU/GPUTracking/Base/cuda/CMakeLists.txt b/GPU/GPUTracking/Base/cuda/CMakeLists.txt index 99c59afd2011a..de54f09fdc2e1 100644 --- a/GPU/GPUTracking/Base/cuda/CMakeLists.txt +++ b/GPU/GPUTracking/Base/cuda/CMakeLists.txt @@ -84,9 +84,8 @@ add_custom_target(${MODULE}_CUDA_SRC_CHK ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR} add_custom_command( OUTPUT ${GPU_RTC_BIN}.command - COMMAND echo -n "${CMAKE_CUDA_COMPILER} ${GPU_RTC_FLAGS_SEPARATED} ${GPU_RTC_DEFINES} -fatbin" > ${GPU_RTC_BIN}.command - COMMAND_EXPAND_LISTS - VERBATIM + COMMAND echo -n "${CMAKE_CUDA_COMPILER} -forward-unknown-to-host-compiler ${GPU_RTC_DEFINES} ${GPU_RTC_FLAGS_SEPARATED} -x cu -fatbin" > ${GPU_RTC_BIN}.command + COMMAND_EXPAND_LISTS VERBATIM COMMENT "Preparing CUDA RTC command file ${GPU_RTC_BIN}.command" ) create_binary_resource(${GPU_RTC_BIN}.command ${GPU_RTC_BIN}.command.o) @@ -94,13 +93,20 @@ create_binary_resource(${GPU_RTC_BIN}.command ${GPU_RTC_BIN}.command.o) add_custom_command( OUTPUT ${GPU_RTC_BIN}.command.arch COMMAND echo -n "${GPU_RTC_FLAGS_ARCH}" > ${GPU_RTC_BIN}.command.arch - COMMAND_EXPAND_LISTS - VERBATIM - COMMENT "Preparing CUDA RTC ARCH file ${GPU_RTC_BIN}.command.arch" + COMMAND_EXPAND_LISTS VERBATIM + COMMENT "Preparing CUDA RTC ARCH command file ${GPU_RTC_BIN}.command.arch" ) create_binary_resource(${GPU_RTC_BIN}.command.arch ${GPU_RTC_BIN}.command.arch.o) -set(SRCS ${SRCS} ${GPU_RTC_BIN}.src.o ${GPU_RTC_BIN}.command.o ${GPU_RTC_BIN}.command.arch.o) +add_custom_command( + OUTPUT ${GPU_RTC_BIN}.command.no_fast_math + COMMAND echo -n "${GPUCA_CUDA_NO_FAST_MATH_FLAGS}" > ${GPU_RTC_BIN}.command.no_fast_math + COMMAND_EXPAND_LISTS VERBATIM + COMMENT "Preparing CUDA RTC NO_FAST_MATH command file ${GPU_RTC_BIN}.command.arch" +) +create_binary_resource(${GPU_RTC_BIN}.command.no_fast_math ${GPU_RTC_BIN}.command.no_fast_math.o) + +set(SRCS ${SRCS} ${GPU_RTC_BIN}.src.o ${GPU_RTC_BIN}.command.o ${GPU_RTC_BIN}.command.arch.o ${GPU_RTC_BIN}.command.no_fast_math.o) # -------------------------------- End RTC ------------------------------------------------------- if(ALIGPU_BUILD_TYPE STREQUAL "O2") @@ -116,8 +122,6 @@ if(ALIGPU_BUILD_TYPE STREQUAL "O2") ${CMAKE_CURRENT_SOURCE_DIR} TARGETVARNAME targetName) - target_compile_definitions(${targetName} PUBLIC $) - install(FILES ${HDRS} DESTINATION include/GPU) endif() @@ -125,11 +129,14 @@ if(ALIGPU_BUILD_TYPE STREQUAL "Standalone") set(targetName "${MODULE}") set(TMP_BASELIB GPUTracking) add_library(${MODULE} SHARED ${SRCS}) + add_library(O2::${MODULE} ALIAS ${MODULE}) target_link_libraries(${MODULE} PUBLIC ${TMP_BASELIB}) install(TARGETS GPUTrackingCUDA) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) endif() +target_compile_definitions(${targetName} PRIVATE $) + # Setting target architecture and adding GPU libraries target_link_libraries(${targetName} PRIVATE cuda cudart nvrtc) set_target_cuda_arch(${targetName}) @@ -164,15 +171,6 @@ elseif(GPUCA_CUDA_COMPILE_MODE STREQUAL "perkernel") target_sources(${targetName} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingCUDAKernelModules.o PROPERTIES EXTERNAL_OBJECT true GENERATED true) - # Disable all non-deterministic floating point to make TPC track model encoding / decoding precise - set_source_files_properties(${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_GPUTPCCompressionKernels_step0attached.cu - ${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_GPUTPCCompressionKernels_step1unattached.cu - ${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_GPUTPCDecompressionKernels_step0attached.cu - ${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_GPUTPCDecompressionKernels_step1unattached.cu - TARGET_DIRECTORY ${targetName} - PROPERTIES - COMPILE_FLAGS "${GPUCA_CUDA_NO_FAST_MATH_FLAGS}" - COMPILE_DEFINITIONS "GPUCA_DETERMINISTIC_MODE") elseif(GPUCA_CUDA_COMPILE_MODE STREQUAL "rdc") message(FATAL_ERROR "CUDA RDC compilation of GPUReconstruction ios not yet working!") target_compile_definitions(${targetName} PRIVATE GPUCA_KERNEL_COMPILE_MODE=2) diff --git a/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDAGenRTC.cxx b/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDAGenRTC.cxx index 1a4721035818e..e789dc9b9ebc3 100644 --- a/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDAGenRTC.cxx +++ b/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDAGenRTC.cxx @@ -29,11 +29,13 @@ using namespace o2::gpu; QGET_LD_BINARY_SYMBOLS(GPUReconstructionCUDArtc_src); QGET_LD_BINARY_SYMBOLS(GPUReconstructionCUDArtc_command); QGET_LD_BINARY_SYMBOLS(GPUReconstructionCUDArtc_command_arch); +QGET_LD_BINARY_SYMBOLS(GPUReconstructionCUDArtc_command_no_fast_math); int32_t GPUReconstructionCUDA::genRTC(std::string& filename, uint32_t& nCompile) { std::string rtcparam = std::string("#define GPUCA_RTC_CODE\n") + std::string(mProcessingSettings.rtc.optSpecialCode ? "#define GPUCA_RTC_SPECIAL_CODE(...) __VA_ARGS__\n" : "#define GPUCA_RTC_SPECIAL_CODE(...)\n") + + std::string(mProcessingSettings.rtc.deterministic ? "#define GPUCA_DETERMINISTIC_CODE(det, indet) det\n" : "#define GPUCA_DETERMINISTIC_CODE(det, indet) indet\n") + GPUParamRTC::generateRTCCode(param(), mProcessingSettings.rtc.optConstexpr); if (filename == "") { filename = "/tmp/o2cagpu_rtc_"; @@ -52,6 +54,7 @@ int32_t GPUReconstructionCUDA::genRTC(std::string& filename, uint32_t& nCompile) std::string baseCommand = (mProcessingSettings.RTCprependCommand != "" ? (mProcessingSettings.RTCprependCommand + " ") : ""); baseCommand += (getenv("O2_GPU_RTC_OVERRIDE_CMD") ? std::string(getenv("O2_GPU_RTC_OVERRIDE_CMD")) : std::string(_binary_GPUReconstructionCUDArtc_command_start, _binary_GPUReconstructionCUDArtc_command_len)); baseCommand += std::string(" ") + (mProcessingSettings.RTCoverrideArchitecture != "" ? mProcessingSettings.RTCoverrideArchitecture : std::string(_binary_GPUReconstructionCUDArtc_command_arch_start, _binary_GPUReconstructionCUDArtc_command_arch_len)); + baseCommand += mProcessingSettings.rtc.deterministic ? (std::string(" ") + std::string(_binary_GPUReconstructionCUDArtc_command_no_fast_math_start, _binary_GPUReconstructionCUDArtc_command_no_fast_math_len)) : std::string(""); char shasource[21], shaparam[21], shacmd[21], shakernels[21]; if (mProcessingSettings.rtc.cacheOutput) { diff --git a/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDArtc.cu b/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDArtc.cu index 31f9c54c5e7f8..919b5c11477ef 100644 --- a/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDArtc.cu +++ b/GPU/GPUTracking/Base/cuda/GPUReconstructionCUDArtc.cu @@ -15,6 +15,8 @@ #define GPUCA_GPUCODE_GENRTC #define GPUCA_GPUCODE_COMPILEKERNELS #define GPUCA_RTC_SPECIAL_CODE(...) GPUCA_RTC_SPECIAL_CODE(__VA_ARGS__) +#define GPUCA_DETERMINISTIC_CODE(...) GPUCA_DETERMINISTIC_CODE(__VA_ARGS__) +// GPUReconstructionCUDAIncludesHost.h auto-prependended without preprocessor running #include "GPUReconstructionCUDADef.h" #include "GPUReconstructionIncludesDeviceAll.h" diff --git a/GPU/GPUTracking/Base/hip/CMakeLists.txt b/GPU/GPUTracking/Base/hip/CMakeLists.txt index 16e6e72d56e9a..43259decef956 100644 --- a/GPU/GPUTracking/Base/hip/CMakeLists.txt +++ b/GPU/GPUTracking/Base/hip/CMakeLists.txt @@ -122,9 +122,8 @@ add_custom_target(${MODULE}_HIP_SRC_CHK ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ add_custom_command( OUTPUT ${GPU_RTC_BIN}.command - COMMAND echo -n "${CMAKE_HIP_COMPILER} ${GPU_RTC_FLAGS_SEPARATED} ${GPU_RTC_DEFINES} -x hip --cuda-device-only" > ${GPU_RTC_BIN}.command - COMMAND_EXPAND_LISTS - VERBATIM + COMMAND echo -n "${CMAKE_HIP_COMPILER} ${GPU_RTC_DEFINES} ${GPU_RTC_FLAGS_SEPARATED} -x hip --cuda-device-only" > ${GPU_RTC_BIN}.command + COMMAND_EXPAND_LISTS VERBATIM COMMENT "Preparing HIP RTC command file ${GPU_RTC_BIN}.command" ) create_binary_resource(${GPU_RTC_BIN}.command ${GPU_RTC_BIN}.command.o) @@ -132,13 +131,20 @@ create_binary_resource(${GPU_RTC_BIN}.command ${GPU_RTC_BIN}.command.o) add_custom_command( OUTPUT ${GPU_RTC_BIN}.command.arch COMMAND echo -n "${GPU_RTC_FLAGS_ARCH}" > ${GPU_RTC_BIN}.command.arch - COMMAND_EXPAND_LISTS - VERBATIM - COMMENT "Preparing HIP RTC ARCH file ${GPU_RTC_BIN}.command.arch" + COMMAND_EXPAND_LISTS VERBATIM + COMMENT "Preparing HIP RTC ARCH command file ${GPU_RTC_BIN}.command.arch" ) create_binary_resource(${GPU_RTC_BIN}.command.arch ${GPU_RTC_BIN}.command.arch.o) -set(SRCS ${SRCS} ${GPU_RTC_BIN}.src.o ${GPU_RTC_BIN}.command.o ${GPU_RTC_BIN}.command.arch.o) +add_custom_command( + OUTPUT ${GPU_RTC_BIN}.command.no_fast_math + COMMAND echo -n "${GPUCA_CXX_NO_FAST_MATH_FLAGS}" > ${GPU_RTC_BIN}.command.no_fast_math + COMMAND_EXPAND_LISTS VERBATIM + COMMENT "Preparing HIP RTC NO_FAST_MATH command file ${GPU_RTC_BIN}.command.no_fast_math" +) +create_binary_resource(${GPU_RTC_BIN}.command.no_fast_math ${GPU_RTC_BIN}.command.no_fast_math.o) + +set(SRCS ${SRCS} ${GPU_RTC_BIN}.src.o ${GPU_RTC_BIN}.command.o ${GPU_RTC_BIN}.command.arch.o ${GPU_RTC_BIN}.command.no_fast_math.o) # -------------------------------- End RTC ------------------------------------------------------- if(ALIGPU_BUILD_TYPE STREQUAL "O2") @@ -154,8 +160,6 @@ if(ALIGPU_BUILD_TYPE STREQUAL "O2") ${GPUCA_HIP_SOURCE_DIR} TARGETVARNAME targetName) - target_compile_definitions(${targetName} PUBLIC $) - install(FILES ${HDRS} DESTINATION include/GPU) # o2_add_test(GPUsortHIP NAME test_GPUsortHIP @@ -169,11 +173,14 @@ if(ALIGPU_BUILD_TYPE STREQUAL "Standalone") set(targetName "${MODULE}") set(TMP_BASELIB GPUTracking) add_library(${MODULE} SHARED ${SRCS}) + add_library(O2::${MODULE} ALIAS ${MODULE}) target_link_libraries(${MODULE} PUBLIC ${TMP_BASELIB}) install(TARGETS GPUTrackingHIP) include_directories(${GPUCA_HIP_SOURCE_DIR}) endif() +target_compile_definitions(${targetName} PRIVATE $) + add_library(${MODULE}_CXX OBJECT ${SRCS_CXX}) # Adding a C++ library for the .cxx code of the HIP library, such that it does not link to HIP libraries, and CMake HIP Language doesn't add HIP compile flags. target_compile_definitions(${MODULE}_CXX PRIVATE $) target_include_directories(${MODULE}_CXX PRIVATE $) @@ -222,15 +229,6 @@ elseif(GPUCA_HIP_COMPILE_MODE STREQUAL "perkernel") target_sources(${targetName} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/GPUTrackingHIPKernelModules.o PROPERTIES EXTERNAL_OBJECT true GENERATED true) - # Disable all non-deterministic floating point to make TPC track model encoding / decoding precise - set_source_files_properties(${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_GPUTPCCompressionKernels_step0attached.hip - ${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_GPUTPCCompressionKernels_step1unattached.hip - ${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_GPUTPCDecompressionKernels_step0attached.hip - ${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_GPUTPCDecompressionKernels_step1unattached.hip - TARGET_DIRECTORY ${targetName} - PROPERTIES - COMPILE_FLAGS "${GPUCA_CXX_NO_FAST_MATH_FLAGS}" - COMPILE_DEFINITIONS "GPUCA_DETERMINISTIC_MODE") elseif(GPUCA_HIP_COMPILE_MODE STREQUAL "rdc") message(FATAL_ERROR "HIP RDC compilation of GPUReconstruction ios not yet working!") target_compile_definitions(${targetName} PRIVATE GPUCA_KERNEL_COMPILE_MODE=2) diff --git a/GPU/GPUTracking/CMakeLists.txt b/GPU/GPUTracking/CMakeLists.txt index dedfcf5953394..ba2b9d05a3192 100644 --- a/GPU/GPUTracking/CMakeLists.txt +++ b/GPU/GPUTracking/CMakeLists.txt @@ -372,16 +372,6 @@ if(ALIGPU_BUILD_TYPE STREQUAL "Standalone") endif() endif() -# Disable all non-deterministic floating point to make TPC track model encoding / decoding precise -set_source_files_properties(DataCompression/GPUTPCCompressionTrackModel.cxx - DataCompression/GPUTPCCompressionKernels.cxx - DataCompression/TPCClusterDecompressor.cxx - DataCompression/GPUTPCDecompressionKernels.cxx - TARGET_DIRECTORY ${targetName} - PROPERTIES - COMPILE_FLAGS "${GPUCA_CXX_NO_FAST_MATH_FLAGS}" - COMPILE_DEFINITIONS "GPUCA_DETERMINISTIC_MODE") - # GPUReconstructionLibrary needs to know which GPU backends are enabled for proper error messages configure_file(Base/GPUReconstructionAvailableBackends.template.h ${CMAKE_CURRENT_BINARY_DIR}/GPUReconstructionAvailableBackends.h) set_source_files_properties(Base/GPUReconstructionLibrary.cxx @@ -423,5 +413,19 @@ if(ALIGPU_BUILD_TYPE STREQUAL "O2" OR ALIGPU_BUILD_TYPE STREQUAL "Standalone") endif() if(GPUCA_DETERMINISTIC_MODE GREATER_EQUAL ${GPUCA_DETERMINISTIC_MODE_MAP_GPU}) - target_compile_definitions(${targetName} PUBLIC GPUCA_DETERMINISTIC_MODE) + target_compile_definitions(${targetName} PRIVATE GPUCA_DETERMINISTIC_MODE) endif() + +# Disable all non-deterministic floating point to make TPC track model encoding / decoding precise +set_source_files_properties(DataCompression/GPUTPCCompressionTrackModel.cxx + DataCompression/GPUTPCCompressionKernels.cxx + DataCompression/TPCClusterDecompressor.cxx + DataCompression/GPUTPCDecompressionKernels.cxx + TARGET_DIRECTORY ${targetName} + PROPERTIES + COMPILE_FLAGS "${GPUCA_CXX_NO_FAST_MATH_FLAGS}" + COMPILE_DEFINITIONS "GPUCA_DETERMINISTIC_MODE") +o2_gpu_kernel_set_deterministic(GPUTPCCompressionKernels_step0attached + GPUTPCCompressionKernels_step1unattached + GPUTPCDecompressionKernels_step0attached + GPUTPCDecompressionKernels_step1unattached) diff --git a/GPU/GPUTracking/Definitions/GPUSettingsList.h b/GPU/GPUTracking/Definitions/GPUSettingsList.h index a1f650a2bc56e..e0c5f845a475e 100644 --- a/GPU/GPUTracking/Definitions/GPUSettingsList.h +++ b/GPU/GPUTracking/Definitions/GPUSettingsList.h @@ -208,6 +208,7 @@ BeginSubConfig(GPUSettingsProcessingRTC, rtc, configStandalone.proc, "RTC", 0, " AddOption(cacheOutput, bool, false, "", 0, "Cache RTC compilation results") AddOption(optConstexpr, bool, true, "", 0, "Replace constant variables by static constexpr expressions") AddOption(optSpecialCode, int8_t, -1, "", 0, "Insert GPUCA_RTC_SPECIAL_CODE special code during RTC") +AddOption(deterministic, bool, false, "", 0, "Compile RTC in deterministic mode, with NO_FAST_MATH flags and GPUCA_DETERMINISTIC_MODE define") AddOption(compilePerKernel, bool, true, "", 0, "Run one RTC compilation per kernel") AddOption(enable, bool, false, "", 0, "Use RTC to optimize GPU code") AddOption(runTest, int32_t, 0, "", 0, "Do not run the actual benchmark, but just test RTC compilation (1 full test, 2 test only compilation)") diff --git a/GPU/GPUTracking/Standalone/Benchmark/CMakeLists.txt b/GPU/GPUTracking/Standalone/Benchmark/CMakeLists.txt index e418d94b62cb2..eeafcfc44142d 100644 --- a/GPU/GPUTracking/Standalone/Benchmark/CMakeLists.txt +++ b/GPU/GPUTracking/Standalone/Benchmark/CMakeLists.txt @@ -28,10 +28,9 @@ if(ALIGPU_BUILD_TYPE STREQUAL "Standalone") add_executable(ca ${SRCS}) set(targetName ca) target_link_libraries(${targetName} PUBLIC GPUTracking) - endif() -target_compile_definitions(${targetName} PUBLIC $) +target_compile_definitions(${targetName} PRIVATE $) if(ROOT_FOUND) target_sources(${targetName} PRIVATE ../../qa/genEvents.cxx) diff --git a/GPU/GPUTracking/cmake/kernel_helpers.cmake b/GPU/GPUTracking/cmake/kernel_helpers.cmake index 1f35b6fc468b2..e63b915640e8a 100644 --- a/GPU/GPUTracking/cmake/kernel_helpers.cmake +++ b/GPU/GPUTracking/cmake/kernel_helpers.cmake @@ -142,3 +142,26 @@ function(o2_gpu_kernel_file_list list) list(REMOVE_DUPLICATES TMP_FILE_LIST) set_property(TARGET O2_GPU_KERNELS PROPERTY O2_GPU_KERNELS_FILE_LIST_${list} "${TMP_FILE_LIST}") endfunction() + +function(o2_gpu_kernel_set_deterministic) + if(NOT GPUCA_DETERMINISTIC_MODE GREATER_EQUAL ${GPUCA_DETERMINISTIC_MODE_MAP_GPU}) + list(LENGTH ARGV n) + math(EXPR n "${n} - 1") + foreach(i RANGE 0 ${n}) + if(CUDA_ENABLED AND (NOT DEFINED GPUCA_CUDA_COMPILE_MODE OR GPUCA_CUDA_COMPILE_MODE STREQUAL "perkernel")) + set_source_files_properties("${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_${ARGV${i}}.cu" + TARGET_DIRECTORY O2::GPUTrackingCUDA + PROPERTIES + COMPILE_FLAGS "${GPUCA_CUDA_NO_FAST_MATH_FLAGS}" + COMPILE_DEFINITIONS "GPUCA_DETERMINISTIC_MODE") + endif() + if(HIP_ENABLED AND (NOT DEFINED GPUCA_HIP_COMPILE_MODE OR GPUCA_HIP_COMPILE_MODE STREQUAL "perkernel")) + set_source_files_properties("${O2_GPU_KERNEL_WRAPPER_FOLDER}/krnl_${ARGV${i}}.hip" + TARGET_DIRECTORY O2::GPUTrackingHIP + PROPERTIES + COMPILE_FLAGS "${GPUCA_CXX_NO_FAST_MATH_FLAGS}" + COMPILE_DEFINITIONS "GPUCA_DETERMINISTIC_MODE") + endif() + endforeach() + endif() +endfunction() diff --git a/GPU/GPUTracking/display/CMakeLists.txt b/GPU/GPUTracking/display/CMakeLists.txt index b3107dbec8c79..592ba3b38ff30 100644 --- a/GPU/GPUTracking/display/CMakeLists.txt +++ b/GPU/GPUTracking/display/CMakeLists.txt @@ -131,7 +131,6 @@ if(ALIGPU_BUILD_TYPE STREQUAL "O2") PUBLIC_INCLUDE_DIRECTORIES . SOURCES ${SRCS} ${SRCS_NO_H}) - target_compile_definitions(${targetName} PRIVATE $) target_compile_definitions(${targetName} PRIVATE GPUCA_BUILD_EVENT_DISPLAY_GLFW GPUCA_DISPLAY_GL3W GPUCA_DISPLAY_OPENGL_CORE) install(FILES ${HDRS} ${HDRS_INSTALL} DESTINATION include/GPU) @@ -158,6 +157,8 @@ if(ALIGPU_BUILD_TYPE STREQUAL "Standalone") install(FILES ${CMAKE_CURRENT_BINARY_DIR}/setinclude.sh PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE DESTINATION displayTrackFilter) endif() +target_compile_definitions(${targetName} PRIVATE $) + message(STATUS "Building GPU Event Display (Vulkan ${GPUCA_EVENT_DISPLAY_VULKAN}, Wayland ${GPUCA_EVENT_DISPLAY_WAYLAND}, Freetype ${GPUCA_EVENT_DISPLAY_FREETYPE}, Fontconfig ${Fontconfig_FOUND}, Qt ${GPUCA_EVENT_DISPLAY_QT})") target_link_libraries(${targetName} PUBLIC ${GLFW_LIBRARIES} OpenGL::GL) target_include_directories(${targetName} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/GPU/GPUTracking/utils/qconfig.h b/GPU/GPUTracking/utils/qconfig.h index 79a9bd757b531..bc755e583c3b7 100644 --- a/GPU/GPUTracking/utils/qconfig.h +++ b/GPU/GPUTracking/utils/qconfig.h @@ -250,12 +250,12 @@ enum qConfigRetVal { qcrOK = 0, #define AddVariable(name, type, default) out << qon_mxstr(type) << " " << qon_mxstr(name) << ";\n"; #define AddOptionArray(name, type, count, default, optname, optnameshort, help, ...) out << qon_mxstr(type) << " " << qon_mxstr(name) << "[" << qon_mxstr(count) << "];\n"; #define AddOptionVec(name, type, optname, optnameshort, help, ...) out << "std::vector<" << qon_mxstr(type) << "> " << qon_mxstr(name) << ";\n"; -#define AddVariableRTC(name, type, default) \ - if (useConstexpr) { \ - out << "static constexpr " << qon_mxstr(type) << " " << qon_mxstr(name) << " = " << qConfig::print_type(std::get(tSrc)->name) << ";\n"; \ - out << qon_mxstr(type) << " " << qon_mxstr(qon_mxcat(_dummy_, name)) << ";\n"; \ - } else { \ - AddOption(name, type, default, optname, optnameshort, help); \ +#define AddVariableRTC(name, type, default) \ + if (useConstexpr) { \ + out << "static constexpr " << qon_mxstr(type) << " " << qon_mxstr(name) << " = " << qConfig::print_type(std::get(tSrc)->name, true) << ";\n"; \ + out << qon_mxstr(type) << " " << qon_mxstr(qon_mxcat(_dummy_, name)) << ";\n"; \ + } else { \ + AddOption(name, type, default, optname, optnameshort, help); \ } #define AddOptionRTC(name, type, default, optname, optnameshort, help, ...) AddVariableRTC(name, type, default) #define AddOptionArrayRTC(name, type, count, default, optname, optnameshort, help, ...) \ diff --git a/GPU/GPUTracking/utils/qconfig_helpers.h b/GPU/GPUTracking/utils/qconfig_helpers.h index e721f08ccfa90..51c89b759e9cf 100644 --- a/GPU/GPUTracking/utils/qconfig_helpers.h +++ b/GPU/GPUTracking/utils/qconfig_helpers.h @@ -17,6 +17,7 @@ #include #include +#include #define qon_mcat(a, b) a##b #define qon_mxcat(a, b) qon_mcat(a, b) @@ -30,29 +31,34 @@ namespace qConfig { template -inline std::string print_type(T val) +inline std::string print_type(T val, bool precise = false) { std::ostringstream s; + if constexpr (std::is_same_v || std::is_same_v) { + if (precise) { + s << std::hexfloat; + } + } s << val; return s.str(); }; template <> -inline std::string print_type(char val) +inline std::string print_type(char val, bool precise) { return std::to_string(val); }; template <> -inline std::string print_type(int8_t val) +inline std::string print_type(int8_t val, bool precise) { return std::to_string(val); }; template <> -inline std::string print_type(uint8_t val) +inline std::string print_type(uint8_t val, bool precise) { return std::to_string(val); }; template <> -inline std::string print_type(bool val) +inline std::string print_type(bool val, bool precise) { return val ? "true" : "false"; }; diff --git a/GPU/GPUTracking/utils/qconfigrtc.h b/GPU/GPUTracking/utils/qconfigrtc.h index 97365a6412c5d..8d33ef0ac6355 100644 --- a/GPU/GPUTracking/utils/qconfigrtc.h +++ b/GPU/GPUTracking/utils/qconfigrtc.h @@ -31,6 +31,7 @@ template static std::string qConfigPrintRtc(const T& tSrc, bool useConstexpr) { std::stringstream out; + out << std::hexfloat; #define QCONFIG_PRINT_RTC #include "qconfig.h" #undef QCONFIG_PRINT_RTC