[PATCH] Wire up RandR CRTC transform protocol, bump server to RandR 1.3

Keith Packard keithp at keithp.com
Fri Nov 14 14:12:31 PST 2008


This involved removing a pile of matrix code from the DDX,
as well as moving a bit of transform logic from DDX to DIX.
---
 hw/xfree86/modes/xf86Crtc.c    |    4 +
 hw/xfree86/modes/xf86RandR12.c |    3 +
 hw/xfree86/modes/xf86Rotate.c  |  212 +---------------------------------------
 randr/randrstr.h               |   45 +++++++++
 randr/rrcrtc.c                 |  203 +++++++++++++++++++++++++++++++++++++-
 randr/rrdispatch.c             |    5 +-
 randr/rrsdispatch.c            |   23 +++++
 7 files changed, 283 insertions(+), 212 deletions(-)

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 0ba0477..a40bf18 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -351,6 +351,10 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
 #endif
 	}
     }
+#ifdef RANDR_12_INTERFACE
+    if (crtc->randr_crtc)
+	RRCrtcPostPendingTransform (crtc->randr_crtc);
+#endif
 
     /* XXX free adjustedmode */
     ret = TRUE;
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index 2ae8ea7..6e14bd7 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -755,6 +755,9 @@ xf86RandR12CrtcSet (ScreenPtr	pScreen,
     if (rotation != crtc->rotation)
 	changed = TRUE;
 
+    if (RRCrtcPendingTransform (randr_crtc))
+	changed = TRUE;
+
     if (x != crtc->x || y != crtc->y)
 	changed = TRUE;
     for (o = 0; o < config->num_output; o++) 
diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c
index 5ab2bf8..7967e5b 100644
--- a/hw/xfree86/modes/xf86Rotate.c
+++ b/hw/xfree86/modes/xf86Rotate.c
@@ -70,205 +70,9 @@ compWindowFormat (WindowPtr pWin)
 
 #define F(x)	IntToxFixed(x)
 
-static void
-PictureTransformIdentity (PictTransformPtr matrix)
-{
-    int	i;
-    memset (matrix, '\0', sizeof (PictTransform));
-    for (i = 0; i < 3; i++)
-	matrix->matrix[i][i] = F(1);
-}
-
-static Bool
-PictureTransformMultiply (PictTransformPtr dst, PictTransformPtr l, PictTransformPtr r)
-{
-    PictTransform   d;
-    int		    dx, dy;
-    int		    o;
-
-    for (dy = 0; dy < 3; dy++)
-	for (dx = 0; dx < 3; dx++)
-	{
-	    xFixed_48_16    v;
-	    xFixed_32_32    partial;
-	    v = 0;
-	    for (o = 0; o < 3; o++)
-	    {
-		partial = (xFixed_32_32) l->matrix[dy][o] * (xFixed_32_32) r->matrix[o][dx];
-		v += partial >> 16;
-	    }
-	    if (v > MAX_FIXED_48_16 || v < MIN_FIXED_48_16)
-		return FALSE;
-	    d.matrix[dy][dx] = (xFixed) v;
-	}
-    *dst = d;
-    return TRUE;
-}
-
-static void
-PictureTransformInitScale (PictTransformPtr t, xFixed sx, xFixed sy)
-{
-    memset (t, '\0', sizeof (PictTransform));
-    t->matrix[0][0] = sx;
-    t->matrix[1][1] = sy;
-    t->matrix[2][2] = F (1);
-}
-
-static xFixed
-fixed_inverse (xFixed x)
-{
-    return (xFixed) ((((xFixed_48_16) F(1)) * F(1)) / x);
-}
-
-static Bool
-PictureTransformScale (PictTransformPtr forward,
-		       PictTransformPtr reverse,
-		       xFixed sx, xFixed sy)
-{
-    PictTransform   t;
-    
-    PictureTransformInitScale (&t, sx, sy);
-    if (!PictureTransformMultiply (forward, &t, forward))
-	return FALSE;
-    PictureTransformInitScale (&t, fixed_inverse (sx), fixed_inverse (sy));
-    if (!PictureTransformMultiply (reverse, reverse, &t))
-	return FALSE;
-    return TRUE;
-}
-
-static void
-PictureTransformInitRotate (PictTransformPtr t, xFixed c, xFixed s)
-{
-    memset (t, '\0', sizeof (PictTransform));
-    t->matrix[0][0] = c;
-    t->matrix[0][1] = -s;
-    t->matrix[1][0] = s;
-    t->matrix[1][1] = c;
-    t->matrix[2][2] = F (1);
-}
-
-static Bool
-PictureTransformRotate (PictTransformPtr forward,
-			PictTransformPtr reverse,
-			xFixed c, xFixed s)
-{
-    PictTransform   t;
-    PictureTransformInitRotate (&t, c, s);
-    if (!PictureTransformMultiply (forward, &t, forward))
-	return FALSE;
-    
-    PictureTransformInitRotate (&t, c, -s);
-    if (!PictureTransformMultiply (reverse, reverse, &t))
-	return FALSE;
-    return TRUE;
-}
-
-static void
-PictureTransformInitTranslate (PictTransformPtr t, xFixed tx, xFixed ty)
-{
-    memset (t, '\0', sizeof (PictTransform));
-    t->matrix[0][0] = F (1);
-    t->matrix[0][2] = tx;
-    t->matrix[1][1] = F (1);
-    t->matrix[1][2] = ty;
-    t->matrix[2][2] = F (1);
-}
-
-static Bool
-PictureTransformTranslate (PictTransformPtr forward,
-			   PictTransformPtr reverse,
-			   xFixed tx, xFixed ty)
-{
-    PictTransform   t;
-    PictureTransformInitTranslate (&t, tx, ty);
-    if (!PictureTransformMultiply (forward, &t, forward))
-	return FALSE;
-    
-    PictureTransformInitTranslate (&t, -tx, -ty);
-    if (!PictureTransformMultiply (reverse, reverse, &t))
-	return FALSE;
-    return TRUE;
-}
-
-static void
-PictureTransformBounds (BoxPtr b, PictTransformPtr matrix)
-{
-    PictVector	v[4];
-    int		i;
-    int		x1, y1, x2, y2;
-
-    v[0].vector[0] = F (b->x1);    v[0].vector[1] = F (b->y1);	v[0].vector[2] = F(1);
-    v[1].vector[0] = F (b->x2);    v[1].vector[1] = F (b->y1);	v[1].vector[2] = F(1);
-    v[2].vector[0] = F (b->x2);    v[2].vector[1] = F (b->y2);	v[2].vector[2] = F(1);
-    v[3].vector[0] = F (b->x1);    v[3].vector[1] = F (b->y2);	v[3].vector[2] = F(1);
-    for (i = 0; i < 4; i++)
-    {
-	PictureTransformPoint (matrix, &v[i]);
-	x1 = xFixedToInt (v[i].vector[0]);
-	y1 = xFixedToInt (v[i].vector[1]);
-	x2 = xFixedToInt (xFixedCeil (v[i].vector[0]));
-	y2 = xFixedToInt (xFixedCeil (v[i].vector[1]));
-	if (i == 0)
-	{
-	    b->x1 = x1; b->y1 = y1;
-	    b->x2 = x2; b->y2 = y2;
-	}
-	else
-	{
-	    if (x1 < b->x1) b->x1 = x1;
-	    if (y1 < b->y1) b->y1 = y1;
-	    if (x2 > b->x2) b->x2 = x2;
-	    if (y2 > b->y2) b->y2 = y2;
-	}
-    }
-}
-
-static Bool
-PictureTransformIsIdentity(PictTransform *t)
-{
-    return ((t->matrix[0][0] == t->matrix[1][1]) &&
-            (t->matrix[0][0] == t->matrix[2][2]) &&
-            (t->matrix[0][0] != 0) &&
-            (t->matrix[0][1] == 0) &&
-            (t->matrix[0][2] == 0) &&
-            (t->matrix[1][0] == 0) &&
-            (t->matrix[1][2] == 0) &&
-            (t->matrix[2][0] == 0) &&
-            (t->matrix[2][1] == 0));
-}
-
 #define toF(x)	((float) (x) / 65536.0f)
 
 static void
-PictureTransformErrorF (PictTransform *t)
-{
-    ErrorF ("{ { %f %f %f } { %f %f %f } { %f %f %f } }",
-	    toF(t->matrix[0][0]), toF(t->matrix[0][1]), toF(t->matrix[0][2]), 
-	    toF(t->matrix[1][0]), toF(t->matrix[1][1]), toF(t->matrix[1][2]), 
-	    toF(t->matrix[2][0]), toF(t->matrix[2][1]), toF(t->matrix[2][2]));
-}
-
-static Bool
-PictureTransformIsInverse (char *where, PictTransform *a, PictTransform *b)
-{
-    PictTransform   t;
-
-    PictureTransformMultiply (&t, a, b);
-    if (!PictureTransformIsIdentity (&t))
-    {
-	ErrorF ("%s: ", where);
-	PictureTransformErrorF (a);
-	ErrorF (" * ");
-	PictureTransformErrorF (b);
-	ErrorF (" = ");
-	PictureTransformErrorF (&t);
-	ErrorF ("\n");
-	return FALSE;
-    }
-    return TRUE;
-}
-
-static void
 xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region)
 {
     ScrnInfoPtr		scrn = crtc->scrn;
@@ -516,9 +320,8 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
     ScreenPtr		pScreen = screenInfo.screens[pScrn->scrnIndex];
     PictTransform	crtc_to_fb, fb_to_crtc;
     
-    PictureTransformIdentity (&crtc_to_fb);
-    PictureTransformIdentity (&fb_to_crtc);
-    PictureTransformIsInverse ("identity", &crtc_to_fb, &fb_to_crtc);
+    PictureTransformInitIdentity (&crtc_to_fb);
+    PictureTransformInitIdentity (&fb_to_crtc);
     if (rotation != RR_Rotate_0)
     {
 	xFixed	rot_cos, rot_sin, rot_dx, rot_dy;
@@ -548,10 +351,7 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
 	}
 	
 	PictureTransformRotate (&crtc_to_fb, &fb_to_crtc, rot_cos, rot_sin);
-	PictureTransformIsInverse ("rotate", &crtc_to_fb, &fb_to_crtc);
-
 	PictureTransformTranslate (&crtc_to_fb, &fb_to_crtc, rot_dx, rot_dy);
-	PictureTransformIsInverse ("rotate translate", &crtc_to_fb, &fb_to_crtc);
 
 	/* reflection */
 	scale_x = F (1);
@@ -576,19 +376,14 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
 	}
 	
 	PictureTransformScale (&crtc_to_fb, &fb_to_crtc, scale_x, scale_y);
