summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Plattner <aplattner@nvidia.com>2008-06-30 17:29:35 -0700
committerAaron Plattner <aplattner@nvidia.com>2008-07-01 09:08:36 -0700
commit75b5e999f045524e2b362e848a0104e1a4217061 (patch)
tree156976e9fc8014522d403823fd2cc7c2aef1d784
parent9ab88bb9b196fdf534f458cce45eb5f301e545e6 (diff)
Work around the DIX losing mmWidth/mmHeight for RandR 1.1 DDXen.
RandR 1.1 has a physical size for each mode. It used to be that the DIX would remember these modes and pass them back up to the DDX when changing the screen configuration. The DDX uses RR_GET_MODE_MM to query the driver for the physical dimensions of the screen, allowing it to preserve the DPI. With RandR 1.2, the physical dimensions are stored as part of the output, rather than per mode. The DIX only uses the sizes passed in from the DDX to select the mode pool for the "default" output, and forgets the physical sizes. Then, when reconfiguring the screen, it makes up a new RRScreenSizeRec using the dimensions from the output, screwing up the DPI. This change works around this problem by ignoring the DIX and querying the real size from the driver. (cherry picked from commit 2e8daee05343b2853b677acf4554def0ceeada00)
-rw-r--r--hw/xfree86/common/xf86RandR.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/hw/xfree86/common/xf86RandR.c b/hw/xfree86/common/xf86RandR.c
index 4432ad96b..4ee0d8b24 100644
--- a/hw/xfree86/common/xf86RandR.c
+++ b/hw/xfree86/common/xf86RandR.c
@@ -170,6 +170,25 @@ xf86RandRSetMode (ScreenPtr pScreen,
scrp->virtualX = mode->HDisplay;
scrp->virtualY = mode->VDisplay;
}
+
+ /*
+ * The DIX forgets the physical dimensions we passed into RRRegisterSize, so
+ * reconstruct them if possible.
+ */
+ if(scrp->DriverFunc) {
+ xorgRRModeMM RRModeMM;
+
+ RRModeMM.mode = mode;
+ RRModeMM.virtX = scrp->virtualX;
+ RRModeMM.virtY = scrp->virtualY;
+ RRModeMM.mmWidth = mmWidth;
+ RRModeMM.mmHeight = mmHeight;
+
+ (*scrp->DriverFunc)(scrp, RR_GET_MODE_MM, &RRModeMM);
+
+ mmWidth = RRModeMM.mmWidth;
+ mmHeight = RRModeMM.mmHeight;
+ }
if(randrp->rotation & (RR_Rotate_90 | RR_Rotate_270))
{
/* If the screen is rotated 90 or 270 degrees, swap the sizes. */