diff --git a/src/gallium/auxiliary/util/u_format_parse.py b/src/gallium/auxiliary/util/u_format_parse.py index b9627055cda..541ae69d4dc 100644 --- a/src/gallium/auxiliary/util/u_format_parse.py +++ b/src/gallium/auxiliary/util/u_format_parse.py @@ -379,16 +379,27 @@ def parse(filename): channel.shift = le_shift le_shift += channel.size - be_shift = 0 - for channel in be_channels[3::-1]: - channel.shift = be_shift - be_shift += channel.size - - assert le_shift == be_shift for i in range(4): assert (le_swizzles[i] != SWIZZLE_NONE) == (be_swizzles[i] != SWIZZLE_NONE) format = Format(name, layout, block_width, block_height, block_depth, le_channels, le_swizzles, be_channels, be_swizzles, colorspace) + + if format.is_array() and not format.is_bitmask(): + # Formats accessed as arrays by the pack functions (R32G32_FLOAT or + # R8G8B8_UNORM, for example) should not be channel-ordering-reversed + # for BE. + # Note that __eq__ on channels ignores .shift! + assert(format.be_channels == format.le_channels) + assert(format.be_swizzles == format.le_swizzles) + format.be_channels = format.le_channels + else: + be_shift = 0 + for channel in format.be_channels[3::-1]: + channel.shift = be_shift + be_shift += channel.size + + assert le_shift == be_shift + formats.append(format) return formats diff --git a/src/mesa/state_tracker/tests/st_format.c b/src/mesa/state_tracker/tests/st_format.c index 12cb74bd0be..e42a1873d5e 100644 --- a/src/mesa/state_tracker/tests/st_format.c +++ b/src/mesa/state_tracker/tests/st_format.c @@ -87,6 +87,29 @@ int main(int argc, char **argv) continue; if (mf != MESA_FORMAT_NONE) { + const struct util_format_description *desc = util_format_description(i); + + /* Make sure that gallium and Mesa agree on whether the format is an + * array format. + */ + if (desc->nr_channels > 1) { + bool mesa_array = (_mesa_get_format_layout(mf) == + MESA_FORMAT_LAYOUT_ARRAY); + bool gallium_array = desc->is_array && !desc->is_bitmask; + /* We should probably be checking equality here, but we have some + * UINT and SINT types that are array formats in Mesa but not in + * gallium. + */ + if (gallium_array && !mesa_array) { + fprintf(stderr, "%s is %sarray, %s is %sarray\n", + util_format_short_name(i), + gallium_array ? "" : "not ", + _mesa_get_format_name(mf), + mesa_array ? "" : "not "); + return 1; + } + } + enum pipe_format pf = st_mesa_format_to_pipe_format(st, mf); if (pf != i) {