util: Use python names consistent with u_format.h

This commit is contained in:
José Fonseca 2010-02-26 11:03:06 +00:00
parent fe25476c04
commit 092010db37
4 changed files with 161 additions and 149 deletions

View file

@ -56,12 +56,12 @@ def is_format_supported(format):
return False
for i in range(4):
type = format.in_types[i]
if type.kind not in (VOID, UNSIGNED, FLOAT):
channel = format.channels[i]
if channel.type not in (VOID, UNSIGNED, FLOAT):
return False
# We can only read a color from a depth/stencil format if the depth channel is present
if format.colorspace == 'zs' and format.out_swizzle[0] == SWIZZLE_NONE:
if format.colorspace == 'zs' and format.swizzles[0] == SWIZZLE_NONE:
return False
return True
@ -76,15 +76,15 @@ def native_type(format):
return 'uint%u_t' % format.block_size()
else:
# For array pixel formats return the integer type that matches the color channel
type = format.in_types[0]
if type.kind == UNSIGNED:
return 'uint%u_t' % type.size
elif type.kind == SIGNED:
return 'int%u_t' % type.size
elif type.kind == FLOAT:
if type.size == 32:
channel = format.channels[0]
if channel.type == UNSIGNED:
return 'uint%u_t' % channel.size
elif channel.type == SIGNED:
return 'int%u_t' % channel.size
elif channel.type == FLOAT:
if channel.size == 32:
return 'float'
elif type.size == 64:
elif channel.size == 64:
return 'double'
else:
assert False
@ -108,27 +108,27 @@ def intermediate_native_type(bits, sign):
return 'uint%u_t' % bits
def get_one_shift(type):
'''Get the number of the bit that matches unity for this type.'''
if type.kind == 'FLOAT':
def get_one_shift(channel):
'''Get the number of the bit that matches unity for this channel.'''
if channel.type == 'FLOAT':
assert False
if not type.norm:
if not channel.norm:
return 0
if type.kind == UNSIGNED:
return type.size
if type.kind == SIGNED:
return type.size - 1
if type.kind == FIXED:
return type.size / 2
if channel.type == UNSIGNED:
return channel.size
if channel.type == SIGNED:
return channel.size - 1
if channel.type == FIXED:
return channel.size / 2
assert False
def get_one(type):
'''Get the value of unity for this type.'''
if type.kind == 'FLOAT' or not type.norm:
def get_one(channel):
'''Get the value of unity for this channel.'''
if channel.type == 'FLOAT' or not channel.norm:
return 1
else:
return (1 << get_one_shift(type)) - 1
return (1 << get_one_shift(channel)) - 1
def generate_clamp():
@ -156,32 +156,32 @@ def generate_clamp():
print
def clamp_expr(src_type, dst_type, dst_native_type, value):
def clamp_expr(src_channel, dst_channel, dst_native_type, value):
'''Generate the expression to clamp the value in the source type to the
destination type range.'''
if src_type == dst_type:
if src_channel == dst_channel:
return value
# Pick the approriate clamp function
if src_type.kind == FLOAT:
if src_type.size == 32:
if src_channel.type == FLOAT:
if src_channel.size == 32:
func = 'clampf'
elif src_type.size == 64:
elif src_channel.size == 64:
func = 'clamp'
else:
assert False
elif src_type.kind == UNSIGNED:
elif src_channel.type == UNSIGNED:
func = 'clampui'
elif src_type.kind == SIGNED:
elif src_channel.type == SIGNED:
func = 'clampsi'
else:
assert False
# Clamp floats to [-1, 1] or [0, 1] range
if src_type.kind == FLOAT and dst_type.norm:
if src_channel.type == FLOAT and dst_channel.norm:
max = 1
if src_type.sign and dst_type.sign:
if src_channel.sign and dst_channel.sign:
min = -1
else:
min = 0
@ -192,24 +192,24 @@ def clamp_expr(src_type, dst_type, dst_native_type, value):
return value
def conversion_expr(src_type, dst_type, dst_native_type, value):
def conversion_expr(src_channel, dst_channel, dst_native_type, value):
'''Generate the expression to convert a value between two types.'''
if src_type == dst_type:
if src_channel == dst_channel:
return value
if src_type.kind == FLOAT and dst_type.kind == FLOAT:
if src_channel.type == FLOAT and dst_channel.type == FLOAT:
return '(%s)%s' % (dst_native_type, value)
if not src_type.norm and not dst_type.norm:
if not src_channel.norm and not dst_channel.norm:
return '(%s)%s' % (dst_native_type, value)
value = clamp_expr(src_type, dst_type, dst_native_type, value)
value = clamp_expr(src_channel, dst_channel, dst_native_type, value)
if dst_type.kind == FLOAT:
if src_type.norm:
one = get_one(src_type)
if src_type.size <= 23:
if dst_channel.type == FLOAT:
if src_channel.norm:
one = get_one(src_channel)
if src_channel.size <= 23:
scale = '(1.0f/0x%x)' % one
else:
# bigger than single precision mantissa, use double
@ -217,10 +217,10 @@ def conversion_expr(src_type, dst_type, dst_native_type, value):
value = '(%s * %s)' % (value, scale)
return '(%s)%s' % (dst_native_type, value)
if src_type.kind == FLOAT:
if dst_type.norm:
dst_one = get_one(dst_type)
if dst_type.size <= 23:
if src_channel.type == FLOAT:
if dst_channel.norm:
dst_one = get_one(dst_channel)
if dst_channel.size <= 23:
scale = '0x%x' % dst_one
else:
# bigger than single precision mantissa, use double
@ -228,18 +228,18 @@ def conversion_expr(src_type, dst_type, dst_native_type, value):
value = '(%s * %s)' % (value, scale)
return '(%s)%s' % (dst_native_type, value)
if src_type.kind == dst_type.kind:
src_one = get_one(src_type)
dst_one = get_one(dst_type)
if src_channel.type == dst_channel.type:
src_one = get_one(src_channel)
dst_one = get_one(dst_channel)
if src_one > dst_one and src_type.norm and dst_type.norm:
if src_one > dst_one and src_channel.norm and dst_channel.norm:
# We can just bitshift
src_shift = get_one_shift(src_type)
dst_shift = get_one_shift(dst_type)
src_shift = get_one_shift(src_channel)
dst_shift = get_one_shift(dst_channel)
value = '(%s >> %s)' % (value, src_shift - dst_shift)
else:
# We need to rescale using an intermediate type big enough to hold the multiplication of both
tmp_native_type = intermediate_native_type(src_type.size + dst_type.size, src_type.sign and dst_type.sign)
tmp_native_type = intermediate_native_type(src_channel.size + dst_channel.size, src_channel.sign and dst_channel.sign)
value = '(%s)%s' % (tmp_native_type, value)
value = '%s * 0x%x / 0x%x' % (value, dst_one, src_one)
value = '(%s)%s' % (dst_native_type, value)
@ -253,11 +253,11 @@ def compute_inverse_swizzle(format):
inv_swizzle = [None]*4
if format.colorspace == 'rgb':
for i in range(4):
swizzle = format.out_swizzle[i]
swizzle = format.swizzles[i]
if swizzle < 4:
inv_swizzle[swizzle] = i
elif format.colorspace == 'zs':
swizzle = format.out_swizzle[0]
swizzle = format.swizzles[0]
if swizzle < 4:
inv_swizzle[swizzle] = 0
else:
@ -266,7 +266,7 @@ def compute_inverse_swizzle(format):
return inv_swizzle
def generate_format_read(format, dst_type, dst_native_type, dst_suffix):
def generate_format_read(format, dst_channel, dst_native_type, dst_suffix):
'''Generate the function to read pixels from a particular format'''
name = format.short_name()
@ -287,11 +287,11 @@ def generate_format_read(format, dst_type, dst_native_type, dst_suffix):
names = ['']*4
if format.colorspace == 'rgb':
for i in range(4):
swizzle = format.out_swizzle[i]
swizzle = format.swizzles[i]
if swizzle < 4:
names[swizzle] += 'rgba'[i]
elif format.colorspace == 'zs':
swizzle = format.out_swizzle[0]
swizzle = format.swizzles[0]
if swizzle < 4:
names[swizzle] = 'z'
else:
@ -304,8 +304,8 @@ def generate_format_read(format, dst_type, dst_native_type, dst_suffix):
print ' %s pixel = *src_pixel++;' % src_native_type
shift = 0;
for i in range(4):
src_type = format.in_types[i]
width = src_type.size
src_channel = format.channels[i]
width = src_channel.size
if names[i]:
value = 'pixel'
mask = (1 << width) - 1
@ -313,35 +313,35 @@ def generate_format_read(format, dst_type, dst_native_type, dst_suffix):
value = '(%s >> %u)' % (value, shift)
if shift + width < format.block_size():
value = '(%s & 0x%x)' % (value, mask)
value = conversion_expr(src_type, dst_type, dst_native_type, value)
value = conversion_expr(src_channel, dst_channel, dst_native_type, value)
print ' %s %s = %s;' % (dst_native_type, names[i], value)
shift += width
else:
for i in range(4):
src_type = format.in_types[i]
src_channel = format.channels[i]
if names[i]:
value = '(*src_pixel++)'
value = conversion_expr(src_type, dst_type, dst_native_type, value)
value = conversion_expr(src_channel, dst_channel, dst_native_type, value)
print ' %s %s = %s;' % (dst_native_type, names[i], value)
else:
assert False
for i in range(4):
if format.colorspace == 'rgb':
swizzle = format.out_swizzle[i]
swizzle = format.swizzles[i]
if swizzle < 4:
value = names[swizzle]
elif swizzle == SWIZZLE_0:
value = '0'
elif swizzle == SWIZZLE_1:
value = get_one(dst_type)
value = get_one(dst_channel)
else:
assert False
elif format.colorspace == 'zs':
if i < 3:
value = 'z'
else:
value = get_one(dst_type)
value = get_one(dst_channel)
else:
assert False
print ' *dst_pixel++ = %s; /* %s */' % (value, 'rgba'[i])
@ -354,7 +354,7 @@ def generate_format_read(format, dst_type, dst_native_type, dst_suffix):
print
def generate_format_write(format, src_type, src_native_type, src_suffix):
def generate_format_write(format, src_channel, src_native_type, src_suffix):
'''Generate the function to write pixels to a particular format'''
name = format.short_name()
@ -379,11 +379,11 @@ def generate_format_write(format, src_type, src_native_type, src_suffix):
print ' %s pixel = 0;' % dst_native_type
shift = 0;
for i in range(4):
dst_type = format.in_types[i]
width = dst_type.size
dst_channel = format.channels[i]
width = dst_channel.size
if inv_swizzle[i] is not None:
value = 'src_pixel[%u]' % inv_swizzle[i]
value = conversion_expr(src_type, dst_type, dst_native_type, value)
value = conversion_expr(src_channel, dst_channel, dst_native_type, value)
if shift:
value = '(%s << %u)' % (value, shift)
print ' pixel |= %s;' % value
@ -391,10 +391,10 @@ def generate_format_write(format, src_type, src_native_type, src_suffix):
print ' *dst_pixel++ = pixel;'
else:
for i in range(4):
dst_type = format.in_types[i]
dst_channel = format.channels[i]
if inv_swizzle[i] is not None:
value = 'src_pixel[%u]' % inv_swizzle[i]
value = conversion_expr(src_type, dst_type, dst_native_type, value)
value = conversion_expr(src_channel, dst_channel, dst_native_type, value)
print ' *dst_pixel++ = %s;' % value
else:
assert False
@ -408,12 +408,12 @@ def generate_format_write(format, src_type, src_native_type, src_suffix):
print
def generate_read(formats, dst_type, dst_native_type, dst_suffix):
def generate_read(formats, dst_channel, dst_native_type, dst_suffix):
'''Generate the dispatch function to read pixels from any format'''
for format in formats:
if is_format_supported(format):
generate_format_read(format, dst_type, dst_native_type, dst_suffix)
generate_format_read(format, dst_channel, dst_native_type, dst_suffix)
print 'void'
print 'util_format_read_%s(enum pipe_format format, %s *dst, unsigned dst_stride, const void *src, unsigned src_stride, unsigned x, unsigned y, unsigned w, unsigned h)' % (dst_suffix, dst_native_type)
@ -434,12 +434,12 @@ def generate_read(formats, dst_type, dst_native_type, dst_suffix):
print
def generate_write(formats, src_type, src_native_type, src_suffix):
def generate_write(formats, src_channel, src_native_type, src_suffix):
'''Generate the dispatch function to write pixels to any format'''
for format in formats:
if is_format_supported(format):
generate_format_write(format, src_type, src_native_type, src_suffix)
generate_format_write(format, src_channel, src_native_type, src_suffix)
print 'void'
print 'util_format_write_%s(enum pipe_format format, const %s *src, unsigned src_stride, void *dst, unsigned dst_stride, unsigned x, unsigned y, unsigned w, unsigned h)' % (src_suffix, src_native_type)
@ -478,14 +478,14 @@ def main():
generate_clamp()
type = Type(FLOAT, False, 32)
type = Channel(FLOAT, False, 32)
native_type = 'float'
suffix = '4f'
generate_read(formats, type, native_type, suffix)
generate_write(formats, type, native_type, suffix)
type = Type(UNSIGNED, True, 8)
type = Channel(UNSIGNED, True, 8)
native_type = 'uint8_t'
suffix = '4ub'

