15b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca/************************************************************************** 25b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * 35b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * Copyright 2009-2010 VMware, Inc. 45b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * All Rights Reserved. 55b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * 65b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 75b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * copy of this software and associated documentation files (the 85b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * "Software"), to deal in the Software without restriction, including 95b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 105b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 115b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * permit persons to whom the Software is furnished to do so, subject to 125b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * the following conditions: 135b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * 145b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * The above copyright notice and this permission notice (including the 155b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * next paragraph) shall be included in all copies or substantial portions 165b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * of the Software. 175b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * 185b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 195b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 205b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 215b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 225b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 235b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 245b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 255b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca * 265b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca **************************************************************************/ 275b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 285b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 295b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca#include <stdlib.h> 305b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca#include <stdio.h> 31ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca#include <float.h> 325b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 3347e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca#include "util/u_half.h" 345b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca#include "util/u_format.h" 35b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca#include "util/u_format_tests.h" 3647e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca#include "util/u_format_s3tc.h" 37ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca 38ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca 39ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonsecastatic boolean 40ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonsecacompare_float(float x, float y) 41ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca{ 42ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca float error = y - x; 43ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca 44ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca if (error < 0.0f) 45ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca error = -error; 46ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca 47ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca if (error > FLT_EPSILON) { 48ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca return FALSE; 49ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca } 50ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca 51ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca return TRUE; 52ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca} 535b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 545b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 55d0995544923d8b67098627a8a9e7729613377789José Fonsecastatic void 56d0995544923d8b67098627a8a9e7729613377789José Fonsecaprint_packed(const struct util_format_description *format_desc, 57d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *prefix, 58d0995544923d8b67098627a8a9e7729613377789José Fonseca const uint8_t *packed, 59d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *suffix) 6069895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca{ 6169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca unsigned i; 62d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *sep = ""; 63d0995544923d8b67098627a8a9e7729613377789José Fonseca 64d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s", prefix); 65d0995544923d8b67098627a8a9e7729613377789José Fonseca for (i = 0; i < format_desc->block.bits/8; ++i) { 66d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s%02x", sep, packed[i]); 67d0995544923d8b67098627a8a9e7729613377789José Fonseca sep = " "; 68d0995544923d8b67098627a8a9e7729613377789José Fonseca } 69d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s", suffix); 70256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca fflush(stdout); 71d0995544923d8b67098627a8a9e7729613377789José Fonseca} 72d0995544923d8b67098627a8a9e7729613377789José Fonseca 7369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca 74d0995544923d8b67098627a8a9e7729613377789José Fonsecastatic void 75866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecaprint_unpacked_rgba_doubl(const struct util_format_description *format_desc, 76d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *prefix, 77d0995544923d8b67098627a8a9e7729613377789José Fonseca const double unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4], 78d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *suffix) 79d0995544923d8b67098627a8a9e7729613377789José Fonseca{ 80d0995544923d8b67098627a8a9e7729613377789José Fonseca unsigned i, j; 81d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *sep = ""; 82d0995544923d8b67098627a8a9e7729613377789José Fonseca 83d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s", prefix); 84d0995544923d8b67098627a8a9e7729613377789José Fonseca for (i = 0; i < format_desc->block.height; ++i) { 85d0995544923d8b67098627a8a9e7729613377789José Fonseca for (j = 0; j < format_desc->block.width; ++j) { 86d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s{%f, %f, %f, %f}", sep, unpacked[i][j][0], unpacked[i][j][1], unpacked[i][j][2], unpacked[i][j][3]); 87d0995544923d8b67098627a8a9e7729613377789José Fonseca sep = ", "; 88d0995544923d8b67098627a8a9e7729613377789José Fonseca } 89d0995544923d8b67098627a8a9e7729613377789José Fonseca sep = ",\n"; 9069895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca } 91d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s", suffix); 92256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca fflush(stdout); 93d0995544923d8b67098627a8a9e7729613377789José Fonseca} 94d0995544923d8b67098627a8a9e7729613377789José Fonseca 95d0995544923d8b67098627a8a9e7729613377789José Fonseca 96d0995544923d8b67098627a8a9e7729613377789José Fonsecastatic void 97866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecaprint_unpacked_rgba_float(const struct util_format_description *format_desc, 98d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *prefix, 99efae8f33f2c34666c614d5b00cab618425de6f66José Fonseca float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4], 100d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *suffix) 101d0995544923d8b67098627a8a9e7729613377789José Fonseca{ 102d0995544923d8b67098627a8a9e7729613377789José Fonseca unsigned i, j; 103d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *sep = ""; 104d0995544923d8b67098627a8a9e7729613377789José Fonseca 105d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s", prefix); 106d0995544923d8b67098627a8a9e7729613377789José Fonseca for (i = 0; i < format_desc->block.height; ++i) { 107d0995544923d8b67098627a8a9e7729613377789José Fonseca for (j = 0; j < format_desc->block.width; ++j) { 108d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s{%f, %f, %f, %f}", sep, unpacked[i][j][0], unpacked[i][j][1], unpacked[i][j][2], unpacked[i][j][3]); 109d0995544923d8b67098627a8a9e7729613377789José Fonseca sep = ", "; 110d0995544923d8b67098627a8a9e7729613377789José Fonseca } 111d0995544923d8b67098627a8a9e7729613377789José Fonseca sep = ",\n"; 112d0995544923d8b67098627a8a9e7729613377789José Fonseca } 113d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s", suffix); 114256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca fflush(stdout); 115d0995544923d8b67098627a8a9e7729613377789José Fonseca} 116d0995544923d8b67098627a8a9e7729613377789José Fonseca 117d0995544923d8b67098627a8a9e7729613377789José Fonseca 118d0995544923d8b67098627a8a9e7729613377789José Fonsecastatic void 119866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecaprint_unpacked_rgba_8unorm(const struct util_format_description *format_desc, 120d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *prefix, 121efae8f33f2c34666c614d5b00cab618425de6f66José Fonseca uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4], 122d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *suffix) 123d0995544923d8b67098627a8a9e7729613377789José Fonseca{ 124d0995544923d8b67098627a8a9e7729613377789José Fonseca unsigned i, j; 125d0995544923d8b67098627a8a9e7729613377789José Fonseca const char *sep = ""; 126d0995544923d8b67098627a8a9e7729613377789José Fonseca 127d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s", prefix); 128d0995544923d8b67098627a8a9e7729613377789José Fonseca for (i = 0; i < format_desc->block.height; ++i) { 129d0995544923d8b67098627a8a9e7729613377789José Fonseca for (j = 0; j < format_desc->block.width; ++j) { 130d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s{0x%02x, 0x%02x, 0x%02x, 0x%02x}", sep, unpacked[i][j][0], unpacked[i][j][1], unpacked[i][j][2], unpacked[i][j][3]); 131d0995544923d8b67098627a8a9e7729613377789José Fonseca sep = ", "; 132d0995544923d8b67098627a8a9e7729613377789José Fonseca } 133d0995544923d8b67098627a8a9e7729613377789José Fonseca } 134d0995544923d8b67098627a8a9e7729613377789José Fonseca printf("%s", suffix); 135256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca fflush(stdout); 136d0995544923d8b67098627a8a9e7729613377789José Fonseca} 13769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca 138d0995544923d8b67098627a8a9e7729613377789José Fonseca 139866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic void 140866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecaprint_unpacked_z_float(const struct util_format_description *format_desc, 141866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const char *prefix, 142866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH], 143866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const char *suffix) 144866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{ 145866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unsigned i, j; 146866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const char *sep = ""; 147866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 148866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca printf("%s", prefix); 149866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.height; ++i) { 150866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (j = 0; j < format_desc->block.width; ++j) { 151866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca printf("%s%f", sep, unpacked[i][j]); 152866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca sep = ", "; 153866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 154866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca sep = ",\n"; 155866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 156866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca printf("%s", suffix); 157256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca fflush(stdout); 158866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca} 159866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 160866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 161866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic void 162866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecaprint_unpacked_z_32unorm(const struct util_format_description *format_desc, 163866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const char *prefix, 164866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca uint32_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH], 165866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const char *suffix) 166866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{ 167866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unsigned i, j; 168866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const char *sep = ""; 169866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 170866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca printf("%s", prefix); 171866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.height; ++i) { 172866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (j = 0; j < format_desc->block.width; ++j) { 173866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca printf("%s0x%08x", sep, unpacked[i][j]); 174866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca sep = ", "; 175866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 176866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 177866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca printf("%s", suffix); 178256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca fflush(stdout); 179866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca} 180866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 181866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 182866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic void 183866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlieprint_unpacked_s_8uint(const struct util_format_description *format_desc, 184866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie const char *prefix, 185866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH], 186866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie const char *suffix) 187866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{ 188866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unsigned i, j; 189866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const char *sep = ""; 190866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 191866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca printf("%s", prefix); 192866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.height; ++i) { 193866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (j = 0; j < format_desc->block.width; ++j) { 194866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca printf("%s0x%02x", sep, unpacked[i][j]); 195866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca sep = ", "; 196866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 197866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 198866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca printf("%s", suffix); 199256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca fflush(stdout); 200866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca} 201866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 202866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 203d0995544923d8b67098627a8a9e7729613377789José Fonsecastatic boolean 204d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_fetch_rgba_float(const struct util_format_description *format_desc, 205d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const struct util_format_test_case *test) 206d0995544923d8b67098627a8a9e7729613377789José Fonseca{ 207c87e6e50ee02c8cda11d14a0ea242bb19e77300fVinson Lee float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } }; 208d0995544923d8b67098627a8a9e7729613377789José Fonseca unsigned i, j, k; 209d0995544923d8b67098627a8a9e7729613377789José Fonseca boolean success; 21069895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca 21169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca success = TRUE; 212d0995544923d8b67098627a8a9e7729613377789José Fonseca for (i = 0; i < format_desc->block.height; ++i) { 213d0995544923d8b67098627a8a9e7729613377789José Fonseca for (j = 0; j < format_desc->block.width; ++j) { 214d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca format_desc->fetch_rgba_float(unpacked[i][j], test->packed, j, i); 215d0995544923d8b67098627a8a9e7729613377789José Fonseca for (k = 0; k < 4; ++k) { 216ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca if (!compare_float(test->unpacked[i][j][k], unpacked[i][j][k])) { 217d0995544923d8b67098627a8a9e7729613377789José Fonseca success = FALSE; 218d0995544923d8b67098627a8a9e7729613377789José Fonseca } 219d0995544923d8b67098627a8a9e7729613377789José Fonseca } 220d0995544923d8b67098627a8a9e7729613377789José Fonseca } 221d0995544923d8b67098627a8a9e7729613377789José Fonseca } 22269895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca 22369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca if (!success) { 224866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_unpacked_rgba_float(format_desc, "FAILED: ", unpacked, " obtained\n"); 225866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_unpacked_rgba_doubl(format_desc, " ", test->unpacked, " expected\n"); 22669895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca } 22769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca 22869895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca return success; 22969895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca} 23069895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca 23169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca 23269895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonsecastatic boolean 233d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_unpack_rgba_float(const struct util_format_description *format_desc, 234d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const struct util_format_test_case *test) 2355b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca{ 236c87e6e50ee02c8cda11d14a0ea242bb19e77300fVinson Lee float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } }; 237d0995544923d8b67098627a8a9e7729613377789José Fonseca unsigned i, j, k; 2385b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca boolean success; 2395b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 240d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca format_desc->unpack_rgba_float(&unpacked[0][0][0], sizeof unpacked[0], 2417f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca test->packed, 0, 2427f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca format_desc->block.width, format_desc->block.height); 2435b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 2445b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca success = TRUE; 245d0995544923d8b67098627a8a9e7729613377789José Fonseca for (i = 0; i < format_desc->block.height; ++i) { 246d0995544923d8b67098627a8a9e7729613377789José Fonseca for (j = 0; j < format_desc->block.width; ++j) { 247d0995544923d8b67098627a8a9e7729613377789José Fonseca for (k = 0; k < 4; ++k) { 248ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca if (!compare_float(test->unpacked[i][j][k], unpacked[i][j][k])) { 249d0995544923d8b67098627a8a9e7729613377789José Fonseca success = FALSE; 250d0995544923d8b67098627a8a9e7729613377789José Fonseca } 251d0995544923d8b67098627a8a9e7729613377789José Fonseca } 252d0995544923d8b67098627a8a9e7729613377789José Fonseca } 253d0995544923d8b67098627a8a9e7729613377789José Fonseca } 2545b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 2555b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca if (!success) { 256866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_unpacked_rgba_float(format_desc, "FAILED: ", unpacked, " obtained\n"); 257866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_unpacked_rgba_doubl(format_desc, " ", test->unpacked, " expected\n"); 2585b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca } 2595b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 2605b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca return success; 2615b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca} 2625b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 2635b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 2645b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonsecastatic boolean 265d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_pack_rgba_float(const struct util_format_description *format_desc, 266d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const struct util_format_test_case *test) 2675b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca{ 268d0995544923d8b67098627a8a9e7729613377789José Fonseca float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4]; 269b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES]; 270d0995544923d8b67098627a8a9e7729613377789José Fonseca unsigned i, j, k; 2715b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca boolean success; 2725b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 27308eb07bc83c9ba81ad5b497b8991d1069e17f4d7José Fonseca if (test->format == PIPE_FORMAT_DXT1_RGBA) { 2748548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca /* 2758548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca * Skip S3TC as packed representation is not canonical. 2768548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca * 2778548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca * TODO: Do a round trip conversion. 2788548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca */ 2798548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca return TRUE; 2808548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca } 2818548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca 2825b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca memset(packed, 0, sizeof packed); 283d0995544923d8b67098627a8a9e7729613377789José Fonseca for (i = 0; i < format_desc->block.height; ++i) { 284d0995544923d8b67098627a8a9e7729613377789José Fonseca for (j = 0; j < format_desc->block.width; ++j) { 285d0995544923d8b67098627a8a9e7729613377789José Fonseca for (k = 0; k < 4; ++k) { 286d0995544923d8b67098627a8a9e7729613377789José Fonseca unpacked[i][j][k] = (float) test->unpacked[i][j][k]; 287d0995544923d8b67098627a8a9e7729613377789José Fonseca } 288d0995544923d8b67098627a8a9e7729613377789José Fonseca } 289d0995544923d8b67098627a8a9e7729613377789José Fonseca } 2905b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 291d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca format_desc->pack_rgba_float(packed, 0, 2927f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca &unpacked[0][0][0], sizeof unpacked[0], 2937f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca format_desc->block.width, format_desc->block.height); 2945b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 2955b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca success = TRUE; 296c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton for (i = 0; i < format_desc->block.bits/8; ++i) { 2975b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i])) 2985b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca success = FALSE; 299c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton } 300c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton 301c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton /* Ignore NaN */ 302c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton if (util_is_double_nan(test->unpacked[0][0][0])) 303c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton success = TRUE; 3045b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 3055b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca if (!success) { 306d0995544923d8b67098627a8a9e7729613377789José Fonseca print_packed(format_desc, "FAILED: ", packed, " obtained\n"); 307d0995544923d8b67098627a8a9e7729613377789José Fonseca print_packed(format_desc, " ", test->packed, " expected\n"); 3085b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca } 3095b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 3105b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca return success; 3115b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca} 3125b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 3135b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 3146718f0325827b1d2dde47a48332c6c0471048abeJosé Fonsecastatic boolean 31596bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonsecaconvert_float_to_8unorm(uint8_t *dst, const double *src) 316be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{ 317be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca unsigned i; 3186718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca boolean accurate = TRUE; 3196718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca 320d0995544923d8b67098627a8a9e7729613377789José Fonseca for (i = 0; i < UTIL_FORMAT_MAX_UNPACKED_HEIGHT*UTIL_FORMAT_MAX_UNPACKED_WIDTH*4; ++i) { 3216718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca if (src[i] < 0.0) { 3226718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca accurate = FALSE; 3236718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca dst[i] = 0; 3246718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca } 3256718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca else if (src[i] > 1.0) { 3266718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca accurate = FALSE; 3276718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca dst[i] = 255; 3286718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca } 3296718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca else { 3306718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca dst[i] = src[i] * 255.0; 3316718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca } 3326718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca } 333be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 3346718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca return accurate; 335be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca} 336be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 337be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 3385b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonsecastatic boolean 339d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_unpack_rgba_8unorm(const struct util_format_description *format_desc, 340d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const struct util_format_test_case *test) 341be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{ 342c87e6e50ee02c8cda11d14a0ea242bb19e77300fVinson Lee uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } }; 343c87e6e50ee02c8cda11d14a0ea242bb19e77300fVinson Lee uint8_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } }; 344d0995544923d8b67098627a8a9e7729613377789José Fonseca unsigned i, j, k; 345be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca boolean success; 346be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 347d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca format_desc->unpack_rgba_8unorm(&unpacked[0][0][0], sizeof unpacked[0], 3487f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca test->packed, 0, 3497f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca format_desc->block.width, format_desc->block.height); 350be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 351d0995544923d8b67098627a8a9e7729613377789José Fonseca convert_float_to_8unorm(&expected[0][0][0], &test->unpacked[0][0][0]); 352be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 353be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca success = TRUE; 354d0995544923d8b67098627a8a9e7729613377789José Fonseca for (i = 0; i < format_desc->block.height; ++i) { 355d0995544923d8b67098627a8a9e7729613377789José Fonseca for (j = 0; j < format_desc->block.width; ++j) { 356d0995544923d8b67098627a8a9e7729613377789José Fonseca for (k = 0; k < 4; ++k) { 357d0995544923d8b67098627a8a9e7729613377789José Fonseca if (expected[i][j][k] != unpacked[i][j][k]) { 358d0995544923d8b67098627a8a9e7729613377789José Fonseca success = FALSE; 359d0995544923d8b67098627a8a9e7729613377789José Fonseca } 360d0995544923d8b67098627a8a9e7729613377789José Fonseca } 361d0995544923d8b67098627a8a9e7729613377789José Fonseca } 362d0995544923d8b67098627a8a9e7729613377789José Fonseca } 363be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 364c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton /* Ignore NaN */ 365c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton if (util_is_double_nan(test->unpacked[0][0][0])) 366c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton success = TRUE; 367c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton 368be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca if (!success) { 369866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_unpacked_rgba_8unorm(format_desc, "FAILED: ", unpacked, " obtained\n"); 370866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_unpacked_rgba_8unorm(format_desc, " ", expected, " expected\n"); 371be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca } 372be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 373be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca return success; 374be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca} 375be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 376be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 377be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecastatic boolean 378d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecatest_format_pack_rgba_8unorm(const struct util_format_description *format_desc, 379d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const struct util_format_test_case *test) 380be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{ 381d0995544923d8b67098627a8a9e7729613377789José Fonseca uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4]; 382b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES]; 383be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca unsigned i; 384be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca boolean success; 385be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 38608eb07bc83c9ba81ad5b497b8991d1069e17f4d7José Fonseca if (test->format == PIPE_FORMAT_DXT1_RGBA) { 3878548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca /* 3888548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca * Skip S3TC as packed representation is not canonical. 3898548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca * 3908548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca * TODO: Do a round trip conversion. 3918548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca */ 3928548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca return TRUE; 3938548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca } 3948548efbe1d2ebc9cfe5636d3e0f3064958ad0644José Fonseca 395d0995544923d8b67098627a8a9e7729613377789José Fonseca if (!convert_float_to_8unorm(&unpacked[0][0][0], &test->unpacked[0][0][0])) { 3966718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca /* 3976718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca * Skip test cases which cannot be represented by four unorm bytes. 3986718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca */ 3996718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca return TRUE; 4006718f0325827b1d2dde47a48332c6c0471048abeJosé Fonseca } 401be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 402be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca memset(packed, 0, sizeof packed); 403be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 404d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca format_desc->pack_rgba_8unorm(packed, 0, 4057f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca &unpacked[0][0][0], sizeof unpacked[0], 4067f9444050fbf91a5727617ba39806f28ea0921a2José Fonseca format_desc->block.width, format_desc->block.height); 407be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 408be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca success = TRUE; 409d0995544923d8b67098627a8a9e7729613377789José Fonseca for (i = 0; i < format_desc->block.bits/8; ++i) 410be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i])) 411be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca success = FALSE; 412be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 413c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton /* Ignore NaN */ 414c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton if (util_is_double_nan(test->unpacked[0][0][0])) 415c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton success = TRUE; 416c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton 417c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton /* Ignore failure cases due to unorm8 format */ 418c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton if (test->unpacked[0][0][0] > 1.0f || test->unpacked[0][0][0] < 0.0f) 419c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton success = TRUE; 420c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton 421c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton /* Multiple of 255 */ 422c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton if ((test->unpacked[0][0][0] * 255.0) != (int)(test->unpacked[0][0][0] * 255.0)) 423c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton success = TRUE; 424c8d3481cdb12a10e02b23d65c73017ce5925cde7James Benton 425be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca if (!success) { 426d0995544923d8b67098627a8a9e7729613377789José Fonseca print_packed(format_desc, "FAILED: ", packed, " obtained\n"); 427d0995544923d8b67098627a8a9e7729613377789José Fonseca print_packed(format_desc, " ", test->packed, " expected\n"); 428be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca } 429be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 430be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca return success; 431be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca} 432be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 433be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 434866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean 435866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_unpack_z_float(const struct util_format_description *format_desc, 436866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const struct util_format_test_case *test) 437866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{ 438866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } }; 439866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unsigned i, j; 440866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca boolean success; 441866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 442866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca format_desc->unpack_z_float(&unpacked[0][0], sizeof unpacked[0], 443866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca test->packed, 0, 444866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca format_desc->block.width, format_desc->block.height); 445866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 446866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = TRUE; 447866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.height; ++i) { 448866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (j = 0; j < format_desc->block.width; ++j) { 449866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (!compare_float(test->unpacked[i][j][0], unpacked[i][j])) { 450866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = FALSE; 451866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 452866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 453866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 454866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 455866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (!success) { 456866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_unpacked_z_float(format_desc, "FAILED: ", unpacked, " obtained\n"); 457866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_unpacked_rgba_doubl(format_desc, " ", test->unpacked, " expected\n"); 458866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 459866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 460866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca return success; 461866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca} 462866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 463866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 464866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean 465866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_pack_z_float(const struct util_format_description *format_desc, 466866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const struct util_format_test_case *test) 467866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{ 468866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH]; 469866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES]; 470866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unsigned i, j; 471866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca boolean success; 472866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 473866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca memset(packed, 0, sizeof packed); 474866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.height; ++i) { 475866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (j = 0; j < format_desc->block.width; ++j) { 476866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unpacked[i][j] = (float) test->unpacked[i][j][0]; 477866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (test->unpacked[i][j][1]) { 478866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca return TRUE; 479866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 480866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 481866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 482866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 483866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca format_desc->pack_z_float(packed, 0, 484866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca &unpacked[0][0], sizeof unpacked[0], 485866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca format_desc->block.width, format_desc->block.height); 486866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 487866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = TRUE; 488866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.bits/8; ++i) 489866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i])) 490866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = FALSE; 491866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 492866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (!success) { 493866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_packed(format_desc, "FAILED: ", packed, " obtained\n"); 494866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_packed(format_desc, " ", test->packed, " expected\n"); 495866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 496866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 497866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca return success; 498866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca} 499866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 500866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 501866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean 502866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_unpack_z_32unorm(const struct util_format_description *format_desc, 503866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const struct util_format_test_case *test) 504866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{ 505866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca uint32_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } }; 506866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca uint32_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } }; 507866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unsigned i, j; 508866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca boolean success; 509866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 510866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca format_desc->unpack_z_32unorm(&unpacked[0][0], sizeof unpacked[0], 511866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca test->packed, 0, 512866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca format_desc->block.width, format_desc->block.height); 513866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 514866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.height; ++i) { 515866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (j = 0; j < format_desc->block.width; ++j) { 516866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca expected[i][j] = test->unpacked[i][j][0] * 0xffffffff; 517866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 518866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 519866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 520866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = TRUE; 521866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.height; ++i) { 522866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (j = 0; j < format_desc->block.width; ++j) { 523866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (expected[i][j] != unpacked[i][j]) { 524866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = FALSE; 525866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 526866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 527866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 528866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 529866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (!success) { 530866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_unpacked_z_32unorm(format_desc, "FAILED: ", unpacked, " obtained\n"); 531866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_unpacked_z_32unorm(format_desc, " ", expected, " expected\n"); 532866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 533866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 534866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca return success; 535866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca} 536866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 537866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 538866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean 539866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecatest_format_pack_z_32unorm(const struct util_format_description *format_desc, 540866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const struct util_format_test_case *test) 541866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{ 542866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca uint32_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH]; 543866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES]; 544866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unsigned i, j; 545866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca boolean success; 546866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 547866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.height; ++i) { 548866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (j = 0; j < format_desc->block.width; ++j) { 549866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unpacked[i][j] = test->unpacked[i][j][0] * 0xffffffff; 550866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (test->unpacked[i][j][1]) { 551866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca return TRUE; 552866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 553866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 554866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 555866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 556866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca memset(packed, 0, sizeof packed); 557866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 558866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca format_desc->pack_z_32unorm(packed, 0, 559866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca &unpacked[0][0], sizeof unpacked[0], 560866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca format_desc->block.width, format_desc->block.height); 561866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 562866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = TRUE; 563866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.bits/8; ++i) 564866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i])) 565866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = FALSE; 566866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 567866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (!success) { 568866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_packed(format_desc, "FAILED: ", packed, " obtained\n"); 569866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_packed(format_desc, " ", test->packed, " expected\n"); 570866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 571866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 572866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca return success; 573866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca} 574866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 575866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 576866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean 577866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlietest_format_unpack_s_8uint(const struct util_format_description *format_desc, 578866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const struct util_format_test_case *test) 579866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{ 580866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } }; 581866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca uint8_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH] = { { 0 } }; 582866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unsigned i, j; 583866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca boolean success; 584866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 585866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie format_desc->unpack_s_8uint(&unpacked[0][0], sizeof unpacked[0], 586866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca test->packed, 0, 587866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca format_desc->block.width, format_desc->block.height); 588866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 589866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.height; ++i) { 590866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (j = 0; j < format_desc->block.width; ++j) { 591866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca expected[i][j] = test->unpacked[i][j][1]; 592866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 593866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 594866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 595866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = TRUE; 596866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.height; ++i) { 597866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (j = 0; j < format_desc->block.width; ++j) { 598866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (expected[i][j] != unpacked[i][j]) { 599866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = FALSE; 600866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 601866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 602866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 603866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 604866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (!success) { 605866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie print_unpacked_s_8uint(format_desc, "FAILED: ", unpacked, " obtained\n"); 606866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie print_unpacked_s_8uint(format_desc, " ", expected, " expected\n"); 607866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 608866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 609866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca return success; 610866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca} 611866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 612866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 613866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonsecastatic boolean 614866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlietest_format_pack_s_8uint(const struct util_format_description *format_desc, 615866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca const struct util_format_test_case *test) 616866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca{ 617866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH]; 618866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES]; 619866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unsigned i, j; 620866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca boolean success; 621866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 622866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.height; ++i) { 623866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (j = 0; j < format_desc->block.width; ++j) { 624866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca unpacked[i][j] = test->unpacked[i][j][1]; 625866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (test->unpacked[i][j][0]) { 626866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca return TRUE; 627866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 628866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 629866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 630866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 631866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca memset(packed, 0, sizeof packed); 632866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 633866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie format_desc->pack_s_8uint(packed, 0, 634866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca &unpacked[0][0], sizeof unpacked[0], 635866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca format_desc->block.width, format_desc->block.height); 636866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 637866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = TRUE; 638866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca for (i = 0; i < format_desc->block.bits/8; ++i) 639866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i])) 640866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca success = FALSE; 641866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 642866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca if (!success) { 643866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_packed(format_desc, "FAILED: ", packed, " obtained\n"); 644866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca print_packed(format_desc, " ", test->packed, " expected\n"); 645866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca } 646866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 647866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca return success; 648866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca} 649866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 650866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 651be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecatypedef boolean 65296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca(*test_func_t)(const struct util_format_description *format_desc, 65396bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca const struct util_format_test_case *test); 654be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 655be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 656be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecastatic boolean 657b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonsecatest_one_func(const struct util_format_description *format_desc, 658b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca test_func_t func, 659b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca const char *suffix) 6605b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca{ 6615b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca unsigned i; 6625f2deba9f3f3f9230a9fdd2848e20c1e23e98b8fBrian Paul boolean success = TRUE; 6635b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 664b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca printf("Testing util_format_%s_%s ...\n", 665b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca format_desc->short_name, suffix); 666256b9d99fb704d6c11d6242b7ec40206963f201eJosé Fonseca fflush(stdout); 667b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca 668b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca for (i = 0; i < util_format_nr_test_cases; ++i) { 669b999e9c03d7ab9a41e9ff30a5c77226e0753750bJosé Fonseca const struct util_format_test_case *test = &util_format_test_cases[i]; 6705b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 671b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca if (test->format == format_desc->format) { 672ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca if (!func(format_desc, &util_format_test_cases[i])) { 673ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca success = FALSE; 674ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca } 675ca6aacf842c0075f12907d13fec89cc7f1eac4f0José Fonseca } 6765b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca } 6775b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 6785b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca return success; 6795b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca} 6805b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 6815b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 682be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecastatic boolean 683be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonsecatest_all(void) 684be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca{ 685b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca enum pipe_format format; 6865f2deba9f3f3f9230a9fdd2848e20c1e23e98b8fBrian Paul boolean success = TRUE; 687be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 688b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca for (format = 1; format < PIPE_FORMAT_COUNT; ++format) { 689b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca const struct util_format_description *format_desc; 690b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca 691b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca format_desc = util_format_description(format); 692b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca if (!format_desc) { 693b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca continue; 694b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca } 69569895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca 696b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC && 697b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca !util_format_s3tc_enabled) { 698b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca continue; 699b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca } 700be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 701b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca# define TEST_ONE_FUNC(name) \ 702b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca if (format_desc->name) { \ 703b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca if (!test_one_func(format_desc, &test_format_##name, #name)) { \ 704b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca success = FALSE; \ 705b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca } \ 706b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca } 707be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 708b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca TEST_ONE_FUNC(fetch_rgba_float); 709b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca TEST_ONE_FUNC(pack_rgba_float); 710b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca TEST_ONE_FUNC(unpack_rgba_float); 711b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca TEST_ONE_FUNC(pack_rgba_8unorm); 712b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca TEST_ONE_FUNC(unpack_rgba_8unorm); 713be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 714866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca TEST_ONE_FUNC(unpack_z_32unorm); 715866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca TEST_ONE_FUNC(pack_z_32unorm); 716866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca TEST_ONE_FUNC(unpack_z_float); 717866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca TEST_ONE_FUNC(pack_z_float); 718866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie TEST_ONE_FUNC(unpack_s_8uint); 719866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie TEST_ONE_FUNC(pack_s_8uint); 720866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca 721b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca# undef TEST_ONE_FUNC 722b1cfc195bb802d6ee2b7e230e7d7bce9ffe7eefdJosé Fonseca } 723be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 724be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca return success; 725be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca} 726be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 727be1b7d1a04fe5aab11690cdf4960b160f612e51aJosé Fonseca 7285b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonsecaint main(int argc, char **argv) 7295b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca{ 7305b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca boolean success; 7315b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 73247e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca util_format_s3tc_init(); 73347e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca 7345b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca success = test_all(); 7355b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca 7365b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca return success ? 0 : 1; 7375b3c0c151b2d9b109935d47c1cd108b4d1f1ae64José Fonseca} 738