-	PictureTransformIsInverse ("scale", &crtc_to_fb, &fb_to_crtc);
-
 	PictureTransformTranslate (&crtc_to_fb, &fb_to_crtc, scale_dx, scale_dy);
-	PictureTransformIsInverse ("scale translate", &crtc_to_fb, &fb_to_crtc);
-
     }
     
 #ifdef RANDR_12_INTERFACE
     {
 	PictTransform	user_forward, user_reverse;
-	if (RRCrtcGetTransform (crtc->randr_crtc, &user_forward, &user_reverse))
+	if (crtc->randr_crtc && RRCrtcGetTransform (crtc->randr_crtc, &user_forward, &user_reverse))
 	{
-	    PictureTransformIsInverse ("user", &user_forward, &user_reverse);
 	    PictureTransformMultiply (&crtc_to_fb, &user_forward, &crtc_to_fb);
 	    PictureTransformMultiply (&fb_to_crtc, &fb_to_crtc, &user_reverse);
 	}
@@ -614,7 +409,6 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
 	PixmapPtr shadow;
 
 	PictureTransformTranslate (&crtc_to_fb, &fb_to_crtc, F(crtc->x), F(crtc->y));
-	PictureTransformIsInverse ("offset", &crtc_to_fb, &fb_to_crtc);
 
 	/* 
 	 * these are the size of the shadow pixmap, which
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 4692ddf..320e9f7 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -119,6 +119,12 @@ struct _rrCrtc {
     CARD16	    *gammaBlue;
     CARD16	    *gammaGreen;
     void	    *devPrivate;
+    PictTransform   client_pending_transform;
+    PictTransform   client_pending_inverse;
+    PictTransform   client_current_transform;
+    PictTransform   client_current_inverse;
+    PictTransform   transform;
+    PictTransform   inverse;
 };
 
 struct _rrOutput {
@@ -587,6 +593,23 @@ void
 RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height);
 
 /*
+ * Compute the complete transformation matrix including
+ * client-specified transform, rotation/reflection values and the crtc 
+ * offset.
+ *
+ * Return TRUE if the resulting transform is not a simple translation.
+ */
+Bool
+RRComputeTransform (RRModePtr		mode,
+		    Rotation		rotation,
+		    int			x,
+		    int			y,
+		    PictTransformPtr	client_transform,
+		    PictTransformPtr	client_inverse,
+		    PictTransformPtr    transform,
+		    PictTransformPtr    inverse);
+
+/*
  * Return crtc transform
  */
 Bool
@@ -601,11 +624,27 @@ void
 RRCrtcPostPendingTransform (RRCrtcPtr crtc);
 
 /*
+ * Check whether the pending and current transforms are the same
+ */
+Bool
+RRCrtcPendingTransform (RRCrtcPtr crtc);
+
+/*
  * Destroy a Crtc at shutdown
  */
 void
 RRCrtcDestroy (RRCrtcPtr crtc);
 
+
+/*
+ * Set the pending CRTC transformation
+ */
+
+int
+RRCrtcTransformSet (RRCrtcPtr		crtc,
+		    PictTransformPtr	transform,
+		    PictTransformPtr	inverse);
+
 /*
  * Initialize crtc type
  */
@@ -631,6 +670,12 @@ ProcRRGetCrtcGamma (ClientPtr client);
 int
 ProcRRSetCrtcGamma (ClientPtr client);
 
+int
+ProcRRSetCrtcTransform (ClientPtr client);
+
+int
+ProcRRGetCrtcTransform (ClientPtr client);
+
 /* rrdispatch.c */
 Bool
 RRClientKnowsRates (ClientPtr	pClient);
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 38b3452..0cb8638 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -89,6 +89,12 @@ RRCrtcCreate (ScreenPtr pScreen, void *devPrivate)
     crtc->gammaRed = crtc->gammaBlue = crtc->gammaGreen = NULL;
     crtc->changed = FALSE;
     crtc->devPrivate = devPrivate;
+    PictureTransformInitIdentity (&crtc->client_pending_transform);
+    PictureTransformInitIdentity (&crtc->client_pending_inverse);
+    PictureTransformInitIdentity (&crtc->client_current_transform);
+    PictureTransformInitIdentity (&crtc->client_current_inverse);
+    PictureTransformInitIdentity (&crtc->transform);
+    PictureTransformInitIdentity (&crtc->inverse);
 
     if (!AddResource (crtc->id, RRCrtcType, (pointer) crtc))
 	return NULL;
@@ -290,7 +296,8 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	crtc->rotation == rotation &&
 	crtc->numOutputs == numOutputs &&
 	!memcmp (crtc->outputs, outputs, numOutputs * sizeof (RROutputPtr)) &&
-	!RRCrtcPendingProperties (crtc))
+	!RRCrtcPendingProperties (crtc) &&
+	!RRCrtcPendingTransform (crtc))
     {
 	ret = TRUE;
     }
