summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard Sandiford <[email protected]>2014-03-19 17:10:12 +0000
committerJosé Fonseca <[email protected]>2014-04-28 13:16:25 +0100
commit6944796cbe880311e920745d5aa0a793cf76e30a (patch)
treea22fa24cf2e4a7baa7f9b6cee6adad0e5717bd04 /src
parent1a3746212d176f5907278871a9046ac9444dc27e (diff)
util: Split out channel-parsing Python code
Splits out the code that parses the channel list, so that we can have different lists for little and big endian. There is no change to the generated u_format_table.c. Signed-off-by: Richard Sandiford <[email protected]> Signed-off-by: José Fonseca <[email protected]>
Diffstat (limited to 'src')
-rwxr-xr-xsrc/gallium/auxiliary/util/u_format_parse.py96
1 files changed, 50 insertions, 46 deletions
diff --git a/src/gallium/auxiliary/util/u_format_parse.py b/src/gallium/auxiliary/util/u_format_parse.py
index 08c55c1b450..9f6ac36de11 100755
--- a/src/gallium/auxiliary/util/u_format_parse.py
+++ b/src/gallium/auxiliary/util/u_format_parse.py
@@ -267,6 +267,54 @@ _swizzle_parse_map = {
'_': SWIZZLE_NONE,
}
+def _parse_channels(fields, layout, colorspace, swizzles):
+ if layout == PLAIN:
+ names = ['']*4
+ if colorspace in (RGB, SRGB):
+ for i in range(4):
+ swizzle = swizzles[i]
+ if swizzle < 4:
+ names[swizzle] += 'rgba'[i]
+ elif colorspace == ZS:
+ for i in range(4):
+ swizzle = swizzles[i]
+ if swizzle < 4:
+ names[swizzle] += 'zs'[i]
+ else:
+ assert False
+ for i in range(4):
+ if names[i] == '':
+ names[i] = 'x'
+ else:
+ names = ['x', 'y', 'z', 'w']
+
+ channels = []
+ for i in range(0, 4):
+ field = fields[i]
+ if field:
+ type = _type_parse_map[field[0]]
+ if field[1] == 'n':
+ norm = True
+ pure = False
+ size = int(field[2:])
+ elif field[1] == 'p':
+ pure = True
+ norm = False
+ size = int(field[2:])
+ else:
+ norm = False
+ pure = False
+ size = int(field[1:])
+ else:
+ type = VOID
+ norm = False
+ pure = False
+ size = 0
+ channel = Channel(type, norm, pure, size, names[i])
+ channels.append(channel)
+
+ return channels
+
def parse(filename):
'''Parse the format descrition in CSV format in terms of the
Channel and Format classes above.'''
@@ -289,54 +337,10 @@ def parse(filename):
name = fields[0]
layout = fields[1]
block_width, block_height = map(int, fields[2:4])
+ colorspace = fields[9]
swizzles = [_swizzle_parse_map[swizzle] for swizzle in fields[8]]
- colorspace = fields[9]
-
- if layout == PLAIN:
- names = ['']*4
- if colorspace in (RGB, SRGB):
- for i in range(4):
- swizzle = swizzles[i]
- if swizzle < 4:
- names[swizzle] += 'rgba'[i]
- elif colorspace == ZS:
- for i in range(4):
- swizzle = swizzles[i]
- if swizzle < 4:
- names[swizzle] += 'zs'[i]
- else:
- assert False
- for i in range(4):
- if names[i] == '':
- names[i] = 'x'
- else:
- names = ['x', 'y', 'z', 'w']
-
- channels = []
- for i in range(0, 4):
- field = fields[4 + i]
- if field:
- type = _type_parse_map[field[0]]
- if field[1] == 'n':
- norm = True
- pure = False
- size = int(field[2:])
- elif field[1] == 'p':
- pure = True
- norm = False
- size = int(field[2:])
- else:
- norm = False
- pure = False
- size = int(field[1:])
- else:
- type = VOID
- norm = False
- pure = False
- size = 0
- channel = Channel(type, norm, pure, size, names[i])
- channels.append(channel)
+ channels = _parse_channels(fields[4:8], layout, colorspace, swizzles)
shift = 0
for channel in channels[3::-1] if is_big_endian else channels: