From 325d55303d5920c137c0047e673a3940a99e4629 Mon Sep 17 00:00:00 2001 From: José Fonseca Date: Wed, 31 Mar 2010 14:31:29 +0100 Subject: util: Make util_format_xxx_pack_xxx take pointer as arguments. --- progs/gallium/unit/u_format_test.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'progs/gallium/unit/u_format_test.c') diff --git a/progs/gallium/unit/u_format_test.c b/progs/gallium/unit/u_format_test.c index 5274311e03..1aef416a7e 100644 --- a/progs/gallium/unit/u_format_test.c +++ b/progs/gallium/unit/u_format_test.c @@ -60,13 +60,17 @@ test_format_unpack_4f(const struct util_format_test_case *test) static boolean test_format_pack_4f(const struct util_format_test_case *test) { + float unpacked[4]; uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES]; unsigned i; boolean success; memset(packed, 0, sizeof packed); - util_format_pack_4f(test->format, packed, test->unpacked[0], test->unpacked[1], test->unpacked[2], test->unpacked[3]); + for (i = 0; i < 4; ++i) + unpacked[i] = (float) test->unpacked[i]; + + util_format_pack_4f(test->format, packed, unpacked); success = TRUE; for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i) @@ -158,7 +162,7 @@ test_format_pack_4ub(const struct util_format_test_case *test) memset(packed, 0, sizeof packed); - util_format_pack_4ub(test->format, packed, unpacked[0], unpacked[1], unpacked[2], unpacked[3]); + util_format_pack_4ub(test->format, packed, unpacked); success = TRUE; for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i) -- cgit v1.2.3 From e245ca74e11869750cafb1ab3fbb6957100c554b Mon Sep 17 00:00:00 2001 From: José Fonseca Date: Wed, 31 Mar 2010 14:43:09 +0100 Subject: util: Make pack/unpack operate on spans. --- progs/gallium/unit/u_format_test.c | 8 ++-- src/gallium/auxiliary/util/u_format_pack.py | 64 +++++++++++++++++------------ 2 files changed, 42 insertions(+), 30 deletions(-) (limited to 'progs/gallium/unit/u_format_test.c') diff --git a/progs/gallium/unit/u_format_test.c b/progs/gallium/unit/u_format_test.c index 1aef416a7e..303f4fa499 100644 --- a/progs/gallium/unit/u_format_test.c +++ b/progs/gallium/unit/u_format_test.c @@ -41,7 +41,7 @@ test_format_unpack_4f(const struct util_format_test_case *test) unsigned i; boolean success; - util_format_unpack_4f(test->format, unpacked, test->packed); + util_format_unpack_4f(test->format, unpacked, test->packed, 1); success = TRUE; for (i = 0; i < 4; ++i) @@ -70,7 +70,7 @@ test_format_pack_4f(const struct util_format_test_case *test) for (i = 0; i < 4; ++i) unpacked[i] = (float) test->unpacked[i]; - util_format_pack_4f(test->format, packed, unpacked); + util_format_pack_4f(test->format, packed, unpacked, 1); success = TRUE; for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i) @@ -127,7 +127,7 @@ test_format_unpack_4ub(const struct util_format_test_case *test) unsigned i; boolean success; - util_format_unpack_4ub(test->format, unpacked, test->packed); + util_format_unpack_4ub(test->format, unpacked, test->packed, 1); convert_4f_to_4ub(expected, test->unpacked); @@ -162,7 +162,7 @@ test_format_pack_4ub(const struct util_format_test_case *test) memset(packed, 0, sizeof packed); - util_format_pack_4ub(test->format, packed, unpacked); + util_format_pack_4ub(test->format, packed, unpacked, 1); success = TRUE; for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i) diff --git a/src/gallium/auxiliary/util/u_format_pack.py b/src/gallium/auxiliary/util/u_format_pack.py index 43468ecf56..e156b30203 100644 --- a/src/gallium/auxiliary/util/u_format_pack.py +++ b/src/gallium/auxiliary/util/u_format_pack.py @@ -311,24 +311,26 @@ def generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix): src_native_type = native_type(format) print 'static INLINE void' - print 'util_format_%s_unpack_%s(%s *dst, const void *src)' % (name, dst_suffix, dst_native_type) + print 'util_format_%s_unpack_%s(%s *dst, const uint8_t *src, unsigned length)' % (name, dst_suffix, dst_native_type) print '{' + print ' while(length--) {' + if format.is_bitmask(): depth = format.block_size() - print ' uint%u_t value = *(uint%u_t *)src;' % (depth, depth) + print ' uint%u_t value = *(uint%u_t *)src;' % (depth, depth) # Declare the intermediate variables for i in range(format.nr_channels()): src_channel = format.channels[i] if src_channel.type == UNSIGNED: - print ' uint%u_t %s;' % (depth, src_channel.name) + print ' uint%u_t %s;' % (depth, src_channel.name) elif src_channel.type == SIGNED: - print ' int%u_t %s;' % (depth, src_channel.name) + print ' int%u_t %s;' % (depth, src_channel.name) - print '#ifdef PIPE_ARCH_BIG_ENDIAN' - print ' value = util_bswap%u(value);' % depth - print '#endif' + print ' #ifdef PIPE_ARCH_BIG_ENDIAN' + print ' value = util_bswap%u(value);' % depth + print ' #endif' # Compute the intermediate unshifted values shift = 0 @@ -355,7 +357,7 @@ def generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix): value = None if value is not None: - print ' %s = %s;' % (src_channel.name, value) + print ' %s = %s;' % (src_channel.name, value) shift += src_channel.size @@ -379,11 +381,11 @@ def generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix): value = get_one(dst_channel) elif i >= 1: value = 'dst[0]' - print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) + print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) else: - print ' union util_format_%s pixel;' % format.short_name() - print ' memcpy(&pixel, src, sizeof pixel);' + print ' union util_format_%s pixel;' % format.short_name() + print ' memcpy(&pixel, src, sizeof pixel);' bswap_format(format) for i in range(4): @@ -405,7 +407,11 @@ def generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix): value = get_one(dst_channel) elif i >= 1: value = 'dst[0]' - print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) + print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) + + print ' src += %u;' % (format.block_size() / 8,) + print ' dst += 4;' + print ' }' print '}' print @@ -423,12 +429,14 @@ def generate_format_pack(format, src_channel, src_native_type, src_suffix): inv_swizzle = format.inv_swizzles() print 'static INLINE void' - print 'util_format_%s_pack_%s(void *dst, const %s *src)' % (name, src_suffix, src_native_type) + print 'util_format_%s_pack_%s(uint8_t *dst, const %s *src, unsigned length)' % (name, src_suffix, src_native_type) print '{' + print ' while(length--) {' + if format.is_bitmask(): depth = format.block_size() - print ' uint%u_t value = 0;' % depth + print ' uint%u_t value = 0;' % depth shift = 0 for i in range(4): @@ -452,18 +460,18 @@ def generate_format_pack(format, src_channel, src_native_type, src_suffix): else: value = None if value is not None: - print ' value |= %s;' % (value) + print ' value |= %s;' % (value) shift += dst_channel.size print '#ifdef PIPE_ARCH_BIG_ENDIAN' - print ' value = util_bswap%u(value);' % depth + print ' value = util_bswap%u(value);' % depth print '#endif' - print ' *(uint%u_t *)dst = value;' % depth + print ' *(uint%u_t *)dst = value;' % depth else: - print ' union util_format_%s pixel;' % format.short_name() + print ' union util_format_%s pixel;' % format.short_name() for i in range(4): dst_channel = format.channels[i] @@ -477,11 +485,15 @@ def generate_format_pack(format, src_channel, src_native_type, src_suffix): value = get_one(dst_channel) elif i >= 1: value = '0' - print ' pixel.chan.%s = %s;' % (dst_channel.name, value) + print ' pixel.chan.%s = %s;' % (dst_channel.name, value) bswap_format(format) - print ' memcpy(dst, &pixel, sizeof pixel);' + print ' memcpy(dst, &pixel, sizeof pixel);' + print ' src += 4;' + print ' dst += %u;' % (format.block_size() / 8,) + print ' }' + print '}' print @@ -494,9 +506,9 @@ def generate_unpack(formats, dst_channel, dst_native_type, dst_suffix): generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix) print 'static INLINE void' - print 'util_format_unpack_%s(enum pipe_format format, %s *dst, const void *src)' % (dst_suffix, dst_native_type) + print 'util_format_unpack_%s(enum pipe_format format, %s *dst, const uint8_t *src, unsigned length)' % (dst_suffix, dst_native_type) print '{' - print ' void (*func)(%s *dst, const void *src);' % dst_native_type + print ' void (*func)(%s *dst, const uint8_t *src, unsigned length);' % dst_native_type print ' switch(format) {' for format in formats: if is_format_supported(format): @@ -507,7 +519,7 @@ def generate_unpack(formats, dst_channel, dst_native_type, dst_suffix): print ' debug_printf("unsupported format\\n");' print ' return;' print ' }' - print ' func(dst, src);' + print ' func(dst, src, length);' print '}' print @@ -520,9 +532,9 @@ def generate_pack(formats, src_channel, src_native_type, src_suffix): generate_format_pack(format, src_channel, src_native_type, src_suffix) print 'static INLINE void' - print 'util_format_pack_%s(enum pipe_format format, void *dst, %s *src)' % (src_suffix, src_native_type) + print 'util_format_pack_%s(enum pipe_format format, uint8_t *dst, const %s *src, unsigned length)' % (src_suffix, src_native_type) print '{' - print ' void (*func)(void *dst, const %s *src);' % (src_native_type,) + print ' void (*func)(uint8_t *dst, const %s *src, unsigned length);' % (src_native_type,) print ' switch(format) {' for format in formats: if is_format_supported(format): @@ -533,7 +545,7 @@ def generate_pack(formats, src_channel, src_native_type, src_suffix): print ' debug_printf("%s: unsupported format\\n", __FUNCTION__);' print ' return;' print ' }' - print ' func(dst, src);' + print ' func(dst, src, length);' print '}' print -- cgit v1.2.3 From 96bf4aff5bd674bba5d83ab32c46024a686c1a1d Mon Sep 17 00:00:00 2001 From: José Fonseca Date: Wed, 31 Mar 2010 15:30:14 +0100 Subject: util: Put the format pack/unpack functions in the description table. --- progs/gallium/unit/u_format_test.c | 45 +-- src/gallium/auxiliary/Makefile | 6 +- src/gallium/auxiliary/SConscript | 7 - src/gallium/auxiliary/util/.gitignore | 1 - src/gallium/auxiliary/util/u_format.h | 17 ++ src/gallium/auxiliary/util/u_format_access.py | 2 +- src/gallium/auxiliary/util/u_format_pack.py | 389 +++++++++++--------------- src/gallium/auxiliary/util/u_format_table.py | 36 ++- 8 files changed, 245 insertions(+), 258 deletions(-) (limited to 'progs/gallium/unit/u_format_test.c') diff --git a/progs/gallium/unit/u_format_test.c b/progs/gallium/unit/u_format_test.c index 303f4fa499..e96f0a9d12 100644 --- a/progs/gallium/unit/u_format_test.c +++ b/progs/gallium/unit/u_format_test.c @@ -31,17 +31,17 @@ #include "util/u_format.h" #include "util/u_format_tests.h" -#include "util/u_format_pack.h" static boolean -test_format_unpack_4f(const struct util_format_test_case *test) +test_format_unpack_float(const struct util_format_description *format_desc, + const struct util_format_test_case *test) { float unpacked[4]; unsigned i; boolean success; - util_format_unpack_4f(test->format, unpacked, test->packed, 1); + format_desc->unpack_float(unpacked, test->packed, 1); success = TRUE; for (i = 0; i < 4; ++i) @@ -58,7 +58,8 @@ test_format_unpack_4f(const struct util_format_test_case *test) static boolean -test_format_pack_4f(const struct util_format_test_case *test) +test_format_pack_float(const struct util_format_description *format_desc, + const struct util_format_test_case *test) { float unpacked[4]; uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES]; @@ -70,7 +71,7 @@ test_format_pack_4f(const struct util_format_test_case *test) for (i = 0; i < 4; ++i) unpacked[i] = (float) test->unpacked[i]; - util_format_pack_4f(test->format, packed, unpacked, 1); + format_desc->pack_float(packed, unpacked, 1); success = TRUE; for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i) @@ -96,7 +97,7 @@ test_format_pack_4f(const struct util_format_test_case *test) static boolean -convert_4f_to_4ub(uint8_t *dst, const double *src) +convert_float_to_8unorm(uint8_t *dst, const double *src) { unsigned i; boolean accurate = TRUE; @@ -120,16 +121,17 @@ convert_4f_to_4ub(uint8_t *dst, const double *src) static boolean -test_format_unpack_4ub(const struct util_format_test_case *test) +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; boolean success; - util_format_unpack_4ub(test->format, unpacked, test->packed, 1); + format_desc->unpack_8unorm(unpacked, test->packed, 1); - convert_4f_to_4ub(expected, test->unpacked); + convert_float_to_8unorm(expected, test->unpacked); success = TRUE; for (i = 0; i < 4; ++i) @@ -146,14 +148,15 @@ test_format_unpack_4ub(const struct util_format_test_case *test) static boolean -test_format_pack_4ub(const struct util_format_test_case *test) +test_format_pack_8unorm(const struct util_format_description *format_desc, + const struct util_format_test_case *test) { uint8_t unpacked[4]; uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES]; unsigned i; boolean success; - if (!convert_4f_to_4ub(unpacked, test->unpacked)) { + if (!convert_float_to_8unorm(unpacked, test->unpacked)) { /* * Skip test cases which cannot be represented by four unorm bytes. */ @@ -162,7 +165,7 @@ test_format_pack_4ub(const struct util_format_test_case *test) memset(packed, 0, sizeof packed); - util_format_pack_4ub(test->format, packed, unpacked, 1); + format_desc->pack_8unorm(packed, unpacked, 1); success = TRUE; for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i) @@ -188,7 +191,8 @@ test_format_pack_4ub(const struct util_format_test_case *test) typedef boolean -(*test_func_t)(const struct util_format_test_case *test); +(*test_func_t)(const struct util_format_description *format_desc, + const struct util_format_test_case *test); static boolean @@ -200,14 +204,15 @@ 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; + format_desc = util_format_description(test->format); + if (test->format != last_format) { - const struct util_format_description *format_desc; - format_desc = util_format_description(test->format); printf("Testing util_format_%s_%s ...\n", format_desc->short_name, suffix); last_format = test->format; } - if (!func(&util_format_test_cases[i])) + if (!func(format_desc, &util_format_test_cases[i])) success = FALSE; } @@ -220,16 +225,16 @@ test_all(void) { bool success = TRUE; - if (!test_one(&test_format_pack_4f, "pack_4f")) + if (!test_one(&test_format_pack_float, "pack_float")) success = FALSE; - if (!test_one(&test_format_unpack_4f, "unpack_4f")) + if (!test_one(&test_format_unpack_float, "unpack_float")) success = FALSE; - if (!test_one(&test_format_pack_4ub, "pack_4ub")) + if (!test_one(&test_format_pack_8unorm, "pack_8unorm")) success = FALSE; - if (!test_one(&test_format_unpack_4ub, "unpack_4ub")) + if (!test_one(&test_format_unpack_8unorm, "unpack_8unorm")) success = FALSE; return success; diff --git a/src/gallium/auxiliary/Makefile b/src/gallium/auxiliary/Makefile index 1b75915ff2..903c5a331c 100644 --- a/src/gallium/auxiliary/Makefile +++ b/src/gallium/auxiliary/Makefile @@ -168,7 +168,6 @@ GENERATED_SOURCES = \ indices/u_indices_gen.c \ indices/u_unfilled_gen.c \ util/u_format_access.c \ - util/u_format_pack.h \ util/u_format_table.c @@ -192,12 +191,9 @@ indices/u_indices_gen.c: indices/u_indices_gen.py indices/u_unfilled_gen.c: indices/u_unfilled_gen.py python $< > $@ -util/u_format_table.c: util/u_format_table.py util/u_format_parse.py util/u_format.csv +util/u_format_table.c: util/u_format_table.py util/u_format_pack.py util/u_format_parse.py util/u_format.csv python util/u_format_table.py util/u_format.csv > $@ -util/u_format_pack.h: util/u_format_pack.py util/u_format_parse.py util/u_format.csv - python util/u_format_pack.py util/u_format.csv > $@ - util/u_format_access.c: util/u_format_access.py util/u_format_parse.py util/u_format.csv python util/u_format_access.py util/u_format.csv > $@ diff --git a/src/gallium/auxiliary/SConscript b/src/gallium/auxiliary/SConscript index 8cf13fc293..772ab41523 100644 --- a/src/gallium/auxiliary/SConscript +++ b/src/gallium/auxiliary/SConscript @@ -30,13 +30,6 @@ env.CodeGenerate( command = 'python $SCRIPT $SOURCE > $TARGET' ) -env.CodeGenerate( - target = File('util/u_format_pack.h').srcnode(), - script = 'util/u_format_pack.py', - source = ['util/u_format.csv'], - command = 'python $SCRIPT $SOURCE > $TARGET' -) - env.CodeGenerate( target = 'util/u_format_access.c', script = 'util/u_format_access.py', diff --git a/src/gallium/auxiliary/util/.gitignore b/src/gallium/auxiliary/util/.gitignore index 448d2f304f..29c586c9b5 100644 --- a/src/gallium/auxiliary/util/.gitignore +++ b/src/gallium/auxiliary/util/.gitignore @@ -1,3 +1,2 @@ u_format_access.c u_format_table.c -u_format_pack.h diff --git a/src/gallium/auxiliary/util/u_format.h b/src/gallium/auxiliary/util/u_format.h index 4d59b9927d..609d398ebf 100644 --- a/src/gallium/auxiliary/util/u_format.h +++ b/src/gallium/auxiliary/util/u_format.h @@ -189,6 +189,23 @@ struct util_format_description * Colorspace transformation. */ enum util_format_colorspace colorspace; + + /** + * Accessor functions. + */ + + void + (*unpack_8unorm)(uint8_t *dst, const uint8_t *src, unsigned nr_blocks); + + void + (*pack_8unorm)(uint8_t *dst, const uint8_t *src, unsigned nr_blocks); + + void + (*unpack_float)(float *dst, const uint8_t *src, unsigned nr_blocks); + + void + (*pack_float)(uint8_t *dst, const float *src, unsigned nr_blocks); + }; diff --git a/src/gallium/auxiliary/util/u_format_access.py b/src/gallium/auxiliary/util/u_format_access.py index a5cb67f7e4..c85f538626 100644 --- a/src/gallium/auxiliary/util/u_format_access.py +++ b/src/gallium/auxiliary/util/u_format_access.py @@ -317,7 +317,7 @@ def main(): print print '#include "pipe/p_compiler.h"' print '#include "u_math.h"' - print '#include "u_format_pack.h"' + print '#include "u_format.h"' print generate_srgb_tables() diff --git a/src/gallium/auxiliary/util/u_format_pack.py b/src/gallium/auxiliary/util/u_format_pack.py index e156b30203..28a9dad60e 100644 --- a/src/gallium/auxiliary/util/u_format_pack.py +++ b/src/gallium/auxiliary/util/u_format_pack.py @@ -304,114 +304,116 @@ def conversion_expr(src_channel, dst_channel, dst_native_type, value, clamp=True def generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix): '''Generate the function to unpack pixels from a particular format''' - assert format.layout == PLAIN - name = format.short_name() - src_native_type = native_type(format) - print 'static INLINE void' print 'util_format_%s_unpack_%s(%s *dst, const uint8_t *src, unsigned length)' % (name, dst_suffix, dst_native_type) print '{' + + if is_format_supported(format): + + assert format.layout == PLAIN - print ' while(length--) {' + src_native_type = native_type(format) - if format.is_bitmask(): - depth = format.block_size() - print ' uint%u_t value = *(uint%u_t *)src;' % (depth, depth) - - # Declare the intermediate variables - for i in range(format.nr_channels()): - src_channel = format.channels[i] - if src_channel.type == UNSIGNED: - print ' uint%u_t %s;' % (depth, src_channel.name) - elif src_channel.type == SIGNED: - print ' int%u_t %s;' % (depth, src_channel.name) - - print ' #ifdef PIPE_ARCH_BIG_ENDIAN' - print ' value = util_bswap%u(value);' % depth - print ' #endif' - - # Compute the intermediate unshifted values - shift = 0 - for i in range(format.nr_channels()): - src_channel = format.channels[i] - value = 'value' - if src_channel.type == UNSIGNED: - if shift: - value = '%s >> %u' % (value, shift) - if shift + src_channel.size < depth: - value = '(%s) & 0x%x' % (value, (1 << src_channel.size) - 1) - elif src_channel.type == SIGNED: - if shift + src_channel.size < depth: - # Align the sign bit - lshift = depth - (shift + src_channel.size) - value = '%s << %u' % (value, lshift) - # Cast to signed - value = '(int%u_t)(%s) ' % (depth, value) - if src_channel.size < depth: - # Align the LSB bit - rshift = depth - src_channel.size - value = '(%s) >> %u' % (value, rshift) - else: - value = None - - if value is not None: - print ' %s = %s;' % (src_channel.name, value) - - shift += src_channel.size - - # Convert, swizzle, and store final values - for i in range(4): - swizzle = format.swizzles[i] - if swizzle < 4: - src_channel = format.channels[swizzle] - value = src_channel.name - value = conversion_expr(src_channel, dst_channel, dst_native_type, value) - elif swizzle == SWIZZLE_0: - value = '0' - elif swizzle == SWIZZLE_1: - value = get_one(dst_channel) - elif swizzle == SWIZZLE_NONE: - value = '0' - else: - assert False - if format.colorspace == ZS: - if i == 3: + print ' while(length--) {' + + if format.is_bitmask(): + depth = format.block_size() + print ' uint%u_t value = *(uint%u_t *)src;' % (depth, depth) + + # Declare the intermediate variables + for i in range(format.nr_channels()): + src_channel = format.channels[i] + if src_channel.type == UNSIGNED: + print ' uint%u_t %s;' % (depth, src_channel.name) + elif src_channel.type == SIGNED: + print ' int%u_t %s;' % (depth, src_channel.name) + + print ' #ifdef PIPE_ARCH_BIG_ENDIAN' + print ' value = util_bswap%u(value);' % depth + print ' #endif' + + # Compute the intermediate unshifted values + shift = 0 + for i in range(format.nr_channels()): + src_channel = format.channels[i] + value = 'value' + if src_channel.type == UNSIGNED: + if shift: + value = '%s >> %u' % (value, shift) + if shift + src_channel.size < depth: + value = '(%s) & 0x%x' % (value, (1 << src_channel.size) - 1) + elif src_channel.type == SIGNED: + if shift + src_channel.size < depth: + # Align the sign bit + lshift = depth - (shift + src_channel.size) + value = '%s << %u' % (value, lshift) + # Cast to signed + value = '(int%u_t)(%s) ' % (depth, value) + if src_channel.size < depth: + # Align the LSB bit + rshift = depth - src_channel.size + value = '(%s) >> %u' % (value, rshift) + else: + value = None + + if value is not None: + print ' %s = %s;' % (src_channel.name, value) + + shift += src_channel.size + + # Convert, swizzle, and store final values + for i in range(4): + swizzle = format.swizzles[i] + if swizzle < 4: + src_channel = format.channels[swizzle] + value = src_channel.name + value = conversion_expr(src_channel, dst_channel, dst_native_type, value) + elif swizzle == SWIZZLE_0: + value = '0' + elif swizzle == SWIZZLE_1: value = get_one(dst_channel) - elif i >= 1: - value = 'dst[0]' - print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) + elif swizzle == SWIZZLE_NONE: + value = '0' + else: + assert False + if format.colorspace == ZS: + if i == 3: + value = get_one(dst_channel) + elif i >= 1: + value = 'dst[0]' + print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) + + else: + print ' union util_format_%s pixel;' % format.short_name() + print ' memcpy(&pixel, src, sizeof pixel);' + bswap_format(format) - else: - print ' union util_format_%s pixel;' % format.short_name() - print ' memcpy(&pixel, src, sizeof pixel);' - bswap_format(format) - - for i in range(4): - swizzle = format.swizzles[i] - if swizzle < 4: - src_channel = format.channels[swizzle] - value = 'pixel.chan.%s' % src_channel.name - value = conversion_expr(src_channel, dst_channel, dst_native_type, value) - elif swizzle == SWIZZLE_0: - value = '0' - elif swizzle == SWIZZLE_1: - value = get_one(dst_channel) - elif swizzle == SWIZZLE_NONE: - value = '0' - else: - assert False - if format.colorspace == ZS: - if i == 3: + for i in range(4): + swizzle = format.swizzles[i] + if swizzle < 4: + src_channel = format.channels[swizzle] + value = 'pixel.chan.%s' % src_channel.name + value = conversion_expr(src_channel, dst_channel, dst_native_type, value) + elif swizzle == SWIZZLE_0: + value = '0' + elif swizzle == SWIZZLE_1: value = get_one(dst_channel) - elif i >= 1: - value = 'dst[0]' - print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) - - print ' src += %u;' % (format.block_size() / 8,) - print ' dst += 4;' - print ' }' + elif swizzle == SWIZZLE_NONE: + value = '0' + else: + assert False + if format.colorspace == ZS: + if i == 3: + value = get_one(dst_channel) + elif i >= 1: + value = 'dst[0]' + print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) + + print ' src += %u;' % (format.block_size() / 8,) + print ' dst += 4;' + print ' }' print '}' print @@ -422,26 +424,63 @@ def generate_format_pack(format, src_channel, src_native_type, src_suffix): name = format.short_name() - dst_native_type = native_type(format) - - assert format.layout == PLAIN - - inv_swizzle = format.inv_swizzles() - print 'static INLINE void' print 'util_format_%s_pack_%s(uint8_t *dst, const %s *src, unsigned length)' % (name, src_suffix, src_native_type) print '{' - print ' while(length--) {' - - if format.is_bitmask(): - depth = format.block_size() - print ' uint%u_t value = 0;' % depth - - shift = 0 - for i in range(4): - dst_channel = format.channels[i] - if inv_swizzle[i] is not None: + if is_format_supported(format): + dst_native_type = native_type(format) + + assert format.layout == PLAIN + + inv_swizzle = format.inv_swizzles() + + print ' while(length--) {' + + if format.is_bitmask(): + depth = format.block_size() + print ' uint%u_t value = 0;' % depth + + shift = 0 + for i in range(4): + dst_channel = format.channels[i] + if inv_swizzle[i] is not None: + value ='src[%u]' % inv_swizzle[i] + value = conversion_expr(src_channel, dst_channel, dst_native_type, value) + if format.colorspace == ZS: + if i == 3: + value = get_one(dst_channel) + elif i >= 1: + value = '0' + if dst_channel.type in (UNSIGNED, SIGNED): + if shift + dst_channel.size < depth: + value = '(%s) & 0x%x' % (value, (1 << dst_channel.size) - 1) + if shift: + value = '(%s) << %u' % (value, shift) + if dst_channel.type == SIGNED: + # Cast to unsigned + value = '(uint%u_t)(%s) ' % (depth, value) + else: + value = None + if value is not None: + print ' value |= %s;' % (value) + + shift += dst_channel.size + + print '#ifdef PIPE_ARCH_BIG_ENDIAN' + print ' value = util_bswap%u(value);' % depth + print '#endif' + + print ' *(uint%u_t *)dst = value;' % depth + + else: + print ' union util_format_%s pixel;' % format.short_name() + + for i in range(4): + dst_channel = format.channels[i] + width = dst_channel.size + if inv_swizzle[i] is None: + continue value ='src[%u]' % inv_swizzle[i] value = conversion_expr(src_channel, dst_channel, dst_native_type, value) if format.colorspace == ZS: @@ -449,50 +488,14 @@ def generate_format_pack(format, src_channel, src_native_type, src_suffix): value = get_one(dst_channel) elif i >= 1: value = '0' - if dst_channel.type in (UNSIGNED, SIGNED): - if shift + dst_channel.size < depth: - value = '(%s) & 0x%x' % (value, (1 << dst_channel.size) - 1) - if shift: - value = '(%s) << %u' % (value, shift) - if dst_channel.type == SIGNED: - # Cast to unsigned - value = '(uint%u_t)(%s) ' % (depth, value) - else: - value = None - if value is not None: - print ' value |= %s;' % (value) - - shift += dst_channel.size - - print '#ifdef PIPE_ARCH_BIG_ENDIAN' - print ' value = util_bswap%u(value);' % depth - print '#endif' - - print ' *(uint%u_t *)dst = value;' % depth - - else: - print ' union util_format_%s pixel;' % format.short_name() - - for i in range(4): - dst_channel = format.channels[i] - width = dst_channel.size - if inv_swizzle[i] is None: - continue - value ='src[%u]' % inv_swizzle[i] - value = conversion_expr(src_channel, dst_channel, dst_native_type, value) - if format.colorspace == ZS: - if i == 3: - value = get_one(dst_channel) - elif i >= 1: - value = '0' - print ' pixel.chan.%s = %s;' % (dst_channel.name, value) - - bswap_format(format) - print ' memcpy(dst, &pixel, sizeof pixel);' + print ' pixel.chan.%s = %s;' % (dst_channel.name, value) - print ' src += 4;' - print ' dst += %u;' % (format.block_size() / 8,) - print ' }' + bswap_format(format) + print ' memcpy(dst, &pixel, sizeof pixel);' + + print ' src += 4;' + print ' dst += %u;' % (format.block_size() / 8,) + print ' }' print '}' print @@ -502,67 +505,17 @@ def generate_unpack(formats, dst_channel, dst_native_type, dst_suffix): '''Generate the dispatch function to unpack pixels from any format''' for format in formats: - if is_format_supported(format): - generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix) - - print 'static INLINE void' - print 'util_format_unpack_%s(enum pipe_format format, %s *dst, const uint8_t *src, unsigned length)' % (dst_suffix, dst_native_type) - print '{' - print ' void (*func)(%s *dst, const uint8_t *src, unsigned length);' % dst_native_type - print ' switch(format) {' - for format in formats: - if is_format_supported(format): - print ' case %s:' % format.name - print ' func = &util_format_%s_unpack_%s;' % (format.short_name(), dst_suffix) - print ' break;' - print ' default:' - print ' debug_printf("unsupported format\\n");' - print ' return;' - print ' }' - print ' func(dst, src, length);' - print '}' - print + generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix) def generate_pack(formats, src_channel, src_native_type, src_suffix): '''Generate the dispatch function to pack pixels to any format''' for format in formats: - if is_format_supported(format): - generate_format_pack(format, src_channel, src_native_type, src_suffix) - - print 'static INLINE void' - print 'util_format_pack_%s(enum pipe_format format, uint8_t *dst, const %s *src, unsigned length)' % (src_suffix, src_native_type) - print '{' - print ' void (*func)(uint8_t *dst, const %s *src, unsigned length);' % (src_native_type,) - print ' switch(format) {' - for format in formats: - if is_format_supported(format): - print ' case %s:' % format.name - print ' func = &util_format_%s_pack_%s;' % (format.short_name(), src_suffix) - print ' break;' - print ' default:' - print ' debug_printf("%s: unsupported format\\n", __FUNCTION__);' - print ' return;' - print ' }' - print ' func(dst, src, length);' - print '}' - print - + generate_format_pack(format, src_channel, src_native_type, src_suffix) -def main(): - formats = [] - for arg in sys.argv[1:]: - formats.extend(parse(arg)) - print '/* This file is autogenerated by u_format_pack.py from u_format.csv. Do not edit directly. */' - print - # This will print the copyright message on the top of this file - print __doc__.strip() - - print - print '#ifndef U_FORMAT_PACK_H' - print '#define U_FORMAT_PACK_H' +def generate(formats): print print '#include "pipe/p_compiler.h"' print '#include "u_math.h"' @@ -572,30 +525,20 @@ def main(): generate_clamp() for format in formats: - if format.layout == PLAIN: + if is_format_supported(format): generate_format_type(format) channel = Channel(FLOAT, False, 32) native_type = 'float' - suffix = '4f' + suffix = 'float' generate_unpack(formats, channel, native_type, suffix) generate_pack(formats, channel, native_type, suffix) channel = Channel(UNSIGNED, True, 8) native_type = 'uint8_t' - suffix = '4ub' + suffix = '8unorm' generate_unpack(formats, channel, native_type, suffix) generate_pack(formats, channel, native_type, suffix) - print - print '#ifdef __cplusplus' - print '}' - print '#endif' - print - print '#endif /* ! U_FORMAT_PACK_H */' - - -if __name__ == '__main__': - main() diff --git a/src/gallium/auxiliary/util/u_format_table.py b/src/gallium/auxiliary/util/u_format_table.py index fb68852a53..fe910d9a77 100755 --- a/src/gallium/auxiliary/util/u_format_table.py +++ b/src/gallium/auxiliary/util/u_format_table.py @@ -33,6 +33,7 @@ import sys from u_format_parse import * +import u_format_pack def layout_map(layout): @@ -86,6 +87,27 @@ def write_format_table(formats): print print '#include "u_format.h"' print + print ''' +static void +util_format_none_unpack_8unorm(uint8_t *dst, const uint8_t *src, unsigned length) +{ +} + +static void +util_format_none_pack_8unorm(uint8_t *dst, const uint8_t *src, unsigned length) +{ +} + +static void +util_format_none_unpack_float(float *dst, const uint8_t *src, unsigned length) +{ +} + +static void +util_format_none_pack_float(uint8_t *dst, const float *src, unsigned length) +{ +} + ''' print 'const struct util_format_description' print 'util_format_none_description = {' print " PIPE_FORMAT_NONE," @@ -99,9 +121,16 @@ def write_format_table(formats): print " 0," print " {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}}," print " {0, 0, 0, 0}," - print " 0" + print " 0," + print " &util_format_none_unpack_8unorm," + print " &util_format_none_pack_8unorm," + print " &util_format_none_unpack_float," + print " &util_format_none_pack_float" print "};" print + + u_format_pack.generate(formats) + for format in formats: print 'const struct util_format_description' print 'util_format_%s_description = {' % (format.short_name(),) @@ -140,8 +169,13 @@ def write_format_table(formats): print " %s%s\t/* %s */" % (swizzle_map[swizzle], sep, comment) print " }," print " %s," % (colorspace_map(format.colorspace),) + print " &util_format_%s_unpack_8unorm," % format.short_name() + print " &util_format_%s_pack_8unorm," % format.short_name() + print " &util_format_%s_unpack_float," % format.short_name() + print " &util_format_%s_pack_float" % format.short_name() print "};" print + print "const struct util_format_description *" print "util_format_description(enum pipe_format format)" print "{" -- cgit v1.2.3 From 69895725cfe9d4dc917ff6e643af9e6e3a6e093f Mon Sep 17 00:00:00 2001 From: José Fonseca Date: Wed, 31 Mar 2010 20:15:17 +0100 Subject: util: Add callback to fetch a single pixel. --- progs/gallium/unit/u_format_test.c | 34 +++ src/gallium/auxiliary/util/u_format.h | 17 +- src/gallium/auxiliary/util/u_format_pack.py | 360 ++++++++++++++------------- src/gallium/auxiliary/util/u_format_table.py | 11 +- 4 files changed, 248 insertions(+), 174 deletions(-) (limited to 'progs/gallium/unit/u_format_test.c') diff --git a/progs/gallium/unit/u_format_test.c b/progs/gallium/unit/u_format_test.c index e96f0a9d12..ba4e9fab66 100644 --- a/progs/gallium/unit/u_format_test.c +++ b/progs/gallium/unit/u_format_test.c @@ -33,6 +33,37 @@ #include "util/u_format_tests.h" +static boolean +test_format_fetch_float(const struct util_format_description *format_desc, + const struct util_format_test_case *test) +{ + float unpacked[4]; + unsigned i; + boolean success; + + /* + * TODO: test block formats too. + */ + if (format_desc->block.width != 1 && format_desc->block.height != 1) { + return TRUE; + } + + format_desc->fetch_float(unpacked, test->packed, 0, 0); + + success = TRUE; + for (i = 0; i < 4; ++i) + if (test->unpacked[i] != unpacked[i]) + 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]); + } + + return success; +} + + static boolean test_format_unpack_float(const struct util_format_description *format_desc, const struct util_format_test_case *test) @@ -225,6 +256,9 @@ test_all(void) { bool success = TRUE; + if (!test_one(&test_format_fetch_float, "fetch_float")) + success = FALSE; + if (!test_one(&test_format_pack_float, "pack_float")) success = FALSE; diff --git a/src/gallium/auxiliary/util/u_format.h b/src/gallium/auxiliary/util/u_format.h index 609d398ebf..8e76e13b66 100644 --- a/src/gallium/auxiliary/util/u_format.h +++ b/src/gallium/auxiliary/util/u_format.h @@ -191,21 +191,34 @@ struct util_format_description enum util_format_colorspace colorspace; /** - * Accessor functions. + * Unpack a span of pixel blocks to R8G8B8A8_UNORM. */ - void (*unpack_8unorm)(uint8_t *dst, const uint8_t *src, unsigned nr_blocks); + /** + * Pack a span of pixel blocks from R8G8B8A8_UNORM. + */ void (*pack_8unorm)(uint8_t *dst, const uint8_t *src, unsigned nr_blocks); + /** + * Unpack a span of pixel blocks to R32G32B32A32_FLOAT. + */ void (*unpack_float)(float *dst, const uint8_t *src, unsigned nr_blocks); + /** + * Pack a span of pixel blocks from R32G32B32A32_FLOAT. + */ void (*pack_float)(uint8_t *dst, const float *src, unsigned nr_blocks); + /** + * Fetch a single pixel (i, j) from a block. + */ + void + (*fetch_float)(float *dst, const uint8_t *src, unsigned i, unsigned j); }; diff --git a/src/gallium/auxiliary/util/u_format_pack.py b/src/gallium/auxiliary/util/u_format_pack.py index 4831912f02..c74900ce63 100644 --- a/src/gallium/auxiliary/util/u_format_pack.py +++ b/src/gallium/auxiliary/util/u_format_pack.py @@ -324,115 +324,190 @@ def conversion_expr(src_channel, dst_channel, dst_native_type, value, clamp=True assert False -def generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix): - '''Generate the function to unpack pixels from a particular format''' - - name = format.short_name() - - print 'static INLINE void' - print 'util_format_%s_unpack_%s(%s *dst, const uint8_t *src, unsigned length)' % (name, dst_suffix, dst_native_type) - print '{' +def generate_unpack_kernel(format, dst_channel, dst_native_type): - if is_format_supported(format): - - assert format.layout == PLAIN - - src_native_type = native_type(format) - - print ' while(length--) {' - - if format.is_bitmask(): - depth = format.block_size() - print ' uint%u_t value = *(uint%u_t *)src;' % (depth, depth) + if not is_format_supported(format): + return - # Declare the intermediate variables - for i in range(format.nr_channels()): - src_channel = format.channels[i] - if src_channel.type == UNSIGNED: - print ' uint%u_t %s;' % (depth, src_channel.name) - elif src_channel.type == SIGNED: - print ' int%u_t %s;' % (depth, src_channel.name) + assert format.layout == PLAIN + + src_native_type = native_type(format) + + if format.is_bitmask(): + depth = format.block_size() + print ' uint%u_t value = *(uint%u_t *)src;' % (depth, depth) + + # Declare the intermediate variables + for i in range(format.nr_channels()): + src_channel = format.channels[i] + if src_channel.type == UNSIGNED: + print ' uint%u_t %s;' % (depth, src_channel.name) + elif src_channel.type == SIGNED: + print ' int%u_t %s;' % (depth, src_channel.name) + + print ' #ifdef PIPE_ARCH_BIG_ENDIAN' + print ' value = util_bswap%u(value);' % depth + print ' #endif' + + # Compute the intermediate unshifted values + shift = 0 + for i in range(format.nr_channels()): + src_channel = format.channels[i] + value = 'value' + if src_channel.type == UNSIGNED: + if shift: + value = '%s >> %u' % (value, shift) + if shift + src_channel.size < depth: + value = '(%s) & 0x%x' % (value, (1 << src_channel.size) - 1) + elif src_channel.type == SIGNED: + if shift + src_channel.size < depth: + # Align the sign bit + lshift = depth - (shift + src_channel.size) + value = '%s << %u' % (value, lshift) + # Cast to signed + value = '(int%u_t)(%s) ' % (depth, value) + if src_channel.size < depth: + # Align the LSB bit + rshift = depth - src_channel.size + value = '(%s) >> %u' % (value, rshift) + else: + value = None + + if value is not None: + print ' %s = %s;' % (src_channel.name, value) + + shift += src_channel.size + + # Convert, swizzle, and store final values + for i in range(4): + swizzle = format.swizzles[i] + if swizzle < 4: + src_channel = format.channels[swizzle] + value = src_channel.name + value = conversion_expr(src_channel, dst_channel, dst_native_type, value) + elif swizzle == SWIZZLE_0: + value = '0' + elif swizzle == SWIZZLE_1: + value = get_one(dst_channel) + elif swizzle == SWIZZLE_NONE: + value = '0' + else: + assert False + if format.colorspace == ZS: + if i == 3: + value = get_one(dst_channel) + elif i >= 1: + value = 'dst[0]' + print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) + + else: + print ' union util_format_%s pixel;' % format.short_name() + print ' memcpy(&pixel, src, sizeof pixel);' + bswap_format(format) - print ' #ifdef PIPE_ARCH_BIG_ENDIAN' - print ' value = util_bswap%u(value);' % depth - print ' #endif' + for i in range(4): + swizzle = format.swizzles[i] + if swizzle < 4: + src_channel = format.channels[swizzle] + value = 'pixel.chan.%s' % src_channel.name + value = conversion_expr(src_channel, dst_channel, dst_native_type, value) + elif swizzle == SWIZZLE_0: + value = '0' + elif swizzle == SWIZZLE_1: + value = get_one(dst_channel) + elif swizzle == SWIZZLE_NONE: + value = '0' + else: + assert False + if format.colorspace == ZS: + if i == 3: + value = get_one(dst_channel) + elif i >= 1: + value = 'dst[0]' + print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) - # Compute the intermediate unshifted values - shift = 0 - for i in range(format.nr_channels()): - src_channel = format.channels[i] - value = 'value' - if src_channel.type == UNSIGNED: - if shift: - value = '%s >> %u' % (value, shift) - if shift + src_channel.size < depth: - value = '(%s) & 0x%x' % (value, (1 << src_channel.size) - 1) - elif src_channel.type == SIGNED: - if shift + src_channel.size < depth: - # Align the sign bit - lshift = depth - (shift + src_channel.size) - value = '%s << %u' % (value, lshift) - # Cast to signed - value = '(int%u_t)(%s) ' % (depth, value) - if src_channel.size < depth: - # Align the LSB bit - rshift = depth - src_channel.size - value = '(%s) >> %u' % (value, rshift) - else: - value = None - - if value is not None: - print ' %s = %s;' % (src_channel.name, value) - - shift += src_channel.size + +def generate_pack_kernel(format, src_channel, src_native_type): + + if not is_format_supported(format): + return - # Convert, swizzle, and store final values - for i in range(4): - swizzle = format.swizzles[i] - if swizzle < 4: - src_channel = format.channels[swizzle] - value = src_channel.name - value = conversion_expr(src_channel, dst_channel, dst_native_type, value) - elif swizzle == SWIZZLE_0: - value = '0' - elif swizzle == SWIZZLE_1: - value = get_one(dst_channel) - elif swizzle == SWIZZLE_NONE: - value = '0' - else: - assert False + dst_native_type = native_type(format) + + assert format.layout == PLAIN + + inv_swizzle = format.inv_swizzles() + + if format.is_bitmask(): + depth = format.block_size() + print ' uint%u_t value = 0;' % depth + + shift = 0 + for i in range(4): + dst_channel = format.channels[i] + if inv_swizzle[i] is not None: + value ='src[%u]' % inv_swizzle[i] + value = conversion_expr(src_channel, dst_channel, dst_native_type, value) if format.colorspace == ZS: if i == 3: value = get_one(dst_channel) elif i >= 1: - value = 'dst[0]' - print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) - - else: - print ' union util_format_%s pixel;' % format.short_name() - print ' memcpy(&pixel, src, sizeof pixel);' - bswap_format(format) + value = '0' + if dst_channel.type in (UNSIGNED, SIGNED): + if shift + dst_channel.size < depth: + value = '(%s) & 0x%x' % (value, (1 << dst_channel.size) - 1) + if shift: + value = '(%s) << %u' % (value, shift) + if dst_channel.type == SIGNED: + # Cast to unsigned + value = '(uint%u_t)(%s) ' % (depth, value) + else: + value = None + if value is not None: + print ' value |= %s;' % (value) + + shift += dst_channel.size + + print '#ifdef PIPE_ARCH_BIG_ENDIAN' + print ' value = util_bswap%u(value);' % depth + print '#endif' - for i in range(4): - swizzle = format.swizzles[i] - if swizzle < 4: - src_channel = format.channels[swizzle] - value = 'pixel.chan.%s' % src_channel.name - value = conversion_expr(src_channel, dst_channel, dst_native_type, value) - elif swizzle == SWIZZLE_0: - value = '0' - elif swizzle == SWIZZLE_1: + print ' *(uint%u_t *)dst = value;' % depth + + else: + print ' union util_format_%s pixel;' % format.short_name() + + for i in range(4): + dst_channel = format.channels[i] + width = dst_channel.size + if inv_swizzle[i] is None: + continue + value ='src[%u]' % inv_swizzle[i] + value = conversion_expr(src_channel, dst_channel, dst_native_type, value) + if format.colorspace == ZS: + if i == 3: value = get_one(dst_channel) - elif swizzle == SWIZZLE_NONE: + elif i >= 1: value = '0' - else: - assert False - if format.colorspace == ZS: - if i == 3: - value = get_one(dst_channel) - elif i >= 1: - value = 'dst[0]' - print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) + print ' pixel.chan.%s = %s;' % (dst_channel.name, value) + + bswap_format(format) + print ' memcpy(dst, &pixel, sizeof pixel);' + + +def generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix): + '''Generate the function to unpack pixels from a particular format''' + + name = format.short_name() + + print 'static INLINE void' + print 'util_format_%s_unpack_%s(%s *dst, const uint8_t *src, unsigned length)' % (name, dst_suffix, dst_native_type) + print '{' + + if is_format_supported(format): + print ' while(length--) {' + + generate_unpack_kernel(format, dst_channel, dst_native_type) print ' src += %u;' % (format.block_size() / 8,) print ' dst += 4;' @@ -452,69 +527,9 @@ def generate_format_pack(format, src_channel, src_native_type, src_suffix): print '{' if is_format_supported(format): - dst_native_type = native_type(format) - - assert format.layout == PLAIN - - inv_swizzle = format.inv_swizzles() - print ' while(length--) {' - if format.is_bitmask(): - depth = format.block_size() - print ' uint%u_t value = 0;' % depth - - shift = 0 - for i in range(4): - dst_channel = format.channels[i] - if inv_swizzle[i] is not None: - value ='src[%u]' % inv_swizzle[i] - value = conversion_expr(src_channel, dst_channel, dst_native_type, value) - if format.colorspace == ZS: - if i == 3: - value = get_one(dst_channel) - elif i >= 1: - value = '0' - if dst_channel.type in (UNSIGNED, SIGNED): - if shift + dst_channel.size < depth: - value = '(%s) & 0x%x' % (value, (1 << dst_channel.size) - 1) - if shift: - value = '(%s) << %u' % (value, shift) - if dst_channel.type == SIGNED: - # Cast to unsigned - value = '(uint%u_t)(%s) ' % (depth, value) - else: - value = None - if value is not None: - print ' value |= %s;' % (value) - - shift += dst_channel.size - - print '#ifdef PIPE_ARCH_BIG_ENDIAN' - print ' value = util_bswap%u(value);' % depth - print '#endif' - - print ' *(uint%u_t *)dst = value;' % depth - - else: - print ' union util_format_%s pixel;' % format.short_name() - - for i in range(4): - dst_channel = format.channels[i] - width = dst_channel.size - if inv_swizzle[i] is None: - continue - value ='src[%u]' % inv_swizzle[i] - value = conversion_expr(src_channel, dst_channel, dst_native_type, value) - if format.colorspace == ZS: - if i == 3: - value = get_one(dst_channel) - elif i >= 1: - value = '0' - print ' pixel.chan.%s = %s;' % (dst_channel.name, value) - - bswap_format(format) - print ' memcpy(dst, &pixel, sizeof pixel);' + generate_pack_kernel(format, src_channel, src_native_type) print ' src += 4;' print ' dst += %u;' % (format.block_size() / 8,) @@ -524,18 +539,20 @@ def generate_format_pack(format, src_channel, src_native_type, src_suffix): print -def generate_unpack(formats, dst_channel, dst_native_type, dst_suffix): - '''Generate the dispatch function to unpack pixels from any format''' +def generate_format_fetch(format, dst_channel, dst_native_type, dst_suffix): + '''Generate the function to unpack pixels from a particular format''' - for format in formats: - generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix) + name = format.short_name() + print 'static INLINE void' + print 'util_format_%s_fetch_%s(%s *dst, const uint8_t *src, unsigned i, unsigned j)' % (name, dst_suffix, dst_native_type) + print '{' -def generate_pack(formats, src_channel, src_native_type, src_suffix): - '''Generate the dispatch function to pack pixels to any format''' + if is_format_supported(format): + generate_unpack_kernel(format, dst_channel, dst_native_type) - for format in formats: - generate_format_pack(format, src_channel, src_native_type, src_suffix) + print '}' + print def generate(formats): @@ -555,13 +572,16 @@ def generate(formats): native_type = 'float' suffix = 'float' - generate_unpack(formats, channel, native_type, suffix) - generate_pack(formats, channel, native_type, suffix) + for format in formats: + generate_format_unpack(format, channel, native_type, suffix) + generate_format_pack(format, channel, native_type, suffix) + generate_format_fetch(format, channel, native_type, suffix) channel = Channel(UNSIGNED, True, 8) native_type = 'uint8_t' suffix = '8unorm' - generate_unpack(formats, channel, native_type, suffix) - generate_pack(formats, channel, native_type, suffix) + for format in formats: + generate_format_unpack(format, channel, native_type, suffix) + generate_format_pack(format, channel, native_type, suffix) diff --git a/src/gallium/auxiliary/util/u_format_table.py b/src/gallium/auxiliary/util/u_format_table.py index fe910d9a77..6877bd6844 100755 --- a/src/gallium/auxiliary/util/u_format_table.py +++ b/src/gallium/auxiliary/util/u_format_table.py @@ -106,6 +106,11 @@ util_format_none_unpack_float(float *dst, const uint8_t *src, unsigned length) static void util_format_none_pack_float(uint8_t *dst, const float *src, unsigned length) { +} + +static void +util_format_none_fetch_float(float *dst, const uint8_t *src, unsigned i, unsigned j) +{ } ''' print 'const struct util_format_description' @@ -125,7 +130,8 @@ util_format_none_pack_float(uint8_t *dst, const float *src, unsigned length) print " &util_format_none_unpack_8unorm," print " &util_format_none_pack_8unorm," print " &util_format_none_unpack_float," - print " &util_format_none_pack_float" + print " &util_format_none_pack_float," + print " &util_format_none_fetch_float" print "};" print @@ -172,7 +178,8 @@ util_format_none_pack_float(uint8_t *dst, const float *src, unsigned length) print " &util_format_%s_unpack_8unorm," % format.short_name() print " &util_format_%s_pack_8unorm," % format.short_name() print " &util_format_%s_unpack_float," % format.short_name() - print " &util_format_%s_pack_float" % format.short_name() + print " &util_format_%s_pack_float," % format.short_name() + print " &util_format_%s_fetch_float" % format.short_name() print "};" print -- cgit v1.2.3 From 018aae950df449a18d7d69de54d51af587be94c6 Mon Sep 17 00:00:00 2001 From: José Fonseca Date: Wed, 31 Mar 2010 21:16:16 +0100 Subject: util: Make the accessors bidimensional again. Otherwise there's no way to unpack blocks with height >1 --- progs/gallium/unit/u_format_test.c | 8 ++-- src/gallium/auxiliary/util/u_format.c | 36 ++------------- src/gallium/auxiliary/util/u_format.h | 28 ++++++++---- src/gallium/auxiliary/util/u_format_pack.py | 70 +++++++++++++++++------------ 4 files changed, 69 insertions(+), 73 deletions(-) (limited to 'progs/gallium/unit/u_format_test.c') diff --git a/progs/gallium/unit/u_format_test.c b/progs/gallium/unit/u_format_test.c index ba4e9fab66..54cb6b879e 100644 --- a/progs/gallium/unit/u_format_test.c +++ b/progs/gallium/unit/u_format_test.c @@ -72,7 +72,7 @@ test_format_unpack_float(const struct util_format_description *format_desc, unsigned i; boolean success; - format_desc->unpack_float(unpacked, test->packed, 1); + format_desc->unpack_float(unpacked, 0, test->packed, 0, 1, 1); success = TRUE; for (i = 0; i < 4; ++i) @@ -102,7 +102,7 @@ test_format_pack_float(const struct util_format_description *format_desc, for (i = 0; i < 4; ++i) unpacked[i] = (float) test->unpacked[i]; - format_desc->pack_float(packed, unpacked, 1); + format_desc->pack_float(packed, 0, unpacked, 0, 1, 1); success = TRUE; for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i) @@ -160,7 +160,7 @@ test_format_unpack_8unorm(const struct util_format_description *format_desc, unsigned i; boolean success; - format_desc->unpack_8unorm(unpacked, test->packed, 1); + format_desc->unpack_8unorm(unpacked, 0, test->packed, 0, 1, 1); convert_float_to_8unorm(expected, test->unpacked); @@ -196,7 +196,7 @@ test_format_pack_8unorm(const struct util_format_description *format_desc, memset(packed, 0, sizeof packed); - format_desc->pack_8unorm(packed, unpacked, 1); + format_desc->pack_8unorm(packed, 0, unpacked, 0, 1, 1); success = TRUE; for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i) diff --git a/src/gallium/auxiliary/util/u_format.c b/src/gallium/auxiliary/util/u_format.c index 11ef839ec1..7f16cf7d01 100644 --- a/src/gallium/auxiliary/util/u_format.c +++ b/src/gallium/auxiliary/util/u_format.c @@ -44,8 +44,6 @@ util_format_read_4f(enum pipe_format format, const struct util_format_description *format_desc; const uint8_t *src_row; float *dst_row; - unsigned row_blocks; - unsigned i; format_desc = util_format_description(format); @@ -54,13 +52,8 @@ util_format_read_4f(enum pipe_format format, src_row = (const uint8_t *)src + y*src_stride + x*(format_desc->block.bits/8); dst_row = dst; - row_blocks = (w + format_desc->block.width - 1) / format_desc->block.width; - for (i = 0; i < h; i += format_desc->block.height) { - format_desc->unpack_float(dst_row, src_row, row_blocks); - src_row += src_stride; - dst_row += dst_stride/sizeof(*dst_row); - } + format_desc->unpack_float(dst_row, dst_stride, src_row, src_stride, w, h); } @@ -73,8 +66,6 @@ util_format_write_4f(enum pipe_format format, const struct util_format_description *format_desc; uint8_t *dst_row; const float *src_row; - unsigned row_blocks; - unsigned i; format_desc = util_format_description(format); @@ -83,13 +74,8 @@ util_format_write_4f(enum pipe_format format, dst_row = (uint8_t *)dst + y*dst_stride + x*(format_desc->block.bits/8); src_row = src; - row_blocks = (w + format_desc->block.width - 1) / format_desc->block.width; - for (i = 0; i < h; i += format_desc->block.height) { - format_desc->pack_float(dst_row, src_row, row_blocks); - dst_row += dst_stride; - src_row += src_stride/sizeof(*src_row); - } + format_desc->pack_float(dst_row, dst_stride, src_row, src_stride, w, h); } @@ -99,8 +85,6 @@ util_format_read_4ub(enum pipe_format format, uint8_t *dst, unsigned dst_stride, const struct util_format_description *format_desc; const uint8_t *src_row; uint8_t *dst_row; - unsigned row_blocks; - unsigned i; format_desc = util_format_description(format); @@ -109,13 +93,8 @@ util_format_read_4ub(enum pipe_format format, uint8_t *dst, unsigned dst_stride, src_row = (const uint8_t *)src + y*src_stride + x*(format_desc->block.bits/8); dst_row = dst; - row_blocks = (w + format_desc->block.width - 1) / format_desc->block.width; - for (i = 0; i < h; i += format_desc->block.height) { - format_desc->unpack_8unorm(dst_row, src_row, row_blocks); - src_row += src_stride; - dst_row += dst_stride/sizeof(*dst_row); - } + format_desc->unpack_8unorm(dst_row, dst_stride, src_row, src_stride, w, h); } @@ -125,8 +104,6 @@ util_format_write_4ub(enum pipe_format format, const uint8_t *src, unsigned src_ const struct util_format_description *format_desc; uint8_t *dst_row; const uint8_t *src_row; - unsigned row_blocks; - unsigned i; format_desc = util_format_description(format); @@ -135,12 +112,7 @@ util_format_write_4ub(enum pipe_format format, const uint8_t *src, unsigned src_ dst_row = (uint8_t *)dst + y*dst_stride + x*(format_desc->block.bits/8); src_row = src; - row_blocks = (w + format_desc->block.width - 1) / format_desc->block.width; - for (i = 0; i < h; i += format_desc->block.height) { - format_desc->pack_8unorm(dst_row, src_row, row_blocks); - dst_row += dst_stride; - src_row += src_stride/sizeof(*src_row); - } + format_desc->pack_8unorm(dst_row, dst_stride, src_row, src_stride, w, h); } diff --git a/src/gallium/auxiliary/util/u_format.h b/src/gallium/auxiliary/util/u_format.h index 0fad81fe40..93818a3161 100644 --- a/src/gallium/auxiliary/util/u_format.h +++ b/src/gallium/auxiliary/util/u_format.h @@ -191,34 +191,44 @@ struct util_format_description enum util_format_colorspace colorspace; /** - * Unpack a span of pixel blocks to R8G8B8A8_UNORM. + * Unpack pixel blocks to R8G8B8A8_UNORM. */ void - (*unpack_8unorm)(uint8_t *dst, const uint8_t *src, unsigned nr_blocks); + (*unpack_8unorm)(uint8_t *dst, unsigned dst_stride, + const uint8_t *src, unsigned src_stride, + unsigned width, unsigned height); /** - * Pack a span of pixel blocks from R8G8B8A8_UNORM. + * Pack pixel blocks from R8G8B8A8_UNORM. */ void - (*pack_8unorm)(uint8_t *dst, const uint8_t *src, unsigned nr_blocks); + (*pack_8unorm)(uint8_t *dst, unsigned dst_stride, + const uint8_t *src, unsigned src_stride, + unsigned width, unsigned height); /** - * Unpack a span of pixel blocks to R32G32B32A32_FLOAT. + * Unpack pixel blocks to R32G32B32A32_FLOAT. */ void - (*unpack_float)(float *dst, const uint8_t *src, unsigned nr_blocks); + (*unpack_float)(float *dst, unsigned dst_stride, + const uint8_t *src, unsigned src_stride, + unsigned width, unsigned height); /** - * Pack a span of pixel blocks from R32G32B32A32_FLOAT. + * Pack pixel blocks from R32G32B32A32_FLOAT. */ void - (*pack_float)(uint8_t *dst, const float *src, unsigned nr_blocks); + (*pack_float)(uint8_t *dst, unsigned dst_stride, + const float *src, unsigned src_stride, + unsigned width, unsigned height); /** * Fetch a single pixel (i, j) from a block. */ void - (*fetch_float)(float *dst, const uint8_t *src, unsigned i, unsigned j); + (*fetch_float)(float *dst, + const uint8_t *src, + unsigned i, unsigned j); }; diff --git a/src/gallium/auxiliary/util/u_format_pack.py b/src/gallium/auxiliary/util/u_format_pack.py index 26f8748604..73309cca5c 100644 --- a/src/gallium/auxiliary/util/u_format_pack.py +++ b/src/gallium/auxiliary/util/u_format_pack.py @@ -343,19 +343,19 @@ def generate_unpack_kernel(format, dst_channel, dst_native_type): if format.is_bitmask(): depth = format.block_size() - print ' uint%u_t value = *(uint%u_t *)src;' % (depth, depth) + print ' uint%u_t value = *(uint%u_t *)src;' % (depth, depth) # Declare the intermediate variables for i in range(format.nr_channels()): src_channel = format.channels[i] if src_channel.type == UNSIGNED: - print ' uint%u_t %s;' % (depth, src_channel.name) + print ' uint%u_t %s;' % (depth, src_channel.name) elif src_channel.type == SIGNED: - print ' int%u_t %s;' % (depth, src_channel.name) + print ' int%u_t %s;' % (depth, src_channel.name) - print ' #ifdef PIPE_ARCH_BIG_ENDIAN' - print ' value = util_bswap%u(value);' % depth - print ' #endif' + print '#ifdef PIPE_ARCH_BIG_ENDIAN' + print ' value = util_bswap%u(value);' % depth + print '#endif' # Compute the intermediate unshifted values shift = 0 @@ -382,7 +382,7 @@ def generate_unpack_kernel(format, dst_channel, dst_native_type): value = None if value is not None: - print ' %s = %s;' % (src_channel.name, value) + print ' %s = %s;' % (src_channel.name, value) shift += src_channel.size @@ -406,11 +406,11 @@ def generate_unpack_kernel(format, dst_channel, dst_native_type): value = get_one(dst_channel) elif i >= 1: value = 'dst[0]' - print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) + print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) else: - print ' union util_format_%s pixel;' % format.short_name() - print ' memcpy(&pixel, src, sizeof pixel);' + print ' union util_format_%s pixel;' % format.short_name() + print ' memcpy(&pixel, src, sizeof pixel);' bswap_format(format) for i in range(4): @@ -432,7 +432,7 @@ def generate_unpack_kernel(format, dst_channel, dst_native_type): value = get_one(dst_channel) elif i >= 1: value = 'dst[0]' - print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) + print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) def generate_pack_kernel(format, src_channel, src_native_type): @@ -448,7 +448,7 @@ def generate_pack_kernel(format, src_channel, src_native_type): if format.is_bitmask(): depth = format.block_size() - print ' uint%u_t value = 0;' % depth + print ' uint%u_t value = 0;' % depth shift = 0 for i in range(4): @@ -472,18 +472,18 @@ def generate_pack_kernel(format, src_channel, src_native_type): else: value = None if value is not None: - print ' value |= %s;' % (value) + print ' value |= %s;' % (value) shift += dst_channel.size print '#ifdef PIPE_ARCH_BIG_ENDIAN' - print ' value = util_bswap%u(value);' % depth + print ' value = util_bswap%u(value);' % depth print '#endif' - print ' *(uint%u_t *)dst = value;' % depth + print ' *(uint%u_t *)dst = value;' % depth else: - print ' union util_format_%s pixel;' % format.short_name() + print ' union util_format_%s pixel;' % format.short_name() for i in range(4): dst_channel = format.channels[i] @@ -497,10 +497,10 @@ def generate_pack_kernel(format, src_channel, src_native_type): value = get_one(dst_channel) elif i >= 1: value = '0' - print ' pixel.chan.%s = %s;' % (dst_channel.name, value) + print ' pixel.chan.%s = %s;' % (dst_channel.name, value) bswap_format(format) - print ' memcpy(dst, &pixel, sizeof pixel);' + print ' memcpy(dst, &pixel, sizeof pixel);' def generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix): @@ -509,16 +509,23 @@ def generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix): name = format.short_name() print 'static INLINE void' - print 'util_format_%s_unpack_%s(%s *dst, const uint8_t *src, unsigned length)' % (name, dst_suffix, dst_native_type) + print 'util_format_%s_unpack_%s(%s *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)' % (name, dst_suffix, dst_native_type) print '{' if is_format_supported(format): - print ' while(length--) {' - + print ' unsigned x, y;' + print ' for(y = 0; y < height; y += %u) {' % (format.block_height,) + print ' %s *dst = dst_row;' % (dst_native_type) + print ' const uint8_t *src = src_row;' + print ' for(x = 0; x < width; x += %u) {' % (format.block_width,) + generate_unpack_kernel(format, dst_channel, dst_native_type) - print ' src += %u;' % (format.block_size() / 8,) - print ' dst += 4;' + print ' src += %u;' % (format.block_size() / 8,) + print ' dst += 4;' + print ' }' + print ' src_row += src_stride;' + print ' dst_row += dst_stride/sizeof(*dst_row);' print ' }' print '}' @@ -531,18 +538,25 @@ def generate_format_pack(format, src_channel, src_native_type, src_suffix): name = format.short_name() print 'static INLINE void' - print 'util_format_%s_pack_%s(uint8_t *dst, const %s *src, unsigned length)' % (name, src_suffix, src_native_type) + print 'util_format_%s_pack_%s(uint8_t *dst_row, unsigned dst_stride, const %s *src_row, unsigned src_stride, unsigned width, unsigned height)' % (name, src_suffix, src_native_type) print '{' if is_format_supported(format): - print ' while(length--) {' + print ' unsigned x, y;' + print ' for(y = 0; y < height; y += %u) {' % (format.block_height,) + print ' const %s *src = src_row;' % (src_native_type) + print ' uint8_t *dst = dst_row;' + print ' for(x = 0; x < width; x += %u) {' % (format.block_width,) generate_pack_kernel(format, src_channel, src_native_type) - print ' src += 4;' - print ' dst += %u;' % (format.block_size() / 8,) + print ' src += 4;' + print ' dst += %u;' % (format.block_size() / 8,) + print ' }' + print ' dst_row += dst_stride;' + print ' src_row += src_stride/sizeof(*src_row);' print ' }' - + print '}' print -- cgit v1.2.3