u_format_pack.py revision 5c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402c
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#!/usr/bin/env python 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer''' 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/************************************************************************** 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * Copyright 2009-2010 VMware, Inc. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * All Rights Reserved. 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * 92f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett * Permission is hereby granted, free of charge, to any person obtaining a 102f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett * copy of this software and associated documentation files (the 112f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett * "Software"), to deal in the Software without restriction, including 122f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett * without limitation the rights to use, copy, modify, merge, publish, 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * distribute, sub license, and/or sell copies of the Software, and to 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * permit persons to whom the Software is furnished to do so, subject to 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * the following conditions: 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * The above copyright notice and this permission notice (including the 1833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis * next paragraph) shall be included in all copies or substantial portions 19dc7b641574a733624489bd87fc7061771edf2113Douglas Gregor * of the Software. 202eefd8657c233bc7c9330acfe475fc270bbe7cabTed Kremenek * 21f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 220827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2328019772db70d4547be05a042eb950bc910f134fDouglas Gregor * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 24bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 253f09327b26033d0a9676d52d80cf92c48f581affDouglas Gregor * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 260827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2730a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28f4c839657742b823cea1a95b18422f1ba74d3dddChris Lattner * 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer **************************************************************************/ 3078ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie 3133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis/** 3202c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor * @file 33d42ffbd22fc7eb61321f6a88173ee424991f01c6Ted Kremenek * Pixel format packing and unpacking functions. 3433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis * 3540469651a3f8379dc0f32df69e9bade06a2aad36Chris Lattner * @author Jose Fonseca <jfonseca@vmware.com> 367d90199f109290e9d587479a481a2850d390b552Daniel Dunbar */ 379c4eb1f3438370355f51dc8c62f2ca4803e3338dArgyrios Kyrtzidis''' 38e59abb56ce0e1c206fb80bd945a0c358b0abe1efArgyrios Kyrtzidis 391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 404b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregorfrom u_format_parse import * 414b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor 424b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor 434b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregordef generate_format_type(format): 444b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor '''Generate a structure that describes the format.''' 454b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor 464b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor assert format.layout == PLAIN 47b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor 484b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor print 'union util_format_%s {' % format.short_name() 49849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor 504b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor if format.block_size() in (8, 16, 32, 64): 51783c56f47745f719590b17afd7ed937bf2407b53Douglas Gregor print ' uint%u_t value;' % (format.block_size(),) 52783c56f47745f719590b17afd7ed937bf2407b53Douglas Gregor 530a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner use_bitfields = False 544b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor for channel in format.channels: 5530660a898545416f0fea2d717f16f75640001e38Ted Kremenek if channel.size % 8 or not is_pot(channel.size): 5630660a898545416f0fea2d717f16f75640001e38Ted Kremenek use_bitfields = True 5730660a898545416f0fea2d717f16f75640001e38Ted Kremenek 5830660a898545416f0fea2d717f16f75640001e38Ted Kremenek print ' struct {' 594b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor for channel in format.channels: 604b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor if use_bitfields: 614b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor if channel.type == VOID: 624b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor if channel.size: 6330660a898545416f0fea2d717f16f75640001e38Ted Kremenek print ' unsigned %s:%u;' % (channel.name, channel.size) 6430660a898545416f0fea2d717f16f75640001e38Ted Kremenek elif channel.type == UNSIGNED: 654b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor print ' unsigned %s:%u;' % (channel.name, channel.size) 664b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor elif channel.type in (SIGNED, FIXED): 6730660a898545416f0fea2d717f16f75640001e38Ted Kremenek print ' int %s:%u;' % (channel.name, channel.size) 684b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor elif channel.type == FLOAT: 692f019aadc96f8fa3185c684c7150bd596d045064Anders Carlsson if channel.size == 64: 70783c56f47745f719590b17afd7ed937bf2407b53Douglas Gregor print ' double %s;' % (channel.name) 712f019aadc96f8fa3185c684c7150bd596d045064Anders Carlsson elif channel.size == 32: 722f019aadc96f8fa3185c684c7150bd596d045064Anders Carlsson print ' float %s;' % (channel.name) 734b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor else: 744b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor print ' unsigned %s:%u;' % (channel.name, channel.size) 75849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor else: 7630660a898545416f0fea2d717f16f75640001e38Ted Kremenek assert 0 7730660a898545416f0fea2d717f16f75640001e38Ted Kremenek else: 78849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor assert channel.size % 8 == 0 and is_pot(channel.size) 79783c56f47745f719590b17afd7ed937bf2407b53Douglas Gregor if channel.type == VOID: 80783c56f47745f719590b17afd7ed937bf2407b53Douglas Gregor if channel.size: 81b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor print ' uint%u_t %s;' % (channel.size, channel.name) 8230660a898545416f0fea2d717f16f75640001e38Ted Kremenek elif channel.type == UNSIGNED: 8330660a898545416f0fea2d717f16f75640001e38Ted Kremenek print ' uint%u_t %s;' % (channel.size, channel.name) 8430660a898545416f0fea2d717f16f75640001e38Ted Kremenek elif channel.type in (SIGNED, FIXED): 8530660a898545416f0fea2d717f16f75640001e38Ted Kremenek print ' int%u_t %s;' % (channel.size, channel.name) 8630660a898545416f0fea2d717f16f75640001e38Ted Kremenek elif channel.type == FLOAT: 87af50aab0c317462129d73ae8000c6394c718598dJames Dennett if channel.size == 64: 8830660a898545416f0fea2d717f16f75640001e38Ted Kremenek print ' double %s;' % (channel.name) 8930660a898545416f0fea2d717f16f75640001e38Ted Kremenek elif channel.size == 32: 9030660a898545416f0fea2d717f16f75640001e38Ted Kremenek print ' float %s;' % (channel.name) 9130660a898545416f0fea2d717f16f75640001e38Ted Kremenek elif channel.size == 16: 9230660a898545416f0fea2d717f16f75640001e38Ted Kremenek print ' uint16_t %s;' % (channel.name) 9330660a898545416f0fea2d717f16f75640001e38Ted Kremenek else: 9430660a898545416f0fea2d717f16f75640001e38Ted Kremenek assert 0 9530660a898545416f0fea2d717f16f75640001e38Ted Kremenek else: 96b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor assert 0 97b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor print ' } chan;' 984b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor print '};' 994b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor print 1004b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor 1010a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner 102849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregordef bswap_format(format): 103b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor '''Generate a structure that describes the format.''' 104b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor 105b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor if format.is_bitmask() and not format.is_array() and format.block_size() > 8: 1060a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner print '#ifdef PIPE_ARCH_BIG_ENDIAN' 1070a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner print ' pixel.value = util_bswap%u(pixel.value);' % format.block_size() 1080a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner print '#endif' 1090a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner 1104b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor 1114b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregordef is_format_supported(format): 1120a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner '''Determines whether we actually have the plumbing necessary to generate the 113686775deca8b8685eb90801495880e3abdd844c2Chris Lattner to read/write to/from this format.''' 114849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor 115b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor # FIXME: Ideally we would support any format combination here. 116b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor 117b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor if format.layout != PLAIN: 118b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor return False 1190a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner 1200a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner for i in range(4): 121686775deca8b8685eb90801495880e3abdd844c2Chris Lattner channel = format.channels[i] 1220a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner if channel.type not in (VOID, UNSIGNED, SIGNED, FLOAT, FIXED): 1230a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner return False 1244b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor if channel.type == FLOAT and channel.size not in (16, 32, 64): 1254b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor return False 126af50aab0c317462129d73ae8000c6394c718598dJames Dennett 127af50aab0c317462129d73ae8000c6394c718598dJames Dennett return True 128af50aab0c317462129d73ae8000c6394c718598dJames Dennett 129af50aab0c317462129d73ae8000c6394c718598dJames Dennettdef is_format_pure_unsigned(format): 130af50aab0c317462129d73ae8000c6394c718598dJames Dennett for i in range(4): 131af50aab0c317462129d73ae8000c6394c718598dJames Dennett channel = format.channels[i] 132c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith if channel.type not in (VOID, UNSIGNED): 133182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner return False 134af50aab0c317462129d73ae8000c6394c718598dJames Dennett if channel.type == UNSIGNED and channel.pure == False: 135182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner return False 13633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 13733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return True 13833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 13933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 14033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisdef is_format_pure_signed(format): 141182745ae7892bca0842d9c023370ade5f8d1c6e8Chris Lattner for i in range(4): 1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump channel = format.channels[i] 143af50aab0c317462129d73ae8000c6394c718598dJames Dennett if channel.type not in (VOID, SIGNED): 144af50aab0c317462129d73ae8000c6394c718598dJames Dennett return False 145af50aab0c317462129d73ae8000c6394c718598dJames Dennett if channel.type == SIGNED and channel.pure == False: 146b54b276a920246c595a0498da281821eb9d22996Chris Lattner return False 147b54b276a920246c595a0498da281821eb9d22996Chris Lattner 148b54b276a920246c595a0498da281821eb9d22996Chris Lattner return True 1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1503fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattnerdef native_type(format): 151af50aab0c317462129d73ae8000c6394c718598dJames Dennett '''Get the native appropriate for a format.''' 152af50aab0c317462129d73ae8000c6394c718598dJames Dennett 153af50aab0c317462129d73ae8000c6394c718598dJames Dennett if format.name == 'PIPE_FORMAT_R11G11B10_FLOAT': 154af50aab0c317462129d73ae8000c6394c718598dJames Dennett return 'uint32_t' 155af50aab0c317462129d73ae8000c6394c718598dJames Dennett if format.name == 'PIPE_FORMAT_R9G9B9E5_FLOAT': 156af50aab0c317462129d73ae8000c6394c718598dJames Dennett return 'uint32_t' 157af50aab0c317462129d73ae8000c6394c718598dJames Dennett 158af50aab0c317462129d73ae8000c6394c718598dJames Dennett if format.layout == PLAIN: 159af50aab0c317462129d73ae8000c6394c718598dJames Dennett if not format.is_array(): 160af50aab0c317462129d73ae8000c6394c718598dJames Dennett # For arithmetic pixel formats return the integer type that matches the whole pixel 161af50aab0c317462129d73ae8000c6394c718598dJames Dennett return 'uint%u_t' % format.block_size() 1623fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner else: 1635edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin # For array pixel formats return the integer type that matches the color channel 164af50aab0c317462129d73ae8000c6394c718598dJames Dennett channel = format.channels[0] 165af50aab0c317462129d73ae8000c6394c718598dJames Dennett if channel.type in (UNSIGNED, VOID): 166b54d8af9a66cc20a6a9a9219c7eaea8df7ee7fd4Chris Lattner return 'uint%u_t' % channel.size 167ee1828a6b5ae1bc4ea300e48f3840ac1ec5be295Douglas Gregor elif channel.type in (SIGNED, FIXED): 1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 'int%u_t' % channel.size 16927ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner elif channel.type == FLOAT: 170b54b276a920246c595a0498da281821eb9d22996Chris Lattner if channel.size == 16: 1711e473ccb0e0f6fd1954bef330f7193c1a3fb3ba1Ted Kremenek return 'uint16_t' 1721e473ccb0e0f6fd1954bef330f7193c1a3fb3ba1Ted Kremenek elif channel.size == 32: 173e663c720063fc9ff9f75bcbe38cd070c73c78b0eChris Lattner return 'float' 174b54b276a920246c595a0498da281821eb9d22996Chris Lattner elif channel.size == 64: 17581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return 'double' 176246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu else: 177246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu assert False 178246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu else: 1795edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin assert False 180c100214fdc41a7ea215f75d433eb1cb829fd4330Chris Lattner else: 181575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor assert False 182575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor 18308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 18408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithdef intermediate_native_type(bits, sign): 185b54b276a920246c595a0498da281821eb9d22996Chris Lattner '''Find a native type adequate to hold intermediate results of the request bit size.''' 186c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith 18702c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor bytes = 4 # don't use anything smaller than 32bits 18878ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie while bytes * 8 < bits: 18933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis bytes *= 2 19033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis bits = bytes*8 1910827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 192af50aab0c317462129d73ae8000c6394c718598dJames Dennett if sign: 193af50aab0c317462129d73ae8000c6394c718598dJames Dennett return 'int%u_t' % bits 194af50aab0c317462129d73ae8000c6394c718598dJames Dennett else: 195af50aab0c317462129d73ae8000c6394c718598dJames Dennett return 'uint%u_t' % bits 196af50aab0c317462129d73ae8000c6394c718598dJames Dennett 197af50aab0c317462129d73ae8000c6394c718598dJames Dennett 198af50aab0c317462129d73ae8000c6394c718598dJames Dennettdef get_one_shift(type): 1990827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis '''Get the number of the bit that matches unity for this type.''' 2003efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis if type.type == 'FLOAT': 2013efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis assert False 2023efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis if not type.norm: 2030827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return 0 204b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar if type.type == UNSIGNED: 2053c2d3016adec79c81c4efff64e208fd3ecdd92aeBenjamin Kramer return type.size 2063c2d3016adec79c81c4efff64e208fd3ecdd92aeBenjamin Kramer if type.type == SIGNED: 207ba494c64365d78b1cdb6baea4d1e79263389fda9Daniel Dunbar return type.size - 1 208b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar if type.type == FIXED: 209ba494c64365d78b1cdb6baea4d1e79263389fda9Daniel Dunbar return type.size / 2 210ba494c64365d78b1cdb6baea4d1e79263389fda9Daniel Dunbar assert False 2113efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis 212b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 213b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbardef value_to_native(type, value): 214b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar '''Get the value of unity for this type.''' 2153c2d3016adec79c81c4efff64e208fd3ecdd92aeBenjamin Kramer if type.type == FLOAT: 216ba494c64365d78b1cdb6baea4d1e79263389fda9Daniel Dunbar return value 217ba494c64365d78b1cdb6baea4d1e79263389fda9Daniel Dunbar if type.type == FIXED: 218ba494c64365d78b1cdb6baea4d1e79263389fda9Daniel Dunbar return int(value * (1 << (type.size/2))) 219ba494c64365d78b1cdb6baea4d1e79263389fda9Daniel Dunbar if not type.norm: 2200827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return int(value) 2213c2d3016adec79c81c4efff64e208fd3ecdd92aeBenjamin Kramer if type.type == UNSIGNED: 2220827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return int(value * ((1 << type.size) - 1)) 2230827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis if type.type == SIGNED: 2240827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return int(value * ((1 << (type.size - 1)) - 1)) 2250827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis assert False 226af50aab0c317462129d73ae8000c6394c718598dJames Dennett 227af50aab0c317462129d73ae8000c6394c718598dJames Dennett 228af50aab0c317462129d73ae8000c6394c718598dJames Dennettdef native_to_constant(type, value): 229af50aab0c317462129d73ae8000c6394c718598dJames Dennett '''Get the value of unity for this type.''' 2300827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis if type.type == FLOAT: 2310827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis if type.size <= 32: 2320827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return "%ff" % value 2330827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis else: 2340827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return "%ff" % value 2350827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis else: 2360827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return str(int(value)) 2370827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 2380827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 2390827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidisdef get_one(type): 2400827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis '''Get the value of unity for this type.''' 2410827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return value_to_native(type, 1) 2420827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 2430827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 2443c2d3016adec79c81c4efff64e208fd3ecdd92aeBenjamin Kramerdef clamp_expr(src_channel, dst_channel, dst_native_type, value): 2453c2d3016adec79c81c4efff64e208fd3ecdd92aeBenjamin Kramer '''Generate the expression to clamp the value in the source type to the 24604ae2df026b275aae5dddfc0db5ca55ff4e62179Chris Lattner destination type range.''' 247af50aab0c317462129d73ae8000c6394c718598dJames Dennett 248af50aab0c317462129d73ae8000c6394c718598dJames Dennett if src_channel == dst_channel: 249af50aab0c317462129d73ae8000c6394c718598dJames Dennett return value 250af50aab0c317462129d73ae8000c6394c718598dJames Dennett 251af50aab0c317462129d73ae8000c6394c718598dJames Dennett src_min = src_channel.min() 2520827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis src_max = src_channel.max() 2530827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis dst_min = dst_channel.min() 2540827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis dst_max = dst_channel.max() 2550827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 2560827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis # Translate the destination range to the src native value 2570827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis dst_min_native = value_to_native(src_channel, dst_min) 2580827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis dst_max_native = value_to_native(src_channel, dst_max) 2590827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 2600827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis if src_min < dst_min and src_max > dst_max: 2610827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return 'CLAMP(%s, %s, %s)' % (value, dst_min_native, dst_max_native) 2620827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 2630827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis if src_max > dst_max: 2640827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return 'MIN2(%s, %s)' % (value, dst_max_native) 26500aae5243d965aa7bcee81a39ba0900c7869be21Richard Smith 2660827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis if src_min < dst_min: 26700aae5243d965aa7bcee81a39ba0900c7869be21Richard Smith return 'MAX2(%s, %s)' % (value, dst_min_native) 26800aae5243d965aa7bcee81a39ba0900c7869be21Richard Smith 26900aae5243d965aa7bcee81a39ba0900c7869be21Richard Smith return value 2700827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 2710827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 27200aae5243d965aa7bcee81a39ba0900c7869be21Richard Smithdef conversion_expr(src_channel, 2730827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis dst_channel, dst_native_type, 2740827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis value, 2750827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis clamp=True, 2760827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis src_colorspace = RGB, 2770827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis dst_colorspace = RGB): 27804ae2df026b275aae5dddfc0db5ca55ff4e62179Chris Lattner '''Generate the expression to convert a value between two types.''' 279af50aab0c317462129d73ae8000c6394c718598dJames Dennett 2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if src_colorspace != dst_colorspace: 281af50aab0c317462129d73ae8000c6394c718598dJames Dennett if src_colorspace == SRGB: 28212f37e411462b8388eb1309357bd62257debacacDeLesley Hutchins assert src_channel.type == UNSIGNED 28312f37e411462b8388eb1309357bd62257debacacDeLesley Hutchins assert src_channel.norm 28412f37e411462b8388eb1309357bd62257debacacDeLesley Hutchins assert src_channel.size == 8 28512f37e411462b8388eb1309357bd62257debacacDeLesley Hutchins assert dst_colorspace == RGB 286af50aab0c317462129d73ae8000c6394c718598dJames Dennett if dst_channel.type == FLOAT: 28715221422eda7bac679e38b07512feda49715ef66Chris Lattner return 'util_format_srgb_8unorm_to_linear_float(%s)' % value 2881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else: 28985bea9777d444ccbcc086d98f075fe666c2e865dDouglas Gregor assert dst_channel.type == UNSIGNED 29085bea9777d444ccbcc086d98f075fe666c2e865dDouglas Gregor assert dst_channel.norm 29185bea9777d444ccbcc086d98f075fe666c2e865dDouglas Gregor assert dst_channel.size == 8 292c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis return 'util_format_srgb_to_linear_8unorm(%s)' % value 293add80bb3957dba1d9389304453c0a4c975768bd7John McCall elif dst_colorspace == SRGB: 294c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis assert dst_channel.type == UNSIGNED 295c0a575f9b791a25c94b1c3c832dd73ec564646bbArgyrios Kyrtzidis assert dst_channel.norm 296add80bb3957dba1d9389304453c0a4c975768bd7John McCall assert dst_channel.size == 8 297af50aab0c317462129d73ae8000c6394c718598dJames Dennett assert src_colorspace == RGB 298af50aab0c317462129d73ae8000c6394c718598dJames Dennett if src_channel.type == FLOAT: 299af50aab0c317462129d73ae8000c6394c718598dJames Dennett return 'util_format_linear_float_to_srgb_8unorm(%s)' % value 300f5d2328fc849288c3a62e43d065685f516d57091Chris Lattner else: 30133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis assert src_channel.type == UNSIGNED 3025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert src_channel.norm 303af50aab0c317462129d73ae8000c6394c718598dJames Dennett assert src_channel.size == 8 304af50aab0c317462129d73ae8000c6394c718598dJames Dennett return 'util_format_linear_to_srgb_8unorm(%s)' % value 305af50aab0c317462129d73ae8000c6394c718598dJames Dennett elif src_colorspace == ZS: 3067bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber pass 307af50aab0c317462129d73ae8000c6394c718598dJames Dennett elif dst_colorspace == ZS: 308af50aab0c317462129d73ae8000c6394c718598dJames Dennett pass 309af50aab0c317462129d73ae8000c6394c718598dJames Dennett else: 310af50aab0c317462129d73ae8000c6394c718598dJames Dennett assert 0 311b54d8af9a66cc20a6a9a9219c7eaea8df7ee7fd4Chris Lattner 312b54d8af9a66cc20a6a9a9219c7eaea8df7ee7fd4Chris Lattner if src_channel == dst_channel: 313b54d8af9a66cc20a6a9a9219c7eaea8df7ee7fd4Chris Lattner return value 314b54d8af9a66cc20a6a9a9219c7eaea8df7ee7fd4Chris Lattner 315b54d8af9a66cc20a6a9a9219c7eaea8df7ee7fd4Chris Lattner src_type = src_channel.type 31622caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner src_size = src_channel.size 3170673cb30340aadaede7b795c763b00f6b64e611cChandler Carruth src_norm = src_channel.norm 3180673cb30340aadaede7b795c763b00f6b64e611cChandler Carruth src_pure = src_channel.pure 3190673cb30340aadaede7b795c763b00f6b64e611cChandler Carruth 3200673cb30340aadaede7b795c763b00f6b64e611cChandler Carruth # Promote half to float 3210673cb30340aadaede7b795c763b00f6b64e611cChandler Carruth if src_type == FLOAT and src_size == 16: 3220673cb30340aadaede7b795c763b00f6b64e611cChandler Carruth value = 'util_half_to_float(%s)' % value 323686775deca8b8685eb90801495880e3abdd844c2Chris Lattner src_size = 32 3240673cb30340aadaede7b795c763b00f6b64e611cChandler Carruth 325341785ec52f87c0803ba52dc88faac4e136f8593Bill Wendling # Special case for float <-> ubytes for more accurate results 32692dd386e3f05d176b45a638199d51f536bd9d1c4Chris Lattner # Done before clamping since these functions already take care of that 3273fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner if src_type == UNSIGNED and src_norm and src_size == 8 and dst_channel.type == FLOAT and dst_channel.size == 32: 32893ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor return 'ubyte_to_float(%s)' % value 32993ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor if src_type == FLOAT and src_size == 32 and dst_channel.type == UNSIGNED and dst_channel.norm and dst_channel.size == 8: 33093ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor return 'float_to_ubyte(%s)' % value 33193ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor 33293ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor if clamp: 33393ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor if dst_channel.type != FLOAT or src_type != FLOAT: 33493ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor value = clamp_expr(src_channel, dst_channel, dst_native_type, value) 33593ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor 33693ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor if src_type in (SIGNED, UNSIGNED) and dst_channel.type in (SIGNED, UNSIGNED): 33793ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor if not src_norm and not dst_channel.norm: 33893ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor # neither is normalized -- just cast 33993ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor return '(%s)%s' % (dst_native_type, value) 3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 341d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie src_one = get_one(src_channel) 342c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith dst_one = get_one(dst_channel) 34302c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor 34478ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie if src_one > dst_one and src_norm and dst_channel.norm: 34533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis # We can just bitshift 346d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie src_shift = get_one_shift(src_channel) 3471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump dst_shift = get_one_shift(dst_channel) 348c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith value = '(%s >> %s)' % (value, src_shift - dst_shift) 34933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis else: 35033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis # We need to rescale using an intermediate type big enough to hold the multiplication of both 35133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis tmp_native_type = intermediate_native_type(src_size + dst_channel.size, src_channel.sign and dst_channel.sign) 35202c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor value = '((%s)%s)' % (tmp_native_type, value) 35302c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor value = '(%s * 0x%x / 0x%x)' % (value, dst_one, src_one) 35402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor value = '(%s)%s' % (dst_native_type, value) 35578ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie return value 35678ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie 3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump # Promote to either float or double 358d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie if src_type != FLOAT: 35978243658c533168d51fd076fba328437932ba6f1Douglas Gregor if src_norm or src_type == FIXED: 36078243658c533168d51fd076fba328437932ba6f1Douglas Gregor one = get_one(src_channel) 361bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor if src_size <= 23: 362bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor value = '(%s * (1.0f/0x%x))' % (value, one) 36378ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie if dst_channel.size <= 32: 36433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis value = '(float)%s' % value 36533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis src_size = 32 36633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis else: 36733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis # bigger than single precision mantissa, use double 36833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis value = '(%s * (1.0/0x%x))' % (value, one) 36933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis src_size = 64 37033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis src_norm = False 37133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis else: 37233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis if src_size <= 23 or dst_channel.size <= 32: 37333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis value = '(float)%s' % value 37433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis src_size = 32 37533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis else: 376d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie # bigger than single precision mantissa, use double 377d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie value = '(double)%s' % value 37833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis src_size = 64 37904ae2df026b275aae5dddfc0db5ca55ff4e62179Chris Lattner src_type = FLOAT 380af50aab0c317462129d73ae8000c6394c718598dJames Dennett 38104ae2df026b275aae5dddfc0db5ca55ff4e62179Chris Lattner # Convert double or float to non-float 3820827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis if dst_channel.type != FLOAT: 38304ae2df026b275aae5dddfc0db5ca55ff4e62179Chris Lattner if dst_channel.norm or dst_channel.type == FIXED: 384af50aab0c317462129d73ae8000c6394c718598dJames Dennett dst_one = get_one(dst_channel) 385af50aab0c317462129d73ae8000c6394c718598dJames Dennett if dst_channel.size <= 23: 386af50aab0c317462129d73ae8000c6394c718598dJames Dennett value = '(%s * 0x%x)' % (value, dst_one) 387af50aab0c317462129d73ae8000c6394c718598dJames Dennett else: 388af50aab0c317462129d73ae8000c6394c718598dJames Dennett # bigger than single precision mantissa, use double 3890827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis value = '(%s * (double)0x%x)' % (value, dst_one) 39004ae2df026b275aae5dddfc0db5ca55ff4e62179Chris Lattner value = '(%s)%s' % (dst_native_type, value) 391bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor else: 392bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor # Cast double to float when converting to either half or float 39333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis if dst_channel.size <= 32 and src_size > 32: 39433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis value = '(float)%s' % value 39578ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie src_size = 32 3965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 397af50aab0c317462129d73ae8000c6394c718598dJames Dennett if dst_channel.size == 16: 398af50aab0c317462129d73ae8000c6394c718598dJames Dennett value = 'util_float_to_half(%s)' % value 399af50aab0c317462129d73ae8000c6394c718598dJames Dennett elif dst_channel.size == 64 and src_size < 64: 400af50aab0c317462129d73ae8000c6394c718598dJames Dennett value = '(double)%s' % value 401c100214fdc41a7ea215f75d433eb1cb829fd4330Chris Lattner 402b205ac9fcd22b87b41697172d1983c5ae9dabaafChris Lattner return value 403575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor 404575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor 405575cf3791216c33770ba950430493cdd43099f8fDouglas Gregordef generate_unpack_kernel(format, dst_channel, dst_native_type): 406575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor 407575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor if not is_format_supported(format): 40808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith return 409575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor 41008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith assert format.layout == PLAIN 411575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor 412575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor src_native_type = native_type(format) 413575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor 41408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if format.is_bitmask(): 41508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith depth = format.block_size() 41608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith print ' uint%u_t value = *(const uint%u_t *)src;' % (depth, depth) 41708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 41808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith # Declare the intermediate variables 41908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith for i in range(format.nr_channels()): 42008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith src_channel = format.channels[i] 42108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if src_channel.type == UNSIGNED: 42208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith print ' uint%u_t %s;' % (depth, src_channel.name) 42308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith elif src_channel.type == SIGNED: 42408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith print ' int%u_t %s;' % (depth, src_channel.name) 42508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 42608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if depth > 8: 427af50aab0c317462129d73ae8000c6394c718598dJames Dennett print '#ifdef PIPE_ARCH_BIG_ENDIAN' 428af50aab0c317462129d73ae8000c6394c718598dJames Dennett print ' value = util_bswap%u(value);' % depth 429af50aab0c317462129d73ae8000c6394c718598dJames Dennett print '#endif' 4305b4681c8ef65808ec4d72ab6081efd24d53d4969Chris Lattner 4315b4681c8ef65808ec4d72ab6081efd24d53d4969Chris Lattner # Compute the intermediate unshifted values 4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump shift = 0 433af50aab0c317462129d73ae8000c6394c718598dJames Dennett for i in range(format.nr_channels()): 434af50aab0c317462129d73ae8000c6394c718598dJames Dennett src_channel = format.channels[i] 435af50aab0c317462129d73ae8000c6394c718598dJames Dennett value = 'value' 436af50aab0c317462129d73ae8000c6394c718598dJames Dennett if src_channel.type == UNSIGNED: 4371e473ccb0e0f6fd1954bef330f7193c1a3fb3ba1Ted Kremenek if shift: 4381e473ccb0e0f6fd1954bef330f7193c1a3fb3ba1Ted Kremenek value = '%s >> %u' % (value, shift) 4391e473ccb0e0f6fd1954bef330f7193c1a3fb3ba1Ted Kremenek if shift + src_channel.size < depth: 440af50aab0c317462129d73ae8000c6394c718598dJames Dennett value = '(%s) & 0x%x' % (value, (1 << src_channel.size) - 1) 4415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer elif src_channel.type == SIGNED: 4425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if shift + src_channel.size < depth: 4431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump # Align the sign bit 444af50aab0c317462129d73ae8000c6394c718598dJames Dennett lshift = depth - (shift + src_channel.size) 445e663c720063fc9ff9f75bcbe38cd070c73c78b0eChris Lattner value = '%s << %u' % (value, lshift) 446e663c720063fc9ff9f75bcbe38cd070c73c78b0eChris Lattner # Cast to signed 447e663c720063fc9ff9f75bcbe38cd070c73c78b0eChris Lattner value = '(int%u_t)(%s) ' % (depth, value) 448af50aab0c317462129d73ae8000c6394c718598dJames Dennett if src_channel.size < depth: 4492fe0997427d92388e66e7573f4b043e7ba285ef0Daniel Dunbar # Align the LSB bit 4502fe0997427d92388e66e7573f4b043e7ba285ef0Daniel Dunbar rshift = depth - src_channel.size 4512fe0997427d92388e66e7573f4b043e7ba285ef0Daniel Dunbar value = '(%s) >> %u' % (value, rshift) 45281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor else: 45381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor value = None 45481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 45581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if value is not None: 45681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor print ' %s = %s;' % (src_channel.name, value) 45781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 45881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor shift += src_channel.size 459246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu 460246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu # Convert, swizzle, and store final values 461246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu for i in range(4): 462246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu swizzle = format.swizzles[i] 463246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu if swizzle < 4: 464246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu src_channel = format.channels[swizzle] 465246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu src_colorspace = format.colorspace 466246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu if src_colorspace == SRGB and i == 3: 467246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu # Alpha channel is linear 468246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu src_colorspace = RGB 469246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu value = src_channel.name 470246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu value = conversion_expr(src_channel, 471246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu dst_channel, dst_native_type, 472246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu value, 473246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu src_colorspace = src_colorspace) 474246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu elif swizzle == SWIZZLE_0: 4755edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin value = '0' 476af50aab0c317462129d73ae8000c6394c718598dJames Dennett elif swizzle == SWIZZLE_1: 477af50aab0c317462129d73ae8000c6394c718598dJames Dennett value = get_one(dst_channel) 478af50aab0c317462129d73ae8000c6394c718598dJames Dennett elif swizzle == SWIZZLE_NONE: 4795edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin value = '0' 4805edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin else: 4815edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin assert False 4825edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) 4835edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin 4845d99a252c63a7745bcd71231ca5240d2a65e4f1dRichard Smith else: 4855d99a252c63a7745bcd71231ca5240d2a65e4f1dRichard Smith print ' union util_format_%s pixel;' % format.short_name() 486af50aab0c317462129d73ae8000c6394c718598dJames Dennett print ' memcpy(&pixel, src, sizeof pixel);' 487af50aab0c317462129d73ae8000c6394c718598dJames Dennett bswap_format(format) 4880b60d9e0097e2d6a1a5e62396967e207c4a772f2Douglas Gregor 4895d99a252c63a7745bcd71231ca5240d2a65e4f1dRichard Smith for i in range(4): 4905d99a252c63a7745bcd71231ca5240d2a65e4f1dRichard Smith swizzle = format.swizzles[i] 49133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis if swizzle < 4: 4920b60d9e0097e2d6a1a5e62396967e207c4a772f2Douglas Gregor src_channel = format.channels[swizzle] 4930b60d9e0097e2d6a1a5e62396967e207c4a772f2Douglas Gregor src_colorspace = format.colorspace 494af50aab0c317462129d73ae8000c6394c718598dJames Dennett if src_colorspace == SRGB and i == 3: 495af50aab0c317462129d73ae8000c6394c718598dJames Dennett # Alpha channel is linear 496af50aab0c317462129d73ae8000c6394c718598dJames Dennett src_colorspace = RGB 497af50aab0c317462129d73ae8000c6394c718598dJames Dennett value = 'pixel.chan.%s' % src_channel.name 498b54b276a920246c595a0498da281821eb9d22996Chris Lattner value = conversion_expr(src_channel, 499b54b276a920246c595a0498da281821eb9d22996Chris Lattner dst_channel, dst_native_type, 500b54b276a920246c595a0498da281821eb9d22996Chris Lattner value, 501c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne src_colorspace = src_colorspace) 5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump elif swizzle == SWIZZLE_0: 503af50aab0c317462129d73ae8000c6394c718598dJames Dennett value = '0' 504af50aab0c317462129d73ae8000c6394c718598dJames Dennett elif swizzle == SWIZZLE_1: 505af50aab0c317462129d73ae8000c6394c718598dJames Dennett value = get_one(dst_channel) 506af50aab0c317462129d73ae8000c6394c718598dJames Dennett elif swizzle == SWIZZLE_NONE: 50727ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner value = '0' 50827ceb9d77d929f02a8a811d189a96885629c7c0cChris Lattner else: 50991a2886d558ea6ca7a0bed73ab5acea5ae78eac2Douglas Gregor assert False 5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump print ' dst[%u] = %s; /* %s */' % (i, value, 'rgba'[i]) 511697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett 512697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett 513697c7a8af6d090bff2b572553da0957de1724e1eJames Dennettdef generate_pack_kernel(format, src_channel, src_native_type): 514697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett 515697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett if not is_format_supported(format): 5160827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return 5170827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 5180827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis dst_native_type = native_type(format) 5190827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 5200827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis assert format.layout == PLAIN 5211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 522697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett inv_swizzle = format.inv_swizzles() 523697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett 524697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett if format.is_bitmask(): 525697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett depth = format.block_size() 526697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett print ' uint%u_t value = 0;' % depth 5270827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 528697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett shift = 0 5290827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis for i in range(4): 530686775deca8b8685eb90801495880e3abdd844c2Chris Lattner dst_channel = format.channels[i] 5313f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar if inv_swizzle[i] is not None: 5325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer value ='src[%u]' % inv_swizzle[i] 533697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett dst_colorspace = format.colorspace 534697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett if dst_colorspace == SRGB and inv_swizzle[i] == 3: 535697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett # Alpha channel is linear 5363f22509ebf91aa96658ca6e5c5c0b926d8d62e34Chad Rosier dst_colorspace = RGB 5373f22509ebf91aa96658ca6e5c5c0b926d8d62e34Chad Rosier value = conversion_expr(src_channel, 538697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett dst_channel, dst_native_type, 539697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett value, 540697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett dst_colorspace = dst_colorspace) 5414aa8f2bce0f498152d624f748712a991adc23fddDaniel Dunbar if dst_channel.type in (UNSIGNED, SIGNED): 5424aa8f2bce0f498152d624f748712a991adc23fddDaniel Dunbar if shift + dst_channel.size < depth: 5434aa8f2bce0f498152d624f748712a991adc23fddDaniel Dunbar value = '(%s) & 0x%x' % (value, (1 << dst_channel.size) - 1) 5444aa8f2bce0f498152d624f748712a991adc23fddDaniel Dunbar if shift: 545697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett value = '(%s) << %u' % (value, shift) 546697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett if dst_channel.type == SIGNED: 547697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett # Cast to unsigned 5483f22509ebf91aa96658ca6e5c5c0b926d8d62e34Chad Rosier value = '(uint%u_t)(%s) ' % (depth, value) 5493f22509ebf91aa96658ca6e5c5c0b926d8d62e34Chad Rosier else: 550697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett value = None 551697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett if value is not None: 552697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett print ' value |= %s;' % (value) 5534aa8f2bce0f498152d624f748712a991adc23fddDaniel Dunbar 5544aa8f2bce0f498152d624f748712a991adc23fddDaniel Dunbar shift += dst_channel.size 5554aa8f2bce0f498152d624f748712a991adc23fddDaniel Dunbar 5564aa8f2bce0f498152d624f748712a991adc23fddDaniel Dunbar if depth > 8: 557697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett print '#ifdef PIPE_ARCH_BIG_ENDIAN' 558697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett print ' value = util_bswap%u(value);' % depth 559697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett print '#endif' 560697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett 56182e6411d004064a29f03a3ea8b8919f297bfa843Argyrios Kyrtzidis print ' *(uint%u_t *)dst = value;' % depth 56211583c757bac6ce5c342f2eb572055dd2619a657Argyrios Kyrtzidis 56311583c757bac6ce5c342f2eb572055dd2619a657Argyrios Kyrtzidis else: 5645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer print ' union util_format_%s pixel;' % format.short_name() 56512f37e411462b8388eb1309357bd62257debacacDeLesley Hutchins 56612f37e411462b8388eb1309357bd62257debacacDeLesley Hutchins for i in range(4): 56712f37e411462b8388eb1309357bd62257debacacDeLesley Hutchins dst_channel = format.channels[i] 56812f37e411462b8388eb1309357bd62257debacacDeLesley Hutchins width = dst_channel.size 56912f37e411462b8388eb1309357bd62257debacacDeLesley Hutchins if inv_swizzle[i] is None: 57012f37e411462b8388eb1309357bd62257debacacDeLesley Hutchins continue 57115221422eda7bac679e38b07512feda49715ef66Chris Lattner dst_colorspace = format.colorspace 57285bea9777d444ccbcc086d98f075fe666c2e865dDouglas Gregor if dst_colorspace == SRGB and inv_swizzle[i] == 3: 57385bea9777d444ccbcc086d98f075fe666c2e865dDouglas Gregor # Alpha channel is linear 57485bea9777d444ccbcc086d98f075fe666c2e865dDouglas Gregor dst_colorspace = RGB 57585bea9777d444ccbcc086d98f075fe666c2e865dDouglas Gregor value ='src[%u]' % inv_swizzle[i] 57685bea9777d444ccbcc086d98f075fe666c2e865dDouglas Gregor value = conversion_expr(src_channel, 57785bea9777d444ccbcc086d98f075fe666c2e865dDouglas Gregor dst_channel, dst_native_type, 57853eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner value, 5791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump dst_colorspace = dst_colorspace) 580c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor print ' pixel.chan.%s = %s;' % (dst_channel.name, value) 581c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor 582c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor bswap_format(format) 583c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor print ' memcpy(dst, &pixel, sizeof pixel);' 584697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett 585697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett 586697c7a8af6d090bff2b572553da0957de1724e1eJames Dennettdef generate_format_unpack(format, dst_channel, dst_native_type, dst_suffix): 587697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett '''Generate the function to unpack pixels from a particular format''' 588686775deca8b8685eb90801495880e3abdd844c2Chris Lattner 58933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis name = format.short_name() 59033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 5911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump print 'static INLINE void' 592697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett 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) 593697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett print '{' 5943fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner 5953fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner if is_format_supported(format): 5963fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner print ' unsigned x, y;' 597b54d8af9a66cc20a6a9a9219c7eaea8df7ee7fd4Chris Lattner print ' for(y = 0; y < height; y += %u) {' % (format.block_height,) 598686775deca8b8685eb90801495880e3abdd844c2Chris Lattner print ' %s *dst = dst_row;' % (dst_native_type) 5994def70d3040e73707c738f7c366737a986135edfRichard Smith print ' const uint8_t *src = src_row;' 600b54d8af9a66cc20a6a9a9219c7eaea8df7ee7fd4Chris Lattner print ' for(x = 0; x < width; x += %u) {' % (format.block_width,) 6010673cb30340aadaede7b795c763b00f6b64e611cChandler Carruth 6020673cb30340aadaede7b795c763b00f6b64e611cChandler Carruth generate_unpack_kernel(format, dst_channel, dst_native_type) 60322caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner 6041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump print ' src += %u;' % (format.block_size() / 8,) 60592dd386e3f05d176b45a638199d51f536bd9d1c4Chris Lattner print ' dst += 4;' 6063fdf4b071dc79fae778fb5f376485480756c76a3Chris Lattner print ' }' 60792dd386e3f05d176b45a638199d51f536bd9d1c4Chris Lattner print ' src_row += src_stride;' 60822caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner print ' dst_row += dst_stride/sizeof(*dst_row);' 6091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump print ' }' 610abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 611abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor print '}' 612abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor print 613abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 6145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 615d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikiedef generate_format_pack(format, src_channel, src_native_type, src_suffix): 6165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer '''Generate the function to pack pixels to a particular format''' 6175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 618d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie name = format.short_name() 6195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 62078ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie print 'static INLINE void' 6210827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 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) 6220827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis print '{' 6230827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 6241656aaec223949245fdbebf306b719cba0b687caDaniel Dunbar if is_format_supported(format): 6251656aaec223949245fdbebf306b719cba0b687caDaniel Dunbar print ' unsigned x, y;' 62633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis print ' for(y = 0; y < height; y += %u) {' % (format.block_height,) 6271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump print ' const %s *src = src_row;' % (src_native_type) 628697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett print ' uint8_t *dst = dst_row;' 629697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett print ' for(x = 0; x < width; x += %u) {' % (format.block_width,) 630697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett 631697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett generate_pack_kernel(format, src_channel, src_native_type) 632697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett 633697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett print ' src += 4;' 634efce31f51d6e7e31e125f96c20f6cdab3ead0a47James Dennett print ' dst += %u;' % (format.block_size() / 8,) 635509355e982d15da4f8f3939493516379665f6275Ted Kremenek print ' }' 636efce31f51d6e7e31e125f96c20f6cdab3ead0a47James Dennett print ' dst_row += dst_stride;' 6370f9fed70cea107b3f79df554e38bd8e98d48fe47Daniel Dunbar print ' src_row += src_stride/sizeof(*src_row);' 638de4bf6a63219c5b9d3bce1fed3dfe075568098a0Douglas Gregor print ' }' 639e59abb56ce0e1c206fb80bd945a0c358b0abe1efArgyrios Kyrtzidis 640e59abb56ce0e1c206fb80bd945a0c358b0abe1efArgyrios Kyrtzidis print '}' 64193ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor print 6425800f7ea9cf5621280089d690f677bd28064d6b5Ted Kremenek 64393ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor 64493ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregordef generate_format_fetch(format, dst_channel, dst_native_type, dst_suffix): 64593ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor '''Generate the function to unpack pixels from a particular format''' 64693ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor 64793ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor name = format.short_name() 64893ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor 64993ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor print 'static INLINE void' 65093ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor print 'util_format_%s_fetch_%s(%s *dst, const uint8_t *src, unsigned i, unsigned j)' % (name, dst_suffix, dst_native_type) 65193ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor print '{' 65293ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor 65393ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor if is_format_supported(format): 65493ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor generate_unpack_kernel(format, dst_channel, dst_native_type) 65593ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor 65693ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor print '}' 65793ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor print 65893ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor 65993ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor 660d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikiedef is_format_hand_written(format): 66193ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor return format.layout in ('s3tc', 'rgtc', 'etc', 'subsampled', 'other') or format.colorspace == ZS 66293ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor 66393ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor 664d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikiedef generate(formats): 665686775deca8b8685eb90801495880e3abdd844c2Chris Lattner print 666686775deca8b8685eb90801495880e3abdd844c2Chris Lattner print '#include "pipe/p_compiler.h"' 66793ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor print '#include "u_math.h"' 668de4bf6a63219c5b9d3bce1fed3dfe075568098a0Douglas Gregor print '#include "u_half.h"' 669de4bf6a63219c5b9d3bce1fed3dfe075568098a0Douglas Gregor print '#include "u_format.h"' 6701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump print '#include "u_format_other.h"' 6710a14eee528a901c16f0e288fbc10a3abc1660d87Chris Lattner print '#include "u_format_srgb.h"' 67293ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor print '#include "u_format_yuv.h"' 67393ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor print '#include "u_format_zs.h"' 67493ea5cb0edf8e509c5113e70cb05ee247c9bdf6bDouglas Gregor print 6753cbfe2c4159e0a219ae660d50625c013aa4afbd0Chris Lattner 6763cbfe2c4159e0a219ae660d50625c013aa4afbd0Chris Lattner for format in formats: 6770a14eee528a901c16f0e288fbc10a3abc1660d87Chris Lattner if not is_format_hand_written(format): 6780a14eee528a901c16f0e288fbc10a3abc1660d87Chris Lattner 6790a14eee528a901c16f0e288fbc10a3abc1660d87Chris Lattner if is_format_supported(format): 6800a14eee528a901c16f0e288fbc10a3abc1660d87Chris Lattner generate_format_type(format) 68133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 6823cbfe2c4159e0a219ae660d50625c013aa4afbd0Chris Lattner if is_format_pure_unsigned(format): 68340847cfb58acc3cac7d68727df9455ac45f2e118David Blaikie native_type = 'unsigned' 6849b623639378d53a675921ddfa7316034d571881eDouglas Gregor suffix = 'unsigned' 6859c4eb1f3438370355f51dc8c62f2ca4803e3338dArgyrios Kyrtzidis channel = Channel(UNSIGNED, False, True, 32) 6869b623639378d53a675921ddfa7316034d571881eDouglas Gregor 687697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett generate_format_unpack(format, channel, native_type, suffix) 68833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis generate_format_pack(format, channel, native_type, suffix) 6891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 690697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett channel = Channel(SIGNED, False, True, 32) 691697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett native_type = 'int' 6923cbfe2c4159e0a219ae660d50625c013aa4afbd0Chris Lattner suffix = 'signed' 693b7fc3b87d065041a10eaa0603d738df21ff7af3aChris Lattner generate_format_unpack(format, channel, native_type, suffix) 694b7fc3b87d065041a10eaa0603d738df21ff7af3aChris Lattner generate_format_pack(format, channel, native_type, suffix) 69573d2a1b05bb04ab0136af374ddaa5d4602d4c939Chris Lattner elif is_format_pure_signed(format): 696697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett native_type = 'int' 697697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett suffix = 'signed' 698af50aab0c317462129d73ae8000c6394c718598dJames Dennett channel = Channel(SIGNED, False, True, 32) 699af50aab0c317462129d73ae8000c6394c718598dJames Dennett 700af50aab0c317462129d73ae8000c6394c718598dJames Dennett generate_format_unpack(format, channel, native_type, suffix) 701981e279b95f3a71e2268124b1abaae050ec200dcDaniel Dunbar generate_format_pack(format, channel, native_type, suffix) 702981e279b95f3a71e2268124b1abaae050ec200dcDaniel Dunbar 703697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett native_type = 'unsigned' 704981e279b95f3a71e2268124b1abaae050ec200dcDaniel Dunbar suffix = 'unsigned' 705981e279b95f3a71e2268124b1abaae050ec200dcDaniel Dunbar channel = Channel(UNSIGNED, False, True, 32) 706697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett generate_format_unpack(format, channel, native_type, suffix) 707981e279b95f3a71e2268124b1abaae050ec200dcDaniel Dunbar generate_format_pack(format, channel, native_type, suffix) 70873d2a1b05bb04ab0136af374ddaa5d4602d4c939Chris Lattner else: 7091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump channel = Channel(FLOAT, False, False, 32) 710697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett native_type = 'float' 711730e0fdbbf9b315ef834074054ac55af3a4fcc0cChris Lattner suffix = 'rgba_float' 712697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett 713730e0fdbbf9b315ef834074054ac55af3a4fcc0cChris Lattner generate_format_unpack(format, channel, native_type, suffix) 714697c7a8af6d090bff2b572553da0957de1724e1eJames Dennett generate_format_pack(format, channel, native_type, suffix) 715981e279b95f3a71e2268124b1abaae050ec200dcDaniel Dunbar generate_format_fetch(format, channel, native_type, suffix) 716ee1828a6b5ae1bc4ea300e48f3840ac1ec5be295Douglas Gregor 717af50aab0c317462129d73ae8000c6394c718598dJames Dennett channel = Channel(UNSIGNED, True, False, 8) 718af50aab0c317462129d73ae8000c6394c718598dJames Dennett native_type = 'uint8_t' 719af50aab0c317462129d73ae8000c6394c718598dJames Dennett suffix = 'rgba_8unorm' 720af50aab0c317462129d73ae8000c6394c718598dJames Dennett 721af50aab0c317462129d73ae8000c6394c718598dJames Dennett generate_format_unpack(format, channel, native_type, suffix) 72273d2a1b05bb04ab0136af374ddaa5d4602d4c939Chris Lattner generate_format_pack(format, channel, native_type, suffix) 7231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 724af50aab0c317462129d73ae8000c6394c718598dJames Dennett