| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282 |
- // ==================================================================================================
- // Copyright (c) 2007-2021 Advanced Micro Devices, Inc. All rights reserved.
- // Copyright (c) 2004-2006 ATI Technologies Inc.
- // Copyright (c) <2014> <Michal Drobot>
- // ==================================================================================================
- //
- // 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.
- //
- //
- // File Name: Common_Def
- // Description: common definitions used for CPU/HPC/GPU
- //
- // Pull changes:
- // Fixed build of cmp_core on Mac. (#164)
- //
- #ifndef CMP_COMMON_DEFINITIONS_H
- #define CMP_COMMON_DEFINITIONS_H
- //#define USE_CMP_FIDELITY_FX_H
- // Proxy ISPC compiler (Warning! Not all ASPM features will be available : expect build errors for specialized ASPM code!
- #ifdef ISPC
- #define ASPM
- #endif
- // Using OpenCL Compiler
- #ifdef __OPENCL_VERSION__
- #define ASPM_OPENCL
- #endif
- #ifdef USE_CMP_FIDELITY_FX_H
- // Fidelity FX SDK mapping
- #if defined(A_CPU)
- #ifndef ASPM_CPU
- #define ASPM_CPU
- #endif
- #endif
- #if defined(A_GPU)
- #ifndef ASPM_GPU
- #define ASPM_GPU
- #endif
- #endif
- #if defined(A_GLS)
- #ifndef ASPM_GLS
- #define ASPM_GLS
- #endif
- #endif
- #if defined(A_HLSL)
- #ifndef ASPM_HLSL
- #define ASPM_HLSL
- #endif
- #endif
- #if defined(A_GCC)
- #ifndef ASPM_GCC
- #define ASPM_GCC
- #endif
- #endif
- #endif
- #if (defined(ASPM_HLSL) || defined(ASPM_OPENCL))
- #ifndef ASPM_GPU
- #define ASPM_GPU
- #endif
- #endif
- //=======================================
- // Skip CMP if only using FidelityFX Code
- //=======================================
- #if !(defined(A_GPU) || defined(A_GLS) || defined(A_HLSL) || defined(A_GCC))
- // The shaders for UE4 require extension in the form of .ush in place of standard .h
- // this directive is used to make the change without users requiring to modify all of the include extensions
- // specific to UE4
- #ifdef ASPM_HLSL_UE4
- #pragma once
- #define INC_cmp_math_vec4 "cmp_math_vec4.ush"
- #define INC_cmp_math_func "cmp_math_func.ush"
- #else
- #define INC_cmp_math_vec4 "cmp_math_vec4.h"
- #define INC_cmp_math_func "cmp_math_func.h"
- #endif
- #if defined(__linux__) || defined(__APPLE__)
- #ifndef _LINUX
- #define _LINUX
- #endif
- #ifdef ASPM_GPU
- #undef ASPM_GPU
- #endif
- #include <cstring>
- #include <cmath>
- #include <stdio.h>
- #include INC_cmp_math_vec4
- #endif
- #ifdef _WIN32
- //#define USE_ASPM_CODE
- #include <cmath>
- #endif
- #ifndef CMP_MAX
- #define CMP_MAX(x, y) (((x) > (y)) ? (x) : (y))
- #endif
- #ifndef CMP_MIN
- #define CMP_MIN(x, y) (((x) < (y)) ? (x) : (y))
- #endif
- #ifndef cmp_isnan
- #ifdef ASPM_GPU
- #define cmp_isnan(x) isnan(x)
- #else
- #define cmp_isnan(x) std::isnan(x)
- #endif
- #endif
- #ifdef ASPM_GPU
- #define CMP_STATIC_CAST(x, y) (x)(y)
- #define CMP_TYPE_CAST(x) (x)
- #else
- #define CMP_STATIC_CAST(x, y) static_cast<x>(y)
- #define CMP_TYPE_CAST(x) (x&)
- #endif
- // Sets mapping BC1, BC2 & BC3 to decode Red,Green,Blue and Alpha
- // RGBA to channels [0,1,2,3] else BGRA maps to [0,1,2,3]
- // BC4 alpha always maps as AAAA to channels [0,1,2,3]
- // BC5 decoded (Red&Green) maps R,G,B=0,A=255 to [0,1,2,3] else maps [B=0,G,R,A=255] to [0,1,2,3]
- #define CMP_SET_BC13_DECODER_RGBA
- #define CMP_FLOAT_MAX 3.402823466e+38F // max value used to detect an Error in processing
- #define CMP_FLOAT_MAX_EXP 38
- #define USE_PROCESS_SEPERATE_ALPHA // Enable this to use higher quality code using CompressDualIndexBlock
- #define COMPRESSED_BLOCK_SIZE 16 // Size of a compressed block in bytes
- #define MAX_DIMENSION_BIG 4 // Max number of channels (RGBA)
- #define MAX_SUBSETS 3 // Maximum number of possible subsets
- #define MAX_SUBSET_SIZE 16 // Largest possible size for an individual subset
- #define BLOCK_SIZE_4X4X4 64
- #define BLOCK_SIZE_4X4 16
- #define BlockX 4
- #define BlockY 4
- //#define USE_BLOCK_LINEAR // Source Data is organized in linear form for each block : Experimental Code not fully developed
- //#define USE_DOUBLE // Default is to use float, enable to use double data types only for float definitions
- //---------------------------------------------
- // Predefinitions for GPU and CPU compiled code
- //---------------------------------------------
- #ifdef ASPM_HLSL
- // ==== Vectors ====
- typedef float2 CGU_Vec2f;
- typedef float2 CGV_Vec2f;
- typedef float3 CGU_Vec3f;
- typedef float3 CGV_Vec3f;
- typedef float4 CGU_Vec4f;
- typedef float4 CGV_Vec4f;
- typedef int2 CGU_Vec2i;
- typedef int2 CGV_Vec2i;
- typedef uint2 CGU_Vec2ui;
- typedef uint2 CGV_Vec2ui;
- typedef int3 CGU_Vec3i;
- typedef int3 CGV_Vec3i;
- typedef uint3 CGU_Vec3ui;
- typedef uint3 CGV_Vec3ui;
- typedef int4 CGU_Vec4i;
- typedef int4 CGV_Vec4i;
- typedef int4 CGU_Vec4uc;
- typedef int4 CGV_Vec4uc;
- typedef uint4 CGU_Vec4ui;
- typedef uint4 CGV_Vec4ui;
- // ==== Scalar Types ==== to remove from code
- typedef int CGU_INT8;
- typedef int CGU_INT;
- typedef int CGV_INT;
- typedef uint CGU_UINT8;
- typedef uint CGU_UINT;
- // ==== Scalar Types ====
- typedef int CGU_BOOL;
- typedef int CGV_BOOL;
- typedef int CGV_INT8;
- typedef int CGV_UINT8;
- typedef uint CGU_UINT16;
- typedef int CGU_INT32;
- typedef int CGV_INT32;
- typedef uint CGU_UINT32;
- typedef uint CGV_UINT32;
- typedef float CGV_FLOAT;
- typedef float CGU_FLOAT;
- typedef min16float CGU_MIN16_FLOAT; // FP16 GPU support defaults to 32 bit if no HW support
- #define TRUE 1
- #define FALSE 0
- #define CMP_CDECL
- #define BC7_ENCODECLASS
- #define CMP_EXPORT
- #define INLINE inline
- #define uniform
- #define varying
- #define CMP_GLOBAL
- #define CMP_KERNEL
- #define CMP_CONSTANT const
- #define CMP_STATIC static
- #define CMP_REFINOUT
- #define CMP_PTRINOUT
- #define CMP_INOUT inout
- #define CMP_OUT out
- #define CMP_IN in
- #define CMP_UNUSED(x) (x);
- #define CMP_UNROLL [unroll]
- #define CMP_SVGROUPINDEX :SV_GroupIndex
- #define CMP_SVGROUPID :SV_GroupID
- #define CMP_NUMTHREADS(x, y, z) [numthreads(x, y, z)]
- #else
- #define CMP_SVGROUPINDEX
- #define CMP_SVGROUPID
- #define CMP_NUMTHREADS(x, y, z)
- typedef enum
- {
- CGU_CORE_OK = 0, // No errors, call was successfull
- CGU_CORE_ERR_UNKOWN, // An unknown error occurred
- CGU_CORE_ERR_NEWMEM, // New Memory Allocation Failed
- CGU_CORE_ERR_INVALIDPTR, // The pointer value used is invalid or null
- CGU_CORE_ERR_RANGERED, // values for Red Channel is out of range (too high or too low)
- CGU_CORE_ERR_RANGEGREEN, // values for Green Channel is out of range (too high or too low)
- CGU_CORE_ERR_RANGEBLUE, // values for Blue Channel is out of range (too high or too low)
- } CGU_ERROR_CODES;
- #ifdef ASPM_OPENCL // GPU Based code using OpenCL
- // ==== Vectors ====
- typedef float2 CGU_Vec2f;
- typedef float2 CGV_Vec2f;
- typedef float3 CMP_Vec3f;
- typedef float3 CGU_Vec3f;
- typedef float3 CGV_Vec3f;
- typedef float4 CGU_Vec4f;
- typedef float4 CGV_Vec4f;
- typedef uchar3 CGU_Vec3uc;
- typedef uchar3 CGV_Vec3uc;
- typedef uchar4 CMP_Vec4uc;
- typedef uchar4 CGU_Vec4uc;
- typedef uchar4 CGV_Vec4uc;
- typedef int2 CGU_Vec2i;
- typedef int2 CGV_Vec2i;
- typedef int3 CGU_Vec3i;
- typedef int3 CGV_Vec3i;
- typedef int4 CGU_Vec4i;
- typedef int4 CGV_Vec4i;
- typedef uint2 CGU_Vec2ui;
- typedef uint2 CGV_Vec2ui;
- typedef uint3 CGU_Vec3ui;
- typedef uint3 CGV_Vec3ui;
- typedef uint4 CGU_Vec4ui;
- typedef uint4 CGV_Vec4ui;
- #define USE_BC7_SP_ERR_IDX
- #define BC7_ENCODECLASS
- #define ASPM_PRINT(args) printf args
- #define CMP_EXPORT
- #define INLINE
- #define uniform
- #define varying
- #define CMP_GLOBAL __global
- #define CMP_KERNEL __kernel
- #define CMP_CONSTANT __constant
- #define CMP_STATIC
- #define CMP_REFINOUT &
- #define CMP_PTRINOUT *
- #define CMP_INOUT
- #define CMP_OUT
- #define CMP_IN
- #define CMP_UNUSED(x)
- #define CMP_UNROLL
- typedef unsigned int CGU_DWORD; //32bits
- typedef int CGU_INT; //32bits
- typedef bool CGU_BOOL;
- typedef unsigned short CGU_SHORT; //16bits
- typedef float CGU_FLOAT;
- typedef half CGU_MIN16_FLOAT; // FP16 GPU support defaults to 32 bit if no HW support
- typedef unsigned int uint32; // need to remove this def
- typedef int CGV_INT;
- typedef unsigned int CGU_UINT;
- typedef int CGUV_INT;
- typedef int CGV_BOOL;
- typedef char CGU_INT8;
- typedef unsigned char CGU_UINT8;
- typedef short CGU_INT16;
- typedef unsigned short CGU_UINT16;
- typedef int CGU_INT32;
- typedef unsigned int CGU_UINT32;
- typedef unsigned long long CGU_UINT64;
- typedef char CGV_INT8;
- typedef unsigned char CGV_UINT8;
- typedef short CGV_INT16;
- typedef unsigned short CGV_UINT16;
- typedef int CGV_INT32;
- typedef unsigned int CGV_UINT32;
- typedef unsigned long CGV_UINT64;
- typedef float CGV_FLOAT;
- #define TRUE 1
- #define FALSE 0
- #define CMP_CDECL
- #else
- // CPU & ASPM definitions
- #define CMP_REFINOUT &
- #define CMP_PTRINOUT *
- #define CMP_INOUT
- #define CMP_OUT
- #define CMP_IN
- #define CMP_UNUSED(x) (void)(x);
- #define CMP_UNROLL
- #ifdef ASPM // SPMD ,SIMD CPU code
- // using hybrid (CPU/GPU) aspm compiler
- #define ASPM_PRINT(args) print args
- #define CMP_USE_FOREACH_ASPM
- #define __ASPM__
- #define BC7_ENCODECLASS
- #define USE_BC7_SP_ERR_IDX
- //#define USE_BC7_RAMP
- #define CMP_EXPORT export
- #define TRUE true
- #define FALSE false
- typedef uniform bool CGU_BOOL;
- typedef bool CGV_BOOL;
- typedef unsigned int8 uint8;
- typedef unsigned int16 uint16;
- typedef unsigned int32 uint32;
- typedef unsigned int64 uint64;
- typedef uniform float CGU_FLOAT;
- typedef varying float CGV_FLOAT;
- typedef uniform float CGU_MIN16_FLOAT;
- typedef uniform uint16 CGU_UINT16;
- typedef uniform uint8 CGU_UINT8;
- typedef varying uint8 CGV_UINT8;
- typedef uniform uint64 CGU_UINT64;
- typedef CGV_UINT8<4> CGV_Vec4uc;
- typedef CGU_UINT8<4> CGU_Vec4uc;
- typedef CGU_FLOAT<2> CGU_Vec2f;
- typedef CGV_FLOAT<2> CGV_Vec2f;
- typedef CGU_FLOAT<3> CGU_Vec3f;
- typedef CGV_FLOAT<3> CGV_Vec3f;
- typedef CGU_FLOAT<4> CGU_Vec4f;
- typedef CGV_FLOAT<4> CGV_Vec4f;
- typedef CGU_UINT32<3> CGU_Vec3ui;
- typedef CGV_UINT32<3> CGV_Vec3ui;
- typedef CGU_UINT32<4> CGU_Vec4ui;
- typedef CGV_UINT32<4> CGV_Vec4ui;
- #define CMP_CDECL
- #else // standard CPU code
- #include <stdio.h>
- #include <string>
- #include INC_cmp_math_vec4
- // using CPU compiler
- #define ASPM_PRINT(args) printf args
- #define USE_BC7_RAMP
- #define USE_BC7_SP_ERR_IDX
- #define CMP_EXPORT
- #define BC7_ENCODECLASS BC7_EncodeClass::
- #define TRUE 1
- #define FALSE 0
- #define uniform
- #define varying
- typedef char int8;
- typedef short int16;
- typedef int int32;
- typedef long long int64;
- typedef unsigned char uint8;
- typedef unsigned short uint16;
- typedef unsigned int uint32;
- typedef unsigned long long uint64;
- typedef int8 CGV_BOOL;
- typedef bool CGU_BOOL;
- typedef int16 CGU_WORD;
- typedef uint8 CGU_SHORT;
- typedef long CGU_LONG;
- typedef unsigned long CGU_ULONG;
- typedef uniform float CGU_FLOAT;
- typedef varying float CGV_FLOAT;
- typedef uniform float CGU_MIN16_FLOAT;
- typedef uniform uint8 CGU_UINT8;
- typedef varying uint8 CGV_UINT8;
- typedef uniform uint16 CGU_UINT16;
- typedef CMP_Vec3ui CGU_Vec3ui;
- typedef CMP_Vec3ui CGV_Vec3ui;
- typedef CMP_Vec2f CGU_Vec2f;
- typedef CMP_Vec3f CGU_Vec3f;
- typedef CMP_Vec4uc CGU_Vec4uc;
- typedef CMP_Vec4uc CGV_Vec4uc;
- typedef CMP_Vec4i CGU_Vec4i;
- typedef CMP_Vec4ui CGU_Vec4ui;
- typedef CMP_Vec4ui CGV_Vec4ui;
- typedef CMP_Vec4f CGU_Vec4f;
- typedef CMP_Vec4f CGV_Vec4f;
- #if defined(WIN32) || defined(_WIN64)
- #define CMP_CDECL __cdecl
- #else
- #define CMP_CDECL
- #endif
- #endif
- // Common CPU & ASPM definitions
- #define CMP_ASSERT(arg)
- #define CMP_GLOBAL
- #define CMP_KERNEL
- #define __local const
- #define __constant const
- #define CMP_CONSTANT const
- #define INLINE inline
- #define CMP_STATIC static
- typedef uniform int32 CGU_DWORD;
- typedef uniform uint8 CGU_UBYTE;
- typedef uniform int CGU_INT;
- typedef uniform int8 CGU_INT8;
- typedef uniform int16 CGU_INT16;
- typedef uniform uint16 CGU_UINT16;
- typedef uniform int32 CGU_INT32;
- typedef uniform uint32 CGU_UINT32;
- typedef uniform uint64 CGU_UINT64;
- typedef int CGV_INT;
- typedef int8 CGV_INT8;
- typedef int16 CGV_INT16;
- typedef int32 CGV_INT32;
- typedef uint16 CGV_UINT16;
- typedef uint32 CGV_UINT32;
- typedef uint64 CGV_UINT64;
- #endif // else ASPM_GPU
- #define CMP_UNIFORM uniform
- #define CMP_VARYING varying
- typedef struct
- {
- CGU_UINT32 m_src_width;
- CGU_UINT32 m_src_height;
- CGU_UINT32 m_width_in_blocks;
- CGU_UINT32 m_height_in_blocks;
- CGU_FLOAT m_fquality;
- } Source_Info;
- typedef unsigned char* CGU_PTR;
- // Ref Compute_CPU_HPC
- struct texture_surface
- {
- CGU_PTR ptr;
- CGU_INT width, height, stride;
- CGU_INT channels;
- };
- #endif // else ASPM_HLSL
- #endif // USE CMP defines
- //=======================================
- // using FidelityFX Code
- //=======================================
- #ifdef USE_CMP_FIDELITY_FX_H
- // ==================================================================================================
- // [A] SHADER PORTABILITY 1.20190530
- // ==================================================================================================
- // ABOUT
- // =====
- // Common central point for high-level shading language and C portability for various shader headers.
- //---------------------------------------------------------------------------------------------------
- // DEFINES TYPES FOR CMP AND FIDELITY FX
- // Both ASPM_ and A_ types are interchanable in code, the table below show compatibility between types
- // ==================================================================================================
- // Compressonator Fidelity FX Comments
- // ASPM_CPU A_CPU Include the CPU related code.
- // ASPM_GPU A_GPU Include the GPU related code.
- // ASPM_GLSL A_GLS Using GLSL.
- // ASMP_HLSL A_HLS Using HLSL.
- // - A_GCC Using a GCC compatible compiler (else assume MSVC compatible compiler by default).
- // =======
- // CGU_UINT8 A_BYTE Support 8-bit integer.
- // CGU_HALF A_HALF Support 16-bit integer and floating point.
- // A_LONG Support 64-bit integer. (GLSL & CPU only)
- // A_DUBL Support 64-bit floating point.
- // =======
- // A_WAVE Support wave-wide operations.
- //--------------------------------------------------------------------------------------------------
- // To get #include "common_def.h" working in GLSL use '#extension GL_GOOGLE_include_directive:require'
- //---------------------------------------------------------------------------------------------------
- // SIMPLIFIED TYPE SYSTEM FOR FX CODE
- // ==================================================================================================
- // - All ints will be unsigned with exception of when signed is required.
- // - Type naming simplified and shortened "A<type><#components>",
- // - H = 16-bit float (half)
- // - F = 32-bit float (float)
- // - D = 64-bit float (double)
- // - P = 1-bit integer (predicate, not using bool because 'B' is used for byte)
- // - B = 8-bit integer (byte)
- // - W = 16-bit integer (word)
- // - U = 32-bit integer (unsigned)
- // - L = 64-bit integer (long)
- // - Using "AS<type><#components>" for signed when required.
- //---------------------------------------------------------------------------------------------------
- // TODO
- // ====
- // - Make sure 'ALerp*(a,b,m)' does 'b*m+(-a*m+a)' (2 ops).
- // - Add subgroup ops.
- //------------------------------------------------------------------------------------------------------------------------------
- // CHANGE LOG
- // ==========
- // 20210518 - Merged CMP Common_def.h with ffx_a.h
- //==============================================================================================================================
- #define A_2PI 6.28318530718 // 2xPI
- //==============================================================================================================================
- // CPU
- //==============================================================================================================================
- // This provides a minimum subset of functionality compared to the GPU parts.
- //==============================================================================================================================
- #if defined(A_CPU) || !(defined(ASPM_GPU) || defined(ASPM_HLSL) || defined(ASPM_OPENCL))
- #include "stdint.h"
- // Supporting user defined overrides.
- #ifndef A_RESTRICT
- #define A_RESTRICT __restrict // CMP_RESTRICT
- #endif
- //------------------------------------------------------------------------------------------------------------------------------
- #ifndef A_STATIC
- #define A_STATIC static // CMP_STATIC
- #endif
- //------------------------------------------------------------------------------------------------------------------------------
- // Same types across CPU and GPU.
- // Predicate uses 32-bit integer (C friendly bool).
- typedef uint32_t AP1; // CGU_UINT32
- typedef float AF1; // CGU_FLOAT
- typedef double AD1; // CGU_DOUBLE
- typedef uint8_t AB1; // CGU_UINT8
- typedef uint16_t AW1; // CGU_UINT16
- typedef uint32_t AU1; // CGU_UINT32
- typedef uint64_t AL1; // CGU_UINT64
- typedef int8_t ASB1; // CGU_INT8
- typedef int16_t ASW1; // CGU_INT16
- typedef int32_t ASU1; // CGU_INT32
- typedef int64_t ASL1; // CGU_INT64
- //------------------------------------------------------------------------------------------------------------------------------
- #define AD1_(a) ((AD1)(a))
- #define AF1_(a) ((AF1)(a))
- #define AL1_(a) ((AL1)(a))
- #define AU1_(a) ((AU1)(a))
- //------------------------------------------------------------------------------------------------------------------------------
- #define ASL1_(a) ((ASL1)(a))
- #define ASU1_(a) ((ASU1)(a))
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC AU1 AU1_AF1(AF1 a){union{AF1 f;AU1 u;}bits;bits.f=a;return bits.u;}
- //------------------------------------------------------------------------------------------------------------------------------
- #define A_TRUE 1
- #define A_FALSE 0
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- //
- // CPU/GPU PORTING
- //
- //------------------------------------------------------------------------------------------------------------------------------
- // Hackary to get CPU and GPU to share all setup code, without duplicate code paths.
- // Unfortunately this is the level of "ugly" that is required since the languages are very different.
- // This uses a lower-case prefix for special vector constructs.
- // - In C restrict pointers are used.
- // - In the shading language, in/inout/out arguments are used.
- // This depends on the ability to access a vector value in both languages via array syntax (aka color[2]).
- //==============================================================================================================================
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // VECTOR ARGUMENT/RETURN/INITIALIZATION PORTABILITY
- //==============================================================================================================================
- #define retAD2 AD1 *A_RESTRICT
- #define retAD3 AD1 *A_RESTRICT
- #define retAD4 AD1 *A_RESTRICT
- #define retAF2 AF1 *A_RESTRICT
- #define retAF3 AF1 *A_RESTRICT
- #define retAF4 AF1 *A_RESTRICT
- #define retAL2 AL1 *A_RESTRICT
- #define retAL3 AL1 *A_RESTRICT
- #define retAL4 AL1 *A_RESTRICT
- #define retAU2 AU1 *A_RESTRICT
- #define retAU3 AU1 *A_RESTRICT
- #define retAU4 AU1 *A_RESTRICT
- //------------------------------------------------------------------------------------------------------------------------------
- #define inAD2 AD1 *A_RESTRICT
- #define inAD3 AD1 *A_RESTRICT
- #define inAD4 AD1 *A_RESTRICT
- #define inAF2 AF1 *A_RESTRICT
- #define inAF3 AF1 *A_RESTRICT
- #define inAF4 AF1 *A_RESTRICT
- #define inAL2 AL1 *A_RESTRICT
- #define inAL3 AL1 *A_RESTRICT
- #define inAL4 AL1 *A_RESTRICT
- #define inAU2 AU1 *A_RESTRICT
- #define inAU3 AU1 *A_RESTRICT
- #define inAU4 AU1 *A_RESTRICT
- //------------------------------------------------------------------------------------------------------------------------------
- #define inoutAD2 AD1 *A_RESTRICT
- #define inoutAD3 AD1 *A_RESTRICT
- #define inoutAD4 AD1 *A_RESTRICT
- #define inoutAF2 AF1 *A_RESTRICT
- #define inoutAF3 AF1 *A_RESTRICT
- #define inoutAF4 AF1 *A_RESTRICT
- #define inoutAL2 AL1 *A_RESTRICT
- #define inoutAL3 AL1 *A_RESTRICT
- #define inoutAL4 AL1 *A_RESTRICT
- #define inoutAU2 AU1 *A_RESTRICT
- #define inoutAU3 AU1 *A_RESTRICT
- #define inoutAU4 AU1 *A_RESTRICT
- //------------------------------------------------------------------------------------------------------------------------------
- #define outAD2 AD1 *A_RESTRICT
- #define outAD3 AD1 *A_RESTRICT
- #define outAD4 AD1 *A_RESTRICT
- #define outAF2 AF1 *A_RESTRICT
- #define outAF3 AF1 *A_RESTRICT
- #define outAF4 AF1 *A_RESTRICT
- #define outAL2 AL1 *A_RESTRICT
- #define outAL3 AL1 *A_RESTRICT
- #define outAL4 AL1 *A_RESTRICT
- #define outAU2 AU1 *A_RESTRICT
- #define outAU3 AU1 *A_RESTRICT
- #define outAU4 AU1 *A_RESTRICT
- //------------------------------------------------------------------------------------------------------------------------------
- #define varAD2(x) AD1 x[2]
- #define varAD3(x) AD1 x[3]
- #define varAD4(x) AD1 x[4]
- #define varAF2(x) AF1 x[2]
- #define varAF3(x) AF1 x[3]
- #define varAF4(x) AF1 x[4]
- #define varAL2(x) AL1 x[2]
- #define varAL3(x) AL1 x[3]
- #define varAL4(x) AL1 x[4]
- #define varAU2(x) AU1 x[2]
- #define varAU3(x) AU1 x[3]
- #define varAU4(x) AU1 x[4]
- //------------------------------------------------------------------------------------------------------------------------------
- #define initAD2(x,y) {x,y}
- #define initAD3(x,y,z) {x,y,z}
- #define initAD4(x,y,z,w) {x,y,z,w}
- #define initAF2(x,y) {x,y}
- #define initAF3(x,y,z) {x,y,z}
- #define initAF4(x,y,z,w) {x,y,z,w}
- #define initAL2(x,y) {x,y}
- #define initAL3(x,y,z) {x,y,z}
- #define initAL4(x,y,z,w) {x,y,z,w}
- #define initAU2(x,y) {x,y}
- #define initAU3(x,y,z) {x,y,z}
- #define initAU4(x,y,z,w) {x,y,z,w}
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // SCALAR RETURN OPS
- //------------------------------------------------------------------------------------------------------------------------------
- // TODO
- // ====
- // - Replace transcendentals with manual versions.
- //==============================================================================================================================
- #ifdef A_GCC
- A_STATIC AD1 AAbsD1(AD1 a){return __builtin_fabs(a);}
- A_STATIC AF1 AAbsF1(AF1 a){return __builtin_fabsf(a);}
- A_STATIC AU1 AAbsSU1(AU1 a){return AU1_(__builtin_abs(ASU1_(a)));}
- A_STATIC AL1 AAbsSL1(AL1 a){return AL1_(__builtin_labs(ASL1_(a)));}
- #else
- A_STATIC AD1 AAbsD1(AD1 a){return fabs(a);}
- A_STATIC AF1 AAbsF1(AF1 a){return fabsf(a);}
- A_STATIC AU1 AAbsSU1(AU1 a){return AU1_(abs(ASU1_(a)));}
- A_STATIC AL1 AAbsSL1(AL1 a){return AL1_(llabs(ASL1_(a)));}
- #endif
- //------------------------------------------------------------------------------------------------------------------------------
- #ifdef A_GCC
- A_STATIC AD1 ACosD1(AD1 a){return __builtin_cos(a);}
- A_STATIC AF1 ACosF1(AF1 a){return __builtin_cosf(a);}
- #else
- A_STATIC AD1 ACosD1(AD1 a){return cos(a);}
- A_STATIC AF1 ACosF1(AF1 a){return cosf(a);}
- #endif
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC AD1 ADotD2(inAD2 a,inAD2 b){return a[0]*b[0]+a[1]*b[1];}
- A_STATIC AD1 ADotD3(inAD3 a,inAD3 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];}
- A_STATIC AD1 ADotD4(inAD4 a,inAD4 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3];}
- A_STATIC AF1 ADotF2(inAF2 a,inAF2 b){return a[0]*b[0]+a[1]*b[1];}
- A_STATIC AF1 ADotF3(inAF3 a,inAF3 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];}
- A_STATIC AF1 ADotF4(inAF4 a,inAF4 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3];}
- //------------------------------------------------------------------------------------------------------------------------------
- #ifdef A_GCC
- A_STATIC AD1 AExp2D1(AD1 a){return __builtin_exp2(a);}
- A_STATIC AF1 AExp2F1(AF1 a){return __builtin_exp2f(a);}
- #else
- A_STATIC AD1 AExp2D1(AD1 a){return exp2(a);}
- A_STATIC AF1 AExp2F1(AF1 a){return exp2f(a);}
- #endif
- //------------------------------------------------------------------------------------------------------------------------------
- #ifdef A_GCC
- A_STATIC AD1 AFloorD1(AD1 a){return __builtin_floor(a);}
- A_STATIC AF1 AFloorF1(AF1 a){return __builtin_floorf(a);}
- #else
- A_STATIC AD1 AFloorD1(AD1 a){return floor(a);}
- A_STATIC AF1 AFloorF1(AF1 a){return floorf(a);}
- #endif
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC AD1 ALerpD1(AD1 a,AD1 b,AD1 c){return b*c+(-a*c+a);}
- A_STATIC AF1 ALerpF1(AF1 a,AF1 b,AF1 c){return b*c+(-a*c+a);}
- //------------------------------------------------------------------------------------------------------------------------------
- #ifdef A_GCC
- A_STATIC AD1 ALog2D1(AD1 a){return __builtin_log2(a);}
- A_STATIC AF1 ALog2F1(AF1 a){return __builtin_log2f(a);}
- #else
- A_STATIC AD1 ALog2D1(AD1 a){return log2(a);}
- A_STATIC AF1 ALog2F1(AF1 a){return log2f(a);}
- #endif
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC AD1 AMaxD1(AD1 a,AD1 b){return a>b?a:b;}
- A_STATIC AF1 AMaxF1(AF1 a,AF1 b){return a>b?a:b;}
- A_STATIC AL1 AMaxL1(AL1 a,AL1 b){return a>b?a:b;}
- A_STATIC AU1 AMaxU1(AU1 a,AU1 b){return a>b?a:b;}
- //------------------------------------------------------------------------------------------------------------------------------
- // These follow the convention that A integer types don't have signage, until they are operated on.
- A_STATIC AL1 AMaxSL1(AL1 a,AL1 b){return (ASL1_(a)>ASL1_(b))?a:b;}
- A_STATIC AU1 AMaxSU1(AU1 a,AU1 b){return (ASU1_(a)>ASU1_(b))?a:b;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC AD1 AMinD1(AD1 a,AD1 b){return a<b?a:b;}
- A_STATIC AF1 AMinF1(AF1 a,AF1 b){return a<b?a:b;}
- A_STATIC AL1 AMinL1(AL1 a,AL1 b){return a<b?a:b;}
- A_STATIC AU1 AMinU1(AU1 a,AU1 b){return a<b?a:b;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC AL1 AMinSL1(AL1 a,AL1 b){return (ASL1_(a)<ASL1_(b))?a:b;}
- A_STATIC AU1 AMinSU1(AU1 a,AU1 b){return (ASU1_(a)<ASU1_(b))?a:b;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC AD1 ARcpD1(AD1 a){return 1.0/a;}
- A_STATIC AF1 ARcpF1(AF1 a){return 1.0f/a;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC AL1 AShrSL1(AL1 a,AL1 b){return AL1_(ASL1_(a)>>ASL1_(b));}
- A_STATIC AU1 AShrSU1(AU1 a,AU1 b){return AU1_(ASU1_(a)>>ASU1_(b));}
- //------------------------------------------------------------------------------------------------------------------------------
- #ifdef A_GCC
- A_STATIC AD1 ASinD1(AD1 a){return __builtin_sin(a);}
- A_STATIC AF1 ASinF1(AF1 a){return __builtin_sinf(a);}
- #else
- A_STATIC AD1 ASinD1(AD1 a){return sin(a);}
- A_STATIC AF1 ASinF1(AF1 a){return sinf(a);}
- #endif
- //------------------------------------------------------------------------------------------------------------------------------
- #ifdef A_GCC
- A_STATIC AD1 ASqrtD1(AD1 a){return __builtin_sqrt(a);}
- A_STATIC AF1 ASqrtF1(AF1 a){return __builtin_sqrtf(a);}
- #else
- A_STATIC AD1 ASqrtD1(AD1 a){return sqrt(a);}
- A_STATIC AF1 ASqrtF1(AF1 a){return sqrtf(a);}
- #endif
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // SCALAR RETURN OPS - DEPENDENT
- //==============================================================================================================================
- A_STATIC AD1 AFractD1(AD1 a){return a-AFloorD1(a);}
- A_STATIC AF1 AFractF1(AF1 a){return a-AFloorF1(a);}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC AD1 APowD1(AD1 a,AD1 b){return AExp2D1(b*ALog2D1(a));}
- A_STATIC AF1 APowF1(AF1 a,AF1 b){return AExp2F1(b*ALog2F1(a));}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC AD1 ARsqD1(AD1 a){return ARcpD1(ASqrtD1(a));}
- A_STATIC AF1 ARsqF1(AF1 a){return ARcpF1(ASqrtF1(a));}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC AD1 ASatD1(AD1 a){return AMinD1(1.0,AMaxD1(0.0,a));}
- A_STATIC AF1 ASatF1(AF1 a){return AMinF1(1.0f,AMaxF1(0.0f,a));}
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // VECTOR OPS
- //------------------------------------------------------------------------------------------------------------------------------
- // These are added as needed for production or prototyping, so not necessarily a complete set.
- // They follow a convention of taking in a destination and also returning the destination value to increase utility.
- //==============================================================================================================================
- A_STATIC retAD2 opAAbsD2(outAD2 d,inAD2 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);return d;}
- A_STATIC retAD3 opAAbsD3(outAD3 d,inAD3 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);d[2]=AAbsD1(a[2]);return d;}
- A_STATIC retAD4 opAAbsD4(outAD4 d,inAD4 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);d[2]=AAbsD1(a[2]);d[3]=AAbsD1(a[3]);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC retAF2 opAAbsF2(outAF2 d,inAF2 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);return d;}
- A_STATIC retAF3 opAAbsF3(outAF3 d,inAF3 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);d[2]=AAbsF1(a[2]);return d;}
- A_STATIC retAF4 opAAbsF4(outAF4 d,inAF4 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);d[2]=AAbsF1(a[2]);d[3]=AAbsF1(a[3]);return d;}
- //==============================================================================================================================
- A_STATIC retAD2 opAAddD2(outAD2 d,inAD2 a,inAD2 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];return d;}
- A_STATIC retAD3 opAAddD3(outAD3 d,inAD3 a,inAD3 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];return d;}
- A_STATIC retAD4 opAAddD4(outAD4 d,inAD4 a,inAD4 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];d[3]=a[3]+b[3];return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC retAF2 opAAddF2(outAF2 d,inAF2 a,inAF2 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];return d;}
- A_STATIC retAF3 opAAddF3(outAF3 d,inAF3 a,inAF3 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];return d;}
- A_STATIC retAF4 opAAddF4(outAF4 d,inAF4 a,inAF4 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];d[3]=a[3]+b[3];return d;}
- //==============================================================================================================================
- A_STATIC retAD2 opACpyD2(outAD2 d,inAD2 a){d[0]=a[0];d[1]=a[1];return d;}
- A_STATIC retAD3 opACpyD3(outAD3 d,inAD3 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];return d;}
- A_STATIC retAD4 opACpyD4(outAD4 d,inAD4 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];d[3]=a[3];return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC retAF2 opACpyF2(outAF2 d,inAF2 a){d[0]=a[0];d[1]=a[1];return d;}
- A_STATIC retAF3 opACpyF3(outAF3 d,inAF3 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];return d;}
- A_STATIC retAF4 opACpyF4(outAF4 d,inAF4 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];d[3]=a[3];return d;}
- //==============================================================================================================================
- A_STATIC retAD2 opALerpD2(outAD2 d,inAD2 a,inAD2 b,inAD2 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);return d;}
- A_STATIC retAD3 opALerpD3(outAD3 d,inAD3 a,inAD3 b,inAD3 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);d[2]=ALerpD1(a[2],b[2],c[2]);return d;}
- A_STATIC retAD4 opALerpD4(outAD4 d,inAD4 a,inAD4 b,inAD4 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);d[2]=ALerpD1(a[2],b[2],c[2]);d[3]=ALerpD1(a[3],b[3],c[3]);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC retAF2 opALerpF2(outAF2 d,inAF2 a,inAF2 b,inAF2 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);return d;}
- A_STATIC retAF3 opALerpF3(outAF3 d,inAF3 a,inAF3 b,inAF3 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);d[2]=ALerpF1(a[2],b[2],c[2]);return d;}
- A_STATIC retAF4 opALerpF4(outAF4 d,inAF4 a,inAF4 b,inAF4 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);d[2]=ALerpF1(a[2],b[2],c[2]);d[3]=ALerpF1(a[3],b[3],c[3]);return d;}
- //==============================================================================================================================
- A_STATIC retAD2 opALerpOneD2(outAD2 d,inAD2 a,inAD2 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);return d;}
- A_STATIC retAD3 opALerpOneD3(outAD3 d,inAD3 a,inAD3 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);d[2]=ALerpD1(a[2],b[2],c);return d;}
- A_STATIC retAD4 opALerpOneD4(outAD4 d,inAD4 a,inAD4 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);d[2]=ALerpD1(a[2],b[2],c);d[3]=ALerpD1(a[3],b[3],c);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC retAF2 opALerpOneF2(outAF2 d,inAF2 a,inAF2 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);return d;}
- A_STATIC retAF3 opALerpOneF3(outAF3 d,inAF3 a,inAF3 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);d[2]=ALerpF1(a[2],b[2],c);return d;}
- A_STATIC retAF4 opALerpOneF4(outAF4 d,inAF4 a,inAF4 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);d[2]=ALerpF1(a[2],b[2],c);d[3]=ALerpF1(a[3],b[3],c);return d;}
- //==============================================================================================================================
- A_STATIC retAD2 opAMaxD2(outAD2 d,inAD2 a,inAD2 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);return d;}
- A_STATIC retAD3 opAMaxD3(outAD3 d,inAD3 a,inAD3 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);d[2]=AMaxD1(a[2],b[2]);return d;}
- A_STATIC retAD4 opAMaxD4(outAD4 d,inAD4 a,inAD4 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);d[2]=AMaxD1(a[2],b[2]);d[3]=AMaxD1(a[3],b[3]);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC retAF2 opAMaxF2(outAF2 d,inAF2 a,inAF2 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);return d;}
- A_STATIC retAF3 opAMaxF3(outAF3 d,inAF3 a,inAF3 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);d[2]=AMaxF1(a[2],b[2]);return d;}
- A_STATIC retAF4 opAMaxF4(outAF4 d,inAF4 a,inAF4 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);d[2]=AMaxF1(a[2],b[2]);d[3]=AMaxF1(a[3],b[3]);return d;}
- //==============================================================================================================================
- A_STATIC retAD2 opAMinD2(outAD2 d,inAD2 a,inAD2 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);return d;}
- A_STATIC retAD3 opAMinD3(outAD3 d,inAD3 a,inAD3 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);d[2]=AMinD1(a[2],b[2]);return d;}
- A_STATIC retAD4 opAMinD4(outAD4 d,inAD4 a,inAD4 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);d[2]=AMinD1(a[2],b[2]);d[3]=AMinD1(a[3],b[3]);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC retAF2 opAMinF2(outAF2 d,inAF2 a,inAF2 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);return d;}
- A_STATIC retAF3 opAMinF3(outAF3 d,inAF3 a,inAF3 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);d[2]=AMinF1(a[2],b[2]);return d;}
- A_STATIC retAF4 opAMinF4(outAF4 d,inAF4 a,inAF4 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);d[2]=AMinF1(a[2],b[2]);d[3]=AMinF1(a[3],b[3]);return d;}
- //==============================================================================================================================
- A_STATIC retAD2 opAMulD2(outAD2 d,inAD2 a,inAD2 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];return d;}
- A_STATIC retAD3 opAMulD3(outAD3 d,inAD3 a,inAD3 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];return d;}
- A_STATIC retAD4 opAMulD4(outAD4 d,inAD4 a,inAD4 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];d[3]=a[3]*b[3];return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC retAF2 opAMulF2(outAF2 d,inAF2 a,inAF2 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];return d;}
- A_STATIC retAF3 opAMulF3(outAF3 d,inAF3 a,inAF3 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];return d;}
- A_STATIC retAF4 opAMulF4(outAF4 d,inAF4 a,inAF4 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];d[3]=a[3]*b[3];return d;}
- //==============================================================================================================================
- A_STATIC retAD2 opAMulOneD2(outAD2 d,inAD2 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;return d;}
- A_STATIC retAD3 opAMulOneD3(outAD3 d,inAD3 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;return d;}
- A_STATIC retAD4 opAMulOneD4(outAD4 d,inAD4 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;d[3]=a[3]*b;return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC retAF2 opAMulOneF2(outAF2 d,inAF2 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;return d;}
- A_STATIC retAF3 opAMulOneF3(outAF3 d,inAF3 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;return d;}
- A_STATIC retAF4 opAMulOneF4(outAF4 d,inAF4 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;d[3]=a[3]*b;return d;}
- //==============================================================================================================================
- A_STATIC retAD2 opANegD2(outAD2 d,inAD2 a){d[0]=-a[0];d[1]=-a[1];return d;}
- A_STATIC retAD3 opANegD3(outAD3 d,inAD3 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];return d;}
- A_STATIC retAD4 opANegD4(outAD4 d,inAD4 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];d[3]=-a[3];return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC retAF2 opANegF2(outAF2 d,inAF2 a){d[0]=-a[0];d[1]=-a[1];return d;}
- A_STATIC retAF3 opANegF3(outAF3 d,inAF3 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];return d;}
- A_STATIC retAF4 opANegF4(outAF4 d,inAF4 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];d[3]=-a[3];return d;}
- //==============================================================================================================================
- A_STATIC retAD2 opARcpD2(outAD2 d,inAD2 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);return d;}
- A_STATIC retAD3 opARcpD3(outAD3 d,inAD3 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);d[2]=ARcpD1(a[2]);return d;}
- A_STATIC retAD4 opARcpD4(outAD4 d,inAD4 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);d[2]=ARcpD1(a[2]);d[3]=ARcpD1(a[3]);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- A_STATIC retAF2 opARcpF2(outAF2 d,inAF2 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);return d;}
- A_STATIC retAF3 opARcpF3(outAF3 d,inAF3 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);d[2]=ARcpF1(a[2]);return d;}
- A_STATIC retAF4 opARcpF4(outAF4 d,inAF4 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);d[2]=ARcpF1(a[2]);d[3]=ARcpF1(a[3]);return d;}
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // HALF FLOAT PACKING
- //==============================================================================================================================
- // Convert float to half (in lower 16-bits of output).
- // Same fast technique as documented here: ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf
- // Supports denormals.
- // Conversion rules are to make computations possibly "safer" on the GPU,
- // -INF & -NaN -> -65504
- // +INF & +NaN -> +65504
- A_STATIC AU1 AU1_AH1_AF1(AF1 f){
- static AW1 base[512]={
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,
- 0x0200,0x0400,0x0800,0x0c00,0x1000,0x1400,0x1800,0x1c00,0x2000,0x2400,0x2800,0x2c00,0x3000,0x3400,0x3800,0x3c00,
- 0x4000,0x4400,0x4800,0x4c00,0x5000,0x5400,0x5800,0x5c00,0x6000,0x6400,0x6800,0x6c00,0x7000,0x7400,0x7800,0x7bff,
- 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,
- 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,
- 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,
- 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,
- 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,
- 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,
- 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,
- 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
- 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
- 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
- 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
- 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
- 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
- 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8001,0x8002,0x8004,0x8008,0x8010,0x8020,0x8040,0x8080,0x8100,
- 0x8200,0x8400,0x8800,0x8c00,0x9000,0x9400,0x9800,0x9c00,0xa000,0xa400,0xa800,0xac00,0xb000,0xb400,0xb800,0xbc00,
- 0xc000,0xc400,0xc800,0xcc00,0xd000,0xd400,0xd800,0xdc00,0xe000,0xe400,0xe800,0xec00,0xf000,0xf400,0xf800,0xfbff,
- 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,
- 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,
- 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,
- 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,
- 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,
- 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,
- 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff};
- static AB1 shift[512]={
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,
- 0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,
- 0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,
- 0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,
- 0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
- 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18};
- union{AF1 f;AU1 u;}bits;bits.f=f;AU1 u=bits.u;AU1 i=u>>23;return (AU1)(base[i])+((u&0x7fffff)>>shift[i]);}
- //------------------------------------------------------------------------------------------------------------------------------
- // Used to output packed constant.
- A_STATIC AU1 AU1_AH2_AF2(inAF2 a){return AU1_AH1_AF1(a[0])+(AU1_AH1_AF1(a[1])<<16);}
- #endif
- //==============================================================================================================================
- // GLSL
- //==============================================================================================================================
- #if (defined(A_GLSL) && defined(A_GPU)) || (defined(ASPM_GLSL) && defined(ASPM_GPU))
- #ifndef A_SKIP_EXT
- #ifdef A_HALF
- #extension GL_EXT_shader_16bit_storage:require
- #extension GL_EXT_shader_explicit_arithmetic_types:require
- #endif
- //------------------------------------------------------------------------------------------------------------------------------
- #ifdef A_LONG
- #extension GL_ARB_gpu_shader_int64:require
- // TODO: Fixme to more portable extension!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- #extension GL_NV_shader_atomic_int64:require
- #endif
- //------------------------------------------------------------------------------------------------------------------------------
- #ifdef A_WAVE
- #extension GL_KHR_shader_subgroup_arithmetic:require
- #extension GL_KHR_shader_subgroup_ballot:require
- #extension GL_KHR_shader_subgroup_quad:require
- #extension GL_KHR_shader_subgroup_shuffle:require
- #endif
- #endif
- //==============================================================================================================================
- #define AP1 bool
- #define AP2 bvec2
- #define AP3 bvec3
- #define AP4 bvec4
- //------------------------------------------------------------------------------------------------------------------------------
- #define AF1 float
- #define AF2 vec2
- #define AF3 vec3
- #define AF4 vec4
- //------------------------------------------------------------------------------------------------------------------------------
- #define AU1 uint
- #define AU2 uvec2
- #define AU3 uvec3
- #define AU4 uvec4
- //------------------------------------------------------------------------------------------------------------------------------
- #define ASU1 int
- #define ASU2 ivec2
- #define ASU3 ivec3
- #define ASU4 ivec4
- //==============================================================================================================================
- #define AF1_AU1(x) uintBitsToFloat(AU1(x))
- #define AF2_AU2(x) uintBitsToFloat(AU2(x))
- #define AF3_AU3(x) uintBitsToFloat(AU3(x))
- #define AF4_AU4(x) uintBitsToFloat(AU4(x))
- //------------------------------------------------------------------------------------------------------------------------------
- #define AU1_AF1(x) floatBitsToUint(AF1(x))
- #define AU2_AF2(x) floatBitsToUint(AF2(x))
- #define AU3_AF3(x) floatBitsToUint(AF3(x))
- #define AU4_AF4(x) floatBitsToUint(AF4(x))
- //------------------------------------------------------------------------------------------------------------------------------
- #define AU1_AH2_AF2 packHalf2x16
- #define AU1_AW2Unorm_AF2 packUnorm2x16
- #define AU1_AB4Unorm_AF4 packUnorm4x8
- //------------------------------------------------------------------------------------------------------------------------------
- #define AF2_AH2_AU1 unpackHalf2x16
- #define AF2_AW2Unorm_AU1 unpackUnorm2x16
- #define AF4_AB4Unorm_AU1 unpackUnorm4x8
- //==============================================================================================================================
- AF1 AF1_x(AF1 a){return AF1(a);}
- AF2 AF2_x(AF1 a){return AF2(a,a);}
- AF3 AF3_x(AF1 a){return AF3(a,a,a);}
- AF4 AF4_x(AF1 a){return AF4(a,a,a,a);}
- #define AF1_(a) AF1_x(AF1(a))
- #define AF2_(a) AF2_x(AF1(a))
- #define AF3_(a) AF3_x(AF1(a))
- #define AF4_(a) AF4_x(AF1(a))
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AU1_x(AU1 a){return AU1(a);}
- AU2 AU2_x(AU1 a){return AU2(a,a);}
- AU3 AU3_x(AU1 a){return AU3(a,a,a);}
- AU4 AU4_x(AU1 a){return AU4(a,a,a,a);}
- #define AU1_(a) AU1_x(AU1(a))
- #define AU2_(a) AU2_x(AU1(a))
- #define AU3_(a) AU3_x(AU1(a))
- #define AU4_(a) AU4_x(AU1(a))
- //==============================================================================================================================
- AU1 AAbsSU1(AU1 a){return AU1(abs(ASU1(a)));}
- AU2 AAbsSU2(AU2 a){return AU2(abs(ASU2(a)));}
- AU3 AAbsSU3(AU3 a){return AU3(abs(ASU3(a)));}
- AU4 AAbsSU4(AU4 a){return AU4(abs(ASU4(a)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 ABfe(AU1 src,AU1 off,AU1 bits){return bitfieldExtract(src,ASU1(off),ASU1(bits));}
- AU1 ABfi(AU1 src,AU1 ins,AU1 mask){return (ins&mask)|(src&(~mask));}
- // Proxy for V_BFI_B32 where the 'mask' is set as 'bits', 'mask=(1<<bits)-1', and 'bits' needs to be an immediate.
- AU1 ABfiM(AU1 src,AU1 ins,AU1 bits){return bitfieldInsert(src,ins,0,ASU1(bits));}
- //------------------------------------------------------------------------------------------------------------------------------
- // V_FRACT_F32 (note DX frac() is different).
- AF1 AFractF1(AF1 x){return fract(x);}
- AF2 AFractF2(AF2 x){return fract(x);}
- AF3 AFractF3(AF3 x){return fract(x);}
- AF4 AFractF4(AF4 x){return fract(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 ALerpF1(AF1 x,AF1 y,AF1 a){return mix(x,y,a);}
- AF2 ALerpF2(AF2 x,AF2 y,AF2 a){return mix(x,y,a);}
- AF3 ALerpF3(AF3 x,AF3 y,AF3 a){return mix(x,y,a);}
- AF4 ALerpF4(AF4 x,AF4 y,AF4 a){return mix(x,y,a);}
- //------------------------------------------------------------------------------------------------------------------------------
- // V_MAX3_F32.
- AF1 AMax3F1(AF1 x,AF1 y,AF1 z){return max(x,max(y,z));}
- AF2 AMax3F2(AF2 x,AF2 y,AF2 z){return max(x,max(y,z));}
- AF3 AMax3F3(AF3 x,AF3 y,AF3 z){return max(x,max(y,z));}
- AF4 AMax3F4(AF4 x,AF4 y,AF4 z){return max(x,max(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMax3SU1(AU1 x,AU1 y,AU1 z){return AU1(max(ASU1(x),max(ASU1(y),ASU1(z))));}
- AU2 AMax3SU2(AU2 x,AU2 y,AU2 z){return AU2(max(ASU2(x),max(ASU2(y),ASU2(z))));}
- AU3 AMax3SU3(AU3 x,AU3 y,AU3 z){return AU3(max(ASU3(x),max(ASU3(y),ASU3(z))));}
- AU4 AMax3SU4(AU4 x,AU4 y,AU4 z){return AU4(max(ASU4(x),max(ASU4(y),ASU4(z))));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMax3U1(AU1 x,AU1 y,AU1 z){return max(x,max(y,z));}
- AU2 AMax3U2(AU2 x,AU2 y,AU2 z){return max(x,max(y,z));}
- AU3 AMax3U3(AU3 x,AU3 y,AU3 z){return max(x,max(y,z));}
- AU4 AMax3U4(AU4 x,AU4 y,AU4 z){return max(x,max(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMaxSU1(AU1 a,AU1 b){return AU1(max(ASU1(a),ASU1(b)));}
- AU2 AMaxSU2(AU2 a,AU2 b){return AU2(max(ASU2(a),ASU2(b)));}
- AU3 AMaxSU3(AU3 a,AU3 b){return AU3(max(ASU3(a),ASU3(b)));}
- AU4 AMaxSU4(AU4 a,AU4 b){return AU4(max(ASU4(a),ASU4(b)));}
- //------------------------------------------------------------------------------------------------------------------------------
- // Clamp has an easier pattern match for med3 when some ordering is known.
- // V_MED3_F32.
- AF1 AMed3F1(AF1 x,AF1 y,AF1 z){return max(min(x,y),min(max(x,y),z));}
- AF2 AMed3F2(AF2 x,AF2 y,AF2 z){return max(min(x,y),min(max(x,y),z));}
- AF3 AMed3F3(AF3 x,AF3 y,AF3 z){return max(min(x,y),min(max(x,y),z));}
- AF4 AMed3F4(AF4 x,AF4 y,AF4 z){return max(min(x,y),min(max(x,y),z));}
- //------------------------------------------------------------------------------------------------------------------------------
- // V_MIN3_F32.
- AF1 AMin3F1(AF1 x,AF1 y,AF1 z){return min(x,min(y,z));}
- AF2 AMin3F2(AF2 x,AF2 y,AF2 z){return min(x,min(y,z));}
- AF3 AMin3F3(AF3 x,AF3 y,AF3 z){return min(x,min(y,z));}
- AF4 AMin3F4(AF4 x,AF4 y,AF4 z){return min(x,min(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMin3SU1(AU1 x,AU1 y,AU1 z){return AU1(min(ASU1(x),min(ASU1(y),ASU1(z))));}
- AU2 AMin3SU2(AU2 x,AU2 y,AU2 z){return AU2(min(ASU2(x),min(ASU2(y),ASU2(z))));}
- AU3 AMin3SU3(AU3 x,AU3 y,AU3 z){return AU3(min(ASU3(x),min(ASU3(y),ASU3(z))));}
- AU4 AMin3SU4(AU4 x,AU4 y,AU4 z){return AU4(min(ASU4(x),min(ASU4(y),ASU4(z))));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMin3U1(AU1 x,AU1 y,AU1 z){return min(x,min(y,z));}
- AU2 AMin3U2(AU2 x,AU2 y,AU2 z){return min(x,min(y,z));}
- AU3 AMin3U3(AU3 x,AU3 y,AU3 z){return min(x,min(y,z));}
- AU4 AMin3U4(AU4 x,AU4 y,AU4 z){return min(x,min(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMinSU1(AU1 a,AU1 b){return AU1(min(ASU1(a),ASU1(b)));}
- AU2 AMinSU2(AU2 a,AU2 b){return AU2(min(ASU2(a),ASU2(b)));}
- AU3 AMinSU3(AU3 a,AU3 b){return AU3(min(ASU3(a),ASU3(b)));}
- AU4 AMinSU4(AU4 a,AU4 b){return AU4(min(ASU4(a),ASU4(b)));}
- //------------------------------------------------------------------------------------------------------------------------------
- // Normalized trig. Valid input domain is {-256 to +256}. No GLSL compiler intrinsic exists to map to this currently.
- // V_COS_F32.
- AF1 ANCosF1(AF1 x){return cos(x*AF1_(A_2PI));}
- AF2 ANCosF2(AF2 x){return cos(x*AF2_(A_2PI));}
- AF3 ANCosF3(AF3 x){return cos(x*AF3_(A_2PI));}
- AF4 ANCosF4(AF4 x){return cos(x*AF4_(A_2PI));}
- //------------------------------------------------------------------------------------------------------------------------------
- // Normalized trig. Valid input domain is {-256 to +256}. No GLSL compiler intrinsic exists to map to this currently.
- // V_SIN_F32.
- AF1 ANSinF1(AF1 x){return sin(x*AF1_(A_2PI));}
- AF2 ANSinF2(AF2 x){return sin(x*AF2_(A_2PI));}
- AF3 ANSinF3(AF3 x){return sin(x*AF3_(A_2PI));}
- AF4 ANSinF4(AF4 x){return sin(x*AF4_(A_2PI));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 ARcpF1(AF1 x){return AF1_(1.0)/x;}
- AF2 ARcpF2(AF2 x){return AF2_(1.0)/x;}
- AF3 ARcpF3(AF3 x){return AF3_(1.0)/x;}
- AF4 ARcpF4(AF4 x){return AF4_(1.0)/x;}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 ARsqF1(AF1 x){return AF1_(1.0)/sqrt(x);}
- AF2 ARsqF2(AF2 x){return AF2_(1.0)/sqrt(x);}
- AF3 ARsqF3(AF3 x){return AF3_(1.0)/sqrt(x);}
- AF4 ARsqF4(AF4 x){return AF4_(1.0)/sqrt(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 ASatF1(AF1 x){return clamp(x,AF1_(0.0),AF1_(1.0));}
- AF2 ASatF2(AF2 x){return clamp(x,AF2_(0.0),AF2_(1.0));}
- AF3 ASatF3(AF3 x){return clamp(x,AF3_(0.0),AF3_(1.0));}
- AF4 ASatF4(AF4 x){return clamp(x,AF4_(0.0),AF4_(1.0));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AShrSU1(AU1 a,AU1 b){return AU1(ASU1(a)>>ASU1(b));}
- AU2 AShrSU2(AU2 a,AU2 b){return AU2(ASU2(a)>>ASU2(b));}
- AU3 AShrSU3(AU3 a,AU3 b){return AU3(ASU3(a)>>ASU3(b));}
- AU4 AShrSU4(AU4 a,AU4 b){return AU4(ASU4(a)>>ASU4(b));}
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // GLSL BYTE
- //==============================================================================================================================
- #ifdef A_BYTE
- #define AB1 uint8_t
- #define AB2 u8vec2
- #define AB3 u8vec3
- #define AB4 u8vec4
- //------------------------------------------------------------------------------------------------------------------------------
- #define ASB1 int8_t
- #define ASB2 i8vec2
- #define ASB3 i8vec3
- #define ASB4 i8vec4
- //------------------------------------------------------------------------------------------------------------------------------
- AB1 AB1_x(AB1 a){return AB1(a);}
- AB2 AB2_x(AB1 a){return AB2(a,a);}
- AB3 AB3_x(AB1 a){return AB3(a,a,a);}
- AB4 AB4_x(AB1 a){return AB4(a,a,a,a);}
- #define AB1_(a) AB1_x(AB1(a))
- #define AB2_(a) AB2_x(AB1(a))
- #define AB3_(a) AB3_x(AB1(a))
- #define AB4_(a) AB4_x(AB1(a))
- #endif
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // GLSL HALF
- //==============================================================================================================================
- #ifdef A_HALF
- #define AH1 float16_t
- #define AH2 f16vec2
- #define AH3 f16vec3
- #define AH4 f16vec4
- //------------------------------------------------------------------------------------------------------------------------------
- #define AW1 uint16_t
- #define AW2 u16vec2
- #define AW3 u16vec3
- #define AW4 u16vec4
- //------------------------------------------------------------------------------------------------------------------------------
- #define ASW1 int16_t
- #define ASW2 i16vec2
- #define ASW3 i16vec3
- #define ASW4 i16vec4
- //==============================================================================================================================
- #define AH2_AU1(x) unpackFloat2x16(AU1(x))
- AH4 AH4_AU2_x(AU2 x){return AH4(unpackFloat2x16(x.x),unpackFloat2x16(x.y));}
- #define AH4_AU2(x) AH4_AU2_x(AU2(x))
- #define AW2_AU1(x) unpackUint2x16(AU1(x))
- #define AW4_AU2(x) unpackUint4x16(pack64(AU2(x)))
- //------------------------------------------------------------------------------------------------------------------------------
- #define AU1_AH2(x) packFloat2x16(AH2(x))
- AU2 AU2_AH4_x(AH4 x){return AU2(packFloat2x16(x.xy),packFloat2x16(x.zw));}
- #define AU2_AH4(x) AU2_AH4_x(AH4(x))
- #define AU1_AW2(x) packUint2x16(AW2(x))
- #define AU2_AW4(x) unpack32(packUint4x16(AW4(x)))
- //==============================================================================================================================
- #define AW1_AH1(x) halfBitsToUint16(AH1(x))
- #define AW2_AH2(x) halfBitsToUint16(AH2(x))
- #define AW3_AH3(x) halfBitsToUint16(AH3(x))
- #define AW4_AH4(x) halfBitsToUint16(AH4(x))
- //------------------------------------------------------------------------------------------------------------------------------
- #define AH1_AW1(x) uint16BitsToHalf(AW1(x))
- #define AH2_AW2(x) uint16BitsToHalf(AW2(x))
- #define AH3_AW3(x) uint16BitsToHalf(AW3(x))
- #define AH4_AW4(x) uint16BitsToHalf(AW4(x))
- //==============================================================================================================================
- AH1 AH1_x(AH1 a){return AH1(a);}
- AH2 AH2_x(AH1 a){return AH2(a,a);}
- AH3 AH3_x(AH1 a){return AH3(a,a,a);}
- AH4 AH4_x(AH1 a){return AH4(a,a,a,a);}
- #define AH1_(a) AH1_x(AH1(a))
- #define AH2_(a) AH2_x(AH1(a))
- #define AH3_(a) AH3_x(AH1(a))
- #define AH4_(a) AH4_x(AH1(a))
- //------------------------------------------------------------------------------------------------------------------------------
- AW1 AW1_x(AW1 a){return AW1(a);}
- AW2 AW2_x(AW1 a){return AW2(a,a);}
- AW3 AW3_x(AW1 a){return AW3(a,a,a);}
- AW4 AW4_x(AW1 a){return AW4(a,a,a,a);}
- #define AW1_(a) AW1_x(AW1(a))
- #define AW2_(a) AW2_x(AW1(a))
- #define AW3_(a) AW3_x(AW1(a))
- #define AW4_(a) AW4_x(AW1(a))
- //==============================================================================================================================
- AW1 AAbsSW1(AW1 a){return AW1(abs(ASW1(a)));}
- AW2 AAbsSW2(AW2 a){return AW2(abs(ASW2(a)));}
- AW3 AAbsSW3(AW3 a){return AW3(abs(ASW3(a)));}
- AW4 AAbsSW4(AW4 a){return AW4(abs(ASW4(a)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 AFractH1(AH1 x){return fract(x);}
- AH2 AFractH2(AH2 x){return fract(x);}
- AH3 AFractH3(AH3 x){return fract(x);}
- AH4 AFractH4(AH4 x){return fract(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 ALerpH1(AH1 x,AH1 y,AH1 a){return mix(x,y,a);}
- AH2 ALerpH2(AH2 x,AH2 y,AH2 a){return mix(x,y,a);}
- AH3 ALerpH3(AH3 x,AH3 y,AH3 a){return mix(x,y,a);}
- AH4 ALerpH4(AH4 x,AH4 y,AH4 a){return mix(x,y,a);}
- //------------------------------------------------------------------------------------------------------------------------------
- // No packed version of max3.
- AH1 AMax3H1(AH1 x,AH1 y,AH1 z){return max(x,max(y,z));}
- AH2 AMax3H2(AH2 x,AH2 y,AH2 z){return max(x,max(y,z));}
- AH3 AMax3H3(AH3 x,AH3 y,AH3 z){return max(x,max(y,z));}
- AH4 AMax3H4(AH4 x,AH4 y,AH4 z){return max(x,max(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AW1 AMaxSW1(AW1 a,AW1 b){return AW1(max(ASU1(a),ASU1(b)));}
- AW2 AMaxSW2(AW2 a,AW2 b){return AW2(max(ASU2(a),ASU2(b)));}
- AW3 AMaxSW3(AW3 a,AW3 b){return AW3(max(ASU3(a),ASU3(b)));}
- AW4 AMaxSW4(AW4 a,AW4 b){return AW4(max(ASU4(a),ASU4(b)));}
- //------------------------------------------------------------------------------------------------------------------------------
- // No packed version of min3.
- AH1 AMin3H1(AH1 x,AH1 y,AH1 z){return min(x,min(y,z));}
- AH2 AMin3H2(AH2 x,AH2 y,AH2 z){return min(x,min(y,z));}
- AH3 AMin3H3(AH3 x,AH3 y,AH3 z){return min(x,min(y,z));}
- AH4 AMin3H4(AH4 x,AH4 y,AH4 z){return min(x,min(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AW1 AMinSW1(AW1 a,AW1 b){return AW1(min(ASU1(a),ASU1(b)));}
- AW2 AMinSW2(AW2 a,AW2 b){return AW2(min(ASU2(a),ASU2(b)));}
- AW3 AMinSW3(AW3 a,AW3 b){return AW3(min(ASU3(a),ASU3(b)));}
- AW4 AMinSW4(AW4 a,AW4 b){return AW4(min(ASU4(a),ASU4(b)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 ARcpH1(AH1 x){return AH1_(1.0)/x;}
- AH2 ARcpH2(AH2 x){return AH2_(1.0)/x;}
- AH3 ARcpH3(AH3 x){return AH3_(1.0)/x;}
- AH4 ARcpH4(AH4 x){return AH4_(1.0)/x;}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 ARsqH1(AH1 x){return AH1_(1.0)/sqrt(x);}
- AH2 ARsqH2(AH2 x){return AH2_(1.0)/sqrt(x);}
- AH3 ARsqH3(AH3 x){return AH3_(1.0)/sqrt(x);}
- AH4 ARsqH4(AH4 x){return AH4_(1.0)/sqrt(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 ASatH1(AH1 x){return clamp(x,AH1_(0.0),AH1_(1.0));}
- AH2 ASatH2(AH2 x){return clamp(x,AH2_(0.0),AH2_(1.0));}
- AH3 ASatH3(AH3 x){return clamp(x,AH3_(0.0),AH3_(1.0));}
- AH4 ASatH4(AH4 x){return clamp(x,AH4_(0.0),AH4_(1.0));}
- //------------------------------------------------------------------------------------------------------------------------------
- AW1 AShrSW1(AW1 a,AW1 b){return AW1(ASW1(a)>>ASW1(b));}
- AW2 AShrSW2(AW2 a,AW2 b){return AW2(ASW2(a)>>ASW2(b));}
- AW3 AShrSW3(AW3 a,AW3 b){return AW3(ASW3(a)>>ASW3(b));}
- AW4 AShrSW4(AW4 a,AW4 b){return AW4(ASW4(a)>>ASW4(b));}
- #endif
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // GLSL DOUBLE
- //==============================================================================================================================
- #ifdef A_DUBL
- #define AD1 double
- #define AD2 dvec2
- #define AD3 dvec3
- #define AD4 dvec4
- //------------------------------------------------------------------------------------------------------------------------------
- AD1 AD1_x(AD1 a){return AD1(a);}
- AD2 AD2_x(AD1 a){return AD2(a,a);}
- AD3 AD3_x(AD1 a){return AD3(a,a,a);}
- AD4 AD4_x(AD1 a){return AD4(a,a,a,a);}
- #define AD1_(a) AD1_x(AD1(a))
- #define AD2_(a) AD2_x(AD1(a))
- #define AD3_(a) AD3_x(AD1(a))
- #define AD4_(a) AD4_x(AD1(a))
- //==============================================================================================================================
- AD1 AFractD1(AD1 x){return fract(x);}
- AD2 AFractD2(AD2 x){return fract(x);}
- AD3 AFractD3(AD3 x){return fract(x);}
- AD4 AFractD4(AD4 x){return fract(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AD1 ALerpD1(AD1 x,AD1 y,AD1 a){return mix(x,y,a);}
- AD2 ALerpD2(AD2 x,AD2 y,AD2 a){return mix(x,y,a);}
- AD3 ALerpD3(AD3 x,AD3 y,AD3 a){return mix(x,y,a);}
- AD4 ALerpD4(AD4 x,AD4 y,AD4 a){return mix(x,y,a);}
- //------------------------------------------------------------------------------------------------------------------------------
- AD1 ARcpD1(AD1 x){return AD1_(1.0)/x;}
- AD2 ARcpD2(AD2 x){return AD2_(1.0)/x;}
- AD3 ARcpD3(AD3 x){return AD3_(1.0)/x;}
- AD4 ARcpD4(AD4 x){return AD4_(1.0)/x;}
- //------------------------------------------------------------------------------------------------------------------------------
- AD1 ARsqD1(AD1 x){return AD1_(1.0)/sqrt(x);}
- AD2 ARsqD2(AD2 x){return AD2_(1.0)/sqrt(x);}
- AD3 ARsqD3(AD3 x){return AD3_(1.0)/sqrt(x);}
- AD4 ARsqD4(AD4 x){return AD4_(1.0)/sqrt(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AD1 ASatD1(AD1 x){return clamp(x,AD1_(0.0),AD1_(1.0));}
- AD2 ASatD2(AD2 x){return clamp(x,AD2_(0.0),AD2_(1.0));}
- AD3 ASatD3(AD3 x){return clamp(x,AD3_(0.0),AD3_(1.0));}
- AD4 ASatD4(AD4 x){return clamp(x,AD4_(0.0),AD4_(1.0));}
- #endif
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // GLSL LONG
- //==============================================================================================================================
- #ifdef A_LONG
- #define AL1 uint64_t
- #define AL2 u64vec2
- #define AL3 u64vec3
- #define AL4 u64vec4
- //------------------------------------------------------------------------------------------------------------------------------
- #define ASL1 int64_t
- #define ASL2 i64vec2
- #define ASL3 i64vec3
- #define ASL4 i64vec4
- //------------------------------------------------------------------------------------------------------------------------------
- #define AL1_AU2(x) packUint2x32(AU2(x))
- #define AU2_AL1(x) unpackUint2x32(AL1(x))
- //------------------------------------------------------------------------------------------------------------------------------
- AL1 AL1_x(AL1 a){return AL1(a);}
- AL2 AL2_x(AL1 a){return AL2(a,a);}
- AL3 AL3_x(AL1 a){return AL3(a,a,a);}
- AL4 AL4_x(AL1 a){return AL4(a,a,a,a);}
- #define AL1_(a) AL1_x(AL1(a))
- #define AL2_(a) AL2_x(AL1(a))
- #define AL3_(a) AL3_x(AL1(a))
- #define AL4_(a) AL4_x(AL1(a))
- //==============================================================================================================================
- AL1 AAbsSL1(AL1 a){return AL1(abs(ASL1(a)));}
- AL2 AAbsSL2(AL2 a){return AL2(abs(ASL2(a)));}
- AL3 AAbsSL3(AL3 a){return AL3(abs(ASL3(a)));}
- AL4 AAbsSL4(AL4 a){return AL4(abs(ASL4(a)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AL1 AMaxSL1(AL1 a,AL1 b){return AL1(max(ASU1(a),ASU1(b)));}
- AL2 AMaxSL2(AL2 a,AL2 b){return AL2(max(ASU2(a),ASU2(b)));}
- AL3 AMaxSL3(AL3 a,AL3 b){return AL3(max(ASU3(a),ASU3(b)));}
- AL4 AMaxSL4(AL4 a,AL4 b){return AL4(max(ASU4(a),ASU4(b)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AL1 AMinSL1(AL1 a,AL1 b){return AL1(min(ASU1(a),ASU1(b)));}
- AL2 AMinSL2(AL2 a,AL2 b){return AL2(min(ASU2(a),ASU2(b)));}
- AL3 AMinSL3(AL3 a,AL3 b){return AL3(min(ASU3(a),ASU3(b)));}
- AL4 AMinSL4(AL4 a,AL4 b){return AL4(min(ASU4(a),ASU4(b)));}
- #endif
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // WAVE OPERATIONS
- //==============================================================================================================================
- #ifdef A_WAVE
- AF1 AWaveAdd(AF1 v){return subgroupAdd(v);}
- AF2 AWaveAdd(AF2 v){return subgroupAdd(v);}
- AF3 AWaveAdd(AF3 v){return subgroupAdd(v);}
- AF4 AWaveAdd(AF4 v){return subgroupAdd(v);}
- #endif
- //==============================================================================================================================
- #endif
- //==============================================================================================================================
- // HLSL
- //==============================================================================================================================
- #if (defined(A_HLSL) && defined(A_GPU)) || (defined(ASPM_HLSL) && defined(ASPM_GPU))
- #define AP1 bool
- #define AP2 bool2
- #define AP3 bool3
- #define AP4 bool4
- //------------------------------------------------------------------------------------------------------------------------------
- #define AF1 float
- #define AF2 float2
- #define AF3 float3
- #define AF4 float4
- //------------------------------------------------------------------------------------------------------------------------------
- #define AU1 uint
- #define AU2 uint2
- #define AU3 uint3
- #define AU4 uint4
- //------------------------------------------------------------------------------------------------------------------------------
- #define ASU1 int
- #define ASU2 int2
- #define ASU3 int3
- #define ASU4 int4
- //==============================================================================================================================
- #define AF1_AU1(x) asfloat(AU1(x))
- #define AF2_AU2(x) asfloat(AU2(x))
- #define AF3_AU3(x) asfloat(AU3(x))
- #define AF4_AU4(x) asfloat(AU4(x))
- //------------------------------------------------------------------------------------------------------------------------------
- #define AU1_AF1(x) asuint(AF1(x))
- #define AU2_AF2(x) asuint(AF2(x))
- #define AU3_AF3(x) asuint(AF3(x))
- #define AU4_AF4(x) asuint(AF4(x))
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AU1_AH2_AF2_x(AF2 a){return f32tof16(a.x)|(f32tof16(a.y)<<16);}
- #define AU1_AH2_AF2(a) AU1_AH2_AF2_x(AF2(a))
- #define AU1_AB4Unorm_AF4(x) D3DCOLORtoUBYTE4(AF4(x))
- //------------------------------------------------------------------------------------------------------------------------------
- AF2 AF2_AH2_AU1_x(AU1 x){return AF2(f16tof32(x&0xFFFF),f16tof32(x>>16));}
- #define AF2_AH2_AU1(x) AF2_AH2_AU1_x(AU1(x))
- //==============================================================================================================================
- AF1 AF1_x(AF1 a){return AF1(a);}
- AF2 AF2_x(AF1 a){return AF2(a,a);}
- AF3 AF3_x(AF1 a){return AF3(a,a,a);}
- AF4 AF4_x(AF1 a){return AF4(a,a,a,a);}
- #define AF1_(a) AF1_x(AF1(a))
- #define AF2_(a) AF2_x(AF1(a))
- #define AF3_(a) AF3_x(AF1(a))
- #define AF4_(a) AF4_x(AF1(a))
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AU1_x(AU1 a){return AU1(a);}
- AU2 AU2_x(AU1 a){return AU2(a,a);}
- AU3 AU3_x(AU1 a){return AU3(a,a,a);}
- AU4 AU4_x(AU1 a){return AU4(a,a,a,a);}
- #define AU1_(a) AU1_x(AU1(a))
- #define AU2_(a) AU2_x(AU1(a))
- #define AU3_(a) AU3_x(AU1(a))
- #define AU4_(a) AU4_x(AU1(a))
- //==============================================================================================================================
- AU1 AAbsSU1(AU1 a){return AU1(abs(ASU1(a)));}
- AU2 AAbsSU2(AU2 a){return AU2(abs(ASU2(a)));}
- AU3 AAbsSU3(AU3 a){return AU3(abs(ASU3(a)));}
- AU4 AAbsSU4(AU4 a){return AU4(abs(ASU4(a)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 ABfe(AU1 src,AU1 off,AU1 bits){AU1 mask=(1<<bits)-1;return (src>>off)&mask;}
- AU1 ABfi(AU1 src,AU1 ins,AU1 mask){return (ins&mask)|(src&(~mask));}
- AU1 ABfiM(AU1 src,AU1 ins,AU1 bits){AU1 mask=(1<<bits)-1;return (ins&mask)|(src&(~mask));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 AFractF1(AF1 x){return x-floor(x);}
- AF2 AFractF2(AF2 x){return x-floor(x);}
- AF3 AFractF3(AF3 x){return x-floor(x);}
- AF4 AFractF4(AF4 x){return x-floor(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 ALerpF1(AF1 x,AF1 y,AF1 a){return lerp(x,y,a);}
- AF2 ALerpF2(AF2 x,AF2 y,AF2 a){return lerp(x,y,a);}
- AF3 ALerpF3(AF3 x,AF3 y,AF3 a){return lerp(x,y,a);}
- AF4 ALerpF4(AF4 x,AF4 y,AF4 a){return lerp(x,y,a);}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 AMax3F1(AF1 x,AF1 y,AF1 z){return max(x,max(y,z));}
- AF2 AMax3F2(AF2 x,AF2 y,AF2 z){return max(x,max(y,z));}
- AF3 AMax3F3(AF3 x,AF3 y,AF3 z){return max(x,max(y,z));}
- AF4 AMax3F4(AF4 x,AF4 y,AF4 z){return max(x,max(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMax3SU1(AU1 x,AU1 y,AU1 z){return AU1(max(ASU1(x),max(ASU1(y),ASU1(z))));}
- AU2 AMax3SU2(AU2 x,AU2 y,AU2 z){return AU2(max(ASU2(x),max(ASU2(y),ASU2(z))));}
- AU3 AMax3SU3(AU3 x,AU3 y,AU3 z){return AU3(max(ASU3(x),max(ASU3(y),ASU3(z))));}
- AU4 AMax3SU4(AU4 x,AU4 y,AU4 z){return AU4(max(ASU4(x),max(ASU4(y),ASU4(z))));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMax3U1(AU1 x,AU1 y,AU1 z){return max(x,max(y,z));}
- AU2 AMax3U2(AU2 x,AU2 y,AU2 z){return max(x,max(y,z));}
- AU3 AMax3U3(AU3 x,AU3 y,AU3 z){return max(x,max(y,z));}
- AU4 AMax3U4(AU4 x,AU4 y,AU4 z){return max(x,max(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMaxSU1(AU1 a,AU1 b){return AU1(max(ASU1(a),ASU1(b)));}
- AU2 AMaxSU2(AU2 a,AU2 b){return AU2(max(ASU2(a),ASU2(b)));}
- AU3 AMaxSU3(AU3 a,AU3 b){return AU3(max(ASU3(a),ASU3(b)));}
- AU4 AMaxSU4(AU4 a,AU4 b){return AU4(max(ASU4(a),ASU4(b)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 AMed3F1(AF1 x,AF1 y,AF1 z){return max(min(x,y),min(max(x,y),z));}
- AF2 AMed3F2(AF2 x,AF2 y,AF2 z){return max(min(x,y),min(max(x,y),z));}
- AF3 AMed3F3(AF3 x,AF3 y,AF3 z){return max(min(x,y),min(max(x,y),z));}
- AF4 AMed3F4(AF4 x,AF4 y,AF4 z){return max(min(x,y),min(max(x,y),z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 AMin3F1(AF1 x,AF1 y,AF1 z){return min(x,min(y,z));}
- AF2 AMin3F2(AF2 x,AF2 y,AF2 z){return min(x,min(y,z));}
- AF3 AMin3F3(AF3 x,AF3 y,AF3 z){return min(x,min(y,z));}
- AF4 AMin3F4(AF4 x,AF4 y,AF4 z){return min(x,min(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMin3SU1(AU1 x,AU1 y,AU1 z){return AU1(min(ASU1(x),min(ASU1(y),ASU1(z))));}
- AU2 AMin3SU2(AU2 x,AU2 y,AU2 z){return AU2(min(ASU2(x),min(ASU2(y),ASU2(z))));}
- AU3 AMin3SU3(AU3 x,AU3 y,AU3 z){return AU3(min(ASU3(x),min(ASU3(y),ASU3(z))));}
- AU4 AMin3SU4(AU4 x,AU4 y,AU4 z){return AU4(min(ASU4(x),min(ASU4(y),ASU4(z))));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMin3U1(AU1 x,AU1 y,AU1 z){return min(x,min(y,z));}
- AU2 AMin3U2(AU2 x,AU2 y,AU2 z){return min(x,min(y,z));}
- AU3 AMin3U3(AU3 x,AU3 y,AU3 z){return min(x,min(y,z));}
- AU4 AMin3U4(AU4 x,AU4 y,AU4 z){return min(x,min(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AMinSU1(AU1 a,AU1 b){return AU1(min(ASU1(a),ASU1(b)));}
- AU2 AMinSU2(AU2 a,AU2 b){return AU2(min(ASU2(a),ASU2(b)));}
- AU3 AMinSU3(AU3 a,AU3 b){return AU3(min(ASU3(a),ASU3(b)));}
- AU4 AMinSU4(AU4 a,AU4 b){return AU4(min(ASU4(a),ASU4(b)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 ANCosF1(AF1 x){return cos(x*AF1_(A_2PI));}
- AF2 ANCosF2(AF2 x){return cos(x*AF2_(A_2PI));}
- AF3 ANCosF3(AF3 x){return cos(x*AF3_(A_2PI));}
- AF4 ANCosF4(AF4 x){return cos(x*AF4_(A_2PI));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 ANSinF1(AF1 x){return sin(x*AF1_(A_2PI));}
- AF2 ANSinF2(AF2 x){return sin(x*AF2_(A_2PI));}
- AF3 ANSinF3(AF3 x){return sin(x*AF3_(A_2PI));}
- AF4 ANSinF4(AF4 x){return sin(x*AF4_(A_2PI));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 ARcpF1(AF1 x){return rcp(x);}
- AF2 ARcpF2(AF2 x){return rcp(x);}
- AF3 ARcpF3(AF3 x){return rcp(x);}
- AF4 ARcpF4(AF4 x){return rcp(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 ARsqF1(AF1 x){return rsqrt(x);}
- AF2 ARsqF2(AF2 x){return rsqrt(x);}
- AF3 ARsqF3(AF3 x){return rsqrt(x);}
- AF4 ARsqF4(AF4 x){return rsqrt(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 ASatF1(AF1 x){return saturate(x);}
- AF2 ASatF2(AF2 x){return saturate(x);}
- AF3 ASatF3(AF3 x){return saturate(x);}
- AF4 ASatF4(AF4 x){return saturate(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AShrSU1(AU1 a,AU1 b){return AU1(ASU1(a)>>ASU1(b));}
- AU2 AShrSU2(AU2 a,AU2 b){return AU2(ASU2(a)>>ASU2(b));}
- AU3 AShrSU3(AU3 a,AU3 b){return AU3(ASU3(a)>>ASU3(b));}
- AU4 AShrSU4(AU4 a,AU4 b){return AU4(ASU4(a)>>ASU4(b));}
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // HLSL BYTE
- //==============================================================================================================================
- #ifdef A_BYTE
- #endif
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // HLSL HALF
- //==============================================================================================================================
- #ifdef A_HALF
- #define AH1 min16float
- #define AH2 min16float2
- #define AH3 min16float3
- #define AH4 min16float4
- //------------------------------------------------------------------------------------------------------------------------------
- #define AW1 min16uint
- #define AW2 min16uint2
- #define AW3 min16uint3
- #define AW4 min16uint4
- //------------------------------------------------------------------------------------------------------------------------------
- #define ASW1 min16int
- #define ASW2 min16int2
- #define ASW3 min16int3
- #define ASW4 min16int4
- //==============================================================================================================================
- // Need to use manual unpack to get optimal execution (don't use packed types in buffers directly).
- // Unpack requires this pattern: https://gpuopen.com/first-steps-implementing-fp16/
- AH2 AH2_AU1_x(AU1 x){AF2 t=f16tof32(AU2(x&0xFFFF,x>>16));return AH2(t);}
- AH4 AH4_AU2_x(AU2 x){return AH4(AH2_AU1_x(x.x),AH2_AU1_x(x.y));}
- AW2 AW2_AU1_x(AU1 x){AU2 t=AU2(x&0xFFFF,x>>16);return AW2(t);}
- AW4 AW4_AU2_x(AU2 x){return AW4(AW2_AU1_x(x.x),AW2_AU1_x(x.y));}
- #define AH2_AU1(x) AH2_AU1_x(AU1(x))
- #define AH4_AU2(x) AH4_AU2_x(AU2(x))
- #define AW2_AU1(x) AW2_AU1_x(AU1(x))
- #define AW4_AU2(x) AW4_AU2_x(AU2(x))
- //------------------------------------------------------------------------------------------------------------------------------
- AU1 AU1_AH2_x(AH2 x){return f32tof16(x.x)+(f32tof16(x.y)<<16);}
- AU2 AU2_AH4_x(AH4 x){return AU2(AU1_AH2_x(x.xy),AU1_AH2_x(x.zw));}
- AU1 AU1_AW2_x(AW2 x){return AU1(x.x)+(AU1(x.y)<<16);}
- AU2 AU2_AW4_x(AW4 x){return AU2(AU1_AW2_x(x.xy),AU1_AW2_x(x.zw));}
- #define AU1_AH2(x) AU1_AH2_x(AH2(x))
- #define AU2_AH4(x) AU2_AH4_x(AH4(x))
- #define AU1_AW2(x) AU1_AW2_x(AW2(x))
- #define AU2_AW4(x) AU2_AW4_x(AW4(x))
- //==============================================================================================================================
- // TODO: These are broken!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- #define AW1_AH1(x) AW1(asuint(AF1(x)))
- #define AW2_AH2(x) AW2(asuint(AF2(x)))
- #define AW3_AH3(x) AW3(asuint(AF3(x)))
- #define AW4_AH4(x) AW4(asuint(AF4(x)))
- //------------------------------------------------------------------------------------------------------------------------------
- // TODO: These are broken!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- #define AH1_AW1(x) AH1(asfloat(AU1(x)))
- #define AH2_AW2(x) AH2(asfloat(AU2(x)))
- #define AH3_AW3(x) AH3(asfloat(AU3(x)))
- #define AH4_AW4(x) AH4(asfloat(AU4(x)))
- //==============================================================================================================================
- AH1 AH1_x(AH1 a){return AH1(a);}
- AH2 AH2_x(AH1 a){return AH2(a,a);}
- AH3 AH3_x(AH1 a){return AH3(a,a,a);}
- AH4 AH4_x(AH1 a){return AH4(a,a,a,a);}
- #define AH1_(a) AH1_x(AH1(a))
- #define AH2_(a) AH2_x(AH1(a))
- #define AH3_(a) AH3_x(AH1(a))
- #define AH4_(a) AH4_x(AH1(a))
- //------------------------------------------------------------------------------------------------------------------------------
- AW1 AW1_x(AW1 a){return AW1(a);}
- AW2 AW2_x(AW1 a){return AW2(a,a);}
- AW3 AW3_x(AW1 a){return AW3(a,a,a);}
- AW4 AW4_x(AW1 a){return AW4(a,a,a,a);}
- #define AW1_(a) AW1_x(AW1(a))
- #define AW2_(a) AW2_x(AW1(a))
- #define AW3_(a) AW3_x(AW1(a))
- #define AW4_(a) AW4_x(AW1(a))
- //==============================================================================================================================
- AW1 AAbsSW1(AW1 a){return AW1(abs(ASW1(a)));}
- AW2 AAbsSW2(AW2 a){return AW2(abs(ASW2(a)));}
- AW3 AAbsSW3(AW3 a){return AW3(abs(ASW3(a)));}
- AW4 AAbsSW4(AW4 a){return AW4(abs(ASW4(a)));}
- //------------------------------------------------------------------------------------------------------------------------------
- // V_FRACT_F16 (note DX frac() is different).
- AH1 AFractH1(AH1 x){return x-floor(x);}
- AH2 AFractH2(AH2 x){return x-floor(x);}
- AH3 AFractH3(AH3 x){return x-floor(x);}
- AH4 AFractH4(AH4 x){return x-floor(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 ALerpH1(AH1 x,AH1 y,AH1 a){return lerp(x,y,a);}
- AH2 ALerpH2(AH2 x,AH2 y,AH2 a){return lerp(x,y,a);}
- AH3 ALerpH3(AH3 x,AH3 y,AH3 a){return lerp(x,y,a);}
- AH4 ALerpH4(AH4 x,AH4 y,AH4 a){return lerp(x,y,a);}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 AMax3H1(AH1 x,AH1 y,AH1 z){return max(x,max(y,z));}
- AH2 AMax3H2(AH2 x,AH2 y,AH2 z){return max(x,max(y,z));}
- AH3 AMax3H3(AH3 x,AH3 y,AH3 z){return max(x,max(y,z));}
- AH4 AMax3H4(AH4 x,AH4 y,AH4 z){return max(x,max(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AW1 AMaxSW1(AW1 a,AW1 b){return AW1(max(ASU1(a),ASU1(b)));}
- AW2 AMaxSW2(AW2 a,AW2 b){return AW2(max(ASU2(a),ASU2(b)));}
- AW3 AMaxSW3(AW3 a,AW3 b){return AW3(max(ASU3(a),ASU3(b)));}
- AW4 AMaxSW4(AW4 a,AW4 b){return AW4(max(ASU4(a),ASU4(b)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 AMin3H1(AH1 x,AH1 y,AH1 z){return min(x,min(y,z));}
- AH2 AMin3H2(AH2 x,AH2 y,AH2 z){return min(x,min(y,z));}
- AH3 AMin3H3(AH3 x,AH3 y,AH3 z){return min(x,min(y,z));}
- AH4 AMin3H4(AH4 x,AH4 y,AH4 z){return min(x,min(y,z));}
- //------------------------------------------------------------------------------------------------------------------------------
- AW1 AMinSW1(AW1 a,AW1 b){return AW1(min(ASU1(a),ASU1(b)));}
- AW2 AMinSW2(AW2 a,AW2 b){return AW2(min(ASU2(a),ASU2(b)));}
- AW3 AMinSW3(AW3 a,AW3 b){return AW3(min(ASU3(a),ASU3(b)));}
- AW4 AMinSW4(AW4 a,AW4 b){return AW4(min(ASU4(a),ASU4(b)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 ARcpH1(AH1 x){return rcp(x);}
- AH2 ARcpH2(AH2 x){return rcp(x);}
- AH3 ARcpH3(AH3 x){return rcp(x);}
- AH4 ARcpH4(AH4 x){return rcp(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 ARsqH1(AH1 x){return rsqrt(x);}
- AH2 ARsqH2(AH2 x){return rsqrt(x);}
- AH3 ARsqH3(AH3 x){return rsqrt(x);}
- AH4 ARsqH4(AH4 x){return rsqrt(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 ASatH1(AH1 x){return saturate(x);}
- AH2 ASatH2(AH2 x){return saturate(x);}
- AH3 ASatH3(AH3 x){return saturate(x);}
- AH4 ASatH4(AH4 x){return saturate(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AW1 AShrSW1(AW1 a,AW1 b){return AW1(ASW1(a)>>ASW1(b));}
- AW2 AShrSW2(AW2 a,AW2 b){return AW2(ASW2(a)>>ASW2(b));}
- AW3 AShrSW3(AW3 a,AW3 b){return AW3(ASW3(a)>>ASW3(b));}
- AW4 AShrSW4(AW4 a,AW4 b){return AW4(ASW4(a)>>ASW4(b));}
- #endif
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // HLSL DOUBLE
- //==============================================================================================================================
- #ifdef A_DUBL
- #define AD1 double
- #define AD2 double2
- #define AD3 double3
- #define AD4 double4
- //------------------------------------------------------------------------------------------------------------------------------
- AD1 AD1_x(AD1 a){return AD1(a);}
- AD2 AD2_x(AD1 a){return AD2(a,a);}
- AD3 AD3_x(AD1 a){return AD3(a,a,a);}
- AD4 AD4_x(AD1 a){return AD4(a,a,a,a);}
- #define AD1_(a) AD1_x(AD1(a))
- #define AD2_(a) AD2_x(AD1(a))
- #define AD3_(a) AD3_x(AD1(a))
- #define AD4_(a) AD4_x(AD1(a))
- //==============================================================================================================================
- AD1 AFractD1(AD1 a){return a-floor(a);}
- AD2 AFractD2(AD2 a){return a-floor(a);}
- AD3 AFractD3(AD3 a){return a-floor(a);}
- AD4 AFractD4(AD4 a){return a-floor(a);}
- //------------------------------------------------------------------------------------------------------------------------------
- AD1 ALerpD1(AD1 x,AD1 y,AD1 a){return lerp(x,y,a);}
- AD2 ALerpD2(AD2 x,AD2 y,AD2 a){return lerp(x,y,a);}
- AD3 ALerpD3(AD3 x,AD3 y,AD3 a){return lerp(x,y,a);}
- AD4 ALerpD4(AD4 x,AD4 y,AD4 a){return lerp(x,y,a);}
- //------------------------------------------------------------------------------------------------------------------------------
- AD1 ARcpD1(AD1 x){return rcp(x);}
- AD2 ARcpD2(AD2 x){return rcp(x);}
- AD3 ARcpD3(AD3 x){return rcp(x);}
- AD4 ARcpD4(AD4 x){return rcp(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AD1 ARsqD1(AD1 x){return rsqrt(x);}
- AD2 ARsqD2(AD2 x){return rsqrt(x);}
- AD3 ARsqD3(AD3 x){return rsqrt(x);}
- AD4 ARsqD4(AD4 x){return rsqrt(x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AD1 ASatD1(AD1 x){return saturate(x);}
- AD2 ASatD2(AD2 x){return saturate(x);}
- AD3 ASatD3(AD3 x){return saturate(x);}
- AD4 ASatD4(AD4 x){return saturate(x);}
- #endif
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // HLSL LONG
- //==============================================================================================================================
- #ifdef A_LONG
- #endif
- //==============================================================================================================================
- #endif
- //==============================================================================================================================
- // GPU COMMON
- //==============================================================================================================================
- #if defined(A_GPU) || (defined(ASPM_GPU) && !(defined(ASPM_OPENCL)))
- // Negative and positive infinity.
- #define A_INFN_F AF1_AU1(0x7f800000u)
- #define A_INFP_F AF1_AU1(0xff800000u)
- //------------------------------------------------------------------------------------------------------------------------------
- // Copy sign from 's' to positive 'd'.
- AF1 ACpySgnF1(AF1 d,AF1 s){return AF1_AU1(AU1_AF1(d)|(AU1_AF1(s)&AU1_(0x80000000u)));}
- AF2 ACpySgnF2(AF2 d,AF2 s){return AF2_AU2(AU2_AF2(d)|(AU2_AF2(s)&AU2_(0x80000000u)));}
- AF3 ACpySgnF3(AF3 d,AF3 s){return AF3_AU3(AU3_AF3(d)|(AU3_AF3(s)&AU3_(0x80000000u)));}
- AF4 ACpySgnF4(AF4 d,AF4 s){return AF4_AU4(AU4_AF4(d)|(AU4_AF4(s)&AU4_(0x80000000u)));}
- //------------------------------------------------------------------------------------------------------------------------------
- // Single operation to return (useful to create a mask to use in lerp for branch free logic),
- // m=NaN := 0
- // m>=0 := 0
- // m<0 := 1
- // Uses the following useful floating point logic,
- // saturate(+a*(-INF)==-INF) := 0
- // saturate( 0*(-INF)== NaN) := 0
- // saturate(-a*(-INF)==+INF) := 1
- AF1 ASignedF1(AF1 m){return ASatF1(m*AF1_(A_INFN_F));}
- AF2 ASignedF2(AF2 m){return ASatF2(m*AF2_(A_INFN_F));}
- AF3 ASignedF3(AF3 m){return ASatF3(m*AF3_(A_INFN_F));}
- AF4 ASignedF4(AF4 m){return ASatF4(m*AF4_(A_INFN_F));}
- //==============================================================================================================================
- #ifdef A_HALF
- #define A_INFN_H AH1_AW1(0x7c00u)
- #define A_INFP_H AH1_AW1(0xfc00u)
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 ACpySgnH1(AH1 d,AH1 s){return AH1_AW1(AW1_AH1(d)|(AW1_AH1(s)&AW1_(0x8000u)));}
- AH2 ACpySgnH2(AH2 d,AH2 s){return AH2_AW2(AW2_AH2(d)|(AW2_AH2(s)&AW2_(0x8000u)));}
- AH3 ACpySgnH3(AH3 d,AH3 s){return AH3_AW3(AW3_AH3(d)|(AW3_AH3(s)&AW3_(0x8000u)));}
- AH4 ACpySgnH4(AH4 d,AH4 s){return AH4_AW4(AW4_AH4(d)|(AW4_AH4(s)&AW4_(0x8000u)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AH1 ASignedH1(AH1 m){return ASatH1(m*AH1_(A_INFN_H));}
- AH2 ASignedH2(AH2 m){return ASatH2(m*AH2_(A_INFN_H));}
- AH3 ASignedH3(AH3 m){return ASatH3(m*AH3_(A_INFN_H));}
- AH4 ASignedH4(AH4 m){return ASatH4(m*AH4_(A_INFN_H));}
- #endif
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // HALF APPROXIMATIONS
- //------------------------------------------------------------------------------------------------------------------------------
- // These support only positive inputs.
- // Did not see value yet in specialization for range.
- // Using quick testing, ended up mostly getting the same "best" approximation for various ranges.
- // With hardware that can co-execute transcendentals, the value in approximations could be less than expected.
- // However from a latency perspective, if execution of a transcendental is 4 clk, with no packed support, -> 8 clk total.
- // And co-execution would require a compiler interleaving a lot of independent work for packed usage.
- //------------------------------------------------------------------------------------------------------------------------------
- // The one Newton Raphson iteration form of rsq() was skipped (requires 6 ops total).
- // Same with sqrt(), as this could be x*rsq() (7 ops).
- //------------------------------------------------------------------------------------------------------------------------------
- // IDEAS
- // =====
- // - Polaris hardware has 16-bit support, but non-double rate.
- // Could be possible still get part double rate for some of this logic,
- // by clearing out the lower half's sign when necessary and using 32-bit ops...
- //==============================================================================================================================
- #ifdef A_HALF
- // Minimize squared error across full positive range, 2 ops.
- // The 0x1de2 based approximation maps {0 to 1} input maps to < 1 output.
- AH1 APrxLoSqrtH1(AH1 a){return AH1_AW1((AW1_AH1(a)>>AW1_(1))+AW1_(0x1de2));}
- AH2 APrxLoSqrtH2(AH2 a){return AH2_AW2((AW2_AH2(a)>>AW2_(1))+AW2_(0x1de2));}
- //------------------------------------------------------------------------------------------------------------------------------
- // Lower precision estimation, 1 op.
- // Minimize squared error across {smallest normal to 16384.0}.
- AH1 APrxLoRcpH1(AH1 a){return AH1_AW1(AW1_(0x7784)-AW1_AH1(a));}
- AH2 APrxLoRcpH2(AH2 a){return AH2_AW2(AW2_(0x7784)-AW2_AH2(a));}
- //------------------------------------------------------------------------------------------------------------------------------
- // Medium precision estimation, one Newton Raphson iteration, 3 ops.
- AH1 APrxMedRcpH1(AH1 a){AH1 b=AH1_AW1(AW1_(0x778d)-AW1_AH1(a));return b*(-b*a+AH1_(2.0));}
- AH2 APrxMedRcpH2(AH2 a){AH2 b=AH2_AW2(AW2_(0x778d)-AW2_AH2(a));return b*(-b*a+AH2_(2.0));}
- //------------------------------------------------------------------------------------------------------------------------------
- // Minimize squared error across {smallest normal to 16384.0}, 2 ops.
- AH1 APrxLoRsqH1(AH1 a){return AH1_AW1(AW1_(0x59a3)-(AW1_AH1(a)>>AW1_(1)));}
- AH2 APrxLoRsqH2(AH2 a){return AH2_AW2(AW2_(0x59a3)-(AW2_AH2(a)>>AW2_(1)));}
- #endif
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // FLOAT APPROXIMATIONS
- //------------------------------------------------------------------------------------------------------------------------------
- // Michal Drobot has an excellent presentation on these: "Low Level Optimizations For GCN",
- // - Idea dates back to SGI, then to Quake 3, etc.
- // - https://michaldrobot.files.wordpress.com/2014/05/gcn_alu_opt_digitaldragons2014.pdf
- // - sqrt(x)=rsqrt(x)*x
- // - rcp(x)=rsqrt(x)*rsqrt(x) for positive x
- // - https://github.com/michaldrobot/ShaderFastLibs/blob/master/ShaderFastMathLib.h
- //------------------------------------------------------------------------------------------------------------------------------
- // These below are from perhaps less complete searching for optimal.
- // Used FP16 normal range for testing with +4096 32-bit step size for sampling error.
- // So these match up well with the half approximations.
- //==============================================================================================================================
- AF1 APrxLoSqrtF1(AF1 a){return AF1_AU1((AU1_AF1(a)>>AU1_(1))+AU1_(0x1fbc4639));}
- AF1 APrxLoRcpF1(AF1 a){return AF1_AU1(AU1_(0x7ef07ebb)-AU1_AF1(a));}
- AF1 APrxMedRcpF1(AF1 a){AF1 b=AF1_AU1(AU1_(0x7ef19fff)-AU1_AF1(a));return b*(-b*a+AF1_(2.0));}
- AF1 APrxLoRsqF1(AF1 a){return AF1_AU1(AU1_(0x5f347d74)-(AU1_AF1(a)>>AU1_(1)));}
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // PARABOLIC SIN & COS
- //------------------------------------------------------------------------------------------------------------------------------
- // Approximate answers to transcendental questions.
- //------------------------------------------------------------------------------------------------------------------------------
- // TODO
- // ====
- // - Verify packed math ABS is correctly doing an AND.
- //==============================================================================================================================
- // Valid input range is {-1 to 1} representing {0 to 2 pi}.
- // Output range is {-1/4 to -1/4} representing {-1 to 1}.
- AF1 APSinF1(AF1 x){return x*abs(x)-x;} // MAD.
- AF1 APCosF1(AF1 x){x=AFractF1(x*AF1_(0.5)+AF1_(0.75));x=x*AF1_(2.0)-AF1_(1.0);return APSinF1(x);} // 3x MAD, FRACT
- //------------------------------------------------------------------------------------------------------------------------------
- #ifdef A_HALF
- // For a packed {sin,cos} pair,
- // - Native takes 16 clocks and 4 issue slots (no packed transcendentals).
- // - Parabolic takes 8 clocks and 8 issue slots (only fract is non-packed).
- AH2 APSinH2(AH2 x){return x*abs(x)-x;} // AND,FMA
- AH2 APCosH2(AH2 x){x=AFractH2(x*AH2_(0.5)+AH2_(0.75));x=x*AH2_(2.0)-AH2_(1.0);return APSinH2(x);} // 3x FMA, 2xFRACT, AND
- #endif
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // COLOR CONVERSIONS
- //------------------------------------------------------------------------------------------------------------------------------
- // These are all linear to/from some other space (where 'linear' has been shortened out of the function name).
- // So 'ToGamma' is 'LinearToGamma', and 'FromGamma' is 'LinearFromGamma'.
- // These are branch free implementations.
- // The AToSrgbF1() function is useful for stores for compute shaders for GPUs without hardware linear->sRGB store conversion.
- //------------------------------------------------------------------------------------------------------------------------------
- // TRANSFER FUNCTIONS
- // ==================
- // 709 ..... Rec709 used for some HDTVs
- // Gamma ... Typically 2.2 for some PC displays, or 2.4-2.5 for CRTs, or 2.2 FreeSync2 native
- // Pq ...... PQ native for HDR10
- // Srgb .... The sRGB output, typical of PC displays, useful for 10-bit output, or storing to 8-bit UNORM without SRGB type
- // Two ..... Gamma 2.0, fastest conversion (useful for intermediate pass approximations)
- //------------------------------------------------------------------------------------------------------------------------------
- // FOR PQ
- // ======
- // Both input and output is {0.0-1.0}, and where output 1.0 represents 10000.0 cd/m^2.
- // All constants are only specified to FP32 precision.
- // External PQ source reference,
- // - https://github.com/ampas/aces-dev/blob/master/transforms/ctl/utilities/ACESlib.Utilities_Color.a1.0.1.ctl
- //------------------------------------------------------------------------------------------------------------------------------
- // PACKED VERSIONS
- // ===============
- // These are the A*H2() functions.
- // There is no PQ functions as FP16 seemed to not have enough precision for the conversion.
- // The remaining functions are "good enough" for 8-bit, and maybe 10-bit if not concerned about a few 1-bit errors.
- // Precision is lowest in the 709 conversion, higher in sRGB, higher still in Two and Gamma (when using 2.2 at least).
- //------------------------------------------------------------------------------------------------------------------------------
- // NOTES
- // =====
- // Could be faster for PQ conversions to be in ALU or a texture lookup depending on usage case.
- //==============================================================================================================================
- AF1 ATo709F1(AF1 c){return max(min(c*AF1_(4.5),AF1_(0.018)),AF1_(1.099)*pow(c,AF1_(0.45))-AF1_(0.099));}
- //------------------------------------------------------------------------------------------------------------------------------
- // Note 'rcpX' is '1/x', where the 'x' is what would be used in AFromGamma().
- AF1 AToGammaF1(AF1 c,AF1 rcpX){return pow(c,rcpX);}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 AToPqF1(AF1 x){AF1 p=pow(x,AF1_(0.159302));
- return pow((AF1_(0.835938)+AF1_(18.8516)*p)/(AF1_(1.0)+AF1_(18.6875)*p),AF1_(78.8438));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 AToSrgbF1(AF1 c){return max(min(c*AF1_(12.92),AF1_(0.0031308)),AF1_(1.055)*pow(c,AF1_(0.41666))-AF1_(0.055));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 AToTwoF1(AF1 c){return sqrt(c);}
- //==============================================================================================================================
- AF1 AFrom709F1(AF1 c){return max(min(c*AF1_(1.0/4.5),AF1_(0.081)),
- pow((c+AF1_(0.099))*(AF1_(1.0)/(AF1_(1.099))),AF1_(1.0/0.45)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 AFromGammaF1(AF1 c,AF1 x){return pow(c,x);}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 AFromPqF1(AF1 x){AF1 p=pow(x,AF1_(0.0126833));
- return pow(ASatF1(p-AF1_(0.835938))/(AF1_(18.8516)-AF1_(18.6875)*p),AF1_(6.27739));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 AFromSrgbF1(AF1 c){return max(min(c*AF1_(1.0/12.92),AF1_(0.04045)),
- pow((c+AF1_(0.055))*(AF1_(1.0)/AF1_(1.055)),AF1_(2.4)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AF1 AFromTwoF1(AF1 c){return c*c;}
- //==============================================================================================================================
- #ifdef A_HALF
- AH2 ATo709H2(AH2 c){return max(min(c*AH2_(4.5),AH2_(0.018)),AH2_(1.099)*pow(c,AH2_(0.45))-AH2_(0.099));}
- //------------------------------------------------------------------------------------------------------------------------------
- AH2 AToGammaH2(AH2 c,AH1 rcpX){return pow(c,AH2_(rcpX));}
- //------------------------------------------------------------------------------------------------------------------------------
- AH2 AToSrgbH2(AH2 c){return max(min(c*AH2_(12.92),AH2_(0.0031308)),AH2_(1.055)*pow(c,AH2_(0.41666))-AH2_(0.055));}
- //------------------------------------------------------------------------------------------------------------------------------
- AH2 AToTwoH2(AH2 c){return sqrt(c);}
- #endif
- //==============================================================================================================================
- #ifdef A_HALF
- AH2 AFrom709H2(AH2 c){return max(min(c*AH2_(1.0/4.5),AH2_(0.081)),
- pow((c+AH2_(0.099))*(AH2_(1.0)/(AH2_(1.099))),AH2_(1.0/0.45)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AH2 AFromGammaH2(AH2 c,AH1 x){return pow(c,AH2_(x));}
- //------------------------------------------------------------------------------------------------------------------------------
- AH2 AFromSrgbH2(AH2 c){return max(min(c*AH2_(1.0/12.92),AH2_(0.04045)),
- pow((c+AH2_(0.055))*(AH2_(1.0)/AH2_(1.055)),AH2_(2.4)));}
- //------------------------------------------------------------------------------------------------------------------------------
- AH2 AFromTwoH2(AH2 c){return c*c;}
- #endif
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // CS REMAP
- //==============================================================================================================================
- // Simple remap 64x1 to 8x8 with rotated 2x2 pixel quads in quad linear.
- // 543210
- // ======
- // ..xxx.
- // yy...y
- AU2 ARmp8x8(AU1 a){return AU2(ABfe(a,1u,3u),ABfiM(ABfe(a,3u,3u),a,1u));}
- //==============================================================================================================================
- // More complex remap 64x1 to 8x8 which is necessary for 2D wave reductions.
- // 543210
- // ======
- // .xx..x
- // y..yy.
- // Details,
- // LANE TO 8x8 MAPPING
- // ===================
- // 00 01 08 09 10 11 18 19
- // 02 03 0a 0b 12 13 1a 1b
- // 04 05 0c 0d 14 15 1c 1d
- // 06 07 0e 0f 16 17 1e 1f
- // 20 21 28 29 30 31 38 39
- // 22 23 2a 2b 32 33 3a 3b
- // 24 25 2c 2d 34 35 3c 3d
- // 26 27 2e 2f 36 37 3e 3f
- AU2 ARmpRed8x8(AU1 a){return AU2(ABfiM(ABfe(a,2u,3u),a,1u),ABfiM(ABfe(a,3u,3u),ABfe(a,1u,2u),2u));}
- #endif
- //==============================================================================================================================
- // GPU/CPU PORTABILITY
- //------------------------------------------------------------------------------------------------------------------------------
- // This is the GPU implementation.
- // See the CPU implementation for docs.
- //==============================================================================================================================
- #if defined(A_GPU) || (defined(ASPM_GPU) && !(defined(ASPM_OPENCL)))
- #define A_TRUE true
- #define A_FALSE false
- #define A_STATIC
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // VECTOR ARGUMENT/RETURN/INITIALIZATION PORTABILITY
- //==============================================================================================================================
- #define retAD2 AD2
- #define retAD3 AD3
- #define retAD4 AD4
- #define retAF2 AF2
- #define retAF3 AF3
- #define retAF4 AF4
- #define retAL2 AL2
- #define retAL3 AL3
- #define retAL4 AL4
- #define retAU2 AU2
- #define retAU3 AU3
- #define retAU4 AU4
- //------------------------------------------------------------------------------------------------------------------------------
- #define inAD2 in AD2
- #define inAD3 in AD3
- #define inAD4 in AD4
- #define inAF2 in AF2
- #define inAF3 in AF3
- #define inAF4 in AF4
- #define inAL2 in AL2
- #define inAL3 in AL3
- #define inAL4 in AL4
- #define inAU2 in AU2
- #define inAU3 in AU3
- #define inAU4 in AU4
- //------------------------------------------------------------------------------------------------------------------------------
- #define inoutAD2 inout AD2
- #define inoutAD3 inout AD3
- #define inoutAD4 inout AD4
- #define inoutAF2 inout AF2
- #define inoutAF3 inout AF3
- #define inoutAF4 inout AF4
- #define inoutAL2 inout AL2
- #define inoutAL3 inout AL3
- #define inoutAL4 inout AL4
- #define inoutAU2 inout AU2
- #define inoutAU3 inout AU3
- #define inoutAU4 inout AU4
- //------------------------------------------------------------------------------------------------------------------------------
- #define outAD2 out AD2
- #define outAD3 out AD3
- #define outAD4 out AD4
- #define outAF2 out AF2
- #define outAF3 out AF3
- #define outAF4 out AF4
- #define outAL2 out AL2
- #define outAL3 out AL3
- #define outAL4 out AL4
- #define outAU2 out AU2
- #define outAU3 out AU3
- #define outAU4 out AU4
- //------------------------------------------------------------------------------------------------------------------------------
- #define varAD2(x) AD2 x
- #define varAD3(x) AD3 x
- #define varAD4(x) AD4 x
- #define varAF2(x) AF2 x
- #define varAF3(x) AF3 x
- #define varAF4(x) AF4 x
- #define varAL2(x) AL2 x
- #define varAL3(x) AL3 x
- #define varAL4(x) AL4 x
- #define varAU2(x) AU2 x
- #define varAU3(x) AU3 x
- #define varAU4(x) AU4 x
- //------------------------------------------------------------------------------------------------------------------------------
- #define initAD2(x,y) AD2(x,y)
- #define initAD3(x,y,z) AD3(x,y,z)
- #define initAD4(x,y,z,w) AD4(x,y,z,w)
- #define initAF2(x,y) AF2(x,y)
- #define initAF3(x,y,z) AF3(x,y,z)
- #define initAF4(x,y,z,w) AF4(x,y,z,w)
- #define initAL2(x,y) AL2(x,y)
- #define initAL3(x,y,z) AL3(x,y,z)
- #define initAL4(x,y,z,w) AL4(x,y,z,w)
- #define initAU2(x,y) AU2(x,y)
- #define initAU3(x,y,z) AU3(x,y,z)
- #define initAU4(x,y,z,w) AU4(x,y,z,w)
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // SCALAR RETURN OPS
- //==============================================================================================================================
- #define AAbsD1(a) abs(AD1(a))
- #define AAbsF1(a) abs(AF1(a))
- //------------------------------------------------------------------------------------------------------------------------------
- #define ACosD1(a) cos(AD1(a))
- #define ACosF1(a) cos(AF1(a))
- //------------------------------------------------------------------------------------------------------------------------------
- #define ADotD2(a,b) dot(AD2(a),AD2(b))
- #define ADotD3(a,b) dot(AD3(a),AD3(b))
- #define ADotD4(a,b) dot(AD4(a),AD4(b))
- #define ADotF2(a,b) dot(AF2(a),AF2(b))
- #define ADotF3(a,b) dot(AF3(a),AF3(b))
- #define ADotF4(a,b) dot(AF4(a),AF4(b))
- //------------------------------------------------------------------------------------------------------------------------------
- #define AExp2D1(a) exp2(AD1(a))
- #define AExp2F1(a) exp2(AF1(a))
- //------------------------------------------------------------------------------------------------------------------------------
- #define AFloorD1(a) floor(AD1(a))
- #define AFloorF1(a) floor(AF1(a))
- //------------------------------------------------------------------------------------------------------------------------------
- #define ALog2D1(a) log2(AD1(a))
- #define ALog2F1(a) log2(AF1(a))
- //------------------------------------------------------------------------------------------------------------------------------
- #define AMaxD1(a,b) min(a,b)
- #define AMaxF1(a,b) min(a,b)
- #define AMaxL1(a,b) min(a,b)
- #define AMaxU1(a,b) min(a,b)
- //------------------------------------------------------------------------------------------------------------------------------
- #define AMinD1(a,b) min(a,b)
- #define AMinF1(a,b) min(a,b)
- #define AMinL1(a,b) min(a,b)
- #define AMinU1(a,b) min(a,b)
- //------------------------------------------------------------------------------------------------------------------------------
- #define ASinD1(a) sin(AD1(a))
- #define ASinF1(a) sin(AF1(a))
- //------------------------------------------------------------------------------------------------------------------------------
- #define ASqrtD1(a) sqrt(AD1(a))
- #define ASqrtF1(a) sqrt(AF1(a))
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // SCALAR RETURN OPS - DEPENDENT
- //==============================================================================================================================
- #define APowD1(a,b) pow(AD1(a),AF1(b))
- #define APowF1(a,b) pow(AF1(a),AF1(b))
- //_____________________________________________________________/\_______________________________________________________________
- //==============================================================================================================================
- // VECTOR OPS
- //------------------------------------------------------------------------------------------------------------------------------
- // These are added as needed for production or prototyping, so not necessarily a complete set.
- // They follow a convention of taking in a destination and also returning the destination value to increase utility.
- //==============================================================================================================================
- #ifdef A_DUBL
- AD2 opAAbsD2(outAD2 d,inAD2 a){d=abs(a);return d;}
- AD3 opAAbsD3(outAD3 d,inAD3 a){d=abs(a);return d;}
- AD4 opAAbsD4(outAD4 d,inAD4 a){d=abs(a);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AD2 opAAddD2(outAD2 d,inAD2 a,inAD2 b){d=a+b;return d;}
- AD3 opAAddD3(outAD3 d,inAD3 a,inAD3 b){d=a+b;return d;}
- AD4 opAAddD4(outAD4 d,inAD4 a,inAD4 b){d=a+b;return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AD2 opACpyD2(outAD2 d,inAD2 a){d=a;return d;}
- AD3 opACpyD3(outAD3 d,inAD3 a){d=a;return d;}
- AD4 opACpyD4(outAD4 d,inAD4 a){d=a;return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AD2 opALerpD2(outAD2 d,inAD2 a,inAD2 b,inAD2 c){d=ALerpD2(a,b,c);return d;}
- AD3 opALerpD3(outAD3 d,inAD3 a,inAD3 b,inAD3 c){d=ALerpD3(a,b,c);return d;}
- AD4 opALerpD4(outAD4 d,inAD4 a,inAD4 b,inAD4 c){d=ALerpD4(a,b,c);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AD2 opALerpOneD2(outAD2 d,inAD2 a,inAD2 b,AD1 c){d=ALerpD2(a,b,AD2_(c));return d;}
- AD3 opALerpOneD3(outAD3 d,inAD3 a,inAD3 b,AD1 c){d=ALerpD3(a,b,AD3_(c));return d;}
- AD4 opALerpOneD4(outAD4 d,inAD4 a,inAD4 b,AD1 c){d=ALerpD4(a,b,AD4_(c));return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AD2 opAMaxD2(outAD2 d,inAD2 a,inAD2 b){d=max(a,b);return d;}
- AD3 opAMaxD3(outAD3 d,inAD3 a,inAD3 b){d=max(a,b);return d;}
- AD4 opAMaxD4(outAD4 d,inAD4 a,inAD4 b){d=max(a,b);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AD2 opAMinD2(outAD2 d,inAD2 a,inAD2 b){d=min(a,b);return d;}
- AD3 opAMinD3(outAD3 d,inAD3 a,inAD3 b){d=min(a,b);return d;}
- AD4 opAMinD4(outAD4 d,inAD4 a,inAD4 b){d=min(a,b);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AD2 opAMulD2(outAD2 d,inAD2 a,inAD2 b){d=a*b;return d;}
- AD3 opAMulD3(outAD3 d,inAD3 a,inAD3 b){d=a*b;return d;}
- AD4 opAMulD4(outAD4 d,inAD4 a,inAD4 b){d=a*b;return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AD2 opAMulOneD2(outAD2 d,inAD2 a,AD1 b){d=a*AD2_(b);return d;}
- AD3 opAMulOneD3(outAD3 d,inAD3 a,AD1 b){d=a*AD3_(b);return d;}
- AD4 opAMulOneD4(outAD4 d,inAD4 a,AD1 b){d=a*AD4_(b);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AD2 opANegD2(outAD2 d,inAD2 a){d=-a;return d;}
- AD3 opANegD3(outAD3 d,inAD3 a){d=-a;return d;}
- AD4 opANegD4(outAD4 d,inAD4 a){d=-a;return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AD2 opARcpD2(outAD2 d,inAD2 a){d=ARcpD2(a);return d;}
- AD3 opARcpD3(outAD3 d,inAD3 a){d=ARcpD3(a);return d;}
- AD4 opARcpD4(outAD4 d,inAD4 a){d=ARcpD4(a);return d;}
- #endif
- //==============================================================================================================================
- AF2 opAAbsF2(outAF2 d,inAF2 a){d=abs(a);return d;}
- AF3 opAAbsF3(outAF3 d,inAF3 a){d=abs(a);return d;}
- AF4 opAAbsF4(outAF4 d,inAF4 a){d=abs(a);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AF2 opAAddF2(outAF2 d,inAF2 a,inAF2 b){d=a+b;return d;}
- AF3 opAAddF3(outAF3 d,inAF3 a,inAF3 b){d=a+b;return d;}
- AF4 opAAddF4(outAF4 d,inAF4 a,inAF4 b){d=a+b;return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AF2 opACpyF2(outAF2 d,inAF2 a){d=a;return d;}
- AF3 opACpyF3(outAF3 d,inAF3 a){d=a;return d;}
- AF4 opACpyF4(outAF4 d,inAF4 a){d=a;return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AF2 opALerpF2(outAF2 d,inAF2 a,inAF2 b,inAF2 c){d=ALerpF2(a,b,c);return d;}
- AF3 opALerpF3(outAF3 d,inAF3 a,inAF3 b,inAF3 c){d=ALerpF3(a,b,c);return d;}
- AF4 opALerpF4(outAF4 d,inAF4 a,inAF4 b,inAF4 c){d=ALerpF4(a,b,c);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AF2 opALerpOneF2(outAF2 d,inAF2 a,inAF2 b,AF1 c){d=ALerpF2(a,b,AF2_(c));return d;}
- AF3 opALerpOneF3(outAF3 d,inAF3 a,inAF3 b,AF1 c){d=ALerpF3(a,b,AF3_(c));return d;}
- AF4 opALerpOneF4(outAF4 d,inAF4 a,inAF4 b,AF1 c){d=ALerpF4(a,b,AF4_(c));return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AF2 opAMaxF2(outAF2 d,inAF2 a,inAF2 b){d=max(a,b);return d;}
- AF3 opAMaxF3(outAF3 d,inAF3 a,inAF3 b){d=max(a,b);return d;}
- AF4 opAMaxF4(outAF4 d,inAF4 a,inAF4 b){d=max(a,b);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AF2 opAMinF2(outAF2 d,inAF2 a,inAF2 b){d=min(a,b);return d;}
- AF3 opAMinF3(outAF3 d,inAF3 a,inAF3 b){d=min(a,b);return d;}
- AF4 opAMinF4(outAF4 d,inAF4 a,inAF4 b){d=min(a,b);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AF2 opAMulF2(outAF2 d,inAF2 a,inAF2 b){d=a*b;return d;}
- AF3 opAMulF3(outAF3 d,inAF3 a,inAF3 b){d=a*b;return d;}
- AF4 opAMulF4(outAF4 d,inAF4 a,inAF4 b){d=a*b;return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AF2 opAMulOneF2(outAF2 d,inAF2 a,AF1 b){d=a*AF2_(b);return d;}
- AF3 opAMulOneF3(outAF3 d,inAF3 a,AF1 b){d=a*AF3_(b);return d;}
- AF4 opAMulOneF4(outAF4 d,inAF4 a,AF1 b){d=a*AF4_(b);return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AF2 opANegF2(outAF2 d,inAF2 a){d=-a;return d;}
- AF3 opANegF3(outAF3 d,inAF3 a){d=-a;return d;}
- AF4 opANegF4(outAF4 d,inAF4 a){d=-a;return d;}
- //------------------------------------------------------------------------------------------------------------------------------
- AF2 opARcpF2(outAF2 d,inAF2 a){d=ARcpF2(a);return d;}
- AF3 opARcpF3(outAF3 d,inAF3 a){d=ARcpF3(a);return d;}
- AF4 opARcpF4(outAF4 d,inAF4 a){d=ARcpF4(a);return d;}
- #endif
- #endif // USE_CMP_FIDELITY_FX_H
- #endif // Common_Def.h
|