diff --git a/tests/shader.cpp b/tests/shader.cpp index 29c07481..7fa73312 100644 --- a/tests/shader.cpp +++ b/tests/shader.cpp @@ -268,4 +268,33 @@ SHADER_TEST_CASE("FLR", "[shader][vertex]") { REQUIRE(shader->runScalar({-1.5}) == -2.0f); REQUIRE(std::isnan(shader->runScalar({NAN}))); REQUIRE(std::isinf(shader->runScalar({INFINITY}))); +} + +SHADER_TEST_CASE("Uniform Read", "[shader][vertex][uniform]") { + const auto constant0 = nihstro::SourceRegister::MakeFloat(0); + auto shader = TestType::assembleTest({ + {nihstro::OpCode::Id::MOVA, nihstro::DestRegister{}, "x", input0, "x", nihstro::SourceRegister{}, "", nihstro::InlineAsm::RelativeAddress::A1 + }, + {nihstro::OpCode::Id::MOV, output0, "xyzw", constant0, "xyzw", nihstro::SourceRegister{}, "", nihstro::InlineAsm::RelativeAddress::A1}, + {nihstro::OpCode::Id::END}, + }); + + // Generate float uniforms + std::array, 96> floatUniforms = {}; + for (u32 i = 0; i < 96; ++i) { + const float color = (i * 2.0f) / 255.0f; + const Floats::f24 color24 = Floats::f24::fromFloat32(color); + const std::array testValue = {color24, color24, color24, Floats::f24::fromFloat32(1.0f)}; + shader->floatUniforms()[i] = testValue; + floatUniforms[i] = testValue; + } + + for (u32 i = 0; i < 96; ++i) { + const float index = static_cast(i); + // Intentionally use some fractional values to verify float->integer + // truncation during address translation + const float fractional = (i % 17) / 17.0f; + + REQUIRE(shader->runVector({index + fractional}) == floatUniforms[i]); + } } \ No newline at end of file