@@ -366,7 +373,9 @@ RRCrtcGetTransform (RRCrtcPtr crtc,
 		    PictTransformPtr crtc_to_fb,
 		    PictTransformPtr fb_to_crtc)
 {
-    return FALSE;
+    *crtc_to_fb = crtc->client_pending_transform;
+    *fb_to_crtc = crtc->client_pending_inverse;
+    return !PictureTransformIsIdentity (crtc_to_fb);
 }
 
 /*
@@ -375,6 +384,24 @@ RRCrtcGetTransform (RRCrtcPtr crtc,
 void
 RRCrtcPostPendingTransform (RRCrtcPtr crtc)
 {
+    crtc->client_current_transform = crtc->client_pending_transform;
+    crtc->client_current_inverse = crtc->client_pending_inverse;
+    RRComputeTransform (crtc->mode, crtc->rotation, crtc->x, crtc->y,
+			&crtc->client_current_transform,
+			&crtc->client_current_inverse,
+			&crtc->transform,
+			&crtc->inverse);
+}
+
+/*
+ * Check whether the pending and current transforms are the same
+ */
+Bool
+RRCrtcPendingTransform (RRCrtcPtr crtc)
+{
+    return memcmp (&crtc->client_current_transform,
+		   &crtc->client_pending_transform,
+		   sizeof (PictTransform)) != 0;
 }
 
 /*
@@ -513,6 +540,122 @@ RRCrtcGammaSetSize (RRCrtcPtr	crtc,
 }
 
 /*
+ * Set the pending CRTC transformation
+ */
+
+int
+RRCrtcTransformSet (RRCrtcPtr		crtc,
+		    PictTransformPtr	transform,
+		    PictTransformPtr	inverse)
+{
+    if (!PictureTransformIsInverse (transform, inverse))
+	return BadMatch;
+    crtc->client_pending_transform = *transform;
+    crtc->client_pending_inverse = *inverse;
+    return Success;
+}
+
+#define F(x)	IntToxFixed(x)
+
+/*
+ * Compute the complete transformation matrix including
+ * client-specified transform, rotation/reflection values and the crtc 
+ * offset.
+ *
+ * Return TRUE if the resulting transform is not a simple translation.
+ */
+Bool
+RRComputeTransform (RRModePtr		mode,
+		    Rotation		rotation,
+		    int			x,
+		    int			y,
+		    PictTransformPtr	client_transform,
+		    PictTransformPtr	client_inverse,
+		    PictTransformPtr    transform,
+		    PictTransformPtr    inverse)
+{
+    PictureTransformInitIdentity (transform);
+    PictureTransformInitIdentity (inverse);
+    if (rotation != RR_Rotate_0)
+    {
+	xFixed	rot_cos, rot_sin, rot_dx, rot_dy;
+	xFixed	scale_x, scale_y, scale_dx, scale_dy;
+	int	mode_w = mode->mode.width;
+	int	mode_h = mode->mode.height;
+	
+	/* rotation */
+	switch (rotation & 0xf) {
+	default:
+	case RR_Rotate_0:
+	    rot_cos = F ( 1);	    rot_sin = F ( 0);
+	    rot_dx  = F ( 0);	    rot_dy  = F ( 0);
+	    break;
+	case RR_Rotate_90:
+	    rot_cos = F ( 0);	    rot_sin = F ( 1);
+	    rot_dx =  F ( mode_h);  rot_dy  = F (0);
+	    break;
+	case RR_Rotate_180:
+	    rot_cos = F (-1);	    rot_sin = F ( 0);
+	    rot_dx  = F (mode_w);   rot_dy  = F ( mode_h);
+	    break;
+	case RR_Rotate_270:
+	    rot_cos = F ( 0);	    rot_sin = F (-1);
+	    rot_dx  = F ( 0);	    rot_dy  = F ( mode_w);
+	    break;
+	}
+	
+	PictureTransformRotate (inverse, transform, rot_cos, rot_sin);
+	PictureTransformTranslate (inverse, transform, rot_dx, rot_dy);
+
+	/* reflection */
+	scale_x = F (1);
+	scale_dx = 0;
+	scale_y = F (1);
+	scale_dy = 0;
+	if (rotation & RR_Reflect_X)
+	{
+	    scale_x = F(-1);
+	    if (rotation & (RR_Rotate_0|RR_Rotate_180))
+		scale_dx = F(mode_w);
+	    else
+		scale_dx = F(mode_h);
+	}
+	if (rotation & RR_Reflect_Y)
+	{
+	    scale_y = F(-1);
+	    if (rotation & (RR_Rotate_0|RR_Rotate_180))
+		scale_dy = F(mode_h);
+	    else
+		scale_dy = F(mode_w);
+	}
+	
+	PictureTransformScale (inverse, transform, scale_x, scale_y);
+	PictureTransformTranslate (inverse, transform, scale_dx, scale_dy);
+    }
+    
+#ifdef RANDR_12_INTERFACE
+    {
+        PictureTransformMultiply (inverse, client_inverse, inverse);
+        PictureTransformMultiply (transform, transform, client_transform);
+    }
+#endif
+    /*
+     * Compute the class of the resulting transform
+     */
+    if (PictureTransformIsIdentity (transform))
+    {
+	PictureTransformInitTranslate (inverse,   F (-x), F (-y));
+	PictureTransformInitTranslate (transform, F ( x), F ( y));
+	return FALSE;
+    }
+    else
+    {
+	PictureTransformTranslate (inverse, transform, x, y);
+	return TRUE;
+    }
+}
+
+/*
  * Initialize crtc type
  */
 Bool
@@ -977,3 +1120,59 @@ ProcRRSetCrtcGamma (ClientPtr client)
     return Success;
 }
 
+/* Version 1.3 additions */
+
+int
+ProcRRSetCrtcTransform (ClientPtr client)
+{
+    REQUEST(xRRSetCrtcTransformReq);
+    RRCrtcPtr		    crtc;
+    PictTransform	    transform, inverse;
+
+    REQUEST_SIZE_MATCH (xRRSetCrtcTransformReq);
+    crtc = LookupCrtc (client, stuff->crtc, DixWriteAccess);
+    if (!crtc)
+	return RRErrorBase + BadRRCrtc;
+
+    PictTransform_from_xRenderTransform (&transform, &stuff->transform);
+    PictTransform_from_xRenderTransform (&inverse, &stuff->inverse);
+
+    return RRCrtcTransformSet (crtc, &transform, &inverse);
+}
+
+
+#define CrtcTransformExtra	(SIZEOF(xRRGetCrtcTransformReply) - 32)
+				
+int
+ProcRRGetCrtcTransform (ClientPtr client)
+{
+    REQUEST(xRRGetCrtcTransformReq);
+    xRRGetCrtcTransformReply	reply;
+    RRCrtcPtr			crtc;
+    int				n;
+
+    REQUEST_SIZE_MATCH (xRRGetCrtcTransformReq);
+    crtc = LookupCrtc (client, stuff->crtc, DixWriteAccess);
+    if (!crtc)
+	return RRErrorBase + BadRRCrtc;
+
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    reply.length = CrtcTransformExtra >> 2;
+    
+    xRenderTransform_from_PictTransform (&reply.pendingTransform,
+					 &crtc->client_pending_transform);
+    xRenderTransform_from_PictTransform (&reply.pendingInverse,
+					 &crtc->client_pending_inverse);
+    xRenderTransform_from_PictTransform (&reply.currentTransform,
+					 &crtc->client_current_transform);
+    xRenderTransform_from_PictTransform (&reply.currentInverse,
+					 &crtc->client_current_inverse);
+    if (client->swapped) {
+	swaps (&reply.sequenceNumber, n);
+	swapl (&reply.length, n);
+	SwapLongs ((CARD32 *) &reply.pendingTransform, 40);
+    }
+    WriteToClient (client, sizeof (xRRGetCrtcTransformReply), (char *) &reply);
+    return client->noClientException;
+}
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
index 72c68e3..20b471c 100644
--- a/randr/rrdispatch.c
+++ b/randr/rrdispatch.c
@@ -23,7 +23,7 @@
 #include "randrstr.h"
 
 #define SERVER_RANDR_MAJOR	1
-#define SERVER_RANDR_MINOR	2
+#define SERVER_RANDR_MINOR	3
 
 Bool
 RRClientKnowsRates (ClientPtr	pClient)
@@ -211,5 +211,8 @@ int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
     ProcRRGetCrtcGammaSize,	/* 22 */
     ProcRRGetCrtcGamma,		/* 23 */
     ProcRRSetCrtcGamma,		/* 24 */
+/* V1.3 additions */
+    ProcRRSetCrtcTransform,	/* 25 */
+    ProcRRGetCrtcTransform,	/* 26 */
 };
 
diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c
index 5037b9e..66a0e16 100644
--- a/randr/rrsdispatch.c
+++ b/randr/rrsdispatch.c
@@ -364,6 +364,26 @@ SProcRRSetCrtcGamma (ClientPtr client)
     return (*ProcRandrVector[stuff->randrReqType]) (client);
 }
 
+static int
+SProcRRSetCrtcTransform (ClientPtr client)
+{
+    REQUEST(xRRSetCrtcTransformReq);
+    
+    REQUEST_SIZE_MATCH(xRRSetCrtcTransformReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRGetCrtcTransform (ClientPtr client)
+{
+    REQUEST(xRRGetCrtcTransformReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetCrtcTransformReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
 int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
     SProcRRQueryVersion,	/* 0 */
 /* we skip 1 to make old clients fail pretty immediately */
@@ -394,5 +414,8 @@ int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
     SProcRRGetCrtcGammaSize,	/* 22 */
     SProcRRGetCrtcGamma,	/* 23 */
     SProcRRSetCrtcGamma,	/* 24 */
+/* V1.3 additions */
+    SProcRRSetCrtcTransform,	/* 25 */
+    SProcRRGetCrtcTransform,	/* 26 */
 };
 
-- 
1.5.6.5




More information about the xorg mailing list