#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)
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];
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)
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;
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)
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.
*/
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)
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
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;
}
{
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;
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
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:
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
'''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"'
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()