// This file is part of the FidelityFX SDK. // // Copyright (c) 2022-2023 Advanced Micro Devices, Inc. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. /// A define for a true value in a boolean expression. /// /// @ingroup CPU #define FFX_TRUE … /// A define for a false value in a boolean expression. /// /// @ingroup CPU #define FFX_FALSE … #if !defined(FFX_STATIC) /// A define to abstract declaration of static variables and functions. /// /// @ingroup CPU #define FFX_STATIC … #endif // #if !defined(FFX_STATIC) #ifdef __clang__ #pragma clang diagnostic ignored "-Wunused-variable" #endif /// Interpret the bit layout of an IEEE-754 floating point value as an unsigned integer. /// /// @param [in] x A 32bit floating value. /// /// @returns /// An unsigned 32bit integer value containing the bit pattern of <c><i>x</i></c>. /// /// @ingroup CPU FFX_STATIC FfxUInt32 ffxAsUInt32(FfxFloat32 x) { … } FFX_STATIC FfxFloat32 ffxDot2(FfxFloat32x2 a, FfxFloat32x2 b) { … } FFX_STATIC FfxFloat32 ffxDot3(FfxFloat32x3 a, FfxFloat32x3 b) { … } FFX_STATIC FfxFloat32 ffxDot4(FfxFloat32x4 a, FfxFloat32x4 b) { … } /// Compute the linear interopation between two values. /// /// Implemented by calling the GLSL <c><i>mix</i></c> instrinsic function. Implements the /// following math: /// /// (1 - t) * x + t * y /// /// @param [in] x The first value to lerp between. /// @param [in] y The second value to lerp between. /// @param [in] t The value to determine how much of <c><i>x</i></c> and how much of <c><i>y</i></c>. /// /// @returns /// A linearly interpolated value between <c><i>x</i></c> and <c><i>y</i></c> according to <c><i>t</i></c>. /// /// @ingroup CPU FFX_STATIC FfxFloat32 ffxLerp(FfxFloat32 x, FfxFloat32 y, FfxFloat32 t) { … } /// Compute the reciprocal of a value. /// /// @param [in] x The value to compute the reciprocal for. /// /// @returns /// The reciprocal value of <c><i>x</i></c>. /// /// @ingroup CPU FFX_STATIC FfxFloat32 ffxReciprocal(FfxFloat32 a) { … } /// Compute the square root of a value. /// /// @param [in] x The first value to compute the min of. /// /// @returns /// The the square root of <c><i>x</i></c>. /// /// @ingroup CPU FFX_STATIC FfxFloat32 ffxSqrt(FfxFloat32 x) { … } FFX_STATIC FfxUInt32 AShrSU1(FfxUInt32 a, FfxUInt32 b) { … } /// Compute the factional part of a decimal value. /// /// This function calculates <c><i>x - floor(x)</i></c>. /// /// @param [in] x The value to compute the fractional part from. /// /// @returns /// The fractional part of <c><i>x</i></c>. /// /// @ingroup CPU FFX_STATIC FfxFloat32 ffxFract(FfxFloat32 a) { … } /// Compute the reciprocal square root of a value. /// /// @param [in] x The value to compute the reciprocal for. /// /// @returns /// The reciprocal square root value of <c><i>x</i></c>. /// /// @ingroup CPU FFX_STATIC FfxFloat32 rsqrt(FfxFloat32 a) { … } FFX_STATIC FfxFloat32 ffxMin(FfxFloat32 x, FfxFloat32 y) { … } FFX_STATIC FfxUInt32 ffxMin(FfxUInt32 x, FfxUInt32 y) { … } FFX_STATIC FfxFloat32 ffxMax(FfxFloat32 x, FfxFloat32 y) { … } FFX_STATIC FfxUInt32 ffxMax(FfxUInt32 x, FfxUInt32 y) { … } /// Clamp a value to a [0..1] range. /// /// @param [in] x The value to clamp to [0..1] range. /// /// @returns /// The clamped version of <c><i>x</i></c>. /// /// @ingroup CPU FFX_STATIC FfxFloat32 ffxSaturate(FfxFloat32 a) { … } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// FFX_STATIC void opAAddOneF3(FfxFloat32x3 d, FfxFloat32x3 a, FfxFloat32 b) { … } FFX_STATIC void opACpyF3(FfxFloat32x3 d, FfxFloat32x3 a) { … } FFX_STATIC void opAMulF3(FfxFloat32x3 d, FfxFloat32x3 a, FfxFloat32x3 b) { … } FFX_STATIC void opAMulOneF3(FfxFloat32x3 d, FfxFloat32x3 a, FfxFloat32 b) { … } FFX_STATIC void opARcpF3(FfxFloat32x3 d, FfxFloat32x3 a) { … } /// Convert FfxFloat32 to half (in lower 16-bits of output). /// /// This function implements the same fast technique that is documented here: ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf /// /// The function supports denormals. /// /// Some conversion rules are to make computations possibly "safer" on the GPU, /// -INF & -NaN -> -65504 /// +INF & +NaN -> +65504 /// /// @param [in] f The 32bit floating point value to convert. /// /// @returns /// The closest 16bit floating point value to <c><i>f</i></c>. /// /// @ingroup CPU FFX_STATIC FfxUInt32 f32tof16(FfxFloat32 f) { … } /// Pack 2x32-bit floating point values in a single 32bit value. /// /// This function first converts each component of <c><i>value</i></c> into their nearest 16-bit floating /// point representation, and then stores the X and Y components in the lower and upper 16 bits of the /// 32bit unsigned integer respectively. /// /// @param [in] value A 2-dimensional floating point value to convert and pack. /// /// @returns /// A packed 32bit value containing 2 16bit floating point values. /// /// @ingroup CPU FFX_STATIC FfxUInt32 packHalf2x16(FfxFloat32x2 a) { … }