Nugget
Loading...
Searching...
No Matches
cull-thresholds.c
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// Cull-threshold probes. Naming:
28// CT_<prim>_OK_<dim> -- primitive rendered as expected
29// CT_<prim>_DROP_<dim> -- primitive culled, anchor reads sentinel
30// CT_<prim>_DROPMECH_* -- silent-drop verification
31
33
34// Probe-anchor pixel for all tests: (5, 3). The 32x32 sentinel-fill
35// region is plenty large for this anchor.
36#define ANCHOR_X 5
37#define ANCHOR_Y 3
38
39// ---- Flat untextured triangle (GP0 0x20) ---------------------------------
40
41static void drawTriOk(void) {
42 rasterReset();
43 rasterClearTestRegion(0, 0, 32, 32);
44 /* In-limit: dx max = 100, dy max = 20. Anchor (5, 3) covered. */
45 rasterFlatTri(RASTER_CMD_RED, 0, 0, 100, 0, 0, 20);
46 rasterFlushPrimitive();
47}
48
49static void drawTriEdgeDx(int16_t dx) {
50 rasterReset();
51 rasterClearTestRegion(0, 0, 32, 32);
52 /* dx = v2.x - v1.x = dx. v1-v3 dx = 0. Worst-edge dx = `dx`. */
53 rasterFlatTri(RASTER_CMD_RED, 0, 0, (int16_t)dx, 0, 0, 20);
54 rasterFlushPrimitive();
55}
56
57static void drawTriEdgeDy(int16_t dy) {
58 rasterReset();
59 rasterClearTestRegion(0, 0, 32, 32);
60 /* dy = v3.y - v1.y = dy. Worst-edge dy = `dy`. */
61 rasterFlatTri(RASTER_CMD_RED, 0, 0, 20, 0, 0, (int16_t)dy);
62 rasterFlushPrimitive();
63}
64
65// ---- Gouraud triangle (GP0 0x30) -----------------------------------------
66
67static void drawGTriOk(void) {
68 rasterReset();
69 rasterClearTestRegion(0, 0, 32, 32);
70 rasterGouraudTri(RASTER_CMD_RED, 0, 0,
71 RASTER_CMD_RED, 100, 0,
72 RASTER_CMD_RED, 0, 20);
73 rasterFlushPrimitive();
74}
75
76static void drawGTriEdgeDx(int16_t dx) {
77 rasterReset();
78 rasterClearTestRegion(0, 0, 32, 32);
79 rasterGouraudTri(RASTER_CMD_RED, 0, 0,
80 RASTER_CMD_RED, dx, 0,
81 RASTER_CMD_RED, 0, 20);
82 rasterFlushPrimitive();
83}
84
85// ---- Flat textured triangle (GP0 0x24) -----------------------------------
86
87static void drawTexTriOk(void) {
88 rasterReset();
89 rasterClearTestRegion(0, 0, 32, 32);
90 setTexpage(TEX15_TX, TEX15_TY, 2);
91 setTextureWindow(0, 0, 0, 0);
92 rasterTexTri(TEX_MOD_NEUTRAL,
93 0, 0, 0, 0,
94 100, 0, 15, 0,
95 0, 20, 0, 15,
97 rasterFlushPrimitive();
98}
99
100static void drawTexTriEdgeDx(int16_t dx) {
101 rasterReset();
102 rasterClearTestRegion(0, 0, 32, 32);
103 setTexpage(TEX15_TX, TEX15_TY, 2);
104 setTextureWindow(0, 0, 0, 0);
105 rasterTexTri(TEX_MOD_NEUTRAL,
106 0, 0, 0, 0,
107 dx, 0, 15, 0,
108 0, 20, 0, 15,
110 rasterFlushPrimitive();
111}
112
113// ---- Flat untextured quad (GP0 0x28) -------------------------------------
114
115static void drawQuadOk(void) {
116 rasterReset();
117 rasterClearTestRegion(0, 0, 32, 32);
118 rasterFlatQuad(RASTER_CMD_GREEN, 0, 0, 100, 0, 0, 20, 100, 20);
119 rasterFlushPrimitive();
120}
121
122static void drawQuadEdgeDx(int16_t dx) {
123 rasterReset();
124 rasterClearTestRegion(0, 0, 32, 32);
125 /* Largest edge dx = `dx`. */
126 rasterFlatQuad(RASTER_CMD_GREEN, 0, 0, dx, 0, 0, 20, dx, 20);
127 rasterFlushPrimitive();
128}
129
130static void drawQuadEdgeDy(int16_t dy) {
131 rasterReset();
132 rasterClearTestRegion(0, 0, 32, 32);
133 rasterFlatQuad(RASTER_CMD_GREEN, 0, 0, 20, 0, 0, dy, 20, dy);
134 rasterFlushPrimitive();
135}
136
137// ---- Flat textured quad (GP0 0x2C) ---------------------------------------
138
139static void drawTexQuadOk(void) {
140 rasterReset();
141 rasterClearTestRegion(0, 0, 32, 32);
142 setTexpage(TEX15_TX, TEX15_TY, 2);
143 setTextureWindow(0, 0, 0, 0);
144 rasterFlatTexQuad(TEX_MOD_NEUTRAL,
145 0, 0, 0, 0,
146 100, 0, 15, 0,
147 0, 20, 0, 15,
148 100, 20, 15, 15,
150 rasterFlushPrimitive();
151}
152
153static void drawTexQuadEdgeDx(int16_t dx) {
154 rasterReset();
155 rasterClearTestRegion(0, 0, 32, 32);
156 setTexpage(TEX15_TX, TEX15_TY, 2);
157 setTextureWindow(0, 0, 0, 0);
158 rasterFlatTexQuad(TEX_MOD_NEUTRAL,
159 0, 0, 0, 0,
160 dx, 0, 15, 0,
161 0, 20, 0, 15,
162 dx, 20, 15, 15,
164 rasterFlushPrimitive();
165}
166
167// ---- Line (GP0 0x40) -----------------------------------------------------
168
169static void drawLineEdgeDx(int16_t dx) {
170 rasterReset();
171 rasterClearTestRegion(0, 0, 32, 32);
172 /* Line at y=ANCHOR_Y crossing x=ANCHOR_X if dx is large enough.
173 Line endpoint at (dx, 3) - if line drops, anchor is sentinel. */
174 rasterFlatLine(RASTER_CMD_BLUE, 0, 3, dx, 3);
175 rasterFlushPrimitive();
176}
177
178// ---- Variable-size rect (GP0 0x60) ---------------------------------------
179
180static void drawRectSize(int16_t w, int16_t h) {
181 rasterReset();
182 rasterClearTestRegion(0, 0, 32, 32);
183 rasterFlatRect(RASTER_CMD_WHITE, 0, 0, w, h);
184 rasterFlushPrimitive();
185}
186
187// ---- Drop-mechanism probe ------------------------------------------------
188//
189// Submit an oversized triangle (suspected to drop) followed by a
190// known-good small triangle at a clearly different anchor (10, 10).
191// If hardware silently drops the first and proceeds with the second,
192// pixel (10, 10) reads RASTER_VRAM_GREEN. If the drop corrupts the
193// command stream, pixel (10, 10) reads sentinel.
194
195static void drawDropMechProbe(void) {
196 rasterReset();
197 rasterClearTestRegion(0, 0, 32, 32);
198 /* Oversized tri (dx=2047 - way over limit). */
199 rasterFlatTri(RASTER_CMD_RED, 0, 0, 2047, 0, 0, 20);
200 /* Small good tri whose interior includes (10, 10). */
201 rasterFlatTri(RASTER_CMD_GREEN, 8, 8, 14, 8, 8, 14);
202 rasterFlushPrimitive();
203}
204
205) // CESTER_BODY
206
207// ============================================================================
208// Baseline + threshold tests per primitive type
209// ============================================================================
210
211// ---- Triangle (GP0 0x20) ----
212
213CESTER_TEST(ct_tri_baseline, gpu_raster_phase14,
214 drawTriOk();
216)
217
218CESTER_TEST(ct_tri_dx_1023_ok, gpu_raster_phase14,
219 drawTriEdgeDx(1023);
220 /* In-limit per psx-spx. Should render. */
222)
223
224CESTER_TEST(ct_tri_dx_1024_drop, gpu_raster_phase14,
225 drawTriEdgeDx(1024);
226 /* Suspected drop boundary. */
228)
229
230CESTER_TEST(ct_tri_dx_1025_drop, gpu_raster_phase14,
231 drawTriEdgeDx(1025);
233)
234
235CESTER_TEST(ct_tri_dx_2047_drop, gpu_raster_phase14,
236 drawTriEdgeDx(2047);
237 /* Way over limit. */
239)
240
241CESTER_TEST(ct_tri_dy_511_ok, gpu_raster_phase14,
242 drawTriEdgeDy(511);
244)
245
246CESTER_TEST(ct_tri_dy_512_drop, gpu_raster_phase14,
247 drawTriEdgeDy(512);
249)
250
251CESTER_TEST(ct_tri_dy_513_drop, gpu_raster_phase14,
252 drawTriEdgeDy(513);
254)
255
256CESTER_TEST(ct_tri_dy_1023_drop, gpu_raster_phase14,
257 drawTriEdgeDy(1023);
259)
260
261// ---- Gouraud triangle (GP0 0x30) ----
262
263CESTER_TEST(ct_gtri_baseline, gpu_raster_phase14,
264 drawGTriOk();
266)
267
268CESTER_TEST(ct_gtri_dx_1023_ok, gpu_raster_phase14,
269 drawGTriEdgeDx(1023);
271)
272
273CESTER_TEST(ct_gtri_dx_1024_drop, gpu_raster_phase14,
274 drawGTriEdgeDx(1024);
276)
277
278CESTER_TEST(ct_gtri_dx_2047_drop, gpu_raster_phase14,
279 drawGTriEdgeDx(2047);
281)
282
283// ---- Textured triangle (GP0 0x24) ----
284
285CESTER_TEST(ct_textri_baseline, gpu_raster_phase14,
286 drawTexTriOk();
287 /* Anchor (5, 3) samples texel u=15*5/100=0 (UV interpolation,
288 roughly). Just verify it's NOT sentinel. */
289 int16_t v = (int16_t)rasterReadPixel(ANCHOR_X, ANCHOR_Y);
290 ramsyscall_printf("OBS x=%d y=%d val=0x%04x expect=NOT-SENTINEL\n",
291 ANCHOR_X, ANCHOR_Y, (unsigned)v);
292 cester_assert_uint_ne((unsigned)RASTER_SENTINEL, (unsigned)v);
293)
294
295CESTER_TEST(ct_textri_dx_1023_ok, gpu_raster_phase14,
296 drawTexTriEdgeDx(1023);
297 int16_t v = (int16_t)rasterReadPixel(ANCHOR_X, ANCHOR_Y);
298 ramsyscall_printf("OBS x=%d y=%d val=0x%04x expect=CT_TEXTRI_DX_1023\n",
299 ANCHOR_X, ANCHOR_Y, (unsigned)v);
300 cester_assert_uint_eq((unsigned)CT_TEXTRI_DX_1023, (unsigned)v);
301)
302
303CESTER_TEST(ct_textri_dx_1024_drop, gpu_raster_phase14,
304 drawTexTriEdgeDx(1024);
306)
307
308CESTER_TEST(ct_textri_dx_2047_drop, gpu_raster_phase14,
309 drawTexTriEdgeDx(2047);
311)
312
313// ---- Quad (GP0 0x28) ----
314
315CESTER_TEST(ct_quad_baseline, gpu_raster_phase14,
316 drawQuadOk();
318)
319
320CESTER_TEST(ct_quad_dx_1023_ok, gpu_raster_phase14,
321 drawQuadEdgeDx(1023);
323)
324
325CESTER_TEST(ct_quad_dx_1024_drop, gpu_raster_phase14,
326 drawQuadEdgeDx(1024);
328)
329
330CESTER_TEST(ct_quad_dx_2047_drop, gpu_raster_phase14,
331 drawQuadEdgeDx(2047);
333)
334
335CESTER_TEST(ct_quad_dy_511_ok, gpu_raster_phase14,
336 drawQuadEdgeDy(511);
338)
339
340CESTER_TEST(ct_quad_dy_512_drop, gpu_raster_phase14,
341 drawQuadEdgeDy(512);
343)
344
345// ---- Textured quad (GP0 0x2C) ----
346
347CESTER_TEST(ct_texquad_baseline, gpu_raster_phase14,
348 drawTexQuadOk();
349 int16_t v = (int16_t)rasterReadPixel(ANCHOR_X, ANCHOR_Y);
350 ramsyscall_printf("OBS x=%d y=%d val=0x%04x expect=NOT-SENTINEL\n",
351 ANCHOR_X, ANCHOR_Y, (unsigned)v);
352 cester_assert_uint_ne((unsigned)RASTER_SENTINEL, (unsigned)v);
353)
354
355CESTER_TEST(ct_texquad_dx_1023_ok, gpu_raster_phase14,
356 drawTexQuadEdgeDx(1023);
357 int16_t v = (int16_t)rasterReadPixel(ANCHOR_X, ANCHOR_Y);
358 ramsyscall_printf("OBS x=%d y=%d val=0x%04x expect=CT_TEXQUAD_DX_1023\n",
359 ANCHOR_X, ANCHOR_Y, (unsigned)v);
360 cester_assert_uint_eq((unsigned)CT_TEXQUAD_DX_1023, (unsigned)v);
361)
362
363CESTER_TEST(ct_texquad_dx_1024_drop, gpu_raster_phase14,
364 drawTexQuadEdgeDx(1024);
366)
367
368CESTER_TEST(ct_texquad_dx_2047_drop, gpu_raster_phase14,
369 drawTexQuadEdgeDx(2047);
371)
372
373// ---- Line (GP0 0x40) ----
374//
375// Lines don't really have "edges" in the polygon sense; the cull
376// concept is about the endpoint delta. Per psx-spx GPU registers the
377// line endpoint delta is limited to ±1023 horizontally / ±511
378// vertically; oversized lines are dropped.
379
380CESTER_TEST(ct_line_dx_100_baseline, gpu_raster_phase14,
381 drawLineEdgeDx(100);
382 /* Line should render through (5, 3). */
384)
385
386CESTER_TEST(ct_line_dx_1023_ok, gpu_raster_phase14,
387 drawLineEdgeDx(1023);
389)
390
391CESTER_TEST(ct_line_dx_1024_drop, gpu_raster_phase14,
392 drawLineEdgeDx(1024);
394)
395
396CESTER_TEST(ct_line_dx_2047_drop, gpu_raster_phase14,
397 drawLineEdgeDx(2047);
399)
400
401// ---- Variable-size rect (GP0 0x60) ----
402//
403// Rectangles have their own "size" command word. psx-spx documents
404// the rectangle width as masked to ((W-1) & 0x3FF) + 1 = max 1024.
405// So w=1024 wraps to 0 (no draw); w=1025 wraps to 1; etc. Verify.
406
407CESTER_TEST(ct_rect_w16_baseline, gpu_raster_phase14,
408 drawRectSize(16, 16);
410)
411
412CESTER_TEST(ct_rect_w1023, gpu_raster_phase14,
413 drawRectSize(1023, 16);
414 /* Hardware should fill - 1023 within mask range. */
416)
417
418CESTER_TEST(ct_rect_w1024, gpu_raster_phase14,
419 drawRectSize(1024, 16);
420 /* psx-spx: ((1024-1)&0x3FF)+1 = 1024. Renders. */
422)
423
424CESTER_TEST(ct_rect_w1025, gpu_raster_phase14,
425 drawRectSize(1025, 16);
426 /* ((1025-1)&0x3FF)+1 = 1. Renders only 1 pixel wide; anchor
427 (5, 3) is outside that single-column rect -> sentinel. */
429)
430
431CESTER_TEST(ct_rect_h511, gpu_raster_phase14,
432 drawRectSize(16, 511);
434)
435
436CESTER_TEST(ct_rect_h512, gpu_raster_phase14,
437 drawRectSize(16, 512);
438 /* ((512-1)&0x1FF)+1 = 512. Renders. */
440)
441
442CESTER_TEST(ct_rect_h513, gpu_raster_phase14,
443 drawRectSize(16, 513);
444 /* ((513-1)&0x1FF)+1 = 1. Wraps to height 1; anchor (5, 3) is
445 outside the single-row rect -> sentinel. */
447)
448
449// ---- Drop-mechanism probe ----
450
451CESTER_TEST(ct_drop_mech_second_renders, gpu_raster_phase14,
452 drawDropMechProbe();
453 /* If the oversized first tri was silently dropped, the second
454 tri rendered and pixel (10, 10) is green. If the drop
455 corrupted the command stream, (10, 10) reads sentinel. */
457)
458
459CESTER_TEST(ct_drop_mech_oversized_not_rendered, gpu_raster_phase14,
460 drawDropMechProbe();
461 /* The first oversized tri at (0, 0)-(2047, 0)-(0, 20) was
462 dropped. Anchor (5, 3) - inside that tri's intended bounds
463 but outside the second tri's bounds - should be sentinel. */
465)
466
467// ---- Per-vertex absolute coordinate test ----
468//
469// Triangle with one vertex at a high absolute X but small edge dx
470// between the other two vertices. Per-edge rule predicts render;
471// per-vertex-abs rule predicts drop.
472
473CESTER_TEST(ct_tri_vertex_abs_just_low_edges, gpu_raster_phase14,
474 rasterReset();
475 rasterClearTestRegion(0, 0, 32, 32);
476 /* v1 = (0, 0), v2 = (1024, 0), v3 = (1024, 20). Edges:
477 v1-v2 dx=1024 (over limit if dx>1023).
478 v2-v3 dx=0.
479 v1-v3 dx=1024 (over limit).
480 So this test triangle has TWO edges over - it's a control
481 confirming over-limit cull, not strictly a per-vertex-abs
482 isolation. */
483 rasterFlatTri(RASTER_CMD_RED, 0, 0, 1024, 0, 1024, 20);
484 rasterFlushPrimitive();
486)
487
488/* Pre-truncation per-vertex absolute coord probes. The GP0 vertex
489 format stores x/y as int16 but the rasterizer interprets only the
490 low 11 bits as signed. We can test whether hardware enforces an
491 independent per-vertex absolute-coord rule BEFORE the 11-bit
492 truncation by sending the same effective post-truncation triangle
493 in two ways: one with all coords in the 11-bit range, one with a
494 vertex coord that has bits set above bit 10 but produces the same
495 low-11-bit result. If both render identically, no pre-truncation
496 rule. If the probe drops (sentinel at anchor), there IS one.
497 Baseline geometry: (0,0)-(20,0)-(0,20). Anchor (5,3) is inside
498 the post-truncation triangle in both cases. */
499CESTER_TEST(ct_tri_pretrunc_baseline, gpu_raster_phase14,
500 rasterReset();
501 rasterClearTestRegion(0, 0, 32, 32);
502 /* All low-11-bit vertices; should render at anchor. */
503 rasterFlatTri(RASTER_CMD_RED, 0, 0, 20, 0, 0, 20);
504 rasterFlushPrimitive();
506)
507CESTER_TEST(ct_tri_pretrunc_bit11, gpu_raster_phase14,
508 rasterReset();
509 rasterClearTestRegion(0, 0, 32, 32);
510 /* Same effective triangle - v2.x = 2068 = 0x814 truncates to
511 low 11 bits = 0x14 = 20. If hardware truncates first then
512 checks per-edge, this renders identically to the baseline.
513 If a pre-truncation per-vertex absolute rule fires on |x| >
514 1023, the polygon drops and anchor is sentinel. */
515 rasterFlatTri(RASTER_CMD_RED, 0, 0, 2068, 0, 0, 20);
516 rasterFlushPrimitive();
518)
519CESTER_TEST(ct_tri_pretrunc_bit15, gpu_raster_phase14,
520 rasterReset();
521 rasterClearTestRegion(0, 0, 32, 32);
522 /* v2.x = -32748 = 0x8014 in 16-bit two's complement. Low 11
523 bits = 0x014 = 20. Maximum bit-pattern divergence from the
524 11-bit truncated value: every high bit set. If any per-vertex
525 rule fires above 11-bit range, this drops. */
526 rasterFlatTri(RASTER_CMD_RED, 0, 0, (int16_t)0x8014, 0, 0, 20);
527 rasterFlushPrimitive();
529)
CESTER_BODY(static int s_got40;static int s_got80;static uint32_t s_cause;static uint32_t s_epc;static uint32_t s_from;static uint32_t *s_resume;static uint32_t *s_regs;static uint32_t(*s_customhandler)()=NULL;static uint32_t s_oldIMASK;static uint32_t s_oldDPCR;static uint32_t s_oldDICR;uint32_t handler(uint32_t *regs, uint32_t from) { if(from==0x40) s_got40=1;if(from==0x80) s_got80=1;uint32_t cause;uint32_t epc;s_from=from;asm("mfc0 %0, $13\nnop\nmfc0 %1, $14\nnop" :"=r"(cause), "=r"(epc));s_cause=cause;s_epc=epc;if(s_customhandler) { return s_customhandler();} else { return s_resume ?((uint32_t) s_resume) :(epc+4);} } void installExceptionHandlers(uint32_t(*handler)(uint32_t *regs, uint32_t from));void uninstallExceptionHandlers();uint32_t branchbranch1();uint32_t branchbranch2();uint32_t jumpjump1();uint32_t jumpjump2();uint32_t cpu_LWR_LWL_half(uint32_t buff[], uint32_t initial);uint32_t cpu_LWR_LWL_nodelay(uint32_t buff[], uint32_t initial);uint32_t cpu_LWR_LWL_delayed(uint32_t buff[], uint32_t initial);uint32_t cpu_LWR_LWL_load_different(uint32_t buff[], uint32_t initial);uint32_t cpu_LW_LWR(uint32_t buff[], uint32_t initial);uint32_t cpu_delayed_load(uint32_t buff[], uint32_t override);uint32_t cpu_delayed_load_cancelled(uint32_t buff[], uint32_t override);uint64_t cpu_delayed_load_load(uint32_t buff[], uint32_t override);uint32_t linkandload();uint32_t lwandlink();uint32_t nolink();static int s_interruptsWereEnabled;) CESTER_BEFORE_EACH(cpu_tests
CESTER_TEST(cpu_cop0_basic_write_bp, cpu_tests, uint32_t expectedEPC;uint32_t t;volatile uint32_t *ptr=(volatile uint32_t *) 0x58; *ptr=1;__asm__ volatile("" " lui %0, 0b1100101010000000\n" " mtc0 %0, $7\n" " li %0, 0x58\n" " mtc0 %0, $5\n" " li %0, 0xfffffff0\n" " mtc0 %0, $9\n" :"=r"(t));cester_assert_uint_eq(1, *ptr);__asm__ volatile("la %0, 1f\n1:\nsw $0, 0x58($0)" :"=r"(expectedEPC));__asm__ volatile("mtc0 $0, $7\n");cester_assert_uint_eq(0, *ptr);cester_assert_uint_eq(1, s_got40);cester_assert_uint_eq(0, s_got80);cester_assert_uint_eq(0x40, s_from);cester_assert_uint_eq(expectedEPC, s_epc);) CESTER_TEST(cpu_cop0_kseg_write_bp
cester_assert_uint_eq(1, *ptr)
cester_assert_uint_ne(0, r)
#define ANCHOR_Y
#define ANCHOR_X
ramsyscall_printf("=== e01_kseg1_reads_no_fill ===\n")
#define CT_TEXTRI_DX_1023
Definition raster-expected-phase14.h:55
#define CT_RECT_H_512
Definition raster-expected-phase14.h:94
#define CT_TRI_VERTEX_ABS_OVER
Definition raster-expected-phase14.h:98
#define CT_TEXTRI_DX_1024
Definition raster-expected-phase14.h:56
#define CT_TEXTRI_DX_2047
Definition raster-expected-phase14.h:57
#define CT_QUAD_DY_512
Definition raster-expected-phase14.h:64
#define CT_TRI_DX_2047
Definition raster-expected-phase14.h:41
#define CT_TRI_DX_1025
Definition raster-expected-phase14.h:40
#define CT_TRI_DY_513
Definition raster-expected-phase14.h:44
#define CT_RECT_W_1025
Definition raster-expected-phase14.h:92
#define CT_TRI_DX_1023
Definition raster-expected-phase14.h:38
#define CT_RECT_W_1024
Definition raster-expected-phase14.h:91
#define CT_LINE_DX_2047
Definition raster-expected-phase14.h:75
#define CT_TEXQUAD_DX_1023
Definition raster-expected-phase14.h:68
#define CT_TRI_DX_1024
Definition raster-expected-phase14.h:39
#define CT_GTRI_DX_2047
Definition raster-expected-phase14.h:50
#define CT_TRI_PRETRUNC_BIT15
Definition raster-expected-phase14.h:107
#define CT_TRI_PRETRUNC_BIT11
Definition raster-expected-phase14.h:106
#define CT_RECT_H_511
Definition raster-expected-phase14.h:93
#define CT_LINE_DX_1023
Definition raster-expected-phase14.h:73
#define CT_RECT_W_1023
Definition raster-expected-phase14.h:90
#define CT_GTRI_DX_1023
Definition raster-expected-phase14.h:48
#define CT_TRI_DY_512
Definition raster-expected-phase14.h:43
#define CT_TRI_DY_1023
Definition raster-expected-phase14.h:45
#define CT_RECT_H_513
Definition raster-expected-phase14.h:95
#define CT_GTRI_DX_1024
Definition raster-expected-phase14.h:49
#define CT_TEXQUAD_DX_2047
Definition raster-expected-phase14.h:70
#define CT_TEXQUAD_DX_1024
Definition raster-expected-phase14.h:69
#define CT_QUAD_DY_511
Definition raster-expected-phase14.h:63
#define CT_QUAD_DX_2047
Definition raster-expected-phase14.h:62
#define CT_QUAD_DX_1023
Definition raster-expected-phase14.h:60
#define CT_LINE_DX_1024
Definition raster-expected-phase14.h:74
#define CT_TRI_DY_511
Definition raster-expected-phase14.h:42
#define CT_QUAD_DX_1024
Definition raster-expected-phase14.h:61
#define RASTER_VRAM_GREEN
Definition raster-helpers.h:126
#define RASTER_VRAM_BLUE
Definition raster-helpers.h:128
#define RASTER_VRAM_WHITE
Definition raster-helpers.h:130
#define ASSERT_PIXEL_UNTOUCHED(x_, y_)
Definition raster-helpers.h:485
#define RASTER_VRAM_RED
Definition raster-helpers.h:124
#define RASTER_CMD_BLUE
Definition raster-helpers.h:127
#define RASTER_CMD_RED
Definition raster-helpers.h:123
#define RASTER_CMD_WHITE
Definition raster-helpers.h:129
#define RASTER_CMD_GREEN
Definition raster-helpers.h:125
#define ASSERT_PIXEL_EQ(expected, x_, y_)
Definition raster-helpers.h:472
#define RASTER_SENTINEL
Definition raster-helpers.h:94
#define TEX15_TY
Definition texture-fixtures.h:66
#define TEX15_TPAGE
Definition texture-fixtures.h:104
#define CLUT15_FIELD
Definition texture-fixtures.h:85
#define TEX15_TX
Definition texture-fixtures.h:65
#define TEX_MOD_NEUTRAL
Definition texture-fixtures.h:328