1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright (C) 2021 Collabora, Ltd.
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker #include "pan_texture.h"
25*61046927SAndroid Build Coastguard Worker #include "pan_util.h"
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker /* A test consists of a render target format, clear colour, dither state, and
28*61046927SAndroid Build Coastguard Worker * translated form. Dither state matters when the tilebuffer format is more
29*61046927SAndroid Build Coastguard Worker * precise than the final format. */
30*61046927SAndroid Build Coastguard Worker struct test {
31*61046927SAndroid Build Coastguard Worker enum pipe_format format;
32*61046927SAndroid Build Coastguard Worker bool dithered;
33*61046927SAndroid Build Coastguard Worker union pipe_color_union colour;
34*61046927SAndroid Build Coastguard Worker uint32_t packed[4];
35*61046927SAndroid Build Coastguard Worker };
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker #define RRRR(r) \
38*61046927SAndroid Build Coastguard Worker { \
39*61046927SAndroid Build Coastguard Worker r, r, r, r \
40*61046927SAndroid Build Coastguard Worker }
41*61046927SAndroid Build Coastguard Worker #define RGRG(r, g) \
42*61046927SAndroid Build Coastguard Worker { \
43*61046927SAndroid Build Coastguard Worker r, g, r, g \
44*61046927SAndroid Build Coastguard Worker }
45*61046927SAndroid Build Coastguard Worker #define F(r, g, b, a) \
46*61046927SAndroid Build Coastguard Worker { \
47*61046927SAndroid Build Coastguard Worker .f = { r, g, b, a } \
48*61046927SAndroid Build Coastguard Worker }
49*61046927SAndroid Build Coastguard Worker #define UI(r, g, b, a) \
50*61046927SAndroid Build Coastguard Worker { \
51*61046927SAndroid Build Coastguard Worker .ui = { r, g, b, a } \
52*61046927SAndroid Build Coastguard Worker }
53*61046927SAndroid Build Coastguard Worker #define D (true)
54*61046927SAndroid Build Coastguard Worker #define _ (false)
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker /* clang-format off */
57*61046927SAndroid Build Coastguard Worker static const struct test clear_tests[] = {
58*61046927SAndroid Build Coastguard Worker /* Basic tests */
59*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R8G8B8A8_UNORM, D, F(0.0, 0.0, 0.0, 0.0), RRRR(0x00000000) },
60*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R8G8B8A8_UNORM, _, F(0.0, 0.0, 0.0, 0.0), RRRR(0x00000000) },
61*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R8G8B8A8_UNORM, D, F(1.0, 0.0, 0.0, 1.0), RRRR(0xFF0000FF) },
62*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R8G8B8A8_UNORM, _, F(1.0, 0.0, 0.0, 1.0), RRRR(0xFF0000FF) },
63*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B8G8R8A8_UNORM, D, F(1.0, 0.0, 0.0, 1.0), RRRR(0xFF0000FF) },
64*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B8G8R8A8_UNORM, _, F(1.0, 0.0, 0.0, 1.0), RRRR(0xFF0000FF) },
65*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R8G8B8A8_UNORM, D, F(0.664, 0.0, 0.0, 0.0), RRRR(0x000000A9) },
66*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R8G8B8A8_UNORM, _, F(0.664, 0.0, 0.0, 0.0), RRRR(0x000000A9) },
67*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, D, F(0.664, 0.0, 0.0, 0.0), RRRR(0x0000009F) },
68*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, _, F(0.664, 0.0, 0.0, 0.0), RRRR(0x000000A0) },
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker /* Test rounding to nearest even. The values are cherrypicked to multiply
71*61046927SAndroid Build Coastguard Worker * out to a fractional part of 0.5. The first test should round down and
72*61046927SAndroid Build Coastguard Worker * second test should round up. */
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, D, F(0.41875, 0.0, 0.0, 1.0), RRRR(0xF0000064) },
75*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, D, F(0.40625, 0.0, 0.0, 1.0), RRRR(0xF0000062) },
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker /* Testing rounding direction when dithering is disabled. The packed value
78*61046927SAndroid Build Coastguard Worker * is what gets rounded. This behaves as round-to-even with the cutoff point
79*61046927SAndroid Build Coastguard Worker * at 2^-m + 2^-n for an m:n representation. */
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, _, F(0.03125, 0.0, 0.0, 1.0), RRRR(0xF0000000) },
82*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, _, F(0.03125, 0.0, 0.0, 1.0), RRRR(0xF0000000) },
83*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, _, F(0.03333, 0.0, 0.0, 1.0), RRRR(0xF0000000) },
84*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, _, F(0.03334, 0.0, 0.0, 1.0), RRRR(0xF0000010) },
85*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, _, F(0.09375, 0.0, 0.0, 1.0), RRRR(0xF0000010) },
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker /* Check all the special formats with different edge cases */
88*61046927SAndroid Build Coastguard Worker
89*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, D, F(0.127, 2.4, -1.0, 0.5), RRRR(0x7800F01E) },
90*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R5G5B5A1_UNORM, D, F(0.127, 2.4, -1.0, 0.5), RRRR(0x400F807E) },
91*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R5G6B5_UNORM, D, F(0.127, 2.4, -1.0, 0.5), RRRR(0x000FC07E) },
92*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R10G10B10A2_UNORM, D, F(0.127, 2.4, -1.0, 0.5), RRRR(0x800FFC82) },
93*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R8G8B8A8_SRGB, D, F(0.127, 2.4, -1.0, 0.5), RRRR(0x8000FF64) },
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, D, F(0.718, 0.18, 1.0, 2.0), RRRR(0xF0F02BAC) },
96*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R5G6B5_UNORM, D, F(0.718, 0.18, 1.0, 2.0), RRRR(0x3E02D6C8) },
97*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R5G5B5A1_UNORM, D, F(0.718, 0.18, 1.0, 2.0), RRRR(0xBE02CEC8) },
98*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R10G10B10A2_UNORM, D, F(0.718, 0.18, 1.0, 2.0), RRRR(0xFFF2E2DF) },
99*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R8G8B8A8_SRGB, D, F(0.718, 0.18, 1.0, 2.0), RRRR(0xFFFF76DC) },
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker /* Check that values are padded when dithering is disabled */
102*61046927SAndroid Build Coastguard Worker
103*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R4G4B4A4_UNORM, _, F(0.718, 0.18, 1.0, 2.0), RRRR(0xF0F030B0) },
104*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R5G6B5_UNORM, _, F(0.718, 0.18, 1.0, 2.0), RRRR(0x3E02C2C0) },
105*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R5G5B5A1_UNORM, _, F(0.718, 0.18, 1.0, 2.0), RRRR(0xBE0302C0) },
106*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R10G10B10A2_UNORM, _, F(0.718, 0.18, 1.0, 2.0), RRRR(0xFFF2E2DF) },
107*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R8G8B8A8_SRGB, _, F(0.718, 0.18, 1.0, 2.0), RRRR(0xFFFF76DC) },
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker /* Check that blendable tilebuffer values are invariant under swizzling */
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B4G4R4A4_UNORM, D, F(0.127, 2.4, -1.0, 0.5), RRRR(0x7800F01E) },
112*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B5G5R5A1_UNORM, D, F(0.127, 2.4, -1.0, 0.5), RRRR(0x400F807E) },
113*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B5G6R5_UNORM, D, F(0.127, 2.4, -1.0, 0.5), RRRR(0x000FC07E) },
114*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B10G10R10A2_UNORM, D, F(0.127, 2.4, -1.0, 0.5), RRRR(0x800FFC82) },
115*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B8G8R8A8_SRGB, D, F(0.127, 2.4, -1.0, 0.5), RRRR(0x8000FF64) },
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B4G4R4A4_UNORM, D, F(0.718, 0.18, 1.0, 2.0), RRRR(0xF0F02BAC) },
118*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B5G6R5_UNORM, D, F(0.718, 0.18, 1.0, 2.0), RRRR(0x3E02D6C8) },
119*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B5G5R5A1_UNORM, D, F(0.718, 0.18, 1.0, 2.0), RRRR(0xBE02CEC8) },
120*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B10G10R10A2_UNORM, D, F(0.718, 0.18, 1.0, 2.0), RRRR(0xFFF2E2DF) },
121*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B8G8R8A8_SRGB, D, F(0.718, 0.18, 1.0, 2.0), RRRR(0xFFFF76DC) },
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B4G4R4A4_UNORM, _, F(0.718, 0.18, 1.0, 2.0), RRRR(0xF0F030B0) },
124*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B5G6R5_UNORM, _, F(0.718, 0.18, 1.0, 2.0), RRRR(0x3E02C2C0) },
125*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B5G5R5A1_UNORM, _, F(0.718, 0.18, 1.0, 2.0), RRRR(0xBE0302C0) },
126*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B10G10R10A2_UNORM, _, F(0.718, 0.18, 1.0, 2.0), RRRR(0xFFF2E2DF) },
127*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B8G8R8A8_SRGB, _, F(0.718, 0.18, 1.0, 2.0), RRRR(0xFFFF76DC) },
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker /* Check raw formats, which are not invariant under swizzling. Raw formats
130*61046927SAndroid Build Coastguard Worker * cannot be dithered. */
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R8G8B8A8_UINT, D, UI(0xCA, 0xFE, 0xBA, 0xBE), RRRR(0xBEBAFECA) },
133*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R8G8B8A8_UINT, _, UI(0xCA, 0xFE, 0xBA, 0xBE), RRRR(0xBEBAFECA) },
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B8G8R8A8_UINT, D, UI(0xCA, 0xFE, 0xBA, 0xBE), RRRR(0xBECAFEBA) },
136*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_B8G8R8A8_UINT, _, UI(0xCA, 0xFE, 0xBA, 0xBE), RRRR(0xBECAFEBA) },
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker /* Check that larger raw formats are replicated correctly */
139*61046927SAndroid Build Coastguard Worker
140*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R16G16B16A16_UINT, D, UI(0xCAFE, 0xBABE, 0xABAD, 0x1DEA),
141*61046927SAndroid Build Coastguard Worker RGRG(0xBABECAFE, 0x1DEAABAD) },
142*61046927SAndroid Build Coastguard Worker
143*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R16G16B16A16_UINT, _, UI(0xCAFE, 0xBABE, 0xABAD, 0x1DEA),
144*61046927SAndroid Build Coastguard Worker RGRG(0xBABECAFE, 0x1DEAABAD) },
145*61046927SAndroid Build Coastguard Worker
146*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R32G32B32A32_UINT, D,
147*61046927SAndroid Build Coastguard Worker UI(0xCAFEBABE, 0xABAD1DEA, 0xDEADBEEF, 0xABCDEF01),
148*61046927SAndroid Build Coastguard Worker { 0xCAFEBABE, 0xABAD1DEA, 0xDEADBEEF, 0xABCDEF01 } },
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker { PIPE_FORMAT_R32G32B32A32_UINT, _,
151*61046927SAndroid Build Coastguard Worker UI(0xCAFEBABE, 0xABAD1DEA, 0xDEADBEEF, 0xABCDEF01),
152*61046927SAndroid Build Coastguard Worker { 0xCAFEBABE, 0xABAD1DEA, 0xDEADBEEF, 0xABCDEF01 } },
153*61046927SAndroid Build Coastguard Worker };
154*61046927SAndroid Build Coastguard Worker /* clang-format on */
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker #define ASSERT_EQ(x, y) \
157*61046927SAndroid Build Coastguard Worker do { \
158*61046927SAndroid Build Coastguard Worker if ((x[0] == y[0]) && (x[1] == y[1]) && (x[2] == y[2]) && \
159*61046927SAndroid Build Coastguard Worker (x[3] == y[3])) { \
160*61046927SAndroid Build Coastguard Worker nr_pass++; \
161*61046927SAndroid Build Coastguard Worker } else { \
162*61046927SAndroid Build Coastguard Worker nr_fail++; \
163*61046927SAndroid Build Coastguard Worker fprintf( \
164*61046927SAndroid Build Coastguard Worker stderr, \
165*61046927SAndroid Build Coastguard Worker "%s%s: Assertion failed %s (%08X %08X %08X %08X) != %s (%08X %08X %08X %08X)\n", \
166*61046927SAndroid Build Coastguard Worker util_format_short_name(T.format), T.dithered ? " dithered" : "", \
167*61046927SAndroid Build Coastguard Worker #x, x[0], x[1], x[2], x[3], #y, y[0], y[1], y[2], y[3]); \
168*61046927SAndroid Build Coastguard Worker } \
169*61046927SAndroid Build Coastguard Worker } while (0)
170*61046927SAndroid Build Coastguard Worker
171*61046927SAndroid Build Coastguard Worker int
main(int argc,const char ** argv)172*61046927SAndroid Build Coastguard Worker main(int argc, const char **argv)
173*61046927SAndroid Build Coastguard Worker {
174*61046927SAndroid Build Coastguard Worker unsigned nr_pass = 0, nr_fail = 0;
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(clear_tests); ++i) {
177*61046927SAndroid Build Coastguard Worker struct test T = clear_tests[i];
178*61046927SAndroid Build Coastguard Worker uint32_t packed[4];
179*61046927SAndroid Build Coastguard Worker pan_pack_color(panfrost_blendable_formats_v7, &packed[0], &T.colour,
180*61046927SAndroid Build Coastguard Worker T.format, T.dithered);
181*61046927SAndroid Build Coastguard Worker
182*61046927SAndroid Build Coastguard Worker ASSERT_EQ(T.packed, packed);
183*61046927SAndroid Build Coastguard Worker }
184*61046927SAndroid Build Coastguard Worker
185*61046927SAndroid Build Coastguard Worker printf("Passed %u/%u\n", nr_pass, nr_pass + nr_fail);
186*61046927SAndroid Build Coastguard Worker return nr_fail ? 1 : 0;
187*61046927SAndroid Build Coastguard Worker }
188