| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <AzCore/Math/Internal/MathTypes.h>
- #include <AzCore/Math/Quaternion.h>
- #include <AzCore/UnitTest/TestTypes.h>
- using namespace AZ;
- namespace UnitTest
- {
- template<typename VectorType>
- void TestToVec1()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- float testStoreValues[4] = { -1.0f, -1.0f, -1.0f, -1.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- Simd::Vec1::FloatType testVec1 = VectorType::ToVec1(testVector);
- Simd::Vec1::StoreUnaligned(testStoreValues, testVec1);
- for (int32_t i = 0; i < Simd::Vec1::ElementCount; ++i)
- {
- EXPECT_NEAR(testLoadValues[i], testStoreValues[i], AZ::Constants::Tolerance);
- }
- }
- template<typename VectorType>
- void TestFromVec1()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- float testStoreValues[4] = { -1.0f, -1.0f, -1.0f, -1.0f };
- Simd::Vec1::FloatType testVec1 = Simd::Vec1::LoadUnaligned(testLoadValues);
- typename VectorType::FloatType testVector = VectorType::FromVec1(testVec1);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- // All the elements must be set to the Vec1.x value
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_NEAR(testLoadValues[0], testStoreValues[i], AZ::Constants::Tolerance);
- }
- }
- template<typename VectorType>
- void TestToVec2()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- float testStoreValues[4] = { -1.0f, -1.0f, -1.0f, -1.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- Simd::Vec2::FloatType testVec2 = VectorType::ToVec2(testVector);
- Simd::Vec2::StoreUnaligned(testStoreValues, testVec2);
- for (int32_t i = 0; i < Simd::Vec2::ElementCount; ++i)
- {
- EXPECT_NEAR(testLoadValues[i], testStoreValues[i], AZ::Constants::Tolerance);
- }
- }
- template<typename VectorType>
- void TestFromVec2()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- float testStoreValues[4] = { -1.0f, -1.0f, -1.0f, -1.0f };
- Simd::Vec2::FloatType testVec2 = Simd::Vec2::LoadUnaligned(testLoadValues);
- typename VectorType::FloatType testVector = VectorType::FromVec2(testVec2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- // The first 2 elements must be set to (Vec2.x, Vec2.y)
- for (int32_t i = 0; i < Simd::Vec2::ElementCount; ++i)
- {
- EXPECT_NEAR(testLoadValues[i], testStoreValues[i], AZ::Constants::Tolerance);
- }
- // The rest of elements must be set to zero
- for (int32_t i = Simd::Vec2::ElementCount; i < VectorType::ElementCount; ++i)
- {
- EXPECT_NEAR(0.0f, testStoreValues[i], AZ::Constants::Tolerance);
- }
- }
- template <typename VectorType>
- void TestLoadStoreFloat()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_NEAR(testLoadValues[i], testStoreValues[i], AZ::Constants::Tolerance);
- }
- }
- template <typename VectorType>
- void TestLoadStoreInt()
- {
- int32_t testLoadValues[4] = { 1, 2, 3, 4 };
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::Int32Type testVector = VectorType::LoadUnaligned(testLoadValues);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_NEAR(testLoadValues[i], testStoreValues[i], AZ::Constants::Tolerance);
- }
- }
- template <typename VectorType>
- void TestSelectFirst()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- const float selectedValue = VectorType::SelectIndex0(testVector);
- EXPECT_NEAR(testLoadValues[0], selectedValue, AZ::Constants::Tolerance);
- }
- template <typename VectorType>
- void TestSelectSecond()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- const float selectedValue = VectorType::SelectIndex1(testVector);
- EXPECT_NEAR(testLoadValues[1], selectedValue, AZ::Constants::Tolerance);
- }
- template <typename VectorType>
- void TestSelectThird()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- const float selectedValue = VectorType::SelectIndex2(testVector);
- EXPECT_NEAR(testLoadValues[2], selectedValue, AZ::Constants::Tolerance);
- }
- template <typename VectorType>
- void TestSelectFourth()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- const float selectedValue = VectorType::SelectIndex3(testVector);
- EXPECT_NEAR(testLoadValues[3], selectedValue, AZ::Constants::Tolerance);
- }
- template <typename VectorType>
- void ValidateReplaceResults(const float* testLoadValues1, const float* testLoadValues2, typename VectorType::FloatArgType result, uint32_t replaceIndex)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- VectorType::StoreUnaligned(testStoreValues, result);
- for (uint32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- if (i == replaceIndex)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(testLoadValues2[i], AZ::Constants::Tolerance));
- }
- else
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(testLoadValues1[i], AZ::Constants::Tolerance));
- }
- }
- }
- template <typename VectorType>
- void TestReplaceFirst()
- {
- float testLoadValues1[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- const typename VectorType::FloatType testVector1 = VectorType::LoadUnaligned(testLoadValues1);
- float testLoadValues2[4] = { -1.0f, -2.0f, -3.0f, -4.0f };
- const typename VectorType::FloatType testVector2 = VectorType::LoadUnaligned(testLoadValues2);
- typename VectorType::FloatType result1 = VectorType::ReplaceFirst(testVector1, testVector2);
- ValidateReplaceResults<VectorType>(testLoadValues1, testLoadValues2, result1, 0);
- typename VectorType::FloatType result2 = VectorType::ReplaceFirst(testVector1, testLoadValues2[0]);
- ValidateReplaceResults<VectorType>(testLoadValues1, testLoadValues2, result2, 0);
- }
- template <typename VectorType>
- void TestReplaceSecond()
- {
- float testLoadValues1[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- const typename VectorType::FloatType testVector1 = VectorType::LoadUnaligned(testLoadValues1);
- float testLoadValues2[4] = { -1.0f, -2.0f, -3.0f, -4.0f };
- const typename VectorType::FloatType testVector2 = VectorType::LoadUnaligned(testLoadValues2);
- typename VectorType::FloatType result1 = VectorType::ReplaceSecond(testVector1, testVector2);
- ValidateReplaceResults<VectorType>(testLoadValues1, testLoadValues2, result1, 1);
- typename VectorType::FloatType result2 = VectorType::ReplaceSecond(testVector1, testLoadValues2[1]);
- ValidateReplaceResults<VectorType>(testLoadValues1, testLoadValues2, result2, 1);
- }
- template <typename VectorType>
- void TestReplaceThird()
- {
- float testLoadValues1[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- const typename VectorType::FloatType testVector1 = VectorType::LoadUnaligned(testLoadValues1);
- float testLoadValues2[4] = { -1.0f, -2.0f, -3.0f, -4.0f };
- const typename VectorType::FloatType testVector2 = VectorType::LoadUnaligned(testLoadValues2);
- typename VectorType::FloatType result1 = VectorType::ReplaceThird(testVector1, testVector2);
- ValidateReplaceResults<VectorType>(testLoadValues1, testLoadValues2, result1, 2);
- typename VectorType::FloatType result2 = VectorType::ReplaceThird(testVector1, testLoadValues2[2]);
- ValidateReplaceResults<VectorType>(testLoadValues1, testLoadValues2, result2, 2);
- }
- template <typename VectorType>
- void TestReplaceFourth()
- {
- float testLoadValues1[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- const typename VectorType::FloatType testVector1 = VectorType::LoadUnaligned(testLoadValues1);
- float testLoadValues2[4] = { -1.0f, -2.0f, -3.0f, -4.0f };
- const typename VectorType::FloatType testVector2 = VectorType::LoadUnaligned(testLoadValues2);
- typename VectorType::FloatType result1 = VectorType::ReplaceFourth(testVector1, testVector2);
- ValidateReplaceResults<VectorType>(testLoadValues1, testLoadValues2, result1, 3);
- typename VectorType::FloatType result2 = VectorType::ReplaceFourth(testVector1, testLoadValues2[3]);
- ValidateReplaceResults<VectorType>(testLoadValues1, testLoadValues2, result2, 3);
- }
- template <typename VectorType>
- void TestSplatFloat()
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType testVector = VectorType::Splat(1.0f);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(1.0f, AZ::Constants::Tolerance));
- }
- }
- template <typename VectorType>
- void TestSplatInt()
- {
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::Int32Type testVector = VectorType::Splat(1);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(1));
- }
- }
- template<typename VectorType>
- void TestSplatFirst()
- {
- float testLoadValues[4] = { 3.5f, 0.0f, 0.0f, 0.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- testVector = VectorType::SplatIndex0(testVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(3.5f, AZ::Constants::Tolerance));
- }
- }
- template<typename VectorType>
- void TestSplatSecond()
- {
- float testLoadValues[4] = { 0.0f, 3.5f, 0.0f, 0.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- testVector = VectorType::SplatIndex1(testVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(3.5f, AZ::Constants::Tolerance));
- }
- }
- template<typename VectorType>
- void TestSplatThird()
- {
- float testLoadValues[4] = { 0.0f, 0.0f, 3.5f, 0.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- testVector = VectorType::SplatIndex2(testVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(3.5f, AZ::Constants::Tolerance));
- }
- }
- template<typename VectorType>
- void TestSplatFourth()
- {
- float testLoadValues[4] = { 0.0f, 0.0f, 0.0f, 3.5f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- testVector = VectorType::SplatIndex3(testVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(3.5f, AZ::Constants::Tolerance));
- }
- }
- template <typename VectorType>
- void TestLoadImmediateFloat()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType testVector = VectorType::LoadUnaligned(testLoadValues);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(testLoadValues[i], AZ::Constants::Tolerance));
- }
- }
- template <typename VectorType>
- void TestLoadImmediateInt()
- {
- int32_t testLoadValues[4] = { 1, 2, 3, 4 };
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::Int32Type testVector = VectorType::LoadUnaligned(testLoadValues);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(testLoadValues[i]));
- }
- }
- template <typename VectorType>
- void TestAddSubMulDivFloat()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- // Add
- {
- float results[4] = { 2.0f, 4.0f, 6.0f, 8.0f };
- typename VectorType::FloatType testVector = VectorType::Add(sourceVector, sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Sub
- {
- float results[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- typename VectorType::FloatType testVector = VectorType::Sub(VectorType::Add(sourceVector, sourceVector), sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Mul
- {
- float results[4] = { 1.0f, 4.0f, 9.0f, 16.0f };
- typename VectorType::FloatType testVector = VectorType::Mul(sourceVector, sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Div
- {
- float results[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
- typename VectorType::FloatType testVector = VectorType::Div(sourceVector, sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- }
- template <typename VectorType>
- void TestAddSubMulInt()
- {
- int32_t testLoadValues[4] = { 1, 2, 3, 4 };
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::Int32Type sourceVector = VectorType::LoadUnaligned(testLoadValues);
- // Add
- {
- int32_t results[4] = { 2, 4, 6, 8 };
- typename VectorType::Int32Type testVector = VectorType::Add(sourceVector, sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // Sub
- {
- int32_t results[4] = { 1, 2, 3, 4 };
- typename VectorType::Int32Type testVector = VectorType::Sub(VectorType::Add(sourceVector, sourceVector), sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // Mul
- {
- int32_t results[4] = { 1, 4, 9, 16 };
- typename VectorType::Int32Type testVector = VectorType::Mul(sourceVector, sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- }
- template <typename VectorType>
- void TestNotFloat()
- {
- float testLoadValues[4] = { 0.0f, 1.0f, -0.0f, -1.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- typename VectorType::FloatType testVector = VectorType::Not(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues[3], 4.0f, 0.01f);
- case 3:
- EXPECT_TRUE(AZStd::isnan(testStoreValues[2]));
- case 2:
- EXPECT_NEAR(testStoreValues[1], -4.0f, 0.01f);
- case 1:
- EXPECT_TRUE(AZStd::isnan(testStoreValues[0]));
- break;
- }
- }
- template <typename VectorType>
- void TestAndAndnotOrFloat()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, -3.0f, -4.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- // And
- {
- float results[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType testVector = VectorType::And(sourceVector, VectorType::ZeroFloat());
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // AndNot
- {
- typename VectorType::FloatType testVector = VectorType::AndNot(VectorType::ZeroFloat(), sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(testLoadValues[i], AZ::Constants::Tolerance));
- }
- }
- // Or
- {
- float results[4] = { 1.0f, 2.0f, -3.0f, -4.0f };
- typename VectorType::FloatType testVector = VectorType::Or(sourceVector, VectorType::ZeroFloat());
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- }
- template <typename VectorType>
- void TestXorFloat()
- {
- float testLoadValues[4] = { 1.0f, 2.0f, -3.0f, -4.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::Int32Type mask = VectorType::Splat(static_cast<int32_t>(0x80000000));
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- typename VectorType::FloatType testVector = VectorType::Xor(sourceVector, VectorType::CastToFloat(mask));
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(-testLoadValues[i], AZ::Constants::Tolerance));
- }
- }
- template <typename VectorType>
- void TestNotInt()
- {
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::Int32Type sourceVector = VectorType::Splat(static_cast<int32_t>(0x80000000));
- typename VectorType::Int32Type testVector = VectorType::Not(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(0x7FFFFFFF));
- }
- }
- template <typename VectorType>
- void TestAndAndnotOrInt()
- {
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::Int32Type sourceVector1 = VectorType::Splat(static_cast<int32_t>(0xFFFF0000));
- typename VectorType::Int32Type sourceVector2 = VectorType::Splat(static_cast<int32_t>(0x0000FFFF));
- // And
- {
- typename VectorType::Int32Type testVector = VectorType::And(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(0));
- }
- }
- // AndNot
- {
- typename VectorType::Int32Type testVector = VectorType::AndNot(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(0x0000FFFF));
- }
- }
- // Or
- {
- typename VectorType::Int32Type testVector = VectorType::Or(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(0xFFFFFFFF));
- }
- }
- }
- template <typename VectorType>
- void TestXorInt()
- {
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::Int32Type sourceVector1 = VectorType::Splat(static_cast<int32_t>(0xFFFFF000));
- typename VectorType::Int32Type sourceVector2 = VectorType::Splat(static_cast<int32_t>(0x000FFFFF));
- typename VectorType::Int32Type testVector = VectorType::Xor(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(0xFFF00FFF));
- }
- }
- template <typename VectorType>
- void TestMinMaxInt()
- {
- int32_t testLoadValues1[4] = { 0, 1, -1, 0 };
- int32_t testLoadValues2[4] = { -1, 0, 0, 1 };
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::Int32Type sourceVector1 = VectorType::LoadUnaligned(testLoadValues1);
- typename VectorType::Int32Type sourceVector2 = VectorType::LoadUnaligned(testLoadValues2);
- // Min
- {
- int32_t results[4] = { -1, 0, -1, 0 };
- typename VectorType::Int32Type testVector = VectorType::Min(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // Max
- {
- int32_t results[4] = { 0, 1, 0, 1 };
- typename VectorType::Int32Type testVector = VectorType::Max(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- }
- template <typename VectorType>
- void TestClampInt()
- {
- int32_t testLoadValues[4] = { -10, 10, -5, 5 };
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::Int32Type sourceVector1 = VectorType::LoadUnaligned(testLoadValues);
- typename VectorType::Int32Type sourceVector2 = VectorType::Splat(-8);
- typename VectorType::Int32Type sourceVector3 = VectorType::Splat( 8);
- typename VectorType::Int32Type testVector = VectorType::Clamp(sourceVector1, sourceVector2, sourceVector3);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { -8, 8, -5, 5 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- template <typename VectorType>
- void TestFloorFloat()
- {
- // Positive values
- float testLoadValues[4] = { 0.2f, 0.4f, 0.6f, 0.8f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Floor(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(0.0f, AZ::Constants::Tolerance));
- }
- }
- // Negative values
- float testNegativeLoadValues[4] = { -0.2f, -0.4f, -0.6f, -0.8f };
- sourceVector = VectorType::LoadUnaligned(testNegativeLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Floor(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(-1.0f, AZ::Constants::Tolerance));
- }
- }
- // Equidistant values
- float testEquidistantLoadValues[4] = { 0.5f, -0.5f, 1.5f, -1.5f };
- sourceVector = VectorType::LoadUnaligned(testEquidistantLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Floor(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { 0.0f, -1.0f, 1.0f, -2.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Whole values
- float testWholeLoadValues[4] = { 0.0f, 1.0f, -1.0f, 2.0f };
- sourceVector = VectorType::LoadUnaligned(testWholeLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Floor(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(testWholeLoadValues[i], AZ::Constants::Tolerance));
- }
- }
- }
- template <typename VectorType>
- void TestCeilFloat()
- {
- // Positive values
- float testLoadValues[4] = { 0.2f, 0.4f, 0.6f, 0.8f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Ceil(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(1.0f, AZ::Constants::Tolerance));
- }
- }
- // Negative values
- float testNegativeLoadValues[4] = { -0.2f, -0.4f, -0.6f, -0.8f };
- sourceVector = VectorType::LoadUnaligned(testNegativeLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Ceil(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(0.0f, AZ::Constants::Tolerance));
- }
- }
- // Equidistant values
- float testEquidistantLoadValues[4] = { 0.5f, -0.5f, 1.5f, -1.5f };
- sourceVector = VectorType::LoadUnaligned(testEquidistantLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Ceil(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { 1.0f, 0.0f, 2.0f, -1.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Whole values
- float testWholeLoadValues[4] = { 0.0f, 1.0f, -1.0f, 2.0f };
- sourceVector = VectorType::LoadUnaligned(testWholeLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Ceil(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(testWholeLoadValues[i], AZ::Constants::Tolerance));
- }
- }
- }
- template <typename VectorType>
- void TestRoundFloat()
- {
- // Positive values
- float testLoadValues[4] = { 0.2f, 0.4f, 0.6f, 0.8f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Round(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Negative values
- float testNegativeLoadValues[4] = { -0.2f, -0.4f, -0.6f, -0.8f };
- sourceVector = VectorType::LoadUnaligned(testNegativeLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Round(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { 0.0f, 0.0f, -1.0f, -1.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Equidistant values
- float testEquidistantLoadValues[4] = { 0.5f, -0.5f, 1.5f, -1.5f };
- sourceVector = VectorType::LoadUnaligned(testEquidistantLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Round(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- // The expected behaviour is ties to even (banker's rounding)
- float results[4] = { 0.0f, 0.0f, 2.0f, -2.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Whole values
- float testWholeLoadValues[4] = { 0.0f, 1.0f, -1.0f, 2.0f };
- sourceVector = VectorType::LoadUnaligned(testWholeLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Round(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(testWholeLoadValues[i], AZ::Constants::Tolerance));
- }
- }
- }
- template <typename VectorType>
- void TestTruncateFloat()
- {
- // Positive values
- float testLoadValues[4] = { 0.2f, 0.4f, 0.6f, 0.8f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Truncate(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Negative values
- float testNegativeLoadValues[4] = { -0.2f, -0.4f, -0.6f, -0.8f };
- sourceVector = VectorType::LoadUnaligned(testNegativeLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Truncate(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Equidistant values
- float testEquidistantLoadValues[4] = { 0.5f, -0.5f, 1.5f, -1.5f };
- sourceVector = VectorType::LoadUnaligned(testEquidistantLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Truncate(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { 0.0f, 0.0f, 1.0f, -1.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Whole values
- float testWholeLoadValues[4] = { 0.0f, 1.0f, -1.0f, 2.0f };
- sourceVector = VectorType::LoadUnaligned(testWholeLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::Truncate(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(testWholeLoadValues[i], AZ::Constants::Tolerance));
- }
- }
- }
- template <typename VectorType>
- void TestMinMaxFloat()
- {
- float testLoadValues1[4] = { 0.0f, 1.0f, -1.0f, 0.0f };
- float testLoadValues2[4] = { -1.0f, 0.0f, 0.0f, 1.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType sourceVector1 = VectorType::LoadUnaligned(testLoadValues1);
- typename VectorType::FloatType sourceVector2 = VectorType::LoadUnaligned(testLoadValues2);
- // Min
- {
- typename VectorType::FloatType testVector = VectorType::Min(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { -1.0f, 0.0f, -1.0f, 0.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- // Max
- {
- typename VectorType::FloatType testVector = VectorType::Max(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- }
- template <typename VectorType>
- void TestClampFloat()
- {
- float testLoadValues[4] = { -10.0f, 10.0f, -5.0f, 5.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType sourceVector1 = VectorType::LoadUnaligned(testLoadValues);
- typename VectorType::FloatType sourceVector2 = VectorType::Splat(-8.0f);
- typename VectorType::FloatType sourceVector3 = VectorType::Splat(8.0f);
- typename VectorType::FloatType testVector = VectorType::Clamp(sourceVector1, sourceVector2, sourceVector3);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { -8.0f, 8.0f, -5.0f, 5.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(results[i], AZ::Constants::Tolerance));
- }
- }
- template <typename VectorType>
- void TestCompareFloat()
- {
- float testLoadValues1[4] = { -10.1f, 10.0f, -5.0f, 5.1f };
- float testLoadValues2[4] = { -10.0f, 0.0f, -5.0f, 5.1f };
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::FloatType sourceVector1 = VectorType::LoadUnaligned(testLoadValues1);
- typename VectorType::FloatType sourceVector2 = VectorType::LoadUnaligned(testLoadValues2);
- // CmpEq
- {
- typename VectorType::FloatType testVector = VectorType::CmpEq(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, VectorType::CastToInt(testVector));
- int32_t results[4] = { 0, 0, -1, -1 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // CmpNeq
- {
- typename VectorType::FloatType testVector = VectorType::CmpNeq(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, VectorType::CastToInt(testVector));
- int32_t results[4] = { -1, -1, 0, 0 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // CmpGt
- {
- typename VectorType::FloatType testVector = VectorType::CmpGt(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, VectorType::CastToInt(testVector));
- int32_t results[4] = { 0, -1, 0, 0 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // CmpGte
- {
- typename VectorType::FloatType testVector = VectorType::CmpGtEq(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, VectorType::CastToInt(testVector));
- int32_t results[4] = { 0, -1, -1, -1 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // CmpLt
- {
- typename VectorType::FloatType testVector = VectorType::CmpLt(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, VectorType::CastToInt(testVector));
- int32_t results[4] = { -1, 0, 0, 0 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // CmpLte
- {
- typename VectorType::FloatType testVector = VectorType::CmpLtEq(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, VectorType::CastToInt(testVector));
- int32_t results[4] = { -1, 0, -1, -1 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- }
- template <typename VectorType>
- void TestCompareAllFloat()
- {
- float testLoadValues1[4] = { -10.1f, 10.0f, -5.1f, 5.0f };
- float testLoadValues2[4] = { -10.0f, 10.1f, -5.0f, 5.1f };
- typename VectorType::FloatType sourceVector1 = VectorType::LoadUnaligned(testLoadValues1);
- typename VectorType::FloatType sourceVector2 = VectorType::LoadUnaligned(testLoadValues2);
- EXPECT_FALSE(VectorType::CmpAllEq(sourceVector1, sourceVector2));
- EXPECT_TRUE (VectorType::CmpAllLt(sourceVector1, sourceVector2));
- EXPECT_TRUE (VectorType::CmpAllLtEq(sourceVector1, sourceVector2));
- EXPECT_FALSE(VectorType::CmpAllGt(sourceVector1, sourceVector2));
- EXPECT_FALSE(VectorType::CmpAllGtEq(sourceVector1, sourceVector2));
- EXPECT_TRUE(VectorType::CmpAllEq(sourceVector1, sourceVector1));
- EXPECT_TRUE(VectorType::CmpAllEq(sourceVector2, sourceVector2));
- EXPECT_FALSE(VectorType::CmpAllLt(sourceVector1, sourceVector1));
- EXPECT_FALSE(VectorType::CmpAllGt(sourceVector1, sourceVector1));
- EXPECT_FALSE(VectorType::CmpAllLt(sourceVector2, sourceVector2));
- EXPECT_FALSE(VectorType::CmpAllGt(sourceVector2, sourceVector2));
- EXPECT_TRUE(VectorType::CmpAllLtEq(sourceVector1, sourceVector1));
- EXPECT_TRUE(VectorType::CmpAllGtEq(sourceVector1, sourceVector1));
- EXPECT_TRUE(VectorType::CmpAllLtEq(sourceVector2, sourceVector2));
- EXPECT_TRUE(VectorType::CmpAllGtEq(sourceVector2, sourceVector2));
- }
- template <typename VectorType>
- void TestCompareInt()
- {
- int32_t testLoadValues1[4] = { -11, 10, -5, 6 };
- int32_t testLoadValues2[4] = { -10, 0, -5, 6 };
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::Int32Type sourceVector1 = VectorType::LoadUnaligned(testLoadValues1);
- typename VectorType::Int32Type sourceVector2 = VectorType::LoadUnaligned(testLoadValues2);
- // CmpEq
- {
- typename VectorType::Int32Type testVector = VectorType::CmpEq(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { 0, 0, -1, -1 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // CmpNeq
- {
- typename VectorType::Int32Type testVector = VectorType::CmpNeq(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { -1, -1, 0, 0 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // CmpGt
- {
- typename VectorType::Int32Type testVector = VectorType::CmpGt(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { 0, -1, 0, 0 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // CmpGte
- {
- typename VectorType::Int32Type testVector = VectorType::CmpGtEq(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { 0, -1, -1, -1 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // CmpLt
- {
- typename VectorType::Int32Type testVector = VectorType::CmpLt(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { -1, 0, 0, 0 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // CmpLte
- {
- typename VectorType::Int32Type testVector = VectorType::CmpLtEq(sourceVector1, sourceVector2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { -1, 0, -1, -1 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- }
- template <typename VectorType>
- void TestCompareAllInt()
- {
- int32_t testLoadValues1[4] = { -10, 11, -4, 6 };
- int32_t testLoadValues2[4] = { -11, 10, -5, 5 };
- typename VectorType::Int32Type sourceVector1 = VectorType::LoadUnaligned(testLoadValues1);
- typename VectorType::Int32Type sourceVector2 = VectorType::LoadUnaligned(testLoadValues2);
- EXPECT_FALSE(VectorType::CmpAllEq(sourceVector1, sourceVector2));
- EXPECT_TRUE(VectorType::CmpAllEq(sourceVector1, sourceVector1));
- EXPECT_TRUE(VectorType::CmpAllEq(sourceVector2, sourceVector2));
- }
- template <typename VectorType>
- void TestReciprocalFloat()
- {
- float testLoadValues[4] = { 2.0f, 4.0f, 8.0f, 1.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- // Reciprocal
- {
- typename VectorType::FloatType testVector = VectorType::Reciprocal(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { 0.5f, 0.25f, 0.125f, 1.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_NEAR(testStoreValues[i], results[i], 0.01f);
- }
- }
- // ReciprocalEstimate
- {
- typename VectorType::FloatType testVector = VectorType::ReciprocalEstimate(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- float results[4] = { 0.5f, 0.25f, 0.125f, 1.0f };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_NEAR(testStoreValues[i], results[i], 0.01f);
- }
- }
- }
- template <typename VectorType>
- void TestSqrtInvSqrtFloat()
- {
- float testLoadValues[4] = { -1.0f, 16.0f, 1.0f, 0.0f };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- // Sqrt
- {
- typename VectorType::FloatType testVector = VectorType::Sqrt(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues[3], 0.0f, 0.002f);
- case 3:
- EXPECT_NEAR(testStoreValues[2], 1.0f, 0.002f);
- case 2:
- EXPECT_NEAR(testStoreValues[1], 4.0f, 0.002f);
- case 1:
- EXPECT_TRUE(AZStd::isnan(testStoreValues[0]));
- break;
- }
- }
- // InvSqrt
- {
- typename VectorType::FloatType testVector = VectorType::SqrtInv(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_TRUE(AZStd::isnan(testStoreValues[3]) || AZStd::isinf(testStoreValues[3]));
- case 3:
- EXPECT_NEAR(testStoreValues[2], 1.0f, 0.002f);
- case 2:
- EXPECT_NEAR(testStoreValues[1], 0.25f, 0.002f);
- case 1:
- EXPECT_TRUE(AZStd::isnan(testStoreValues[0]));
- break;
- }
- }
- }
- template <typename VectorType>
- void TestSin()
- {
- float testLoadValues1[4] = { 0.0f, 0.523598775598f, 1.5707963267949f, 3.141594f };
- float testLoadValues2[4] = { 21.991148575f, 4.18879020479f, -1.5707963267949f, -3.1415926f };
- float testStoreValues1[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- float testStoreValues2[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- float precision = 0.000002f;
- typename VectorType::FloatType sourceVector1 = VectorType::LoadUnaligned(testLoadValues1);
- typename VectorType::FloatType sourceVector2 = VectorType::LoadUnaligned(testLoadValues2);
- {
- typename VectorType::FloatType testVector = VectorType::Sin(sourceVector1);
- VectorType::StoreUnaligned(testStoreValues1, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues1[3], 0.0f, precision);
- case 3:
- EXPECT_NEAR(testStoreValues1[2], 1.0f, precision);
- case 2:
- EXPECT_NEAR(testStoreValues1[1], 0.5f, precision);
- case 1:
- EXPECT_NEAR(testStoreValues1[0], 0.0f, precision);
- }
- }
- {
- typename VectorType::FloatType testVector = VectorType::Sin(sourceVector2);
- VectorType::StoreUnaligned(testStoreValues2, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues2[3], 0.0f, precision);
- case 3:
- EXPECT_NEAR(testStoreValues2[2], -1.0f, precision);
- case 2:
- EXPECT_NEAR(testStoreValues2[1], -0.8660254f, precision);
- case 1:
- EXPECT_NEAR(testStoreValues2[0], 0.0f, precision);
- }
- }
- }
- template <typename VectorType>
- void TestCos()
- {
- float testLoadValues1[4] = { 0.0f, 0.523598775598f, 1.5707963267949f, 3.141594f };
- float testLoadValues2[4] = { 21.991148575f, 4.18879020479f, -1.5707963267949f, -3.1415926f };
- float testStoreValues1[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- float testStoreValues2[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- float precision = 0.000002f;
- typename VectorType::FloatType sourceVector1 = VectorType::LoadUnaligned(testLoadValues1);
- typename VectorType::FloatType sourceVector2 = VectorType::LoadUnaligned(testLoadValues2);
- {
- typename VectorType::FloatType testVector = VectorType::Cos(sourceVector1);
- VectorType::StoreUnaligned(testStoreValues1, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues1[3], -1.0f, precision);
- case 3:
- EXPECT_NEAR(testStoreValues1[2], 0.0f, precision);
- case 2:
- EXPECT_NEAR(testStoreValues1[1], 0.8660254f, precision);
- case 1:
- EXPECT_NEAR(testStoreValues1[0], 1.0f, precision);
- }
- }
- {
- typename VectorType::FloatType testVector = VectorType::Cos(sourceVector2);
- VectorType::StoreUnaligned(testStoreValues2, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues2[3], -1.0f, precision);
- case 3:
- EXPECT_NEAR(testStoreValues2[2], 0.0f, precision);
- case 2:
- EXPECT_NEAR(testStoreValues2[1], -0.5f, precision);
- case 1:
- EXPECT_NEAR(testStoreValues2[0], -1.0f, precision);
- }
- }
- }
- template <typename VectorType>
- void TestAcos()
- {
- float testLoadValues1[4] = { -1.0f, -0.8660254f, -0.5, 0.0f };
- float testLoadValues2[4] = { 0.70710678f, 1.0f, -1.5f, 2.0f };
- float testStoreValues1[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- float testStoreValues2[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- float precision = 0.000002f;
- typename VectorType::FloatType sourceVector1 = VectorType::LoadUnaligned(testLoadValues1);
- typename VectorType::FloatType sourceVector2 = VectorType::LoadUnaligned(testLoadValues2);
- {
- typename VectorType::FloatType testVector = VectorType::Acos(sourceVector1);
- VectorType::StoreUnaligned(testStoreValues1, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues1[3], Constants::HalfPi, precision);
- case 3:
- EXPECT_NEAR(testStoreValues1[2], 2 * Constants::Pi / 3.0f, precision);
- case 2:
- EXPECT_NEAR(testStoreValues1[1], 5 * Constants::Pi / 6.0f, precision);
- case 1:
- EXPECT_NEAR(testStoreValues1[0], Constants::Pi, precision);
- }
- }
- {
- typename VectorType::FloatType testVector = VectorType::Acos(sourceVector2);
- VectorType::StoreUnaligned(testStoreValues2, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_TRUE(AZStd::isnan(testStoreValues2[3]));
- case 3:
- EXPECT_TRUE(AZStd::isnan(testStoreValues2[2]));
- case 2:
- EXPECT_NEAR(testStoreValues2[1], 0.0f, precision);
- case 1:
- EXPECT_NEAR(testStoreValues2[0], Constants::QuarterPi, precision);
- }
- }
- }
- template <typename VectorType>
- void TestAtan()
- {
- float testLoadValues1[4] = { 0.0f, 0.5773503f, 1.0f, 1000.0f };
- float testLoadValues2[4] = { 0.0f, -0.5773503f, -1.0f, -1000.0f };
- float testStoreValues1[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- float testStoreValues2[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- float precision = 0.000002f;
- typename VectorType::FloatType sourceVector1 = VectorType::LoadUnaligned(testLoadValues1);
- typename VectorType::FloatType sourceVector2 = VectorType::LoadUnaligned(testLoadValues2);
- {
- typename VectorType::FloatType testVector = VectorType::Atan(sourceVector1);
- VectorType::StoreUnaligned(testStoreValues1, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues1[3], 1.569796f, precision);
- case 3:
- EXPECT_NEAR(testStoreValues1[2], Constants::Pi / 4.0f, precision);
- case 2:
- EXPECT_NEAR(testStoreValues1[1], Constants::Pi / 6.0f, precision);
- case 1:
- EXPECT_NEAR(testStoreValues1[0], 0.0f, precision);
- }
- }
- {
- typename VectorType::FloatType testVector = VectorType::Atan(sourceVector2);
- VectorType::StoreUnaligned(testStoreValues2, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues2[3], -1.569796f, precision);
- case 3:
- EXPECT_NEAR(testStoreValues2[2], -Constants::Pi / 4.0f, precision);
- case 2:
- EXPECT_NEAR(testStoreValues2[1], -Constants::Pi / 6.0f, precision);
- case 1:
- EXPECT_NEAR(testStoreValues2[0], 0.0f, precision);
- }
- }
- }
- template <typename VectorType>
- void TestAtan2()
- {
- float testLoadValuesY1[4] = { 0.0f, 1.0f, -1.0f, 2.0f };
- float testLoadValuesX1[4] = { 0.0f, 0.0f, 0.0f, 2.0f };
- float testStoreValues1[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- float testLoadValuesY2[4] = { 0.0f, 1.0f, -1.0f, 0.0f };
- float testLoadValuesX2[4] = { -1.0f, -1.0f, -1.0f, 1.0f };
- float testStoreValues2[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- float precision = 0.000002f;
- typename VectorType::FloatType sourceVectorY1 = VectorType::LoadUnaligned(testLoadValuesY1);
- typename VectorType::FloatType sourceVectorX1 = VectorType::LoadUnaligned(testLoadValuesX1);
- typename VectorType::FloatType sourceVectorY2 = VectorType::LoadUnaligned(testLoadValuesY2);
- typename VectorType::FloatType sourceVectorX2 = VectorType::LoadUnaligned(testLoadValuesX2);
- {
- typename VectorType::FloatType testVector = VectorType::Atan2(sourceVectorY1, sourceVectorX1);
- VectorType::StoreUnaligned(testStoreValues1, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues1[3], Constants::Pi / 4.0f, precision);
- case 3:
- EXPECT_NEAR(testStoreValues1[2], -Constants::HalfPi, precision);
- case 2:
- EXPECT_NEAR(testStoreValues1[1], Constants::HalfPi, precision);
- case 1:
- EXPECT_NEAR(testStoreValues1[0], 0.0f, precision);
- }
- }
- {
- typename VectorType::FloatType testVector = VectorType::Atan2(sourceVectorY2, sourceVectorX2);
- VectorType::StoreUnaligned(testStoreValues2, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues2[3], 0.0f, precision);
- case 3:
- EXPECT_NEAR(testStoreValues2[2], -3 * Constants::Pi / 4.0f, precision);
- case 2:
- EXPECT_NEAR(testStoreValues2[1], 3 * Constants::Pi / 4.0f, precision);
- case 1:
- EXPECT_NEAR(testStoreValues2[0], Constants::Pi, precision);
- }
- }
- }
- template <typename VectorType>
- void TestExpEstimate()
- {
- float testLoadValuesX1[4] = { 0.0f, 1.0f, -1.0f, 2.0f };
- float testLoadValuesX2[4] = { 0.5f, 0.9f, -1.1f, 9.0f };
- float precision = 0.005f;
- typename VectorType::FloatType sourceVectorX1 = VectorType::LoadUnaligned(testLoadValuesX1);
- typename VectorType::FloatType sourceVectorX2 = VectorType::LoadUnaligned(testLoadValuesX2);
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType testVector = VectorType::ExpEstimate(sourceVectorX1);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_TRUE(AZ::IsCloseMag(testStoreValues[3], exp(2.0f), precision));
- case 3:
- EXPECT_TRUE(AZ::IsCloseMag(testStoreValues[2], exp(-1.0f), precision));
- case 2:
- EXPECT_TRUE(AZ::IsCloseMag(testStoreValues[1], exp(1.0f), precision));
- case 1:
- EXPECT_TRUE(AZ::IsCloseMag(testStoreValues[0], exp(0.0f), precision));
- }
- }
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::FloatType testVector = VectorType::ExpEstimate(sourceVectorX2);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_TRUE(AZ::IsCloseMag(testStoreValues[3], exp(9.0f), precision));
- case 3:
- EXPECT_TRUE(AZ::IsCloseMag(testStoreValues[2], exp(-1.1f), precision));
- case 2:
- EXPECT_TRUE(AZ::IsCloseMag(testStoreValues[1], exp(0.9f), precision));
- case 1:
- EXPECT_TRUE(AZ::IsCloseMag(testStoreValues[0], exp(0.5f), precision));
- }
- }
- }
- template <typename VectorType>
- void TestConvertToInt()
- {
- // Positive values
- float testLoadValues[4] = { 0.2f, 0.4f, 0.6f, 0.8f };
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- {
- typename VectorType::Int32Type testVector = VectorType::ConvertToInt(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { 0, 0, 0, 0 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // Negative values
- float testNegativeLoadValues[4] = { -0.2f, -0.4f, -0.6f, -0.8f };
- sourceVector = VectorType::LoadUnaligned(testNegativeLoadValues);
- {
- typename VectorType::Int32Type testVector = VectorType::ConvertToInt(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { 0, 0, 0, 0 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // Equidistant values
- float testEquidistantLoadValues[4] = { 0.5f, -0.5f, 1.5f, -1.5f };
- sourceVector = VectorType::LoadUnaligned(testEquidistantLoadValues);
- {
- typename VectorType::Int32Type testVector = VectorType::ConvertToInt(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { 0, 0, 1, -1 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // Whole values
- float testWholeLoadValues[4] = { 0.0f, 1.0f, -1.0f, 2.0f };
- sourceVector = VectorType::LoadUnaligned(testWholeLoadValues);
- {
- typename VectorType::Int32Type testVector = VectorType::ConvertToInt(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { 0, 1, -1, 2 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- }
- template <typename VectorType>
- void TestConvertToIntNearest()
- {
- // Positive values
- float testLoadValues[4] = { 0.2f, 0.4f, 0.6f, 0.8f };
- int32_t testStoreValues[4] = { 0, 0, 0, 0 };
- typename VectorType::FloatType sourceVector = VectorType::LoadUnaligned(testLoadValues);
- {
- typename VectorType::Int32Type testVector = VectorType::ConvertToIntNearest(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { 0, 0, 1, 1 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // Negative values
- float testNegativeLoadValues[4] = { -0.2f, -0.4f, -0.6f, -0.8f };
- sourceVector = VectorType::LoadUnaligned(testNegativeLoadValues);
- {
- typename VectorType::Int32Type testVector = VectorType::ConvertToIntNearest(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { 0, 0, -1, -1 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // Equidistant values
- float testEquidistantLoadValues[4] = { 0.5f, -0.5f, 1.5f, -1.5f };
- sourceVector = VectorType::LoadUnaligned(testEquidistantLoadValues);
- {
- typename VectorType::Int32Type testVector = VectorType::ConvertToIntNearest(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- // The expected behaviour is ties to even (banker's rounding)
- int32_t results[4] = { 0, 0, 2, -2 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- // Whole values
- float testWholeLoadValues[4] = { 0.0f, 1.0f, -1.0f, 2.0f };
- sourceVector = VectorType::LoadUnaligned(testWholeLoadValues);
- {
- typename VectorType::Int32Type testVector = VectorType::ConvertToIntNearest(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- int32_t results[4] = { 0, 1, -1, 2 };
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(results[i]));
- }
- }
- }
- template <typename VectorType>
- void TestConvertToFloat()
- {
- int32_t testLoadValues[4] = { -1, 0, 2, 4 };
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- typename VectorType::Int32Type sourceVector = VectorType::LoadUnaligned(testLoadValues);
- {
- typename VectorType::FloatType testVector = VectorType::ConvertToFloat(sourceVector);
- VectorType::StoreUnaligned(testStoreValues, testVector);
- switch (VectorType::ElementCount)
- {
- case 4:
- EXPECT_NEAR(testStoreValues[3], 4.0f, 0.002f);
- case 3:
- EXPECT_NEAR(testStoreValues[2], 2.0f, 0.002f);
- case 2:
- EXPECT_NEAR(testStoreValues[1], 0.0f, 0.002f);
- case 1:
- EXPECT_NEAR(testStoreValues[0], -1.0f, 0.002f);
- break;
- }
- }
- }
- template <typename VectorType>
- void TestCast()
- {
- int32_t testLoadValues[4] = { -1, 0, 2, 4 };
- float testStoreFloatValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- int32_t testStoreInt32Values[4] = { 0, 0, 0, 0 };
- typename VectorType::Int32Type sourceVector = VectorType::LoadUnaligned(testLoadValues);
- typename VectorType::FloatType testVector1 = VectorType::CastToFloat(sourceVector);
- VectorType::StoreUnaligned(testStoreFloatValues, testVector1);
- EXPECT_TRUE(AZStd::isnan(testStoreFloatValues[0]));
- if constexpr (VectorType::ElementCount > 1)
- {
- EXPECT_NEAR(testStoreFloatValues[1], 0.0f, 0.002f);
- }
- typename VectorType::Int32Type testVector2 = VectorType::CastToInt(testVector1);
- VectorType::StoreUnaligned(testStoreInt32Values, testVector2);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreInt32Values[i], ::testing::Eq(testLoadValues[i]));
- }
- }
- template <typename VectorType>
- void TestZeroVectorFloat()
- {
- const typename Simd::Vec4::FloatType testVector = Simd::Vec4::ZeroFloat();
- float testStoreValues[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
- Simd::Vec4::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::FloatNear(0.0f, AZ::Constants::Tolerance));
- }
- }
- template <typename VectorType>
- void TestZeroVectorInt()
- {
- const typename Simd::Vec4::Int32Type testVector = Simd::Vec4::ZeroInt();
- int32_t testStoreValues[4] = { 1, 1, 1, 1 };
- Simd::Vec4::StoreUnaligned(testStoreValues, testVector);
- for (int32_t i = 0; i < VectorType::ElementCount; ++i)
- {
- EXPECT_THAT(testStoreValues[i], ::testing::Eq(0));
- }
- }
- TEST(MATH_SimdMath, TestToVec1InVec2)
- {
- TestToVec1<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestFromVec1InVec2)
- {
- TestFromVec1<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestToVec1InVec3)
- {
- TestToVec1<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestFromVec1InVec3)
- {
- TestFromVec1<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestToVec2InVec3)
- {
- TestToVec2<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestFromVec2InVec3)
- {
- TestFromVec2<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestToVec1InVec4)
- {
- TestToVec1<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestFromVec1InVec4)
- {
- TestFromVec1<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestToVec2InVec4)
- {
- TestToVec2<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestFromVec2InVec4)
- {
- TestFromVec2<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestToVec3InVec4)
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- float testStoreValues[4] = { -1.0f, -1.0f, -1.0f, -1.0f };
- typename Simd::Vec4::FloatType testVector = Simd::Vec4::LoadUnaligned(testLoadValues);
- Simd::Vec3::FloatType testVec3 = Simd::Vec4::ToVec3(testVector);
- Simd::Vec3::StoreUnaligned(testStoreValues, testVec3);
- for (int32_t i = 0; i < Simd::Vec3::ElementCount; ++i)
- {
- EXPECT_NEAR(testLoadValues[i], testStoreValues[i], AZ::Constants::Tolerance);
- }
- }
- TEST(MATH_SimdMath, TestFromVec3InVec4)
- {
- float testLoadValues[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
- float testStoreValues[4] = { -1.0f, -1.0f, -1.0f, -1.0f };
- Simd::Vec3::FloatType testVec3 = Simd::Vec3::LoadUnaligned(testLoadValues);
- typename Simd::Vec4::FloatType testVector = Simd::Vec4::FromVec3(testVec3);
- Simd::Vec4::StoreUnaligned(testStoreValues, testVector);
- // The first 3 elements must be set to (Vec3.x, Vec3.y, Vec3.z)
- for (int32_t i = 0; i < Simd::Vec3::ElementCount; ++i)
- {
- EXPECT_NEAR(testLoadValues[i], testStoreValues[i], AZ::Constants::Tolerance);
- }
- // The rest of elements must be set to zero
- for (int32_t i = Simd::Vec3::ElementCount; i < Simd::Vec4::ElementCount; ++i)
- {
- EXPECT_NEAR(0.0f, testStoreValues[i], AZ::Constants::Tolerance);
- }
- }
- TEST(MATH_SimdMath, TestLoadStoreFloatVec1)
- {
- TestLoadStoreFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestLoadStoreFloatVec2)
- {
- TestLoadStoreFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestLoadStoreFloatVec3)
- {
- TestLoadStoreFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestLoadStoreFloatVec4)
- {
- TestLoadStoreFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestLoadStoreIntVec1)
- {
- TestLoadStoreInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestLoadStoreIntVec2)
- {
- TestLoadStoreInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestLoadStoreIntVec3)
- {
- TestLoadStoreInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestLoadStoreIntVec4)
- {
- TestLoadStoreInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSelectFirstVec1)
- {
- TestSelectFirst<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestSelectFirstVec2)
- {
- TestSelectFirst<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestSelectSecondVec2)
- {
- TestSelectSecond<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestSelectFirstVec3)
- {
- TestSelectFirst<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestSelectSecondVec3)
- {
- TestSelectSecond<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestSelectThirdVec3)
- {
- TestSelectThird<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestSelectFirstVec4)
- {
- TestSelectFirst<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSelectSecondVec4)
- {
- TestSelectSecond<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSelectThirdVec4)
- {
- TestSelectThird<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSelectFourthVec4)
- {
- TestSelectFourth<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSplatFloatVec1)
- {
- TestSplatFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestSplatFloatVec2)
- {
- TestSplatFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestSplatFloatVec3)
- {
- TestSplatFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestSplatFloatVec4)
- {
- TestSplatFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSplatIntVec1)
- {
- TestSplatInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestSplatIntVec2)
- {
- TestSplatInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestSplatIntVec3)
- {
- TestSplatInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestSplatIntVec4)
- {
- TestSplatInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSplatFirstVec2)
- {
- TestSplatFirst<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestSplatSecondVec2)
- {
- TestSplatSecond<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestSplatFirstVec3)
- {
- TestSplatFirst<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestSplatSecondVec3)
- {
- TestSplatSecond<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestSplatThirdVec3)
- {
- TestSplatThird<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestSplatFirstVec4)
- {
- TestSplatFirst<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSplatSecondVec4)
- {
- TestSplatSecond<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSplatThirdVec4)
- {
- TestSplatThird<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSplatFourthVec4)
- {
- TestSplatFourth<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestReplaceFirstVec2)
- {
- TestReplaceFirst<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestReplaceSecondVec2)
- {
- TestReplaceSecond<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestReplaceFirstVec3)
- {
- TestReplaceFirst<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestReplaceSecondVec3)
- {
- TestReplaceSecond<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestReplaceThirdVec3)
- {
- TestReplaceThird<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestReplaceFirstVec4)
- {
- TestReplaceFirst<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestReplaceSecondVec4)
- {
- TestReplaceSecond<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestReplaceThirdVec4)
- {
- TestReplaceThird<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestReplaceFourthVec4)
- {
- TestReplaceFourth<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestLoadImmediateFloatVec1)
- {
- TestLoadImmediateFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestLoadImmediateFloatVec2)
- {
- TestLoadImmediateFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestLoadImmediateFloatVec3)
- {
- TestLoadImmediateFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestLoadImmediateFloatVec4)
- {
- TestLoadImmediateFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestLoadImmediateIntVec1)
- {
- TestLoadImmediateInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestLoadImmediateIntVec2)
- {
- TestLoadImmediateInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestLoadImmediateIntVec3)
- {
- TestLoadImmediateInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestLoadImmediateIntVec4)
- {
- TestLoadImmediateInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestAddSubMulDivFloatVec1)
- {
- TestAddSubMulDivFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestAddSubMulDivFloatVec2)
- {
- TestAddSubMulDivFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestAddSubMulDivFloatVec3)
- {
- TestAddSubMulDivFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestAddSubMulDivFloatVec4)
- {
- TestAddSubMulDivFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestAddSubMulIntVec1)
- {
- TestAddSubMulInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestAddSubMulIntVec2)
- {
- TestAddSubMulInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestAddSubMulIntVec3)
- {
- TestAddSubMulInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestAddSubMulIntVec4)
- {
- TestAddSubMulInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestNotFloatVec1)
- {
- TestNotFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestNotFloatVec2)
- {
- TestNotFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestNotFloatVec3)
- {
- TestNotFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestNotFloatVec4)
- {
- TestNotFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestAndAndnotOrFloatVec1)
- {
- TestAndAndnotOrFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestAndAndnotOrFloatVec2)
- {
- TestAndAndnotOrFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestAndAndnotOrFloatVec3)
- {
- TestAndAndnotOrFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestAndAndnotOrFloatVec4)
- {
- TestAndAndnotOrFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestXorFloatVec1)
- {
- TestXorFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestXorFloatVec2)
- {
- TestXorFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestXorFloatVec3)
- {
- TestXorFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestXorFloatVec4)
- {
- TestXorFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestNotIntVec1)
- {
- TestNotInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestNotIntVec2)
- {
- TestNotInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestNotIntVec3)
- {
- TestNotInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestNotIntVec4)
- {
- TestNotInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestAndAndnotOrIntVec1)
- {
- TestAndAndnotOrInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestAndAndnotOrIntVec2)
- {
- TestAndAndnotOrInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestAndAndnotOrIntVec3)
- {
- TestAndAndnotOrInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestAndAndnotOrIntVec4)
- {
- TestAndAndnotOrInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestXorIntVec1)
- {
- TestXorInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestXorIntVec2)
- {
- TestXorInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestXorIntVec3)
- {
- TestXorInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestXorIntVec4)
- {
- TestXorInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestMinMaxIntVec1)
- {
- TestMinMaxInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestMinMaxIntVec2)
- {
- TestMinMaxInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestMinMaxIntVec3)
- {
- TestMinMaxInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestMinMaxIntVec4)
- {
- TestMinMaxInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestClampIntVec1)
- {
- TestClampInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestClampIntVec2)
- {
- TestClampInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestClampIntVec3)
- {
- TestClampInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestClampIntVec4)
- {
- TestClampInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestFloorFloatVec1)
- {
- TestFloorFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestFloorFloatVec2)
- {
- TestFloorFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestFloorFloatVec3)
- {
- TestFloorFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestFloorFloatVec4)
- {
- TestFloorFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestCeilFloatVec1)
- {
- TestCeilFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestCeilFloatVec2)
- {
- TestCeilFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestCeilFloatVec3)
- {
- TestCeilFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestCeilFloatVec4)
- {
- TestCeilFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestRoundFloatVec1)
- {
- TestRoundFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestRoundFloatVec2)
- {
- TestRoundFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestRoundFloatVec3)
- {
- TestRoundFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestRoundFloatVec4)
- {
- TestRoundFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestTruncateFloatVec1)
- {
- TestTruncateFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestTruncateFloatVec2)
- {
- TestTruncateFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestTruncateFloatVec3)
- {
- TestTruncateFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestTruncateFloatVec4)
- {
- TestTruncateFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestMinMaxFloatVec1)
- {
- TestMinMaxFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestMinMaxFloatVec2)
- {
- TestMinMaxFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestMinMaxFloatVec3)
- {
- TestMinMaxFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestMinMaxFloatVec4)
- {
- TestMinMaxFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestClampFloatVec1)
- {
- TestClampFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestClampFloatVec2)
- {
- TestClampFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestClampFloatVec3)
- {
- TestClampFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestClampFloatVec4)
- {
- TestClampFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestCompareFloatVec1)
- {
- TestCompareFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestCompareFloatVec2)
- {
- TestCompareFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestCompareFloatVec3)
- {
- TestCompareFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestCompareFloatVec4)
- {
- TestCompareFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestCompareAllFloatVec1)
- {
- TestCompareAllFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestCompareAllFloatVec2)
- {
- TestCompareAllFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestCompareAllFloatVec3)
- {
- TestCompareAllFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestCompareAllFloatVec4)
- {
- TestCompareAllFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestCompareIntVec1)
- {
- TestCompareInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestCompareIntVec2)
- {
- TestCompareInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestCompareIntVec3)
- {
- TestCompareInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestCompareIntVec4)
- {
- TestCompareInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestCompareAllIntVec1)
- {
- TestCompareAllInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestCompareAllIntVec2)
- {
- TestCompareAllInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestCompareAllIntVec3)
- {
- TestCompareAllInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestCompareAllIntVec4)
- {
- TestCompareAllInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestReciprocalFloatVec1)
- {
- TestReciprocalFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestReciprocalFloatVec2)
- {
- TestReciprocalFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestReciprocalFloatVec3)
- {
- TestReciprocalFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestReciprocalFloatVec4)
- {
- TestReciprocalFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSqrtInvSqrtFloatVec1)
- {
- TestSqrtInvSqrtFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestSqrtInvSqrtFloatVec2)
- {
- TestSqrtInvSqrtFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestSqrtInvSqrtFloatVec3)
- {
- TestSqrtInvSqrtFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestSqrtInvSqrtFloatVec4)
- {
- TestSqrtInvSqrtFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestSinVec1)
- {
- TestSin<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestSinVec2)
- {
- TestSin<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestSinVec3)
- {
- TestSin<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestSinVec4)
- {
- TestSin<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestCosVec1)
- {
- TestCos<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestCosVec2)
- {
- TestCos<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestCosVec3)
- {
- TestCos<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestCosVec4)
- {
- TestCos<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestAcosVec1)
- {
- TestAcos<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestAcosVec2)
- {
- TestAcos<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestAcosVec3)
- {
- TestAcos<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestAcosVec4)
- {
- TestAcos<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestAtanVec1)
- {
- TestAtan<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestAtanVec2)
- {
- TestAtan<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestAtanVec3)
- {
- TestAtan<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestAtanVec4)
- {
- TestAtan<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestAtan2Vec1)
- {
- TestAtan2<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestAtan2Vec2)
- {
- TestAtan2<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestAtan2Vec3)
- {
- TestAtan2<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestAtan2Vec4)
- {
- TestAtan2<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestExpEstimateVec1)
- {
- TestExpEstimate<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestExpEstimateVec2)
- {
- TestExpEstimate<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestExpEstimateVec3)
- {
- TestExpEstimate<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestExpEstimateVec4)
- {
- TestExpEstimate<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestDotFloatVec2)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- Simd::Vec2::FloatType sourceVector1 = Simd::Vec2::LoadImmediate(-1.0f, 16.0f);
- Simd::Vec2::FloatType sourceVector2 = Simd::Vec2::LoadImmediate(-1.0f, 16.0f);
- Simd::Vec1::FloatType testDot = Simd::Vec2::Dot(sourceVector1, sourceVector2);
- Simd::Vec1::StoreUnaligned(testStoreValues, testDot);
- EXPECT_NEAR(testStoreValues[0], 257.0f, 0.002f);
- }
- TEST(MATH_SimdMath, TestDotFloatVec3)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- Simd::Vec3::FloatType sourceVector1 = Simd::Vec3::LoadImmediate(-1.0f, 16.0f, 1.0f);
- Simd::Vec3::FloatType sourceVector2 = Simd::Vec3::LoadImmediate(-1.0f, 16.0f, 1.0f);
- Simd::Vec1::FloatType testDot = Simd::Vec3::Dot(sourceVector1, sourceVector2);
- Simd::Vec1::StoreUnaligned(testStoreValues, testDot);
- EXPECT_NEAR(testStoreValues[0], 258.0f, 0.002f);
- }
- TEST(MATH_SimdMath, TestDotFloatVec4)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- Simd::Vec4::FloatType sourceVector1 = Simd::Vec4::LoadImmediate(-1.0f, 16.0f, 1.0f, 1.0f);
- Simd::Vec4::FloatType sourceVector2 = Simd::Vec4::LoadImmediate(-1.0f, 16.0f, 1.0f, -1.0f);
- Simd::Vec1::FloatType testDot = Simd::Vec4::Dot(sourceVector1, sourceVector2);
- Simd::Vec1::StoreUnaligned(testStoreValues, testDot);
- EXPECT_NEAR(testStoreValues[0], 257.0f, 0.002f);
- }
- TEST(MATH_SimdMath, TestCrossFloatVec3)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- Simd::Vec3::FloatType sourceVector1 = Simd::Vec3::LoadImmediate(1.0f, 0.0f, 0.0f);
- Simd::Vec3::FloatType sourceVector2 = Simd::Vec3::LoadImmediate(0.0f, 1.0f, 0.0f);
- Simd::Vec3::FloatType sourceVector3 = Simd::Vec3::LoadImmediate(0.0f, 0.0f, 1.0f);
- {
- Simd::Vec3::FloatType testVector = Simd::Vec3::Cross(sourceVector1, sourceVector2);
- Simd::Vec3::StoreUnaligned(testStoreValues, testVector);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 1.0f, 0.002f);
- // The 4th element value cannot be guaranteed, it generally sets garbage.
- }
- {
- Simd::Vec3::FloatType testVector = Simd::Vec3::Cross(sourceVector2, sourceVector3);
- Simd::Vec3::StoreUnaligned(testStoreValues, testVector);
- EXPECT_NEAR(testStoreValues[0], 1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 0.0f, 0.002f);
- // The 4th element value cannot be guaranteed, it generally sets garbage.
- }
- {
- Simd::Vec3::FloatType testVector = Simd::Vec3::Cross(sourceVector3, sourceVector1);
- Simd::Vec3::StoreUnaligned(testStoreValues, testVector);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 0.0f, 0.002f);
- // The 4th element value cannot be guaranteed, it generally sets garbage.
- }
- }
- TEST(MATH_SimdMath, TestMat3x3Inverse)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- Simd::Vec3::FloatType rows[3];
- rows[0] = Simd::Vec3::LoadImmediate(2.0f, 0.0f, 0.0f);
- rows[1] = Simd::Vec3::LoadImmediate(0.0f, 2.0f, 0.0f);
- rows[2] = Simd::Vec3::LoadImmediate(0.0f, 0.0f, 2.0f);
- Simd::Vec3::Mat3x3Inverse(rows, rows);
- Simd::Vec3::StoreUnaligned(testStoreValues, rows[0]);
- EXPECT_NEAR(testStoreValues[0], 0.5f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 0.0f, 0.002f);
- Simd::Vec3::StoreUnaligned(testStoreValues, rows[1]);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 0.5f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 0.0f, 0.002f);
- Simd::Vec3::StoreUnaligned(testStoreValues, rows[2]);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 0.5f, 0.002f);
- }
- TEST(MATH_SimdMath, TestMat3x3Adjugate)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- Simd::Vec3::FloatType rows[3];
- rows[0] = Simd::Vec3::LoadImmediate( 1.0f, 2.0f, 3.0f);
- rows[1] = Simd::Vec3::LoadImmediate( 2.0f, 0.0f, 1.0f);
- rows[2] = Simd::Vec3::LoadImmediate(-1.0f, 1.0f, 2.0f);
- Simd::Vec3::Mat3x3Adjugate(rows, rows);
- Simd::Vec3::StoreUnaligned(testStoreValues, rows[0]);
- EXPECT_NEAR(testStoreValues[0], -1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], -1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 2.0f, 0.002f);
- Simd::Vec3::StoreUnaligned(testStoreValues, rows[1]);
- EXPECT_NEAR(testStoreValues[0], -5.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 5.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 5.0f, 0.002f);
- Simd::Vec3::StoreUnaligned(testStoreValues, rows[2]);
- EXPECT_NEAR(testStoreValues[0], 2.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], -3.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], -4.0f, 0.002f);
- }
- TEST(MATH_SimdMath, TestMat3x3Transpose)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- Simd::Vec3::FloatType rows[3];
- rows[0] = Simd::Vec3::LoadImmediate(1.0f, 2.0f, 3.0f);
- rows[1] = Simd::Vec3::LoadImmediate(4.0f, 5.0f, 6.0f);
- rows[2] = Simd::Vec3::LoadImmediate(7.0f, 8.0f, 9.0f);
- Simd::Vec3::Mat3x3Transpose(rows, rows);
- Simd::Vec3::StoreUnaligned(testStoreValues, rows[0]);
- EXPECT_NEAR(testStoreValues[0], 1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 4.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 7.0f, 0.002f);
- Simd::Vec3::StoreUnaligned(testStoreValues, rows[1]);
- EXPECT_NEAR(testStoreValues[0], 2.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 5.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 8.0f, 0.002f);
- Simd::Vec3::StoreUnaligned(testStoreValues, rows[2]);
- EXPECT_NEAR(testStoreValues[0], 3.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 6.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 9.0f, 0.002f);
- }
- TEST(MATH_SimdMath, TestMat3x3Multiply)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- Simd::Vec3::FloatType rowsA[3];
- rowsA[0] = Simd::Vec3::LoadImmediate(2.0f, 0.0f, 0.0f);
- rowsA[1] = Simd::Vec3::LoadImmediate(0.0f, 2.0f, 0.0f);
- rowsA[2] = Simd::Vec3::LoadImmediate(0.0f, 0.0f, 2.0f);
- Simd::Vec3::FloatType rowsB[3];
- rowsB[0] = Simd::Vec3::LoadImmediate(0.5f, 0.0f, 0.0f);
- rowsB[1] = Simd::Vec3::LoadImmediate(0.0f, 0.5f, 0.0f);
- rowsB[2] = Simd::Vec3::LoadImmediate(0.0f, 0.0f, 0.5f);
- Simd::Vec3::FloatType out[3];
- Simd::Vec3::Mat3x3Multiply(rowsA, rowsB, out);
- Simd::Vec3::StoreUnaligned(testStoreValues, out[0]);
- EXPECT_NEAR(testStoreValues[0], 1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 0.0f, 0.002f);
- Simd::Vec3::StoreUnaligned(testStoreValues, out[1]);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 0.0f, 0.002f);
- Simd::Vec3::StoreUnaligned(testStoreValues, out[2]);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 1.0f, 0.002f);
- }
- TEST(MATH_SimdMath, TestMat3x3TransposeMultiply)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- Simd::Vec3::FloatType rowsA[3];
- rowsA[0] = Simd::Vec3::LoadImmediate(2.0f, 0.0f, 0.0f);
- rowsA[1] = Simd::Vec3::LoadImmediate(0.0f, 2.0f, 0.0f);
- rowsA[2] = Simd::Vec3::LoadImmediate(0.0f, 0.0f, 2.0f);
- Simd::Vec3::FloatType rowsB[3];
- rowsB[0] = Simd::Vec3::LoadImmediate(0.5f, 0.0f, 0.0f);
- rowsB[1] = Simd::Vec3::LoadImmediate(0.0f, 0.5f, 0.0f);
- rowsB[2] = Simd::Vec3::LoadImmediate(0.0f, 0.0f, 0.5f);
- Simd::Vec3::FloatType out[3];
- Simd::Vec3::Mat3x3TransposeMultiply(rowsA, rowsB, out);
- Simd::Vec3::StoreUnaligned(testStoreValues, out[0]);
- EXPECT_NEAR(testStoreValues[0], 1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 0.0f, 0.002f);
- Simd::Vec3::StoreUnaligned(testStoreValues, out[1]);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 0.0f, 0.002f);
- Simd::Vec3::StoreUnaligned(testStoreValues, out[2]);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 1.0f, 0.002f);
- }
- TEST(MATH_SimdMath, TestQuaternion)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- AZ::Quaternion quat1 = AZ::Quaternion::CreateRotationZ(DegToRad(90.0f));
- Simd::Vec4::FloatType quatVec1 = Simd::Vec4::LoadImmediate(quat1.GetX(), quat1.GetY(), quat1.GetZ(), quat1.GetW());
- AZ::Quaternion quat2 = AZ::Quaternion::CreateRotationX(DegToRad(90.0f));
- Simd::Vec4::FloatType quatVec2 = Simd::Vec4::LoadImmediate(quat2.GetX(), quat2.GetY(), quat2.GetZ(), quat2.GetW());
- Simd::Vec3::FloatType yAxisVec = Simd::Vec3::LoadImmediate(0.0f, 1.0f, 0.0f);
- {
- Simd::Vec4::FloatType testVector = Simd::Vec4::QuaternionMultiply(quatVec1, quatVec2);
- Simd::Vec4::StoreUnaligned(testStoreValues, testVector);
- EXPECT_NEAR(testStoreValues[0], 0.5f, 0.003f); // TODO: Get new trig, improve precision
- EXPECT_NEAR(testStoreValues[1], 0.5f, 0.003f); // TODO: Get new trig, improve precision
- EXPECT_NEAR(testStoreValues[2], 0.5f, 0.003f); // TODO: Get new trig, improve precision
- EXPECT_NEAR(testStoreValues[3], 0.5f, 0.003f); // TODO: Get new trig, improve precision
- }
- {
- Simd::Vec3::FloatType testVector = Simd::Vec4::QuaternionTransform(quatVec1, yAxisVec);
- Simd::Vec3::StoreUnaligned(testStoreValues, testVector);
- EXPECT_NEAR(testStoreValues[0], -1.0f, 0.003f); // TODO: Get new trig, improve precision
- EXPECT_NEAR(testStoreValues[1], 0.0f, 0.003f); // TODO: Get new trig, improve precision
- EXPECT_NEAR(testStoreValues[2], 0.0f, 0.003f); // TODO: Get new trig, improve precision
- }
- {
- Simd::Vec3::FloatType testVector = Simd::Vec4::QuaternionTransform(quatVec2, yAxisVec);
- Simd::Vec3::StoreUnaligned(testStoreValues, testVector);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.003f); // TODO: Get new trig, improve precision
- EXPECT_NEAR(testStoreValues[1], 0.0f, 0.003f); // TODO: Get new trig, improve precision
- EXPECT_NEAR(testStoreValues[2], 1.0f, 0.003f); // TODO: Get new trig, improve precision
- }
- }
- TEST(MATH_SimdMath, TestPlane)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- // Point offset orthogonal to the plane normal, offset should be discarded
- {
- Simd::Vec3::FloatType normalVec = Simd::Vec3::LoadImmediate(0.0f, 1.0f, 0.0f);
- Simd::Vec3::FloatType pointVec = Simd::Vec3::LoadImmediate(1.0f, 0.0f, 0.0f);
- Simd::Vec4::FloatType planeVec = Simd::Vec4::ConstructPlane(normalVec, pointVec);
- Simd::Vec4::StoreUnaligned(testStoreValues, planeVec);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[3], 0.0f, 0.002f);
- Simd::Vec3::FloatType testPoint = Simd::Vec3::LoadImmediate(0.0f, 10.0f, 0.0f);
- Simd::Vec1::FloatType testDist = Simd::Vec4::PlaneDistance(planeVec, testPoint);
- Simd::Vec1::StoreUnaligned(testStoreValues, testDist);
- EXPECT_NEAR(testStoreValues[0], 10.0f, 0.002f);
- }
- // Point offset along the plane normal, offset should be preserved in distance calculations
- {
- Simd::Vec3::FloatType normalVec = Simd::Vec3::LoadImmediate(0.0f, 1.0f, 0.0f);
- Simd::Vec3::FloatType pointVec = Simd::Vec3::LoadImmediate(0.0f, 10.0f, 0.0f);
- Simd::Vec4::FloatType planeVec = Simd::Vec4::ConstructPlane(normalVec, pointVec);
- Simd::Vec4::StoreUnaligned(testStoreValues, planeVec);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[3], -10.0f, 0.002f);
- Simd::Vec3::FloatType testPoint = Simd::Vec3::LoadImmediate(0.0f, -5.0f, 0.0f);
- Simd::Vec1::FloatType testDist = Simd::Vec4::PlaneDistance(planeVec, testPoint);
- Simd::Vec1::StoreUnaligned(testStoreValues, testDist);
- EXPECT_NEAR(testStoreValues[0], -15.0f, 0.002f);
- }
- }
- TEST(MATH_SimdMath, TestMat3x4Transpose)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- Simd::Vec4::FloatType rows[4];
- rows[0] = Simd::Vec4::LoadImmediate(0.0f, 1.0f, 2.0f, 3.0f);
- rows[1] = Simd::Vec4::LoadImmediate(4.0f, 5.0f, 6.0f, 7.0f);
- rows[2] = Simd::Vec4::LoadImmediate(8.0f, 9.0f, -1.0f, -2.0f);
- Simd::Vec4::Mat3x4Transpose(rows, rows);
- Simd::Vec4::StoreUnaligned(testStoreValues, rows[0]);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 4.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 8.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[3], 0.0f, 0.002f);
- Simd::Vec4::StoreUnaligned(testStoreValues, rows[1]);
- EXPECT_NEAR(testStoreValues[0], 1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 5.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 9.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[3], 0.0f, 0.002f);
- Simd::Vec4::StoreUnaligned(testStoreValues, rows[2]);
- EXPECT_NEAR(testStoreValues[0], 2.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 6.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], -1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[3], 0.0f, 0.002f);
- }
- TEST(MATH_SimdMath, TestMat4x4Transpose)
- {
- float testStoreValues[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- Simd::Vec4::FloatType rows[4];
- rows[0] = Simd::Vec4::LoadImmediate(0.0f, 1.0f, 2.0f, 3.0f);
- rows[1] = Simd::Vec4::LoadImmediate(4.0f, 5.0f, 6.0f, 7.0f);
- rows[2] = Simd::Vec4::LoadImmediate(8.0f, 9.0f, 9.1f, 9.9f);
- rows[3] = Simd::Vec4::LoadImmediate(-1.0f, -2.0f, -3.0f, -4.0f);
- Simd::Vec4::Mat4x4Transpose(rows, rows);
- Simd::Vec4::StoreUnaligned(testStoreValues, rows[0]);
- EXPECT_NEAR(testStoreValues[0], 0.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 4.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 8.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[3], -1.0f, 0.002f);
- Simd::Vec4::StoreUnaligned(testStoreValues, rows[1]);
- EXPECT_NEAR(testStoreValues[0], 1.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 5.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 9.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[3], -2.0f, 0.002f);
- Simd::Vec4::StoreUnaligned(testStoreValues, rows[2]);
- EXPECT_NEAR(testStoreValues[0], 2.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 6.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 9.1f, 0.002f);
- EXPECT_NEAR(testStoreValues[3], -3.0f, 0.002f);
- Simd::Vec4::StoreUnaligned(testStoreValues, rows[3]);
- EXPECT_NEAR(testStoreValues[0], 3.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[1], 7.0f, 0.002f);
- EXPECT_NEAR(testStoreValues[2], 9.9f, 0.002f);
- EXPECT_NEAR(testStoreValues[3], -4.0f, 0.002f);
- }
- TEST(MATH_SimdMath, TestConvertToIntVec1)
- {
- TestConvertToInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestConvertToIntVec2)
- {
- TestConvertToInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestConvertToIntVec3)
- {
- TestConvertToInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestConvertToIntVec4)
- {
- TestConvertToInt<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestConvertToIntNearestVec1)
- {
- TestConvertToIntNearest<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestConvertToIntNearestVec2)
- {
- TestConvertToIntNearest<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestConvertToIntNearestVec3)
- {
- TestConvertToIntNearest<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestConvertToIntNearestVec4)
- {
- TestConvertToIntNearest<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestConvertToFloatVec1)
- {
- TestConvertToFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestConvertToFloatVec2)
- {
- TestConvertToFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestConvertToFloatVec3)
- {
- TestConvertToFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestConvertToFloatVec4)
- {
- TestConvertToFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestCastVec1)
- {
- TestCast<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestCastVec2)
- {
- TestCast<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestCastVec3)
- {
- TestCast<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestCastVec4)
- {
- TestCast<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestZeroVectorFloatVec1)
- {
- TestZeroVectorFloat<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestZeroVectorFloatVec2)
- {
- TestZeroVectorFloat<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestZeroVectorFloatVec3)
- {
- TestZeroVectorFloat<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestZeroVectorFloatVec4)
- {
- TestZeroVectorFloat<Simd::Vec4>();
- }
- TEST(MATH_SimdMath, TestZeroVectorIntVec1)
- {
- TestZeroVectorInt<Simd::Vec1>();
- }
- TEST(MATH_SimdMath, TestZeroVectorIntVec2)
- {
- TestZeroVectorInt<Simd::Vec2>();
- }
- TEST(MATH_SimdMath, TestZeroVectorIntVec3)
- {
- TestZeroVectorInt<Simd::Vec3>();
- }
- TEST(MATH_SimdMath, TestZeroVectorIntVec4)
- {
- TestZeroVectorInt<Simd::Vec4>();
- }
- }
|