View file

@ -41,36 +41,36 @@ def is_pot(x):
return (x & (x - 1)) == 0;
class Type:
'''Describe the type of a color channel.'''
class Channel:
'''Describe the channel of a color channel.'''
def __init__(self, kind, norm, size):
self.kind = kind
def __init__(self, type, norm, size):
self.type = type
self.norm = norm
self.size = size
self.sign = kind in (SIGNED, FIXED, FLOAT)
self.sign = type in (SIGNED, FIXED, FLOAT)
def __str__(self):
s = str(self.kind)
s = str(self.type)
if self.norm:
s += 'n'
s += str(self.size)
return s
def __eq__(self, other):
return self.kind == other.kind and self.norm == other.norm and self.size == other.size
return self.type == other.type and self.norm == other.norm and self.size == other.size
class Format:
'''Describe a pixel format.'''
def __init__(self, name, layout, block_width, block_height, in_types, out_swizzle, colorspace):
def __init__(self, name, layout, block_width, block_height, channels, swizzles, colorspace):
self.name = name
self.layout = layout
self.block_width = block_width
self.block_height = block_height
self.in_types = in_types
self.out_swizzle = out_swizzle
self.channels = channels
self.swizzles = swizzles
self.name = name
self.colorspace = colorspace
@ -89,42 +89,54 @@ class Format:
def block_size(self):
size = 0
for type in self.in_types:
size += type.size
for channel in self.channels:
size += channel.size
return size
def nr_channels(self):
nr_channels = 0
for type in self.in_types:
if type.size:
for channel in self.channels:
if channel.size:
nr_channels += 1
return nr_channels
def is_array(self):
ref_type = self.in_types[0]
for type in self.in_types[1:]:
if type.size and (type.size != ref_type.size or type.size % 8):
ref_channel = self.channels[0]
for channel in self.channels[1:]:
if channel.size and (channel.size != ref_channel.size or channel.size % 8):
return False
return True
def is_mixed(self):
ref_type = self.in_types[0]
for type in self.in_types[1:]:
if type.kind != VOID:
if type.kind != ref_type.kind:
ref_channel = self.channels[0]
for channel in self.channels[1:]:
if channel.type != VOID:
if channel.type != ref_channel.type:
return True
if type.norm != ref_type.norm:
if channel.norm != ref_channel.norm:
return True
return False
def is_pot(self):
return is_pot(self.block_size())
def is_int(self):
for channel in self.channels:
if channel.type not in (VOID, UNSIGNED, SIGNED):
return False
return True
def is_float(self):
for channel in self.channels:
if channel.type not in (VOID, FLOAT):
return False
return True
def stride(self):
return self.block_size()/8
_kind_parse_map = {
_type_parse_map = {
'': VOID,
'x': VOID,
'u': UNSIGNED,
@ -145,7 +157,7 @@ _swizzle_parse_map = {
def parse(filename):
'''Parse the format descrition in CSV format in terms of the
Type and Format classes above.'''
Channel and Format classes above.'''
stream = open(filename)
formats = []
@ -163,10 +175,10 @@ def parse(filename):
name = fields[0]
layout = fields[1]
block_width, block_height = map(int, fields[2:4])
in_types = []
channels = []
for field in fields[4:8]:
if field:
kind = _kind_parse_map[field[0]]
type = _type_parse_map[field[0]]
if field[1] == 'n':
norm = True
size = int(field[2:])
@ -174,13 +186,13 @@ def parse(filename):
norm = False
size = int(field[1:])
else:
kind = VOID
type = VOID
norm = False
size = 0
in_type = Type(kind, norm, size)
in_types.append(in_type)
out_swizzle = [_swizzle_parse_map[swizzle] for swizzle in fields[8]]
channel = Channel(type, norm, size)
channels.append(channel)
swizzles = [_swizzle_parse_map[swizzle] for swizzle in fields[8]]
colorspace = fields[9]
formats.append(Format(name, layout, block_width, block_height, in_types, out_swizzle, colorspace))
formats.append(Format(name, layout, block_width, block_height, channels, swizzles, colorspace))
return formats

View file

@ -51,7 +51,7 @@ colorspace_channels_map = {
}
kind_map = {
type_map = {
VOID: "UTIL_FORMAT_TYPE_VOID",
UNSIGNED: "UTIL_FORMAT_TYPE_UNSIGNED",
SIGNED: "UTIL_FORMAT_TYPE_SIGNED",
@ -112,16 +112,16 @@ def write_format_table(formats):
print " %s,\t/* is_mixed */" % (bool_map(format.is_mixed()),)
print " {"
for i in range(4):
type = format.in_types[i]
channel = format.channels[i]
if i < 3:
sep = ","
else:
sep = ""
print " {%s, %s, %u}%s\t/* %s */" % (kind_map[type.kind], bool_map(type.norm), type.size, sep, "xyzw"[i])
print " {%s, %s, %u}%s\t/* %s */" % (type_map[channel.type], bool_map(channel.norm), channel.size, sep, "xyzw"[i])
print " },"
print " {"
for i in range(4):
swizzle = format.out_swizzle[i]
swizzle = format.swizzles[i]
if i < 3:
sep = ","
else:

View file

@ -45,7 +45,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(sys.argv[0]), '../../auxiliary/u
from u_format_access import *
def generate_format_read(format, dst_type, dst_native_type, dst_suffix):
def generate_format_read(format, dst_channel, dst_native_type, dst_suffix):
'''Generate the function to read pixels from a particular format'''
name = format.short_name()
@ -64,11 +64,11 @@ def generate_format_read(format, dst_type, dst_native_type, dst_suffix):
names = ['']*4
if format.colorspace == 'rgb':
for i in range(4):
swizzle = format.out_swizzle[i]
swizzle = format.swizzles[i]
if swizzle < 4:
names[swizzle] += 'rgba'[i]
elif format.colorspace == 'zs':
swizzle = format.out_swizzle[0]
swizzle = format.swizzles[0]
if swizzle < 4:
names[swizzle] = 'z'
else:
@ -81,8 +81,8 @@ def generate_format_read(format, dst_type, dst_native_type, dst_suffix):
print ' %s pixel = *src_pixel++;' % src_native_type
shift = 0;
for i in range(4):
src_type = format.in_types[i]
width = src_type.size
src_channel = format.channels[i]
width = src_channel.size
if names[i]:
value = 'pixel'
mask = (1 << width) - 1
@ -90,35 +90,35 @@ def generate_format_read(format, dst_type, dst_native_type, dst_suffix):
value = '(%s >> %u)' % (value, shift)
if shift + width < format.block_size():
value = '(%s & 0x%x)' % (value, mask)
value = conversion_expr(src_type, dst_type, dst_native_type, value)
value = conversion_expr(src_channel, dst_channel, dst_native_type, value)
print ' %s %s = %s;' % (dst_native_type, names[i], value)
shift += width
else:
for i in range(4):
src_type = format.in_types[i]
src_channel = format.channels[i]
if names[i]:
value = '(*src_pixel++)'
value = conversion_expr(src_type, dst_type, dst_native_type, value)
value = conversion_expr(src_channel, dst_channel, dst_native_type, value)
print ' %s %s = %s;' % (dst_native_type, names[i], value)
else:
assert False
for i in range(4):
if format.colorspace == 'rgb':
swizzle = format.out_swizzle[i]
swizzle = format.swizzles[i]
if swizzle < 4:
value = names[swizzle]
elif swizzle == SWIZZLE_0:
value = '0'
elif swizzle == SWIZZLE_1:
value = get_one(dst_type)
value = get_one(dst_channel)
else:
assert False
elif format.colorspace == 'zs':
if i < 3:
value = 'z'
else:
value = get_one(dst_type)
value = get_one(dst_channel)
else:
assert False
print ' TILE_PIXEL(dst, x, y, %u) = %s; /* %s */' % (i, value, 'rgba'[i])
@ -130,7 +130,7 @@ def generate_format_read(format, dst_type, dst_native_type, dst_suffix):
print
def pack_rgba(format, src_type, r, g, b, a):
def pack_rgba(format, src_channel, r, g, b, a):
"""Return an expression for packing r, g, b, a into a pixel of the
given format. Ex: '(b << 24) | (g << 16) | (r << 8) | (a << 0)'
"""
@ -152,21 +152,21 @@ def pack_rgba(format, src_type, r, g, b, a):
value = None
if value:
dst_type = format.in_types[i]
dst_channel = format.channels[i]
dst_native_type = native_type(format)
value = conversion_expr(src_type, dst_type, dst_native_type, value)
value = conversion_expr(src_channel, dst_channel, dst_native_type, value)
term = "((%s) << %d)" % (value, shift)
if expr:
expr = expr + " | " + term
else:
expr = term
width = format.in_types[i].size
width = format.channels[i].size
shift = shift + width
return expr
def emit_unrolled_write_code(format, src_type):
def emit_unrolled_write_code(format, src_channel):
'''Emit code for writing a block based on unrolled loops.
This is considerably faster than the TILE_PIXEL-based code below.
'''
@ -185,8 +185,8 @@ def emit_unrolled_write_code(format, src_type):
print ' const uint8_t *a = src + 3 * TILE_C_STRIDE;'
print ' (void) r; (void) g; (void) b; (void) a; /* silence warnings */'
print ' for (i = 0; i < TILE_C_STRIDE; i += 2) {'
print ' const uint32_t pixel0 = %s;' % pack_rgba(format, src_type, "r[i+0]", "g[i+0]", "b[i+0]", "a[i+0]")
print ' const uint32_t pixel1 = %s;' % pack_rgba(format, src_type, "r[i+1]", "g[i+1]", "b[i+1]", "a[i+1]")
print ' const uint32_t pixel0 = %s;' % pack_rgba(format, src_channel, "r[i+0]", "g[i+0]", "b[i+0]", "a[i+0]")
print ' const uint32_t pixel1 = %s;' % pack_rgba(format, src_channel, "r[i+1]", "g[i+1]", "b[i+1]", "a[i+1]")
print ' const unsigned offset = (py + tile_y_offset[i]) * dstpix_stride + (px + tile_x_offset[i]);'
print ' dstpix[offset + 0] = pixel0;'
print ' dstpix[offset + 1] = pixel1;'
@ -196,7 +196,7 @@ def emit_unrolled_write_code(format, src_type):
print ' }'
def emit_tile_pixel_write_code(format, src_type):
def emit_tile_pixel_write_code(format, src_channel):
'''Emit code for writing a block based on the TILE_PIXEL macro.'''
dst_native_type = native_type(format)
@ -213,11 +213,11 @@ def emit_tile_pixel_write_code(format, src_type):
print ' %s pixel = 0;' % dst_native_type
shift = 0;
for i in range(4):
dst_type = format.in_types[i]
width = dst_type.size
dst_channel = format.channels[i]
width = dst_channel.size
if inv_swizzle[i] is not None:
value = 'TILE_PIXEL(src, x, y, %u)' % inv_swizzle[i]
value = conversion_expr(src_type, dst_type, dst_native_type, value)
value = conversion_expr(src_channel, dst_channel, dst_native_type, value)
if shift:
value = '(%s << %u)' % (value, shift)
print ' pixel |= %s;' % value
@ -225,10 +225,10 @@ def emit_tile_pixel_write_code(format, src_type):
print ' *dst_pixel++ = pixel;'
else:
for i in range(4):
dst_type = format.in_types[i]
dst_channel = format.channels[i]
if inv_swizzle[i] is not None:
value = 'TILE_PIXEL(src, x, y, %u)' % inv_swizzle[i]
value = conversion_expr(src_type, dst_type, dst_native_type, value)
value = conversion_expr(src_channel, dst_channel, dst_native_type, value)
print ' *dst_pixel++ = %s;' % value
else:
assert False
@ -238,7 +238,7 @@ def emit_tile_pixel_write_code(format, src_type):
print ' }'
def generate_format_write(format, src_type, src_native_type, src_suffix):
def generate_format_write(format, src_channel, src_native_type, src_suffix):
'''Generate the function to write pixels to a particular format'''
name = format.short_name()
@ -251,20 +251,20 @@ def generate_format_write(format, src_type, src_native_type, src_suffix):
and format.block_size() <= 32 \
and format.is_pot() \
and not format.is_mixed() \
and format.in_types[0].kind == UNSIGNED:
emit_unrolled_write_code(format, src_type)
and format.channels[0].type == UNSIGNED:
emit_unrolled_write_code(format, src_channel)
else:
emit_tile_pixel_write_code(format, src_type)
emit_tile_pixel_write_code(format, src_channel)
print '}'
print
def generate_read(formats, dst_type, dst_native_type, dst_suffix):
def generate_read(formats, dst_channel, dst_native_type, dst_suffix):
'''Generate the dispatch function to read pixels from any format'''
for format in formats:
if is_format_supported(format):
generate_format_read(format, dst_type, dst_native_type, dst_suffix)
generate_format_read(format, dst_channel, dst_native_type, dst_suffix)
print 'void'
print 'lp_tile_read_%s(enum pipe_format format, %s *dst, const void *src, unsigned src_stride, unsigned x, unsigned y, unsigned w, unsigned h)' % (dst_suffix, dst_native_type)
@ -285,12 +285,12 @@ def generate_read(formats, dst_type, dst_native_type, dst_suffix):
print
def generate_write(formats, src_type, src_native_type, src_suffix):
def generate_write(formats, src_channel, src_native_type, src_suffix):
'''Generate the dispatch function to write pixels to any format'''
for format in formats:
if is_format_supported(format):
generate_format_write(format, src_type, src_native_type, src_suffix)
generate_format_write(format, src_channel, src_native_type, src_suffix)
print 'void'
print 'lp_tile_write_%s(enum pipe_format format, const %s *src, void *dst, unsigned dst_stride, unsigned x, unsigned y, unsigned w, unsigned h)' % (src_suffix, src_native_type)
@ -351,12 +351,12 @@ def main():
generate_clamp()
type = Type(UNSIGNED, True, 8)
channel = Channel(UNSIGNED, True, 8)
native_type = 'uint8_t'
suffix = '4ub'
generate_read(formats, type, native_type, suffix)
generate_write(formats, type, native_type, suffix)
generate_read(formats, channel, native_type, suffix)
generate_write(formats, channel, native_type, suffix)
if __name__ == '__main__':