1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009-2010 VMware, Inc.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h>
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <float.h>
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_half.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format_tests.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format_s3tc.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompare_float(float x, float y)
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float error = y - x;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (error < 0.0f)
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      error = -error;
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (error > FLT_EPSILON) {
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprint_packed(const struct util_format_description *format_desc,
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             const char *prefix,
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             const uint8_t *packed,
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             const char *suffix)
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *sep = "";
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", prefix);
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.bits/8; ++i) {
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("%s%02x", sep, packed[i]);
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sep = " ";
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", suffix);
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fflush(stdout);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprint_unpacked_rgba_doubl(const struct util_format_description *format_desc,
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const char *prefix,
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const double unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4],
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const char *suffix)
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *sep = "";
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", prefix);
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         printf("%s{%f, %f, %f, %f}", sep, unpacked[i][j][0], unpacked[i][j][1], unpacked[i][j][2], unpacked[i][j][3]);
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sep = ", ";
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sep = ",\n";
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", suffix);
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fflush(stdout);
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprint_unpacked_rgba_float(const struct util_format_description *format_desc,
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const char *prefix,
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4],
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const char *suffix)
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *sep = "";
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", prefix);
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         printf("%s{%f, %f, %f, %f}", sep, unpacked[i][j][0], unpacked[i][j][1], unpacked[i][j][2], unpacked[i][j][3]);
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sep = ", ";
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sep = ",\n";
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", suffix);
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fflush(stdout);
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprint_unpacked_rgba_8unorm(const struct util_format_description *format_desc,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const char *prefix,
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4],
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const char *suffix)
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *sep = "";
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", prefix);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         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]);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sep = ", ";
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", suffix);
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fflush(stdout);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprint_unpacked_z_float(const struct util_format_description *format_desc,
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const char *prefix,
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH],
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const char *suffix)
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *sep = "";
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", prefix);
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         printf("%s%f", sep, unpacked[i][j]);
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sep = ", ";
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      sep = ",\n";
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", suffix);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fflush(stdout);
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprint_unpacked_z_32unorm(const struct util_format_description *format_desc,
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         const char *prefix,
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         uint32_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH],
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         const char *suffix)
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *sep = "";
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", prefix);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         printf("%s0x%08x", sep, unpacked[i][j]);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sep = ", ";
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", suffix);
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fflush(stdout);
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprint_unpacked_s_8uint(const struct util_format_description *format_desc,
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const char *prefix,
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH],
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const char *suffix)
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *sep = "";
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", prefix);
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         printf("%s0x%02x", sep, unpacked[i][j]);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sep = ", ";
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%s", suffix);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fflush(stdout);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_format_fetch_rgba_float(const struct util_format_description *format_desc,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             const struct util_format_test_case *test)
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j, k;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = TRUE;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         format_desc->fetch_rgba_float(unpacked[i][j], test->packed, j, i);
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (k = 0; k < 4; ++k) {
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (!compare_float(test->unpacked[i][j][k], unpacked[i][j][k])) {
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               success = FALSE;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success) {
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_rgba_float(format_desc, "FAILED: ", unpacked, " obtained\n");
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_rgba_doubl(format_desc, "        ", test->unpacked, " expected\n");
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_format_unpack_rgba_float(const struct util_format_description *format_desc,
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              const struct util_format_test_case *test)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j, k;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format_desc->unpack_rgba_float(&unpacked[0][0][0], sizeof unpacked[0],
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             test->packed, 0,
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             format_desc->block.width, format_desc->block.height);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = TRUE;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (k = 0; k < 4; ++k) {
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (!compare_float(test->unpacked[i][j][k], unpacked[i][j][k])) {
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               success = FALSE;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success) {
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_rgba_float(format_desc, "FAILED: ", unpacked, " obtained\n");
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_rgba_doubl(format_desc, "        ", test->unpacked, " expected\n");
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_format_pack_rgba_float(const struct util_format_description *format_desc,
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const struct util_format_test_case *test)
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4];
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j, k;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (test->format == PIPE_FORMAT_DXT1_RGBA) {
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Skip S3TC as packed representation is not canonical.
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * TODO: Do a round trip conversion.
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(packed, 0, sizeof packed);
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (k = 0; k < 4; ++k) {
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            unpacked[i][j][k] = (float) test->unpacked[i][j][k];
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format_desc->pack_rgba_float(packed, 0,
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           &unpacked[0][0][0], sizeof unpacked[0],
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           format_desc->block.width, format_desc->block.height);
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = TRUE;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.bits/8; ++i) {
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         success = FALSE;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Ignore NaN */
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (util_is_double_nan(test->unpacked[0][0][0]))
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      success = TRUE;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success) {
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_packed(format_desc, "        ", test->packed, " expected\n");
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconvert_float_to_8unorm(uint8_t *dst, const double *src)
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean accurate = TRUE;
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < UTIL_FORMAT_MAX_UNPACKED_HEIGHT*UTIL_FORMAT_MAX_UNPACKED_WIDTH*4; ++i) {
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (src[i] < 0.0) {
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         accurate = FALSE;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst[i] = 0;
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (src[i] > 1.0) {
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         accurate = FALSE;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst[i] = 255;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dst[i] = src[i] * 255.0;
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return accurate;
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_format_unpack_rgba_8unorm(const struct util_format_description *format_desc,
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               const struct util_format_test_case *test)
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j, k;
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format_desc->unpack_rgba_8unorm(&unpacked[0][0][0], sizeof unpacked[0],
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              test->packed, 0,
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              format_desc->block.width, format_desc->block.height);
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   convert_float_to_8unorm(&expected[0][0][0], &test->unpacked[0][0][0]);
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = TRUE;
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (k = 0; k < 4; ++k) {
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (expected[i][j][k] != unpacked[i][j][k]) {
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               success = FALSE;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Ignore NaN */
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (util_is_double_nan(test->unpacked[0][0][0]))
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      success = TRUE;
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success) {
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_rgba_8unorm(format_desc, "FAILED: ", unpacked, " obtained\n");
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_rgba_8unorm(format_desc, "        ", expected, " expected\n");
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_format_pack_rgba_8unorm(const struct util_format_description *format_desc,
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             const struct util_format_test_case *test)
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4];
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (test->format == PIPE_FORMAT_DXT1_RGBA) {
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Skip S3TC as packed representation is not canonical.
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * TODO: Do a round trip conversion.
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!convert_float_to_8unorm(&unpacked[0][0][0], &test->unpacked[0][0][0])) {
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Skip test cases which cannot be represented by four unorm bytes.
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(packed, 0, sizeof packed);
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format_desc->pack_rgba_8unorm(packed, 0,
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            &unpacked[0][0][0], sizeof unpacked[0],
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            format_desc->block.width, format_desc->block.height);
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = TRUE;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.bits/8; ++i)
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         success = FALSE;
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Ignore NaN */
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (util_is_double_nan(test->unpacked[0][0][0]))
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      success = TRUE;
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Ignore failure cases due to unorm8 format */
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (test->unpacked[0][0][0] > 1.0f || test->unpacked[0][0][0] < 0.0f)
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      success = TRUE;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Multiple of 255 */
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((test->unpacked[0][0][0] * 255.0) != (int)(test->unpacked[0][0][0] * 255.0))
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      success = TRUE;
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success) {
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_packed(format_desc, "        ", test->packed, " expected\n");
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_format_unpack_z_float(const struct util_format_description *format_desc,
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              const struct util_format_test_case *test)
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format_desc->unpack_z_float(&unpacked[0][0], sizeof unpacked[0],
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               test->packed, 0,
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               format_desc->block.width, format_desc->block.height);
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = TRUE;
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!compare_float(test->unpacked[i][j][0], unpacked[i][j])) {
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            success = FALSE;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success) {
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_z_float(format_desc, "FAILED: ", unpacked, " obtained\n");
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_rgba_doubl(format_desc, "        ", test->unpacked, " expected\n");
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_format_pack_z_float(const struct util_format_description *format_desc,
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const struct util_format_test_case *test)
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH];
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(packed, 0, sizeof packed);
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unpacked[i][j] = (float) test->unpacked[i][j][0];
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (test->unpacked[i][j][1]) {
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return TRUE;
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format_desc->pack_z_float(packed, 0,
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             &unpacked[0][0], sizeof unpacked[0],
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             format_desc->block.width, format_desc->block.height);
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = TRUE;
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.bits/8; ++i)
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         success = FALSE;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success) {
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_packed(format_desc, "        ", test->packed, " expected\n");
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_format_unpack_z_32unorm(const struct util_format_description *format_desc,
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               const struct util_format_test_case *test)
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format_desc->unpack_z_32unorm(&unpacked[0][0], sizeof unpacked[0],
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 test->packed, 0,
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 format_desc->block.width, format_desc->block.height);
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         expected[i][j] = test->unpacked[i][j][0] * 0xffffffff;
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = TRUE;
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (expected[i][j] != unpacked[i][j]) {
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            success = FALSE;
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success) {
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_z_32unorm(format_desc, "FAILED: ", unpacked, " obtained\n");
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_z_32unorm(format_desc, "        ", expected, " expected\n");
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_format_pack_z_32unorm(const struct util_format_description *format_desc,
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             const struct util_format_test_case *test)
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH];
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unpacked[i][j] = test->unpacked[i][j][0] * 0xffffffff;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (test->unpacked[i][j][1]) {
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return TRUE;
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(packed, 0, sizeof packed);
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format_desc->pack_z_32unorm(packed, 0,
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               &unpacked[0][0], sizeof unpacked[0],
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               format_desc->block.width, format_desc->block.height);
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = TRUE;
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.bits/8; ++i)
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         success = FALSE;
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success) {
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_packed(format_desc, "        ", test->packed, " expected\n");
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_format_unpack_s_8uint(const struct util_format_description *format_desc,
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               const struct util_format_test_case *test)
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } };
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format_desc->unpack_s_8uint(&unpacked[0][0], sizeof unpacked[0],
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  test->packed, 0,
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  format_desc->block.width, format_desc->block.height);
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         expected[i][j] = test->unpacked[i][j][1];
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = TRUE;
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (expected[i][j] != unpacked[i][j]) {
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            success = FALSE;
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success) {
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_s_8uint(format_desc, "FAILED: ", unpacked, " obtained\n");
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_unpacked_s_8uint(format_desc, "        ", expected, " expected\n");
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_format_pack_s_8uint(const struct util_format_description *format_desc,
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             const struct util_format_test_case *test)
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH];
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, j;
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.height; ++i) {
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < format_desc->block.width; ++j) {
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unpacked[i][j] = test->unpacked[i][j][1];
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (test->unpacked[i][j][0]) {
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return TRUE;
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(packed, 0, sizeof packed);
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format_desc->pack_s_8uint(packed, 0,
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                &unpacked[0][0], sizeof unpacked[0],
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                format_desc->block.width, format_desc->block.height);
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = TRUE;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < format_desc->block.bits/8; ++i)
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         success = FALSE;
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!success) {
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_packed(format_desc, "FAILED: ", packed, " obtained\n");
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_packed(format_desc, "        ", test->packed, " expected\n");
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef boolean
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org(*test_func_t)(const struct util_format_description *format_desc,
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               const struct util_format_test_case *test);
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_one_func(const struct util_format_description *format_desc,
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              test_func_t func,
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              const char *suffix)
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success = TRUE;
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("Testing util_format_%s_%s ...\n",
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          format_desc->short_name, suffix);
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fflush(stdout);
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < util_format_nr_test_cases; ++i) {
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const struct util_format_test_case *test = &util_format_test_cases[i];
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (test->format == format_desc->format) {
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!func(format_desc, &util_format_test_cases[i])) {
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           success = FALSE;
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_all(void)
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_format format;
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success = TRUE;
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (format = 1; format < PIPE_FORMAT_COUNT; ++format) {
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const struct util_format_description *format_desc;
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format_desc = util_format_description(format);
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!format_desc) {
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC &&
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          !util_format_s3tc_enabled) {
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#     define TEST_ONE_FUNC(name) \
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (format_desc->name) { \
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!test_one_func(format_desc, &test_format_##name, #name)) { \
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           success = FALSE; \
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } \
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TEST_ONE_FUNC(fetch_rgba_float);
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TEST_ONE_FUNC(pack_rgba_float);
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TEST_ONE_FUNC(unpack_rgba_float);
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TEST_ONE_FUNC(pack_rgba_8unorm);
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TEST_ONE_FUNC(unpack_rgba_8unorm);
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TEST_ONE_FUNC(unpack_z_32unorm);
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TEST_ONE_FUNC(pack_z_32unorm);
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TEST_ONE_FUNC(unpack_z_float);
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TEST_ONE_FUNC(pack_z_float);
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TEST_ONE_FUNC(unpack_s_8uint);
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TEST_ONE_FUNC(pack_s_8uint);
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#     undef TEST_ONE_FUNC
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success;
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint main(int argc, char **argv)
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   util_format_s3tc_init();
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   success = test_all();
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success ? 0 : 1;
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
738