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
183866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlieprint_unpacked_s_8uint(const struct util_format_description *format_desc,
184866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                       const char *prefix,
185866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                       uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH],
186866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                       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;
296c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   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;
299c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   }
300c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton
301c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   /* Ignore NaN */
302c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   if (util_is_double_nan(test->unpacked[0][0][0]))
303c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton      success = TRUE;
3045b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
3055b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   if (!success) {
306d0995544923d8b67098627a8a9e7729613377789José Fonseca      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
307d0995544923d8b67098627a8a9e7729613377789José Fonseca      print_packed(format_desc, "        ", test->packed, " expected\n");
3085b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   }
3095b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
3105b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   return success;
3115b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca}
3125b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
3135b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
3146718f0325827b1d2dde47a48332c6c0471048abeJosé Fonsecastatic boolean
31596bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonsecaconvert_float_to_8unorm(uint8_t *dst, const double *src)
316be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{
317be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   unsigned i;
3186718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca   boolean accurate = TRUE;
3196718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca
320d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < UTIL_FORMAT_MAX_UNPACKED_HEIGHT*UTIL_FORMAT_MAX_UNPACKED_WIDTH*4; ++i) {
3216718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      if (src[i] < 0.0) {
3226718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca         accurate = FALSE;
3236718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca         dst[i] = 0;
3246718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      }
3256718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      else if (src[i] > 1.0) {
3266718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca         accurate = FALSE;
3276718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca         dst[i] = 255;
3286718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      }
3296718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      else {
3306718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca         dst[i] = src[i] * 255.0;
3316718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      }
3326718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca   }
333be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
3346718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca   return accurate;
335be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca}
336be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
337be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
3385b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonsecastatic boolean
339d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_unpack_rgba_8unorm(const struct util_format_description *format_desc,
340d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                               const struct util_format_test_case *test)
341be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{
342c87e6e50ee02c8cda11d14a0ea242bb19e77300fVinson Lee   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
343c87e6e50ee02c8cda11d14a0ea242bb19e77300fVinson Lee   uint8_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
344d0995544923d8b67098627a8a9e7729613377789José Fonseca   unsigned i, j, k;
345be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   boolean success;
346be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
347d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   format_desc->unpack_rgba_8unorm(&unpacked[0][0][0], sizeof unpacked[0],
3487f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                              test->packed, 0,
3497f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                              format_desc->block.width, format_desc->block.height);
350be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
351d0995544923d8b67098627a8a9e7729613377789José Fonseca   convert_float_to_8unorm(&expected[0][0][0], &test->unpacked[0][0][0]);
352be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
353be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   success = TRUE;
354d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
355d0995544923d8b67098627a8a9e7729613377789José Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
356d0995544923d8b67098627a8a9e7729613377789José Fonseca         for (k = 0; k < 4; ++k) {
357d0995544923d8b67098627a8a9e7729613377789José Fonseca            if (expected[i][j][k] != unpacked[i][j][k]) {
358d0995544923d8b67098627a8a9e7729613377789José Fonseca               success = FALSE;
359d0995544923d8b67098627a8a9e7729613377789José Fonseca            }
360d0995544923d8b67098627a8a9e7729613377789José Fonseca         }
361d0995544923d8b67098627a8a9e7729613377789José Fonseca      }
362d0995544923d8b67098627a8a9e7729613377789José Fonseca   }
363be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
364c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   /* Ignore NaN */
365c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   if (util_is_double_nan(test->unpacked[0][0][0]))
366c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton      success = TRUE;
367c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton
368be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   if (!success) {
369866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_rgba_8unorm(format_desc, "FAILED: ", unpacked, " obtained\n");
370866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_rgba_8unorm(format_desc, "        ", expected, " expected\n");
371be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   }
372be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
373be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   return success;
374be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca}
375be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
376be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
377be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecastatic boolean
378d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_pack_rgba_8unorm(const struct util_format_description *format_desc,
379d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                             const struct util_format_test_case *test)
380be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{
381d0995544923d8b67098627a8a9e7729613377789José Fonseca   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4];
382b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
383be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   unsigned i;
384be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   boolean success;
385be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
38608eb07bc83c9ba81ad5b497b8991d1069e17f4d7José Fonseca   if (test->format == PIPE_FORMAT_DXT1_RGBA) {
3878548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca      /*
3888548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       * Skip S3TC as packed representation is not canonical.
3898548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       *
3908548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       * TODO: Do a round trip conversion.
3918548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca       */
3928548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca      return TRUE;
3938548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca   }
3948548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca
395d0995544923d8b67098627a8a9e7729613377789José Fonseca   if (!convert_float_to_8unorm(&unpacked[0][0][0], &test->unpacked[0][0][0])) {
3966718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      /*
3976718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca       * Skip test cases which cannot be represented by four unorm bytes.
3986718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca       */
3996718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca      return TRUE;
4006718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca   }
401be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
402be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   memset(packed, 0, sizeof packed);
403be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
404d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   format_desc->pack_rgba_8unorm(packed, 0,
4057f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                            &unpacked[0][0][0], sizeof unpacked[0],
4067f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca                            format_desc->block.width, format_desc->block.height);
407be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
408be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   success = TRUE;
409d0995544923d8b67098627a8a9e7729613377789José Fonseca   for (i = 0; i < format_desc->block.bits/8; ++i)
410be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
411be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca         success = FALSE;
412be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
413c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   /* Ignore NaN */
414c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   if (util_is_double_nan(test->unpacked[0][0][0]))
415c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton      success = TRUE;
416c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton
417c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   /* Ignore failure cases due to unorm8 format */
418c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   if (test->unpacked[0][0][0] > 1.0f || test->unpacked[0][0][0] < 0.0f)
419c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton      success = TRUE;
420c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton
421c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   /* Multiple of 255 */
422c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton   if ((test->unpacked[0][0][0] * 255.0) != (int)(test->unpacked[0][0][0] * 255.0))
423c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton      success = TRUE;
424c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton
425be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   if (!success) {
426d0995544923d8b67098627a8a9e7729613377789José Fonseca      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
427d0995544923d8b67098627a8a9e7729613377789José Fonseca      print_packed(format_desc, "        ", test->packed, " expected\n");
428be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   }
429be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
430be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   return success;
431be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca}
432be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
433be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
434866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
435866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_unpack_z_float(const struct util_format_description *format_desc,
436866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                              const struct util_format_test_case *test)
437866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
438866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
439866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
440866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
441866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
442866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   format_desc->unpack_z_float(&unpacked[0][0], sizeof unpacked[0],
443866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               test->packed, 0,
444866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               format_desc->block.width, format_desc->block.height);
445866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
446866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
447866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
448866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
449866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (!compare_float(test->unpacked[i][j][0], unpacked[i][j])) {
450866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            success = FALSE;
451866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
452866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
453866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
454866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
455866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
456866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_z_float(format_desc, "FAILED: ", unpacked, " obtained\n");
457866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_rgba_doubl(format_desc, "        ", test->unpacked, " expected\n");
458866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
459866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
460866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
461866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
462866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
463866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
464866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
465866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_pack_z_float(const struct util_format_description *format_desc,
466866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                            const struct util_format_test_case *test)
467866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
468866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH];
469866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
470866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
471866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
472866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
473866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   memset(packed, 0, sizeof packed);
474866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
475866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
476866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         unpacked[i][j] = (float) test->unpacked[i][j][0];
477866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (test->unpacked[i][j][1]) {
478866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            return TRUE;
479866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
480866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
481866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
482866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
483866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   format_desc->pack_z_float(packed, 0,
484866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                             &unpacked[0][0], sizeof unpacked[0],
485866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                             format_desc->block.width, format_desc->block.height);
486866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
487866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
488866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.bits/8; ++i)
489866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
490866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         success = FALSE;
491866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
492866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
493866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
494866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "        ", test->packed, " expected\n");
495866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
496866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
497866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
498866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
499866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
500866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
501866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
502866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_unpack_z_32unorm(const struct util_format_description *format_desc,
503866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               const struct util_format_test_case *test)
504866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
505866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint32_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
506866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint32_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
507866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
508866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
509866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
510866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   format_desc->unpack_z_32unorm(&unpacked[0][0], sizeof unpacked[0],
511866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                 test->packed, 0,
512866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                 format_desc->block.width, format_desc->block.height);
513866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
514866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
515866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
516866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         expected[i][j] = test->unpacked[i][j][0] * 0xffffffff;
517866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
518866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
519866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
520866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
521866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
522866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
523866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (expected[i][j] != unpacked[i][j]) {
524866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            success = FALSE;
525866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
526866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
527866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
528866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
529866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
530866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_z_32unorm(format_desc, "FAILED: ", unpacked, " obtained\n");
531866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_unpacked_z_32unorm(format_desc, "        ", expected, " expected\n");
532866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
533866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
534866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
535866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
536866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
537866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
538866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
539866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_pack_z_32unorm(const struct util_format_description *format_desc,
540866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                             const struct util_format_test_case *test)
541866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
542866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint32_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH];
543866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
544866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
545866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
546866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
547866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
548866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
549866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         unpacked[i][j] = test->unpacked[i][j][0] * 0xffffffff;
550866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (test->unpacked[i][j][1]) {
551866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            return TRUE;
552866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
553866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
554866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
555866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
556866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   memset(packed, 0, sizeof packed);
557866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
558866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   format_desc->pack_z_32unorm(packed, 0,
559866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               &unpacked[0][0], sizeof unpacked[0],
560866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               format_desc->block.width, format_desc->block.height);
561866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
562866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
563866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.bits/8; ++i)
564866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
565866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         success = FALSE;
566866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
567866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
568866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
569866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "        ", test->packed, " expected\n");
570866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
571866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
572866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
573866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
574866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
575866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
576866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
577866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlietest_format_unpack_s_8uint(const struct util_format_description *format_desc,
578866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                               const struct util_format_test_case *test)
579866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
580866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
581866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
582866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
583866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
584866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
585866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie   format_desc->unpack_s_8uint(&unpacked[0][0], sizeof unpacked[0],
586866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                  test->packed, 0,
587866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                  format_desc->block.width, format_desc->block.height);
588866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
589866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
590866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
591866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         expected[i][j] = test->unpacked[i][j][1];
592866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
593866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
594866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
595866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
596866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
597866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
598866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (expected[i][j] != unpacked[i][j]) {
599866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            success = FALSE;
600866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
601866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
602866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
603866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
604866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
605866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie      print_unpacked_s_8uint(format_desc, "FAILED: ", unpacked, " obtained\n");
606866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie      print_unpacked_s_8uint(format_desc, "        ", expected, " expected\n");
607866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
608866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
609866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
610866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
611866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
612866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
613866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean
614866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlietest_format_pack_s_8uint(const struct util_format_description *format_desc,
615866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                             const struct util_format_test_case *test)
616866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{
617866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH];
618866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
619866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   unsigned i, j;
620866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   boolean success;
621866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
622866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.height; ++i) {
623866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      for (j = 0; j < format_desc->block.width; ++j) {
624866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         unpacked[i][j] = test->unpacked[i][j][1];
625866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         if (test->unpacked[i][j][0]) {
626866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca            return TRUE;
627866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         }
628866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      }
629866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
630866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
631866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   memset(packed, 0, sizeof packed);
632866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
633866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie   format_desc->pack_s_8uint(packed, 0,
634866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                &unpacked[0][0], sizeof unpacked[0],
635866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                                format_desc->block.width, format_desc->block.height);
636866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
637866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   success = TRUE;
638866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   for (i = 0; i < format_desc->block.bits/8; ++i)
639866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
640866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca         success = FALSE;
641866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
642866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   if (!success) {
643866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
644866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      print_packed(format_desc, "        ", test->packed, " expected\n");
645866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   }
646866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
647866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   return success;
648866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca}
649866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
650866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
651be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecatypedef boolean
65296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca(*test_func_t)(const struct util_format_description *format_desc,
65396bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca               const struct util_format_test_case *test);
654be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
655be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
656be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecastatic boolean
657b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonsecatest_one_func(const struct util_format_description *format_desc,
658b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca              test_func_t func,
659b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca              const char *suffix)
6605b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca{
6615b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   unsigned i;
6625f2deba9f3f3f9230a9fdd2848e20c1e23e98b8fBrian Paul   boolean success = TRUE;
6635b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
664b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca   printf("Testing util_format_%s_%s ...\n",
665b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca          format_desc->short_name, suffix);
666256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca   fflush(stdout);
667b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca
668b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca   for (i = 0; i < util_format_nr_test_cases; ++i) {
669b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca      const struct util_format_test_case *test = &util_format_test_cases[i];
6705b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
671b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      if (test->format == format_desc->format) {
672ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca         if (!func(format_desc, &util_format_test_cases[i])) {
673ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca           success = FALSE;
674ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca         }
675ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca      }
6765b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   }
6775b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
6785b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   return success;
6795b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca}
6805b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
6815b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
682be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecastatic boolean
683be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecatest_all(void)
684be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{
685b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca   enum pipe_format format;
6865f2deba9f3f3f9230a9fdd2848e20c1e23e98b8fBrian Paul   boolean success = TRUE;
687be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
688b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca   for (format = 1; format < PIPE_FORMAT_COUNT; ++format) {
689b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      const struct util_format_description *format_desc;
690b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca
691b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      format_desc = util_format_description(format);
692b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      if (!format_desc) {
693b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca         continue;
694b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      }
69569895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca
696b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC &&
697b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca          !util_format_s3tc_enabled) {
698b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca         continue;
699b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      }
700be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
701b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca#     define TEST_ONE_FUNC(name) \
702b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      if (format_desc->name) { \
703b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca         if (!test_one_func(format_desc, &test_format_##name, #name)) { \
704b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca           success = FALSE; \
705b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca         } \
706b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      }
707be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
708b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      TEST_ONE_FUNC(fetch_rgba_float);
709b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      TEST_ONE_FUNC(pack_rgba_float);
710b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      TEST_ONE_FUNC(unpack_rgba_float);
711b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      TEST_ONE_FUNC(pack_rgba_8unorm);
712b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca      TEST_ONE_FUNC(unpack_rgba_8unorm);
713be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
714866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      TEST_ONE_FUNC(unpack_z_32unorm);
715866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      TEST_ONE_FUNC(pack_z_32unorm);
716866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      TEST_ONE_FUNC(unpack_z_float);
717866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca      TEST_ONE_FUNC(pack_z_float);
718866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie      TEST_ONE_FUNC(unpack_s_8uint);
719866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie      TEST_ONE_FUNC(pack_s_8uint);
720866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca
721b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca#     undef TEST_ONE_FUNC
722b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca   }
723be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
724be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca   return success;
725be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca}
726be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
727be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca
7285b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonsecaint main(int argc, char **argv)
7295b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca{
7305b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   boolean success;
7315b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
73247e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca   util_format_s3tc_init();
73347e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca
7345b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   success = test_all();
7355b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca
7365b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca   return success ? 0 : 1;
7375b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca}
738