From a99d1314c353259304f175c594d0c48a1e5d8290 Mon Sep 17 00:00:00 2001 From: ohyzha Date: Thu, 31 Oct 2024 14:44:59 +0200 Subject: [PATCH 1/4] create patch for cmake cache checks so that it can use CheckTypeSize from multiple contexts --- 3rdParty/assimp/CMakeLists.txt | 2 +- CMakeLists.txt | 10 ++++++++++ cmake/cmake-checks-cache-patch.patch | 22 ++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 cmake/cmake-checks-cache-patch.patch diff --git a/3rdParty/assimp/CMakeLists.txt b/3rdParty/assimp/CMakeLists.txt index 782c75b..bad2bad 100644 --- a/3rdParty/assimp/CMakeLists.txt +++ b/3rdParty/assimp/CMakeLists.txt @@ -7,7 +7,7 @@ if (NOT IOS) endif () if (assimp_FOUND OR ASSIMP_FOUND) message("Using system assimp") -elseif (ENABLE_ASSIMP) +elseif (ENABLE_ASSIMP AND NOT assimp_BUILT) message("Building assimp from sources") if(NOT DEFINED ASSIMP_REPO) set(ASSIMP_REPO https://github.com/assimp/assimp.git) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a82edd..545b7ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,15 @@ cmake_minimum_required(VERSION 3.28 FATAL_ERROR) +if (EXISTS "${CMAKE_CURRENT_BINARY_DIR}/cmake_checks_cache.txt") + FILE(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/cmake_checks_cache.txt") +endif() + +if (NOT ONCE) + set(PATCH_CMD git apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake-checks-cache-patch.patch) + execute_process(COMMAND ${PATCH_CMD} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake-checks-cache") + set(ONCE ON CACHE INTERNAL "") +endif() + if ("${PLATFORM}" STREQUAL "OS64" OR "${PLATFORM}" STREQUAL "OS64COMBINED") set(ENABLE_ARC OFF) set(DEPLOYMENT_TARGET "14.0") diff --git a/cmake/cmake-checks-cache-patch.patch b/cmake/cmake-checks-cache-patch.patch new file mode 100644 index 0000000..2d9b39e --- /dev/null +++ b/cmake/cmake-checks-cache-patch.patch @@ -0,0 +1,22 @@ + CMakeChecksCache/CheckTypeSize.cmake | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/CMakeChecksCache/CheckTypeSize.cmake b/CMakeChecksCache/CheckTypeSize.cmake +index ee56b64..49bf66a 100644 +--- a/CMakeChecksCache/CheckTypeSize.cmake ++++ b/CMakeChecksCache/CheckTypeSize.cmake +@@ -20,12 +20,11 @@ + # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + # SOFTWARE. + ++include(${CMAKE_ROOT}/Modules/CheckTypeSize.cmake) + include_guard(GLOBAL) +- + cmake_minimum_required(VERSION 3.11) + + include(DumpCMakeVariables) +-include(${CMAKE_ROOT}/Modules/CheckTypeSize.cmake) + + macro(check_type_size type variable) + _check_type_size(${type} ${variable}) + From 0803ee7086cc4ec7002df3697ae2307988f369f5 Mon Sep 17 00:00:00 2001 From: ohyzha Date: Fri, 1 Nov 2024 12:11:06 +0200 Subject: [PATCH 2/4] use cmake-checks clone project with fix --- .gitmodules | 2 +- CMakeLists.txt | 6 ------ cmake/cmake-checks-cache-patch.patch | 22 ---------------------- 3 files changed, 1 insertion(+), 29 deletions(-) delete mode 100644 cmake/cmake-checks-cache-patch.patch diff --git a/.gitmodules b/.gitmodules index 2656049..7047ef8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,4 @@ url = git@git.madvoxel.net:OpenVulkano/OpenVulkano.wiki.git [submodule "cmake/cmake-checks-cache"] path = cmake/cmake-checks-cache - url = https://github.com/cristianadam/cmake-checks-cache.git + url = https://git.madvoxel.net/Mirrors/cmake-checks-cache diff --git a/CMakeLists.txt b/CMakeLists.txt index 545b7ab..ef70745 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,12 +4,6 @@ if (EXISTS "${CMAKE_CURRENT_BINARY_DIR}/cmake_checks_cache.txt") FILE(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/cmake_checks_cache.txt") endif() -if (NOT ONCE) - set(PATCH_CMD git apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake-checks-cache-patch.patch) - execute_process(COMMAND ${PATCH_CMD} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake-checks-cache") - set(ONCE ON CACHE INTERNAL "") -endif() - if ("${PLATFORM}" STREQUAL "OS64" OR "${PLATFORM}" STREQUAL "OS64COMBINED") set(ENABLE_ARC OFF) set(DEPLOYMENT_TARGET "14.0") diff --git a/cmake/cmake-checks-cache-patch.patch b/cmake/cmake-checks-cache-patch.patch deleted file mode 100644 index 2d9b39e..0000000 --- a/cmake/cmake-checks-cache-patch.patch +++ /dev/null @@ -1,22 +0,0 @@ - CMakeChecksCache/CheckTypeSize.cmake | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/CMakeChecksCache/CheckTypeSize.cmake b/CMakeChecksCache/CheckTypeSize.cmake -index ee56b64..49bf66a 100644 ---- a/CMakeChecksCache/CheckTypeSize.cmake -+++ b/CMakeChecksCache/CheckTypeSize.cmake -@@ -20,12 +20,11 @@ - # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - # SOFTWARE. - -+include(${CMAKE_ROOT}/Modules/CheckTypeSize.cmake) - include_guard(GLOBAL) -- - cmake_minimum_required(VERSION 3.11) - - include(DumpCMakeVariables) --include(${CMAKE_ROOT}/Modules/CheckTypeSize.cmake) - - macro(check_type_size type variable) - _check_type_size(${type} ${variable}) - From 822182d468d565afef074d88c025ad9373c15258 Mon Sep 17 00:00:00 2001 From: ohyzha Date: Fri, 1 Nov 2024 13:00:52 +0200 Subject: [PATCH 3/4] update submodule hash --- cmake/cmake-checks-cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/cmake-checks-cache b/cmake/cmake-checks-cache index fa345a9..c7f0636 160000 --- a/cmake/cmake-checks-cache +++ b/cmake/cmake-checks-cache @@ -1 +1 @@ -Subproject commit fa345a9dbdf7dc4a6b27d6b6e5113ab38d0b9db9 +Subproject commit c7f06360268dbaa047bf4beaaf967e18b1022789 From 2a27e3049f68d84667111604396e011e04fa98a5 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Mon, 4 Nov 2024 17:13:31 +0100 Subject: [PATCH 4/4] Add first Float16 draft --- openVulkanoCpp/Math/Float16.hpp | 287 ++++++++++++++++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 openVulkanoCpp/Math/Float16.hpp diff --git a/openVulkanoCpp/Math/Float16.hpp b/openVulkanoCpp/Math/Float16.hpp new file mode 100644 index 0000000..d013a16 --- /dev/null +++ b/openVulkanoCpp/Math/Float16.hpp @@ -0,0 +1,287 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#ifndef __is_identifier +#define __is_identifier(x) 1 // Compatibility with non-clang compilers. +#endif + +#define __has_keyword(__x) !(__is_identifier(__x)) + +// map a half float type, if available, to float16 +#if __has_keyword(_Float16) + typedef _Float16 float16; +#elif __has_keyword(__fp16) + typedef __fp16 float16; +#else + +class float16 +{ + uint16_t m_data; + + union IEEE_FP16 + { + uint16_t data; + struct + { + uint16_t mantissa : 10; + uint16_t exponent : 5; + uint16_t sign : 1; + } IEEE; + }; + + // Helper for conversion + union IEEE_FP32 + { + float Float; + struct + { + uint32_t mantissa : 23; + uint32_t exponent : 8; + uint32_t sign : 1; + } IEEE; + }; + + static constexpr uint16_t float2half(float value) + { + IEEE_FP32 f; + f.Float = value; + + IEEE_FP16 fp16; + fp16.IEEE.sign = f.IEEE.sign; + + if ( !f.IEEE.exponent) + { + fp16.IEEE.mantissa = 0; + fp16.IEEE.exponent = 0; + } + else if (f.IEEE.exponent==0xff) + { + // NaN or INF + fp16.IEEE.mantissa = (f.IEEE.mantissa!=0) ? 1 : 0; + fp16.IEEE.exponent = 31; + } + else + { + // regular number + int new_exp = f.IEEE.exponent-127; + + if (new_exp<-24) + { // this maps to 0 + fp16.IEEE.mantissa = 0; + fp16.IEEE.exponent = 0; + } + + else if (new_exp < -14) + { + // this maps to a denorm + fp16.IEEE.exponent = 0; + unsigned int exp_val = (unsigned int) (-14 - new_exp); // 2^-exp_val + switch (exp_val) + { + case 0: + fp16.IEEE.mantissa = 0; + break; + case 1: fp16.IEEE.mantissa = 512 + (f.IEEE.mantissa>>14); break; + case 2: fp16.IEEE.mantissa = 256 + (f.IEEE.mantissa>>15); break; + case 3: fp16.IEEE.mantissa = 128 + (f.IEEE.mantissa>>16); break; + case 4: fp16.IEEE.mantissa = 64 + (f.IEEE.mantissa>>17); break; + case 5: fp16.IEEE.mantissa = 32 + (f.IEEE.mantissa>>18); break; + case 6: fp16.IEEE.mantissa = 16 + (f.IEEE.mantissa>>19); break; + case 7: fp16.IEEE.mantissa = 8 + (f.IEEE.mantissa>>20); break; + case 8: fp16.IEEE.mantissa = 4 + (f.IEEE.mantissa>>21); break; + case 9: fp16.IEEE.mantissa = 2 + (f.IEEE.mantissa>>22); break; + case 10: fp16.IEEE.mantissa = 1; break; + } + } + else if (new_exp>15) + { // map this value to infinity + fp16.IEEE.mantissa = 0; + fp16.IEEE.exponent = 31; + } + else + { + fp16.IEEE.exponent = new_exp+15; + fp16.IEEE.mantissa = (f.IEEE.mantissa >> 13); + } + } + return fp16.data; + } + +public: + constexpr float16() : m_data(0) {} + + constexpr float16(const float16&) = default; + + constexpr float16(float16&&) = default; + + template, bool> = true> + constexpr float16(const T& other) : m_data(float2half(static_cast(other))) {} + + constexpr float16(uint16_t mantissa, uint16_t exponent, uint16_t sign) + { + IEEE_FP16 fp16; + fp16.IEEE.mantissa = mantissa; + fp16.IEEE.exponent = exponent; + fp16.IEEE.sign = sign; + m_data = fp16.data; + } + + //region operators + // Operator +=, -=, *=, /= and +, -, *, / + #define BINARY_ARITHMETIC_OPERATOR(OP) \ + template, bool> = true> \ + constexpr float16& operator OP##=(const T& rhs) { \ + return *this = operator float() OP static_cast(rhs); \ + } \ + template, bool> = true> \ + [[nodiscard]] constexpr float16 operator OP(const T& rhs) const { \ + return { operator float() OP static_cast(rhs) }; \ + } + + BINARY_ARITHMETIC_OPERATOR(+) + BINARY_ARITHMETIC_OPERATOR(-) + BINARY_ARITHMETIC_OPERATOR(*) + BINARY_ARITHMETIC_OPERATOR(/) + + #undef BINARY_ARITHMETIC_OPERATOR + + // Operator ++, -- + constexpr float16& operator++() + { + return *this += 1; + } + + constexpr float16 operator++(int) + { + float16 ret(*this); + operator++(); + return ret; + } + + constexpr float16& operator--() + { + return *this -= 1; + } + + constexpr float16 operator--(int) + { + float16 ret(*this); + operator--(); + return ret; + } + + template, bool> = true> + constexpr float16& operator=(const T& rhs) + { + m_data = float2half(rhs); + return *this; + } + + template, bool> = true> + [[nodiscard]] constexpr auto operator<=>(const T& other) const { return operator float() <=> static_cast(other); } + //endregion + + // Operator float + [[nodiscard]] constexpr operator float() const + { + IEEE_FP32 fp32; + IEEE_FP16 fp16; + fp16.data = m_data; + fp32.IEEE.sign = fp16.IEEE.sign; + + if (!fp16.IEEE.exponent) + { + if (!fp16.IEEE.mantissa) + { + fp32.IEEE.mantissa = 0; + fp32.IEEE.exponent = 0; + } + else + { + const float half_denorm = 1.0f / 16384.0f; + float mantissa = static_cast(fp16.IEEE.mantissa) / 1024.0f; + float sgn = (fp16.IEEE.sign) ? -1.0f : 1.0f; + fp32.Float = sgn * mantissa * half_denorm; + } + } + else if (31 == fp16.IEEE.exponent) + { + fp32.IEEE.exponent = 0xff; + fp32.IEEE.mantissa = (fp16.IEEE.mantissa != 0) ? 1 : 0; + } + else + { + fp32.IEEE.exponent = fp16.IEEE.exponent + 112; + fp32.IEEE.mantissa = fp16.IEEE.mantissa << 13; + } + return fp32.Float; + } + + template friend + struct std::hash; +}; + +namespace std +{ + template<> + struct hash + { + std::size_t operator()(const float16& key) const + { + return hash()(key.m_data); + } + }; + + template <> + class numeric_limits + { + public: + // General -- meaningful for all specializations. + static const bool is_specialized = true; + static float16 min() { return float16(0, 1, 0); } + static float16 max() { return float16(~0, 30, 0); } + static const int radix = 2; + static const int digits = 10; // conservative assumption + static const int digits10 = 2; // conservative assumption + static const bool is_signed = true; + static const bool is_integer = true; + static const bool is_exact = false; + static const bool traps = false; + static const bool is_modulo = false; + static const bool is_bounded = true; + + // Floating point specific. + + static float16 epsilon() { return float16(0.00097656f); } // from OpenEXR, needs to be confirmed + static float16 round_error() { return float16(0.00097656f/2); } + static const int min_exponent10 = -9; + static const int max_exponent10 = 9; + static const int min_exponent = -15; + static const int max_exponent = 15; + + static const bool has_infinity = true; + static const bool has_quiet_NaN = true; + static const bool has_signaling_NaN = true; + static const bool is_iec559 = false; + static const bool has_denorm = denorm_present; + static const bool tinyness_before = false; + static const float_round_style round_style = round_to_nearest; + + static float16 denorm_min() { return float16(1, 0, 1); } + static float16 infinity() { return float16(0, 31, 0); } + static float16 quiet_NaN() { return float16(1, 31, 0); } + static float16 signaling_NaN () { return float16(1, 31, 0); } + }; +} + +#endif +#undef __has_keyword + + +typedef float16 fp16; +typedef float16 half;