9eb1fe64bb
- xserver-1.3.0-randr-updates.patch: Default ModeDebug to TRUE, better to have too much information than too little. - xorg-x11-server-1.0.1-fpic-libxf86config.patch: Build the parser library with hidden symbols to shrink pyf86config a bit. - xserver-1.3.0-intel-by-default.patch: Use intel, not i810, when starting without a config file. - Enable maintainer mode when building so I swear at autotools less.
3727 lines
109 KiB
Diff
3727 lines
109 KiB
Diff
diff --git a/hw/xfree86/modes/Makefile.am b/hw/xfree86/modes/Makefile.am
|
||
index 0841a6d..1f82068 100644
|
||
--- a/hw/xfree86/modes/Makefile.am
|
||
+++ b/hw/xfree86/modes/Makefile.am
|
||
@@ -26,4 +26,4 @@ sdk_HEADERS = \
|
||
xf86RandR12.h \
|
||
xf86Rename.h
|
||
|
||
-AM_CFLAGS = $(XORG_CFLAGS)
|
||
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
|
||
diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
|
||
index 2d8a7ad..064ff16 100644
|
||
--- a/hw/xfree86/modes/xf86Crtc.c
|
||
+++ b/hw/xfree86/modes/xf86Crtc.c
|
||
@@ -45,13 +45,15 @@
|
||
#include "picturestr.h"
|
||
#endif
|
||
|
||
+#include "xf86xv.h"
|
||
+
|
||
/*
|
||
* Initialize xf86CrtcConfig structure
|
||
*/
|
||
|
||
int xf86CrtcConfigPrivateIndex = -1;
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86CrtcConfigInit (ScrnInfoPtr scrn,
|
||
const xf86CrtcConfigFuncsRec *funcs)
|
||
{
|
||
@@ -66,7 +68,7 @@ xf86CrtcConfigInit (ScrnInfoPtr scrn,
|
||
scrn->privates[xf86CrtcConfigPrivateIndex].ptr = config;
|
||
}
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86CrtcSetSizeRange (ScrnInfoPtr scrn,
|
||
int minWidth, int minHeight,
|
||
int maxWidth, int maxHeight)
|
||
@@ -82,7 +84,7 @@ xf86CrtcSetSizeRange (ScrnInfoPtr scrn,
|
||
/*
|
||
* Crtc functions
|
||
*/
|
||
-xf86CrtcPtr
|
||
+_X_EXPORT xf86CrtcPtr
|
||
xf86CrtcCreate (ScrnInfoPtr scrn,
|
||
const xf86CrtcFuncsRec *funcs)
|
||
{
|
||
@@ -114,7 +116,7 @@ xf86CrtcCreate (ScrnInfoPtr scrn,
|
||
return crtc;
|
||
}
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86CrtcDestroy (xf86CrtcPtr crtc)
|
||
{
|
||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
|
||
@@ -126,7 +128,7 @@ xf86CrtcDestroy (xf86CrtcPtr crtc)
|
||
{
|
||
memmove (&xf86_config->crtc[c],
|
||
&xf86_config->crtc[c+1],
|
||
- xf86_config->num_crtc - (c + 1));
|
||
+ ((xf86_config->num_crtc - (c + 1)) * sizeof(void*)));
|
||
xf86_config->num_crtc--;
|
||
break;
|
||
}
|
||
@@ -138,7 +140,7 @@ xf86CrtcDestroy (xf86CrtcPtr crtc)
|
||
* Return whether any outputs are connected to the specified pipe
|
||
*/
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86CrtcInUse (xf86CrtcPtr crtc)
|
||
{
|
||
ScrnInfoPtr pScrn = crtc->scrn;
|
||
@@ -151,7 +153,7 @@ xf86CrtcInUse (xf86CrtcPtr crtc)
|
||
return FALSE;
|
||
}
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86CrtcSetScreenSubpixelOrder (ScreenPtr pScreen)
|
||
{
|
||
#ifdef RENDER
|
||
@@ -219,7 +221,7 @@ xf86CrtcSetScreenSubpixelOrder (ScreenPtr pScreen)
|
||
/**
|
||
* Sets the given video mode on the given crtc
|
||
*/
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
|
||
int x, int y)
|
||
{
|
||
@@ -377,6 +379,15 @@ static OptionInfoRec xf86OutputOptions[] = {
|
||
{-1, NULL, OPTV_NONE, {0}, FALSE },
|
||
};
|
||
|
||
+enum {
|
||
+ OPTION_MODEDEBUG,
|
||
+};
|
||
+
|
||
+static OptionInfoRec xf86DeviceOptions[] = {
|
||
+ {OPTION_MODEDEBUG, "ModeDebug", OPTV_STRING, {0}, FALSE },
|
||
+ {-1, NULL, OPTV_NONE, {0}, FALSE },
|
||
+};
|
||
+
|
||
static void
|
||
xf86OutputSetMonitor (xf86OutputPtr output)
|
||
{
|
||
@@ -481,7 +492,7 @@ xf86OutputInitialRotation (xf86OutputPtr output)
|
||
return RR_Rotate_0;
|
||
}
|
||
|
||
-xf86OutputPtr
|
||
+_X_EXPORT xf86OutputPtr
|
||
xf86OutputCreate (ScrnInfoPtr scrn,
|
||
const xf86OutputFuncsRec *funcs,
|
||
const char *name)
|
||
@@ -541,7 +552,7 @@ xf86OutputCreate (ScrnInfoPtr scrn,
|
||
return output;
|
||
}
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86OutputRename (xf86OutputPtr output, const char *name)
|
||
{
|
||
int len = strlen(name) + 1;
|
||
@@ -560,7 +571,7 @@ xf86OutputRename (xf86OutputPtr output, const char *name)
|
||
return TRUE;
|
||
}
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86OutputUseScreenMonitor (xf86OutputPtr output, Bool use_screen_monitor)
|
||
{
|
||
if (use_screen_monitor != output->use_screen_monitor)
|
||
@@ -570,7 +581,7 @@ xf86OutputUseScreenMonitor (xf86OutputPtr output, Bool use_screen_monitor)
|
||
}
|
||
}
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86OutputDestroy (xf86OutputPtr output)
|
||
{
|
||
ScrnInfoPtr scrn = output->scrn;
|
||
@@ -585,7 +596,7 @@ xf86OutputDestroy (xf86OutputPtr output)
|
||
{
|
||
memmove (&xf86_config->output[o],
|
||
&xf86_config->output[o+1],
|
||
- xf86_config->num_output - (o + 1));
|
||
+ ((xf86_config->num_output - (o + 1)) * sizeof(void*)));
|
||
xf86_config->num_output--;
|
||
break;
|
||
}
|
||
@@ -646,7 +657,7 @@ xf86CrtcCloseScreen (int index, ScreenPtr screen)
|
||
/*
|
||
* Called at ScreenInit time to set up
|
||
*/
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86CrtcScreenInit (ScreenPtr screen)
|
||
{
|
||
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
|
||
@@ -667,7 +678,8 @@ xf86CrtcScreenInit (ScreenPtr screen)
|
||
}
|
||
if (c == config->num_crtc)
|
||
xf86RandR12SetRotations (screen, RR_Rotate_0 | RR_Rotate_90 |
|
||
- RR_Rotate_180 | RR_Rotate_270);
|
||
+ RR_Rotate_180 | RR_Rotate_270 |
|
||
+ RR_Reflect_X | RR_Reflect_Y);
|
||
else
|
||
xf86RandR12SetRotations (screen, RR_Rotate_0);
|
||
|
||
@@ -1202,16 +1214,21 @@ xf86SortModes (DisplayModePtr input)
|
||
return output;
|
||
}
|
||
|
||
-#define DEBUG_REPROBE 1
|
||
-
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
|
||
{
|
||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
|
||
int o;
|
||
|
||
- if (maxX == 0 || maxY == 0)
|
||
- xf86RandR12GetOriginalVirtualSize (scrn, &maxX, &maxY);
|
||
+ /* When canGrow was TRUE in the initial configuration we have to
|
||
+ * compare against the maximum values so that we don't drop modes.
|
||
+ * When canGrow was FALSE, the maximum values would have been clamped
|
||
+ * anyway.
|
||
+ */
|
||
+ if (maxX == 0 || maxY == 0) {
|
||
+ maxX = config->maxWidth;
|
||
+ maxY = config->maxHeight;
|
||
+ }
|
||
|
||
/* Elide duplicate modes before defaulting code uses them */
|
||
xf86PruneDuplicateMonitorModes (scrn->monitor);
|
||
@@ -1239,7 +1256,7 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
|
||
*/
|
||
output->status = (*output->funcs->detect)(output);
|
||
|
||
- if (!xf86OutputEnabled (output))
|
||
+ if (output->status == XF86OutputStatusDisconnected)
|
||
{
|
||
xf86OutputSetEDID (output, NULL);
|
||
continue;
|
||
@@ -1372,7 +1389,8 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
|
||
if (mode->status == MODE_OK)
|
||
mode->status = (*output->funcs->mode_valid)(output, mode);
|
||
|
||
- xf86PruneInvalidModes(scrn, &output->probed_modes, TRUE);
|
||
+ xf86PruneInvalidModes(scrn, &output->probed_modes,
|
||
+ config->debug_modes);
|
||
|
||
output->probed_modes = xf86SortModes (output->probed_modes);
|
||
|
||
@@ -1398,24 +1416,25 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
|
||
output->probed_modes = mode;
|
||
}
|
||
mode->type |= M_T_PREFERRED;
|
||
- break;
|
||
}
|
||
+ else
|
||
+ mode->type &= ~M_T_PREFERRED;
|
||
}
|
||
}
|
||
|
||
output->initial_rotation = xf86OutputInitialRotation (output);
|
||
|
||
-#ifdef DEBUG_REPROBE
|
||
- if (output->probed_modes != NULL) {
|
||
- xf86DrvMsg(scrn->scrnIndex, X_INFO,
|
||
- "Printing probed modes for output %s\n",
|
||
- output->name);
|
||
- } else {
|
||
- xf86DrvMsg(scrn->scrnIndex, X_INFO,
|
||
- "No remaining probed modes for output %s\n",
|
||
- output->name);
|
||
+ if (config->debug_modes) {
|
||
+ if (output->probed_modes != NULL) {
|
||
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
|
||
+ "Printing probed modes for output %s\n",
|
||
+ output->name);
|
||
+ } else {
|
||
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
|
||
+ "No remaining probed modes for output %s\n",
|
||
+ output->name);
|
||
+ }
|
||
}
|
||
-#endif
|
||
for (mode = output->probed_modes; mode != NULL; mode = mode->next)
|
||
{
|
||
/* The code to choose the best mode per pipe later on will require
|
||
@@ -1424,9 +1443,8 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
|
||
mode->VRefresh = xf86ModeVRefresh(mode);
|
||
xf86SetModeCrtc(mode, INTERLACE_HALVE_V);
|
||
|
||
-#ifdef DEBUG_REPROBE
|
||
- xf86PrintModeline(scrn->scrnIndex, mode);
|
||
-#endif
|
||
+ if (config->debug_modes)
|
||
+ xf86PrintModeline(scrn->scrnIndex, mode);
|
||
}
|
||
}
|
||
}
|
||
@@ -1437,10 +1455,10 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
|
||
*/
|
||
|
||
/* XXX where does this function belong? Here? */
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr scrn, int *x, int *y);
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86SetScrnInfoModes (ScrnInfoPtr scrn)
|
||
{
|
||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
|
||
@@ -1508,7 +1526,7 @@ xf86SetScrnInfoModes (ScrnInfoPtr scrn)
|
||
* accordingly.
|
||
*/
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
|
||
{
|
||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
|
||
@@ -1521,6 +1539,15 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
|
||
int width;
|
||
int height;
|
||
|
||
+ /* Set up the device options */
|
||
+ config->options = xnfalloc (sizeof (xf86DeviceOptions));
|
||
+ memcpy (config->options, xf86DeviceOptions, sizeof (xf86DeviceOptions));
|
||
+ xf86ProcessOptions (scrn->scrnIndex,
|
||
+ scrn->options,
|
||
+ config->options);
|
||
+ config->debug_modes = xf86ReturnOptValBool (config->options,
|
||
+ OPTION_MODEDEBUG, TRUE);
|
||
+
|
||
if (scrn->display->virtualX)
|
||
width = scrn->display->virtualX;
|
||
else
|
||
@@ -1703,12 +1730,30 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow)
|
||
* modes (used in EnterVT functions, or at server startup)
|
||
*/
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86SetDesiredModes (ScrnInfoPtr scrn)
|
||
{
|
||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
|
||
- int c;
|
||
+ int c, o;
|
||
|
||
+ /*
|
||
+ * Turn off everything so mode setting is done
|
||
+ * with hardware in a consistent state
|
||
+ */
|
||
+ for (o = 0; o < config->num_output; o++)
|
||
+ {
|
||
+ xf86OutputPtr output = config->output[o];
|
||
+ (*output->funcs->dpms)(output, DPMSModeOff);
|
||
+ }
|
||
+
|
||
+ for (c = 0; c < config->num_crtc; c++)
|
||
+ {
|
||
+ xf86CrtcPtr crtc = config->crtc[c];
|
||
+
|
||
+ crtc->funcs->dpms(crtc, DPMSModeOff);
|
||
+ memset(&crtc->mode, 0, sizeof(crtc->mode));
|
||
+ }
|
||
+
|
||
for (c = 0; c < config->num_crtc; c++)
|
||
{
|
||
xf86CrtcPtr crtc = config->crtc[c];
|
||
@@ -1765,7 +1810,7 @@ xf86SetDesiredModes (ScrnInfoPtr scrn)
|
||
* - Closer in refresh rate to the requested mode.
|
||
*/
|
||
|
||
-DisplayModePtr
|
||
+_X_EXPORT DisplayModePtr
|
||
xf86OutputFindClosestMode (xf86OutputPtr output, DisplayModePtr desired)
|
||
{
|
||
DisplayModePtr best = NULL, scan = NULL;
|
||
@@ -1828,7 +1873,7 @@ xf86OutputFindClosestMode (xf86OutputPtr output, DisplayModePtr desired)
|
||
* mode across all outputs that are currently active.
|
||
*/
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation)
|
||
{
|
||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||
@@ -1900,7 +1945,7 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation)
|
||
* If the new mode is off, it will turn off outputs and then CRTCs.
|
||
* Otherwise, it will affect CRTCs before outputs.
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86DPMSSet(ScrnInfoPtr scrn, int mode, int flags)
|
||
{
|
||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
|
||
@@ -1938,7 +1983,7 @@ xf86DPMSSet(ScrnInfoPtr scrn, int mode, int flags)
|
||
* Even for monitors with no DPMS support, by the definition of our DPMS hooks,
|
||
* the outputs will still get disabled (blanked).
|
||
*/
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86SaveScreen(ScreenPtr pScreen, int mode)
|
||
{
|
||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||
@@ -1954,7 +1999,7 @@ xf86SaveScreen(ScreenPtr pScreen, int mode)
|
||
/**
|
||
* Disable all inactive crtcs and outputs
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86DisableUnusedFunctions(ScrnInfoPtr pScrn)
|
||
{
|
||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||
@@ -1989,7 +2034,7 @@ xf86DisableUnusedFunctions(ScrnInfoPtr pScrn)
|
||
static void
|
||
xf86OutputSetEDIDProperty (xf86OutputPtr output, void *data, int data_len)
|
||
{
|
||
- Atom edid_atom = MakeAtom(EDID_ATOM_NAME, sizeof(EDID_ATOM_NAME), TRUE);
|
||
+ Atom edid_atom = MakeAtom(EDID_ATOM_NAME, sizeof(EDID_ATOM_NAME) - 1, TRUE);
|
||
|
||
/* This may get called before the RandR resources have been created */
|
||
if (output->randr_output == NULL)
|
||
@@ -2008,7 +2053,7 @@ xf86OutputSetEDIDProperty (xf86OutputPtr output, void *data, int data_len)
|
||
/**
|
||
* Set the EDID information for the specified output
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon)
|
||
{
|
||
ScrnInfoPtr scrn = output->scrn;
|
||
@@ -2023,10 +2068,12 @@ xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon)
|
||
|
||
output->MonInfo = edid_mon;
|
||
|
||
- /* Debug info for now, at least */
|
||
- xf86DrvMsg(scrn->scrnIndex, X_INFO, "EDID for output %s\n", output->name);
|
||
- xf86PrintEDID(edid_mon);
|
||
-
|
||
+ if (config->debug_modes) {
|
||
+ xf86DrvMsg(scrn->scrnIndex, X_INFO, "EDID for output %s\n",
|
||
+ output->name);
|
||
+ xf86PrintEDID(edid_mon);
|
||
+ }
|
||
+
|
||
/* Set the DDC properties for the 'compat' output */
|
||
if (output == config->output[config->compat_output])
|
||
xf86SetDDCproperties(scrn, edid_mon);
|
||
@@ -2072,7 +2119,7 @@ xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon)
|
||
* Return the list of modes supported by the EDID information
|
||
* stored in 'output'
|
||
*/
|
||
-DisplayModePtr
|
||
+_X_EXPORT DisplayModePtr
|
||
xf86OutputGetEDIDModes (xf86OutputPtr output)
|
||
{
|
||
ScrnInfoPtr scrn = output->scrn;
|
||
@@ -2083,7 +2130,7 @@ xf86OutputGetEDIDModes (xf86OutputPtr output)
|
||
return xf86DDCGetModes(scrn->scrnIndex, edid_mon);
|
||
}
|
||
|
||
-xf86MonPtr
|
||
+_X_EXPORT xf86MonPtr
|
||
xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus)
|
||
{
|
||
ScrnInfoPtr scrn = output->scrn;
|
||
@@ -2094,8 +2141,127 @@ xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus)
|
||
static char *_xf86ConnectorNames[] = { "None", "VGA", "DVI-I", "DVI-D",
|
||
"DVI-A", "Composite", "S-Video",
|
||
"Component", "LFP", "Proprietary" };
|
||
-char *
|
||
+_X_EXPORT char *
|
||
xf86ConnectorGetName(xf86ConnectorType connector)
|
||
{
|
||
return _xf86ConnectorNames[connector];
|
||
}
|
||
+
|
||
+static void
|
||
+x86_crtc_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
|
||
+{
|
||
+ dest->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
|
||
+ dest->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
|
||
+ dest->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
|
||
+ dest->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
|
||
+
|
||
+ if (dest->x1 >= dest->x2 || dest->y1 >= dest->y2)
|
||
+ dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
|
||
+}
|
||
+
|
||
+static void
|
||
+x86_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box)
|
||
+{
|
||
+ if (crtc->enabled) {
|
||
+ crtc_box->x1 = crtc->x;
|
||
+ crtc_box->x2 = crtc->x + xf86ModeWidth(&crtc->mode, crtc->rotation);
|
||
+ crtc_box->y1 = crtc->y;
|
||
+ crtc_box->y2 = crtc->y + xf86ModeHeight(&crtc->mode, crtc->rotation);
|
||
+ } else
|
||
+ crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
|
||
+}
|
||
+
|
||
+static int
|
||
+xf86_crtc_box_area(BoxPtr box)
|
||
+{
|
||
+ return (int) (box->x2 - box->x1) * (int) (box->y2 - box->y1);
|
||
+}
|
||
+
|
||
+/*
|
||
+ * Return the crtc covering 'box'. If two crtcs cover a portion of
|
||
+ * 'box', then prefer 'desired'. If 'desired' is NULL, then prefer the crtc
|
||
+ * with greater coverage
|
||
+ */
|
||
+
|
||
+static xf86CrtcPtr
|
||
+xf86_covering_crtc(ScrnInfoPtr pScrn,
|
||
+ BoxPtr box,
|
||
+ xf86CrtcPtr desired,
|
||
+ BoxPtr crtc_box_ret)
|
||
+{
|
||
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||
+ xf86CrtcPtr crtc, best_crtc;
|
||
+ int coverage, best_coverage;
|
||
+ int c;
|
||
+ BoxRec crtc_box, cover_box;
|
||
+
|
||
+ best_crtc = NULL;
|
||
+ best_coverage = 0;
|
||
+ crtc_box_ret->x1 = 0;
|
||
+ crtc_box_ret->x2 = 0;
|
||
+ crtc_box_ret->y1 = 0;
|
||
+ crtc_box_ret->y2 = 0;
|
||
+ for (c = 0; c < xf86_config->num_crtc; c++) {
|
||
+ crtc = xf86_config->crtc[c];
|
||
+ x86_crtc_box(crtc, &crtc_box);
|
||
+ x86_crtc_box_intersect(&cover_box, &crtc_box, box);
|
||
+ coverage = xf86_crtc_box_area(&cover_box);
|
||
+ if (coverage && crtc == desired) {
|
||
+ *crtc_box_ret = crtc_box;
|
||
+ return crtc;
|
||
+ } else if (coverage > best_coverage) {
|
||
+ *crtc_box_ret = crtc_box;
|
||
+ best_crtc = crtc;
|
||
+ best_coverage = coverage;
|
||
+ }
|
||
+ }
|
||
+ return best_crtc;
|
||
+}
|
||
+
|
||
+/*
|
||
+ * For overlay video, compute the relevant CRTC and
|
||
+ * clip video to that.
|
||
+ *
|
||
+ * returning FALSE means there was a memory failure of some kind,
|
||
+ * not that the video shouldn't be displayed
|
||
+ */
|
||
+
|
||
+_X_EXPORT Bool
|
||
+xf86_crtc_clip_video_helper(ScrnInfoPtr pScrn,
|
||
+ xf86CrtcPtr *crtc_ret,
|
||
+ xf86CrtcPtr desired_crtc,
|
||
+ BoxPtr dst,
|
||
+ INT32 *xa,
|
||
+ INT32 *xb,
|
||
+ INT32 *ya,
|
||
+ INT32 *yb,
|
||
+ RegionPtr reg,
|
||
+ INT32 width,
|
||
+ INT32 height)
|
||
+{
|
||
+ Bool ret;
|
||
+ RegionRec crtc_region_local;
|
||
+ RegionPtr crtc_region = reg;
|
||
+
|
||
+ if (crtc_ret) {
|
||
+ BoxRec crtc_box;
|
||
+ xf86CrtcPtr crtc = xf86_covering_crtc(pScrn, dst,
|
||
+ desired_crtc,
|
||
+ &crtc_box);
|
||
+
|
||
+ if (crtc) {
|
||
+ REGION_INIT (pScreen, &crtc_region_local, &crtc_box, 1);
|
||
+ crtc_region = &crtc_region_local;
|
||
+ REGION_INTERSECT (pScreen, crtc_region, crtc_region, reg);
|
||
+ }
|
||
+ *crtc_ret = crtc;
|
||
+ }
|
||
+
|
||
+ ret = xf86XVClipVideoHelper(dst, xa, xb, ya, yb,
|
||
+ crtc_region, width, height);
|
||
+
|
||
+ if (crtc_region != reg)
|
||
+ REGION_UNINIT (pScreen, &crtc_region_local);
|
||
+
|
||
+ return ret;
|
||
+}
|
||
diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h
|
||
index e64ce1e..9693e12 100644
|
||
--- a/hw/xfree86/modes/xf86Crtc.h
|
||
+++ b/hw/xfree86/modes/xf86Crtc.h
|
||
@@ -30,6 +30,7 @@
|
||
#include "xf86Modes.h"
|
||
#include "xf86Cursor.h"
|
||
#include "damage.h"
|
||
+#include "picturestr.h"
|
||
|
||
/* Compat definitions for older X Servers. */
|
||
#ifndef M_T_PREFERRED
|
||
@@ -279,6 +280,17 @@ struct _xf86Crtc {
|
||
* Track state of cursor associated with this CRTC
|
||
*/
|
||
Bool cursor_shown;
|
||
+
|
||
+ /**
|
||
+ * Current transformation matrix
|
||
+ */
|
||
+ PictTransform crtc_to_framebuffer;
|
||
+ PictTransform framebuffer_to_crtc;
|
||
+ Bool transform_in_use;
|
||
+ /**
|
||
+ * Bounding box in screen space
|
||
+ */
|
||
+ BoxRec bounds;
|
||
};
|
||
|
||
typedef struct _xf86OutputFuncs {
|
||
@@ -555,6 +567,17 @@ typedef struct _xf86CrtcConfig {
|
||
CARD8 *cursor_image;
|
||
Bool cursor_on;
|
||
CARD32 cursor_fg, cursor_bg;
|
||
+
|
||
+ /**
|
||
+ * Options parsed from the related device section
|
||
+ */
|
||
+ OptionInfoPtr options;
|
||
+
|
||
+ Bool debug_modes;
|
||
+
|
||
+ /* wrap screen BlockHandler for rotation */
|
||
+ ScreenBlockHandlerProcPtr BlockHandler;
|
||
+
|
||
} xf86CrtcConfigRec, *xf86CrtcConfigPtr;
|
||
|
||
extern int xf86CrtcConfigPrivateIndex;
|
||
@@ -742,5 +765,24 @@ xf86_hide_cursors (ScrnInfoPtr scrn);
|
||
*/
|
||
void
|
||
xf86_cursors_fini (ScreenPtr screen);
|
||
+
|
||
+/*
|
||
+ * For overlay video, compute the relevant CRTC and
|
||
+ * clip video to that.
|
||
+ * wraps xf86XVClipVideoHelper()
|
||
+ */
|
||
+
|
||
+Bool
|
||
+xf86_crtc_clip_video_helper(ScrnInfoPtr pScrn,
|
||
+ xf86CrtcPtr *crtc_ret,
|
||
+ xf86CrtcPtr desired_crtc,
|
||
+ BoxPtr dst,
|
||
+ INT32 *xa,
|
||
+ INT32 *xb,
|
||
+ INT32 *ya,
|
||
+ INT32 *yb,
|
||
+ RegionPtr reg,
|
||
+ INT32 width,
|
||
+ INT32 height);
|
||
|
||
#endif /* _XF86CRTC_H_ */
|
||
diff --git a/hw/xfree86/modes/xf86Cursors.c b/hw/xfree86/modes/xf86Cursors.c
|
||
index 009cccf..b510164 100644
|
||
--- a/hw/xfree86/modes/xf86Cursors.c
|
||
+++ b/hw/xfree86/modes/xf86Cursors.c
|
||
@@ -58,29 +58,73 @@ xf86_crtc_rotate_coord (Rotation rotation,
|
||
int *x_src,
|
||
int *y_src)
|
||
{
|
||
+ int t;
|
||
+
|
||
+ switch (rotation & 0xf) {
|
||
+ case RR_Rotate_0:
|
||
+ break;
|
||
+ case RR_Rotate_90:
|
||
+ t = x_dst;
|
||
+ x_dst = height - y_dst - 1;
|
||
+ y_dst = t;
|
||
+ break;
|
||
+ case RR_Rotate_180:
|
||
+ x_dst = width - x_dst - 1;
|
||
+ y_dst = height - y_dst - 1;
|
||
+ break;
|
||
+ case RR_Rotate_270:
|
||
+ t = x_dst;
|
||
+ x_dst = y_dst;
|
||
+ y_dst = width - t - 1;
|
||
+ break;
|
||
+ }
|
||
if (rotation & RR_Reflect_X)
|
||
x_dst = width - x_dst - 1;
|
||
if (rotation & RR_Reflect_Y)
|
||
y_dst = height - y_dst - 1;
|
||
+ *x_src = x_dst;
|
||
+ *y_src = y_dst;
|
||
+}
|
||
+
|
||
+/*
|
||
+ * Given a cursor source coordinate, rotate to a screen coordinate
|
||
+ */
|
||
+static void
|
||
+xf86_crtc_rotate_coord_back (Rotation rotation,
|
||
+ int width,
|
||
+ int height,
|
||
+ int x_dst,
|
||
+ int y_dst,
|
||
+ int *x_src,
|
||
+ int *y_src)
|
||
+{
|
||
+ int t;
|
||
|
||
+ if (rotation & RR_Reflect_X)
|
||
+ x_dst = width - x_dst - 1;
|
||
+ if (rotation & RR_Reflect_Y)
|
||
+ y_dst = height - y_dst - 1;
|
||
+
|
||
switch (rotation & 0xf) {
|
||
case RR_Rotate_0:
|
||
- *x_src = x_dst;
|
||
- *y_src = y_dst;
|
||
break;
|
||
case RR_Rotate_90:
|
||
- *x_src = height - y_dst - 1;
|
||
- *y_src = x_dst;
|
||
+ t = x_dst;
|
||
+ x_dst = y_dst;
|
||
+ y_dst = width - t - 1;
|
||
break;
|
||
case RR_Rotate_180:
|
||
- *x_src = width - x_dst - 1;
|
||
- *y_src = height - y_dst - 1;
|
||
+ x_dst = width - x_dst - 1;
|
||
+ y_dst = height - y_dst - 1;
|
||
break;
|
||
case RR_Rotate_270:
|
||
- *x_src = y_dst;
|
||
- *y_src = width - x_dst - 1;
|
||
+ t = x_dst;
|
||
+ x_dst = height - y_dst - 1;
|
||
+ y_dst = t;
|
||
break;
|
||
}
|
||
+ *x_src = x_dst;
|
||
+ *y_src = y_dst;
|
||
}
|
||
|
||
/*
|
||
@@ -212,7 +256,7 @@ xf86_crtc_hide_cursor (xf86CrtcPtr crtc)
|
||
}
|
||
}
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86_hide_cursors (ScrnInfoPtr scrn)
|
||
{
|
||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||
@@ -238,7 +282,7 @@ xf86_crtc_show_cursor (xf86CrtcPtr crtc)
|
||
}
|
||
}
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86_show_cursors (ScrnInfoPtr scrn)
|
||
{
|
||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||
@@ -261,49 +305,33 @@ xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
|
||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
|
||
DisplayModePtr mode = &crtc->mode;
|
||
- int x_temp;
|
||
- int y_temp;
|
||
Bool in_range;
|
||
+ int dx, dy;
|
||
|
||
- /*
|
||
- * Move to crtc coordinate space
|
||
- */
|
||
- x -= crtc->x;
|
||
- y -= crtc->y;
|
||
-
|
||
/*
|
||
- * Rotate
|
||
+ * Transform position of cursor on screen
|
||
*/
|
||
- switch ((crtc->rotation) & 0xf) {
|
||
- case RR_Rotate_0:
|
||
- break;
|
||
- case RR_Rotate_90:
|
||
- x_temp = y;
|
||
- y_temp = mode->VDisplay - cursor_info->MaxWidth - x;
|
||
- x = x_temp;
|
||
- y = y_temp;
|
||
- break;
|
||
- case RR_Rotate_180:
|
||
- x_temp = mode->HDisplay - cursor_info->MaxWidth - x;
|
||
- y_temp = mode->VDisplay - cursor_info->MaxHeight - y;
|
||
- x = x_temp;
|
||
- y = y_temp;
|
||
- break;
|
||
- case RR_Rotate_270:
|
||
- x_temp = mode->HDisplay - cursor_info->MaxHeight - y;
|
||
- y_temp = x;
|
||
- x = x_temp;
|
||
- y = y_temp;
|
||
- break;
|
||
+ if (crtc->transform_in_use)
|
||
+ {
|
||
+ PictVector v;
|
||
+ v.vector[0] = IntToxFixed (x); v.vector[1] = IntToxFixed (y); v.vector[2] = IntToxFixed(1);
|
||
+ PictureTransformPoint (&crtc->framebuffer_to_crtc, &v);
|
||
+ x = xFixedToInt (v.vector[0]); y = xFixedToInt (v.vector[1]);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ x -= crtc->x;
|
||
+ y -= crtc->y;
|
||
}
|
||
-
|
||
/*
|
||
- * Reflect
|
||
+ * Transform position of cursor upper left corner
|
||
*/
|
||
- if (crtc->rotation & RR_Reflect_X)
|
||
- x = mode->HDisplay - cursor_info->MaxWidth - x;
|
||
- if (crtc->rotation & RR_Reflect_Y)
|
||
- y = mode->VDisplay - cursor_info->MaxHeight - y;
|
||
+ xf86_crtc_rotate_coord_back (crtc->rotation,
|
||
+ cursor_info->MaxWidth,
|
||
+ cursor_info->MaxHeight,
|
||
+ 0, 0, &dx, &dy);
|
||
+ x -= dx;
|
||
+ y -= dy;
|
||
|
||
/*
|
||
* Disable the cursor when it is outside the viewport
|
||
@@ -419,7 +447,10 @@ xf86_use_hw_cursor (ScreenPtr screen, CursorPtr cursor)
|
||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
|
||
|
||
+ if (xf86_config->cursor)
|
||
+ FreeCursor (xf86_config->cursor, None);
|
||
xf86_config->cursor = cursor;
|
||
+ ++cursor->refcnt;
|
||
|
||
if (cursor->bits->width > cursor_info->MaxWidth ||
|
||
cursor->bits->height> cursor_info->MaxHeight)
|
||
@@ -435,7 +466,10 @@ xf86_use_hw_cursor_argb (ScreenPtr screen, CursorPtr cursor)
|
||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
|
||
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
|
||
|
||
+ if (xf86_config->cursor)
|
||
+ FreeCursor (xf86_config->cursor, None);
|
||
xf86_config->cursor = cursor;
|
||
+ ++cursor->refcnt;
|
||
|
||
/* Make sure ARGB support is available */
|
||
if ((cursor_info->Flags & HARDWARE_CURSOR_ARGB) == 0)
|
||
@@ -494,7 +528,7 @@ xf86_load_cursor_argb (ScrnInfoPtr scrn, CursorPtr cursor)
|
||
}
|
||
}
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86_cursors_init (ScreenPtr screen, int max_width, int max_height, int flags)
|
||
{
|
||
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
|
||
@@ -545,7 +579,7 @@ xf86_cursors_init (ScreenPtr screen, int max_width, int max_height, int flags)
|
||
* Reloads cursor images as needed, then adjusts cursor positions
|
||
*/
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86_reload_cursors (ScreenPtr screen)
|
||
{
|
||
ScrnInfoPtr scrn;
|
||
@@ -588,7 +622,7 @@ xf86_reload_cursors (ScreenPtr screen)
|
||
/**
|
||
* Clean up CRTC-based cursor code
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86_cursors_fini (ScreenPtr screen)
|
||
{
|
||
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
|
||
@@ -604,4 +638,9 @@ xf86_cursors_fini (ScreenPtr screen)
|
||
xfree (xf86_config->cursor_image);
|
||
xf86_config->cursor_image = NULL;
|
||
}
|
||
+ if (xf86_config->cursor)
|
||
+ {
|
||
+ FreeCursor (xf86_config->cursor, None);
|
||
+ xf86_config->cursor = NULL;
|
||
+ }
|
||
}
|
||
diff --git a/hw/xfree86/modes/xf86DiDGA.c b/hw/xfree86/modes/xf86DiDGA.c
|
||
index 0964cef..f40d0ab 100644
|
||
--- a/hw/xfree86/modes/xf86DiDGA.c
|
||
+++ b/hw/xfree86/modes/xf86DiDGA.c
|
||
@@ -255,7 +255,7 @@ static DGAFunctionRec xf86_dga_funcs = {
|
||
NULL
|
||
};
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86DiDGAReInit (ScreenPtr pScreen)
|
||
{
|
||
ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
|
||
@@ -267,7 +267,7 @@ xf86DiDGAReInit (ScreenPtr pScreen)
|
||
return DGAReInitModes (pScreen, xf86_config->dga_modes, xf86_config->dga_nmode);
|
||
}
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86DiDGAInit (ScreenPtr pScreen, unsigned long dga_address)
|
||
{
|
||
ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
|
||
diff --git a/hw/xfree86/modes/xf86EdidModes.c b/hw/xfree86/modes/xf86EdidModes.c
|
||
index edcd636..8b5e69d 100644
|
||
--- a/hw/xfree86/modes/xf86EdidModes.c
|
||
+++ b/hw/xfree86/modes/xf86EdidModes.c
|
||
@@ -22,8 +22,9 @@
|
||
*/
|
||
|
||
/**
|
||
- * @file This is a copy of edid_modes.c from the X Server, for compatibility
|
||
- * with old X Servers.
|
||
+ * @file This file covers code to convert a xf86MonPtr containing EDID-probed
|
||
+ * information into a list of modes, including applying monitor-specific
|
||
+ * quirks to fix broken EDID data.
|
||
*/
|
||
#ifdef HAVE_XORG_CONFIG_H
|
||
#include <xorg-config.h>
|
||
@@ -49,32 +50,12 @@
|
||
|
||
typedef enum {
|
||
DDC_QUIRK_NONE = 0,
|
||
- /* Force detailed sync polarity to -h +v */
|
||
- DDC_QUIRK_DT_SYNC_HM_VP = 1 << 0,
|
||
/* First detailed mode is bogus, prefer largest mode at 60hz */
|
||
- DDC_QUIRK_PREFER_LARGE_60 = 1 << 1,
|
||
+ DDC_QUIRK_PREFER_LARGE_60 = 1 << 0,
|
||
/* 135MHz clock is too high, drop a bit */
|
||
- DDC_QUIRK_135_CLOCK_TOO_HIGH = 1 << 2
|
||
+ DDC_QUIRK_135_CLOCK_TOO_HIGH = 1 << 1,
|
||
} ddc_quirk_t;
|
||
|
||
-static Bool quirk_dt_sync_hm_vp (int scrnIndex, xf86MonPtr DDC)
|
||
-{
|
||
- /* Belinea 1924S1W */
|
||
- if (memcmp (DDC->vendor.name, "MAX", 4) == 0 &&
|
||
- DDC->vendor.prod_id == 1932)
|
||
- return TRUE;
|
||
- /* Belinea 10 20 30W */
|
||
- if (memcmp (DDC->vendor.name, "MAX", 4) == 0 &&
|
||
- DDC->vendor.prod_id == 2007)
|
||
- return TRUE;
|
||
- /* ViewSonic VX2025wm (bug #9941) */
|
||
- if (memcmp (DDC->vendor.name, "VSC", 4) == 0 &&
|
||
- DDC->vendor.prod_id == 58653)
|
||
- return TRUE;
|
||
-
|
||
- return FALSE;
|
||
-}
|
||
-
|
||
static Bool quirk_prefer_large_60 (int scrnIndex, xf86MonPtr DDC)
|
||
{
|
||
/* Belinea 10 15 55 */
|
||
@@ -87,11 +68,16 @@ static Bool quirk_prefer_large_60 (int scrnIndex, xf86MonPtr DDC)
|
||
DDC->vendor.prod_id == 44358)
|
||
return TRUE;
|
||
|
||
- /* Samsung SyncMaster 226BW */
|
||
+ /* Bug #10814: Samsung SyncMaster 225BW */
|
||
+ if (memcmp (DDC->vendor.name, "SAM", 4) == 0 &&
|
||
+ DDC->vendor.prod_id == 596)
|
||
+ return TRUE;
|
||
+
|
||
+ /* Bug #10545: Samsung SyncMaster 226BW */
|
||
if (memcmp (DDC->vendor.name, "SAM", 4) == 0 &&
|
||
DDC->vendor.prod_id == 638)
|
||
return TRUE;
|
||
-
|
||
+
|
||
return FALSE;
|
||
}
|
||
|
||
@@ -112,10 +98,6 @@ typedef struct {
|
||
} ddc_quirk_map_t;
|
||
|
||
static const ddc_quirk_map_t ddc_quirks[] = {
|
||
- {
|
||
- quirk_dt_sync_hm_vp, DDC_QUIRK_DT_SYNC_HM_VP,
|
||
- "Set detailed timing sync polarity to -h +v"
|
||
- },
|
||
{
|
||
quirk_prefer_large_60, DDC_QUIRK_PREFER_LARGE_60,
|
||
"Detailed timing is not preferred, use largest mode at 60Hz"
|
||
@@ -207,6 +189,19 @@ DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
|
||
{
|
||
DisplayModePtr Mode;
|
||
|
||
+ /*
|
||
+ * Refuse to create modes that are insufficiently large. 64 is a random
|
||
+ * number, maybe the spec says something about what the minimum is. In
|
||
+ * particular I see this frequently with _old_ EDID, 1.0 or so, so maybe
|
||
+ * our parser is just being too aggresive there.
|
||
+ */
|
||
+ if (timing->h_active < 64 || timing->v_active < 64) {
|
||
+ xf86DrvMsg(scrnIndex, X_INFO,
|
||
+ "%s: Ignoring tiny %dx%d mode\n", __func__,
|
||
+ timing->h_active, timing->v_active);
|
||
+ return NULL;
|
||
+ }
|
||
+
|
||
/* We don't do stereo */
|
||
if (timing->stereo) {
|
||
xf86DrvMsg(scrnIndex, X_INFO,
|
||
@@ -251,25 +246,64 @@ DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
|
||
if (timing->interlaced)
|
||
Mode->Flags |= V_INTERLACE;
|
||
|
||
- if (quirks & DDC_QUIRK_DT_SYNC_HM_VP)
|
||
- Mode->Flags |= V_NHSYNC | V_PVSYNC;
|
||
+ if (timing->misc & 0x02)
|
||
+ Mode->Flags |= V_PVSYNC;
|
||
else
|
||
- {
|
||
- if (timing->misc & 0x02)
|
||
- Mode->Flags |= V_PHSYNC;
|
||
- else
|
||
- Mode->Flags |= V_NHSYNC;
|
||
-
|
||
- if (timing->misc & 0x01)
|
||
- Mode->Flags |= V_PVSYNC;
|
||
- else
|
||
- Mode->Flags |= V_NVSYNC;
|
||
- }
|
||
+ Mode->Flags |= V_NVSYNC;
|
||
+
|
||
+ if (timing->misc & 0x01)
|
||
+ Mode->Flags |= V_PHSYNC;
|
||
+ else
|
||
+ Mode->Flags |= V_NHSYNC;
|
||
|
||
return Mode;
|
||
}
|
||
|
||
-DisplayModePtr
|
||
+/*
|
||
+ *
|
||
+ */
|
||
+static void
|
||
+DDCGuessRangesFromModes(int scrnIndex, MonPtr Monitor, DisplayModePtr Modes)
|
||
+{
|
||
+ DisplayModePtr Mode = Modes;
|
||
+
|
||
+ if (!Monitor || !Modes)
|
||
+ return;
|
||
+
|
||
+ /* set up the ranges for scanning through the modes */
|
||
+ Monitor->nHsync = 1;
|
||
+ Monitor->hsync[0].lo = 1024.0;
|
||
+ Monitor->hsync[0].hi = 0.0;
|
||
+
|
||
+ Monitor->nVrefresh = 1;
|
||
+ Monitor->vrefresh[0].lo = 1024.0;
|
||
+ Monitor->vrefresh[0].hi = 0.0;
|
||
+
|
||
+ while (Mode) {
|
||
+ if (!Mode->HSync)
|
||
+ Mode->HSync = ((float) Mode->Clock ) / ((float) Mode->HTotal);
|
||
+
|
||
+ if (!Mode->VRefresh)
|
||
+ Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) /
|
||
+ ((float) (Mode->HTotal * Mode->VTotal));
|
||
+
|
||
+ if (Mode->HSync < Monitor->hsync[0].lo)
|
||
+ Monitor->hsync[0].lo = Mode->HSync;
|
||
+
|
||
+ if (Mode->HSync > Monitor->hsync[0].hi)
|
||
+ Monitor->hsync[0].hi = Mode->HSync;
|
||
+
|
||
+ if (Mode->VRefresh < Monitor->vrefresh[0].lo)
|
||
+ Monitor->vrefresh[0].lo = Mode->VRefresh;
|
||
+
|
||
+ if (Mode->VRefresh > Monitor->vrefresh[0].hi)
|
||
+ Monitor->vrefresh[0].hi = Mode->VRefresh;
|
||
+
|
||
+ Mode = Mode->next;
|
||
+ }
|
||
+}
|
||
+
|
||
+_X_EXPORT DisplayModePtr
|
||
xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
|
||
{
|
||
int preferred, i;
|
||
@@ -351,3 +385,107 @@ xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
|
||
}
|
||
return Modes;
|
||
}
|
||
+
|
||
+/*
|
||
+ * Fill out MonPtr with xf86MonPtr information.
|
||
+ */
|
||
+_X_EXPORT void
|
||
+xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC)
|
||
+{
|
||
+ DisplayModePtr Modes = NULL, Mode;
|
||
+ int i, clock;
|
||
+ Bool have_hsync = FALSE, have_vrefresh = FALSE, have_maxpixclock = FALSE;
|
||
+
|
||
+ if (!Monitor || !DDC)
|
||
+ return;
|
||
+
|
||
+ Monitor->DDC = DDC;
|
||
+
|
||
+ Monitor->widthmm = 10 * DDC->features.hsize;
|
||
+ Monitor->heightmm = 10 * DDC->features.vsize;
|
||
+
|
||
+ /* If this is a digital display, then we can use reduced blanking */
|
||
+ if (DDC->features.input_type)
|
||
+ Monitor->reducedblanking = TRUE;
|
||
+ /* Allow the user to also enable this through config */
|
||
+
|
||
+ Modes = xf86DDCGetModes(scrnIndex, DDC);
|
||
+
|
||
+ /* Skip EDID ranges if they were specified in the config file */
|
||
+ have_hsync = (Monitor->nHsync != 0);
|
||
+ have_vrefresh = (Monitor->nVrefresh != 0);
|
||
+ have_maxpixclock = (Monitor->maxPixClock != 0);
|
||
+
|
||
+ /* Go through the detailed monitor sections */
|
||
+ for (i = 0; i < DET_TIMINGS; i++) {
|
||
+ switch (DDC->det_mon[i].type) {
|
||
+ case DS_RANGES:
|
||
+ if (!have_hsync) {
|
||
+ if (!Monitor->nHsync)
|
||
+ xf86DrvMsg(scrnIndex, X_INFO,
|
||
+ "Using EDID range info for horizontal sync\n");
|
||
+ Monitor->hsync[Monitor->nHsync].lo =
|
||
+ DDC->det_mon[i].section.ranges.min_h;
|
||
+ Monitor->hsync[Monitor->nHsync].hi =
|
||
+ DDC->det_mon[i].section.ranges.max_h;
|
||
+ Monitor->nHsync++;
|
||
+ } else {
|
||
+ xf86DrvMsg(scrnIndex, X_INFO,
|
||
+ "Using hsync ranges from config file\n");
|
||
+ }
|
||
+
|
||
+ if (!have_vrefresh) {
|
||
+ if (!Monitor->nVrefresh)
|
||
+ xf86DrvMsg(scrnIndex, X_INFO,
|
||
+ "Using EDID range info for vertical refresh\n");
|
||
+ Monitor->vrefresh[Monitor->nVrefresh].lo =
|
||
+ DDC->det_mon[i].section.ranges.min_v;
|
||
+ Monitor->vrefresh[Monitor->nVrefresh].hi =
|
||
+ DDC->det_mon[i].section.ranges.max_v;
|
||
+ Monitor->nVrefresh++;
|
||
+ } else {
|
||
+ xf86DrvMsg(scrnIndex, X_INFO,
|
||
+ "Using vrefresh ranges from config file\n");
|
||
+ }
|
||
+
|
||
+ clock = DDC->det_mon[i].section.ranges.max_clock * 1000;
|
||
+ if (!have_maxpixclock && clock > Monitor->maxPixClock)
|
||
+ Monitor->maxPixClock = clock;
|
||
+
|
||
+ break;
|
||
+ default:
|
||
+ break;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ if (Modes) {
|
||
+ /* Print Modes */
|
||
+ xf86DrvMsg(scrnIndex, X_INFO, "Printing DDC gathered Modelines:\n");
|
||
+
|
||
+ Mode = Modes;
|
||
+ while (Mode) {
|
||
+ xf86PrintModeline(scrnIndex, Mode);
|
||
+ Mode = Mode->next;
|
||
+ }
|
||
+
|
||
+ /* Do we still need ranges to be filled in? */
|
||
+ if (!Monitor->nHsync || !Monitor->nVrefresh)
|
||
+ DDCGuessRangesFromModes(scrnIndex, Monitor, Modes);
|
||
+
|
||
+ /* look for last Mode */
|
||
+ Mode = Modes;
|
||
+
|
||
+ while (Mode->next)
|
||
+ Mode = Mode->next;
|
||
+
|
||
+ /* add to MonPtr */
|
||
+ if (Monitor->Modes) {
|
||
+ Monitor->Last->next = Modes;
|
||
+ Modes->prev = Monitor->Last;
|
||
+ Monitor->Last = Mode;
|
||
+ } else {
|
||
+ Monitor->Modes = Modes;
|
||
+ Monitor->Last = Mode;
|
||
+ }
|
||
+ }
|
||
+}
|
||
diff --git a/hw/xfree86/modes/xf86Modes.c b/hw/xfree86/modes/xf86Modes.c
|
||
index 5b52bd7..f49c292 100644
|
||
--- a/hw/xfree86/modes/xf86Modes.c
|
||
+++ b/hw/xfree86/modes/xf86Modes.c
|
||
@@ -1,6 +1,3 @@
|
||
-/* -*- c-basic-offset: 4 -*- */
|
||
-/* $XdotOrg: xserver/xorg/hw/xfree86/common/xf86Mode.c,v 1.10 2006/03/07 16:00:57 libv Exp $ */
|
||
-/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Mode.c,v 1.69 2003/10/08 14:58:28 dawes Exp $ */
|
||
/*
|
||
* Copyright (c) 1997-2003 by The XFree86 Project, Inc.
|
||
*
|
||
@@ -52,7 +49,7 @@ extern XF86ConfigPtr xf86configptr;
|
||
*
|
||
* Exact copy of xf86Mode.c's.
|
||
*/
|
||
-double
|
||
+_X_EXPORT double
|
||
xf86ModeHSync(DisplayModePtr mode)
|
||
{
|
||
double hsync = 0.0;
|
||
@@ -70,7 +67,7 @@ xf86ModeHSync(DisplayModePtr mode)
|
||
*
|
||
* Exact copy of xf86Mode.c's.
|
||
*/
|
||
-double
|
||
+_X_EXPORT double
|
||
xf86ModeVRefresh(DisplayModePtr mode)
|
||
{
|
||
double refresh = 0.0;
|
||
@@ -89,7 +86,7 @@ xf86ModeVRefresh(DisplayModePtr mode)
|
||
return refresh;
|
||
}
|
||
|
||
-int
|
||
+_X_EXPORT int
|
||
xf86ModeWidth (DisplayModePtr mode, Rotation rotation)
|
||
{
|
||
switch (rotation & 0xf) {
|
||
@@ -104,7 +101,7 @@ xf86ModeWidth (DisplayModePtr mode, Rotation rotation)
|
||
}
|
||
}
|
||
|
||
-int
|
||
+_X_EXPORT int
|
||
xf86ModeHeight (DisplayModePtr mode, Rotation rotation)
|
||
{
|
||
switch (rotation & 0xf) {
|
||
@@ -120,7 +117,7 @@ xf86ModeHeight (DisplayModePtr mode, Rotation rotation)
|
||
}
|
||
|
||
/** Sets a default mode name of <width>x<height> on a mode. */
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86SetModeDefaultName(DisplayModePtr mode)
|
||
{
|
||
if (mode->name != NULL)
|
||
@@ -137,7 +134,7 @@ xf86SetModeDefaultName(DisplayModePtr mode)
|
||
*
|
||
* Exact copy of xf86Mode.c's.
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86SetModeCrtc(DisplayModePtr p, int adjustFlags)
|
||
{
|
||
if ((p == NULL) || ((p->type & M_T_CRTC_C) == M_T_BUILTIN))
|
||
@@ -188,7 +185,7 @@ xf86SetModeCrtc(DisplayModePtr p, int adjustFlags)
|
||
/**
|
||
* Allocates and returns a copy of pMode, including pointers within pMode.
|
||
*/
|
||
-DisplayModePtr
|
||
+_X_EXPORT DisplayModePtr
|
||
xf86DuplicateMode(DisplayModePtr pMode)
|
||
{
|
||
DisplayModePtr pNew;
|
||
@@ -212,7 +209,7 @@ xf86DuplicateMode(DisplayModePtr pMode)
|
||
*
|
||
* \param modeList doubly-linked mode list
|
||
*/
|
||
-DisplayModePtr
|
||
+_X_EXPORT DisplayModePtr
|
||
xf86DuplicateModes(ScrnInfoPtr pScrn, DisplayModePtr modeList)
|
||
{
|
||
DisplayModePtr first = NULL, last = NULL;
|
||
@@ -246,7 +243,7 @@ xf86DuplicateModes(ScrnInfoPtr pScrn, DisplayModePtr modeList)
|
||
*
|
||
* This isn't in xf86Modes.c, but it might deserve to be there.
|
||
*/
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86ModesEqual(DisplayModePtr pMode1, DisplayModePtr pMode2)
|
||
{
|
||
if (pMode1->Clock == pMode2->Clock &&
|
||
@@ -282,7 +279,7 @@ add(char **p, char *new)
|
||
*
|
||
* Convenient VRefresh printing was added, though, compared to xf86Mode.c
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86PrintModeline(int scrnIndex,DisplayModePtr mode)
|
||
{
|
||
char tmp[256];
|
||
@@ -330,7 +327,7 @@ xf86PrintModeline(int scrnIndex,DisplayModePtr mode)
|
||
*
|
||
* This is not in xf86Modes.c, but would be part of the proposed new API.
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||
int flags)
|
||
{
|
||
@@ -351,7 +348,7 @@ xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||
*
|
||
* This is not in xf86Modes.c, but would be part of the proposed new API.
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86ValidateModesSize(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||
int maxX, int maxY, int maxPitch)
|
||
{
|
||
@@ -380,7 +377,7 @@ xf86ValidateModesSize(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||
*
|
||
* This is not in xf86Modes.c, but would be part of the proposed new API.
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86ValidateModesSync(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||
MonPtr mon)
|
||
{
|
||
@@ -427,7 +424,7 @@ xf86ValidateModesSync(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||
*
|
||
* This is not in xf86Modes.c, but would be part of the proposed new API.
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86ValidateModesClocks(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||
int *min, int *max, int n_ranges)
|
||
{
|
||
@@ -461,7 +458,7 @@ xf86ValidateModesClocks(ScrnInfoPtr pScrn, DisplayModePtr modeList,
|
||
*
|
||
* This is not in xf86Modes.c, but would be part of the proposed new API.
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86ValidateModesUserConfig(ScrnInfoPtr pScrn, DisplayModePtr modeList)
|
||
{
|
||
DisplayModePtr mode;
|
||
@@ -495,7 +492,7 @@ xf86ValidateModesUserConfig(ScrnInfoPtr pScrn, DisplayModePtr modeList)
|
||
*
|
||
* This is not in xf86Modes.c, but would be part of the proposed new API.
|
||
*/
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86PruneInvalidModes(ScrnInfoPtr pScrn, DisplayModePtr *modeList,
|
||
Bool verbose)
|
||
{
|
||
@@ -529,7 +526,7 @@ xf86PruneInvalidModes(ScrnInfoPtr pScrn, DisplayModePtr *modeList,
|
||
*
|
||
* \param modes doubly-linked mode list.
|
||
*/
|
||
-DisplayModePtr
|
||
+_X_EXPORT DisplayModePtr
|
||
xf86ModesAdd(DisplayModePtr modes, DisplayModePtr new)
|
||
{
|
||
if (modes == NULL)
|
||
@@ -595,7 +592,7 @@ xf86GetConfigModes (XF86ConfModeLinePtr conf_mode)
|
||
/**
|
||
* Build a mode list from a monitor configuration
|
||
*/
|
||
-DisplayModePtr
|
||
+_X_EXPORT DisplayModePtr
|
||
xf86GetMonitorModes (ScrnInfoPtr pScrn, XF86ConfMonitorPtr conf_monitor)
|
||
{
|
||
DisplayModePtr modes = NULL;
|
||
@@ -627,7 +624,7 @@ xf86GetMonitorModes (ScrnInfoPtr pScrn, XF86ConfMonitorPtr conf_monitor)
|
||
/**
|
||
* Build a mode list containing all of the default modes
|
||
*/
|
||
-DisplayModePtr
|
||
+_X_EXPORT DisplayModePtr
|
||
xf86GetDefaultModes (Bool interlaceAllowed, Bool doubleScanAllowed)
|
||
{
|
||
DisplayModePtr head = NULL, prev = NULL, mode;
|
||
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
|
||
index 90de585..38435c9 100644
|
||
--- a/hw/xfree86/modes/xf86RandR12.c
|
||
+++ b/hw/xfree86/modes/xf86RandR12.c
|
||
@@ -1,7 +1,4 @@
|
||
-/* $XdotOrg: xc/programs/Xserver/hw/xfree86/common/xf86RandR.c,v 1.3 2004/07/30 21:53:09 eich Exp $ */
|
||
/*
|
||
- * $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86RandR.c,v 1.7tsi Exp $
|
||
- *
|
||
* Copyright <20> 2002 Keith Packard, member of The XFree86 Project, Inc.
|
||
*
|
||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||
@@ -96,9 +93,12 @@ xf86RandR12GetInfo (ScreenPtr pScreen, Rotation *rotations)
|
||
}
|
||
|
||
/* Re-probe the outputs for new monitors or modes */
|
||
- xf86ProbeOutputModes (scrp, 0, 0);
|
||
- xf86SetScrnInfoModes (scrp);
|
||
- xf86DiDGAReInit (pScreen);
|
||
+ if (scrp->vtSema)
|
||
+ {
|
||
+ xf86ProbeOutputModes (scrp, 0, 0);
|
||
+ xf86SetScrnInfoModes (scrp);
|
||
+ xf86DiDGAReInit (pScreen);
|
||
+ }
|
||
|
||
for (mode = scrp->modes; ; mode = mode->next)
|
||
{
|
||
@@ -244,7 +244,7 @@ xf86RandR12SetMode (ScreenPtr pScreen,
|
||
return ret;
|
||
}
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86RandR12SetConfig (ScreenPtr pScreen,
|
||
Rotation rotation,
|
||
int rate,
|
||
@@ -337,6 +337,7 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
|
||
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
|
||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||
WindowPtr pRoot = WindowTable[pScreen->myNum];
|
||
+ PixmapPtr pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
|
||
Bool ret = FALSE;
|
||
|
||
if (randrp->virtualX == -1 || randrp->virtualY == -1)
|
||
@@ -344,7 +345,7 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
|
||
randrp->virtualX = pScrn->virtualX;
|
||
randrp->virtualY = pScrn->virtualY;
|
||
}
|
||
- if (pRoot)
|
||
+ if (pRoot && pScrn->vtSema)
|
||
(*pScrn->EnableDisableFBAccess) (pScreen->myNum, FALSE);
|
||
|
||
/* Let the driver update virtualX and virtualY */
|
||
@@ -353,8 +354,8 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
|
||
|
||
ret = TRUE;
|
||
|
||
- pScreen->width = width;
|
||
- pScreen->height = height;
|
||
+ pScreen->width = pScrnPix->drawable.width = width;
|
||
+ pScreen->height = pScrnPix->drawable.height = height;
|
||
pScreen->mmWidth = mmWidth;
|
||
pScreen->mmHeight = mmHeight;
|
||
|
||
@@ -362,7 +363,7 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
|
||
xf86SetViewport (pScreen, 0, 0);
|
||
|
||
finish:
|
||
- if (pRoot)
|
||
+ if (pRoot && pScrn->vtSema)
|
||
(*pScrn->EnableDisableFBAccess) (pScreen->myNum, TRUE);
|
||
#if RANDR_12_INTERFACE
|
||
if (WindowTable[pScreen->myNum] && ret)
|
||
@@ -371,7 +372,7 @@ finish:
|
||
return ret;
|
||
}
|
||
|
||
-Rotation
|
||
+_X_EXPORT Rotation
|
||
xf86RandR12GetRotation(ScreenPtr pScreen)
|
||
{
|
||
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
||
@@ -379,7 +380,7 @@ xf86RandR12GetRotation(ScreenPtr pScreen)
|
||
return randrp->rotation;
|
||
}
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86RandR12CreateScreenResources (ScreenPtr pScreen)
|
||
{
|
||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||
@@ -469,7 +470,7 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen)
|
||
}
|
||
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86RandR12Init (ScreenPtr pScreen)
|
||
{
|
||
rrScrPrivPtr rp;
|
||
@@ -519,7 +520,7 @@ xf86RandR12Init (ScreenPtr pScreen)
|
||
return TRUE;
|
||
}
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86RandR12SetRotations (ScreenPtr pScreen, Rotation rotations)
|
||
{
|
||
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
|
||
@@ -537,7 +538,7 @@ xf86RandR12SetRotations (ScreenPtr pScreen, Rotation rotations)
|
||
randrp->supported_rotations = rotations;
|
||
}
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr pScrn, int *x, int *y)
|
||
{
|
||
ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
|
||
@@ -715,7 +716,7 @@ xf86RandR12CrtcSet (ScreenPtr pScreen,
|
||
xf86CrtcPtr *save_crtcs;
|
||
Bool save_enabled = crtc->enabled;
|
||
|
||
- save_crtcs = ALLOCATE_LOCAL(config->num_crtc * sizeof (xf86CrtcPtr));
|
||
+ save_crtcs = ALLOCATE_LOCAL(config->num_output * sizeof (xf86CrtcPtr));
|
||
if ((randr_mode != NULL) != crtc->enabled)
|
||
changed = TRUE;
|
||
else if (randr_mode && !xf86RandRModeMatches (randr_mode, &crtc->mode))
|
||
@@ -749,6 +750,10 @@ xf86RandR12CrtcSet (ScreenPtr pScreen,
|
||
output->crtc = new_crtc;
|
||
}
|
||
}
|
||
+ for (ro = 0; ro < num_randr_outputs; ro++)
|
||
+ if (randr_outputs[ro]->pendingProperties)
|
||
+ changed = TRUE;
|
||
+
|
||
/* XXX need device-independent mode setting code through an API */
|
||
if (changed)
|
||
{
|
||
@@ -793,6 +798,9 @@ xf86RandR12CrtcSetGamma (ScreenPtr pScreen,
|
||
if (crtc->funcs->gamma_set == NULL)
|
||
return FALSE;
|
||
|
||
+ if (!crtc->scrn->vtSema)
|
||
+ return TRUE;
|
||
+
|
||
crtc->funcs->gamma_set(crtc, randr_crtc->gammaRed, randr_crtc->gammaGreen,
|
||
randr_crtc->gammaBlue, randr_crtc->gammaSize);
|
||
|
||
@@ -813,6 +821,11 @@ xf86RandR12OutputSetProperty (ScreenPtr pScreen,
|
||
if (output->funcs->set_property == NULL)
|
||
return TRUE;
|
||
|
||
+ /*
|
||
+ * This function gets called even when vtSema is FALSE, as
|
||
+ * drivers will need to remember the correct value to apply
|
||
+ * when the VT switch occurs
|
||
+ */
|
||
return output->funcs->set_property(output, property, value);
|
||
}
|
||
|
||
@@ -826,6 +839,11 @@ xf86RandR12OutputValidateMode (ScreenPtr pScreen,
|
||
DisplayModeRec mode;
|
||
|
||
xf86RandRModeConvert (pScrn, randr_mode, &mode);
|
||
+ /*
|
||
+ * This function may be called when vtSema is FALSE, so
|
||
+ * the underlying function must either avoid touching the hardware
|
||
+ * or return FALSE when vtSema is FALSE
|
||
+ */
|
||
if (output->funcs->mode_valid (output, &mode) != MODE_OK)
|
||
return FALSE;
|
||
return TRUE;
|
||
@@ -933,7 +951,6 @@ xf86RandR12SetInfo12 (ScreenPtr pScreen)
|
||
return FALSE;
|
||
}
|
||
|
||
- RROutputSetCrtc (output->randr_output, randr_crtc);
|
||
RROutputSetPhysicalSize(output->randr_output,
|
||
output->mm_width,
|
||
output->mm_height);
|
||
@@ -987,6 +1004,8 @@ xf86RandR12GetInfo12 (ScreenPtr pScreen, Rotation *rotations)
|
||
{
|
||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||
|
||
+ if (!pScrn->vtSema)
|
||
+ return TRUE;
|
||
xf86ProbeOutputModes (pScrn, 0, 0);
|
||
xf86SetScrnInfoModes (pScrn);
|
||
xf86DiDGAReInit (pScreen);
|
||
@@ -1053,7 +1072,7 @@ xf86RandR12CreateScreenResources12 (ScreenPtr pScreen)
|
||
* to DGA, VidMode or hot key. Tell RandR
|
||
*/
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86RandR12TellChanged (ScreenPtr pScreen)
|
||
{
|
||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||
@@ -1103,7 +1122,7 @@ xf86RandR12Init12 (ScreenPtr pScreen)
|
||
|
||
#endif
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86RandR12PreInit (ScrnInfoPtr pScrn)
|
||
{
|
||
return TRUE;
|
||
diff --git a/hw/xfree86/modes/xf86RandR12.h b/hw/xfree86/modes/xf86RandR12.h
|
||
index 0d3346a..4fd855c 100644
|
||
--- a/hw/xfree86/modes/xf86RandR12.h
|
||
+++ b/hw/xfree86/modes/xf86RandR12.h
|
||
@@ -24,6 +24,9 @@
|
||
#define _XF86_RANDR_H_
|
||
#include <randrstr.h>
|
||
#include <X11/extensions/render.h>
|
||
+#if XF86_MODES_RENAME
|
||
+#include "xf86Rename.h"
|
||
+#endif
|
||
|
||
Bool xf86RandR12CreateScreenResources (ScreenPtr pScreen);
|
||
Bool xf86RandR12Init(ScreenPtr pScreen);
|
||
diff --git a/hw/xfree86/modes/xf86Rename.h b/hw/xfree86/modes/xf86Rename.h
|
||
index 9dcfef5..b8c1d70 100644
|
||
--- a/hw/xfree86/modes/xf86Rename.h
|
||
+++ b/hw/xfree86/modes/xf86Rename.h
|
||
@@ -25,6 +25,12 @@
|
||
|
||
#include "local_xf86Rename.h"
|
||
|
||
+#define xf86_cursors_fini XF86NAME(xf86_cursors_fini)
|
||
+#define xf86_cursors_init XF86NAME(xf86_cursors_init)
|
||
+#define xf86_hide_cursors XF86NAME(xf86_hide_cursors)
|
||
+#define xf86_reload_cursors XF86NAME(xf86_reload_cursors)
|
||
+#define xf86_show_cursors XF86NAME(xf86_show_cursors)
|
||
+#define xf86ConnectorGetName XF86NAME(xf86ConnectorGetName)
|
||
#define xf86CrtcConfigInit XF86NAME(xf86CrtcConfigInit)
|
||
#define xf86CrtcConfigPrivateIndex XF86NAME(xf86CrtcConfigPrivateIndex)
|
||
#define xf86CrtcCreate XF86NAME(xf86CrtcCreate)
|
||
@@ -35,6 +41,7 @@
|
||
#define xf86CrtcSetMode XF86NAME(xf86CrtcSetMode)
|
||
#define xf86CrtcSetSizeRange XF86NAME(xf86CrtcSetSizeRange)
|
||
#define xf86CVTMode XF86NAME(xf86CVTMode)
|
||
+#define xf86DDCMonitorSet XF86NAME(xf86DDCMonitorSet)
|
||
#define xf86DisableUnusedFunctions XF86NAME(xf86DisableUnusedFunctions)
|
||
#define xf86DPMSSet XF86NAME(xf86DPMSSet)
|
||
#define xf86DuplicateMode XF86NAME(xf86DuplicateMode)
|
||
@@ -52,9 +59,11 @@
|
||
#define xf86OutputGetEDIDModes XF86NAME(xf86OutputGetEDIDModes)
|
||
#define xf86OutputRename XF86NAME(xf86OutputRename)
|
||
#define xf86OutputSetEDID XF86NAME(xf86OutputSetEDID)
|
||
+#define xf86OutputUseScreenMonitor XF86NAME(xf86OutputUseScreenMonitor)
|
||
#define xf86PrintModeline XF86NAME(xf86PrintModeline)
|
||
#define xf86ProbeOutputModes XF86NAME(xf86ProbeOutputModes)
|
||
#define xf86PruneInvalidModes XF86NAME(xf86PruneInvalidModes)
|
||
+#define xf86RotateCloseScreen XF86NAME(xf86RotateCloseScreen)
|
||
#define xf86SetModeCrtc XF86NAME(xf86SetModeCrtc)
|
||
#define xf86SetModeDefaultName XF86NAME(xf86SetModeDefaultName)
|
||
#define xf86SetScrnInfoModes XF86NAME(xf86SetScrnInfoModes)
|
||
diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c
|
||
index 359501e..380478f 100644
|
||
--- a/hw/xfree86/modes/xf86Rotate.c
|
||
+++ b/hw/xfree86/modes/xf86Rotate.c
|
||
@@ -68,57 +68,204 @@ compWindowFormat (WindowPtr pWin)
|
||
compGetWindowVisual (pWin));
|
||
}
|
||
|
||
+#define F(x) IntToxFixed(x)
|
||
+
|
||
static void
|
||
-xf86TranslateBox (BoxPtr b, int dx, int dy)
|
||
+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)
|
||
{
|
||
- b->x1 += dx;
|
||
- b->y1 += dy;
|
||
- b->x2 += dx;
|
||
- b->y2 += dy;
|
||
+ 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
|
||
-xf86TransformBox (BoxPtr dst, BoxPtr src, Rotation rotation,
|
||
- int xoff, int yoff,
|
||
- int dest_width, int dest_height)
|
||
+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)
|
||
{
|
||
- BoxRec stmp = *src;
|
||
+ PictTransform t;
|
||
|
||
- xf86TranslateBox (&stmp, -xoff, -yoff);
|
||
- switch (rotation & 0xf) {
|
||
- default:
|
||
- case RR_Rotate_0:
|
||
- *dst = stmp;
|
||
- break;
|
||
- case RR_Rotate_90:
|
||
- dst->x1 = stmp.y1;
|
||
- dst->y1 = dest_height - stmp.x2;
|
||
- dst->x2 = stmp.y2;
|
||
- dst->y2 = dest_height - stmp.x1;
|
||
- break;
|
||
- case RR_Rotate_180:
|
||
- dst->x1 = dest_width - stmp.x2;
|
||
- dst->y1 = dest_height - stmp.y2;
|
||
- dst->x2 = dest_width - stmp.x1;
|
||
- dst->y2 = dest_height - stmp.y1;
|
||
- break;
|
||
- case RR_Rotate_270:
|
||
- dst->x1 = dest_width - stmp.y2;
|
||
- dst->y1 = stmp.x1;
|
||
- dst->y2 = stmp.x2;
|
||
- dst->x2 = dest_width - stmp.y1;
|
||
- break;
|
||
- }
|
||
- if (rotation & RR_Reflect_X) {
|
||
- int x1 = dst->x1;
|
||
- dst->x1 = dest_width - dst->x2;
|
||
- dst->x2 = dest_width - x1;
|
||
+ 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;
|
||
+ }
|
||
}
|
||
- if (rotation & RR_Reflect_Y) {
|
||
- int y1 = dst->y1;
|
||
- dst->y1 = dest_height - dst->y2;
|
||
- dst->y2 = dest_height - y1;
|
||
+}
|
||
+
|
||
+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 (a);
|
||
+ ErrorF ("\n");
|
||
+ return FALSE;
|
||
}
|
||
+ return TRUE;
|
||
}
|
||
|
||
static void
|
||
@@ -131,7 +278,6 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region)
|
||
PictFormatPtr format = compWindowFormat (WindowTable[screen->myNum]);
|
||
int error;
|
||
PicturePtr src, dst;
|
||
- PictTransform transform;
|
||
int n = REGION_NUM_RECTS(region);
|
||
BoxPtr b = REGION_RECTS(region);
|
||
XID include_inferiors = IncludeInferiors;
|
||
@@ -156,45 +302,7 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region)
|
||
if (!dst)
|
||
return;
|
||
|
||
- memset (&transform, '\0', sizeof (transform));
|
||
- transform.matrix[2][2] = IntToxFixed(1);
|
||
- transform.matrix[0][2] = IntToxFixed(crtc->x);
|
||
- transform.matrix[1][2] = IntToxFixed(crtc->y);
|
||
- switch (crtc->rotation & 0xf) {
|
||
- default:
|
||
- case RR_Rotate_0:
|
||
- transform.matrix[0][0] = IntToxFixed(1);
|
||
- transform.matrix[1][1] = IntToxFixed(1);
|
||
- break;
|
||
- case RR_Rotate_90:
|
||
- transform.matrix[0][1] = IntToxFixed(-1);
|
||
- transform.matrix[1][0] = IntToxFixed(1);
|
||
- transform.matrix[0][2] += IntToxFixed(crtc->mode.VDisplay);
|
||
- break;
|
||
- case RR_Rotate_180:
|
||
- transform.matrix[0][0] = IntToxFixed(-1);
|
||
- transform.matrix[1][1] = IntToxFixed(-1);
|
||
- transform.matrix[0][2] += IntToxFixed(crtc->mode.HDisplay);
|
||
- transform.matrix[1][2] += IntToxFixed(crtc->mode.VDisplay);
|
||
- break;
|
||
- case RR_Rotate_270:
|
||
- transform.matrix[0][1] = IntToxFixed(1);
|
||
- transform.matrix[1][0] = IntToxFixed(-1);
|
||
- transform.matrix[1][2] += IntToxFixed(crtc->mode.HDisplay);
|
||
- break;
|
||
- }
|
||
-
|
||
- /* handle reflection */
|
||
- if (crtc->rotation & RR_Reflect_X)
|
||
- {
|
||
- /* XXX figure this out */
|
||
- }
|
||
- if (crtc->rotation & RR_Reflect_Y)
|
||
- {
|
||
- /* XXX figure this out too */
|
||
- }
|
||
-
|
||
- error = SetPictureTransform (src, &transform);
|
||
+ error = SetPictureTransform (src, &crtc->crtc_to_framebuffer);
|
||
if (error)
|
||
return;
|
||
|
||
@@ -202,9 +310,8 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region)
|
||
{
|
||
BoxRec dst_box;
|
||
|
||
- xf86TransformBox (&dst_box, b, crtc->rotation,
|
||
- crtc->x, crtc->y,
|
||
- crtc->mode.HDisplay, crtc->mode.VDisplay);
|
||
+ dst_box = *b;
|
||
+ PictureTransformBounds (&dst_box, &crtc->framebuffer_to_crtc);
|
||
CompositePicture (PictOpSrc,
|
||
src, NULL, dst,
|
||
dst_box.x1, dst_box.y1, 0, 0, dst_box.x1, dst_box.y1,
|
||
@@ -264,7 +371,7 @@ xf86RotatePrepare (ScreenPtr pScreen)
|
||
}
|
||
}
|
||
|
||
-static void
|
||
+static Bool
|
||
xf86RotateRedisplay(ScreenPtr pScreen)
|
||
{
|
||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||
@@ -273,7 +380,7 @@ xf86RotateRedisplay(ScreenPtr pScreen)
|
||
RegionPtr region;
|
||
|
||
if (!damage)
|
||
- return;
|
||
+ return FALSE;
|
||
xf86RotatePrepare (pScreen);
|
||
region = DamageRegion(damage);
|
||
if (REGION_NOTEMPTY(pScreen, region))
|
||
@@ -296,15 +403,10 @@ xf86RotateRedisplay(ScreenPtr pScreen)
|
||
|
||
if (crtc->rotation != RR_Rotate_0 && crtc->enabled)
|
||
{
|
||
- BoxRec box;
|
||
RegionRec crtc_damage;
|
||
|
||
/* compute portion of damage that overlaps crtc */
|
||
- box.x1 = crtc->x;
|
||
- box.x2 = crtc->x + xf86ModeWidth (&crtc->mode, crtc->rotation);
|
||
- box.y1 = crtc->y;
|
||
- box.y2 = crtc->y + xf86ModeHeight (&crtc->mode, crtc->rotation);
|
||
- REGION_INIT(pScreen, &crtc_damage, &box, 1);
|
||
+ REGION_INIT(pScreen, &crtc_damage, &crtc->bounds, 1);
|
||
REGION_INTERSECT (pScreen, &crtc_damage, &crtc_damage, region);
|
||
|
||
/* update damaged region */
|
||
@@ -317,19 +419,25 @@ xf86RotateRedisplay(ScreenPtr pScreen)
|
||
pScreen->SourceValidate = SourceValidate;
|
||
DamageEmpty(damage);
|
||
}
|
||
+ return TRUE;
|
||
}
|
||
|
||
static void
|
||
-xf86RotateBlockHandler(pointer data, OSTimePtr pTimeout, pointer pRead)
|
||
+xf86RotateBlockHandler(int screenNum, pointer blockData,
|
||
+ pointer pTimeout, pointer pReadmask)
|
||
{
|
||
- ScreenPtr pScreen = (ScreenPtr) data;
|
||
-
|
||
- xf86RotateRedisplay(pScreen);
|
||
-}
|
||
+ ScreenPtr pScreen = screenInfo.screens[screenNum];
|
||
+ ScrnInfoPtr pScrn = xf86Screens[screenNum];
|
||
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||
|
||
-static void
|
||
-xf86RotateWakeupHandler(pointer data, int i, pointer LastSelectMask)
|
||
-{
|
||
+ pScreen->BlockHandler = xf86_config->BlockHandler;
|
||
+ (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask);
|
||
+ if (xf86RotateRedisplay(pScreen))
|
||
+ {
|
||
+ /* Re-wrap if rotation is still happening */
|
||
+ xf86_config->BlockHandler = pScreen->BlockHandler;
|
||
+ pScreen->BlockHandler = xf86RotateBlockHandler;
|
||
+ }
|
||
}
|
||
|
||
static void
|
||
@@ -367,14 +475,10 @@ xf86RotateDestroy (xf86CrtcPtr crtc)
|
||
}
|
||
DamageDestroy (xf86_config->rotation_damage);
|
||
xf86_config->rotation_damage = NULL;
|
||
- /* Free block/wakeup handler */
|
||
- RemoveBlockAndWakeupHandlers (xf86RotateBlockHandler,
|
||
- xf86RotateWakeupHandler,
|
||
- (pointer) pScreen);
|
||
}
|
||
}
|
||
|
||
-void
|
||
+_X_EXPORT void
|
||
xf86RotateCloseScreen (ScreenPtr screen)
|
||
{
|
||
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
|
||
@@ -385,19 +489,99 @@ xf86RotateCloseScreen (ScreenPtr screen)
|
||
xf86RotateDestroy (xf86_config->crtc[c]);
|
||
}
|
||
|
||
-Bool
|
||
+_X_EXPORT Bool
|
||
xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
|
||
{
|
||
ScrnInfoPtr pScrn = crtc->scrn;
|
||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||
ScreenPtr pScreen = pScrn->pScreen;
|
||
+ PictTransform crtc_to_fb, fb_to_crtc;
|
||
+
|
||
+ PictureTransformIdentity (&crtc_to_fb);
|
||
+ PictureTransformIdentity (&fb_to_crtc);
|
||
+ PictureTransformIsInverse ("identity", &crtc_to_fb, &fb_to_crtc);
|
||
+ 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 = crtc->mode.HDisplay;
|
||
+ int mode_h = crtc->mode.VDisplay;
|
||
+
|
||
+ /* 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 (&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);
|
||
+ 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 (&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);
|
||
+
|
||
+ }
|
||
|
||
- if (rotation == RR_Rotate_0)
|
||
+ /*
|
||
+ * If the untranslated transformation is the identity,
|
||
+ * disable the shadow buffer
|
||
+ */
|
||
+ if (PictureTransformIsIdentity (&crtc_to_fb))
|
||
{
|
||
+ crtc->transform_in_use = FALSE;
|
||
+ PictureTransformInitTranslate (&crtc->crtc_to_framebuffer,
|
||
+ F (-crtc->x), F (-crtc->y));
|
||
+ PictureTransformInitTranslate (&crtc->framebuffer_to_crtc,
|
||
+ F ( crtc->x), F ( crtc->y));
|
||
xf86RotateDestroy (crtc);
|
||
}
|
||
else
|
||
{
|
||
+ PictureTransformTranslate (&crtc_to_fb, &fb_to_crtc, crtc->x, crtc->y);
|
||
+ PictureTransformIsInverse ("offset", &crtc_to_fb, &fb_to_crtc);
|
||
+
|
||
/*
|
||
* these are the size of the shadow pixmap, which
|
||
* matches the mode, not the pre-rotated copy in the
|
||
@@ -440,28 +624,20 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
|
||
if (!xf86_config->rotation_damage)
|
||
goto bail2;
|
||
|
||
- /* Assign block/wakeup handler */
|
||
- if (!RegisterBlockAndWakeupHandlers (xf86RotateBlockHandler,
|
||
- xf86RotateWakeupHandler,
|
||
- (pointer) pScreen))
|
||
- {
|
||
- goto bail3;
|
||
- }
|
||
+ /* Wrap block handler */
|
||
+ xf86_config->BlockHandler = pScreen->BlockHandler;
|
||
+ pScreen->BlockHandler = xf86RotateBlockHandler;
|
||
}
|
||
if (0)
|
||
{
|
||
-bail3:
|
||
- DamageDestroy (xf86_config->rotation_damage);
|
||
- xf86_config->rotation_damage = NULL;
|
||
-
|
||
-bail2:
|
||
+ bail2:
|
||
if (shadow || shadowData)
|
||
{
|
||
crtc->funcs->shadow_destroy (crtc, shadow, shadowData);
|
||
crtc->rotatedPixmap = NULL;
|
||
crtc->rotatedData = NULL;
|
||
}
|
||
-bail1:
|
||
+ bail1:
|
||
if (old_width && old_height)
|
||
crtc->rotatedPixmap = crtc->funcs->shadow_create (crtc,
|
||
NULL,
|
||
@@ -469,6 +645,14 @@ bail1:
|
||
old_height);
|
||
return FALSE;
|
||
}
|
||
+ crtc->transform_in_use = TRUE;
|
||
+ crtc->crtc_to_framebuffer = crtc_to_fb;
|
||
+ crtc->framebuffer_to_crtc = fb_to_crtc;
|
||
+ crtc->bounds.x1 = 0;
|
||
+ crtc->bounds.x2 = crtc->mode.HDisplay;
|
||
+ crtc->bounds.y1 = 0;
|
||
+ crtc->bounds.y2 = crtc->mode.VDisplay;
|
||
+ PictureTransformBounds (&crtc->bounds, &crtc_to_fb);
|
||
}
|
||
|
||
/* All done */
|
||
diff --git a/hw/xfree86/ddc/Makefile.am b/hw/xfree86/ddc/Makefile.am
|
||
index 3b36f55..cd146c5 100644
|
||
--- a/hw/xfree86/ddc/Makefile.am
|
||
+++ b/hw/xfree86/ddc/Makefile.am
|
||
@@ -1,12 +1,12 @@
|
||
-sdk_HEADERS = edid.h vdif.h xf86DDC.h
|
||
+sdk_HEADERS = edid.h xf86DDC.h
|
||
|
||
noinst_LIBRARIES = libddc.a
|
||
|
||
libddc_a_SOURCES = xf86DDC.c edid.c interpret_edid.c print_edid.c \
|
||
- interpret_vdif.c print_vdif.c ddcProperty.c
|
||
+ ddcProperty.c
|
||
|
||
INCLUDES = $(XORG_INCS) -I$(srcdir)/../i2c
|
||
|
||
-AM_CFLAGS = $(XORG_CFLAGS)
|
||
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
|
||
|
||
EXTRA_DIST = ddcPriv.h DDC.HOWTO
|
||
diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
|
||
index c68dd08..67351d3 100644
|
||
--- a/hw/xfree86/ddc/ddcProperty.c
|
||
+++ b/hw/xfree86/ddc/ddcProperty.c
|
||
@@ -33,395 +33,8 @@
|
||
#include "xf86DDC.h"
|
||
#include "xf86_ansic.h"
|
||
|
||
-/*
|
||
- * xf86Mode.c should have a some more DisplayModePtr list handling.
|
||
- */
|
||
-static DisplayModePtr
|
||
-xf86ModesAdd(DisplayModePtr Modes, DisplayModePtr Additions)
|
||
-{
|
||
- if (!Modes) {
|
||
- if (Additions)
|
||
- return Additions;
|
||
- else
|
||
- return NULL;
|
||
- }
|
||
-
|
||
- if (Additions) {
|
||
- DisplayModePtr Mode = Modes;
|
||
-
|
||
- while (Mode->next)
|
||
- Mode = Mode->next;
|
||
-
|
||
- Mode->next = Additions;
|
||
- Additions->prev = Mode;
|
||
- }
|
||
-
|
||
- return Modes;
|
||
-}
|
||
-
|
||
-static DisplayModePtr
|
||
-xf86ModeCopy(DisplayModePtr Mode)
|
||
-{
|
||
- DisplayModePtr New;
|
||
-
|
||
- if (!Mode)
|
||
- return NULL;
|
||
-
|
||
- New = xnfalloc(sizeof(DisplayModeRec));
|
||
-
|
||
- memcpy(New, Mode, sizeof(DisplayModeRec));
|
||
-
|
||
- New->name = xnfalloc(strlen(Mode->name) + 1);
|
||
- memcpy(New->name, Mode->name, strlen(Mode->name) + 1);
|
||
-
|
||
- /* We ignore privates as DDC code doesn't use it currently */
|
||
- return New;
|
||
-}
|
||
-
|
||
-/*
|
||
- * Temporary.
|
||
- */
|
||
-static void
|
||
-add(char **p, char *new)
|
||
-{
|
||
- *p = xnfrealloc(*p, strlen(*p) + strlen(new) + 2);
|
||
- strcat(*p, " ");
|
||
- strcat(*p, new);
|
||
-}
|
||
-
|
||
-static void
|
||
-PrintModeline(int scrnIndex,DisplayModePtr mode)
|
||
-{
|
||
- char tmp[256];
|
||
- char *flags = xnfcalloc(1, 1);
|
||
-
|
||
- if (mode->HSkew) {
|
||
- snprintf(tmp, 256, "hskew %i", mode->HSkew);
|
||
- add(&flags, tmp);
|
||
- }
|
||
- if (mode->VScan) {
|
||
- snprintf(tmp, 256, "vscan %i", mode->VScan);
|
||
- add(&flags, tmp);
|
||
- }
|
||
- if (mode->Flags & V_INTERLACE) add(&flags, "interlace");
|
||
- if (mode->Flags & V_CSYNC) add(&flags, "composite");
|
||
- if (mode->Flags & V_DBLSCAN) add(&flags, "doublescan");
|
||
- if (mode->Flags & V_BCAST) add(&flags, "bcast");
|
||
- if (mode->Flags & V_PHSYNC) add(&flags, "+hsync");
|
||
- if (mode->Flags & V_NHSYNC) add(&flags, "-hsync");
|
||
- if (mode->Flags & V_PVSYNC) add(&flags, "+vsync");
|
||
- if (mode->Flags & V_NVSYNC) add(&flags, "-vsync");
|
||
- if (mode->Flags & V_PCSYNC) add(&flags, "+csync");
|
||
- if (mode->Flags & V_NCSYNC) add(&flags, "-csync");
|
||
-#if 0
|
||
- if (mode->Flags & V_CLKDIV2) add(&flags, "vclk/2");
|
||
-#endif
|
||
- xf86DrvMsgVerb(scrnIndex, X_INFO, 3,
|
||
- "Modeline \"%s\" %6.2f %i %i %i %i %i %i %i %i%s\n",
|
||
- mode->name, mode->Clock/1000., mode->HDisplay,
|
||
- mode->HSyncStart, mode->HSyncEnd, mode->HTotal,
|
||
- mode->VDisplay, mode->VSyncStart, mode->VSyncEnd,
|
||
- mode->VTotal, flags);
|
||
- xfree(flags);
|
||
-}
|
||
-
|
||
-/*
|
||
- * TODO:
|
||
- * - for those with access to the VESA DMT standard; review please.
|
||
- */
|
||
-#define MODEPREFIX(name) NULL, NULL, name, 0,M_T_DRIVER
|
||
-#define MODESUFFIX 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,FALSE,FALSE,0,NULL,0,0.0,0.0
|
||
-
|
||
-DisplayModeRec DDCEstablishedModes[17] = {
|
||
- { MODEPREFIX("800x600"), 40000, 800, 840, 968, 1056, 0, 600, 601, 605, 628, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@60Hz */
|
||
- { MODEPREFIX("800x600"), 36000, 800, 824, 896, 1024, 0, 600, 601, 603, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@56Hz */
|
||
- { MODEPREFIX("640x480"), 31500, 640, 656, 720, 840, 0, 480, 481, 484, 500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@75Hz */
|
||
- { MODEPREFIX("640x480"), 31500, 640, 664, 704, 832, 0, 480, 489, 491, 520, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@72Hz */
|
||
- { MODEPREFIX("640x480"), 30240, 640, 704, 768, 864, 0, 480, 483, 486, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@67Hz */
|
||
- { MODEPREFIX("640x480"), 25200, 640, 656, 752, 800, 0, 480, 490, 492, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@60Hz */
|
||
- { MODEPREFIX("720x400"), 35500, 720, 738, 846, 900, 0, 400, 421, 423, 449, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 720x400@88Hz */
|
||
- { MODEPREFIX("720x400"), 28320, 720, 738, 846, 900, 0, 400, 412, 414, 449, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 720x400@70Hz */
|
||
- { MODEPREFIX("1280x1024"), 135000, 1280, 1296, 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x1024@75Hz */
|
||
- { MODEPREFIX("1024x768"), 78800, 1024, 1040, 1136, 1312, 0, 768, 769, 772, 800, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1024x768@75Hz */
|
||
- { MODEPREFIX("1024x768"), 75000, 1024, 1048, 1184, 1328, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@70Hz */
|
||
- { MODEPREFIX("1024x768"), 65000, 1024, 1048, 1184, 1344, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@60Hz */
|
||
- { MODEPREFIX("1024x768"), 44900, 1024, 1032, 1208, 1264, 0, 768, 768, 776, 817, 0, V_PHSYNC | V_PVSYNC | V_INTERLACE, MODESUFFIX }, /* 1024x768@43Hz */
|
||
- { MODEPREFIX("832x624"), 57284, 832, 864, 928, 1152, 0, 624, 625, 628, 667, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 832x624@75Hz */
|
||
- { MODEPREFIX("800x600"), 49500, 800, 816, 896, 1056, 0, 600, 601, 604, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@75Hz */
|
||
- { MODEPREFIX("800x600"), 50000, 800, 856, 976, 1040, 0, 600, 637, 643, 666, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@72Hz */
|
||
- { MODEPREFIX("1152x864"), 108000, 1152, 1216, 1344, 1600, 0, 864, 865, 868, 900, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1152x864@75Hz */
|
||
-};
|
||
-
|
||
-static DisplayModePtr
|
||
-DDCModesFromEstablished(int scrnIndex, struct established_timings *timing)
|
||
-{
|
||
- DisplayModePtr Modes = NULL, Mode = NULL;
|
||
- CARD32 bits = (timing->t1) | (timing->t2 << 8) |
|
||
- ((timing->t_manu & 0x80) << 9);
|
||
- int i;
|
||
-
|
||
- for (i = 0; i < 17; i++)
|
||
- if (bits & (0x01 << i)) {
|
||
- Mode = xf86ModeCopy(&(DDCEstablishedModes[i]));
|
||
- Modes = xf86ModesAdd(Modes, Mode);
|
||
- }
|
||
-
|
||
- return Modes;
|
||
-}
|
||
-
|
||
-/*
|
||
- *
|
||
- */
|
||
-static DisplayModePtr
|
||
-DDCModesFromStandardTiming(int scrnIndex, struct std_timings *timing)
|
||
-{
|
||
- DisplayModePtr Modes = NULL, Mode = NULL;
|
||
- int i;
|
||
-
|
||
- for (i = 0; i < STD_TIMINGS; i++)
|
||
- if (timing[i].hsize && timing[i].vsize && timing[i].refresh) {
|
||
- Mode = xf86CVTMode(timing[i].hsize, timing[i].vsize,
|
||
- timing[i].refresh, FALSE, FALSE);
|
||
- Mode->type = M_T_DRIVER;
|
||
- Modes = xf86ModesAdd(Modes, Mode);
|
||
- }
|
||
-
|
||
- return Modes;
|
||
-}
|
||
-
|
||
-/*
|
||
- *
|
||
- */
|
||
-static DisplayModePtr
|
||
-DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
|
||
- int preferred)
|
||
-{
|
||
- DisplayModePtr Mode;
|
||
-
|
||
- /* We don't do stereo */
|
||
- if (timing->stereo) {
|
||
- xf86DrvMsg(scrnIndex, X_INFO, "%s: Ignoring: We don't handle stereo.\n",
|
||
- __func__);
|
||
- return NULL;
|
||
- }
|
||
-
|
||
- /* We only do seperate sync currently */
|
||
- if (timing->sync != 0x03) {
|
||
- xf86DrvMsg(scrnIndex, X_INFO, "%s: %dx%d Warning: We only handle seperate"
|
||
- " sync.\n", __func__, timing->h_active, timing->v_active);
|
||
- }
|
||
-
|
||
- Mode = xnfalloc(sizeof(DisplayModeRec));
|
||
- memset(Mode, 0, sizeof(DisplayModeRec));
|
||
-
|
||
- Mode->name = xnfalloc(10); /* "1234x1234" */
|
||
- xf86snprintf(Mode->name, 20, "%dx%d", timing->h_active,
|
||
- timing->v_active);
|
||
-
|
||
- Mode->type = M_T_DRIVER;
|
||
- if (preferred)
|
||
- Mode->type |= M_T_PREFERRED;
|
||
-
|
||
- Mode->Clock = timing->clock / 1000.0;
|
||
-
|
||
- Mode->HDisplay = timing->h_active;
|
||
- Mode->HSyncStart = timing->h_active + timing->h_sync_off;
|
||
- Mode->HSyncEnd = Mode->HSyncStart + timing->h_sync_width;
|
||
- Mode->HTotal = timing->h_active + timing->h_blanking;
|
||
-
|
||
- Mode->VDisplay = timing->v_active;
|
||
- Mode->VSyncStart = timing->v_active + timing->v_sync_off;
|
||
- Mode->VSyncEnd = Mode->VSyncStart + timing->v_sync_width;
|
||
- Mode->VTotal = timing->v_active + timing->v_blanking;
|
||
-
|
||
- /* We ignore h/v_size and h/v_border for now. */
|
||
-
|
||
- if (timing->interlaced)
|
||
- Mode->Flags |= V_INTERLACE;
|
||
-
|
||
- if (timing->misc & 0x02)
|
||
- Mode->Flags |= V_PHSYNC;
|
||
- else
|
||
- Mode->Flags |= V_NHSYNC;
|
||
-
|
||
- if (timing->misc & 0x01)
|
||
- Mode->Flags |= V_PVSYNC;
|
||
- else
|
||
- Mode->Flags |= V_NVSYNC;
|
||
-
|
||
- return Mode;
|
||
-}
|
||
-
|
||
-/*
|
||
- *
|
||
- */
|
||
-static void
|
||
-DDCGuessRangesFromModes(int scrnIndex, MonPtr Monitor, DisplayModePtr Modes)
|
||
-{
|
||
- DisplayModePtr Mode = Modes;
|
||
-
|
||
- if (!Monitor || !Modes)
|
||
- return;
|
||
-
|
||
- /* set up the ranges for scanning through the modes */
|
||
- Monitor->nHsync = 1;
|
||
- Monitor->hsync[0].lo = 1024.0;
|
||
- Monitor->hsync[0].hi = 0.0;
|
||
-
|
||
- Monitor->nVrefresh = 1;
|
||
- Monitor->vrefresh[0].lo = 1024.0;
|
||
- Monitor->vrefresh[0].hi = 0.0;
|
||
-
|
||
- while (Mode) {
|
||
- if (!Mode->HSync)
|
||
- Mode->HSync = ((float) Mode->Clock ) / ((float) Mode->HTotal);
|
||
-
|
||
- if (!Mode->VRefresh)
|
||
- Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) /
|
||
- ((float) (Mode->HTotal * Mode->VTotal));
|
||
-
|
||
- if (Mode->HSync < Monitor->hsync[0].lo)
|
||
- Monitor->hsync[0].lo = Mode->HSync;
|
||
-
|
||
- if (Mode->HSync > Monitor->hsync[0].hi)
|
||
- Monitor->hsync[0].hi = Mode->HSync;
|
||
-
|
||
- if (Mode->VRefresh < Monitor->vrefresh[0].lo)
|
||
- Monitor->vrefresh[0].lo = Mode->VRefresh;
|
||
-
|
||
- if (Mode->VRefresh > Monitor->vrefresh[0].hi)
|
||
- Monitor->vrefresh[0].hi = Mode->VRefresh;
|
||
-
|
||
- Mode = Mode->next;
|
||
- }
|
||
-}
|
||
-
|
||
-/*
|
||
- * Fill out MonPtr with xf86MonPtr information.
|
||
- */
|
||
-void
|
||
-xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC)
|
||
-{
|
||
- DisplayModePtr Modes = NULL, Mode;
|
||
- int i, clock;
|
||
- Bool have_hsync = FALSE, have_vrefresh = FALSE;
|
||
- int preferred;
|
||
-
|
||
- if (!Monitor || !DDC)
|
||
- return;
|
||
-
|
||
- Monitor->DDC = DDC;
|
||
-
|
||
- preferred = PREFERRED_TIMING_MODE(DDC->features.msc);
|
||
-
|
||
- Monitor->widthmm = 10 * DDC->features.hsize;
|
||
- Monitor->heightmm = 10 * DDC->features.vsize;
|
||
-
|
||
- /* If this is a digital display, then we can use reduced blanking */
|
||
- if (DDC->features.input_type)
|
||
- Monitor->reducedblanking = TRUE;
|
||
- /* Allow the user to also enable this through config */
|
||
-
|
||
- /* Add established timings */
|
||
- Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1);
|
||
- Modes = xf86ModesAdd(Modes, Mode);
|
||
-
|
||
- /* Add standard timings */
|
||
- Mode = DDCModesFromStandardTiming(scrnIndex, DDC->timings2);
|
||
- Modes = xf86ModesAdd(Modes, Mode);
|
||
-
|
||
- /* Skip EDID ranges if they were specified in the config file */
|
||
- have_hsync = (Monitor->nHsync != 0);
|
||
- have_vrefresh = (Monitor->nVrefresh != 0);
|
||
-
|
||
- /* Go through the detailed monitor sections */
|
||
- for (i = 0; i < DET_TIMINGS; i++)
|
||
- switch (DDC->det_mon[i].type) {
|
||
- case DS_RANGES:
|
||
- if (!have_hsync) {
|
||
- if (!Monitor->nHsync)
|
||
- xf86DrvMsg(scrnIndex, X_INFO,
|
||
- "Using EDID range info for horizontal sync\n");
|
||
- Monitor->hsync[Monitor->nHsync].lo =
|
||
- DDC->det_mon[i].section.ranges.min_h;
|
||
- Monitor->hsync[Monitor->nHsync].hi =
|
||
- DDC->det_mon[i].section.ranges.max_h;
|
||
- Monitor->nHsync++;
|
||
- } else {
|
||
- xf86DrvMsg(scrnIndex, X_INFO,
|
||
- "Using hsync ranges from config file\n");
|
||
- }
|
||
-
|
||
- if (!have_vrefresh) {
|
||
- if (!Monitor->nVrefresh)
|
||
- xf86DrvMsg(scrnIndex, X_INFO,
|
||
- "Using EDID range info for vertical refresh\n");
|
||
- Monitor->vrefresh[Monitor->nVrefresh].lo =
|
||
- DDC->det_mon[i].section.ranges.min_v;
|
||
- Monitor->vrefresh[Monitor->nVrefresh].hi =
|
||
- DDC->det_mon[i].section.ranges.max_v;
|
||
- Monitor->nVrefresh++;
|
||
- } else {
|
||
- xf86DrvMsg(scrnIndex, X_INFO,
|
||
- "Using vrefresh ranges from config file\n");
|
||
- }
|
||
-
|
||
- clock = DDC->det_mon[i].section.ranges.max_clock * 1000;
|
||
- if (clock > Monitor->maxPixClock)
|
||
- Monitor->maxPixClock = clock;
|
||
-
|
||
- break;
|
||
- case DT:
|
||
- Mode = DDCModeFromDetailedTiming(scrnIndex,
|
||
- &DDC->det_mon[i].section.d_timings,
|
||
- preferred);
|
||
- preferred = 0;
|
||
- Modes = xf86ModesAdd(Modes, Mode);
|
||
- break;
|
||
- case DS_STD_TIMINGS:
|
||
- Mode = DDCModesFromStandardTiming(scrnIndex,
|
||
- DDC->det_mon[i].section.std_t);
|
||
- Modes = xf86ModesAdd(Modes, Mode);
|
||
- break;
|
||
- default:
|
||
- break;
|
||
- }
|
||
-
|
||
- if (Modes) {
|
||
- /* Print Modes */
|
||
- xf86DrvMsg(scrnIndex, X_INFO, "Printing DDC gathered Modelines:\n");
|
||
-
|
||
- Mode = Modes;
|
||
- while (Mode) {
|
||
- PrintModeline(scrnIndex, Mode);
|
||
- Mode = Mode->next;
|
||
- }
|
||
-
|
||
- /* Do we still need ranges to be filled in? */
|
||
- if (!Monitor->nHsync || !Monitor->nVrefresh)
|
||
- DDCGuessRangesFromModes(scrnIndex, Monitor, Modes);
|
||
-
|
||
- /* look for last Mode */
|
||
- Mode = Modes;
|
||
-
|
||
- while (Mode->next)
|
||
- Mode = Mode->next;
|
||
-
|
||
- /* add to MonPtr */
|
||
- if (Monitor->Modes) {
|
||
- Monitor->Last->next = Modes;
|
||
- Modes->prev = Monitor->Last;
|
||
- Monitor->Last = Mode;
|
||
- } else {
|
||
- Monitor->Modes = Modes;
|
||
- Monitor->Last = Mode;
|
||
- }
|
||
- }
|
||
-}
|
||
-
|
||
#define EDID1_ATOM_NAME "XFree86_DDC_EDID1_RAWDATA"
|
||
#define EDID2_ATOM_NAME "XFree86_DDC_EDID2_RAWDATA"
|
||
-#define VDIF_ATOM_NAME "XFree86_DDC_VDIF_RAWDATA"
|
||
|
||
static void
|
||
addRootWindowProperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
|
||
@@ -474,7 +87,7 @@ addRootWindowProperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
|
||
if ((EDID1rawdata = xalloc(128*sizeof(CARD8)))==NULL)
|
||
return;
|
||
|
||
- EDID1Atom = MakeAtom(EDID1_ATOM_NAME, sizeof(EDID1_ATOM_NAME), TRUE);
|
||
+ EDID1Atom = MakeAtom(EDID1_ATOM_NAME, sizeof(EDID1_ATOM_NAME) - 1, TRUE);
|
||
memcpy(EDID1rawdata, DDC->rawData, 128);
|
||
xf86RegisterRootWindowProperty(scrnIndex, EDID1Atom, XA_INTEGER, 8,
|
||
128, (unsigned char *)EDID1rawdata);
|
||
@@ -485,20 +98,10 @@ addRootWindowProperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
|
||
return;
|
||
|
||
memcpy(EDID2rawdata, DDC->rawData, 256);
|
||
- EDID2Atom = MakeAtom(EDID2_ATOM_NAME, sizeof(EDID2_ATOM_NAME), TRUE);
|
||
+ EDID2Atom = MakeAtom(EDID2_ATOM_NAME, sizeof(EDID2_ATOM_NAME) - 1, TRUE);
|
||
xf86RegisterRootWindowProperty(scrnIndex, EDID2Atom, XA_INTEGER, 8,
|
||
256, (unsigned char *)EDID2rawdata);
|
||
}
|
||
-
|
||
-#if 0
|
||
- if (DDC->vdif) {
|
||
-#define VDIF_DUMMY_STRING "setting dummy VDIF property - please insert correct values\n"
|
||
-
|
||
- VDIFAtom = MakeAtom(VDIF_ATOM_NAME, sizeof(VDIF_ATOM_NAME), TRUE);
|
||
- xf86RegisterRootWindowProperty(scrnIndex, VDIFAtom, XA_STRING, 8,
|
||
- strlen(VDIF_DUMMY_STRING), VDIF_DUMMY_STRING);
|
||
- }
|
||
-#endif
|
||
}
|
||
|
||
Bool
|
||
diff --git a/hw/xfree86/ddc/edid.h b/hw/xfree86/ddc/edid.h
|
||
index 30499a6..4487273 100644
|
||
--- a/hw/xfree86/ddc/edid.h
|
||
+++ b/hw/xfree86/ddc/edid.h
|
||
@@ -12,8 +12,6 @@
|
||
#ifndef _EDID_H_
|
||
#define _EDID_H_
|
||
|
||
-#include "vdif.h"
|
||
-
|
||
/* read complete EDID record */
|
||
#define EDID1_LEN 128
|
||
#define BITS_PER_BYTE 9
|
||
@@ -192,7 +190,14 @@
|
||
|
||
|
||
/* EDID Ver. >= 1.2 */
|
||
-#define _IS_MONITOR_DESC(x) (x[0] == 0 && x[1] == 0 && x[2] == 0 && x[4] == 0)
|
||
+/**
|
||
+ * Returns true if the pointer is the start of a monitor descriptor block
|
||
+ * instead of a detailed timing descriptor.
|
||
+ *
|
||
+ * Checking the reserved pad fields for zeroes fails on some monitors with
|
||
+ * broken empty ASCII strings. Only the first two bytes are reliable.
|
||
+ */
|
||
+#define _IS_MONITOR_DESC(x) (x[0] == 0 && x[1] == 0)
|
||
#define IS_MONITOR_DESC _IS_MONITOR_DESC(c)
|
||
#define _PIXEL_CLOCK(x) (x[0] + (x[1] << 8)) * 10000
|
||
#define PIXEL_CLOCK _PIXEL_CLOCK(c)
|
||
@@ -453,7 +458,7 @@ typedef struct {
|
||
struct established_timings timings1;
|
||
struct std_timings timings2[8];
|
||
struct detailed_monitor_section det_mon[4];
|
||
- xf86vdifPtr vdif;
|
||
+ void *vdif; /* unused */
|
||
int no_sections;
|
||
Uchar *rawData;
|
||
} xf86Monitor, *xf86MonPtr;
|
||
diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
|
||
index c58bb2f..7b4b2b9 100644
|
||
--- a/hw/xfree86/ddc/interpret_edid.c
|
||
+++ b/hw/xfree86/ddc/interpret_edid.c
|
||
@@ -304,16 +304,18 @@ get_detailed_timing_section(Uchar *c, struct detailed_timings *r)
|
||
r->misc = MISC;
|
||
}
|
||
|
||
+#define MAX_EDID_MINOR 3
|
||
|
||
static Bool
|
||
validate_version(int scrnIndex, struct edid_version *r)
|
||
{
|
||
if (r->version != 1)
|
||
return FALSE;
|
||
- if (r->revision > 3) {
|
||
- xf86DrvMsg(scrnIndex, X_ERROR,"EDID Version 1.%i not yet supported\n",
|
||
- r->revision);
|
||
- return FALSE;
|
||
- }
|
||
+
|
||
+ if (r->revision > MAX_EDID_MINOR)
|
||
+ xf86DrvMsg(scrnIndex, X_WARNING,
|
||
+ "Assuming version 1.%d is compatible with 1.%d\n",
|
||
+ r->revision, MAX_EDID_MINOR);
|
||
+
|
||
return TRUE;
|
||
}
|
||
diff --git a/hw/xfree86/ddc/interpret_vdif.c b/hw/xfree86/ddc/interpret_vdif.c
|
||
deleted file mode 100644
|
||
index 3a17e2f..0000000
|
||
--- a/hw/xfree86/ddc/interpret_vdif.c
|
||
+++ /dev/null
|
||
@@ -1,132 +0,0 @@
|
||
-
|
||
-#ifdef HAVE_XORG_CONFIG_H
|
||
-#include <xorg-config.h>
|
||
-#endif
|
||
-
|
||
-#include <X11/Xarch.h>
|
||
-#include "xf86DDC.h"
|
||
-#include "vdif.h"
|
||
-
|
||
-static xf86VdifLimitsPtr* get_limits(CARD8 *c);
|
||
-static xf86VdifGammaPtr* get_gamma(CARD8 *c);
|
||
-static xf86VdifTimingPtr* get_timings(CARD8 *c);
|
||
-#if X_BYTE_ORDER == X_BIG_ENDIAN
|
||
-static CARD32 swap_byte_order(CARD32 c);
|
||
-#endif
|
||
-
|
||
-xf86vdifPtr
|
||
-xf86InterpretVdif(CARD8 *c)
|
||
-{
|
||
- xf86VdifPtr p = (xf86VdifPtr)c;
|
||
- xf86vdifPtr vdif;
|
||
- int i;
|
||
-#if X_BYTE_ORDER == X_BIG_ENDIAN
|
||
- int length;
|
||
-#endif
|
||
- unsigned long l = 0;
|
||
-
|
||
- if (c == NULL) return NULL;
|
||
-#if X_BYTE_ORDER == X_BIG_ENDIAN
|
||
- length = swap_byte_order(p->FileLength);
|
||
- for (i = 0; i < (length >>2); i++)
|
||
- ((CARD32*)c)[i] = swap_byte_order(((CARD32*)c)[i]) ;
|
||
-#endif
|
||
- if (p->VDIFId[0] != 'V' || p->VDIFId[1] != 'D' || p->VDIFId[2] != 'I'
|
||
- || p->VDIFId[3] != 'F') return NULL;
|
||
- for ( i = 12; i < p->FileLength; i++)
|
||
- l += c[i];
|
||
- if ( l != p->Checksum) return NULL;
|
||
- vdif = xalloc(sizeof(xf86vdif));
|
||
- vdif->vdif = p;
|
||
- vdif->limits = get_limits(c);
|
||
- vdif->timings = get_timings(c);
|
||
- vdif->gamma = get_gamma(c);
|
||
- vdif->strings = VDIF_STRING(((xf86VdifPtr)c),0);
|
||
- xfree(c);
|
||
- return vdif;
|
||
-}
|
||
-
|
||
-static xf86VdifLimitsPtr*
|
||
-get_limits(CARD8 *c)
|
||
-{
|
||
- int num, i, j;
|
||
- xf86VdifLimitsPtr *pp;
|
||
- xf86VdifLimitsPtr p;
|
||
-
|
||
- num = ((xf86VdifPtr)c)->NumberOperationalLimits;
|
||
- pp = xalloc(sizeof(xf86VdifLimitsPtr) * (num+1));
|
||
- p = VDIF_OPERATIONAL_LIMITS(((xf86VdifPtr)c));
|
||
- j = 0;
|
||
- for ( i = 0; i<num; i++) {
|
||
- if (p->Header.ScnTag == VDIF_OPERATIONAL_LIMITS_TAG)
|
||
- pp[j++] = p;
|
||
- VDIF_NEXT_OPERATIONAL_LIMITS(p);
|
||
- }
|
||
- pp[j] = NULL;
|
||
- return pp;
|
||
-}
|
||
-
|
||
-static xf86VdifGammaPtr*
|
||
-get_gamma(CARD8 *c)
|
||
-{
|
||
- int num, i, j;
|
||
- xf86VdifGammaPtr *pp;
|
||
- xf86VdifGammaPtr p;
|
||
-
|
||
- num = ((xf86VdifPtr)c)->NumberOptions;
|
||
- pp = xalloc(sizeof(xf86VdifGammaPtr) * (num+1));
|
||
- p = (xf86VdifGammaPtr)VDIF_OPTIONS(((xf86VdifPtr)c));
|
||
- j = 0;
|
||
- for ( i = 0; i<num; i++)
|
||
- {
|
||
- if (p->Header.ScnTag == VDIF_GAMMA_TABLE_TAG)
|
||
- pp[j++] = p;
|
||
- VDIF_NEXT_OPTIONS(p);
|
||
- }
|
||
- pp[j] = NULL;
|
||
- return pp;
|
||
-}
|
||
-
|
||
-static xf86VdifTimingPtr*
|
||
-get_timings(CARD8 *c)
|
||
-{
|
||
- int num, num_limits;
|
||
- int i,j,k;
|
||
- xf86VdifLimitsPtr lp;
|
||
- xf86VdifTimingPtr *pp;
|
||
- xf86VdifTimingPtr p;
|
||
-
|
||
- num = ((xf86VdifPtr)c)->NumberOperationalLimits;
|
||
- lp = VDIF_OPERATIONAL_LIMITS(((xf86VdifPtr)c));
|
||
- num_limits = 0;
|
||
- for (i = 0; i < num; i++) {
|
||
- if (lp->Header.ScnTag == VDIF_OPERATIONAL_LIMITS_TAG)
|
||
- num_limits += lp->NumberPreadjustedTimings;
|
||
- VDIF_NEXT_OPERATIONAL_LIMITS(lp);
|
||
- }
|
||
- pp = xalloc(sizeof(xf86VdifTimingPtr)
|
||
- * (num_limits+1));
|
||
- j = 0;
|
||
- lp = VDIF_OPERATIONAL_LIMITS(((xf86VdifPtr) c));
|
||
- for (i = 0; i < num; i++) {
|
||
- p = VDIF_PREADJUSTED_TIMING(lp);
|
||
- for (k = 0; k < lp->NumberPreadjustedTimings; k++) {
|
||
- if (p->Header.ScnTag == VDIF_PREADJUSTED_TIMING_TAG)
|
||
- pp[j++] = p;
|
||
- VDIF_NEXT_PREADJUSTED_TIMING(p);
|
||
- }
|
||
- VDIF_NEXT_OPERATIONAL_LIMITS(lp);
|
||
- }
|
||
- pp[j] = NULL;
|
||
- return pp;
|
||
-}
|
||
-
|
||
-#if X_BYTE_ORDER == X_BIG_ENDIAN
|
||
-static CARD32
|
||
-swap_byte_order(CARD32 c)
|
||
-{
|
||
- return ((c & 0xFF000000) >> 24) | ((c & 0xFF0000) >> 8)
|
||
- | ((c & 0xFF00) << 8) | ((c & 0xFF) << 24);
|
||
-}
|
||
-
|
||
-#endif
|
||
diff --git a/hw/xfree86/ddc/print_vdif.c b/hw/xfree86/ddc/print_vdif.c
|
||
deleted file mode 100644
|
||
index 13cd3ab..0000000
|
||
--- a/hw/xfree86/ddc/print_vdif.c
|
||
+++ /dev/null
|
||
@@ -1,225 +0,0 @@
|
||
-
|
||
-#ifdef HAVE_XORG_CONFIG_H
|
||
-#include <xorg-config.h>
|
||
-#endif
|
||
-
|
||
-#include "vdif.h"
|
||
-#include "misc.h"
|
||
-#include "xf86DDC.h"
|
||
-
|
||
-static void print_vdif(xf86VdifPtr l, char *s);
|
||
-static void print_timings(xf86VdifTimingPtr *pt);
|
||
-static void print_limits(xf86VdifLimitsPtr *pl);
|
||
-static void print_gamma(xf86VdifGammaPtr *pg);
|
||
-static void print_type(CARD8 c);
|
||
-static void print_polarity(CARD8 c);
|
||
-
|
||
-void
|
||
-xf86print_vdif(xf86vdifPtr v)
|
||
-{
|
||
- print_vdif(v->vdif,v->strings);
|
||
- print_limits(v->limits);
|
||
- print_timings(v->timings);
|
||
- print_gamma(v->gamma);
|
||
-}
|
||
-
|
||
-static void
|
||
-print_vdif(xf86VdifPtr l, char *s)
|
||
-{
|
||
- ErrorF("Version %i.%i",l->VDIFVersion,l->VDIFRevision);
|
||
- ErrorF(" Date: %i/%i/%i, Manufactured: %i/%i/%i\n",l->Date[0],
|
||
- l->Date[1],l->Date[2],l->DateManufactured[0],
|
||
- l->DateManufactured[1],l->DateManufactured[2]);
|
||
- ErrorF("File Revision: %i",l->FileRevision);
|
||
- ErrorF("Manufacturer: %s\n",s + l->Manufacturer);
|
||
- ErrorF("ModelNumber: %s\n",s + l->ModelNumber);
|
||
- ErrorF("VDIFIndex: %s\n",s +l->MinVDIFIndex);
|
||
- ErrorF("Version: %s\n",s + l->Version);
|
||
- ErrorF("SerialNumber %s\n",s + l->SerialNumber);
|
||
- ErrorF("MonitorType: ");
|
||
- switch (l->MonitorType) {
|
||
- case VDIF_MONITOR_MONOCHROME:
|
||
- ErrorF("Mono\n");
|
||
- break;
|
||
- case VDIF_MONITOR_COLOR:
|
||
- ErrorF("Color\n");
|
||
- break;
|
||
- }
|
||
- ErrorF("CRT Size: %i inches\n",l->CRTSize);
|
||
- switch (l->MonitorType) {
|
||
- case VDIF_MONITOR_MONOCHROME:
|
||
- ErrorF("Border: %i percent\n",
|
||
- l->BorderRed);
|
||
- ErrorF("Phosphor Decay: 1: %i,",l->RedPhosphorDecay);
|
||
- if (l->GreenPhosphorDecay !=0)
|
||
- ErrorF(" 2: %i,",l->GreenPhosphorDecay);
|
||
- if (l->BluePhosphorDecay !=0)
|
||
- ErrorF(" 3: %i",l->BluePhosphorDecay);
|
||
- ErrorF(" ms\n");
|
||
- if (l->RedChromaticity_x)
|
||
- ErrorF("Chromaticity: 1: x:%f, y:%f; ",
|
||
- l->RedChromaticity_x/1000.0,l->RedChromaticity_y/1000.0);
|
||
- if (l->GreenChromaticity_x)
|
||
- ErrorF("Chromaticity: 2: x:%f, y:%f; ",
|
||
- l->GreenChromaticity_x/1000.0,l->GreenChromaticity_y/1000.0);
|
||
- if (l->BlueChromaticity_x)
|
||
- ErrorF("Chromaticity: 3: x:%f, y:%f ",
|
||
- l->BlueChromaticity_x/1000.0,l->BlueChromaticity_y/1000.0);
|
||
- ErrorF("\n");
|
||
- ErrorF("Gamma: %f\n",l->RedGamma/1000.0);
|
||
- break;
|
||
- case VDIF_MONITOR_COLOR:
|
||
- ErrorF("Border: Red: %i Green: %i Blue: %i percent\n",
|
||
- l->BorderRed,l->BorderGreen,l->BorderBlue);
|
||
- ErrorF("Phosphor Decay: Red: %i, Green: %i, Blue: %i ms\n",
|
||
- l->RedPhosphorDecay,l->GreenPhosphorDecay,l->BluePhosphorDecay);
|
||
- ErrorF("Chromaticity: Red: x:%f, y:%f; Green: x:%f, y:%f; "
|
||
- "Blue: x:%f, y:%f\n",
|
||
- l->RedChromaticity_x/1000.0,l->RedChromaticity_y/1000.0,
|
||
- l->GreenChromaticity_x/1000.0,l->GreenChromaticity_y/1000.0,
|
||
- l->BlueChromaticity_x/1000.0,l->BlueChromaticity_y/1000.0);
|
||
- ErrorF("Gamma: Red:%f, Green:%f, Blue:%f\n",l->RedGamma/1000.0,
|
||
- l->GreenGamma/1000.0,l->BlueGamma/1000.0);
|
||
- break;
|
||
- }
|
||
- ErrorF("White Point: x: %f y: %f Y: %f\n",l->WhitePoint_x/1000.0,
|
||
- l->WhitePoint_y/1000.0,l->WhitePoint_Y/1000.0);
|
||
-}
|
||
-
|
||
-static void
|
||
-print_limits(xf86VdifLimitsPtr *pl)
|
||
-{
|
||
- int i = 0;
|
||
- xf86VdifLimitsPtr l;
|
||
-
|
||
- while((l = pl[i]) != NULL) {
|
||
- ErrorF("Max display resolution: %i x %i pixel\n",l->MaxHorPixel,
|
||
- l->MaxVerPixel);
|
||
- ErrorF("Size of active area: %i x %i millimeters\n",l->MaxHorActiveLength,
|
||
- l->MaxVerActiveHeight);
|
||
- ErrorF("Video Type: ");
|
||
- print_type(l->VideoType);
|
||
- ErrorF("Sync Type: ");
|
||
- print_type(l->SyncType);
|
||
- ErrorF("Sync Configuration ");
|
||
- switch (l->SyncConfiguration) {
|
||
- case VDIF_SYNC_SEPARATE:
|
||
- ErrorF("separate\n");
|
||
- break;
|
||
- case VDIF_SYNC_C:
|
||
- ErrorF("composite C\n");
|
||
- break;
|
||
- case VDIF_SYNC_CP:
|
||
- ErrorF("composite CP\n");
|
||
- break;
|
||
- case VDIF_SYNC_G:
|
||
- ErrorF("composite G\n");
|
||
- break;
|
||
- case VDIF_SYNC_GP:
|
||
- ErrorF("composite GP\n");
|
||
- break;
|
||
- case VDIF_SYNC_OTHER:
|
||
- ErrorF("other\n");
|
||
- break;
|
||
- }
|
||
- ErrorF("Termination Resistance: %i\n",l->TerminationResistance);
|
||
- ErrorF("Levels: white: %i, black: %i, blank: %i, sync: %i mV\n",
|
||
- l->WhiteLevel,l->BlackLevel,l->BlankLevel,l->SyncLevel);
|
||
- ErrorF("Max. Pixel Clock: %f MHz\n",l->MaxPixelClock/1000.0);
|
||
- ErrorF("Freq. Range: Hor.: %f - %f kHz, Ver.: %f - %f Hz\n",
|
||
- l->MaxHorFrequency/1000.0,l->MinHorFrequency/1000.0,
|
||
- l->MaxVerFrequency/1000.0,l->MinVerFrequency/1000.0);
|
||
- ErrorF("Retrace time: Hor: %f us, Ver: %f ms\n",l->MinHorRetrace/1000.0,
|
||
- l->MinVerRetrace/1000.0);
|
||
- }
|
||
-}
|
||
-
|
||
-static void
|
||
-print_timings(xf86VdifTimingPtr *pt)
|
||
-{
|
||
- int i = 0;
|
||
- xf86VdifTimingPtr t;
|
||
-
|
||
- while((t = pt[i]) != NULL) {
|
||
- ErrorF("SVGA / SVPMI mode number: %i\n",t->PreadjustedTimingName);
|
||
- ErrorF("Mode %i x %i\n",t->HorPixel,t->VerPixel);
|
||
- ErrorF("Size: %i x %i mm\n",t->HorAddrLength,t->VerAddrHeight);
|
||
- ErrorF("Ratios: %i/%i\n",t->PixelWidthRatio,t->PixelHeightRatio);
|
||
- ErrorF("Character width: %i",t->CharacterWidth);
|
||
- ErrorF("Clock: %f MHz HFreq.: %f kHz, VFreq: %f Hz\n",t->PixelClock/1000.0,
|
||
- t->HorFrequency/1000.0,t->VerFrequency/1000.0);
|
||
- ErrorF("Htotal: %f us, Vtotal %f ms\n", t->HorTotalTime/1000.0,
|
||
- t->VerTotalTime/1000.0);
|
||
- ErrorF("HDisp: %f, HBlankStart: %f, HBlankLength: %f, "
|
||
- "HSyncStart: %f HSyncEnd: %f us\n",t->HorAddrTime/1000.0,
|
||
- t->HorBlankStart/1000.0,t->HorBlankTime/1000.0,
|
||
- t->HorSyncStart/1000.0,t->HorSyncTime/1000.0);
|
||
- ErrorF("VDisp: %f, VBlankStart: %f, VBlankLength: %f, "
|
||
- "VSyncStart: %f VSyncEnd: %f us\n",t->VerAddrTime/1000.0,
|
||
- t->VerBlankStart/1000.0,t->VerBlankTime/1000.0,
|
||
- t->VerSyncStart/1000.0,t->VerSyncTime/1000.0);
|
||
- ErrorF("Scan Type: ");
|
||
- switch (t->ScanType) {
|
||
- case VDIF_SCAN_INTERLACED:
|
||
- ErrorF("interlaced ");
|
||
- break;
|
||
- case VDIF_SCAN_NONINTERLACED:
|
||
- ErrorF("non interlaced ");
|
||
- break;
|
||
- case VDIF_SCAN_OTHER:
|
||
- ErrorF("other ");
|
||
- break;
|
||
- }
|
||
- ErrorF("Polarity: H: ");
|
||
- print_polarity(t->HorSyncPolarity);
|
||
- ErrorF("V: ");
|
||
- print_polarity(t->VerSyncPolarity);
|
||
- ErrorF("\n");
|
||
- }
|
||
-}
|
||
-
|
||
-static void
|
||
-print_gamma(xf86VdifGammaPtr *pg)
|
||
-{
|
||
- int i = 0;
|
||
- xf86VdifGammaPtr g;
|
||
-
|
||
- while((g = pg[i]) != NULL) {
|
||
- ErrorF("Gamma Table Entries: %i\n",g->GammaTableEntries);
|
||
- }
|
||
-}
|
||
-
|
||
-static void
|
||
-print_type(CARD8 c)
|
||
-{
|
||
- switch (c) {
|
||
- case VDIF_VIDEO_TTL :
|
||
- ErrorF("TTL\n");
|
||
- break;
|
||
- case VDIF_VIDEO_ANALOG :
|
||
- ErrorF("Analog\n");
|
||
- break;
|
||
- case VDIF_VIDEO_ECL:
|
||
- ErrorF("ECL\n");
|
||
- break;
|
||
- case VDIF_VIDEO_DECL:
|
||
- ErrorF("DECL\n");
|
||
- break;
|
||
- case VDIF_VIDEO_OTHER:
|
||
- ErrorF("other\n");
|
||
- break;
|
||
- }
|
||
-}
|
||
-
|
||
-static void
|
||
-print_polarity(CARD8 c)
|
||
-{
|
||
- switch (c) {
|
||
- case VDIF_POLARITY_NEGATIVE:
|
||
- ErrorF(" Neg.");
|
||
- break;
|
||
- case VDIF_POLARITY_POSITIVE:
|
||
- ErrorF(" Pos.");
|
||
- break;
|
||
- }
|
||
-}
|
||
diff --git a/hw/xfree86/ddc/vdif.h b/hw/xfree86/ddc/vdif.h
|
||
deleted file mode 100644
|
||
index 1777b68..0000000
|
||
--- a/hw/xfree86/ddc/vdif.h
|
||
+++ /dev/null
|
||
@@ -1,174 +0,0 @@
|
||
-
|
||
-#ifndef _VDIF_H
|
||
-#define _VDIF_H
|
||
-
|
||
-#define VDIF_MONITOR_MONOCHROME 0
|
||
-#define VDIF_MONITOR_COLOR 1
|
||
-#define VDIF_VIDEO_TTL 0
|
||
-#define VDIF_VIDEO_ANALOG 1
|
||
-#define VDIF_VIDEO_ECL 2
|
||
-#define VDIF_VIDEO_DECL 3
|
||
-#define VDIF_VIDEO_OTHER 4
|
||
-#define VDIF_SYNC_SEPARATE 0
|
||
-#define VDIF_SYNC_C 1
|
||
-#define VDIF_SYNC_CP 2
|
||
-#define VDIF_SYNC_G 3
|
||
-#define VDIF_SYNC_GP 4
|
||
-#define VDIF_SYNC_OTHER 5
|
||
-#define VDIF_SCAN_NONINTERLACED 0
|
||
-#define VDIF_SCAN_INTERLACED 1
|
||
-#define VDIF_SCAN_OTHER 2
|
||
-#define VDIF_POLARITY_NEGATIVE 0
|
||
-#define VDIF_POLARITY_POSITIVE 1
|
||
-
|
||
-#include <X11/Xmd.h>
|
||
-
|
||
-#undef CARD32
|
||
-#define CARD32 unsigned int /* ... on all supported platforms */
|
||
-
|
||
-typedef struct _VDIF { /* Monitor Description: */
|
||
- CARD8 VDIFId[4]; /* alway "VDIF" */
|
||
- CARD32 FileLength; /* lenght of the whole file */
|
||
- CARD32 Checksum; /* sum of all bytes in the file after*/
|
||
- /* this field */
|
||
- CARD16 VDIFVersion; /* structure version number */
|
||
- CARD16 VDIFRevision; /* structure revision number */
|
||
- CARD16 Date[3]; /* file date Year/Month/Day */
|
||
- CARD16 DateManufactured[3]; /* date Year/Month/Day */
|
||
- CARD32 FileRevision; /* file revision string */
|
||
- CARD32 Manufacturer; /* ASCII ID of the manufacturer */
|
||
- CARD32 ModelNumber; /* ASCII ID of the model */
|
||
- CARD32 MinVDIFIndex; /* ASCII ID of Minimum VDIF index */
|
||
- CARD32 Version; /* ASCII ID of the model version */
|
||
- CARD32 SerialNumber; /* ASCII ID of the serial number */
|
||
- CARD8 MonitorType; /* Monochrome or Color */
|
||
- CARD8 CRTSize; /* inches */
|
||
- CARD8 BorderRed; /* percent */
|
||
- CARD8 BorderGreen; /* percent */
|
||
- CARD8 BorderBlue; /* percent */
|
||
- CARD8 Reserved1; /* padding */
|
||
- CARD16 Reserved2; /* padding */
|
||
- CARD32 RedPhosphorDecay; /* microseconds */
|
||
- CARD32 GreenPhosphorDecay; /* microseconds */
|
||
- CARD32 BluePhosphorDecay; /* microseconds */
|
||
- CARD16 WhitePoint_x; /* WhitePoint in CIExyY (scale 1000) */
|
||
- CARD16 WhitePoint_y;
|
||
- CARD16 WhitePoint_Y;
|
||
- CARD16 RedChromaticity_x; /* Red chromaticity in x,y */
|
||
- CARD16 RedChromaticity_y;
|
||
- CARD16 GreenChromaticity_x; /* Green chromaticity in x,y */
|
||
- CARD16 GreenChromaticity_y;
|
||
- CARD16 BlueChromaticity_x; /* Blue chromaticity in x,y */
|
||
- CARD16 BlueChromaticity_y;
|
||
- CARD16 RedGamma; /* Gamme curve exponent (scale 1000) */
|
||
- CARD16 GreenGamma;
|
||
- CARD16 BlueGamma;
|
||
- CARD32 NumberOperationalLimits;
|
||
- CARD32 OffsetOperationalLimits;
|
||
- CARD32 NumberOptions; /* optinal sections (gamma table) */
|
||
- CARD32 OffsetOptions;
|
||
- CARD32 OffsetStringTable;
|
||
-} xf86VdifRec, *xf86VdifPtr;
|
||
-
|
||
-typedef enum { /* Tags for section identification */
|
||
- VDIF_OPERATIONAL_LIMITS_TAG = 1,
|
||
- VDIF_PREADJUSTED_TIMING_TAG,
|
||
- VDIF_GAMMA_TABLE_TAG
|
||
-} VDIFScnTag;
|
||
-
|
||
-typedef struct _VDIFScnHdr { /* Generic Section Header: */
|
||
- CARD32 ScnLength; /* lenght of section */
|
||
- CARD32 ScnTag; /* tag for section identification */
|
||
-} VDIFScnHdrRec, *VDIFScnHdrPtr;
|
||
-
|
||
-typedef struct _VDIFLimits { /* Operational Limits: */
|
||
- VDIFScnHdrRec Header; /* common section info */
|
||
- CARD16 MaxHorPixel; /* pixels */
|
||
- CARD16 MaxVerPixel; /* lines */
|
||
- CARD16 MaxHorActiveLength; /* millimeters */
|
||
- CARD16 MaxVerActiveHeight; /* millimeters */
|
||
- CARD8 VideoType; /* TTL / Analog / ECL / DECL */
|
||
- CARD8 SyncType; /* TTL / Analog / ECL / DECL */
|
||
- CARD8 SyncConfiguration; /* separate / composite / other */
|
||
- CARD8 Reserved1; /* padding */
|
||
- CARD16 Reserved2; /* padding */
|
||
- CARD16 TerminationResistance; /* */
|
||
- CARD16 WhiteLevel; /* millivolts */
|
||
- CARD16 BlackLevel; /* millivolts */
|
||
- CARD16 BlankLevel; /* millivolts */
|
||
- CARD16 SyncLevel; /* millivolts */
|
||
- CARD32 MaxPixelClock; /* kiloHertz */
|
||
- CARD32 MinHorFrequency; /* Hertz */
|
||
- CARD32 MaxHorFrequency; /* Hertz */
|
||
- CARD32 MinVerFrequency; /* milliHertz */
|
||
- CARD32 MaxVerFrequency; /* milliHertz */
|
||
- CARD16 MinHorRetrace; /* nanoseconds */
|
||
- CARD16 MinVerRetrace; /* microseconds */
|
||
- CARD32 NumberPreadjustedTimings;
|
||
- CARD32 OffsetNextLimits;
|
||
-} xf86VdifLimitsRec, *xf86VdifLimitsPtr;
|
||
-
|
||
-typedef struct _VDIFTiming { /* Preadjusted Timing: */
|
||
- VDIFScnHdrRec Header; /* common section info */
|
||
- CARD32 PreadjustedTimingName; /* SVGA/SVPMI mode number */
|
||
- CARD16 HorPixel; /* pixels */
|
||
- CARD16 VerPixel; /* lines */
|
||
- CARD16 HorAddrLength; /* millimeters */
|
||
- CARD16 VerAddrHeight; /* millimeters */
|
||
- CARD8 PixelWidthRatio; /* gives H:V */
|
||
- CARD8 PixelHeightRatio;
|
||
- CARD8 Reserved1; /* padding */
|
||
- CARD8 ScanType; /* noninterlaced / interlaced / other*/
|
||
- CARD8 HorSyncPolarity; /* negative / positive */
|
||
- CARD8 VerSyncPolarity; /* negative / positive */
|
||
- CARD16 CharacterWidth; /* pixels */
|
||
- CARD32 PixelClock; /* kiloHertz */
|
||
- CARD32 HorFrequency; /* Hertz */
|
||
- CARD32 VerFrequency; /* milliHertz */
|
||
- CARD32 HorTotalTime; /* nanoseconds */
|
||
- CARD32 VerTotalTime; /* microseconds */
|
||
- CARD16 HorAddrTime; /* nanoseconds */
|
||
- CARD16 HorBlankStart; /* nanoseconds */
|
||
- CARD16 HorBlankTime; /* nanoseconds */
|
||
- CARD16 HorSyncStart; /* nanoseconds */
|
||
- CARD16 HorSyncTime; /* nanoseconds */
|
||
- CARD16 VerAddrTime; /* microseconds */
|
||
- CARD16 VerBlankStart; /* microseconds */
|
||
- CARD16 VerBlankTime; /* microseconds */
|
||
- CARD16 VerSyncStart; /* microseconds */
|
||
- CARD16 VerSyncTime; /* microseconds */
|
||
-} xf86VdifTimingRec, *xf86VdifTimingPtr;
|
||
-
|
||
-typedef struct _VDIFGamma { /* Gamma Table: */
|
||
- VDIFScnHdrRec Header; /* common section info */
|
||
- CARD16 GammaTableEntries; /* count of grays or RGB 3-tuples */
|
||
- CARD16 Unused1;
|
||
-} xf86VdifGammaRec, *xf86VdifGammaPtr;
|
||
-
|
||
-/* access macros */
|
||
-#define VDIF_OPERATIONAL_LIMITS(vdif) \
|
||
-((xf86VdifLimitsPtr)((char*)(vdif) + (vdif)->OffsetOperationalLimits))
|
||
-#define VDIF_NEXT_OPERATIONAL_LIMITS(limits) limits = \
|
||
- ((xf86VdifLimitsPtr)((char*)(limits) + (limits)->OffsetNextLimits))
|
||
-#define VDIF_PREADJUSTED_TIMING(limits) \
|
||
-((xf86VdifTimingPtr)((char*)(limits) + (limits)->Header.ScnLength))
|
||
-#define VDIF_NEXT_PREADJUSTED_TIMING(timing) timing = \
|
||
- ((xf86VdifTimingPtr)((char*)(timing) + (timing)->Header.ScnLength))
|
||
-#define VDIF_OPTIONS(vdif) \
|
||
- ((VDIFScnHdrPtr)((char*)(vdif) + (vdif)->OffsetOptions))
|
||
-#define VDIF_NEXT_OPTIONS(options) options = \
|
||
- ((xf86VdifGammaPtr)((char*)(options) + (options)->Header.ScnLength))
|
||
-#define VDIF_STRING(vdif, string) \
|
||
- ((char*)((char*)vdif + vdif->OffsetStringTable + (string)))
|
||
-
|
||
-typedef struct _vdif {
|
||
- xf86VdifPtr vdif;
|
||
- xf86VdifLimitsPtr *limits;
|
||
- xf86VdifTimingPtr *timings;
|
||
- xf86VdifGammaPtr *gamma;
|
||
- char * strings;
|
||
-} xf86vdif, *xf86vdifPtr;
|
||
-
|
||
-#undef CARD32
|
||
-
|
||
-#endif
|
||
diff --git a/hw/xfree86/ddc/xf86DDC.c b/hw/xfree86/ddc/xf86DDC.c
|
||
index 8080c8d..e47b8b8 100644
|
||
--- a/hw/xfree86/ddc/xf86DDC.c
|
||
+++ b/hw/xfree86/ddc/xf86DDC.c
|
||
@@ -15,52 +15,6 @@
|
||
|
||
static const OptionInfoRec *DDCAvailableOptions(void *unused);
|
||
|
||
-#if DDC_MODULE
|
||
-
|
||
-static MODULESETUPPROTO(ddcSetup);
|
||
-
|
||
-static XF86ModuleVersionInfo ddcVersRec =
|
||
-{
|
||
- "ddc",
|
||
- MODULEVENDORSTRING,
|
||
- MODINFOSTRING1,
|
||
- MODINFOSTRING2,
|
||
- XORG_VERSION_CURRENT,
|
||
- 1, 0, 0,
|
||
- ABI_CLASS_VIDEODRV, /* needs the video driver ABI */
|
||
- ABI_VIDEODRV_VERSION,
|
||
- MOD_CLASS_NONE,
|
||
- {0,0,0,0}
|
||
-};
|
||
-
|
||
-_X_EXPORT XF86ModuleData ddcModuleData = { &ddcVersRec, ddcSetup, NULL };
|
||
-
|
||
-ModuleInfoRec DDC = {
|
||
- 1,
|
||
- "DDC",
|
||
- NULL,
|
||
- 0,
|
||
- DDCAvailableOptions,
|
||
-};
|
||
-
|
||
-static pointer
|
||
-ddcSetup(pointer module, pointer opts, int *errmaj, int *errmin)
|
||
-{
|
||
- static Bool setupDone = FALSE;
|
||
-
|
||
- if (!setupDone) {
|
||
- setupDone = TRUE;
|
||
- xf86AddModuleInfo(&DDC, module);
|
||
- }
|
||
- /*
|
||
- * The return value must be non-NULL on success even though there
|
||
- * is no TearDownProc.
|
||
- */
|
||
- return (pointer)1;
|
||
-}
|
||
-
|
||
-#endif
|
||
-
|
||
#define RETRIES 4
|
||
|
||
static unsigned char *EDIDRead_DDC1(
|
||
@@ -84,12 +38,6 @@ static unsigned char* EDID1Read_DDC2(
|
||
I2CBusPtr pBus
|
||
);
|
||
|
||
-static unsigned char * VDIFRead(
|
||
- int scrnIndex,
|
||
- I2CBusPtr pBus,
|
||
- int start
|
||
-);
|
||
-
|
||
static unsigned char * DDCRead_DDC2(
|
||
int scrnIndex,
|
||
I2CBusPtr pBus,
|
||
@@ -184,7 +132,6 @@ xf86DoEDID_DDC2(int scrnIndex, I2CBusPtr pBus)
|
||
{
|
||
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
|
||
unsigned char *EDID_block = NULL;
|
||
- unsigned char *VDIF_Block = NULL;
|
||
xf86MonPtr tmp = NULL;
|
||
/* Default DDC and DDC2 to enabled. */
|
||
Bool noddc = FALSE, noddc2 = FALSE;
|
||
@@ -217,11 +164,6 @@ xf86DoEDID_DDC2(int scrnIndex, I2CBusPtr pBus)
|
||
else
|
||
ErrorF("Sections to follow: %i\n",tmp->no_sections);
|
||
#endif
|
||
- if (tmp) {
|
||
- VDIF_Block =
|
||
- VDIFRead(scrnIndex, pBus, EDID1_LEN * (tmp->no_sections + 1));
|
||
- tmp->vdif = xf86InterpretVdif(VDIF_Block);
|
||
- }
|
||
|
||
return tmp;
|
||
}
|
||
@@ -299,35 +241,6 @@ EDID1Read_DDC2(int scrnIndex, I2CBusPtr pBus)
|
||
return DDCRead_DDC2(scrnIndex, pBus, 0, EDID1_LEN);
|
||
}
|
||
|
||
-static unsigned char*
|
||
-VDIFRead(int scrnIndex, I2CBusPtr pBus, int start)
|
||
-{
|
||
- unsigned char * Buffer, *v_buffer = NULL, *v_bufferp = NULL;
|
||
- int i, num = 0;
|
||
-
|
||
- /* read VDIF length in 64 byte blocks */
|
||
- Buffer = DDCRead_DDC2(scrnIndex, pBus,start,64);
|
||
- if (Buffer == NULL)
|
||
- return NULL;
|
||
-#ifdef DEBUG
|
||
- ErrorF("number of 64 bit blocks: %i\n",Buffer[0]);
|
||
-#endif
|
||
- if ((num = Buffer[0]) > 0)
|
||
- v_buffer = v_bufferp = xalloc(sizeof(unsigned char) * 64 * num);
|
||
-
|
||
- for (i = 0; i < num; i++) {
|
||
- Buffer = DDCRead_DDC2(scrnIndex, pBus,start,64);
|
||
- if (Buffer == NULL) {
|
||
- xfree (v_buffer);
|
||
- return NULL;
|
||
- }
|
||
- memcpy(v_bufferp,Buffer,63); /* 64th byte is checksum */
|
||
- xfree(Buffer);
|
||
- v_bufferp += 63;
|
||
- }
|
||
- return v_buffer;
|
||
-}
|
||
-
|
||
static unsigned char *
|
||
DDCRead_DDC2(int scrnIndex, I2CBusPtr pBus, int start, int len)
|
||
{
|
||
diff --git a/hw/xfree86/ddc/xf86DDC.h b/hw/xfree86/ddc/xf86DDC.h
|
||
index 5def97a..3b072dd 100644
|
||
--- a/hw/xfree86/ddc/xf86DDC.h
|
||
+++ b/hw/xfree86/ddc/xf86DDC.h
|
||
@@ -43,10 +43,6 @@ extern xf86MonPtr xf86InterpretEDID(
|
||
int screenIndex, Uchar *block
|
||
);
|
||
|
||
-extern xf86vdifPtr xf86InterpretVdif(
|
||
- CARD8 *c
|
||
-);
|
||
-
|
||
extern void
|
||
xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC);
|
||
|
||
@@ -55,9 +51,7 @@ extern Bool xf86SetDDCproperties(
|
||
xf86MonPtr DDC
|
||
);
|
||
|
||
-extern void xf86print_vdif(
|
||
- xf86vdifPtr v
|
||
-);
|
||
+DisplayModePtr xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC);
|
||
|
||
#endif
|
||
|
||
diff --git a/hw/xfree86/loader/xf86sym.c b/hw/xfree86/loader/xf86sym.c
|
||
index 09d6681..185eb80 100644
|
||
--- a/hw/xfree86/loader/xf86sym.c
|
||
+++ b/hw/xfree86/loader/xf86sym.c
|
||
@@ -1237,13 +1203,12 @@ _X_HIDDEN void *xfree86LookupTab[] = {
|
||
SYMFUNC(xf86_show_cursors)
|
||
SYMFUNC(xf86_hide_cursors)
|
||
SYMFUNC(xf86_cursors_fini)
|
||
+ SYMFUNC(xf86_crtc_clip_video_helper)
|
||
|
||
SYMFUNC(xf86DoEDID_DDC1)
|
||
SYMFUNC(xf86DoEDID_DDC2)
|
||
SYMFUNC(xf86InterpretEDID)
|
||
SYMFUNC(xf86PrintEDID)
|
||
- SYMFUNC(xf86InterpretVdif)
|
||
- SYMFUNC(xf86print_vdif)
|
||
SYMFUNC(xf86DDCMonitorSet)
|
||
SYMFUNC(xf86SetDDCproperties)
|
||
|
||
diff --git a/randr/Makefile.am b/randr/Makefile.am
|
||
index 9bf0e65..20b0f72 100644
|
||
--- a/randr/Makefile.am
|
||
+++ b/randr/Makefile.am
|
||
@@ -2,6 +2,8 @@ noinst_LTLIBRARIES = librandr.la
|
||
|
||
AM_CFLAGS = $(DIX_CFLAGS)
|
||
|
||
+XINERAMA_SRCS = rrxinerama.c
|
||
+
|
||
if XORG
|
||
sdk_HEADERS = randrstr.h
|
||
endif
|
||
@@ -18,5 +20,9 @@ librandr_la_SOURCES = \
|
||
rrpointer.c \
|
||
rrproperty.c \
|
||
rrscreen.c \
|
||
- rrsdispatch.c \
|
||
- rrxinerama.c
|
||
+ rrsdispatch.c
|
||
+
|
||
+if XINERAMA
|
||
+librandr_la_SOURCES += ${XINERAMA_SRCS}
|
||
+endif
|
||
+
|
||
diff --git a/randr/randr.c b/randr/randr.c
|
||
index 4dd0ee5..958f9c1 100644
|
||
--- a/randr/randr.c
|
||
+++ b/randr/randr.c
|
||
@@ -358,8 +358,9 @@ RRExtensionInit (void)
|
||
SRRScreenChangeNotifyEvent;
|
||
EventSwapVector[RREventBase + RRNotify] = (EventSwapPtr)
|
||
SRRNotifyEvent;
|
||
-
|
||
+#ifdef PANORAMIX
|
||
RRXineramaExtensionInit();
|
||
+#endif
|
||
}
|
||
|
||
static int
|
||
diff --git a/randr/randrstr.h b/randr/randrstr.h
|
||
index 6deaf47..bd19fe9 100644
|
||
--- a/randr/randrstr.h
|
||
+++ b/randr/randrstr.h
|
||
@@ -564,6 +564,7 @@ RRCrtcGammaSetSize (RRCrtcPtr crtc,
|
||
* Return the area of the frame buffer scanned out by the crtc,
|
||
* taking into account the current mode and rotation
|
||
*/
|
||
+
|
||
void
|
||
RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height);
|
||
|
||
@@ -693,9 +694,6 @@ RROutputSetCrtcs (RROutputPtr output,
|
||
RRCrtcPtr *crtcs,
|
||
int numCrtcs);
|
||
|
||
-void
|
||
-RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc);
|
||
-
|
||
Bool
|
||
RROutputSetConnection (RROutputPtr output,
|
||
CARD8 connection);
|
||
@@ -801,7 +799,6 @@ Query state:
|
||
1.2:
|
||
RRScreenSetSizeRange
|
||
RROutputSetCrtcs
|
||
- RROutputSetCrtc
|
||
RRModeGet
|
||
RROutputSetModes
|
||
RROutputSetConnection
|
||
@@ -821,7 +818,6 @@ Query state:
|
||
RRCrtcCreate
|
||
RROutputCreate
|
||
RROutputSetCrtcs
|
||
- RROutputSetCrtc
|
||
RROutputSetConnection
|
||
RROutputSetSubpixelOrder
|
||
RROldModeAdd • This adds modes one-at-a-time
|
||
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
|
||
index 63da829..db5007e 100644
|
||
--- a/randr/rrcrtc.c
|
||
+++ b/randr/rrcrtc.c
|
||
@@ -134,6 +134,7 @@ RRCrtcNotify (RRCrtcPtr crtc,
|
||
break;
|
||
if (j == crtc->numOutputs)
|
||
{
|
||
+ outputs[i]->crtc = crtc;
|
||
RROutputChanged (outputs[i], FALSE);
|
||
RRCrtcChanged (crtc, FALSE);
|
||
}
|
||
@@ -149,6 +150,7 @@ RRCrtcNotify (RRCrtcPtr crtc,
|
||
break;
|
||
if (i == numOutputs)
|
||
{
|
||
+ crtc->outputs[j]->crtc = NULL;
|
||
RROutputChanged (crtc->outputs[j], FALSE);
|
||
RRCrtcChanged (crtc, FALSE);
|
||
}
|
||
@@ -507,7 +509,7 @@ RRCrtcInit (void)
|
||
int
|
||
ProcRRGetCrtcInfo (ClientPtr client)
|
||
{
|
||
- REQUEST(xRRGetCrtcInfoReq);;
|
||
+ REQUEST(xRRGetCrtcInfoReq);
|
||
xRRGetCrtcInfoReply rep;
|
||
RRCrtcPtr crtc;
|
||
CARD8 *extra;
|
||
@@ -794,7 +796,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
|
||
int source_width = mode->mode.width;
|
||
int source_height = mode->mode.height;
|
||
|
||
- if (rotation == RR_Rotate_90 || rotation == RR_Rotate_270)
|
||
+ if ((rotation & 0xf) == RR_Rotate_90 || (rotation & 0xf) == RR_Rotate_270)
|
||
{
|
||
source_width = mode->mode.height;
|
||
source_height = mode->mode.width;
|
||
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
|
||
index 6b61b9c..5525427 100644
|
||
--- a/randr/rrdispatch.c
|
||
+++ b/randr/rrdispatch.c
|
||
@@ -22,6 +22,9 @@
|
||
|
||
#include "randrstr.h"
|
||
|
||
+#define SERVER_RANDR_MAJOR 1
|
||
+#define SERVER_RANDR_MINOR 2
|
||
+
|
||
Bool
|
||
RRClientKnowsRates (ClientPtr pClient)
|
||
{
|
||
@@ -49,8 +52,8 @@ ProcRRQueryVersion (ClientPtr client)
|
||
* Report the current version; the current
|
||
* spec says they're all compatible after 1.0
|
||
*/
|
||
- rep.majorVersion = RANDR_MAJOR;
|
||
- rep.minorVersion = RANDR_MINOR;
|
||
+ rep.majorVersion = SERVER_RANDR_MAJOR;
|
||
+ rep.minorVersion = SERVER_RANDR_MINOR;
|
||
if (client->swapped) {
|
||
swaps(&rep.sequenceNumber, n);
|
||
swapl(&rep.length, n);
|
||
diff --git a/randr/rrinfo.c b/randr/rrinfo.c
|
||
index 5ef1a6b..7e77d39 100644
|
||
--- a/randr/rrinfo.c
|
||
+++ b/randr/rrinfo.c
|
||
@@ -98,17 +98,18 @@ RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
|
||
if (!output)
|
||
return;
|
||
RROutputSetCrtcs (output, &crtc, 1);
|
||
- RROutputSetCrtc (output, crtc);
|
||
RROutputSetConnection (output, RR_Connected);
|
||
#ifdef RENDER
|
||
RROutputSetSubpixelOrder (output, PictureGetSubpixelOrder (pScreen));
|
||
#endif
|
||
}
|
||
|
||
- output = RRFirstOutput (pScreen);
|
||
+ output = pScrPriv->outputs[0];
|
||
if (!output)
|
||
return;
|
||
- crtc = output->crtc;
|
||
+ crtc = pScrPriv->crtcs[0];
|
||
+ if (!crtc)
|
||
+ return;
|
||
|
||
/* check rotations */
|
||
if (rotations != crtc->rotations)
|
||
@@ -168,7 +169,7 @@ RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
|
||
|
||
/* notice current mode */
|
||
if (newMode)
|
||
- RRCrtcNotify (output->crtc, newMode, 0, 0, pScrPriv->rotation,
|
||
+ RRCrtcNotify (crtc, newMode, 0, 0, pScrPriv->rotation,
|
||
1, &output);
|
||
}
|
||
#endif
|
||
diff --git a/randr/rroutput.c b/randr/rroutput.c
|
||
index c773279..a67e493 100644
|
||
--- a/randr/rroutput.c
|
||
+++ b/randr/rroutput.c
|
||
@@ -249,6 +249,7 @@ RROutputDeleteUserMode (RROutputPtr output,
|
||
|
||
memmove (output->userModes + m, output->userModes + m + 1,
|
||
(output->numUserModes - m - 1) * sizeof (RRModePtr));
|
||
+ output->numUserModes--;
|
||
RRModeDestroy (mode);
|
||
return Success;
|
||
}
|
||
@@ -286,15 +287,6 @@ RROutputSetCrtcs (RROutputPtr output,
|
||
return TRUE;
|
||
}
|
||
|
||
-void
|
||
-RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc)
|
||
-{
|
||
- if (output->crtc == crtc)
|
||
- return;
|
||
- output->crtc = crtc;
|
||
- RROutputChanged (output, FALSE);
|
||
-}
|
||
-
|
||
Bool
|
||
RROutputSetConnection (RROutputPtr output,
|
||
CARD8 connection)
|
||
@@ -438,7 +430,7 @@ RROutputInit (void)
|
||
int
|
||
ProcRRGetOutputInfo (ClientPtr client)
|
||
{
|
||
- REQUEST(xRRGetOutputInfoReq);;
|
||
+ REQUEST(xRRGetOutputInfoReq);
|
||
xRRGetOutputInfoReply rep;
|
||
RROutputPtr output;
|
||
CARD8 *extra;
|
||
diff --git a/randr/rrpointer.c b/randr/rrpointer.c
|
||
index 802dcb2..c88a0f8 100644
|
||
--- a/randr/rrpointer.c
|
||
+++ b/randr/rrpointer.c
|
||
@@ -103,7 +103,7 @@ void
|
||
RRPointerMoved (ScreenPtr pScreen, int x, int y)
|
||
{
|
||
rrScrPriv (pScreen);
|
||
- RRCrtcPtr pointerCrtc = pScrPriv->pointerCrtc;;
|
||
+ RRCrtcPtr pointerCrtc = pScrPriv->pointerCrtc;
|
||
int c;
|
||
|
||
/* Check last known CRTC */
|
||
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
|
||
index f2981b0..8798b42 100644
|
||
--- a/randr/rrscreen.c
|
||
+++ b/randr/rrscreen.c
|
||
@@ -116,11 +116,19 @@ RRDeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen)
|
||
|
||
se.sequenceNumber = client->sequence;
|
||
se.sizeID = RR10CurrentSizeID (pScreen);
|
||
-
|
||
- se.widthInPixels = pScreen->width;
|
||
- se.heightInPixels = pScreen->height;
|
||
- se.widthInMillimeters = pScreen->mmWidth;
|
||
- se.heightInMillimeters = pScreen->mmHeight;
|
||
+
|
||
+ if (se.rotation & (RR_Rotate_90 | RR_Rotate_270)) {
|
||
+ se.widthInPixels = pScreen->height;
|
||
+ se.heightInPixels = pScreen->width;
|
||
+ se.widthInMillimeters = pScreen->mmHeight;
|
||
+ se.heightInMillimeters = pScreen->mmWidth;
|
||
+ } else {
|
||
+ se.widthInPixels = pScreen->width;
|
||
+ se.heightInPixels = pScreen->height;
|
||
+ se.widthInMillimeters = pScreen->mmWidth;
|
||
+ se.heightInMillimeters = pScreen->mmHeight;
|
||
+ }
|
||
+
|
||
WriteEventsToClient (client, 1, (xEvent *) &se);
|
||
}
|
||
|
||
@@ -738,6 +738,7 @@ ProcRRSetScreenConfig (ClientPtr client)
|
||
int rate;
|
||
Bool has_rate;
|
||
RROutputPtr output;
|
||
+ RRCrtcPtr crtc;
|
||
RRModePtr mode;
|
||
RR10DataPtr pData = NULL;
|
||
RRScreenSizePtr pSize;
|
||
@@ -782,7 +784,9 @@ ProcRRSetScreenConfig (ClientPtr client)
|
||
rep.status = RRSetConfigFailed;
|
||
goto sendReply;
|
||
}
|
||
-
|
||
+
|
||
+ crtc = output->crtc;
|
||
+
|
||
/*
|
||
* if the client's config timestamp is not the same as the last config
|
||
* timestamp, then the config information isn't up-to-date and
|
||
@@ -830,7 +834,7 @@ ProcRRSetScreenConfig (ClientPtr client)
|
||
return BadValue;
|
||
}
|
||
|
||
- if ((~output->crtc->rotations) & rotation)
|
||
+ if ((~crtc->rotations) & rotation)
|
||
{
|
||
/*
|
||
* requested rotation or reflection not supported by screen
|
||
@@ -913,7 +917,7 @@ ProcRRSetScreenConfig (ClientPtr client)
|
||
}
|
||
}
|
||
|
||
- if (!RRCrtcSet (output->crtc, mode, 0, 0, stuff->rotation, 1, &output))
|
||
+ if (!RRCrtcSet (crtc, mode, 0, 0, stuff->rotation, 1, &output))
|
||
rep.status = RRSetConfigFailed;
|
||
else
|
||
rep.status = RRSetConfigSuccess;
|
||
diff --git a/randr/rrxinerama.c b/randr/rrxinerama.c
|
||
index 63a34b5..2a57e4e 100644
|
||
--- a/randr/rrxinerama.c
|
||
+++ b/randr/rrxinerama.c
|
||
@@ -425,6 +428,14 @@ RRXineramaExtensionInit(void)
|
||
return;
|
||
#endif
|
||
|
||
+ /*
|
||
+ * Xinerama isn't capable enough to have multiple protocol screens each
|
||
+ * with their own output geometry. So if there's more than one protocol
|
||
+ * screen, just don't even try.
|
||
+ */
|
||
+ if (screenInfo.numScreens > 1)
|
||
+ return;
|
||
+
|
||
(void) AddExtension(PANORAMIX_PROTOCOL_NAME, 0,0,
|
||
ProcRRXineramaDispatch,
|
||
SProcRRXineramaDispatch,
|