SHA256
1
0
forked from pool/Mesa

- u_Revert_gallium_Fix_big-endian_addressing_of_non-bitmask_array_formats.patch

* replaces U_gallium-Fix-big-endian-addressing-of-non-bitmask-arr.patch
    by an official merge request (bsc#1162252, gitlab issue#2472)

OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/Mesa?expand=0&rev=923
This commit is contained in:
Stefan Dirsch 2020-02-06 13:28:14 +00:00 committed by Git OBS Bridge
parent 101cb57bbd
commit 382c9d903b
6 changed files with 78 additions and 119 deletions

View File

@ -1,3 +1,10 @@
-------------------------------------------------------------------
Thu Feb 6 11:32:05 UTC 2020 - Stefan Dirsch <sndirsch@suse.com>
- u_Revert_gallium_Fix_big-endian_addressing_of_non-bitmask_array_formats.patch
* replaces U_gallium-Fix-big-endian-addressing-of-non-bitmask-arr.patch
by an official merge request (bsc#1162252, gitlab issue#2472)
-------------------------------------------------------------------
Mon Feb 3 17:17:44 UTC 2020 - Stefan Dirsch <sndirsch@suse.com>

View File

@ -1,7 +1,7 @@
#
# spec file for package Mesa-drivers
#
# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany.
# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@ -126,7 +126,7 @@ Source6: %{name}-rpmlintrc
Source7: Mesa.keyring
Patch1: n_opencl_dep_libclang.patch
Patch2: n_add-Mesa-headers-again.patch
Patch3: U_gallium-Fix-big-endian-addressing-of-non-bitmask-arr.patch
Patch3: u_Revert_gallium_Fix_big-endian_addressing_of_non-bitmask_array_formats.patch
# never to be upstreamed
Patch54: n_drirc-disable-rgb10-for-chromium-on-amd.patch
Patch58: u_dep_xcb.patch
@ -749,7 +749,7 @@ rm -rf docs/README.{VMS,WIN32,OS2}
%endif
%patch2 -p1
# reverse apply since it caused a regression in rendering on s390x (bsc#1162252)
%patch3 -p1 -R
%patch3 -p1
%patch54 -p1
%patch58 -p1
%patch61 -p1

View File

@ -1,3 +1,10 @@
-------------------------------------------------------------------
Thu Feb 6 11:32:05 UTC 2020 - Stefan Dirsch <sndirsch@suse.com>
- u_Revert_gallium_Fix_big-endian_addressing_of_non-bitmask_array_formats.patch
* replaces U_gallium-Fix-big-endian-addressing-of-non-bitmask-arr.patch
by an official merge request (bsc#1162252, gitlab issue#2472)
-------------------------------------------------------------------
Mon Feb 3 17:17:44 UTC 2020 - Stefan Dirsch <sndirsch@suse.com>

View File

@ -1,7 +1,7 @@
#
# spec file for package Mesa
#
# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany.
# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@ -125,7 +125,7 @@ Source6: %{name}-rpmlintrc
Source7: Mesa.keyring
Patch1: n_opencl_dep_libclang.patch
Patch2: n_add-Mesa-headers-again.patch
Patch3: U_gallium-Fix-big-endian-addressing-of-non-bitmask-arr.patch
Patch3: u_Revert_gallium_Fix_big-endian_addressing_of_non-bitmask_array_formats.patch
# never to be upstreamed
Patch54: n_drirc-disable-rgb10-for-chromium-on-amd.patch
Patch58: u_dep_xcb.patch
@ -748,7 +748,7 @@ rm -rf docs/README.{VMS,WIN32,OS2}
%endif
%patch2 -p1
# reverse apply since it caused a regression in rendering on s390x (bsc#1162252)
%patch3 -p1 -R
%patch3 -p1
%patch54 -p1
%patch58 -p1
%patch61 -p1

View File

@ -1,113 +0,0 @@
From d17ff2f7f1864c81c1e00d04baf20f953c6d276a Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Thu, 15 Aug 2019 15:38:00 -0700
Subject: [PATCH] gallium: Fix big-endian addressing of non-bitmask array
formats.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The formats affected are:
- LA x (16_FLOAT, 32_FLOAT, 32_UINT, 32_SINT)
- R8G8B8 x (UNORM, SNORM, SRGB, USCALED, SSCALED, UINT, SINT)
- RG/RGB/RGBA x (64_FLOAT, 32_FLOAT, 16_FLOAT, 32_UNORM, 32_SNORM,
32_USCALED, 32_SSCALED, 32_FIXED, 32_UINT, 32_SINT)
- RGB/RGBA x (16_UNORM, 16_SNORM, 16_USCALED, 16_SSCALED,
16_UINT, 16_SINT)
- RGBx16 x (UNORM, SNORM, FLOAT, UINT, SINT)
- RGBx32 x (FLOAT, UINT, SINT)
- RA x (16_FLOAT, 32_FLOAT, 32_UINT, 32_SINT)
The updated st_formats.c unit test checks that the formats affected by
this change are all array formats in the equivalent Mesa format (if
any). Mesa's array format definition is clear: the value stored is an
array (increasing memory address) of values of the channel's type.
It's also the only thing that makes sense for the RGB types, or very
large types like RGBA64_FLOAT (A should not move to the low address
because the cpu is BE).
Acked-by: Roland Scheidegger <sroland@vmware.com>
Acked-by: Adam Jackson <ajax@redhat.com>
Tested-by: Matt Turner <mattst88@gmail.com> (unit tests on BE)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
---
src/gallium/auxiliary/util/u_format_parse.py | 23 +++++++++++++++++------
src/mesa/state_tracker/tests/st_format.c | 23 +++++++++++++++++++++++
2 files changed, 40 insertions(+), 6 deletions(-)
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) {
--
2.16.4

View File

@ -0,0 +1,58 @@
This reverts the functional part of commit
d17ff2f7, leaving the unit test for
mesa/pipe agreement on what's an array.
The issue is that the util_channel_desc.shift values on array formats are
not used for bit addressing in memory, they're bit addressing within a
word treating a pixel of the format as a native type, as seen by
llvmpipe's use of the values to do shifts (see
lp_build_unpack_arith_rgba_aos() for example). This means the values are
nonsensical for 3-byte RGB, but then llvmpipe doesn't expose those formats
so it works out.
I still want to clean up our big-endian format handling at some point, but
let's fix the s390x regression first, sort out our format unit tests in
CI, then be able to refactor with confidence.
Fixes: d17ff2f7 ("gallium: Fix big-endian addressing of non-bitmask array formats.")
Closes: #2440
Closes: #2472
diff --git a/src/gallium/auxiliary/util/u_format_parse.py b/src/util/gallium/auxiliary/u_format_parse.py
index 541ae69d4dc662e16c08ed7c27a9e65534a4b08f..b9627055cda3f5277bddc1936614a983f1359d00 100644
--- a/src/gallium/auxiliary/util/u_format_parse.py
+++ b/src/gallium/auxiliary/util/u_format_parse.py
@@ -379,27 +379,16 @@ 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