Bug List: (This bug is not in your last search results)   Show last search results      Search page      Enter new bug
Bug#: 40327
Alias:
Product:
Component:
Status: CLOSED
Resolution: TEST-REQUEST
Assigned To: PPC Porters <ppc@gentoo.org>
Hardware:
OS:
Version:
Priority:
Severity:
Reporter: Maciej J. Woloszyk <mat@esi.com.pl>
Add CC:
CC:
Remove selected CCs
URL:
Summary:
Status Whiteboard:
Keywords:

Filename Description Type Creator Created Size Actions
Create a New Attachment (proposed patch, testcase, etc.) View All

Bug 40327 depends on: Show dependency tree
Bug 40327 blocks:
Votes: 0    Show votes for this bug    Vote for this bug

Additional Comments: (this is where you put emerge --info)


Not eligible to see or edit group visibility for this bug.




View Bug Activity   |   Format For Printing   |   XML   |   Clone This Bug


Description:   Opened: 2004-02-03 16:41 0000
I've found quite annoying bug in PPC version of xmame. The fullscreen xv code
seems not to be endian-aware and because of that when emulator is switched to
xv YUV fullscreen mode everything turns green+pink.

As I really needed to run it in fullscreen I did some investigation and here is
the solution (probably qick and dirty, but working). There are two files that
need patching. First is src/unix/video-drivers/x11_window.c where there is a
YUV lookup table generation code which is not endian-aware. The second is
blit.h where there is a code to convert bitmap using the lookup table into YUV
packed format. And again - this code isn't endian-aware. Below is the patch I
worked out and applied on the xmame-0.78.1 package. After this the emulator
compiles fine on PPC and works as it sholud.

---------- 0.78.1-yuvppc-fix.patch --------------------------------
--- src/unix/video-drivers/x11_window.c 2003-12-27 00:29:16.000000000 +0100
+++ src/unix/video-drivers/x11_window.c 2004-02-03 23:04:22.000000000 +0100
@@ -1463,7 +1463,11 @@

         /* Storing this data in YUYV order simplifies using the data for
            YUY2, both with and without smoothing... */
+#ifdef LSB_FIRST
         hwscale_yuvlookup[i]=(y<<0) | (u<<8) | (y<<16) | (v<<24);
+#else
+        hwscale_yuvlookup[i]=(y<<24) | (u<<16) | (y<<8) | (v<<0);
+#endif
       }
    }
 }
--- src/unix/video-drivers/blit.h       2003-12-27 00:29:16.000000000 +0100
+++ src/unix/video-drivers/blit.h       2004-02-04 01:17:56.000000000 +0100
@@ -72,6 +72,7 @@
    }\
       }
 #elif defined BLIT_HWSCALE_YUY2
+#ifdef LSB_FIRST /* x86 etc */
 #define COPY_LINE2(SRC, END, DST) \
    {\
       SRC_PIXEL  *src = SRC; \
@@ -89,6 +90,25 @@
          *dst++=y|y2|((uv1+uv2)&0xff00ff00);\
       } \
    }
+#else /* ppc etc */
+#define COPY_LINE2(SRC, END, DST) \
+   {\
+      SRC_PIXEL  *src = SRC; \
+      SRC_PIXEL  *end = END; \
+      unsigned long *dst = (unsigned long *)DST; \
+      unsigned int r,y,y2,uv1,uv2; \
+      for(;src<end;) \
+      { \
+         r=INDIRECT[*src++]; \
+         y=r&0xff000000 ; \
+         uv1=(r&0x00ff00ff); \
+         r=INDIRECT[*src++]; \
+         uv2=(uv1+(r&0x00ff00ff))>>1; \
+         y2=r&0xff00; \
+         *dst++=y|y2|(uv2&0x00ff00ff); \
+      } \
+   }
+#endif
 #else /* normal indirect */
 #define COPY_LINE2(SRC, END, DST) \
       {\
@@ -428,24 +448,43 @@
       *(dst+2) = (INDIRECT[*(src+2)]>>16) | (INDIRECT[*(src+3)]<< 8); \
    }
 #elif defined BLIT_HWSCALE_YUY2
+#ifdef LSB_FIRST /* x86 etc */
 #define COPY_LINE2(SRC, END, DST) \
    {\
       SRC_PIXEL  *src = SRC; \
       SRC_PIXEL  *end = END; \
       unsigned long *dst = (unsigned long *)DST; \
-      unsigned int r,r2,y,y2,uv1,uv2; \
+      unsigned int r,y,y2,uv1,uv2; \
       for(;src<end;) \
       { \
          r=INDIRECT[*src++]; \
-         r2=INDIRECT[*src++]; \
-         y=r&0xff; \
-         y2=r2&0xff0000; \
+         y=r&255; \
          uv1=(r&0xff00ff00)>>1; \
-         uv2=(r2&0xff00ff00)>>1; \
-         uv1=(uv1+uv2)&0xff00ff00; \
-         *dst++=y|y2|uv1; \
+         r=INDIRECT[*src++]; \
+         uv2=(r&0xff00ff00)>>1; \
+         y2=r&0xff0000; \
+         *dst++=y|y2|((uv1+uv2)&0xff00ff00);\
+      } \
+   }
+#else /* ppc etc */
+#define COPY_LINE2(SRC, END, DST) \
+   {\
+      SRC_PIXEL  *src = SRC; \
+      SRC_PIXEL  *end = END; \
+      unsigned long *dst = (unsigned long *)DST; \
+      unsigned int r,y,y2,uv1,uv2; \
+      for(;src<end;) \
+      { \
+         r=INDIRECT[*src++]; \
+         y=r&0xff000000 ; \
+         uv1=(r&0x00ff00ff); \
+         r=INDIRECT[*src++]; \
+         uv2=(uv1+(r&0x00ff00ff))>>1; \
+         y2=r&0xff00; \
+         *dst++=y|y2|(uv2&0x00ff00ff); \
       } \
    }
+#endif
 #else /* normal indirect */
 #define COPY_LINE2(SRC, END, DST) \
    SRC_PIXEL  *src = SRC; \
-----------------------------------------------------------------------

------- Comment #1 From David Holm (RETIRED) 2004-02-15 03:50:35 0000 -------
I have added the patch to the ebuild for all big-endian archs. Please test this
on sparc, mips and alpha.

Great work, I always assumed this was a bug in the ati driver. ;)
BTW, have you submitted the patch to the xmame developers? I assume 0.79 will
be released shortly.

------- Comment #2 From Maciej J. Woloszyk 2004-02-15 06:59:13 0000 -------
Yes. I did sent the patch to the xmame list. It already is in 0.79 beta
source tree so in the next release it should be in public sources.

------- Comment #3 From Lars Weiler (RETIRED) 2004-04-03 15:23:20 0000 -------
As there is already xmame-0.80.1 out and all arches made it stable, I close
this bug.

------- Comment #4 From Lars Weiler (RETIRED) 2004-04-03 16:06:48 0000 -------
Somehow I forgot to close.

Bug List: (This bug is not in your last search results)   Show last search results      Search page      Enter new bug