Skip to content

Instantly share code, notes, and snippets.

@djbelyak
Created April 8, 2020 08:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save djbelyak/4654eb726ca419d551a7ac226d730bb1 to your computer and use it in GitHub Desktop.
Save djbelyak/4654eb726ca419d551a7ac226d730bb1 to your computer and use it in GitHub Desktop.
Linalg and DirectXMath comparison
#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file
#define CATCH_CONFIG_ENABLE_BENCHMARKING
#include "catch.hpp"
#include "linalg.h"
using namespace linalg::aliases;
using namespace linalg::ostream_overloads;
#define _XM_NO_INTRINSICS_
#include <DirectXMath.h>
using namespace DirectX;
TEST_CASE("Linalg test")
{
float4x4 A = { {1, 5, 9, 13}, {2, 6, 10, 14}, {3, 7, 11, 15}, {4, 8, 12, 16} };
float4x4 B = { {16, 12, 8, 4 }, {15, 11, 7, 3 }, {14, 10, 6, 2}, {13, 9, 5, 1} };
float4x4 ExpectedMatrix = { { 80, 240.0f, 400.0f, 560.0f }, { 70.0f, 214.0f, 358.0f, 502.0f },
{ 60.0f, 188.0f, 316.0f, 444.0f }, { 50.0f, 162.0f, 274.0f, 386.0f } };
REQUIRE(mul(A, B) != (A * B));
REQUIRE(mul(A, B) == ExpectedMatrix);
REQUIRE(mul(B, A) != ExpectedMatrix);
REQUIRE(mul(transpose(B), transpose(A)) == transpose(mul(A, B)));
REQUIRE(transpose(mul(transpose(B), transpose(A))) == ExpectedMatrix);
float4 X = { 1.f, 2.f, 3.f, 4.f };
float4 ExpectedVector = { 30.0f, 70.0f, 110.0f, 150.0f };
REQUIRE(mul(A, X) == ExpectedVector);
}
bool IsXMMATRIXAreEqual(const XMMATRIX& expected, const XMMATRIX& result)
{
bool equal = true;
for (UINT i = 0; i < 4; i++)
{
for (UINT j = 0; j < 4; j++)
{
equal &= (expected.m[i][j] == result.m[i][j]);
}
}
return equal;
}
TEST_CASE("DirecX Math test")
{
XMMATRIX A (1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10., 11.f, 12.f, 13.f, 14.f, 15.f, 16.f);
XMMATRIX B (16.f, 15.f, 14.f, 13.f, 12.f, 11.f, 10.f, 9.f, 8.f, 7.f, 6.f, 5.f, 4.f, 3.f, 2.f, 1.f);
XMMATRIX ExpectedMatrix (80.f, 70.0f, 60.0f, 50.0f, 240.0f, 214.0f, 188.0f, 162.0f, 400.0f, 358.0f, 316.0f, 274.0f, 560.0f, 502.0f, 444.0f, 386.0f);
REQUIRE(IsXMMATRIXAreEqual(XMMatrixMultiply(A, B), (A * B)));
REQUIRE(IsXMMATRIXAreEqual(ExpectedMatrix, (A * B)));
REQUIRE(!IsXMMATRIXAreEqual(ExpectedMatrix, (B * A)));
REQUIRE(IsXMMATRIXAreEqual(ExpectedMatrix, XMMatrixTranspose(XMMatrixTranspose(B) * XMMatrixTranspose(A))));
REQUIRE(IsXMMATRIXAreEqual(XMMatrixTranspose(A * B), XMMatrixTranspose(B) * XMMatrixTranspose(A)));
XMFLOAT4 X(1.f, 2.f, 3.f, 4.f);
XMFLOAT4 ExpectedVector(30.0f, 70.0f, 110.0f, 150.0f);
REQUIRE(XMVector4Equal(XMVector4Transform(XMLoadFloat4(&X), XMMatrixTranspose(A)), XMLoadFloat4(&ExpectedVector)));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment