diff options
Diffstat (limited to 'progs/gallium')
-rwxr-xr-x | progs/gallium/python/tests/base.py | 74 | ||||
-rwxr-xr-x | progs/gallium/python/tests/surface_copy.py | 116 | ||||
-rwxr-xr-x | progs/gallium/python/tests/texture_blit.py | 9 | ||||
-rwxr-xr-x | progs/gallium/python/tests/texture_render.py | 4 | ||||
-rwxr-xr-x | progs/gallium/python/tests/texture_transfer.py | 109 | ||||
-rw-r--r-- | progs/gallium/unit/Makefile | 44 | ||||
-rw-r--r-- | progs/gallium/unit/SConscript | 5 | ||||
-rw-r--r-- | progs/gallium/unit/u_format_test.c | 267 | ||||
-rw-r--r-- | progs/gallium/unit/u_half_test.c | 32 |
9 files changed, 465 insertions, 195 deletions
diff --git a/progs/gallium/python/tests/base.py b/progs/gallium/python/tests/base.py index 8c55e3ae5d..d8cf84db36 100755 --- a/progs/gallium/python/tests/base.py +++ b/progs/gallium/python/tests/base.py @@ -116,7 +116,7 @@ class Test: def run(self): result = TestResult() self._run(result) - result.summary() + result.report() def assert_rgba(self, ctx, surface, x, y, w, h, expected_rgba, pixel_tol=4.0/256, surface_tol=0.85): total = h*w @@ -250,7 +250,7 @@ class TestResult: sys.stdout.write("SKIP\n") sys.stdout.flush() self.skipped += 1 - #self.log_result(test, 'skip') + self.log_result(test, 'skip') def test_failed(self, test): sys.stdout.write("FAIL\n") @@ -296,11 +296,16 @@ class TestResult: self.rows.append(row) - def summary(self): + def report(self): sys.stdout.write("%u tests, %u passed, %u skipped, %u failed\n\n" % (self.tests, self.passed, self.skipped, self.failed)) sys.stdout.flush() name, ext = os.path.splitext(os.path.basename(sys.argv[0])) + + tree = self.report_tree(name) + self.report_junit(name, stdout=tree) + + def report_tree(self, name): filename = name + '.tsv' stream = file(filename, 'wt') @@ -311,6 +316,8 @@ class TestResult: # rows for row in self.rows: + if row[0] == 'skip': + continue row += ['']*(len(self.names) - len(row)) stream.write('\t'.join(row) + '\n') @@ -322,7 +329,7 @@ class TestResult: import orngTree except ImportError: sys.stderr.write('Install Orange from http://www.ailab.si/orange/ for a classification tree.\n') - return + return None data = orange.ExampleTable(filename) @@ -330,6 +337,63 @@ class TestResult: orngTree.printTxt(tree, maxDepth=4) - file(name+'.txt', 'wt').write(orngTree.dumpTree(tree)) + text_tree = orngTree.dumpTree(tree) + + file(name + '.txt', 'wt').write(text_tree) orngTree.printDot(tree, fileName=name+'.dot', nodeShape='ellipse', leafShape='box') + + return text_tree + + def report_junit(self, name, stdout=None, stderr=None): + """Write test results in ANT's junit XML format, to use with Hudson CI. + + See also: + - http://fisheye.hudson-ci.org/browse/Hudson/trunk/hudson/main/core/src/test/resources/hudson/tasks/junit + - http://www.junit.org/node/399 + - http://wiki.apache.org/ant/Proposals/EnhancedTestReports + """ + + stream = file(name + '.xml', 'wt') + + stream.write('<?xml version="1.0" encoding="UTF-8" ?>\n') + stream.write('<testsuite name="%s">\n' % self.escape_xml(name)) + stream.write(' <properties>\n') + stream.write(' </properties>\n') + + names = self.names[1:] + + for row in self.rows: + + test_name = ' '.join(['%s=%s' % pair for pair in zip(self.names[1:], row[1:])]) + + stream.write(' <testcase name="%s">\n' % (self.escape_xml(test_name))) + + result = row[0] + if result == 'pass': + pass + elif result == 'skip': + stream.write(' <skipped/>\n') + else: + stream.write(' <failure/>\n') + + stream.write(' </testcase>\n') + + if stdout: + stream.write(' <system-out>%s</system-out>\n' % self.escape_xml(stdout)) + if stderr: + stream.write(' <system-err>%s</system-err>\n' % self.escape_xml(stderr)) + + stream.write('</testsuite>\n') + + stream.close() + + def escape_xml(self, s): + '''Escape a XML string.''' + s = s.replace('&', '&') + s = s.replace('<', '<') + s = s.replace('>', '>') + s = s.replace('"', '"') + s = s.replace("'", ''') + return s + diff --git a/progs/gallium/python/tests/surface_copy.py b/progs/gallium/python/tests/surface_copy.py index 9364fd1110..3eefa690bd 100755 --- a/progs/gallium/python/tests/surface_copy.py +++ b/progs/gallium/python/tests/surface_copy.py @@ -27,6 +27,9 @@ ########################################################################## +import os +import random + from gallium import * from base import * @@ -68,6 +71,14 @@ class TextureTest(TestCase): level = self.level zslice = self.zslice + tex_usage = PIPE_TEXTURE_USAGE_SAMPLER + geom_flags = 0 + if not dev.is_format_supported(format, target, tex_usage, geom_flags): + raise TestSkip + + if not dev.is_format_supported(format, target, tex_usage, geom_flags): + raise TestSkip + # textures dst_texture = dev.texture_create( target = target, @@ -76,10 +87,8 @@ class TextureTest(TestCase): height = height, depth = depth, last_level = last_level, - tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET, + tex_usage = tex_usage, ) - if dst_texture is None: - raise TestSkip dst_surface = dst_texture.get_surface(face = face, level = level, zslice = zslice) @@ -95,8 +104,6 @@ class TextureTest(TestCase): src_surface = src_texture.get_surface() - x = 0 - y = 0 w = dst_surface.width h = dst_surface.height @@ -113,7 +120,6 @@ class TextureTest(TestCase): if dst_raw != src_raw: raise TestFailure - def main(): @@ -124,27 +130,7 @@ def main(): targets = [ PIPE_TEXTURE_2D, PIPE_TEXTURE_CUBE, - #PIPE_TEXTURE_3D, - ] - - formats = [ - PIPE_FORMAT_B8G8R8A8_UNORM, - PIPE_FORMAT_B8G8R8X8_UNORM, - PIPE_FORMAT_B8G8R8A8_SRGB, - PIPE_FORMAT_B5G6R5_UNORM, - PIPE_FORMAT_B5G5R5A1_UNORM, - PIPE_FORMAT_B4G4R4A4_UNORM, - PIPE_FORMAT_Z32_UNORM, - PIPE_FORMAT_S8Z24_UNORM, - PIPE_FORMAT_X8Z24_UNORM, - PIPE_FORMAT_Z16_UNORM, - PIPE_FORMAT_S8_UNORM, - PIPE_FORMAT_A8_UNORM, - PIPE_FORMAT_L8_UNORM, - PIPE_FORMAT_DXT1_RGB, - PIPE_FORMAT_DXT1_RGBA, - PIPE_FORMAT_DXT3_RGBA, - PIPE_FORMAT_DXT5_RGBA, + PIPE_TEXTURE_3D, ] sizes = [64, 32, 16, 8, 4, 2, 1] @@ -161,36 +147,52 @@ def main(): PIPE_TEX_FACE_NEG_Z, ] - for target in targets: - for format in formats: - for size in sizes: - if target == PIPE_TEXTURE_3D: - depth = size - else: - depth = 1 - for face in faces: - if target != PIPE_TEXTURE_CUBE and face: - continue - levels = lods(size) - for last_level in range(levels): - for level in range(0, last_level + 1): - zslice = 0 - while zslice < depth >> level: - test = TextureTest( - dev = dev, - ctx = ctx, - target = target, - format = format, - width = size, - height = size, - depth = depth, - last_level = last_level, - face = face, - level = level, - zslice = zslice, - ) - suite.add_test(test) - zslice = (zslice + 1)*2 - 1 + try: + n = int(sys.argv[1]) + except: + n = 10000 + + for i in range(n): + format = random.choice(formats.keys()) + if not util_format_is_depth_or_stencil(format): + is_depth_or_stencil = util_format_is_depth_or_stencil(format) + + if is_depth_or_stencil: + target = PIPE_TEXTURE_2D + else: + target = random.choice(targets) + + size = random.choice(sizes) + + if target == PIPE_TEXTURE_3D: + depth = size + else: + depth = 1 + + if target == PIPE_TEXTURE_CUBE: + face = random.choice(faces) + else: + face = PIPE_TEX_FACE_POS_X + + levels = lods(size) + last_level = random.randint(0, levels - 1) + level = random.randint(0, last_level) + zslice = random.randint(0, max(depth >> level, 1) - 1) + + test = TextureTest( + dev = dev, + ctx = ctx, + target = target, + format = format, + width = size, + height = size, + depth = depth, + last_level = last_level, + face = face, + level = level, + zslice = zslice, + ) + suite.add_test(test) suite.run() diff --git a/progs/gallium/python/tests/texture_blit.py b/progs/gallium/python/tests/texture_blit.py index 5ae0a7398d..a68c081931 100755 --- a/progs/gallium/python/tests/texture_blit.py +++ b/progs/gallium/python/tests/texture_blit.py @@ -191,7 +191,7 @@ class TextureColorSampleTest(TestCase): zslice = zslice, ) - ctx.surface_sample_rgba(surface, expected_rgba) + ctx.surface_sample_rgba(surface, expected_rgba, True) ctx.set_fragment_sampler_texture(0, texture) @@ -428,7 +428,7 @@ class TextureDepthSampleTest(TestCase): zslice = zslice, ) - ctx.surface_sample_rgba(surface, expected_rgba) + ctx.surface_sample_rgba(surface, expected_rgba, True) ctx.set_fragment_sampler_texture(0, texture) @@ -555,6 +555,7 @@ def main(): random.seed(0xdead3eef) dev = Device() + ctx = dev.context_create() suite = TestSuite() targets = [ @@ -577,8 +578,6 @@ def main(): PIPE_TEX_FACE_NEG_Z, ] - ctx = dev.context_create() - try: n = int(sys.argv[1]) except: @@ -602,7 +601,7 @@ def main(): depth = 1 if target == PIPE_TEXTURE_CUBE: - face =random.choice(faces) + face = random.choice(faces) else: face = PIPE_TEX_FACE_POS_X diff --git a/progs/gallium/python/tests/texture_render.py b/progs/gallium/python/tests/texture_render.py index 1e26639db6..12def7ec72 100755 --- a/progs/gallium/python/tests/texture_render.py +++ b/progs/gallium/python/tests/texture_render.py @@ -258,10 +258,10 @@ def main(): PIPE_FORMAT_B5G5R5A1_UNORM, PIPE_FORMAT_B4G4R4A4_UNORM, #PIPE_FORMAT_Z32_UNORM, - #PIPE_FORMAT_S8Z24_UNORM, + #PIPE_FORMAT_S8_USCALED_Z24_UNORM, #PIPE_FORMAT_X8Z24_UNORM, #PIPE_FORMAT_Z16_UNORM, - #PIPE_FORMAT_S8_UNORM, + #PIPE_FORMAT_S8_USCALED, PIPE_FORMAT_A8_UNORM, PIPE_FORMAT_L8_UNORM, #PIPE_FORMAT_DXT1_RGB, diff --git a/progs/gallium/python/tests/texture_transfer.py b/progs/gallium/python/tests/texture_transfer.py index 97a28e01a4..639d3d362c 100755 --- a/progs/gallium/python/tests/texture_transfer.py +++ b/progs/gallium/python/tests/texture_transfer.py @@ -29,6 +29,7 @@ import os +import random from gallium import * from base import * @@ -71,8 +72,12 @@ class TextureTest(TestCase): level = self.level zslice = self.zslice - tex_usage = 0 + tex_usage = PIPE_TEXTURE_USAGE_SAMPLER + geom_flags = 0 + if not dev.is_format_supported(format, target, tex_usage, geom_flags): + raise TestSkip + # textures texture = dev.texture_create( target = target, format = format, @@ -82,13 +87,11 @@ class TextureTest(TestCase): last_level = last_level, tex_usage = tex_usage, ) - if texture is None: - raise TestSkip surface = texture.get_surface(face, level, zslice) - stride = util_format_get_stride(format, width) - size = util_format_get_nblocksy(format, height) * stride + stride = util_format_get_stride(format, surface.width) + size = util_format_get_nblocksy(format, surface.height) * stride in_raw = os.urandom(size) @@ -111,26 +114,6 @@ def main(): PIPE_TEXTURE_3D, ] - formats = [ - PIPE_FORMAT_B8G8R8A8_UNORM, - PIPE_FORMAT_B8G8R8X8_UNORM, - PIPE_FORMAT_B8G8R8A8_SRGB, - PIPE_FORMAT_B5G6R5_UNORM, - PIPE_FORMAT_B5G5R5A1_UNORM, - PIPE_FORMAT_B4G4R4A4_UNORM, - PIPE_FORMAT_Z32_UNORM, - PIPE_FORMAT_S8Z24_UNORM, - PIPE_FORMAT_X8Z24_UNORM, - PIPE_FORMAT_Z16_UNORM, - PIPE_FORMAT_S8_UNORM, - PIPE_FORMAT_A8_UNORM, - PIPE_FORMAT_L8_UNORM, - PIPE_FORMAT_DXT1_RGB, - PIPE_FORMAT_DXT1_RGBA, - PIPE_FORMAT_DXT3_RGBA, - PIPE_FORMAT_DXT5_RGBA, - ] - sizes = [64, 32, 16, 8, 4, 2, 1] #sizes = [1020, 508, 252, 62, 30, 14, 6, 3] #sizes = [64] @@ -145,36 +128,52 @@ def main(): PIPE_TEX_FACE_NEG_Z, ] - for target in targets: - for format in formats: - for size in sizes: - if target == PIPE_TEXTURE_3D: - depth = size - else: - depth = 1 - for face in faces: - if target != PIPE_TEXTURE_CUBE and face: - continue - levels = lods(size) - for last_level in range(levels): - for level in range(0, last_level + 1): - zslice = 0 - while zslice < depth >> level: - test = TextureTest( - dev = dev, - ctx = ctx, - target = target, - format = format, - width = size, - height = size, - depth = depth, - last_level = last_level, - face = face, - level = level, - zslice = zslice, - ) - suite.add_test(test) - zslice = (zslice + 1)*2 - 1 + try: + n = int(sys.argv[1]) + except: + n = 10000 + + for i in range(n): + format = random.choice(formats.keys()) + if not util_format_is_depth_or_stencil(format): + is_depth_or_stencil = util_format_is_depth_or_stencil(format) + + if is_depth_or_stencil: + target = PIPE_TEXTURE_2D + else: + target = random.choice(targets) + + size = random.choice(sizes) + + if target == PIPE_TEXTURE_3D: + depth = size + else: + depth = 1 + + if target == PIPE_TEXTURE_CUBE: + face = random.choice(faces) + else: + face = PIPE_TEX_FACE_POS_X + + levels = lods(size) + last_level = random.randint(0, levels - 1) + level = random.randint(0, last_level) + zslice = random.randint(0, max(depth >> level, 1) - 1) + + test = TextureTest( + dev = dev, + ctx = ctx, + target = target, + format = format, + width = size, + height = size, + depth = depth, + last_level = last_level, + face = face, + level = level, + zslice = zslice, + ) + suite.add_test(test) suite.run() diff --git a/progs/gallium/unit/Makefile b/progs/gallium/unit/Makefile new file mode 100644 index 0000000000..f3dbd7695c --- /dev/null +++ b/progs/gallium/unit/Makefile @@ -0,0 +1,44 @@ +# progs/gallium/simple/Makefile + +TOP = ../../.. +include $(TOP)/configs/current + +INCLUDES = \ + -I. \ + -I$(TOP)/src/gallium/include \ + -I$(TOP)/src/gallium/auxiliary \ + -I$(TOP)/src/gallium/drivers \ + -I$(TOP)/src/gallium/winsys \ + $(PROG_INCLUDES) + +LINKS = \ + $(TOP)/src/gallium/drivers/trace/libtrace.a \ + $(TOP)/src/gallium/winsys/sw/null/libws_null.a \ + $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ + $(GALLIUM_AUXILIARIES) \ + $(PROG_LINKS) + +SOURCES = \ + u_format_test.c \ + u_half_test.c + +OBJECTS = $(SOURCES:.c=.o) + +PROGS = $(OBJECTS:.o=) + +##### TARGETS ##### + +default: $(PROGS) + +clean: + -rm -f $(PROGS) + -rm -f *.o + -rm -f result.bmp + +##### RULES ##### + +$(OBJECTS): %.o: %.c + $(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $(PROG_DEFINES) $< -o $@ + +$(PROGS): %: %.o + $(CC) $(LDFLAGS) $< $(LINKS) -lm -lpthread -ldl -o $@ diff --git a/progs/gallium/unit/SConscript b/progs/gallium/unit/SConscript index 9891440df6..0db3bb687c 100644 --- a/progs/gallium/unit/SConscript +++ b/progs/gallium/unit/SConscript @@ -5,7 +5,8 @@ env = env.Clone() env.Prepend(LIBS = [gallium]) progs = [ - 'u_format_test' + 'u_format_test', + 'u_half_test' ] for prog in progs: @@ -13,6 +14,8 @@ for prog in progs: target = prog, source = prog + '.c', ) + + env.InstallProgram(prog) # http://www.scons.org/wiki/UnitTests test_alias = env.Alias('unit', [prog], prog[0].abspath) diff --git a/progs/gallium/unit/u_format_test.c b/progs/gallium/unit/u_format_test.c index 54cb6b879e..53e028482b 100644 --- a/progs/gallium/unit/u_format_test.c +++ b/progs/gallium/unit/u_format_test.c @@ -28,36 +28,133 @@ #include <stdlib.h> #include <stdio.h> +#include <float.h> +#include "util/u_half.h" #include "util/u_format.h" #include "util/u_format_tests.h" +#include "util/u_format_s3tc.h" static boolean -test_format_fetch_float(const struct util_format_description *format_desc, - const struct util_format_test_case *test) +compare_float(float x, float y) +{ + float error = y - x; + + if (error < 0.0f) + error = -error; + + if (error > FLT_EPSILON) { + return FALSE; + } + + return TRUE; +} + + +static void +print_packed(const struct util_format_description *format_desc, + const char *prefix, + const uint8_t *packed, + const char *suffix) { - float unpacked[4]; unsigned i; - boolean success; + const char *sep = ""; + + printf("%s", prefix); + for (i = 0; i < format_desc->block.bits/8; ++i) { + printf("%s%02x", sep, packed[i]); + sep = " "; + } + printf("%s", suffix); +} + + +static void +print_unpacked_doubl(const struct util_format_description *format_desc, + const char *prefix, + const double unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4], + const char *suffix) +{ + unsigned i, j; + const char *sep = ""; + + printf("%s", prefix); + for (i = 0; i < format_desc->block.height; ++i) { + for (j = 0; j < format_desc->block.width; ++j) { + printf("%s{%f, %f, %f, %f}", sep, unpacked[i][j][0], unpacked[i][j][1], unpacked[i][j][2], unpacked[i][j][3]); + sep = ", "; + } + sep = ",\n"; + } + printf("%s", suffix); +} - /* - * TODO: test block formats too. - */ - if (format_desc->block.width != 1 && format_desc->block.height != 1) { - return TRUE; + +static void +print_unpacked_float(const struct util_format_description *format_desc, + const char *prefix, + const float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4], + const char *suffix) +{ + unsigned i, j; + const char *sep = ""; + + printf("%s", prefix); + for (i = 0; i < format_desc->block.height; ++i) { + for (j = 0; j < format_desc->block.width; ++j) { + printf("%s{%f, %f, %f, %f}", sep, unpacked[i][j][0], unpacked[i][j][1], unpacked[i][j][2], unpacked[i][j][3]); + sep = ", "; + } + sep = ",\n"; } + printf("%s", suffix); +} - format_desc->fetch_float(unpacked, test->packed, 0, 0); + +static void +print_unpacked_8unorm(const struct util_format_description *format_desc, + const char *prefix, + const uint8_t unpacked[][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4], + const char *suffix) +{ + unsigned i, j; + const char *sep = ""; + + printf("%s", prefix); + for (i = 0; i < format_desc->block.height; ++i) { + for (j = 0; j < format_desc->block.width; ++j) { + 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]); + sep = ", "; + } + } + printf("%s", suffix); +} + + +static boolean +test_format_fetch_float(const struct util_format_description *format_desc, + const struct util_format_test_case *test) +{ + float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } }; + unsigned i, j, k; + boolean success; success = TRUE; - for (i = 0; i < 4; ++i) - if (test->unpacked[i] != unpacked[i]) - success = FALSE; + for (i = 0; i < format_desc->block.height; ++i) { + for (j = 0; j < format_desc->block.width; ++j) { + format_desc->fetch_float(unpacked[i][j], test->packed, j, i); + for (k = 0; k < 4; ++k) { + if (!compare_float(test->unpacked[i][j][k], unpacked[i][j][k])) { + success = FALSE; + } + } + } + } if (!success) { - printf("FAILED: (%f %f %f %f) obtained\n", unpacked[0], unpacked[1], unpacked[2], unpacked[3]); - printf(" (%f %f %f %f) expected\n", test->unpacked[0], test->unpacked[1], test->unpacked[2], test->unpacked[3]); + print_unpacked_float(format_desc, "FAILED: ", unpacked, " obtained\n"); + print_unpacked_doubl(format_desc, " ", test->unpacked, " expected\n"); } return success; @@ -68,20 +165,26 @@ static boolean test_format_unpack_float(const struct util_format_description *format_desc, const struct util_format_test_case *test) { - float unpacked[4]; - unsigned i; + float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } }; + unsigned i, j, k; boolean success; - format_desc->unpack_float(unpacked, 0, test->packed, 0, 1, 1); + format_desc->unpack_float(&unpacked[0][0][0], sizeof unpacked[0], test->packed, 0, format_desc->block.width, format_desc->block.height); success = TRUE; - for (i = 0; i < 4; ++i) - if (test->unpacked[i] != unpacked[i]) - success = FALSE; + for (i = 0; i < format_desc->block.height; ++i) { + for (j = 0; j < format_desc->block.width; ++j) { + for (k = 0; k < 4; ++k) { + if (!compare_float(test->unpacked[i][j][k], unpacked[i][j][k])) { + success = FALSE; + } + } + } + } if (!success) { - printf("FAILED: (%f %f %f %f) obtained\n", unpacked[0], unpacked[1], unpacked[2], unpacked[3]); - printf(" (%f %f %f %f) expected\n", test->unpacked[0], test->unpacked[1], test->unpacked[2], test->unpacked[3]); + print_unpacked_float(format_desc, "FAILED: ", unpacked, " obtained\n"); + print_unpacked_doubl(format_desc, " ", test->unpacked, " expected\n"); } return success; @@ -89,38 +192,43 @@ test_format_unpack_float(const struct util_format_description *format_desc, static boolean + test_format_pack_float(const struct util_format_description *format_desc, const struct util_format_test_case *test) { - float unpacked[4]; + float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4]; uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES]; - unsigned i; + unsigned i, j, k; boolean success; - memset(packed, 0, sizeof packed); + if (test->format == PIPE_FORMAT_DXT1_RGBA) { + /* + * Skip S3TC as packed representation is not canonical. + * + * TODO: Do a round trip conversion. + */ + return TRUE; + } - for (i = 0; i < 4; ++i) - unpacked[i] = (float) test->unpacked[i]; + memset(packed, 0, sizeof packed); + for (i = 0; i < format_desc->block.height; ++i) { + for (j = 0; j < format_desc->block.width; ++j) { + for (k = 0; k < 4; ++k) { + unpacked[i][j][k] = (float) test->unpacked[i][j][k]; + } + } + } - format_desc->pack_float(packed, 0, unpacked, 0, 1, 1); + format_desc->pack_float(packed, 0, &unpacked[0][0][0], sizeof unpacked[0], format_desc->block.width, format_desc->block.height); success = TRUE; - for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i) + for (i = 0; i < format_desc->block.bits/8; ++i) if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i])) success = FALSE; if (!success) { - /* TODO: print more than 4 bytes */ - printf("FAILED: (%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x) obtained\n", - packed[0], packed[1], packed[2], packed[3], - packed[4], packed[5], packed[6], packed[7], - packed[8], packed[9], packed[10], packed[11], - packed[12], packed[13], packed[14], packed[15]); - printf(" (%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x) expected\n", - test->packed[0], test->packed[1], test->packed[2], test->packed[3], - test->packed[4], test->packed[5], test->packed[6], test->packed[7], - test->packed[8], test->packed[9], test->packed[10], test->packed[11], - test->packed[12], test->packed[13], test->packed[14], test->packed[15]); + print_packed(format_desc, "FAILED: ", packed, " obtained\n"); + print_packed(format_desc, " ", test->packed, " expected\n"); } return success; @@ -133,7 +241,7 @@ convert_float_to_8unorm(uint8_t *dst, const double *src) unsigned i; boolean accurate = TRUE; - for (i = 0; i < 4; ++i) { + for (i = 0; i < UTIL_FORMAT_MAX_UNPACKED_HEIGHT*UTIL_FORMAT_MAX_UNPACKED_WIDTH*4; ++i) { if (src[i] < 0.0) { accurate = FALSE; dst[i] = 0; @@ -155,23 +263,29 @@ static boolean test_format_unpack_8unorm(const struct util_format_description *format_desc, const struct util_format_test_case *test) { - uint8_t unpacked[4]; - uint8_t expected[4]; - unsigned i; + uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } }; + uint8_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } }; + unsigned i, j, k; boolean success; - format_desc->unpack_8unorm(unpacked, 0, test->packed, 0, 1, 1); + format_desc->unpack_8unorm(&unpacked[0][0][0], sizeof unpacked[0], test->packed, 0, 1, 1); - convert_float_to_8unorm(expected, test->unpacked); + convert_float_to_8unorm(&expected[0][0][0], &test->unpacked[0][0][0]); success = TRUE; - for (i = 0; i < 4; ++i) - if (expected[i] != unpacked[i]) - success = FALSE; + for (i = 0; i < format_desc->block.height; ++i) { + for (j = 0; j < format_desc->block.width; ++j) { + for (k = 0; k < 4; ++k) { + if (expected[i][j][k] != unpacked[i][j][k]) { + success = FALSE; + } + } + } + } if (!success) { - printf("FAILED: (0x%02x 0x%02x 0x%02x 0x%02x) obtained\n", unpacked[0], unpacked[1], unpacked[2], unpacked[3]); - printf(" (0x%02x 0x%02x 0x%02x 0x%02x) expected\n", expected[0], expected[1], expected[2], expected[3]); + print_unpacked_8unorm(format_desc, "FAILED: ", unpacked, " obtained\n"); + print_unpacked_8unorm(format_desc, " ", expected, " expected\n"); } return success; @@ -182,12 +296,21 @@ static boolean test_format_pack_8unorm(const struct util_format_description *format_desc, const struct util_format_test_case *test) { - uint8_t unpacked[4]; + uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4]; uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES]; unsigned i; boolean success; - if (!convert_float_to_8unorm(unpacked, test->unpacked)) { + if (test->format == PIPE_FORMAT_DXT1_RGBA) { + /* + * Skip S3TC as packed representation is not canonical. + * + * TODO: Do a round trip conversion. + */ + return TRUE; + } + + if (!convert_float_to_8unorm(&unpacked[0][0][0], &test->unpacked[0][0][0])) { /* * Skip test cases which cannot be represented by four unorm bytes. */ @@ -196,25 +319,16 @@ test_format_pack_8unorm(const struct util_format_description *format_desc, memset(packed, 0, sizeof packed); - format_desc->pack_8unorm(packed, 0, unpacked, 0, 1, 1); + format_desc->pack_8unorm(packed, 0, &unpacked[0][0][0], sizeof unpacked[0], 1, 1); success = TRUE; - for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i) + for (i = 0; i < format_desc->block.bits/8; ++i) if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i])) success = FALSE; if (!success) { - /* TODO: print more than 4 bytes */ - printf("FAILED: (%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x) obtained\n", - packed[0], packed[1], packed[2], packed[3], - packed[4], packed[5], packed[6], packed[7], - packed[8], packed[9], packed[10], packed[11], - packed[12], packed[13], packed[14], packed[15]); - printf(" (%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x) expected\n", - test->packed[0], test->packed[1], test->packed[2], test->packed[3], - test->packed[4], test->packed[5], test->packed[6], test->packed[7], - test->packed[8], test->packed[9], test->packed[10], test->packed[11], - test->packed[12], test->packed[13], test->packed[14], test->packed[15]); + print_packed(format_desc, "FAILED: ", packed, " obtained\n"); + print_packed(format_desc, " ", test->packed, " expected\n"); } return success; @@ -236,15 +350,26 @@ test_one(test_func_t func, const char *suffix) for (i = 0; i < util_format_nr_test_cases; ++i) { const struct util_format_test_case *test = &util_format_test_cases[i]; const struct util_format_description *format_desc; + bool skip = FALSE; + format_desc = util_format_description(test->format); + if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC && + !util_format_s3tc_enabled) { + skip = TRUE; + } + if (test->format != last_format) { - printf("Testing util_format_%s_%s ...\n", format_desc->short_name, suffix); + printf("%s util_format_%s_%s ...\n", + skip ? "Skipping" : "Testing", format_desc->short_name, suffix); last_format = test->format; } - if (!func(format_desc, &util_format_test_cases[i])) - success = FALSE; + if (!skip) { + if (!func(format_desc, &util_format_test_cases[i])) { + success = FALSE; + } + } } return success; @@ -279,6 +404,8 @@ int main(int argc, char **argv) { boolean success; + util_format_s3tc_init(); + success = test_all(); return success ? 0 : 1; diff --git a/progs/gallium/unit/u_half_test.c b/progs/gallium/unit/u_half_test.c new file mode 100644 index 0000000000..9e3392e6d6 --- /dev/null +++ b/progs/gallium/unit/u_half_test.c @@ -0,0 +1,32 @@ +#include <stdlib.h> +#include <stdio.h> +#include <float.h> + +#include "util/u_math.h" +#include "util/u_half.h" + +int +main(int argc, char **argv) +{ + unsigned i; + unsigned roundtrip_fails = 0; + for(i = 0; i < 1 << 16; ++i) + { + half h = (half) i; + union fi f; + half rh; + f.ui = util_half_to_floatui(h); + rh = util_floatui_to_half(f.ui); + if(h != rh) + { + printf("Roundtrip failed: %x -> %x = %f -> %x\n", h, f.ui, f.f, rh); + ++roundtrip_fails; + } + } + + if(roundtrip_fails) + printf("Failure! %u/65536 half floats failed a conversion to float and back.\n", roundtrip_fails); + else + printf("Success!\n"); + return 0; +} |