u_format_test.c revision 256b9d99fb704d6c11d6242b7ec40206963f201e
15b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca/**************************************************************************
25b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca *
35b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * Copyright 2009-2010 VMware, Inc.
45b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * All Rights Reserved.
55b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca *
65b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
75b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * copy of this software and associated documentation files (the
85b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * "Software"), to deal in the Software without restriction, including
95b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
105b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
115b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * permit persons to whom the Software is furnished to do so, subject to
125b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * the following conditions:
135b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca *
145b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * The above copyright notice and this permission notice (including the
155b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * next paragraph) shall be included in all copies or substantial portions
165b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * of the Software.
175b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca *
185b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
195b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
215b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
225b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
235b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
245b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
255b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca *
265b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca **************************************************************************/
275b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
285b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
295b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca#include <stdlib.h>
305b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca#include <stdio.h>
31ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca#include <float.h>
325b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
3347e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca#include "util/u_half.h"
345b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca#include "util/u_format.h"
35b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca#include "util/u_format_tests.h"
3647e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca#include "util/u_format_s3tc.h"
37ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca
38ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca
39ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonsecastatic boolean
40ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonsecacompare_float(float x, float y)
41ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca{
42ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca   float error = y - x;
43ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca
44ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca   if (error < 0.0f)
45ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca      error = -error;
46ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca
47ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca   if (error > FLT_EPSILON) {
48ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca      return FALSE;
49ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca   }
50ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca
51ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca   return TRUE;
52ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca}
535b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
545b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
55d0995544923d8b67098627a8a9e7729613377789José Fonsecastatic void
56d0995544923d8b67098627a8a9e7729613377789José Fonsecaprint_packed(const struct util_format_description *format_desc,
57d0995544923d8b67098627a8a9e7729613377789José Fonseca             const char *prefix,
58d0995544923d8b67098627a8a9e7729613377789José Fonseca             const uint8_t *packed,
59d0995544923d8b67098627a8a9e7729613377789José Fonseca             const char *suffix)
6069895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca{
6169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   unsigned i;
62d0995544923d8b67098627a8a9e7729613377789José Fonseca   const char *sep = "";
63d0995544923d8b67098627a8a9e7729613377789José Fonseca
64d0995544923d8b67098627a8a9e7729613377789José Fonseca   printf("%s", prefix);
65d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.bits/8; ++i) {
66d0995544923d8b67098627a8a9e7729613377789José Fonseca      printf("%s%02x", sep, packed[i]);
67d0995544923d8b67098627a8a9e7729613377789José Fonseca      sep = " ";
68d0995544923d8b67098627a8a9e7729613377789José Fonseca   }
69d0995544923d8b67098627a8a9e7729613377789José Fonseca   printf("%s", suffix);
70256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca   fflush(stdout);
71d0995544923d8b67098627a8a9e7729613377789José Fonseca}
72d0995544923d8b67098627a8a9e7729613377789José Fonseca
7369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca
74d0995544923d8b67098627a8a9e7729613377789José Fonsecastatic void
75866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecaprint_unpacked_rgba_doubl(const struct util_format_description *format_desc,
76d0995544923d8b67098627a8a9e7729613377789José Fonseca                     const char *prefix,
77d0995544923d8b67098627a8a9e7729613377789José Fonseca                     const double unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4],
78d0995544923d8b67098627a8a9e7729613377789José Fonseca                     const char *suffix)
79d0995544923d8b67098627a8a9e7729613377789José Fonseca{
80d0995544923d8b67098627a8a9e7729613377789José Fonseca   unsigned i, j;
81d0995544923d8b67098627a8a9e7729613377789José Fonseca   const char *sep = "";
82d0995544923d8b67098627a8a9e7729613377789José Fonseca
83d0995544923d8b67098627a8a9e7729613377789José Fonseca   printf("%s", prefix);
84d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
85d0995544923d8b67098627a8a9e7729613377789José Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
86d0995544923d8b67098627a8a9e7729613377789José Fonseca         printf("%s{%f, %f, %f, %f}", sep, unpacked[i][j][0], unpacked[i][j][1], unpacked[i][j][2], unpacked[i][j][3]);
87d0995544923d8b67098627a8a9e7729613377789José Fonseca         sep = ", ";
88d0995544923d8b67098627a8a9e7729613377789José Fonseca      }
89d0995544923d8b67098627a8a9e7729613377789José Fonseca      sep = ",\n";
9069895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   }
91d0995544923d8b67098627a8a9e7729613377789José Fonseca   printf("%s", suffix);
92256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca   fflush(stdout);
93d0995544923d8b67098627a8a9e7729613377789José Fonseca}
94d0995544923d8b67098627a8a9e7729613377789José Fonseca
95d0995544923d8b67098627a8a9e7729613377789José Fonseca
96d0995544923d8b67098627a8a9e7729613377789José Fonsecastatic void
97866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecaprint_unpacked_rgba_float(const struct util_format_description *format_desc,
98d0995544923d8b67098627a8a9e7729613377789José Fonseca                     const char *prefix,
99efae8f33f2c34666c614d5b00cab618425de6f66José Fonseca                     float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4],
100d0995544923d8b67098627a8a9e7729613377789José Fonseca                     const char *suffix)
101d0995544923d8b67098627a8a9e7729613377789José Fonseca{
102d0995544923d8b67098627a8a9e7729613377789José Fonseca   unsigned i, j;
103d0995544923d8b67098627a8a9e7729613377789José Fonseca   const char *sep = "";
104d0995544923d8b67098627a8a9e7729613377789José Fonseca
105d0995544923d8b67098627a8a9e7729613377789José Fonseca   printf("%s", prefix);
106d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
107d0995544923d8b67098627a8a9e7729613377789José Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
108d0995544923d8b67098627a8a9e7729613377789José Fonseca         printf("%s{%f, %f, %f, %f}", sep, unpacked[i][j][0], unpacked[i][j][1], unpacked[i][j][2], unpacked[i][j][3]);
109d0995544923d8b67098627a8a9e7729613377789José Fonseca         sep = ", ";
110d0995544923d8b67098627a8a9e7729613377789José Fonseca      }
111d0995544923d8b67098627a8a9e7729613377789José Fonseca      sep = ",\n";
112d0995544923d8b67098627a8a9e7729613377789José Fonseca   }
113d0995544923d8b67098627a8a9e7729613377789José Fonseca   printf("%s", suffix);
114256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca   fflush(stdout);
115d0995544923d8b67098627a8a9e7729613377789José Fonseca}
116d0995544923d8b67098627a8a9e7729613377789José Fonseca
117d0995544923d8b67098627a8a9e7729613377789José Fonseca
118d0995544923d8b67098627a8a9e7729613377789José Fonsecastatic void
119866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecaprint_unpacked_rgba_8unorm(const struct util_format_description *format_desc,
120d0995544923d8b67098627a8a9e7729613377789José Fonseca                      const char *prefix,
121efae8f33f2c34666c614d5b00cab618425de6f66José Fonseca                      uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4],
122d0995544923d8b67098627a8a9e7729613377789José Fonseca                      const char *suffix)
123d0995544923d8b67098627a8a9e7729613377789José Fonseca{
124d0995544923d8b67098627a8a9e7729613377789José Fonseca   unsigned i, j;
125d0995544923d8b67098627a8a9e7729613377789José Fonseca   const char *sep = "";
126d0995544923d8b67098627a8a9e7729613377789José Fonseca
127d0995544923d8b67098627a8a9e7729613377789José Fonseca   printf("%s", prefix);
128d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
129d0995544923d8b67098627a8a9e7729613377789José Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
130d0995544923d8b67098627a8a9e7729613377789José Fonseca         printf("%s{0x%02x, 0x%02x, 0x%02x, 0x%02x}", sep, unpacked[i][j][0], unpacked[i][j][1], unpacked[i][j][2], unpacked[i][j][3]);
131d0995544923d8b67098627a8a9e7729613377789José Fonseca         sep = ", ";
132d0995544923d8b67098627a8a9e7729613377789José Fonseca      }
133d0995544923d8b67098627a8a9e7729613377789José Fonseca   }
134d0995544923d8b67098627a8a9e7729613377789José Fonseca   printf("%s", suffix);
135256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca   fflush(stdout);
136d0995544923d8b67098627a8a9e7729613377789José Fonseca}
13769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca
138d0995544923d8b67098627a8a9e7729613377789José Fonseca
139866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic void
140866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecaprint_unpacked_z_float(const struct util_format_description *format_desc,
141866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                       const char *prefix,
142866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                       float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH],
143866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                       const char *suffix)
144866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
145866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
146866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   const char *sep = "";
147866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
148866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   printf("%s", prefix);
149866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
150866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
151866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         printf("%s%f", sep, unpacked[i][j]);
152866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         sep = ", ";
153866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
154866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      sep = ",\n";
155866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
156866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   printf("%s", suffix);
157256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca   fflush(stdout);
158866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
159866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
160866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
161866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic void
162866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecaprint_unpacked_z_32unorm(const struct util_format_description *format_desc,
163866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                         const char *prefix,
164866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                         uint32_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH],
165866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                         const char *suffix)
166866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
167866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
168866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   const char *sep = "";
169866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
170866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   printf("%s", prefix);
171866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
172866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
173866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         printf("%s0x%08x", sep, unpacked[i][j]);
174866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         sep = ", ";
175866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
176866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
177866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   printf("%s", suffix);
178256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca   fflush(stdout);
179866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
180866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
181866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
182866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic void
183866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecaprint_unpacked_s_8uscaled(const struct util_format_description *format_desc,
184866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                          const char *prefix,
185866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                          uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH],
186866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                          const char *suffix)
187866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
188866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
189866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   const char *sep = "";
190866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
191866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   printf("%s", prefix);
192866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
193866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
194866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         printf("%s0x%02x", sep, unpacked[i][j]);
195866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         sep = ", ";
196866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
197866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
198866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   printf("%s", suffix);
199256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca   fflush(stdout);
200866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
201866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
202866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
203d0995544923d8b67098627a8a9e7729613377789José Fonsecastatic boolean
204d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_fetch_rgba_float(const struct util_format_description *format_desc,
205d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                             const struct util_format_test_case *test)
206d0995544923d8b67098627a8a9e7729613377789José Fonseca{
207c87e6e50ee02c8cda11d14a0ea242bb19e77300fVinson Lee   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
208d0995544923d8b67098627a8a9e7729613377789José Fonseca   unsigned i, j, k;
209d0995544923d8b67098627a8a9e7729613377789José Fonseca   boolean success;
21069895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca
21169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   success = TRUE;
212d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
213d0995544923d8b67098627a8a9e7729613377789José Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
214d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca         format_desc->fetch_rgba_float(unpacked[i][j], test->packed, j, i);
215d0995544923d8b67098627a8a9e7729613377789José Fonseca         for (k = 0; k < 4; ++k) {
216ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca            if (!compare_float(test->unpacked[i][j][k], unpacked[i][j][k])) {
217d0995544923d8b67098627a8a9e7729613377789José Fonseca               success = FALSE;
218d0995544923d8b67098627a8a9e7729613377789José Fonseca            }
219d0995544923d8b67098627a8a9e7729613377789José Fonseca         }
220d0995544923d8b67098627a8a9e7729613377789José Fonseca      }
221d0995544923d8b67098627a8a9e7729613377789José Fonseca   }
22269895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca
22369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   if (!success) {
224866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_rgba_float(format_desc, "FAILED: ", unpacked, " obtained\n");
225866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_rgba_doubl(format_desc, "        ", test->unpacked, " expected\n");
22669895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   }
22769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca
22869895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   return success;
22969895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca}
23069895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca
23169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca
23269895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonsecastatic boolean
233d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_unpack_rgba_float(const struct util_format_description *format_desc,
234d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                              const struct util_format_test_case *test)
2355b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca{
236c87e6e50ee02c8cda11d14a0ea242bb19e77300fVinson Lee   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
237d0995544923d8b67098627a8a9e7729613377789José Fonseca   unsigned i, j, k;
2385b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   boolean success;
2395b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
240d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   format_desc->unpack_rgba_float(&unpacked[0][0][0], sizeof unpacked[0],
2417f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                             test->packed, 0,
2427f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                             format_desc->block.width, format_desc->block.height);
2435b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
2445b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   success = TRUE;
245d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
246d0995544923d8b67098627a8a9e7729613377789José Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
247d0995544923d8b67098627a8a9e7729613377789José Fonseca         for (k = 0; k < 4; ++k) {
248ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca            if (!compare_float(test->unpacked[i][j][k], unpacked[i][j][k])) {
249d0995544923d8b67098627a8a9e7729613377789José Fonseca               success = FALSE;
250d0995544923d8b67098627a8a9e7729613377789José Fonseca            }
251d0995544923d8b67098627a8a9e7729613377789José Fonseca         }
252d0995544923d8b67098627a8a9e7729613377789José Fonseca      }
253d0995544923d8b67098627a8a9e7729613377789José Fonseca   }
2545b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
2555b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   if (!success) {
256866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_rgba_float(format_desc, "FAILED: ", unpacked, " obtained\n");
257866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_rgba_doubl(format_desc, "        ", test->unpacked, " expected\n");
2585b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   }
2595b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
2605b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   return success;
2615b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca}
2625b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
2635b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
2645b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonsecastatic boolean
265d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_pack_rgba_float(const struct util_format_description *format_desc,
266d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                            const struct util_format_test_case *test)
2675b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca{
268d0995544923d8b67098627a8a9e7729613377789José Fonseca   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4];
269b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
270d0995544923d8b67098627a8a9e7729613377789José Fonseca   unsigned i, j, k;
2715b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   boolean success;
2725b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
27308eb07bc83c9ba81ad5b497b8991d1069e17f4d7José Fonseca   if (test->format == PIPE_FORMAT_DXT1_RGBA) {
2748548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca      /*
2758548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       * Skip S3TC as packed representation is not canonical.
2768548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       *
2778548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       * TODO: Do a round trip conversion.
2788548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       */
2798548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca      return TRUE;
2808548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca   }
2818548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca
2825b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   memset(packed, 0, sizeof packed);
283d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
284d0995544923d8b67098627a8a9e7729613377789José Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
285d0995544923d8b67098627a8a9e7729613377789José Fonseca         for (k = 0; k < 4; ++k) {
286d0995544923d8b67098627a8a9e7729613377789José Fonseca            unpacked[i][j][k] = (float) test->unpacked[i][j][k];
287d0995544923d8b67098627a8a9e7729613377789José Fonseca         }
288d0995544923d8b67098627a8a9e7729613377789José Fonseca      }
289d0995544923d8b67098627a8a9e7729613377789José Fonseca   }
2905b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
291d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   format_desc->pack_rgba_float(packed, 0,
2927f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                           &unpacked[0][0][0], sizeof unpacked[0],
2937f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                           format_desc->block.width, format_desc->block.height);
2945b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
2955b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   success = TRUE;
296d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.bits/8; ++i)
2975b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
2985b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca         success = FALSE;
2995b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
3005b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   if (!success) {
301d0995544923d8b67098627a8a9e7729613377789José Fonseca      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
302d0995544923d8b67098627a8a9e7729613377789José Fonseca      print_packed(format_desc, "        ", test->packed, " expected\n");
3035b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   }
3045b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
3055b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   return success;
3065b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca}
3075b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
3085b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
3096718f0325827b1d2dde47a48332c6c0471048abeJosé Fonsecastatic boolean
31096bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonsecaconvert_float_to_8unorm(uint8_t *dst, const double *src)
311be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{
312be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   unsigned i;
3136718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca   boolean accurate = TRUE;
3146718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca
315d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < UTIL_FORMAT_MAX_UNPACKED_HEIGHT*UTIL_FORMAT_MAX_UNPACKED_WIDTH*4; ++i) {
3166718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      if (src[i] < 0.0) {
3176718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca         accurate = FALSE;
3186718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca         dst[i] = 0;
3196718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      }
3206718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      else if (src[i] > 1.0) {
3216718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca         accurate = FALSE;
3226718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca         dst[i] = 255;
3236718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      }
3246718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      else {
3256718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca         dst[i] = src[i] * 255.0;
3266718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      }
3276718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca   }
328be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
3296718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca   return accurate;
330be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca}
331be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
332be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
3335b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonsecastatic boolean
334d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_unpack_rgba_8unorm(const struct util_format_description *format_desc,
335d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                               const struct util_format_test_case *test)
336be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{
337c87e6e50ee02c8cda11d14a0ea242bb19e77300fVinson Lee   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
338c87e6e50ee02c8cda11d14a0ea242bb19e77300fVinson Lee   uint8_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
339d0995544923d8b67098627a8a9e7729613377789José Fonseca   unsigned i, j, k;
340be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   boolean success;
341be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
342d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   format_desc->unpack_rgba_8unorm(&unpacked[0][0][0], sizeof unpacked[0],
3437f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                              test->packed, 0,
3447f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                              format_desc->block.width, format_desc->block.height);
345be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
346d0995544923d8b67098627a8a9e7729613377789José Fonseca   convert_float_to_8unorm(&expected[0][0][0], &test->unpacked[0][0][0]);
347be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
348be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   success = TRUE;
349d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
350d0995544923d8b67098627a8a9e7729613377789José Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
351d0995544923d8b67098627a8a9e7729613377789José Fonseca         for (k = 0; k < 4; ++k) {
352d0995544923d8b67098627a8a9e7729613377789José Fonseca            if (expected[i][j][k] != unpacked[i][j][k]) {
353d0995544923d8b67098627a8a9e7729613377789José Fonseca               success = FALSE;
354d0995544923d8b67098627a8a9e7729613377789José Fonseca            }
355d0995544923d8b67098627a8a9e7729613377789José Fonseca         }
356d0995544923d8b67098627a8a9e7729613377789José Fonseca      }
357d0995544923d8b67098627a8a9e7729613377789José Fonseca   }
358be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
359be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   if (!success) {
360866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_rgba_8unorm(format_desc, "FAILED: ", unpacked, " obtained\n");
361866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_rgba_8unorm(format_desc, "        ", expected, " expected\n");
362be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   }
363be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
364be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   return success;
365be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca}
366be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
367be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
368be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecastatic boolean
369d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_pack_rgba_8unorm(const struct util_format_description *format_desc,
370d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                             const struct util_format_test_case *test)
371be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{
372d0995544923d8b67098627a8a9e7729613377789José Fonseca   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4];
373b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
374be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   unsigned i;
375be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   boolean success;
376be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
37708eb07bc83c9ba81ad5b497b8991d1069e17f4d7José Fonseca   if (test->format == PIPE_FORMAT_DXT1_RGBA) {
3788548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca      /*
3798548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       * Skip S3TC as packed representation is not canonical.
3808548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       *
3818548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       * TODO: Do a round trip conversion.
3828548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       */
3838548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca      return TRUE;
3848548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca   }
3858548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca
386d0995544923d8b67098627a8a9e7729613377789José Fonseca   if (!convert_float_to_8unorm(&unpacked[0][0][0], &test->unpacked[0][0][0])) {
3876718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      /*
3886718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca       * Skip test cases which cannot be represented by four unorm bytes.
3896718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca       */
3906718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      return TRUE;
3916718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca   }
392be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
393be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   memset(packed, 0, sizeof packed);
394be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
395d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   format_desc->pack_rgba_8unorm(packed, 0,
3967f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                            &unpacked[0][0][0], sizeof unpacked[0],
3977f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                            format_desc->block.width, format_desc->block.height);
398be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
399be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   success = TRUE;
400d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.bits/8; ++i)
401be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
402be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca         success = FALSE;
403be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
404be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   if (!success) {
405d0995544923d8b67098627a8a9e7729613377789José Fonseca      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
406d0995544923d8b67098627a8a9e7729613377789José Fonseca      print_packed(format_desc, "        ", test->packed, " expected\n");
407be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   }
408be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
409be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   return success;
410be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca}
411be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
412be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
413866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
414866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_unpack_z_float(const struct util_format_description *format_desc,
415866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                              const struct util_format_test_case *test)
416866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
417866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
418866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
419866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
420866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
421866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   format_desc->unpack_z_float(&unpacked[0][0], sizeof unpacked[0],
422866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               test->packed, 0,
423866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               format_desc->block.width, format_desc->block.height);
424866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
425866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
426866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
427866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
428866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (!compare_float(test->unpacked[i][j][0], unpacked[i][j])) {
429866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            success = FALSE;
430866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
431866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
432866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
433866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
434866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
435866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_z_float(format_desc, "FAILED: ", unpacked, " obtained\n");
436866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_rgba_doubl(format_desc, "        ", test->unpacked, " expected\n");
437866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
438866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
439866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
440866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
441866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
442866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
443866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
444866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_pack_z_float(const struct util_format_description *format_desc,
445866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                            const struct util_format_test_case *test)
446866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
447866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH];
448866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
449866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
450866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
451866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
452866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   memset(packed, 0, sizeof packed);
453866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
454866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
455866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         unpacked[i][j] = (float) test->unpacked[i][j][0];
456866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (test->unpacked[i][j][1]) {
457866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            return TRUE;
458866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
459866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
460866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
461866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
462866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   format_desc->pack_z_float(packed, 0,
463866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                             &unpacked[0][0], sizeof unpacked[0],
464866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                             format_desc->block.width, format_desc->block.height);
465866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
466866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
467866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.bits/8; ++i)
468866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
469866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         success = FALSE;
470866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
471866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
472866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
473866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "        ", test->packed, " expected\n");
474866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
475866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
476866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
477866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
478866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
479866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
480866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
481866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_unpack_z_32unorm(const struct util_format_description *format_desc,
482866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               const struct util_format_test_case *test)
483866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
484866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint32_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
485866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint32_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
486866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
487866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
488866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
489866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   format_desc->unpack_z_32unorm(&unpacked[0][0], sizeof unpacked[0],
490866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                 test->packed, 0,
491866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                 format_desc->block.width, format_desc->block.height);
492866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
493866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
494866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
495866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         expected[i][j] = test->unpacked[i][j][0] * 0xffffffff;
496866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
497866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
498866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
499866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
500866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
501866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
502866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (expected[i][j] != unpacked[i][j]) {
503866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            success = FALSE;
504866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
505866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
506866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
507866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
508866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
509866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_z_32unorm(format_desc, "FAILED: ", unpacked, " obtained\n");
510866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_z_32unorm(format_desc, "        ", expected, " expected\n");
511866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
512866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
513866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
514866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
515866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
516866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
517866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
518866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_pack_z_32unorm(const struct util_format_description *format_desc,
519866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                             const struct util_format_test_case *test)
520866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
521866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint32_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH];
522866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
523866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
524866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
525866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
526866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
527866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
528866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         unpacked[i][j] = test->unpacked[i][j][0] * 0xffffffff;
529866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (test->unpacked[i][j][1]) {
530866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            return TRUE;
531866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
532866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
533866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
534866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
535866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   memset(packed, 0, sizeof packed);
536866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
537866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   format_desc->pack_z_32unorm(packed, 0,
538866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               &unpacked[0][0], sizeof unpacked[0],
539866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               format_desc->block.width, format_desc->block.height);
540866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
541866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
542866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.bits/8; ++i)
543866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
544866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         success = FALSE;
545866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
546866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
547866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
548866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "        ", test->packed, " expected\n");
549866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
550866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
551866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
552866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
553866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
554866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
555866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
556866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_unpack_s_8uscaled(const struct util_format_description *format_desc,
557866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               const struct util_format_test_case *test)
558866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
559866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
560866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
561866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
562866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
563866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
564866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   format_desc->unpack_s_8uscaled(&unpacked[0][0], sizeof unpacked[0],
565866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                  test->packed, 0,
566866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                  format_desc->block.width, format_desc->block.height);
567866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
568866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
569866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
570866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         expected[i][j] = test->unpacked[i][j][1];
571866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
572866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
573866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
574866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
575866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
576866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
577866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (expected[i][j] != unpacked[i][j]) {
578866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            success = FALSE;
579866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
580866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
581866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
582866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
583866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
584866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_s_8uscaled(format_desc, "FAILED: ", unpacked, " obtained\n");
585866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_s_8uscaled(format_desc, "        ", expected, " expected\n");
586866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
587866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
588866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
589866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
590866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
591866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
592866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
593866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_pack_s_8uscaled(const struct util_format_description *format_desc,
594866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                             const struct util_format_test_case *test)
595866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
596866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH];
597866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
598866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
599866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
600866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
601866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
602866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
603866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         unpacked[i][j] = test->unpacked[i][j][1];
604866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (test->unpacked[i][j][0]) {
605866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            return TRUE;
606866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
607866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
608866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
609866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
610866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   memset(packed, 0, sizeof packed);
611866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
612866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   format_desc->pack_s_8uscaled(packed, 0,
613866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                &unpacked[0][0], sizeof unpacked[0],
614866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                format_desc->block.width, format_desc->block.height);
615866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
616866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
617866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.bits/8; ++i)
618866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
619866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         success = FALSE;
620866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
621866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
622866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
623866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "        ", test->packed, " expected\n");
624866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
625866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
626866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
627866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
628866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
629866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
630be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecatypedef boolean
63196bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca(*test_func_t)(const struct util_format_description *format_desc,
63296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca               const struct util_format_test_case *test);
633be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
634be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
635be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecastatic boolean
636b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonsecatest_one_func(const struct util_format_description *format_desc,
637b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca              test_func_t func,
638b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca              const char *suffix)
6395b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca{
6405b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   unsigned i;
6415b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   bool success = TRUE;
6425b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
643b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca   printf("Testing util_format_%s_%s ...\n",
644b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca          format_desc->short_name, suffix);
645256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca   fflush(stdout);
646b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca
647b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca   for (i = 0; i < util_format_nr_test_cases; ++i) {
648b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca      const struct util_format_test_case *test = &util_format_test_cases[i];
6495b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
650b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      if (test->format == format_desc->format) {
651ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca         if (!func(format_desc, &util_format_test_cases[i])) {
652ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca           success = FALSE;
653ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca         }
654ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca      }
6555b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   }
6565b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
6575b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   return success;
6585b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca}
6595b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
6605b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
661be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecastatic boolean
662be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecatest_all(void)
663be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{
664b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca   enum pipe_format format;
665be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   bool success = TRUE;
666be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
667b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca   for (format = 1; format < PIPE_FORMAT_COUNT; ++format) {
668b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      const struct util_format_description *format_desc;
669b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca
670b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      format_desc = util_format_description(format);
671b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      if (!format_desc) {
672b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca         continue;
673b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      }
67469895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca
675b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC &&
676b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca          !util_format_s3tc_enabled) {
677b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca         continue;
678b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      }
679be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
680b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca#     define TEST_ONE_FUNC(name) \
681b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      if (format_desc->name) { \
682b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca         if (!test_one_func(format_desc, &test_format_##name, #name)) { \
683b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca           success = FALSE; \
684b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca         } \
685b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      }
686be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
687b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      TEST_ONE_FUNC(fetch_rgba_float);
688b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      TEST_ONE_FUNC(pack_rgba_float);
689b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      TEST_ONE_FUNC(unpack_rgba_float);
690b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      TEST_ONE_FUNC(pack_rgba_8unorm);
691b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      TEST_ONE_FUNC(unpack_rgba_8unorm);
692be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
693866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      TEST_ONE_FUNC(unpack_z_32unorm);
694866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      TEST_ONE_FUNC(pack_z_32unorm);
695866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      TEST_ONE_FUNC(unpack_z_float);
696866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      TEST_ONE_FUNC(pack_z_float);
697866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      TEST_ONE_FUNC(unpack_s_8uscaled);
698866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      TEST_ONE_FUNC(pack_s_8uscaled);
699866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
700b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca#     undef TEST_ONE_FUNC
701b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca   }
702be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
703be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   return success;
704be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca}
705be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
706be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
7075b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonsecaint main(int argc, char **argv)
7085b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca{
7095b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   boolean success;
7105b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
71147e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca   util_format_s3tc_init();
71247e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca
7135b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   success = test_all();
7145b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
7155b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   return success ? 0 : 1;
7165b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca}
717