Nugget
Loading...
Searching...
No Matches
raster-expected-phase19.h
Go to the documentation of this file.
1/*
2
3MIT License
4
5Copyright (c) 2026 PCSX-Redux authors
6
7Permission is hereby granted, free of charge, to any person obtaining a copy
8of this software and associated documentation files (the "Software"), to deal
9in the Software without restriction, including without limitation the rights
10to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11copies of the Software, and to permit persons to whom the Software is
12furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice shall be included in all
15copies or substantial portions of the Software.
16
17THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23SOFTWARE.
24
25*/
26
27#pragma once
28
29// Phase-19 expected hardware-truth values for the affine UV
30// stride-sign + cross-axis sweep.
31//
32// Six triangles, identical 10x10 screen footprint to phase-18, varying
33// in stride sign and per-axis stride direction:
34//
35// T_NEG_U_K05 dU/dx = -0.5 (mirrored U, mild)
36// T_NEG_V_K05 dV/dy = -0.5 (mirrored V, mild)
37// T_NEG_BOTH_K05 dU/dx = -0.5, dV/dy = -0.5
38// T_NEG_U_K16 dU/dx = -1.6 (mirrored U, stretched)
39// T_CROSS_45_K05 45-deg UV rotation (dU/dx = dU/dy = +/-0.5)
40// T_CROSS_90_K16 90-deg UV rotation, stretched
41// (dU/dy = dV/dx = 1.6)
42//
43// Probes are the same five screen positions as phase-18:
44// P_VERTEX (5, 5)
45// P_TOP_NEAR (6, 5)
46// P_LEFT_NEAR (5, 6)
47// P_INTERIOR (8, 8)
48// P_TOP_FAR (12, 5)
49//
50// Predictions seeded under phase-17/18 model:
51// per-axis u_sampled = floor(u_real(x, y) + 0.5)
52// per-axis v_sampled = floor(v_real(x, y) + 0.5)
53// with u_real and v_real evaluated from the affine map. The model
54// is direction-symmetric (works for negative stride) and per-axis
55// independent (works for cross-axis stride). Phase-19 tests both
56// assumptions against silicon.
57//
58// Texture: phase-17 TEX17. Probe decoding:
59// vram(u, v) = u | (v << 5) | (((u + v) & 31) | 1) << 10
60//
61// Status markers:
62// HW_VERIFIED confirmed on SCPH-5501 hardware.
63// HW_TODO sentinel; this probe is uncaptured.
64
65#include "raster-helpers.h"
67
68#define HW_TODO 0xCAFEu
69
70// --------------------------------------------------------------------------
71// T_NEG_U_K05: A=(5,5)/(5,0) B=(15,5)/(0,0) C=(5,15)/(5,5)
72// u(x,y) = 7.5 - 0.5*x v(x,y) = 0.5*y - 2.5
73// P_VERTEX (5,5) u=5.0 v=0.0 -> (5, 0)
74// P_TOP_NEAR (6,5) u=4.5 v=0.0 -> (5, 0)
75// P_LEFT_NEAR (5,6) u=5.0 v=0.5 -> (5, 1)
76// P_INTERIOR (8,8) u=3.5 v=1.5 -> (4, 2)
77// P_TOP_FAR (12,5) u=1.5 v=0.0 -> (2, 0)
78// --------------------------------------------------------------------------
79
80#define EXPECT_NEG_U_K05_VERTEX 0x1405u /* HW_VERIFIED: UV(5, 0) */
81#define EXPECT_NEG_U_K05_TOP_NEAR 0x1405u /* HW_VERIFIED: UV(5, 0) */
82#define EXPECT_NEG_U_K05_LEFT_NEAR 0x1C25u /* HW_VERIFIED: UV(5, 1) */
83#define EXPECT_NEG_U_K05_INTERIOR 0x1C44u /* HW_VERIFIED: UV(4, 2) */
84#define EXPECT_NEG_U_K05_TOP_FAR 0x0C02u /* HW_VERIFIED: UV(2, 0) */
85
86// --------------------------------------------------------------------------
87// T_NEG_V_K05: A=(5,5)/(0,5) B=(15,5)/(5,5) C=(5,15)/(0,0)
88// u(x,y) = 0.5*x - 2.5 v(x,y) = 7.5 - 0.5*y
89// P_VERTEX (5,5) u=0.0 v=5.0 -> (0, 5)
90// P_TOP_NEAR (6,5) u=0.5 v=5.0 -> (1, 5)
91// P_LEFT_NEAR (5,6) u=0.0 v=4.5 -> (0, 5)
92// P_INTERIOR (8,8) u=1.5 v=3.5 -> (2, 4)
93// P_TOP_FAR (12,5) u=3.5 v=5.0 -> (4, 5)
94// --------------------------------------------------------------------------
95
96#define EXPECT_NEG_V_K05_VERTEX 0x14A0u /* HW_VERIFIED: UV(0, 5) */
97#define EXPECT_NEG_V_K05_TOP_NEAR 0x1CA1u /* HW_VERIFIED: UV(1, 5) */
98#define EXPECT_NEG_V_K05_LEFT_NEAR 0x14A0u /* HW_VERIFIED: UV(0, 5) */
99#define EXPECT_NEG_V_K05_INTERIOR 0x1C82u /* HW_VERIFIED: UV(2, 4) */
100#define EXPECT_NEG_V_K05_TOP_FAR 0x24A4u /* HW_VERIFIED: UV(4, 5) */
101
102// --------------------------------------------------------------------------
103// T_NEG_BOTH_K05: A=(5,5)/(5,5) B=(15,5)/(0,5) C=(5,15)/(5,0)
104// u(x,y) = 7.5 - 0.5*x v(x,y) = 7.5 - 0.5*y
105// P_VERTEX (5,5) u=5.0 v=5.0 -> (5, 5)
106// P_TOP_NEAR (6,5) u=4.5 v=5.0 -> (5, 5)
107// P_LEFT_NEAR (5,6) u=5.0 v=4.5 -> (5, 5)
108// P_INTERIOR (8,8) u=3.5 v=3.5 -> (4, 4)
109// P_TOP_FAR (12,5) u=1.5 v=5.0 -> (2, 5)
110// --------------------------------------------------------------------------
111
112#define EXPECT_NEG_BOTH_K05_VERTEX 0x2CA5u /* HW_VERIFIED: UV(5, 5) */
113#define EXPECT_NEG_BOTH_K05_TOP_NEAR 0x2CA5u /* HW_VERIFIED: UV(5, 5) */
114#define EXPECT_NEG_BOTH_K05_LEFT_NEAR 0x2CA5u /* HW_VERIFIED: UV(5, 5) */
115#define EXPECT_NEG_BOTH_K05_INTERIOR 0x2484u /* HW_VERIFIED: UV(4, 4) */
116#define EXPECT_NEG_BOTH_K05_TOP_FAR 0x1CA2u /* HW_VERIFIED: UV(2, 5) */
117
118// --------------------------------------------------------------------------
119// T_NEG_U_K16: A=(5,5)/(16,0) B=(15,5)/(0,0) C=(5,15)/(16,16)
120// u(x,y) = 24 - 1.6*x v(x,y) = 1.6*y - 8
121// P_VERTEX (5,5) u=16.0 v=0.0 -> (16, 0)
122// P_TOP_NEAR (6,5) u=14.4 v=0.0 -> (14, 0)
123// P_LEFT_NEAR (5,6) u=16.0 v=1.6 -> (16, 2)
124// P_INTERIOR (8,8) u=11.2 v=4.8 -> (11, 5)
125// P_TOP_FAR (12,5) u=4.8 v=0.0 -> (5, 0)
126// --------------------------------------------------------------------------
127
128#define EXPECT_NEG_U_K16_VERTEX 0x4410u /* HW_VERIFIED: UV(16, 0) */
129#define EXPECT_NEG_U_K16_TOP_NEAR 0x3C0Eu /* HW_VERIFIED: UV(14, 0) */
130#define EXPECT_NEG_U_K16_LEFT_NEAR 0x4C50u /* HW_VERIFIED: UV(16, 2) */
131#define EXPECT_NEG_U_K16_INTERIOR 0x44ABu /* HW_VERIFIED: UV(11, 5) */
132#define EXPECT_NEG_U_K16_TOP_FAR 0x1405u /* HW_VERIFIED: UV(5, 0) */
133
134// --------------------------------------------------------------------------
135// T_CROSS_45_K05: A=(5,5)/(5,0) B=(15,5)/(10,5) C=(5,15)/(0,5)
136// u(x,y) = 0.5*x - 0.5*y + 5 v(x,y) = 0.5*x + 0.5*y - 5
137// P_VERTEX (5,5) u=5.0 v=0.0 -> (5, 0)
138// P_TOP_NEAR (6,5) u=5.5 v=0.5 -> (6, 1)
139// P_LEFT_NEAR (5,6) u=4.5 v=0.5 -> (5, 1)
140// P_INTERIOR (8,8) u=5.0 v=3.0 -> (5, 3)
141// P_TOP_FAR (12,5) u=8.5 v=3.5 -> (9, 4)
142// --------------------------------------------------------------------------
143
144#define EXPECT_CROSS_45_K05_VERTEX 0x1405u /* HW_VERIFIED: UV(5, 0) */
145#define EXPECT_CROSS_45_K05_TOP_NEAR 0x1C26u /* HW_VERIFIED: UV(6, 1) */
146#define EXPECT_CROSS_45_K05_LEFT_NEAR 0x1C25u /* HW_VERIFIED: UV(5, 1) */
147#define EXPECT_CROSS_45_K05_INTERIOR 0x2465u /* HW_VERIFIED: UV(5, 3) */
148#define EXPECT_CROSS_45_K05_TOP_FAR 0x3489u /* HW_VERIFIED: UV(9, 4) */
149
150// --------------------------------------------------------------------------
151// T_CROSS_90_K16: A=(5,5)/(0,0) B=(15,5)/(0,16) C=(5,15)/(16,0)
152// u(x,y) = 1.6*y - 8 v(x,y) = 1.6*x - 8
153// P_VERTEX (5,5) u=0.0 v=0.0 -> (0, 0)
154// P_TOP_NEAR (6,5) u=0.0 v=1.6 -> (0, 2)
155// P_LEFT_NEAR (5,6) u=1.6 v=0.0 -> (2, 0)
156// P_INTERIOR (8,8) u=4.8 v=4.8 -> (5, 5)
157// P_TOP_FAR (12,5) u=0.0 v=11.2 -> (0, 11)
158// --------------------------------------------------------------------------
159
160#define EXPECT_CROSS_90_K16_VERTEX 0x0400u /* HW_VERIFIED: UV(0, 0) */
161#define EXPECT_CROSS_90_K16_TOP_NEAR 0x0C40u /* HW_VERIFIED: UV(0, 2) */
162#define EXPECT_CROSS_90_K16_LEFT_NEAR 0x0C02u /* HW_VERIFIED: UV(2, 0) */
163#define EXPECT_CROSS_90_K16_INTERIOR 0x2CA5u /* HW_VERIFIED: UV(5, 5) */
164#define EXPECT_CROSS_90_K16_TOP_FAR 0x2D60u /* HW_VERIFIED: UV(0, 11) */