27.8.2010 7.46, Alex Deucher kirjoitti:
On Mon, Aug 23, 2010 at 2:52 AM, Heikki Lindholm<[email protected]> wrote:
Column order is wrong on big endian systems, primarly because of a
bits / bytes mix up with the bpp variable. Fix tested with r100 and
r300, screen depth 16 and 32 with YV12 and YUY2 (overlay, textured video),
RGBA and RGBT (overlay).
Should fix: https://bugs.freedesktop.org/show_bug.cgi?id=29041
Signed-off-by: Heikki Lindholm<[email protected]>
---
src/radeon_video.c | 12 ++++++++----
1 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/src/radeon_video.c b/src/radeon_video.c
index dc75279..1a42951 100644
--- a/src/radeon_video.c
+++ b/src/radeon_video.c
@@ -2216,11 +2216,15 @@ RADEONCopyData(
swap = RADEON_HOST_DATA_SWAP_32BIT;
break;
}
- } else if (bpp != pScrn->bitsPerPixel) {
- if (bpp == 8)
+ } else {
+ switch (pScrn->bitsPerPixel) {
don't we want to check the bpp rather then the scrn depth?
I would have to guess no, because it just didn't seem to work that way.
The cases I listed as tested behaved (with the patch applied) identical
to what I saw on x86 with M7, whereas using bpp would quite definitely
look different, for example, in the bpp = 4 (RGBA), depth = 16 case.
Maybe there's byteswapping going on elsewhere as well?
Btw. at least the YUV cases used to work with the 1.6.x driver versions.
I wouldn't be surprised if the RGB overlays were never really tested on
big endian at all.
Wouldn't something like this work and be cleaner?
diff --git a/src/radeon_video.c b/src/radeon_video.c
index dc75279..df0faf8 100644
--- a/src/radeon_video.c
+++ b/src/radeon_video.c
@@ -2207,20 +2207,13 @@ RADEONCopyData(
int swap = RADEON_HOST_DATA_SWAP_NONE;
#if X_BYTE_ORDER == X_BIG_ENDIAN
- if (info->kms_enabled) {
- switch(bpp) {
- case 2:
- swap = RADEON_HOST_DATA_SWAP_16BIT;
- break;
- case 4:
- swap = RADEON_HOST_DATA_SWAP_32BIT;
- break;
- }
- } else if (bpp != pScrn->bitsPerPixel) {
- if (bpp == 8)
- swap = RADEON_HOST_DATA_SWAP_32BIT;
- else
- swap = RADEON_HOST_DATA_SWAP_HDW;
+ switch(bpp) {
+ case 2:
+ swap = RADEON_HOST_DATA_SWAP_16BIT;
+ break;
+ case 4:
+ swap = RADEON_HOST_DATA_SWAP_32BIT;
+ break;
}
#endif
See above, and the bpp == 2 case is never hit, if you look at the very
top of the function. Can't test the kms path myself, because kms enabled
just hangs the gpu here.
-- Heikki Lindholm
_______________________________________________
xorg-driver-ati mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-driver-ati