fix(shader): return src0 when both f32 min/max sources are NaN
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
fc325936b5
commit
1f5d84a619
|
|
@ -0,0 +1,372 @@
|
|||
#include "prx/libSceAgcDriver/Execution/include/VulkanDevice.hpp"
|
||||
#include "prx/libSceAgcDriver/Graphics/include/Draw.hpp"
|
||||
#include "Recompiler.hpp"
|
||||
#include "VulkanTestDevice.hpp"
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <bit>
|
||||
#include <cmath>
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace {
|
||||
|
||||
using AgcDriver::Graphics::Require;
|
||||
using ShaderRecompiler::ShaderStage;
|
||||
|
||||
constexpr std::uint32_t Threads = 32;
|
||||
constexpr std::uint32_t Inputs = 4;
|
||||
constexpr std::uint32_t Results = 16;
|
||||
alignas(256) std::array<std::uint32_t, Threads * Inputs> Input{};
|
||||
alignas(256) std::array<std::uint32_t, Threads * Results> Output{};
|
||||
|
||||
alignas(256) constexpr std::array<std::uint32_t, 22> Code{
|
||||
0x34020084, 0x34060086, 0xe0381000, 0x80000401, 0xbf8c3f70, 0x1e140b04, 0x20160b04, 0xd551000c,
|
||||
0x041a0b04, 0xd554000d, 0x041a0b04, 0xd557000e, 0x041a0b04, 0xd50f000f, 0x02020b04, 0xd5100010,
|
||||
0x02020b04, 0xe0781000, 0x80010a03, 0xe0781010, 0x80010e03, 0xbf810000,
|
||||
};
|
||||
|
||||
constexpr std::uint32_t Rows[128][4] = {
|
||||
{0x00000000u, 0x00000000u, 0x80000000u, 0x00000000u},
|
||||
{0x00000000u, 0x80000000u, 0x7f800001u, 0x00000000u},
|
||||
{0x00000000u, 0x3f800000u, 0xff800000u, 0x00000000u},
|
||||
{0x00000000u, 0xc0400000u, 0x3f800000u, 0x00000000u},
|
||||
{0x00000000u, 0x7f800000u, 0xff812345u, 0x00000000u},
|
||||
{0x00000000u, 0xff800000u, 0x7fc12345u, 0x00000000u},
|
||||
{0x00000000u, 0x7fc12345u, 0xc0400000u, 0x00000000u},
|
||||
{0x00000000u, 0xffd54321u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x7f800001u, 0xffd54321u, 0x00000000u},
|
||||
{0x00000000u, 0xff812345u, 0x7f800000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0x7f800000u, 0x00000000u},
|
||||
{0x80000000u, 0x80000000u, 0x80000000u, 0x00000000u},
|
||||
{0x80000000u, 0x3f800000u, 0x7f800001u, 0x00000000u},
|
||||
{0x80000000u, 0xc0400000u, 0xff800000u, 0x00000000u},
|
||||
{0x80000000u, 0x7f800000u, 0x3f800000u, 0x00000000u},
|
||||
{0x80000000u, 0xff800000u, 0xff812345u, 0x00000000u},
|
||||
{0x80000000u, 0x7fc12345u, 0x7fc12345u, 0x00000000u},
|
||||
{0x80000000u, 0xffd54321u, 0xc0400000u, 0x00000000u},
|
||||
{0x80000000u, 0x7f800001u, 0x00000000u, 0x00000000u},
|
||||
{0x80000000u, 0xff812345u, 0xffd54321u, 0x00000000u},
|
||||
{0x3f800000u, 0x00000000u, 0xffd54321u, 0x00000000u},
|
||||
{0x3f800000u, 0x80000000u, 0x7f800000u, 0x00000000u},
|
||||
{0x3f800000u, 0x3f800000u, 0x80000000u, 0x00000000u},
|
||||
{0x3f800000u, 0xc0400000u, 0x7f800001u, 0x00000000u},
|
||||
{0x3f800000u, 0x7f800000u, 0xff800000u, 0x00000000u},
|
||||
{0x3f800000u, 0xff800000u, 0x3f800000u, 0x00000000u},
|
||||
{0x3f800000u, 0x7fc12345u, 0xff812345u, 0x00000000u},
|
||||
{0x3f800000u, 0xffd54321u, 0x7fc12345u, 0x00000000u},
|
||||
{0x3f800000u, 0x7f800001u, 0xc0400000u, 0x00000000u},
|
||||
{0x3f800000u, 0xff812345u, 0x00000000u, 0x00000000u},
|
||||
{0xc0400000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0xc0400000u, 0x80000000u, 0xffd54321u, 0x00000000u},
|
||||
{0xc0400000u, 0x3f800000u, 0x7f800000u, 0x00000000u},
|
||||
{0xc0400000u, 0xc0400000u, 0x80000000u, 0x00000000u},
|
||||
{0xc0400000u, 0x7f800000u, 0x7f800001u, 0x00000000u},
|
||||
{0xc0400000u, 0xff800000u, 0xff800000u, 0x00000000u},
|
||||
{0xc0400000u, 0x7fc12345u, 0x3f800000u, 0x00000000u},
|
||||
{0xc0400000u, 0xffd54321u, 0xff812345u, 0x00000000u},
|
||||
{0xc0400000u, 0x7f800001u, 0x7fc12345u, 0x00000000u},
|
||||
{0xc0400000u, 0xff812345u, 0xc0400000u, 0x00000000u},
|
||||
{0x7f800000u, 0x00000000u, 0xc0400000u, 0x00000000u},
|
||||
{0x7f800000u, 0x80000000u, 0x00000000u, 0x00000000u},
|
||||
{0x7f800000u, 0x3f800000u, 0xffd54321u, 0x00000000u},
|
||||
{0x7f800000u, 0xc0400000u, 0x7f800000u, 0x00000000u},
|
||||
{0x7f800000u, 0x7f800000u, 0x80000000u, 0x00000000u},
|
||||
{0x7f800000u, 0xff800000u, 0x7f800001u, 0x00000000u},
|
||||
{0x7f800000u, 0x7fc12345u, 0xff800000u, 0x00000000u},
|
||||
{0x7f800000u, 0xffd54321u, 0x3f800000u, 0x00000000u},
|
||||
{0x7f800000u, 0x7f800001u, 0xff812345u, 0x00000000u},
|
||||
{0x7f800000u, 0xff812345u, 0x7fc12345u, 0x00000000u},
|
||||
{0xff800000u, 0x00000000u, 0x7fc12345u, 0x00000000u},
|
||||
{0xff800000u, 0x80000000u, 0xc0400000u, 0x00000000u},
|
||||
{0xff800000u, 0x3f800000u, 0x00000000u, 0x00000000u},
|
||||
{0xff800000u, 0xc0400000u, 0xffd54321u, 0x00000000u},
|
||||
{0xff800000u, 0x7f800000u, 0x7f800000u, 0x00000000u},
|
||||
{0xff800000u, 0xff800000u, 0x80000000u, 0x00000000u},
|
||||
{0xff800000u, 0x7fc12345u, 0x7f800001u, 0x00000000u},
|
||||
{0xff800000u, 0xffd54321u, 0xff800000u, 0x00000000u},
|
||||
{0xff800000u, 0x7f800001u, 0x3f800000u, 0x00000000u},
|
||||
{0xff800000u, 0xff812345u, 0xff812345u, 0x00000000u},
|
||||
{0x7fc12345u, 0x00000000u, 0xff812345u, 0x00000000u},
|
||||
{0x7fc12345u, 0x80000000u, 0x7fc12345u, 0x00000000u},
|
||||
{0x7fc12345u, 0x3f800000u, 0xc0400000u, 0x00000000u},
|
||||
{0x7fc12345u, 0xc0400000u, 0x00000000u, 0x00000000u},
|
||||
{0x7fc12345u, 0x7f800000u, 0xffd54321u, 0x00000000u},
|
||||
{0x7fc12345u, 0xff800000u, 0x7f800000u, 0x00000000u},
|
||||
{0x7fc12345u, 0x7fc12345u, 0x80000000u, 0x00000000u},
|
||||
{0x7fc12345u, 0xffd54321u, 0x7f800001u, 0x00000000u},
|
||||
{0x7fc12345u, 0x7f800001u, 0xff800000u, 0x00000000u},
|
||||
{0x7fc12345u, 0xff812345u, 0x3f800000u, 0x00000000u},
|
||||
{0xffd54321u, 0x00000000u, 0x3f800000u, 0x00000000u},
|
||||
{0xffd54321u, 0x80000000u, 0xff812345u, 0x00000000u},
|
||||
{0xffd54321u, 0x3f800000u, 0x7fc12345u, 0x00000000u},
|
||||
{0xffd54321u, 0xc0400000u, 0xc0400000u, 0x00000000u},
|
||||
{0xffd54321u, 0x7f800000u, 0x00000000u, 0x00000000u},
|
||||
{0xffd54321u, 0xff800000u, 0xffd54321u, 0x00000000u},
|
||||
{0xffd54321u, 0x7fc12345u, 0x7f800000u, 0x00000000u},
|
||||
{0xffd54321u, 0xffd54321u, 0x80000000u, 0x00000000u},
|
||||
{0xffd54321u, 0x7f800001u, 0x7f800001u, 0x00000000u},
|
||||
{0xffd54321u, 0xff812345u, 0xff800000u, 0x00000000u},
|
||||
{0x7f800001u, 0x00000000u, 0xff800000u, 0x00000000u},
|
||||
{0x7f800001u, 0x80000000u, 0x3f800000u, 0x00000000u},
|
||||
{0x7f800001u, 0x3f800000u, 0xff812345u, 0x00000000u},
|
||||
{0x7f800001u, 0xc0400000u, 0x7fc12345u, 0x00000000u},
|
||||
{0x7f800001u, 0x7f800000u, 0xc0400000u, 0x00000000u},
|
||||
{0x7f800001u, 0xff800000u, 0x00000000u, 0x00000000u},
|
||||
{0x7f800001u, 0x7fc12345u, 0xffd54321u, 0x00000000u},
|
||||
{0x7f800001u, 0xffd54321u, 0x7f800000u, 0x00000000u},
|
||||
{0x7f800001u, 0x7f800001u, 0x80000000u, 0x00000000u},
|
||||
{0x7f800001u, 0xff812345u, 0x7f800001u, 0x00000000u},
|
||||
{0xff812345u, 0x00000000u, 0x7f800001u, 0x00000000u},
|
||||
{0xff812345u, 0x80000000u, 0xff800000u, 0x00000000u},
|
||||
{0xff812345u, 0x3f800000u, 0x3f800000u, 0x00000000u},
|
||||
{0xff812345u, 0xc0400000u, 0xff812345u, 0x00000000u},
|
||||
{0xff812345u, 0x7f800000u, 0x7fc12345u, 0x00000000u},
|
||||
{0xff812345u, 0xff800000u, 0xc0400000u, 0x00000000u},
|
||||
{0xff812345u, 0x7fc12345u, 0x00000000u, 0x00000000u},
|
||||
{0xff812345u, 0xffd54321u, 0xffd54321u, 0x00000000u},
|
||||
{0xff812345u, 0x7f800001u, 0x7f800000u, 0x00000000u},
|
||||
{0xff812345u, 0xff812345u, 0x80000000u, 0x00000000u},
|
||||
{0x3f800000u, 0x40200000u, 0x00000000u, 0x00000000u},
|
||||
{0x3f800000u, 0x00800000u, 0x3f800000u, 0x00000000u},
|
||||
{0xbf800000u, 0xc0400000u, 0x00000000u, 0x00000000u},
|
||||
{0xc0400000u, 0xbf800000u, 0x3f800000u, 0x00000000u},
|
||||
{0x7fc00000u, 0x7fc12345u, 0x00000000u, 0x00000000u},
|
||||
{0xffc00000u, 0xffd54321u, 0x00000000u, 0x00000000u},
|
||||
{0x7f800001u, 0x7fa00000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x3f800000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0xbf800000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x7f800000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0xff800000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x7fc00000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0xffc00000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x7f800001u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0xff812345u, 0x00000000u},
|
||||
{0x00000000u, 0x80000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u},
|
||||
{0x00000000u, 0x80000000u, 0x3f800000u, 0x00000000u},
|
||||
{0x00000000u, 0x80000000u, 0xbf800000u, 0x00000000u},
|
||||
{0x00000000u, 0x80000000u, 0x7f800000u, 0x00000000u},
|
||||
{0x00000000u, 0x80000000u, 0xff800000u, 0x00000000u},
|
||||
{0x00000000u, 0x80000000u, 0x7fc00000u, 0x00000000u},
|
||||
{0x00000000u, 0x80000000u, 0xffc00000u, 0x00000000u},
|
||||
{0x00000000u, 0x80000000u, 0xff812345u, 0x00000000u},
|
||||
{0x00000000u, 0x3f800000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x3f800000u, 0x80000000u, 0x00000000u},
|
||||
{0x00000000u, 0x3f800000u, 0x3f800000u, 0x00000000u}
|
||||
};
|
||||
constexpr std::uint32_t Expected[128][7] = {
|
||||
{0x00000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u},
|
||||
{0x00000000u, 0x3f800000u, 0xff800000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x3f800000u},
|
||||
{0xc0400000u, 0x00000000u, 0xc0400000u, 0x3f800000u, 0x00000000u, 0xc0400000u, 0x00000000u},
|
||||
{0x00000000u, 0x7f800000u, 0x00000000u, 0x7f800000u, 0x00000000u, 0x00000000u, 0x7f800000u},
|
||||
{0xff800000u, 0x00000000u, 0xff800000u, 0x00000000u, 0xff800000u, 0xff800000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0xc0400000u, 0x00000000u, 0xc0400000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x7f800000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0x80000000u, 0x7f800000u, 0x00000000u, 0x80000000u, 0x00000000u},
|
||||
{0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u},
|
||||
{0x80000000u, 0x3f800000u, 0x80000000u, 0x3f800000u, 0x80000000u, 0x80000000u, 0x3f800000u},
|
||||
{0xc0400000u, 0x80000000u, 0xff800000u, 0x80000000u, 0xc0400000u, 0xc0400000u, 0x80000000u},
|
||||
{0x80000000u, 0x7f800000u, 0x80000000u, 0x7f800000u, 0x3f800000u, 0x80000000u, 0x7f800000u},
|
||||
{0xff800000u, 0x80000000u, 0xff800000u, 0x80000000u, 0xff800000u, 0xff800000u, 0x80000000u},
|
||||
{0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u},
|
||||
{0x80000000u, 0x80000000u, 0xc0400000u, 0x80000000u, 0xc0400000u, 0x80000000u, 0x80000000u},
|
||||
{0x80000000u, 0x80000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x80000000u},
|
||||
{0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u},
|
||||
{0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x3f800000u},
|
||||
{0x80000000u, 0x3f800000u, 0x80000000u, 0x7f800000u, 0x3f800000u, 0x80000000u, 0x3f800000u},
|
||||
{0x3f800000u, 0x3f800000u, 0x80000000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u},
|
||||
{0xc0400000u, 0x3f800000u, 0xc0400000u, 0x3f800000u, 0xc0400000u, 0xc0400000u, 0x3f800000u},
|
||||
{0x3f800000u, 0x7f800000u, 0xff800000u, 0x7f800000u, 0x3f800000u, 0x3f800000u, 0x7f800000u},
|
||||
{0xff800000u, 0x3f800000u, 0xff800000u, 0x3f800000u, 0x3f800000u, 0xff800000u, 0x3f800000u},
|
||||
{0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u},
|
||||
{0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u},
|
||||
{0x3f800000u, 0x3f800000u, 0xc0400000u, 0x3f800000u, 0xc0400000u, 0x3f800000u, 0x3f800000u},
|
||||
{0x3f800000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x3f800000u},
|
||||
{0xc0400000u, 0x00000000u, 0xc0400000u, 0x00000000u, 0x00000000u, 0xc0400000u, 0x00000000u},
|
||||
{0xc0400000u, 0x80000000u, 0xc0400000u, 0x80000000u, 0xc0400000u, 0xc0400000u, 0x80000000u},
|
||||
{0xc0400000u, 0x3f800000u, 0xc0400000u, 0x7f800000u, 0x3f800000u, 0xc0400000u, 0x3f800000u},
|
||||
{0xc0400000u, 0xc0400000u, 0xc0400000u, 0x80000000u, 0xc0400000u, 0xc0400000u, 0xc0400000u},
|
||||
{0xc0400000u, 0x7f800000u, 0xc0400000u, 0x7f800000u, 0xc0400000u, 0xc0400000u, 0x7f800000u},
|
||||
{0xff800000u, 0xc0400000u, 0xff800000u, 0xc0400000u, 0xff800000u, 0xff800000u, 0xc0400000u},
|
||||
{0xc0400000u, 0xc0400000u, 0xc0400000u, 0x3f800000u, 0xc0400000u, 0xc0400000u, 0xc0400000u},
|
||||
{0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u},
|
||||
{0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u},
|
||||
{0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u},
|
||||
{0x00000000u, 0x7f800000u, 0xc0400000u, 0x7f800000u, 0x00000000u, 0x00000000u, 0x7f800000u},
|
||||
{0x80000000u, 0x7f800000u, 0x80000000u, 0x7f800000u, 0x00000000u, 0x80000000u, 0x7f800000u},
|
||||
{0x3f800000u, 0x7f800000u, 0x3f800000u, 0x7f800000u, 0x3f800000u, 0x3f800000u, 0x7f800000u},
|
||||
{0xc0400000u, 0x7f800000u, 0xc0400000u, 0x7f800000u, 0x7f800000u, 0xc0400000u, 0x7f800000u},
|
||||
{0x7f800000u, 0x7f800000u, 0x80000000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u},
|
||||
{0xff800000u, 0x7f800000u, 0xff800000u, 0x7f800000u, 0xff800000u, 0xff800000u, 0x7f800000u},
|
||||
{0x7f800000u, 0x7f800000u, 0xff800000u, 0x7f800000u, 0xff800000u, 0x7f800000u, 0x7f800000u},
|
||||
{0x7f800000u, 0x7f800000u, 0x3f800000u, 0x7f800000u, 0x3f800000u, 0x7f800000u, 0x7f800000u},
|
||||
{0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u},
|
||||
{0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u},
|
||||
{0xff800000u, 0x00000000u, 0xff800000u, 0x00000000u, 0xff800000u, 0xff800000u, 0x00000000u},
|
||||
{0xff800000u, 0x80000000u, 0xff800000u, 0x80000000u, 0xc0400000u, 0xff800000u, 0x80000000u},
|
||||
{0xff800000u, 0x3f800000u, 0xff800000u, 0x3f800000u, 0x00000000u, 0xff800000u, 0x3f800000u},
|
||||
{0xff800000u, 0xc0400000u, 0xff800000u, 0xc0400000u, 0xff800000u, 0xff800000u, 0xc0400000u},
|
||||
{0xff800000u, 0x7f800000u, 0xff800000u, 0x7f800000u, 0x7f800000u, 0xff800000u, 0x7f800000u},
|
||||
{0xff800000u, 0xff800000u, 0xff800000u, 0x80000000u, 0xff800000u, 0xff800000u, 0xff800000u},
|
||||
{0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u},
|
||||
{0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u},
|
||||
{0xff800000u, 0xff800000u, 0xff800000u, 0x3f800000u, 0xff800000u, 0xff800000u, 0xff800000u},
|
||||
{0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u},
|
||||
{0x3f800000u, 0x3f800000u, 0xc0400000u, 0x3f800000u, 0xc0400000u, 0x3f800000u, 0x3f800000u},
|
||||
{0xc0400000u, 0xc0400000u, 0xc0400000u, 0x00000000u, 0xc0400000u, 0xc0400000u, 0xc0400000u},
|
||||
{0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u},
|
||||
{0xff800000u, 0xff800000u, 0xff800000u, 0x7f800000u, 0xff800000u, 0xff800000u, 0xff800000u},
|
||||
{0x7fc12345u, 0x7fc12345u, 0x80000000u, 0x80000000u, 0x80000000u, 0x7fc12345u, 0x7fc12345u},
|
||||
{0x7fc12345u, 0x7fc12345u, 0x7fc12345u, 0x7fc12345u, 0x7fc12345u, 0x7fc12345u, 0x7fc12345u},
|
||||
{0x7fc12345u, 0x7fc12345u, 0xff800000u, 0xff800000u, 0xff800000u, 0x7fc12345u, 0x7fc12345u},
|
||||
{0x7fc12345u, 0x7fc12345u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x7fc12345u, 0x7fc12345u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u},
|
||||
{0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u},
|
||||
{0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u},
|
||||
{0x7f800000u, 0x7f800000u, 0x00000000u, 0x7f800000u, 0x00000000u, 0x7f800000u, 0x7f800000u},
|
||||
{0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u, 0xff800000u},
|
||||
{0xffd54321u, 0xffd54321u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0xffd54321u, 0xffd54321u},
|
||||
{0xffd54321u, 0xffd54321u, 0x80000000u, 0x80000000u, 0x80000000u, 0xffd54321u, 0xffd54321u},
|
||||
{0xffd54321u, 0xffd54321u, 0xffd54321u, 0xffd54321u, 0xffd54321u, 0xffd54321u, 0xffd54321u},
|
||||
{0xffd54321u, 0xffd54321u, 0xff800000u, 0xff800000u, 0xff800000u, 0xffd54321u, 0xffd54321u},
|
||||
{0x00000000u, 0x00000000u, 0xff800000u, 0x00000000u, 0xff800000u, 0x00000000u, 0x00000000u},
|
||||
{0x80000000u, 0x80000000u, 0x80000000u, 0x3f800000u, 0x80000000u, 0x80000000u, 0x80000000u},
|
||||
{0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u},
|
||||
{0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u},
|
||||
{0x7f800000u, 0x7f800000u, 0xc0400000u, 0x7f800000u, 0xc0400000u, 0x7f800000u, 0x7f800000u},
|
||||
{0xff800000u, 0xff800000u, 0xff800000u, 0x00000000u, 0xff800000u, 0xff800000u, 0xff800000u},
|
||||
{0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u},
|
||||
{0x7f800001u, 0x7f800001u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800001u, 0x7f800001u},
|
||||
{0x7f800001u, 0x7f800001u, 0x80000000u, 0x80000000u, 0x80000000u, 0x7f800001u, 0x7f800001u},
|
||||
{0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u, 0x7f800001u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x80000000u, 0x80000000u, 0xff800000u, 0x80000000u, 0xff800000u, 0x80000000u, 0x80000000u},
|
||||
{0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u, 0x3f800000u},
|
||||
{0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u, 0xc0400000u},
|
||||
{0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0x7f800000u},
|
||||
{0xff800000u, 0xff800000u, 0xff800000u, 0xc0400000u, 0xff800000u, 0xff800000u, 0xff800000u},
|
||||
{0xff812345u, 0xff812345u, 0x00000000u, 0x00000000u, 0x00000000u, 0xff812345u, 0xff812345u},
|
||||
{0xff812345u, 0xff812345u, 0xff812345u, 0xff812345u, 0xff812345u, 0xff812345u, 0xff812345u},
|
||||
{0xff812345u, 0xff812345u, 0x7f800000u, 0x7f800000u, 0x7f800000u, 0xff812345u, 0xff812345u},
|
||||
{0xff812345u, 0xff812345u, 0x80000000u, 0x80000000u, 0x80000000u, 0xff812345u, 0xff812345u},
|
||||
{0x3f800000u, 0x40200000u, 0x00000000u, 0x40200000u, 0x3f800000u, 0x3f800000u, 0x40200000u},
|
||||
{0x00800000u, 0x3f800000u, 0x00800000u, 0x3f800000u, 0x3f800000u, 0x00800000u, 0x3f800000u},
|
||||
{0xc0400000u, 0xbf800000u, 0xc0400000u, 0x00000000u, 0xbf800000u, 0xc0400000u, 0xbf800000u},
|
||||
{0xc0400000u, 0xbf800000u, 0xc0400000u, 0x3f800000u, 0xbf800000u, 0xc0400000u, 0xbf800000u},
|
||||
{0x7fc00000u, 0x7fc00000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x7fc00000u, 0x7fc00000u},
|
||||
{0xffc00000u, 0xffc00000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xffc00000u, 0xffc00000u},
|
||||
{0x7f800001u, 0x7f800001u, 0x00000000u, 0x00000000u, 0x00000000u, 0x7f800001u, 0x7f800001u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0xbf800000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x7f800000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0xff800000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x00000000u, 0x80000000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0x80000000u, 0x3f800000u, 0x00000000u, 0x80000000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0xbf800000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0x80000000u, 0x7f800000u, 0x00000000u, 0x80000000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0xff800000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u},
|
||||
{0x80000000u, 0x00000000u, 0x80000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u},
|
||||
{0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x3f800000u},
|
||||
{0x00000000u, 0x3f800000u, 0x80000000u, 0x3f800000u, 0x00000000u, 0x00000000u, 0x3f800000u},
|
||||
{0x00000000u, 0x3f800000u, 0x00000000u, 0x3f800000u, 0x3f800000u, 0x00000000u, 0x3f800000u}
|
||||
};
|
||||
constexpr std::uint32_t Chunks = 4;
|
||||
std::uint32_t Chunk = 0;
|
||||
constexpr const char* Names[7] = {
|
||||
"v_min_f32 v10, v4, v5",
|
||||
"v_max_f32 v11, v4, v5",
|
||||
"v_min3_f32 v12, v4, v5, v6",
|
||||
"v_max3_f32 v13, v4, v5, v6",
|
||||
"v_med3_f32 v14, v4, v5, v6",
|
||||
"v_min_f32_e64 v15, v4, v5",
|
||||
"v_max_f32_e64 v16, v4, v5",
|
||||
};
|
||||
|
||||
void Fill(std::uint32_t tid, std::uint32_t* words) {
|
||||
std::copy(std::begin(Rows[Chunk * Threads + tid]), std::end(Rows[Chunk * Threads + tid]), words);
|
||||
}
|
||||
|
||||
std::array<std::uint32_t, 4> BufferDescriptor(const void* data, std::uint32_t bytes) {
|
||||
const auto address = reinterpret_cast<std::uintptr_t>(data);
|
||||
return {static_cast<std::uint32_t>(address), static_cast<std::uint32_t>((address >> 32u) & 0xffffu), bytes, 0x01016facu};
|
||||
}
|
||||
|
||||
std::string Hex(std::uint32_t value) {
|
||||
char text[16];
|
||||
std::snprintf(text, sizeof(text), "0x%08x", value);
|
||||
return text;
|
||||
}
|
||||
|
||||
void Expect(std::uint32_t tid, std::uint32_t actual, std::uint32_t expected, const char* name) {
|
||||
Require(actual == expected, std::string("f32 min max nan: row ") + std::to_string(tid) + " " + name + " is " + Hex(actual) + ", expected " + Hex(expected));
|
||||
}
|
||||
|
||||
void Run(AgcDriver::VulkanDevice& device) {
|
||||
for (std::uint32_t tid = 0; tid < Threads; ++tid) Fill(tid, &Input[tid * Inputs]);
|
||||
Output.fill(0xdeadbeefu);
|
||||
std::vector<std::uint32_t> userData(8, 0u);
|
||||
const auto input = BufferDescriptor(Input.data(), static_cast<std::uint32_t>(Input.size() * 4u));
|
||||
const auto output = BufferDescriptor(Output.data(), static_cast<std::uint32_t>(Output.size() * 4u));
|
||||
std::copy(input.begin(), input.end(), userData.begin());
|
||||
std::copy(output.begin(), output.end(), userData.begin() + 4);
|
||||
const std::span<const std::uint32_t> code(Code);
|
||||
const std::array<ShaderRecompiler::MemoryRegion, 1> memory{{{reinterpret_cast<std::uintptr_t>(code.data()), std::as_bytes(code)}}};
|
||||
const ShaderRecompiler::ShaderComputeStageInfo compute{{Threads, 1, 1}, 0u, {false, false, false}, false, 1};
|
||||
ShaderRecompiler::RecompileRequest request{
|
||||
{ShaderStage::Compute, reinterpret_cast<std::uintptr_t>(code.data()), code, 0, {}},
|
||||
{32, 0, userData, compute, std::nullopt, std::nullopt, memory},
|
||||
device.Target(),
|
||||
{0, 0, 0, 128}
|
||||
};
|
||||
request.useCache = false;
|
||||
const auto result = ShaderRecompiler::Recompile(request);
|
||||
device.Dispatch(result, 1, 1, 1, {}, reinterpret_cast<std::uintptr_t>(code.data()));
|
||||
device.WaitIdle();
|
||||
}
|
||||
|
||||
void Check() {
|
||||
for (std::uint32_t tid = 0; tid < Threads; ++tid) {
|
||||
const std::uint32_t* in = &Input[tid * Inputs];
|
||||
const std::uint32_t* out = &Output[tid * Results];
|
||||
for (std::uint32_t i = 0; i < 7; ++i) {
|
||||
Expect(Chunk * Threads + tid, out[i], Expected[Chunk * Threads + tid][i], Names[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main() {
|
||||
try {
|
||||
const auto device = OpenVulkanTestDevice();
|
||||
if (!device) return VulkanTestSkipped;
|
||||
for (Chunk = 0; Chunk < Chunks; ++Chunk) {
|
||||
Run(*device);
|
||||
Check();
|
||||
}
|
||||
std::puts("f32 min max nan tests passed");
|
||||
return 0;
|
||||
} catch (const std::exception& error) {
|
||||
std::cerr << error.what() << '\n';
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
|
@ -809,8 +809,8 @@ std::uint32_t EmitMinMaxF32Value(SpirvEmitterState& state, std::uint32_t lhs, st
|
|||
const auto zeroBits = Binary(state, maxValue ? spv::OpBitwiseAnd : spv::OpBitwiseOr, TypeU32(state), lhsClass.bits, rhsClass.bits);
|
||||
const auto numericBits = Select(state, TypeU32(state), bothZero, zeroBits, orderedBits);
|
||||
|
||||
const auto rhsNanBits = Select(state, TypeU32(state), rhsClass.nan, lhsClass.bits, numericBits);
|
||||
const auto resultBits = Select(state, TypeU32(state), lhsClass.nan, rhsClass.bits, rhsNanBits);
|
||||
const auto lhsNanBits = Select(state, TypeU32(state), lhsClass.nan, rhsClass.bits, numericBits);
|
||||
const auto resultBits = Select(state, TypeU32(state), rhsClass.nan, lhsClass.bits, lhsNanBits);
|
||||
return Unary(state, spv::OpBitcast, TypeF32(state), resultBits);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue