The DRI code attempts to use XAAGetCopyROP without checking whether XAA
or EXA is in effect. This results in the server crashing with an
undefined-symbol error when enabling EXA, then starting glxgears under
GNOME/Metacity and attempting to drag the glxgears window.
The EXA code happens to have a functional duplicate of the required code
under the name SavageGetCopyROP(). This patch moves the code to
savage_accel.c where it is now shared between EXA and the DRI code.
It is disturbing that this has not been caught before...
Just out of curiosity, how many subscribers of this list have access to
a Savage chipset, besides myself? Is the Savage EXA code being exercised
in the wild?
I followed the steps at http://www.freedesktop.org/wiki/AccountRequests
in order to get commit access for xf86-video-savage, and opened
https://bugs.freedesktop.org/show_bug.cgi?id=20727 for the required
information. No reply has yet been received. Is there anything else missing?
--
perl -e '$x=2.3;printf("%.0f + %.0f = %.0f\n",$x,$x,$x+$x);'
>From 4028dd0e0a351bdca9af2032717e97f5c7added6 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Alex=20Villac=C3=ADs=20Lasso?= <[email protected]>
Date: Sun, 12 Apr 2009 16:07:06 -0500
Subject: [PATCH] Do not use XAAGetCopyROP outside of XAA-specific code
The DRI code attempts to use XAAGetCopyROP without checking whether XAA or EXA
is in effect. This results in the server crashing with an undefined-symbol
error when enabling EXA, then starting glxgears under GNOME/Metacity and
attempting to drag the glxgears window.
The EXA code happens to have a functional duplicate of the required code under
the name SavageGetCopyROP(). This patch moves the code to savage_accel.c where
it is now shared between EXA and the DRI code.
It is disturbing that this has not been caught before.
---
src/savage_accel.c | 26 ++++++++++++++++++++++++++
src/savage_dri.c | 5 ++++-
src/savage_exa.c | 27 ++-------------------------
3 files changed, 32 insertions(+), 26 deletions(-)
diff --git a/src/savage_accel.c b/src/savage_accel.c
index 450b402..73c2d90 100644
--- a/src/savage_accel.c
+++ b/src/savage_accel.c
@@ -1537,6 +1537,32 @@ SavageInitAccel(ScreenPtr pScreen)
return SavageXAAInit(pScreen);
}
+int SavageGetCopyROP(int rop) {
+
+ int ALUCopyROP[16] =
+ {
+ 0x00, /*ROP_0 GXclear */
+ 0x88, /*ROP_DSa GXand */
+ 0x44, /*ROP_SDna GXandReverse */
+ 0xCC, /*ROP_S GXcopy */
+ 0x22, /*ROP_DSna GXandInverted */
+ 0xAA, /*ROP_D GXnoop */
+ 0x66, /*ROP_DSx GXxor */
+ 0xEE, /*ROP_DSo GXor */
+ 0x11, /*ROP_DSon GXnor */
+ 0x99, /*ROP_DSxn GXequiv */
+ 0x55, /*ROP_Dn GXinvert*/
+ 0xDD, /*ROP_SDno GXorReverse */
+ 0x33, /*ROP_Sn GXcopyInverted */
+ 0xBB, /*ROP_DSno GXorInverted */
+ 0x77, /*ROP_DSan GXnand */
+ 0xFF, /*ROP_1 GXset */
+ };
+
+ return (ALUCopyROP[rop]);
+
+}
+
/* Routines for debugging. */
diff --git a/src/savage_dri.c b/src/savage_dri.c
index 216c915..190e8ee 100644
--- a/src/savage_dri.c
+++ b/src/savage_dri.c
@@ -1578,6 +1578,9 @@ SAVAGEDRIMoveBuffers(WindowPtr pParent, DDXPointRec
ptOldOrg,
psav->AccelInfoRec->NeedToSync = TRUE;
}
+/* Definition in savage_accel.c */
+int SavageGetCopyROP(int rop);
+
static void
SAVAGEDRISetupForScreenToScreenCopy(
ScrnInfoPtr pScrn,
@@ -1591,7 +1594,7 @@ SAVAGEDRISetupForScreenToScreenCopy(
int cmd =0;
cmd = BCI_CMD_RECT | BCI_CMD_DEST_PBD | BCI_CMD_SRC_PBD_COLOR;
- BCI_CMD_SET_ROP( cmd, XAAGetCopyROP(rop) );
+ BCI_CMD_SET_ROP( cmd, SavageGetCopyROP(rop) );
if (transparency_color != -1)
cmd |= BCI_CMD_SEND_COLOR | BCI_CMD_SRC_TRANSPARENT;
diff --git a/src/savage_exa.c b/src/savage_exa.c
index 08524f0..3fc8f30 100644
--- a/src/savage_exa.c
+++ b/src/savage_exa.c
@@ -69,31 +69,8 @@ SavageDownloadFromScreen(PixmapPtr pSrc, int x, int y, int
w, int h, char *dst,
#define GXset 0xFF
#endif
-static int SavageGetCopyROP(int rop) {
-
- int ALUCopyROP[16] =
- {
- 0x00, /*ROP_0 GXclear */
- 0x88, /*ROP_DSa GXand */
- 0x44, /*ROP_SDna GXandReverse */
- 0xCC, /*ROP_S GXcopy */
- 0x22, /*ROP_DSna GXandInverted */
- 0xAA, /*ROP_D GXnoop */
- 0x66, /*ROP_DSx GXxor */
- 0xEE, /*ROP_DSo GXor */
- 0x11, /*ROP_DSon GXnor */
- 0x99, /*ROP_DSxn GXequiv */
- 0x55, /*ROP_Dn GXinvert*/
- 0xDD, /*ROP_SDno GXorReverse */
- 0x33, /*ROP_Sn GXcopyInverted */
- 0xBB, /*ROP_DSno GXorInverted */
- 0x77, /*ROP_DSan GXnand */
- 0xFF, /*ROP_1 GXset */
- };
-
- return (ALUCopyROP[rop]);
-
-}
+/* Definition moved to savage_accel.c */
+int SavageGetCopyROP(int rop);
static int SavageGetSolidROP(int rop) {
--
1.6.0.6
_______________________________________________
xorg mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/xorg