1 /**************************************************************************
3 * Copyright 2009-2010 VMware, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
32 #include "util/u_format.h"
33 #include "util/u_format_pack.h"
36 #define MAX_PACKED_BYTES 4
40 * A (packed, unpacked) color pair.
42 struct util_format_test_case
44 enum pipe_format format
;
47 * Mask of the bits that actually meaningful data. Used to mask out the
50 uint8_t mask
[MAX_PACKED_BYTES
];
52 uint8_t packed
[MAX_PACKED_BYTES
];
62 * Helper macros to create the packed bytes for longer words.
65 #define PACKED_1x8(x) {x, 0, 0, 0}
66 #define PACKED_2x8(x, y) {x, y, 0, 0}
67 #define PACKED_3x8(x, y, z) {x, y, z, 0}
68 #define PACKED_4x8(x, y, z, w) {x, y, z, w}
69 #define PACKED_1x32(x) {(x) & 0xff, ((x) >> 8) & 0xff, ((x) >> 16) & 0xff, ((x) >> 24) & 0xff}
70 #define PACKED_1x16(x) {(x) & 0xff, ((x) >> 8) & 0xff, 0, 0}
76 * These were manually entered. We could generate these
78 * To keep this to a we cover only the corner cases, which should produce
79 * good enough coverage since that pixel format transformations are afine for
82 static const struct util_format_test_case
87 * 32-bit rendertarget formats
90 {PIPE_FORMAT_B8G8R8A8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x00000000), {0.0, 0.0, 0.0, 0.0}},
91 {PIPE_FORMAT_B8G8R8A8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x000000ff), {0.0, 0.0, 1.0, 0.0}},
92 {PIPE_FORMAT_B8G8R8A8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x0000ff00), {0.0, 1.0, 0.0, 0.0}},
93 {PIPE_FORMAT_B8G8R8A8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x00ff0000), {1.0, 0.0, 0.0, 0.0}},
94 {PIPE_FORMAT_B8G8R8A8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0xff000000), {0.0, 0.0, 0.0, 1.0}},
95 {PIPE_FORMAT_B8G8R8A8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0xffffffff), {1.0, 1.0, 1.0, 1.0}},
97 {PIPE_FORMAT_B8G8R8X8_UNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00000000), {0.0, 0.0, 0.0, 1.0}},
98 {PIPE_FORMAT_B8G8R8X8_UNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x000000ff), {0.0, 0.0, 1.0, 1.0}},
99 {PIPE_FORMAT_B8G8R8X8_UNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x0000ff00), {0.0, 1.0, 0.0, 1.0}},
100 {PIPE_FORMAT_B8G8R8X8_UNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00ff0000), {1.0, 0.0, 0.0, 1.0}},
101 {PIPE_FORMAT_B8G8R8X8_UNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0xff000000), {0.0, 0.0, 0.0, 1.0}},
102 {PIPE_FORMAT_B8G8R8X8_UNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0xffffffff), {1.0, 1.0, 1.0, 1.0}},
104 {PIPE_FORMAT_A8R8G8B8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x00000000), {0.0, 0.0, 0.0, 0.0}},
105 {PIPE_FORMAT_A8R8G8B8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x000000ff), {0.0, 0.0, 0.0, 1.0}},
106 {PIPE_FORMAT_A8R8G8B8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x0000ff00), {1.0, 0.0, 0.0, 0.0}},
107 {PIPE_FORMAT_A8R8G8B8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x00ff0000), {0.0, 1.0, 0.0, 0.0}},
108 {PIPE_FORMAT_A8R8G8B8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0xff000000), {0.0, 0.0, 1.0, 0.0}},
109 {PIPE_FORMAT_A8R8G8B8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0xffffffff), {1.0, 1.0, 1.0, 1.0}},
111 {PIPE_FORMAT_X8R8G8B8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0x00000000), {0.0, 0.0, 0.0, 1.0}},
112 {PIPE_FORMAT_X8R8G8B8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0x000000ff), {0.0, 0.0, 0.0, 1.0}},
113 {PIPE_FORMAT_X8R8G8B8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0x0000ff00), {1.0, 0.0, 0.0, 1.0}},
114 {PIPE_FORMAT_X8R8G8B8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0x00ff0000), {0.0, 1.0, 0.0, 1.0}},
115 {PIPE_FORMAT_X8R8G8B8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0xff000000), {0.0, 0.0, 1.0, 1.0}},
116 {PIPE_FORMAT_X8R8G8B8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0xffffffff), {1.0, 1.0, 1.0, 1.0}},
118 {PIPE_FORMAT_A8B8G8R8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x00000000), {0.0, 0.0, 0.0, 0.0}},
119 {PIPE_FORMAT_A8B8G8R8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x000000ff), {0.0, 0.0, 0.0, 1.0}},
120 {PIPE_FORMAT_A8B8G8R8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x0000ff00), {0.0, 0.0, 1.0, 0.0}},
121 {PIPE_FORMAT_A8B8G8R8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x00ff0000), {0.0, 1.0, 0.0, 0.0}},
122 {PIPE_FORMAT_A8B8G8R8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0xff000000), {1.0, 0.0, 0.0, 0.0}},
123 {PIPE_FORMAT_A8B8G8R8_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0xffffffff), {1.0, 1.0, 1.0, 1.0}},
125 {PIPE_FORMAT_X8B8G8R8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0x00000000), {0.0, 0.0, 0.0, 1.0}},
126 {PIPE_FORMAT_X8B8G8R8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0x000000ff), {0.0, 0.0, 0.0, 1.0}},
127 {PIPE_FORMAT_X8B8G8R8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0x0000ff00), {0.0, 0.0, 1.0, 1.0}},
128 {PIPE_FORMAT_X8B8G8R8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0x00ff0000), {0.0, 1.0, 0.0, 1.0}},
129 {PIPE_FORMAT_X8B8G8R8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0xff000000), {1.0, 0.0, 0.0, 1.0}},
130 {PIPE_FORMAT_X8B8G8R8_UNORM
, PACKED_1x32(0xffffff00), PACKED_1x32(0xffffffff), {1.0, 1.0, 1.0, 1.0}},
132 {PIPE_FORMAT_R10G10B10A2_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x00000000), {0.0, 0.0, 0.0, 0.0}},
133 {PIPE_FORMAT_R10G10B10A2_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x000003ff), {1.0, 0.0, 0.0, 0.0}},
134 {PIPE_FORMAT_R10G10B10A2_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x000ffc00), {0.0, 1.0, 0.0, 0.0}},
135 {PIPE_FORMAT_R10G10B10A2_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0x3ff00000), {0.0, 0.0, 1.0, 0.0}},
136 {PIPE_FORMAT_R10G10B10A2_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0xc0000000), {0.0, 0.0, 0.0, 1.0}},
137 {PIPE_FORMAT_R10G10B10A2_UNORM
, PACKED_1x32(0xffffffff), PACKED_1x32(0xffffffff), {1.0, 1.0, 1.0, 1.0}},
140 * 16-bit rendertarget formats
143 {PIPE_FORMAT_B5G5R5A1_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x0000), {0.0, 0.0, 0.0, 0.0}},
144 {PIPE_FORMAT_B5G5R5A1_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x001f), {0.0, 0.0, 1.0, 0.0}},
145 {PIPE_FORMAT_B5G5R5A1_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x03e0), {0.0, 1.0, 0.0, 0.0}},
146 {PIPE_FORMAT_B5G5R5A1_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x7c00), {1.0, 0.0, 0.0, 0.0}},
147 {PIPE_FORMAT_B5G5R5A1_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x8000), {0.0, 0.0, 0.0, 1.0}},
148 {PIPE_FORMAT_B5G5R5A1_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0xffff), {1.0, 1.0, 1.0, 1.0}},
150 {PIPE_FORMAT_B4G4R4A4_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x0000), {0.0, 0.0, 0.0, 0.0}},
151 {PIPE_FORMAT_B4G4R4A4_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x000f), {0.0, 0.0, 1.0, 0.0}},
152 {PIPE_FORMAT_B4G4R4A4_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x00f0), {0.0, 1.0, 0.0, 0.0}},
153 {PIPE_FORMAT_B4G4R4A4_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x0f00), {1.0, 0.0, 0.0, 0.0}},
154 {PIPE_FORMAT_B4G4R4A4_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0xf000), {0.0, 0.0, 0.0, 1.0}},
155 {PIPE_FORMAT_B4G4R4A4_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0xffff), {1.0, 1.0, 1.0, 1.0}},
157 {PIPE_FORMAT_B5G6R5_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x0000), {0.0, 0.0, 0.0, 1.0}},
158 {PIPE_FORMAT_B5G6R5_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x001f), {0.0, 0.0, 1.0, 1.0}},
159 {PIPE_FORMAT_B5G6R5_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x07e0), {0.0, 1.0, 0.0, 1.0}},
160 {PIPE_FORMAT_B5G6R5_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0xf800), {1.0, 0.0, 0.0, 1.0}},
161 {PIPE_FORMAT_B5G6R5_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0xffff), {1.0, 1.0, 1.0, 1.0}},
164 * Luminance/intensity/alpha formats
167 {PIPE_FORMAT_L8_UNORM
, PACKED_1x8(0xff), PACKED_1x8(0x00), {0.0, 0.0, 0.0, 1.0}},
168 {PIPE_FORMAT_L8_UNORM
, PACKED_1x8(0xff), PACKED_1x8(0xff), {1.0, 1.0, 1.0, 1.0}},
170 {PIPE_FORMAT_A8_UNORM
, PACKED_1x8(0xff), PACKED_1x8(0x00), {0.0, 0.0, 0.0, 0.0}},
171 {PIPE_FORMAT_A8_UNORM
, PACKED_1x8(0xff), PACKED_1x8(0xff), {0.0, 0.0, 0.0, 1.0}},
173 {PIPE_FORMAT_I8_UNORM
, PACKED_1x8(0xff), PACKED_1x8(0x00), {0.0, 0.0, 0.0, 0.0}},
174 {PIPE_FORMAT_I8_UNORM
, PACKED_1x8(0xff), PACKED_1x8(0xff), {1.0, 1.0, 1.0, 1.0}},
176 {PIPE_FORMAT_L8A8_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x0000), {0.0, 0.0, 0.0, 0.0}},
177 {PIPE_FORMAT_L8A8_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x00ff), {1.0, 1.0, 1.0, 0.0}},
178 {PIPE_FORMAT_L8A8_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0xff00), {0.0, 0.0, 0.0, 1.0}},
179 {PIPE_FORMAT_L8A8_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0xffff), {1.0, 1.0, 1.0, 1.0}},
181 {PIPE_FORMAT_L16_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0x0000), {0.0, 0.0, 0.0, 1.0}},
182 {PIPE_FORMAT_L16_UNORM
, PACKED_1x16(0xffff), PACKED_1x16(0xffff), {1.0, 1.0, 1.0, 1.0}},
189 * Signed (bump map) formats
192 {PIPE_FORMAT_R8G8B8X8_SNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00000000), { 0.0, 0.0, 0.0, 1.0}},
193 {PIPE_FORMAT_R8G8B8X8_SNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x0000007f), { 1.0, 0.0, 0.0, 1.0}},
194 {PIPE_FORMAT_R8G8B8X8_SNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00000081), {-1.0, 0.0, 0.0, 1.0}},
195 {PIPE_FORMAT_R8G8B8X8_SNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00007f00), { 0.0, 1.0, 0.0, 1.0}},
196 {PIPE_FORMAT_R8G8B8X8_SNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00008100), { 0.0, -1.0, 0.0, 1.0}},
197 {PIPE_FORMAT_R8G8B8X8_SNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x007f0000), { 0.0, 0.0, 1.0, 1.0}},
198 {PIPE_FORMAT_R8G8B8X8_SNORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00810000), { 0.0, 0.0, -1.0, 1.0}},
200 {PIPE_FORMAT_R8SG8SB8UX8U_NORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00000000), { 0.0, 0.0, 0.0, 1.0}},
201 {PIPE_FORMAT_R8SG8SB8UX8U_NORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x0000007f), { 1.0, 0.0, 0.0, 1.0}},
202 {PIPE_FORMAT_R8SG8SB8UX8U_NORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00000081), {-1.0, 0.0, 0.0, 1.0}},
203 {PIPE_FORMAT_R8SG8SB8UX8U_NORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00007f00), { 0.0, 1.0, 0.0, 1.0}},
204 {PIPE_FORMAT_R8SG8SB8UX8U_NORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00008100), { 0.0, -1.0, 0.0, 1.0}},
205 {PIPE_FORMAT_R8SG8SB8UX8U_NORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0x00ff0000), { 0.0, 0.0, 1.0, 1.0}},
206 {PIPE_FORMAT_R8SG8SB8UX8U_NORM
, PACKED_1x32(0x00ffffff), PACKED_1x32(0xff000000), { 0.0, 0.0, 0.0, 1.0}},
208 {PIPE_FORMAT_R5SG5SB6U_NORM
, PACKED_1x16(0xffff), PACKED_1x16(0x0000), { 0.0, 0.0, 0.0, 1.0}},
209 {PIPE_FORMAT_R5SG5SB6U_NORM
, PACKED_1x16(0xffff), PACKED_1x16(0x000f), { 1.0, 0.0, 0.0, 1.0}},
210 {PIPE_FORMAT_R5SG5SB6U_NORM
, PACKED_1x16(0xffff), PACKED_1x16(0x0011), {-1.0, 0.0, 0.0, 1.0}},
211 {PIPE_FORMAT_R5SG5SB6U_NORM
, PACKED_1x16(0xffff), PACKED_1x16(0x01e0), { 0.0, 1.0, 0.0, 1.0}},
212 {PIPE_FORMAT_R5SG5SB6U_NORM
, PACKED_1x16(0xffff), PACKED_1x16(0x0220), { 0.0, -1.0, 0.0, 1.0}},
213 {PIPE_FORMAT_R5SG5SB6U_NORM
, PACKED_1x16(0xffff), PACKED_1x16(0xfc00), { 0.0, 0.0, 1.0, 1.0}},
216 * TODO: Depth-stencil formats
224 * TODO: Compressed formats
231 {PIPE_FORMAT_R8_UNORM
, PACKED_1x8(0xff), PACKED_1x8(0x00), {0.0, 0.0, 0.0, 1.0}},
232 {PIPE_FORMAT_R8_UNORM
, PACKED_1x8(0xff), PACKED_1x8(0xff), {1.0, 0.0, 0.0, 1.0}},
234 {PIPE_FORMAT_R8G8_UNORM
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x00, 0x00), {0.0, 0.0, 0.0, 1.0}},
235 {PIPE_FORMAT_R8G8_UNORM
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0xff, 0x00), {1.0, 0.0, 0.0, 1.0}},
236 {PIPE_FORMAT_R8G8_UNORM
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x00, 0xff), {0.0, 1.0, 0.0, 1.0}},
237 {PIPE_FORMAT_R8G8_UNORM
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0xff, 0xff), {1.0, 1.0, 0.0, 1.0}},
239 {PIPE_FORMAT_R8G8B8_UNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x00, 0x00), {0.0, 0.0, 0.0, 1.0}},
240 {PIPE_FORMAT_R8G8B8_UNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0xff, 0x00, 0x00), {1.0, 0.0, 0.0, 1.0}},
241 {PIPE_FORMAT_R8G8B8_UNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0xff, 0x00), {0.0, 1.0, 0.0, 1.0}},
242 {PIPE_FORMAT_R8G8B8_UNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x00, 0xff), {0.0, 0.0, 1.0, 1.0}},
243 {PIPE_FORMAT_R8G8B8_UNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0xff, 0xff, 0xff), {1.0, 1.0, 1.0, 1.0}},
245 {PIPE_FORMAT_R8G8B8A8_UNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x00, 0x00), {0.0, 0.0, 0.0, 0.0}},
246 {PIPE_FORMAT_R8G8B8A8_UNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0xff, 0x00, 0x00, 0x00), {1.0, 0.0, 0.0, 0.0}},
247 {PIPE_FORMAT_R8G8B8A8_UNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0xff, 0x00, 0x00), {0.0, 1.0, 0.0, 0.0}},
248 {PIPE_FORMAT_R8G8B8A8_UNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0xff, 0x00), {0.0, 0.0, 1.0, 0.0}},
249 {PIPE_FORMAT_R8G8B8A8_UNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x00, 0xff), {0.0, 0.0, 0.0, 1.0}},
250 {PIPE_FORMAT_R8G8B8A8_UNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0xff, 0xff, 0xff, 0xff), {1.0, 1.0, 1.0, 1.0}},
252 {PIPE_FORMAT_R8_USCALED
, PACKED_1x8(0xff), PACKED_1x8(0x00), { 0.0, 0.0, 0.0, 1.0}},
253 {PIPE_FORMAT_R8_USCALED
, PACKED_1x8(0xff), PACKED_1x8(0xff), {255.0, 0.0, 0.0, 1.0}},
255 {PIPE_FORMAT_R8G8_USCALED
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x00, 0x00), { 0.0, 0.0, 0.0, 1.0}},
256 {PIPE_FORMAT_R8G8_USCALED
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0xff, 0x00), {255.0, 0.0, 0.0, 1.0}},
257 {PIPE_FORMAT_R8G8_USCALED
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x00, 0xff), { 0.0, 255.0, 0.0, 1.0}},
258 {PIPE_FORMAT_R8G8_USCALED
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0xff, 0xff), {255.0, 255.0, 0.0, 1.0}},
260 {PIPE_FORMAT_R8G8B8_USCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x00, 0x00), { 0.0, 0.0, 0.0, 1.0}},
261 {PIPE_FORMAT_R8G8B8_USCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0xff, 0x00, 0x00), {255.0, 0.0, 0.0, 1.0}},
262 {PIPE_FORMAT_R8G8B8_USCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0xff, 0x00), { 0.0, 255.0, 0.0, 1.0}},
263 {PIPE_FORMAT_R8G8B8_USCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x00, 0xff), { 0.0, 0.0, 255.0, 1.0}},
264 {PIPE_FORMAT_R8G8B8_USCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0xff, 0xff, 0xff), {255.0, 255.0, 255.0, 1.0}},
266 {PIPE_FORMAT_R8G8B8A8_USCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x00, 0x00), { 0.0, 0.0, 0.0, 0.0}},
267 {PIPE_FORMAT_R8G8B8A8_USCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0xff, 0x00, 0x00, 0x00), {255.0, 0.0, 0.0, 0.0}},
268 {PIPE_FORMAT_R8G8B8A8_USCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0xff, 0x00, 0x00), { 0.0, 255.0, 0.0, 0.0}},
269 {PIPE_FORMAT_R8G8B8A8_USCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0xff, 0x00), { 0.0, 0.0, 255.0, 0.0}},
270 {PIPE_FORMAT_R8G8B8A8_USCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x00, 0xff), { 0.0, 0.0, 0.0, 255.0}},
271 {PIPE_FORMAT_R8G8B8A8_USCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0xff, 0xff, 0xff, 0xff), {255.0, 255.0, 255.0, 255.0}},
273 {PIPE_FORMAT_R8_SNORM
, PACKED_1x8(0xff), PACKED_1x8(0x00), { 0.0, 0.0, 0.0, 1.0}},
274 {PIPE_FORMAT_R8_SNORM
, PACKED_1x8(0xff), PACKED_1x8(0x7f), { 1.0, 0.0, 0.0, 1.0}},
275 {PIPE_FORMAT_R8_SNORM
, PACKED_1x8(0xff), PACKED_1x8(0x81), {-1.0, 0.0, 0.0, 1.0}},
277 {PIPE_FORMAT_R8G8_SNORM
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x00, 0x00), { 0.0, 0.0, 0.0, 1.0}},
278 {PIPE_FORMAT_R8G8_SNORM
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x7f, 0x00), { 1.0, 0.0, 0.0, 1.0}},
279 {PIPE_FORMAT_R8G8_SNORM
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x81, 0x00), {-1.0, 0.0, 0.0, 1.0}},
280 {PIPE_FORMAT_R8G8_SNORM
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x00, 0x7f), { 0.0, 1.0, 0.0, 1.0}},
281 {PIPE_FORMAT_R8G8_SNORM
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x00, 0x81), { 0.0, -1.0, 0.0, 1.0}},
283 {PIPE_FORMAT_R8G8B8_SNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x00, 0x00), { 0.0, 0.0, 0.0, 1.0}},
284 {PIPE_FORMAT_R8G8B8_SNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x7f, 0x00, 0x00), { 1.0, 0.0, 0.0, 1.0}},
285 {PIPE_FORMAT_R8G8B8_SNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x81, 0x00, 0x00), {-1.0, 0.0, 0.0, 1.0}},
286 {PIPE_FORMAT_R8G8B8_SNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x7f, 0x00), { 0.0, 1.0, 0.0, 1.0}},
287 {PIPE_FORMAT_R8G8B8_SNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x81, 0x00), { 0.0, -1.0, 0.0, 1.0}},
288 {PIPE_FORMAT_R8G8B8_SNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x00, 0x7f), { 0.0, 0.0, 1.0, 1.0}},
289 {PIPE_FORMAT_R8G8B8_SNORM
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x00, 0x81), { 0.0, 0.0, -1.0, 1.0}},
291 {PIPE_FORMAT_R8G8B8A8_SNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x00, 0x00), { 0.0, 0.0, 0.0, 0.0}},
292 {PIPE_FORMAT_R8G8B8A8_SNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x7f, 0x00, 0x00, 0x00), { 1.0, 0.0, 0.0, 0.0}},
293 {PIPE_FORMAT_R8G8B8A8_SNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x81, 0x00, 0x00, 0x00), {-1.0, 0.0, 0.0, 0.0}},
294 {PIPE_FORMAT_R8G8B8A8_SNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x7f, 0x00, 0x00), { 0.0, 1.0, 0.0, 0.0}},
295 {PIPE_FORMAT_R8G8B8A8_SNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x81, 0x00, 0x00), { 0.0, -1.0, 0.0, 0.0}},
296 {PIPE_FORMAT_R8G8B8A8_SNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x7f, 0x00), { 0.0, 0.0, 1.0, 0.0}},
297 {PIPE_FORMAT_R8G8B8A8_SNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x81, 0x00), { 0.0, 0.0, -1.0, 0.0}},
298 {PIPE_FORMAT_R8G8B8A8_SNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x00, 0x7f), { 0.0, 0.0, 0.0, 1.0}},
299 {PIPE_FORMAT_R8G8B8A8_SNORM
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x00, 0x81), { 0.0, 0.0, 0.0, -1.0}},
301 {PIPE_FORMAT_R8_SSCALED
, PACKED_1x8(0xff), PACKED_1x8(0x00), { 0.0, 0.0, 0.0, 1.0}},
302 {PIPE_FORMAT_R8_SSCALED
, PACKED_1x8(0xff), PACKED_1x8(0x7f), { 127.0, 0.0, 0.0, 1.0}},
303 {PIPE_FORMAT_R8_SSCALED
, PACKED_1x8(0xff), PACKED_1x8(0x80), {-128.0, 0.0, 0.0, 1.0}},
305 {PIPE_FORMAT_R8G8_SSCALED
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x00, 0x00), { 0.0, 0.0, 0.0, 1.0}},
306 {PIPE_FORMAT_R8G8_SSCALED
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x7f, 0x00), { 127.0, 0.0, 0.0, 1.0}},
307 {PIPE_FORMAT_R8G8_SSCALED
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x80, 0x00), {-128.0, 0.0, 0.0, 1.0}},
308 {PIPE_FORMAT_R8G8_SSCALED
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x00, 0x7f), { 0.0, 127.0, 0.0, 1.0}},
309 {PIPE_FORMAT_R8G8_SSCALED
, PACKED_2x8(0xff, 0xff), PACKED_2x8(0x00, 0x80), { 0.0, -128.0, 0.0, 1.0}},
311 {PIPE_FORMAT_R8G8B8_SSCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x00, 0x00), { 0.0, 0.0, 0.0, 1.0}},
312 {PIPE_FORMAT_R8G8B8_SSCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x7f, 0x00, 0x00), { 127.0, 0.0, 0.0, 1.0}},
313 {PIPE_FORMAT_R8G8B8_SSCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x80, 0x00, 0x00), {-128.0, 0.0, 0.0, 1.0}},
314 {PIPE_FORMAT_R8G8B8_SSCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x7f, 0x00), { 0.0, 127.0, 0.0, 1.0}},
315 {PIPE_FORMAT_R8G8B8_SSCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x80, 0x00), { 0.0, -128.0, 0.0, 1.0}},
316 {PIPE_FORMAT_R8G8B8_SSCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x00, 0x7f), { 0.0, 0.0, 127.0, 1.0}},
317 {PIPE_FORMAT_R8G8B8_SSCALED
, PACKED_3x8(0xff, 0xff, 0xff), PACKED_3x8(0x00, 0x00, 0x80), { 0.0, 0.0, -128.0, 1.0}},
319 {PIPE_FORMAT_R8G8B8A8_SSCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x00, 0x00), { 0.0, 0.0, 0.0, 0.0}},
320 {PIPE_FORMAT_R8G8B8A8_SSCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x7f, 0x00, 0x00, 0x00), { 127.0, 0.0, 0.0, 0.0}},
321 {PIPE_FORMAT_R8G8B8A8_SSCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x80, 0x00, 0x00, 0x00), {-128.0, 0.0, 0.0, 0.0}},
322 {PIPE_FORMAT_R8G8B8A8_SSCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x7f, 0x00, 0x00), { 0.0, 127.0, 0.0, 0.0}},
323 {PIPE_FORMAT_R8G8B8A8_SSCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x80, 0x00, 0x00), { 0.0, -128.0, 0.0, 0.0}},
324 {PIPE_FORMAT_R8G8B8A8_SSCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x7f, 0x00), { 0.0, 0.0, 127.0, 0.0}},
325 {PIPE_FORMAT_R8G8B8A8_SSCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x80, 0x00), { 0.0, 0.0, -128.0, 0.0}},
326 {PIPE_FORMAT_R8G8B8A8_SSCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x00, 0x7f), { 0.0, 0.0, 0.0, 127.0}},
327 {PIPE_FORMAT_R8G8B8A8_SSCALED
, PACKED_4x8(0xff, 0xff, 0xff, 0xff), PACKED_4x8(0x00, 0x00, 0x00, 0x80), { 0.0, 0.0, 0.0, -128.0}},
332 test_format_unpack(const struct util_format_test_case
*test
)
338 util_format_unpack_4f(test
->format
, unpacked
, test
->packed
);
341 for (i
= 0; i
< 4; ++i
)
342 if (test
->unpacked
[i
] != unpacked
[i
])
346 printf("FAILED: (%f %f %f %f) obtained\n", unpacked
[0], unpacked
[1], unpacked
[2], unpacked
[3]);
347 printf(" (%f %f %f %f) expected\n", test
->unpacked
[0], test
->unpacked
[1], test
->unpacked
[2], test
->unpacked
[3]);
355 test_format_pack(const struct util_format_test_case
*test
)
357 uint8_t packed
[MAX_PACKED_BYTES
];
361 memset(packed
, 0, sizeof packed
);
363 util_format_pack_4f(test
->format
, packed
, test
->unpacked
[0], test
->unpacked
[1], test
->unpacked
[2], test
->unpacked
[3]);
366 for (i
= 0; i
< MAX_PACKED_BYTES
; ++i
)
367 if ((test
->packed
[i
] & test
->mask
[i
]) != (packed
[i
] & test
->mask
[i
]))
371 printf("FAILED: (%02x %02x %02x %02x) obtained\n", packed
[0], packed
[1], packed
[2], packed
[3]);
372 printf(" (%02x %02x %02x %02x) expected\n", test
->packed
[0], test
->packed
[1], test
->packed
[2], test
->packed
[3]);
382 enum pipe_format last_format
= PIPE_FORMAT_NONE
;
386 for (i
= 0; i
< sizeof(test_cases
)/sizeof(test_cases
[0]); ++i
) {
387 if (test_cases
[i
].format
!= last_format
) {
388 const struct util_format_description
*format_desc
;
389 format_desc
= util_format_description(test_cases
[i
].format
);
390 fprintf(stderr
, "Testing %s ...\n", format_desc
->name
);
391 last_format
= test_cases
[i
].format
;
394 if (!test_format_pack(&test_cases
[i
]))
397 if (!test_format_unpack(&test_cases
[i
]))
405 int main(int argc
, char **argv
)
409 success
= test_all();
411 return success
? 0 : 1;