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