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