From 5adf837c72c2696c7a7c10dbf406e37c395eb30a Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Mon, 11 Mar 2024 13:33:54 -0700 Subject: [PATCH] Implement `ADD` instruction unit-test --- tests/dynapica.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/tests/dynapica.cpp b/tests/dynapica.cpp index ce0b06bf..0ae0156c 100644 --- a/tests/dynapica.cpp +++ b/tests/dynapica.cpp @@ -1,10 +1,69 @@ +#include + #include +#include #include #include +#include +#include -#include "PICA/shader.hpp" +using namespace Floats; #if defined(PANDA3DS_SHADER_JIT_SUPPORTED) -TEST_CASE("Test", "[shader][dynapica]") {} + +static std::unique_ptr assembleVertexShader(std::initializer_list code) { + const auto shbin = nihstro::InlineAsm::CompileToRawBinary(code); + + auto shader = std::make_unique(ShaderType::Vertex); + shader->reset(); + + for (const nihstro::Instruction& instruction : shbin.program) { + shader->uploadWord(instruction.hex); + } + for (const nihstro::SwizzlePattern& swizzle : shbin.swizzle_table) { + shader->uploadDescriptor(swizzle.hex); + } + shader->finalize(); + return shader; +} + +class VertexShaderTest { + private: + std::unique_ptr shader; + + public: + explicit VertexShaderTest(std::initializer_list code) : shader(assembleVertexShader(code)) {} + + // Multiple inputs, singular scalar output + float RunScalar(std::initializer_list inputs) { + usize input_index = 0; + for (const float& input : inputs) { + const std::array input_vec = std::array{f24::fromFloat32(1.0), f24::zero(), f24::zero(), f24::zero()}; + shader->inputs[input_index++] = input_vec; + } + shader->run(); + return shader->outputs[0][0]; + } + + static std::unique_ptr assembleTest(std::initializer_list code) { + return std::make_unique(code); + } +}; + +TEST_CASE("ADD", "[shader][vertex]") { + const nihstro::SourceRegister input0 = nihstro::SourceRegister::MakeInput(0); + const nihstro::SourceRegister input1 = nihstro::SourceRegister::MakeInput(1); + const nihstro::DestRegister output0 = nihstro::DestRegister::MakeOutput(0); + + const auto shader = VertexShaderTest::assembleTest({ + {nihstro::OpCode::Id::ADD, output0, input0, input1}, + {nihstro::OpCode::Id::END}, + }); + REQUIRE(shader->RunScalar({+1.0f, -1.0f}) == +0.0f); + REQUIRE(shader->RunScalar({+0.0f, -0.0f}) == -0.0f); + REQUIRE(std::isnan(shader->RunScalar({+INFINITY, -INFINITY}))); + REQUIRE(std::isinf(shader->RunScalar({INFINITY, +1.0f}))); + REQUIRE(std::isinf(shader->RunScalar({INFINITY, -1.0f}))); +} #endif \ No newline at end of file