1589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca#!/usr/bin/env python
2589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
35479fa34d9acebd55f68c23a278cf382d0e84248José FonsecaCopyRight = '''
4589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca/**************************************************************************
5589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca *
6589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * Copyright 2009 VMware, Inc.
7589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * All Rights Reserved.
8589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca *
9589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
10589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * copy of this software and associated documentation files (the
11589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * "Software"), to deal in the Software without restriction, including
12589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
13589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
14589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
15589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * the following conditions:
16589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca *
17589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * The above copyright notice and this permission notice (including the
18589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
19589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * of the Software.
20589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca *
21589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
24589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
25589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca *
29589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca **************************************************************************/
30589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
31589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca/**
32589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * @file
33589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * Pixel format accessor functions.
34589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca *
35589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
36589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca */
37589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca'''
38589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
39589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
40589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonsecaimport sys
41589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonsecaimport os.path
42589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
43589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonsecasys.path.insert(0, os.path.join(os.path.dirname(sys.argv[0]), '../../auxiliary/util'))
44589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
458e833c7988a218d3c01ff79f17bdeed40058b32eJosé Fonsecafrom u_format_pack import *
46589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
47589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
489899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonsecadef is_format_supported(format):
499899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca    '''Determines whether we actually have the plumbing necessary to generate the
509899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca    to read/write to/from this format.'''
519899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca
529899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca    # FIXME: Ideally we would support any format combination here.
539899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca
544fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie    if format.name == 'PIPE_FORMAT_R11G11B10_FLOAT':
554fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        return True;
564fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie
574fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie    if format.name == 'PIPE_FORMAT_R9G9B9E5_FLOAT':
584fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        return True;
594fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie
609899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca    if format.layout != PLAIN:
619899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca        return False
629899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca
639899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca    for i in range(4):
649899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca        channel = format.channels[i]
659899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca        if channel.type not in (VOID, UNSIGNED, SIGNED, FLOAT):
669899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca            return False
6700f8e5764d5b41714704c94575a5b6f873340a2fAlan Hourihane        if channel.type == FLOAT and channel.size not in (16, 32 ,64):
689899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca            return False
699899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca
709899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca    if format.colorspace not in ('rgb', 'srgb'):
719899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca        return False
729899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca
739899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca    return True
749899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca
759899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca
76092010db3798f9a49ff9184bf238099af849e885José Fonsecadef generate_format_read(format, dst_channel, dst_native_type, dst_suffix):
77589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    '''Generate the function to read pixels from a particular format'''
78589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
79085810542f40f71d93d84d4198166e915df4d384José Fonseca    name = format.short_name()
80589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
81589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    src_native_type = native_type(format)
82589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
83589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print 'static void'
84473cf0633959aa3fb965e27499d4f4ca60e6cafdBrian Paul    print 'lp_tile_%s_swizzle_%s(%s * restrict dst, const uint8_t * restrict src, unsigned src_stride, unsigned x0, unsigned y0)' % (name, dst_suffix, dst_native_type)
85589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '{'
86589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '   unsigned x, y;'
87589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '   const uint8_t *src_row = src + y0*src_stride;'
886d17f00600ffca7cb39e6f66277cec018ff2c151José Fonseca    print '   for (y = 0; y < TILE_SIZE; ++y) {'
89589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '      const %s *src_pixel = (const %s *)(src_row + x0*%u);' % (src_native_type, src_native_type, format.stride())
906d17f00600ffca7cb39e6f66277cec018ff2c151José Fonseca    print '      for (x = 0; x < TILE_SIZE; ++x) {'
91589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
92589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    names = ['']*4
938e833c7988a218d3c01ff79f17bdeed40058b32eJosé Fonseca    if format.colorspace in ('rgb', 'srgb'):
94589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        for i in range(4):
95092010db3798f9a49ff9184bf238099af849e885José Fonseca            swizzle = format.swizzles[i]
96589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            if swizzle < 4:
97589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca                names[swizzle] += 'rgba'[i]
98589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    elif format.colorspace == 'zs':
99092010db3798f9a49ff9184bf238099af849e885José Fonseca        swizzle = format.swizzles[0]
100589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        if swizzle < 4:
101589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            names[swizzle] = 'z'
102589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        else:
103589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            assert False
104589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    else:
105589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        assert False
106589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
1074fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie    if format.name == 'PIPE_FORMAT_R11G11B10_FLOAT':
1084fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        print '         float tmp[3];'
1094fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        print '         uint8_t r, g, b;'
1104fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        print '         r11g11b10f_to_float3(*src_pixel++, tmp);'
1114fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        for i in range(3):
1124fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie            print '         %s = tmp[%d] * 0xff;' % (names[i], i)
1134fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie    elif format.name == 'PIPE_FORMAT_R9G9B9E5_FLOAT':
1144fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        print '         float tmp[3];'
1154fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        print '         uint8_t r, g, b;'
1164fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        print '         rgb9e5_to_float3(*src_pixel++, tmp);'
1174fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        for i in range(3):
1184fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie            print '         %s = tmp[%d] * 0xff;' % (names[i], i)
1194fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie    elif format.layout == PLAIN:
120a9395360f2fd113beac759ca642d48588e0846f9José Fonseca        if not format.is_array():
121a9395360f2fd113beac759ca642d48588e0846f9José Fonseca            print '         %s pixel = *src_pixel++;' % src_native_type
122a9395360f2fd113beac759ca642d48588e0846f9José Fonseca            shift = 0;
123a9395360f2fd113beac759ca642d48588e0846f9José Fonseca            for i in range(4):
124092010db3798f9a49ff9184bf238099af849e885José Fonseca                src_channel = format.channels[i]
125092010db3798f9a49ff9184bf238099af849e885José Fonseca                width = src_channel.size
126a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                if names[i]:
127a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                    value = 'pixel'
128a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                    mask = (1 << width) - 1
129a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                    if shift:
130a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                        value = '(%s >> %u)' % (value, shift)
131a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                    if shift + width < format.block_size():
132a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                        value = '(%s & 0x%x)' % (value, mask)
1339beb302212a2afac408016cbd7b93c8b859e4910José Fonseca                    value = conversion_expr(src_channel, dst_channel, dst_native_type, value, clamp=False)
134a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                    print '         %s %s = %s;' % (dst_native_type, names[i], value)
135a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                shift += width
136a9395360f2fd113beac759ca642d48588e0846f9José Fonseca        else:
137a9395360f2fd113beac759ca642d48588e0846f9José Fonseca            for i in range(4):
138898ddd6b00ffbb515c83025b1e51092752c182a7José Fonseca                if names[i]:
139898ddd6b00ffbb515c83025b1e51092752c182a7José Fonseca                    print '         %s %s;' % (dst_native_type, names[i])
140898ddd6b00ffbb515c83025b1e51092752c182a7José Fonseca            for i in range(4):
141092010db3798f9a49ff9184bf238099af849e885José Fonseca                src_channel = format.channels[i]
142a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                if names[i]:
143a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                    value = '(*src_pixel++)'
1449beb302212a2afac408016cbd7b93c8b859e4910José Fonseca                    value = conversion_expr(src_channel, dst_channel, dst_native_type, value, clamp=False)
145898ddd6b00ffbb515c83025b1e51092752c182a7José Fonseca                    print '         %s = %s;' % (names[i], value)
146898ddd6b00ffbb515c83025b1e51092752c182a7José Fonseca                elif src_channel.size:
147898ddd6b00ffbb515c83025b1e51092752c182a7José Fonseca                    print '         ++src_pixel;'
148589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    else:
149589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        assert False
150589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
151589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    for i in range(4):
1528e833c7988a218d3c01ff79f17bdeed40058b32eJosé Fonseca        if format.colorspace in ('rgb', 'srgb'):
153092010db3798f9a49ff9184bf238099af849e885José Fonseca            swizzle = format.swizzles[i]
154589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            if swizzle < 4:
155589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca                value = names[swizzle]
156589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            elif swizzle == SWIZZLE_0:
157589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca                value = '0'
158589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            elif swizzle == SWIZZLE_1:
159092010db3798f9a49ff9184bf238099af849e885José Fonseca                value = get_one(dst_channel)
160589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            else:
161589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca                assert False
162589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        elif format.colorspace == 'zs':
163589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            if i < 3:
164589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca                value = 'z'
165589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            else:
166092010db3798f9a49ff9184bf238099af849e885José Fonseca                value = get_one(dst_channel)
167589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        else:
168589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            assert False
169589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        print '         TILE_PIXEL(dst, x, y, %u) = %s; /* %s */' % (i, value, 'rgba'[i])
170589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
171589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '      }'
172589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '      src_row += src_stride;'
173589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '   }'
174589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '}'
175589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print
176589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
177589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
178092010db3798f9a49ff9184bf238099af849e885José Fonsecadef pack_rgba(format, src_channel, r, g, b, a):
17963f249bf909cab60635c2df9122db86eaab6c421Brian Paul    """Return an expression for packing r, g, b, a into a pixel of the
18063f249bf909cab60635c2df9122db86eaab6c421Brian Paul    given format.  Ex: '(b << 24) | (g << 16) | (r << 8) | (a << 0)'
18163f249bf909cab60635c2df9122db86eaab6c421Brian Paul    """
1828e833c7988a218d3c01ff79f17bdeed40058b32eJosé Fonseca    assert format.colorspace in ('rgb', 'srgb')
1834757325951e35460975e77d70dacf8b6eb10ab11José Fonseca    inv_swizzle = format.inv_swizzles()
18463f249bf909cab60635c2df9122db86eaab6c421Brian Paul    shift = 0
18563f249bf909cab60635c2df9122db86eaab6c421Brian Paul    expr = None
18663f249bf909cab60635c2df9122db86eaab6c421Brian Paul    for i in range(4):
187085810542f40f71d93d84d4198166e915df4d384José Fonseca        # choose r, g, b, or a depending on the inverse swizzle term
18863f249bf909cab60635c2df9122db86eaab6c421Brian Paul        if inv_swizzle[i] == 0:
18963f249bf909cab60635c2df9122db86eaab6c421Brian Paul            value = r
19063f249bf909cab60635c2df9122db86eaab6c421Brian Paul        elif inv_swizzle[i] == 1:
19163f249bf909cab60635c2df9122db86eaab6c421Brian Paul            value = g
19263f249bf909cab60635c2df9122db86eaab6c421Brian Paul        elif inv_swizzle[i] == 2:
19363f249bf909cab60635c2df9122db86eaab6c421Brian Paul            value = b
19463f249bf909cab60635c2df9122db86eaab6c421Brian Paul        elif inv_swizzle[i] == 3:
19563f249bf909cab60635c2df9122db86eaab6c421Brian Paul            value = a
19663f249bf909cab60635c2df9122db86eaab6c421Brian Paul        else:
19763f249bf909cab60635c2df9122db86eaab6c421Brian Paul            value = None
19863f249bf909cab60635c2df9122db86eaab6c421Brian Paul
19963f249bf909cab60635c2df9122db86eaab6c421Brian Paul        if value:
200092010db3798f9a49ff9184bf238099af849e885José Fonseca            dst_channel = format.channels[i]
20163f249bf909cab60635c2df9122db86eaab6c421Brian Paul            dst_native_type = native_type(format)
2029beb302212a2afac408016cbd7b93c8b859e4910José Fonseca            value = conversion_expr(src_channel, dst_channel, dst_native_type, value, clamp=False)
20363f249bf909cab60635c2df9122db86eaab6c421Brian Paul            term = "((%s) << %d)" % (value, shift)
20463f249bf909cab60635c2df9122db86eaab6c421Brian Paul            if expr:
20563f249bf909cab60635c2df9122db86eaab6c421Brian Paul                expr = expr + " | " + term
20663f249bf909cab60635c2df9122db86eaab6c421Brian Paul            else:
20763f249bf909cab60635c2df9122db86eaab6c421Brian Paul                expr = term
20863f249bf909cab60635c2df9122db86eaab6c421Brian Paul
209092010db3798f9a49ff9184bf238099af849e885José Fonseca        width = format.channels[i].size
21063f249bf909cab60635c2df9122db86eaab6c421Brian Paul        shift = shift + width
21163f249bf909cab60635c2df9122db86eaab6c421Brian Paul    return expr
21263f249bf909cab60635c2df9122db86eaab6c421Brian Paul
21363f249bf909cab60635c2df9122db86eaab6c421Brian Paul
21423df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonsecadef emit_unrolled_unswizzle_code(format, src_channel):
21563f249bf909cab60635c2df9122db86eaab6c421Brian Paul    '''Emit code for writing a block based on unrolled loops.
21663f249bf909cab60635c2df9122db86eaab6c421Brian Paul    This is considerably faster than the TILE_PIXEL-based code below.
21763f249bf909cab60635c2df9122db86eaab6c421Brian Paul    '''
2188416d342792910bfffcc8806dba0ee35a395b31dJosé Fonseca    dst_native_type = 'uint%u_t' % format.block_size()
21963f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '   const unsigned dstpix_stride = dst_stride / %d;' % format.stride()
22063f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '   %s *dstpix = (%s *) dst;' % (dst_native_type, dst_native_type)
22163f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '   unsigned int qx, qy, i;'
22263f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print
2236d17f00600ffca7cb39e6f66277cec018ff2c151José Fonseca    print '   for (qy = 0; qy < TILE_SIZE; qy += TILE_VECTOR_HEIGHT) {'
22463f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '      const unsigned py = y0 + qy;'
2256d17f00600ffca7cb39e6f66277cec018ff2c151José Fonseca    print '      for (qx = 0; qx < TILE_SIZE; qx += TILE_VECTOR_WIDTH) {'
22663f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '         const unsigned px = x0 + qx;'
22763f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '         const uint8_t *r = src + 0 * TILE_C_STRIDE;'
22863f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '         const uint8_t *g = src + 1 * TILE_C_STRIDE;'
22963f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '         const uint8_t *b = src + 2 * TILE_C_STRIDE;'
23063f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '         const uint8_t *a = src + 3 * TILE_C_STRIDE;'
23163f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '         (void) r; (void) g; (void) b; (void) a; /* silence warnings */'
23263f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '         for (i = 0; i < TILE_C_STRIDE; i += 2) {'
233092010db3798f9a49ff9184bf238099af849e885José Fonseca    print '            const uint32_t pixel0 = %s;' % pack_rgba(format, src_channel, "r[i+0]", "g[i+0]", "b[i+0]", "a[i+0]")
234092010db3798f9a49ff9184bf238099af849e885José Fonseca    print '            const uint32_t pixel1 = %s;' % pack_rgba(format, src_channel, "r[i+1]", "g[i+1]", "b[i+1]", "a[i+1]")
23563f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '            const unsigned offset = (py + tile_y_offset[i]) * dstpix_stride + (px + tile_x_offset[i]);'
23663f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '            dstpix[offset + 0] = pixel0;'
23763f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '            dstpix[offset + 1] = pixel1;'
23863f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '         }'
23963f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '         src += TILE_X_STRIDE;'
24063f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '      }'
24163f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '   }'
24263f249bf909cab60635c2df9122db86eaab6c421Brian Paul
24363f249bf909cab60635c2df9122db86eaab6c421Brian Paul
24423df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonsecadef emit_tile_pixel_unswizzle_code(format, src_channel):
24563f249bf909cab60635c2df9122db86eaab6c421Brian Paul    '''Emit code for writing a block based on the TILE_PIXEL macro.'''
24663f249bf909cab60635c2df9122db86eaab6c421Brian Paul    dst_native_type = native_type(format)
24763f249bf909cab60635c2df9122db86eaab6c421Brian Paul
2484757325951e35460975e77d70dacf8b6eb10ab11José Fonseca    inv_swizzle = format.inv_swizzles()
24963f249bf909cab60635c2df9122db86eaab6c421Brian Paul
25063f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '   unsigned x, y;'
25163f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '   uint8_t *dst_row = dst + y0*dst_stride;'
2526d17f00600ffca7cb39e6f66277cec018ff2c151José Fonseca    print '   for (y = 0; y < TILE_SIZE; ++y) {'
25363f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '      %s *dst_pixel = (%s *)(dst_row + x0*%u);' % (dst_native_type, dst_native_type, format.stride())
2546d17f00600ffca7cb39e6f66277cec018ff2c151José Fonseca    print '      for (x = 0; x < TILE_SIZE; ++x) {'
255589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
2564fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie    if format.name == 'PIPE_FORMAT_R11G11B10_FLOAT':
2574fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        print '         float tmp[3];'
2584fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        for i in range(3):
259b04d19da104729ef0d72981ba66f4d9c9d9f9509Dave Airlie            print '         tmp[%d] = ubyte_to_float(TILE_PIXEL(src, x, y, %u));' % (i, inv_swizzle[i])
2604fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        print '         *dst_pixel++ = float3_to_r11g11b10f(tmp);'
2614fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie    elif format.name == 'PIPE_FORMAT_R9G9B9E5_FLOAT':
2624fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        print '         float tmp[3];'
2634fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        for i in range(3):
264b04d19da104729ef0d72981ba66f4d9c9d9f9509Dave Airlie            print '         tmp[%d] = ubyte_to_float(TILE_PIXEL(src, x, y, %u));' % (i, inv_swizzle[i])
2654fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie        print '         *dst_pixel++ = float3_to_rgb9e5(tmp);'
2664fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie    elif format.layout == PLAIN:
267a9395360f2fd113beac759ca642d48588e0846f9José Fonseca        if not format.is_array():
268a9395360f2fd113beac759ca642d48588e0846f9José Fonseca            print '         %s pixel = 0;' % dst_native_type
269a9395360f2fd113beac759ca642d48588e0846f9José Fonseca            shift = 0;
270a9395360f2fd113beac759ca642d48588e0846f9José Fonseca            for i in range(4):
271092010db3798f9a49ff9184bf238099af849e885José Fonseca                dst_channel = format.channels[i]
272092010db3798f9a49ff9184bf238099af849e885José Fonseca                width = dst_channel.size
273a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                if inv_swizzle[i] is not None:
274a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                    value = 'TILE_PIXEL(src, x, y, %u)' % inv_swizzle[i]
2759beb302212a2afac408016cbd7b93c8b859e4910José Fonseca                    value = conversion_expr(src_channel, dst_channel, dst_native_type, value, clamp=False)
276a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                    if shift:
277a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                        value = '(%s << %u)' % (value, shift)
278a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                    print '         pixel |= %s;' % value
279a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                shift += width
280a9395360f2fd113beac759ca642d48588e0846f9José Fonseca            print '         *dst_pixel++ = pixel;'
281a9395360f2fd113beac759ca642d48588e0846f9José Fonseca        else:
282a9395360f2fd113beac759ca642d48588e0846f9José Fonseca            for i in range(4):
283092010db3798f9a49ff9184bf238099af849e885José Fonseca                dst_channel = format.channels[i]
284a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                if inv_swizzle[i] is not None:
285a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                    value = 'TILE_PIXEL(src, x, y, %u)' % inv_swizzle[i]
2869beb302212a2afac408016cbd7b93c8b859e4910José Fonseca                    value = conversion_expr(src_channel, dst_channel, dst_native_type, value, clamp=False)
287a9395360f2fd113beac759ca642d48588e0846f9José Fonseca                    print '         *dst_pixel++ = %s;' % value
2885745bcb2dbfcaab53df89125d08689b51b9126eaJosé Fonseca                elif dst_channel.size:
289898ddd6b00ffbb515c83025b1e51092752c182a7José Fonseca                    print '         ++dst_pixel;'
290589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    else:
291589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        assert False
292589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
293589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '      }'
294589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '      dst_row += dst_stride;'
295589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '   }'
29663f249bf909cab60635c2df9122db86eaab6c421Brian Paul
29763f249bf909cab60635c2df9122db86eaab6c421Brian Paul
298092010db3798f9a49ff9184bf238099af849e885José Fonsecadef generate_format_write(format, src_channel, src_native_type, src_suffix):
29963f249bf909cab60635c2df9122db86eaab6c421Brian Paul    '''Generate the function to write pixels to a particular format'''
30063f249bf909cab60635c2df9122db86eaab6c421Brian Paul
301085810542f40f71d93d84d4198166e915df4d384José Fonseca    name = format.short_name()
30263f249bf909cab60635c2df9122db86eaab6c421Brian Paul
30363f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print 'static void'
304473cf0633959aa3fb965e27499d4f4ca60e6cafdBrian Paul    print 'lp_tile_%s_unswizzle_%s(const %s * restrict src, uint8_t * restrict dst, unsigned dst_stride, unsigned x0, unsigned y0)' % (name, src_suffix, src_native_type)
30563f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '{'
30683686b3f92f29208e35b971c118e179c14e120dbJosé Fonseca    if format.layout == PLAIN \
307085810542f40f71d93d84d4198166e915df4d384José Fonseca        and format.colorspace == 'rgb' \
308085810542f40f71d93d84d4198166e915df4d384José Fonseca        and format.block_size() <= 32 \
3098416d342792910bfffcc8806dba0ee35a395b31dJosé Fonseca        and format.is_pot() \
310085810542f40f71d93d84d4198166e915df4d384José Fonseca        and not format.is_mixed() \
311898ddd6b00ffbb515c83025b1e51092752c182a7José Fonseca        and (format.channels[0].type == UNSIGNED \
312898ddd6b00ffbb515c83025b1e51092752c182a7José Fonseca             or format.channels[1].type == UNSIGNED):
31323df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca        emit_unrolled_unswizzle_code(format, src_channel)
31463f249bf909cab60635c2df9122db86eaab6c421Brian Paul    else:
31523df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca        emit_tile_pixel_unswizzle_code(format, src_channel)
316589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '}'
317589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print
318589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
319589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
320edba53024f85a27fcbca7cbe139ceda172406653José Fonsecadef generate_sse2():
321bed78862d4db044a87d6c3808548abd6df95dd7dChris Li    print '''
322b7fff13d58b57870807bae2f43fa2854b551b267José Fonseca#if defined(PIPE_ARCH_SSE)
323b7fff13d58b57870807bae2f43fa2854b551b267José Fonseca
32465b9747a54490dd56cd5cee4c2c1b9f51d35f133José Fonseca#include "util/u_sse.h"
325b7fff13d58b57870807bae2f43fa2854b551b267José Fonseca
326edba53024f85a27fcbca7cbe139ceda172406653José Fonsecastatic ALWAYS_INLINE void
327edba53024f85a27fcbca7cbe139ceda172406653José Fonsecaswz4( const __m128i * restrict x,
328edba53024f85a27fcbca7cbe139ceda172406653José Fonseca      const __m128i * restrict y,
329edba53024f85a27fcbca7cbe139ceda172406653José Fonseca      const __m128i * restrict z,
330edba53024f85a27fcbca7cbe139ceda172406653José Fonseca      const __m128i * restrict w,
331edba53024f85a27fcbca7cbe139ceda172406653José Fonseca      __m128i * restrict a,
332edba53024f85a27fcbca7cbe139ceda172406653José Fonseca      __m128i * restrict b,
333edba53024f85a27fcbca7cbe139ceda172406653José Fonseca      __m128i * restrict c,
334edba53024f85a27fcbca7cbe139ceda172406653José Fonseca      __m128i * restrict d)
3352de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell{
3362de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   __m128i i, j, k, l;
3372de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   __m128i m, n, o, p;
3382de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   __m128i e, f, g, h;
3392de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
340edba53024f85a27fcbca7cbe139ceda172406653José Fonseca   m = _mm_unpacklo_epi8(*x,*y);
341edba53024f85a27fcbca7cbe139ceda172406653José Fonseca   n = _mm_unpackhi_epi8(*x,*y);
342edba53024f85a27fcbca7cbe139ceda172406653José Fonseca   o = _mm_unpacklo_epi8(*z,*w);
343edba53024f85a27fcbca7cbe139ceda172406653José Fonseca   p = _mm_unpackhi_epi8(*z,*w);
3442de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
3452de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   i = _mm_unpacklo_epi16(m,n);
3462de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   j = _mm_unpackhi_epi16(m,n);
3472de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   k = _mm_unpacklo_epi16(o,p);
3482de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   l = _mm_unpackhi_epi16(o,p);
3492de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
3502de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   e = _mm_unpacklo_epi8(i,j);
3512de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   f = _mm_unpackhi_epi8(i,j);
3522de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   g = _mm_unpacklo_epi8(k,l);
3532de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   h = _mm_unpackhi_epi8(k,l);
3542de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
3552de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   *a = _mm_unpacklo_epi64(e,g);
3562de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   *b = _mm_unpackhi_epi64(e,g);
3572de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   *c = _mm_unpacklo_epi64(f,h);
3582de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   *d = _mm_unpackhi_epi64(f,h);
3592de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell}
3602de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
361edba53024f85a27fcbca7cbe139ceda172406653José Fonsecastatic ALWAYS_INLINE void
362edba53024f85a27fcbca7cbe139ceda172406653José Fonsecaunswz4( const __m128i * restrict a,
363edba53024f85a27fcbca7cbe139ceda172406653José Fonseca        const __m128i * restrict b,
364edba53024f85a27fcbca7cbe139ceda172406653José Fonseca        const __m128i * restrict c,
365edba53024f85a27fcbca7cbe139ceda172406653José Fonseca        const __m128i * restrict d,
366edba53024f85a27fcbca7cbe139ceda172406653José Fonseca        __m128i * restrict x,
367edba53024f85a27fcbca7cbe139ceda172406653José Fonseca        __m128i * restrict y,
368edba53024f85a27fcbca7cbe139ceda172406653José Fonseca        __m128i * restrict z,
369edba53024f85a27fcbca7cbe139ceda172406653José Fonseca        __m128i * restrict w)
3702de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell{
3712de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   __m128i i, j, k, l;
3722de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   __m128i m, n, o, p;
3732de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
374edba53024f85a27fcbca7cbe139ceda172406653José Fonseca   i = _mm_unpacklo_epi8(*a,*b);
375edba53024f85a27fcbca7cbe139ceda172406653José Fonseca   j = _mm_unpackhi_epi8(*a,*b);
376edba53024f85a27fcbca7cbe139ceda172406653José Fonseca   k = _mm_unpacklo_epi8(*c,*d);
377edba53024f85a27fcbca7cbe139ceda172406653José Fonseca   l = _mm_unpackhi_epi8(*c,*d);
3782de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
3792de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   m = _mm_unpacklo_epi16(i,k);
3802de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   n = _mm_unpackhi_epi16(i,k);
3812de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   o = _mm_unpacklo_epi16(j,l);
3822de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   p = _mm_unpackhi_epi16(j,l);
3832de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
3842de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   *x = _mm_unpacklo_epi64(m,n);
3852de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   *y = _mm_unpackhi_epi64(m,n);
3862de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   *z = _mm_unpacklo_epi64(o,p);
3872de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   *w = _mm_unpackhi_epi64(o,p);
3882de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell}
3892de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
390bed78862d4db044a87d6c3808548abd6df95dd7dChris Listatic void
391edba53024f85a27fcbca7cbe139ceda172406653José Fonsecalp_tile_b8g8r8a8_unorm_swizzle_4ub_sse2(uint8_t * restrict dst,
392edba53024f85a27fcbca7cbe139ceda172406653José Fonseca                                        const uint8_t * restrict src, unsigned src_stride,
393edba53024f85a27fcbca7cbe139ceda172406653José Fonseca                                        unsigned x0, unsigned y0)
394bed78862d4db044a87d6c3808548abd6df95dd7dChris Li{
3952de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   __m128i *dst128 = (__m128i *) dst;
396bed78862d4db044a87d6c3808548abd6df95dd7dChris Li   unsigned x, y;
3972de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
3982de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   src += y0 * src_stride;
3992de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   src += x0 * sizeof(uint32_t);
4002de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
4012de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   for (y = 0; y < TILE_SIZE; y += 4) {
4022de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell      const uint8_t *src_row = src;
4032de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
4042de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell      for (x = 0; x < TILE_SIZE; x += 4) {
405edba53024f85a27fcbca7cbe139ceda172406653José Fonseca         swz4((const __m128i *) (src_row + 0 * src_stride),
406edba53024f85a27fcbca7cbe139ceda172406653José Fonseca              (const __m128i *) (src_row + 1 * src_stride),
407edba53024f85a27fcbca7cbe139ceda172406653José Fonseca              (const __m128i *) (src_row + 2 * src_stride),
408edba53024f85a27fcbca7cbe139ceda172406653José Fonseca              (const __m128i *) (src_row + 3 * src_stride),
4092de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell              dst128 + 2,     /* b */
4102de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell              dst128 + 1,     /* g */
4112de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell              dst128 + 0,     /* r */
4122de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell              dst128 + 3);    /* a */
4132de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
4142de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell         dst128 += 4;
4152de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell         src_row += sizeof(__m128i);
416bed78862d4db044a87d6c3808548abd6df95dd7dChris Li      }
417bed78862d4db044a87d6c3808548abd6df95dd7dChris Li
4182de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell      src += 4 * src_stride;
4192de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   }
420bed78862d4db044a87d6c3808548abd6df95dd7dChris Li}
421bed78862d4db044a87d6c3808548abd6df95dd7dChris Li
422bed78862d4db044a87d6c3808548abd6df95dd7dChris Listatic void
423edba53024f85a27fcbca7cbe139ceda172406653José Fonsecalp_tile_b8g8r8a8_unorm_unswizzle_4ub_sse2(const uint8_t * restrict src,
424edba53024f85a27fcbca7cbe139ceda172406653José Fonseca                                          uint8_t * restrict dst, unsigned dst_stride,
425bed78862d4db044a87d6c3808548abd6df95dd7dChris Li                                          unsigned x0, unsigned y0)
426bed78862d4db044a87d6c3808548abd6df95dd7dChris Li{
427bed78862d4db044a87d6c3808548abd6df95dd7dChris Li   unsigned int x, y;
4282de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   const __m128i *src128 = (const __m128i *) src;
4292de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
4302de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   dst += y0 * dst_stride;
4312de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   dst += x0 * sizeof(uint32_t);
4322de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
4332de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell   for (y = 0; y < TILE_SIZE; y += 4) {
4342de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell      const uint8_t *dst_row = dst;
4352de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
4362de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell      for (x = 0; x < TILE_SIZE; x += 4) {
437edba53024f85a27fcbca7cbe139ceda172406653José Fonseca         unswz4( &src128[2],     /* b */
438edba53024f85a27fcbca7cbe139ceda172406653José Fonseca                 &src128[1],     /* g */
439edba53024f85a27fcbca7cbe139ceda172406653José Fonseca                 &src128[0],     /* r */
440edba53024f85a27fcbca7cbe139ceda172406653José Fonseca                 &src128[3],     /* a */
4412de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell                 (__m128i *) (dst_row + 0 * dst_stride),
4422de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell                 (__m128i *) (dst_row + 1 * dst_stride),
4432de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell                 (__m128i *) (dst_row + 2 * dst_stride),
4442de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell                 (__m128i *) (dst_row + 3 * dst_stride));
4452de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
4462de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell         src128 += 4;
4472de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell         dst_row += sizeof(__m128i);;
448bed78862d4db044a87d6c3808548abd6df95dd7dChris Li      }
4492de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell
4502de720dc8ff89676aa7bb5eb74aeb6d44e028fa2Keith Whitwell      dst += 4 * dst_stride;
451bed78862d4db044a87d6c3808548abd6df95dd7dChris Li   }
452bed78862d4db044a87d6c3808548abd6df95dd7dChris Li}
453bed78862d4db044a87d6c3808548abd6df95dd7dChris Li
454130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jacksonstatic void
455130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jacksonlp_tile_b8g8r8x8_unorm_swizzle_4ub_sse2(uint8_t * restrict dst,
456130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson                                        const uint8_t * restrict src, unsigned src_stride,
457130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson                                        unsigned x0, unsigned y0)
458130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson{
459130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   __m128i *dst128 = (__m128i *) dst;
460130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   unsigned x, y;
461130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
462130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   src += y0 * src_stride;
463130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   src += x0 * sizeof(uint32_t);
464130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
465130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   for (y = 0; y < TILE_SIZE; y += 4) {
466130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson      const uint8_t *src_row = src;
467130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
468130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson      for (x = 0; x < TILE_SIZE; x += 4) {
469130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson         swz4((const __m128i *) (src_row + 0 * src_stride),
470130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson              (const __m128i *) (src_row + 1 * src_stride),
471130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson              (const __m128i *) (src_row + 2 * src_stride),
472130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson              (const __m128i *) (src_row + 3 * src_stride),
473130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson              dst128 + 2,     /* b */
474130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson              dst128 + 1,     /* g */
475130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson              dst128 + 0,     /* r */
476130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson              dst128 + 3);    /* a */
477130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
478130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson         dst128 += 4;
479130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson         src_row += sizeof(__m128i);
480130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson      }
481130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
482130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson      src += 4 * src_stride;
483130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   }
484130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson}
485130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
486130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jacksonstatic void
487130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jacksonlp_tile_b8g8r8x8_unorm_unswizzle_4ub_sse2(const uint8_t * restrict src,
488130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson                                          uint8_t * restrict dst, unsigned dst_stride,
489130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson                                          unsigned x0, unsigned y0)
490130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson{
491130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   unsigned int x, y;
492130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   const __m128i *src128 = (const __m128i *) src;
493130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
494130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   dst += y0 * dst_stride;
495130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   dst += x0 * sizeof(uint32_t);
496130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
497130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   for (y = 0; y < TILE_SIZE; y += 4) {
498130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson      const uint8_t *dst_row = dst;
499130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
500130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson      for (x = 0; x < TILE_SIZE; x += 4) {
501130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson         unswz4( &src128[2],     /* b */
502130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson                 &src128[1],     /* g */
503130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson                 &src128[0],     /* r */
504130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson                 &src128[3],     /* a */
505130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson                 (__m128i *) (dst_row + 0 * dst_stride),
506130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson                 (__m128i *) (dst_row + 1 * dst_stride),
507130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson                 (__m128i *) (dst_row + 2 * dst_stride),
508130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson                 (__m128i *) (dst_row + 3 * dst_stride));
509130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
510130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson         src128 += 4;
511130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson         dst_row += sizeof(__m128i);;
512130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson      }
513130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
514130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson      dst += 4 * dst_stride;
515130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson   }
516130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson}
517130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson
518edba53024f85a27fcbca7cbe139ceda172406653José Fonseca#endif /* PIPE_ARCH_SSE */
519bed78862d4db044a87d6c3808548abd6df95dd7dChris Li'''
520bed78862d4db044a87d6c3808548abd6df95dd7dChris Li
521bed78862d4db044a87d6c3808548abd6df95dd7dChris Li
52223df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonsecadef generate_swizzle(formats, dst_channel, dst_native_type, dst_suffix):
523589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    '''Generate the dispatch function to read pixels from any format'''
524589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
525589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    for format in formats:
526589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        if is_format_supported(format):
527092010db3798f9a49ff9184bf238099af849e885José Fonseca            generate_format_read(format, dst_channel, dst_native_type, dst_suffix)
528589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
529589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print 'void'
5306d17f00600ffca7cb39e6f66277cec018ff2c151José Fonseca    print 'lp_tile_swizzle_%s(enum pipe_format format, %s *dst, const void *src, unsigned src_stride, unsigned x, unsigned y)' % (dst_suffix, dst_native_type)
531589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '{'
532473cf0633959aa3fb965e27499d4f4ca60e6cafdBrian Paul    print '   void (*func)(%s * restrict dst, const uint8_t * restrict src, unsigned src_stride, unsigned x0, unsigned y0);' % dst_native_type
53323df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    print '#ifdef DEBUG'
53423df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    print '   lp_tile_swizzle_count += 1;'
53523df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    print '#endif'
536589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '   switch(format) {'
537589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    for format in formats:
538589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        if is_format_supported(format):
539589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            print '   case %s:' % format.name
540bed78862d4db044a87d6c3808548abd6df95dd7dChris Li            func_name = 'lp_tile_%s_swizzle_%s' % (format.short_name(), dst_suffix)
541130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson            if format.name == 'PIPE_FORMAT_B8G8R8A8_UNORM' or format.name == 'PIPE_FORMAT_B8G8R8X8_UNORM':
542b7fff13d58b57870807bae2f43fa2854b551b267José Fonseca                print '#ifdef PIPE_ARCH_SSE'
543edba53024f85a27fcbca7cbe139ceda172406653José Fonseca                print '      func = util_cpu_caps.has_sse2 ? %s_sse2 : %s;' % (func_name, func_name)
544bed78862d4db044a87d6c3808548abd6df95dd7dChris Li                print '#else'
545bed78862d4db044a87d6c3808548abd6df95dd7dChris Li                print '      func = %s;' % (func_name,)
546bed78862d4db044a87d6c3808548abd6df95dd7dChris Li                print '#endif'
547bed78862d4db044a87d6c3808548abd6df95dd7dChris Li            else:
548bed78862d4db044a87d6c3808548abd6df95dd7dChris Li                print '      func = %s;' % (func_name,)
549589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            print '      break;'
550589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '   default:'
5518e833c7988a218d3c01ff79f17bdeed40058b32eJosé Fonseca    print '      debug_printf("%s: unsupported format %s\\n", __FUNCTION__, util_format_name(format));'
552589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '      return;'
553589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '   }'
5546d17f00600ffca7cb39e6f66277cec018ff2c151José Fonseca    print '   func(dst, (const uint8_t *)src, src_stride, x, y);'
555589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '}'
556589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print
557589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
558589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
55923df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonsecadef generate_unswizzle(formats, src_channel, src_native_type, src_suffix):
560589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    '''Generate the dispatch function to write pixels to any format'''
561589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
562589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    for format in formats:
563589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        if is_format_supported(format):
564092010db3798f9a49ff9184bf238099af849e885José Fonseca            generate_format_write(format, src_channel, src_native_type, src_suffix)
565589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
566589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print 'void'
5676d17f00600ffca7cb39e6f66277cec018ff2c151José Fonseca    print 'lp_tile_unswizzle_%s(enum pipe_format format, const %s *src, void *dst, unsigned dst_stride, unsigned x, unsigned y)' % (src_suffix, src_native_type)
568589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
569589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '{'
570473cf0633959aa3fb965e27499d4f4ca60e6cafdBrian Paul    print '   void (*func)(const %s * restrict src, uint8_t * restrict dst, unsigned dst_stride, unsigned x0, unsigned y0);' % src_native_type
57123df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    print '#ifdef DEBUG'
57223df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    print '   lp_tile_unswizzle_count += 1;'
57323df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    print '#endif'
574589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '   switch(format) {'
575589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    for format in formats:
576589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        if is_format_supported(format):
577589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            print '   case %s:' % format.name
578bed78862d4db044a87d6c3808548abd6df95dd7dChris Li            func_name = 'lp_tile_%s_unswizzle_%s' % (format.short_name(), src_suffix)
579130e7ead87a065faefc7bb03e680c80e04c0a637Adam Jackson            if format.name == 'PIPE_FORMAT_B8G8R8A8_UNORM' or format.name == 'PIPE_FORMAT_B8G8R8X8_UNORM':
580b7fff13d58b57870807bae2f43fa2854b551b267José Fonseca                print '#ifdef PIPE_ARCH_SSE'
581edba53024f85a27fcbca7cbe139ceda172406653José Fonseca                print '      func = util_cpu_caps.has_sse2 ? %s_sse2 : %s;' % (func_name, func_name)
582bed78862d4db044a87d6c3808548abd6df95dd7dChris Li                print '#else'
583bed78862d4db044a87d6c3808548abd6df95dd7dChris Li                print '      func = %s;' % (func_name,)
584bed78862d4db044a87d6c3808548abd6df95dd7dChris Li                print '#endif'
585bed78862d4db044a87d6c3808548abd6df95dd7dChris Li            else:
586bed78862d4db044a87d6c3808548abd6df95dd7dChris Li                print '      func = %s;' % (func_name,)
587589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca            print '      break;'
588589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '   default:'
5898e833c7988a218d3c01ff79f17bdeed40058b32eJosé Fonseca    print '      debug_printf("%s: unsupported format %s\\n", __FUNCTION__, util_format_name(format));'
590589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '      return;'
591589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '   }'
5926d17f00600ffca7cb39e6f66277cec018ff2c151José Fonseca    print '   func(src, (uint8_t *)dst, dst_stride, x, y);'
593589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '}'
594589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print
595589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
596589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
597589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonsecadef main():
598589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    formats = []
599589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    for arg in sys.argv[1:]:
600589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca        formats.extend(parse(arg))
601589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
602589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '/* This file is autogenerated by lp_tile_soa.py from u_format.csv. Do not edit directly. */'
603589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print
604589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    # This will print the copyright message on the top of this file
6055479fa34d9acebd55f68c23a278cf382d0e84248José Fonseca    print CopyRight.strip()
606589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print
607589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '#include "pipe/p_compiler.h"'
608589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '#include "util/u_math.h"'
6094fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie    print '#include "util/u_format.h"'
6104fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie    print '#include "util/u_format_r11g11b10f.h"'
6114fd485666a9a52c48633d261c2fdd763d63299f5Dave Airlie    print '#include "util/u_format_rgb9e5.h"'
6129899ebd2fcb099279320d0bf77221d6b1e6e7cd9José Fonseca    print '#include "util/u_half.h"'
613bed78862d4db044a87d6c3808548abd6df95dd7dChris Li    print '#include "util/u_cpu_detect.h"'
614589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '#include "lp_tile_soa.h"'
615589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print
61623df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    print '#ifdef DEBUG'
61723df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    print 'unsigned lp_tile_unswizzle_count = 0;'
61823df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    print 'unsigned lp_tile_swizzle_count = 0;'
61923df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    print '#endif'
6200639765b2850739af1678f10fc0c5706d5827776Brian Paul    print
621589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print 'const unsigned char'
622589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print 'tile_offset[TILE_VECTOR_HEIGHT][TILE_VECTOR_WIDTH] = {'
6232f5f357c5b67869e75087fc1f17ed0d666fb134eJosé Fonseca    print '   {  0,  1,  4,  5},'
6242f5f357c5b67869e75087fc1f17ed0d666fb134eJosé Fonseca    print '   {  2,  3,  6,  7},'
6252f5f357c5b67869e75087fc1f17ed0d666fb134eJosé Fonseca    print '   {  8,  9, 12, 13},'
6262f5f357c5b67869e75087fc1f17ed0d666fb134eJosé Fonseca    print '   { 10, 11, 14, 15}'
627589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print '};'
628589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    print
62963f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '/* Note: these lookup tables could be replaced with some'
63063f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print ' * bit-twiddling code, but this is a little faster.'
63163f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print ' */'
63263f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print 'static unsigned tile_x_offset[TILE_VECTOR_WIDTH * TILE_VECTOR_HEIGHT] = {'
63363f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '   0, 1, 0, 1, 2, 3, 2, 3,'
63463f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '   0, 1, 0, 1, 2, 3, 2, 3'
63563f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '};'
63663f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print
63763f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print 'static unsigned tile_y_offset[TILE_VECTOR_WIDTH * TILE_VECTOR_HEIGHT] = {'
63863f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '   0, 0, 1, 1, 0, 0, 1, 1,'
63963f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '   2, 2, 3, 3, 2, 2, 3, 3'
64063f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print '};'
64163f249bf909cab60635c2df9122db86eaab6c421Brian Paul    print
642589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
643edba53024f85a27fcbca7cbe139ceda172406653José Fonseca    generate_sse2()
644bed78862d4db044a87d6c3808548abd6df95dd7dChris Li
645a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie    channel = Channel(UNSIGNED, True, False, 8)
646589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    native_type = 'uint8_t'
647589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    suffix = '4ub'
648589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
64923df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    generate_swizzle(formats, channel, native_type, suffix)
65023df86d851dd6cbce1ddd7a45424c7bf14c04a3eJosé Fonseca    generate_unswizzle(formats, channel, native_type, suffix)
651589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
652589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca
653589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonsecaif __name__ == '__main__':
654589ec337f0080893baba996201cf65bb6e1a2fecJosé Fonseca    main()
655