From bfeda3bfc59d309772398f688d29452ba97f3973 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 15 Jan 2007 08:05:32 +1100 Subject: [PATCH 01/35] Convert I830PipeSetMode to xf86CrtcSetMode. Add rotation structures. Makes the mode setting logic device independent. Magic rename hooks allow multiple drivers to provide the generic code without name conflicts. Rotation code requires special pixmap creation hook, and uses Render to perform the actual rotation. --- src/Makefile.am | 1 + src/i830_crt.c | 2 +- src/i830_display.c | 208 ++++---------------------- src/i830_display.h | 6 +- src/i830_driver.c | 43 +----- src/i830_lvds.c | 6 +- src/i830_modes.c | 6 +- src/i830_randr.c | 6 +- src/i830_tv.c | 2 +- src/i830_xf86Crtc.c | 305 ++++++++++++++++++++++++++++---------- src/i830_xf86Crtc.h | 60 +++++++- src/i830_xf86Modes.c | 22 +-- src/i830_xf86Modes.h | 69 ++++----- src/i830_xf86Rename.h | 66 +++++++++ src/i830_xf86Rotate.c | 324 +++++++++++++++++++++++++++++++++++++++++ src/local_xf86Rename.h | 23 +++ 16 files changed, 784 insertions(+), 365 deletions(-) create mode 100644 src/i830_xf86Rename.h create mode 100644 src/i830_xf86Rotate.c create mode 100644 src/local_xf86Rename.h diff --git a/src/Makefile.am b/src/Makefile.am index 80cea10a..02e85768 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -85,6 +85,7 @@ i810_drv_la_SOURCES = \ i830_xf86cvt.c \ i830_xf86Crtc.h \ i830_xf86Crtc.c \ + i830_xf86Rotate.c \ i915_3d.c \ i915_3d.h \ i915_reg.h \ diff --git a/src/i830_crt.c b/src/i830_crt.c index 4e9e3706..00e637ad 100644 --- a/src/i830_crt.c +++ b/src/i830_crt.c @@ -314,7 +314,7 @@ i830_crt_detect(xf86OutputPtr output) if (intel_output->load_detect_temp) { xf86SetModeCrtc (&mode, INTERLACE_HALVE_V); - i830PipeSetMode (crtc, &mode, FALSE); + xf86CrtcSetMode (crtc, &mode, RR_Rotate_0); } connected = i830_crt_detect_load (crtc, output); diff --git a/src/i830_display.c b/src/i830_display.c index f47a9dbf..d80eb4e0 100644 --- a/src/i830_display.c +++ b/src/i830_display.c @@ -464,23 +464,6 @@ i830PipeFindClosestMode(xf86CrtcPtr crtc, DisplayModePtr pMode) return pMode; } -/** - * Return whether any outputs are connected to the specified pipe - */ - -Bool -i830PipeInUse (xf86CrtcPtr crtc) -{ - ScrnInfoPtr pScrn = crtc->scrn; - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - int i; - - for (i = 0; i < xf86_config->num_output; i++) - if (xf86_config->output[i]->crtc == crtc) - return TRUE; - return FALSE; -} - /** * Sets the power management mode of the pipe and plane. * @@ -580,6 +563,27 @@ i830_crtc_dpms(xf86CrtcPtr crtc, int mode) } } +static Bool +i830_crtc_lock (xf86CrtcPtr crtc) +{ + /* Sync the engine before mode switch */ + i830WaitSync(crtc->scrn); + +#ifdef XF86DRI + return I830DRILock(crtc->scrn); +#else + return FALSE; +#endif +} + +static void +i830_crtc_unlock (xf86CrtcPtr crtc) +{ +#ifdef XF86DRI + I830DRIUnlock (crtc->scrn); +#endif +} + static Bool i830_crtc_mode_fixup(xf86CrtcPtr crtc, DisplayModePtr mode, DisplayModePtr adjusted_mode) @@ -880,166 +884,12 @@ i830_crtc_gamma_set(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue, i830_crtc_load_lut(crtc); } -/** - * Sets the given video mode on the given pipe. - * - * Plane A is always output to pipe A, and plane B to pipe B. The plane - * will not be enabled if plane_enable is FALSE, which is used for - * load detection, when something else will be output to the pipe other than - * display data. - */ -Bool -i830PipeSetMode(xf86CrtcPtr crtc, DisplayModePtr pMode, - Bool plane_enable) -{ - ScrnInfoPtr pScrn = crtc->scrn; - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - int i; - Bool ret = FALSE; -#ifdef XF86DRI - Bool didLock = FALSE; -#endif - DisplayModePtr adjusted_mode; - - /* XXX: curMode */ - - adjusted_mode = xf86DuplicateMode(pMode); - - crtc->enabled = i830PipeInUse (crtc); - - if (!crtc->enabled) - { - /* XXX disable crtc? */ - return TRUE; - } - -#ifdef XF86DRI - didLock = I830DRILock(pScrn); -#endif - - /* Pass our mode to the outputs and the CRTC to give them a chance to - * adjust it according to limitations or output properties, and also - * a chance to reject the mode entirely. - */ - for (i = 0; i < xf86_config->num_output; i++) { - xf86OutputPtr output = xf86_config->output[i]; - - if (output->crtc != crtc) - continue; - - if (!output->funcs->mode_fixup(output, pMode, adjusted_mode)) { - ret = FALSE; - goto done; - } - } - - if (!crtc->funcs->mode_fixup(crtc, pMode, adjusted_mode)) { - ret = FALSE; - goto done; - } - - /* Disable the outputs and CRTCs before setting the mode. */ - for (i = 0; i < xf86_config->num_output; i++) { - xf86OutputPtr output = xf86_config->output[i]; - - if (output->crtc != crtc) - continue; - - /* Disable the output as the first thing we do. */ - output->funcs->dpms(output, DPMSModeOff); - } - - crtc->funcs->dpms(crtc, DPMSModeOff); - - /* Set up the DPLL and any output state that needs to adjust or depend - * on the DPLL. - */ - crtc->funcs->mode_set(crtc, pMode, adjusted_mode); - for (i = 0; i < xf86_config->num_output; i++) { - xf86OutputPtr output = xf86_config->output[i]; - if (output->crtc == crtc) - output->funcs->mode_set(output, pMode, adjusted_mode); - } - - /* Now, enable the clocks, plane, pipe, and outputs that we set up. */ - crtc->funcs->dpms(crtc, DPMSModeOn); - for (i = 0; i < xf86_config->num_output; i++) { - xf86OutputPtr output = xf86_config->output[i]; - if (output->crtc == crtc) - output->funcs->dpms(output, DPMSModeOn); - } - -#if 0 - /* - * If the display isn't solid, it may be running out - * of memory bandwidth. This code will dump out the - * pipe status, if bit 31 is on, the fifo underran - */ - for (i = 0; i < 4; i++) { - i830WaitForVblank(pScrn); - - OUTREG(pipestat_reg, INREG(pipestat_reg) | 0x80000000); - - i830WaitForVblank(pScrn); - - temp = INREG(pipestat_reg); - ErrorF ("pipe status 0x%x\n", temp); - } -#endif - - crtc->curMode = *pMode; - - /* XXX free adjustedmode */ - ret = TRUE; -done: -#ifdef XF86DRI - if (didLock) - I830DRIUnlock(pScrn); -#endif - return ret; -} - -void -i830DisableUnusedFunctions(ScrnInfoPtr pScrn) -{ - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - int o, pipe; - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Disabling unused functions\n"); - - for (o = 0; o < xf86_config->num_output; o++) - { - xf86OutputPtr output = xf86_config->output[o]; - if (!output->crtc) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Disabling output %s\n", - output->name); - (*output->funcs->dpms)(output, DPMSModeOff); - } - } - - for (pipe = 0; pipe < xf86_config->num_crtc; pipe++) - { - xf86CrtcPtr crtc = xf86_config->crtc[pipe]; - I830CrtcPrivatePtr intel_crtc = crtc->driver_private; - int pipe = intel_crtc->pipe; - char *pipe_name = pipe == 0 ? "A" : "B"; - - if (!crtc->enabled) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Disabling CRTC %s\n", - pipe_name); - crtc->funcs->dpms(crtc, DPMSModeOff); - - memset(&crtc->curMode, 0, sizeof(crtc->curMode)); - } - } -} - /** * This function configures the screens in clone mode on * all active outputs using a mode similar to the specified mode. */ Bool -i830SetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode) +i830SetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode, Rotation rotation) { xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); Bool ok = TRUE; @@ -1049,9 +899,9 @@ i830SetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode) if (crtc && crtc->enabled) { - ok = i830PipeSetMode(crtc, - i830PipeFindClosestMode(crtc, pMode), - TRUE); + ok = xf86CrtcSetMode(crtc, + i830PipeFindClosestMode(crtc, pMode), + rotation); if (!ok) goto done; crtc->desiredMode = *pMode; @@ -1061,7 +911,7 @@ i830SetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode) (int)(pMode->HDisplay * pMode->VDisplay * pMode->VRefresh / 1000000)); - i830DisableUnusedFunctions(pScrn); + xf86DisableUnusedFunctions(pScrn); i830DescribeOutputConfiguration(pScrn); @@ -1153,7 +1003,7 @@ i830GetLoadDetectPipe(xf86OutputPtr output) return output->crtc; for (i = 0; i < xf86_config->num_crtc; i++) - if (!i830PipeInUse(xf86_config->crtc[i])) + if (!xf86CrtcInUse (xf86_config->crtc[i])) break; if (i == xf86_config->num_crtc) @@ -1177,7 +1027,7 @@ i830ReleaseLoadDetectPipe(xf86OutputPtr output) { output->crtc = NULL; intel_output->load_detect_temp = FALSE; - i830DisableUnusedFunctions(pScrn); + xf86DisableUnusedFunctions(pScrn); } } @@ -1185,6 +1035,8 @@ static const xf86CrtcFuncsRec i830_crtc_funcs = { .dpms = i830_crtc_dpms, .save = NULL, /* XXX */ .restore = NULL, /* XXX */ + .lock = i830_crtc_lock, + .unlock = i830_crtc_unlock, .mode_fixup = i830_crtc_mode_fixup, .mode_set = i830_crtc_mode_set, .gamma_set = i830_crtc_gamma_set, diff --git a/src/i830_display.h b/src/i830_display.h index 66ab17e8..dc800553 100644 --- a/src/i830_display.h +++ b/src/i830_display.h @@ -30,16 +30,12 @@ /* i830_display.c */ DisplayModePtr i830PipeFindClosestMode(xf86CrtcPtr crtc, DisplayModePtr pMode); -Bool i830PipeSetMode(xf86CrtcPtr crtc, DisplayModePtr pMode, - Bool plane_enable); -void i830DisableUnusedFunctions(ScrnInfoPtr pScrn); -Bool i830SetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode); +Bool i830SetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode, Rotation rotation); void i830PipeSetBase(xf86CrtcPtr crtc, int x, int y); void i830WaitForVblank(ScrnInfoPtr pScrn); void i830DescribeOutputConfiguration(ScrnInfoPtr pScrn); xf86CrtcPtr i830GetLoadDetectPipe(xf86OutputPtr output); void i830ReleaseLoadDetectPipe(xf86OutputPtr output); -Bool i830PipeInUse(xf86CrtcPtr crtc); void i830_crtc_init(ScrnInfoPtr pScrn, int pipe); void i830_crtc_load_lut(xf86CrtcPtr crtc); diff --git a/src/i830_driver.c b/src/i830_driver.c index 29927985..daa5a3b2 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -3131,7 +3131,7 @@ I830EnterVT(int scrnIndex, int flags) ResetState(pScrn, FALSE); SetHWOperatingState(pScrn); - i830DisableUnusedFunctions(pScrn); + xf86DisableUnusedFunctions(pScrn); for (i = 0; i < xf86_config->num_crtc; i++) { @@ -3140,9 +3140,12 @@ I830EnterVT(int scrnIndex, int flags) /* Mark that we'll need to re-set the mode for sure */ memset(&crtc->curMode, 0, sizeof(crtc->curMode)); if (!crtc->desiredMode.CrtcHDisplay) + { crtc->desiredMode = *i830PipeFindClosestMode (crtc, pScrn->currentMode); + crtc->desiredRotation = RR_Rotate_0; + } - if (!i830PipeSetMode (crtc, &crtc->desiredMode, TRUE)) + if (!xf86CrtcSetMode (crtc, &crtc->desiredMode, crtc->desiredRotation)) return FALSE; } @@ -3223,45 +3226,11 @@ I830SwitchMode(int scrnIndex, DisplayModePtr mode, int flags) ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; I830Ptr pI830 = I830PTR(pScrn); Bool ret = TRUE; - PixmapPtr pspix = (*pScrn->pScreen->GetScreenPixmap) (pScrn->pScreen); DPRINTF(PFX, "I830SwitchMode: mode == %p\n", mode); - /* Sync the engine before mode switch */ - i830WaitSync(pScrn); - - /* Check if our currentmode is about to change. We do this so if we - * are rotating, we don't need to call the mode setup again. - */ - if (pI830->currentMode != mode) { - if (!i830SetMode(pScrn, mode)) - ret = FALSE; - } - - /* Kludge to detect Rotate or Vidmode switch. Not very elegant, but - * workable given the implementation currently. We only need to call - * the rotation function when we know that the framebuffer has been - * disabled by the EnableDisableFBAccess() function. - * - * The extra WindowTable check detects a rotation at startup. - */ - if ( (!WindowTable[pScrn->scrnIndex] || pspix->devPrivate.ptr == NULL) && - !pI830->DGAactive && (pScrn->PointerMoved == I830PointerMoved)) { - if (!I830Rotate(pScrn, mode)) - ret = FALSE; - } - - /* Either the original setmode or rotation failed, so restore the previous - * video mode here, as we'll have already re-instated the original rotation. - */ - if (!ret) { - if (!i830SetMode(pScrn, pI830->currentMode)) { - xf86DrvMsg(scrnIndex, X_INFO, - "Failed to restore previous mode (SwitchMode)\n"); - } - } else { + if (!i830SetMode(pScrn, mode, pI830->rotation)) pI830->currentMode = mode; - } return ret; } diff --git a/src/i830_lvds.c b/src/i830_lvds.c index 18ac76bf..8abd4020 100644 --- a/src/i830_lvds.c +++ b/src/i830_lvds.c @@ -254,10 +254,10 @@ i830_lvds_get_modes(xf86OutputPtr output) xf86MonPtr edid_mon; DisplayModePtr modes; - edid_mon = i830_xf86OutputGetEDID (output, intel_output->pDDCBus); - i830_xf86OutputSetEDID (output, edid_mon); + edid_mon = xf86OutputGetEDID (output, intel_output->pDDCBus); + xf86OutputSetEDID (output, edid_mon); - modes = i830_xf86OutputGetEDIDModes (output); + modes = xf86OutputGetEDIDModes (output); if (modes != NULL) return modes; diff --git a/src/i830_modes.c b/src/i830_modes.c index b4e22c35..405dcc61 100644 --- a/src/i830_modes.c +++ b/src/i830_modes.c @@ -62,9 +62,9 @@ i830_ddc_get_modes (xf86OutputPtr output) xf86MonPtr edid_mon; DisplayModePtr modes; - edid_mon = i830_xf86OutputGetEDID (output, intel_output->pDDCBus); - i830_xf86OutputSetEDID (output, edid_mon); + edid_mon = xf86OutputGetEDID (output, intel_output->pDDCBus); + xf86OutputSetEDID (output, edid_mon); - modes = i830_xf86OutputGetEDIDModes (output); + modes = xf86OutputGetEDIDModes (output); return modes; } diff --git a/src/i830_randr.c b/src/i830_randr.c index 533322b2..d6df4190 100644 --- a/src/i830_randr.c +++ b/src/i830_randr.c @@ -541,7 +541,7 @@ xf86RandR12CrtcNotify (RRCrtcPtr randr_crtc) return FALSE; x = crtc->x; y = crtc->y; - rotation = RR_Rotate_0; + rotation = crtc->curRotation; numOutputs = 0; randr_mode = NULL; for (i = 0; i < config->num_output; i++) @@ -638,7 +638,7 @@ xf86RandR12CrtcSet (ScreenPtr pScreen, if (mode) { - if (!i830PipeSetMode (crtc, mode, TRUE)) + if (!xf86CrtcSetMode (crtc, mode, rotation)) { crtc->enabled = save_enabled; for (o = 0; o < config->num_output; o++) @@ -651,7 +651,7 @@ xf86RandR12CrtcSet (ScreenPtr pScreen, } crtc->desiredMode = *mode; } - i830DisableUnusedFunctions (pScrn); + xf86DisableUnusedFunctions (pScrn); i830DumpRegs(pScrn); } diff --git a/src/i830_tv.c b/src/i830_tv.c index 92e417e0..a76cbffa 100644 --- a/src/i830_tv.c +++ b/src/i830_tv.c @@ -1065,7 +1065,7 @@ i830_tv_detect(xf86OutputPtr output) /* we only need the pixel clock set correctly here */ mode = reported_modes[0]; xf86SetModeCrtc (&mode, INTERLACE_HALVE_V); - i830PipeSetMode (crtc, &mode, FALSE); + xf86CrtcSetMode (crtc, &mode, RR_Rotate_0); } i830_tv_detect_type (crtc, output); i830ReleaseLoadDetectPipe (output); diff --git a/src/i830_xf86Crtc.c b/src/i830_xf86Crtc.c index ceb8f2ef..5eb55e96 100644 --- a/src/i830_xf86Crtc.c +++ b/src/i830_xf86Crtc.c @@ -87,6 +87,8 @@ xf86CrtcCreate (ScrnInfoPtr scrn, #ifdef RANDR_12_INTERFACE crtc->randr_crtc = NULL; #endif + crtc->curRotation = RR_Rotate_0; + crtc->desiredRotation = RR_Rotate_0; if (xf86_config->crtc) crtcs = xrealloc (xf86_config->crtc, (xf86_config->num_crtc + 1) * sizeof (xf86CrtcPtr)); @@ -121,6 +123,122 @@ xf86CrtcDestroy (xf86CrtcPtr crtc) xfree (crtc); } + +/** + * Return whether any outputs are connected to the specified pipe + */ + +Bool +xf86CrtcInUse (xf86CrtcPtr crtc) +{ + ScrnInfoPtr pScrn = crtc->scrn; + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + int o; + + for (o = 0; o < xf86_config->num_output; o++) + if (xf86_config->output[o]->crtc == crtc) + return TRUE; + return FALSE; +} + +/** + * Sets the given video mode on the given crtc + */ +Bool +xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) +{ + ScrnInfoPtr scrn = crtc->scrn; + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); + int i; + Bool ret = FALSE; + Bool didLock = FALSE; + DisplayModePtr adjusted_mode; + + adjusted_mode = xf86DuplicateMode(mode); + + crtc->enabled = xf86CrtcInUse (crtc); + + if (!crtc->enabled) + { + /* XXX disable crtc? */ + return TRUE; + } + + didLock = crtc->funcs->lock (crtc); + + /* Pass our mode to the outputs and the CRTC to give them a chance to + * adjust it according to limitations or output properties, and also + * a chance to reject the mode entirely. + */ + for (i = 0; i < xf86_config->num_output; i++) { + xf86OutputPtr output = xf86_config->output[i]; + + if (output->crtc != crtc) + continue; + + if (!output->funcs->mode_fixup(output, mode, adjusted_mode)) { + ret = FALSE; + goto done; + } + } + + if (!crtc->funcs->mode_fixup(crtc, mode, adjusted_mode)) { + ret = FALSE; + goto done; + } + +#if 0 + if (!xf86CrtcRotate (crtc, mode, rotation)) + { + ret = FALSE; + goto done; + } +#endif + + /* Disable the outputs and CRTCs before setting the mode. */ + for (i = 0; i < xf86_config->num_output; i++) { + xf86OutputPtr output = xf86_config->output[i]; + + if (output->crtc != crtc) + continue; + + /* Disable the output as the first thing we do. */ + output->funcs->dpms(output, DPMSModeOff); + } + + crtc->funcs->dpms(crtc, DPMSModeOff); + + /* Set up the DPLL and any output state that needs to adjust or depend + * on the DPLL. + */ + crtc->funcs->mode_set(crtc, mode, adjusted_mode); + for (i = 0; i < xf86_config->num_output; i++) + { + xf86OutputPtr output = xf86_config->output[i]; + if (output->crtc == crtc) + output->funcs->mode_set(output, mode, adjusted_mode); + } + + /* Now, enable the clocks, plane, pipe, and outputs that we set up. */ + crtc->funcs->dpms(crtc, DPMSModeOn); + for (i = 0; i < xf86_config->num_output; i++) + { + xf86OutputPtr output = xf86_config->output[i]; + if (output->crtc == crtc) + output->funcs->dpms(output, DPMSModeOn); + } + + crtc->curMode = *mode; + + /* XXX free adjustedmode */ + ret = TRUE; +done: + if (didLock) + crtc->funcs->unlock (crtc); + + return ret; +} + /* * Output functions */ @@ -362,14 +480,14 @@ xf86OutputHasPreferredMode (xf86OutputPtr output, int width, int height) } static int -xf86PickCrtcs (ScrnInfoPtr pScrn, +xf86PickCrtcs (ScrnInfoPtr scrn, xf86CrtcPtr *best_crtcs, DisplayModePtr *modes, int n, int width, int height) { - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); int c, o, l; xf86OutputPtr output; xf86CrtcPtr crtc; @@ -388,7 +506,7 @@ xf86PickCrtcs (ScrnInfoPtr pScrn, */ best_crtcs[n] = NULL; best_crtc = NULL; - best_score = xf86PickCrtcs (pScrn, best_crtcs, modes, n+1, width, height); + best_score = xf86PickCrtcs (scrn, best_crtcs, modes, n+1, width, height); if (modes[n] == NULL) return best_score; @@ -442,7 +560,7 @@ xf86PickCrtcs (ScrnInfoPtr pScrn, } crtcs[n] = crtc; memcpy (crtcs, best_crtcs, n * sizeof (xf86CrtcPtr)); - score = my_score + xf86PickCrtcs (pScrn, crtcs, modes, n+1, width, height); + score = my_score + xf86PickCrtcs (scrn, crtcs, modes, n+1, width, height); if (score > best_score) { best_crtc = crtc; @@ -462,9 +580,9 @@ xf86PickCrtcs (ScrnInfoPtr pScrn, */ static void -xf86DefaultScreenLimits (ScrnInfoPtr pScrn, int *widthp, int *heightp) +xf86DefaultScreenLimits (ScrnInfoPtr scrn, int *widthp, int *heightp) { - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); int width = 0, height = 0; int o; int c; @@ -513,9 +631,9 @@ xf86DefaultScreenLimits (ScrnInfoPtr pScrn, int *widthp, int *heightp) #define POSITION_UNSET -100000 static Bool -xf86InitialOutputPositions (ScrnInfoPtr pScrn, DisplayModePtr *modes) +xf86InitialOutputPositions (ScrnInfoPtr scrn, DisplayModePtr *modes) { - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); int o; int min_x, min_y; @@ -563,7 +681,7 @@ xf86InitialOutputPositions (ScrnInfoPtr pScrn, DisplayModePtr *modes) } else { - xf86DrvMsg (pScrn->scrnIndex, X_ERROR, + xf86DrvMsg (scrn->scrnIndex, X_ERROR, "Output %s position not of form \"x y\"\n", output->name); output->initial_x = output->initial_y = 0; @@ -606,7 +724,7 @@ xf86InitialOutputPositions (ScrnInfoPtr pScrn, DisplayModePtr *modes) } if (!relative) { - xf86DrvMsg (pScrn->scrnIndex, X_ERROR, + xf86DrvMsg (scrn->scrnIndex, X_ERROR, "Cannot position output %s relative to unknown output %s\n", output->name, relative_name); output->initial_x = 0; @@ -655,7 +773,7 @@ xf86InitialOutputPositions (ScrnInfoPtr pScrn, DisplayModePtr *modes) xf86OutputPtr output = config->output[o]; if (output->initial_x == POSITION_UNSET) { - xf86DrvMsg (pScrn->scrnIndex, X_ERROR, + xf86DrvMsg (scrn->scrnIndex, X_ERROR, "Output position loop. Moving %s to 0,0\n", output->name); output->initial_x = output->initial_y = 0; @@ -778,16 +896,16 @@ i830xf86SortModes (DisplayModePtr input) #define DEBUG_REPROBE 1 void -xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY) +xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) { - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); int o; if (maxX == 0 || maxY == 0) - xf86RandR12GetOriginalVirtualSize (pScrn, &maxX, &maxY); + xf86RandR12GetOriginalVirtualSize (scrn, &maxX, &maxY); /* Elide duplicate modes before defaulting code uses them */ - xf86PruneDuplicateMonitorModes (pScrn->monitor); + xf86PruneDuplicateMonitorModes (scrn->monitor); /* Probe the list of modes for each output. */ for (o = 0; o < config->num_output; o++) @@ -837,7 +955,7 @@ xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY) mon_rec.nVrefresh++; sync_source = sync_config; } - config_modes = i830xf86GetMonitorModes (pScrn, conf_monitor); + config_modes = xf86GetMonitorModes (scrn, conf_monitor); } output_modes = (*output->funcs->get_modes) (output); @@ -901,27 +1019,27 @@ xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY) mon_rec.vrefresh[0].hi = 62.0; mon_rec.nVrefresh = 1; } - default_modes = i830xf86GetDefaultModes (output->interlaceAllowed, - output->doubleScanAllowed); + default_modes = xf86GetDefaultModes (output->interlaceAllowed, + output->doubleScanAllowed); if (sync_source == sync_config) { /* * Check output and config modes against sync range from config file */ - i830xf86ValidateModesSync (pScrn, output_modes, &mon_rec); - i830xf86ValidateModesSync (pScrn, config_modes, &mon_rec); + xf86ValidateModesSync (scrn, output_modes, &mon_rec); + xf86ValidateModesSync (scrn, config_modes, &mon_rec); } /* * Check default modes against sync range */ - i830xf86ValidateModesSync (pScrn, default_modes, &mon_rec); + xf86ValidateModesSync (scrn, default_modes, &mon_rec); /* * Check default modes against monitor max clock */ if (max_clock) - i830xf86ValidateModesClocks(pScrn, default_modes, - &min_clock, &max_clock, 1); + xf86ValidateModesClocks(scrn, default_modes, + &min_clock, &max_clock, 1); output->probed_modes = NULL; output->probed_modes = xf86ModesAdd (output->probed_modes, config_modes); @@ -932,7 +1050,7 @@ xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY) * Check all modes against max size */ if (maxX && maxY) - i830xf86ValidateModesSize (pScrn, output->probed_modes, + xf86ValidateModesSize (scrn, output->probed_modes, maxX, maxY, 0); /* @@ -942,7 +1060,7 @@ xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY) if (mode->status == MODE_OK) mode->status = (*output->funcs->mode_valid)(output, mode); - i830xf86PruneInvalidModes(pScrn, &output->probed_modes, TRUE); + xf86PruneInvalidModes(scrn, &output->probed_modes, TRUE); output->probed_modes = i830xf86SortModes (output->probed_modes); @@ -975,11 +1093,11 @@ xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY) #ifdef DEBUG_REPROBE if (output->probed_modes != NULL) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, + xf86DrvMsg(scrn->scrnIndex, X_INFO, "Printing probed modes for output %s\n", output->name); } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, + xf86DrvMsg(scrn->scrnIndex, X_INFO, "No remaining probed modes for output %s\n", output->name); } @@ -993,7 +1111,7 @@ xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY) xf86SetModeCrtc(mode, INTERLACE_HALVE_V); #ifdef DEBUG_REPROBE - xf86PrintModeline(pScrn->scrnIndex, mode); + xf86PrintModeline(scrn->scrnIndex, mode); #endif } } @@ -1006,12 +1124,12 @@ xf86ProbeOutputModes (ScrnInfoPtr pScrn, int maxX, int maxY) /* XXX where does this function belong? Here? */ void -xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr pScrn, int *x, int *y); +xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr scrn, int *x, int *y); void -xf86SetScrnInfoModes (ScrnInfoPtr pScrn) +xf86SetScrnInfoModes (ScrnInfoPtr scrn) { - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); xf86OutputPtr output; xf86CrtcPtr crtc; DisplayModePtr last, mode; @@ -1035,31 +1153,31 @@ xf86SetScrnInfoModes (ScrnInfoPtr pScrn) } crtc = output->crtc; - /* Clear any existing modes from pScrn->modes */ - while (pScrn->modes != NULL) - xf86DeleteMode(&pScrn->modes, pScrn->modes); + /* Clear any existing modes from scrn->modes */ + while (scrn->modes != NULL) + xf86DeleteMode(&scrn->modes, scrn->modes); - /* Set pScrn->modes to the mode list for the 'compat' output */ - pScrn->modes = xf86DuplicateModes(pScrn, output->probed_modes); + /* Set scrn->modes to the mode list for the 'compat' output */ + scrn->modes = xf86DuplicateModes(scrn, output->probed_modes); - for (mode = pScrn->modes; mode; mode = mode->next) + for (mode = scrn->modes; mode; mode = mode->next) if (xf86ModesEqual (mode, &crtc->desiredMode)) break; - if (pScrn->modes != NULL) { - /* For some reason, pScrn->modes is circular, unlike the other mode + if (scrn->modes != NULL) { + /* For some reason, scrn->modes is circular, unlike the other mode * lists. How great is that? */ - for (last = pScrn->modes; last && last->next; last = last->next) + for (last = scrn->modes; last && last->next; last = last->next) ; - last->next = pScrn->modes; - pScrn->modes->prev = last; + last->next = scrn->modes; + scrn->modes->prev = last; if (mode) { - while (pScrn->modes != mode) - pScrn->modes = pScrn->modes->next; + while (scrn->modes != mode) + scrn->modes = scrn->modes->next; } } - pScrn->currentMode = pScrn->modes; + scrn->currentMode = scrn->modes; } /** @@ -1070,9 +1188,9 @@ xf86SetScrnInfoModes (ScrnInfoPtr pScrn) */ Bool -xf86InitialConfiguration (ScrnInfoPtr pScrn) +xf86InitialConfiguration (ScrnInfoPtr scrn) { - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); int o, c; DisplayModePtr target_mode = NULL; xf86CrtcPtr *crtcs; @@ -1081,16 +1199,16 @@ xf86InitialConfiguration (ScrnInfoPtr pScrn) int width; int height; - if (pScrn->display->virtualX) - width = pScrn->display->virtualX; + if (scrn->display->virtualX) + width = scrn->display->virtualX; else width = config->maxWidth; - if (pScrn->display->virtualY) - height = pScrn->display->virtualY; + if (scrn->display->virtualY) + height = scrn->display->virtualY; else height = config->maxHeight; - xf86ProbeOutputModes (pScrn, width, height); + xf86ProbeOutputModes (scrn, width, height); crtcs = xnfcalloc (config->num_output, sizeof (xf86CrtcPtr)); modes = xnfcalloc (config->num_output, sizeof (DisplayModePtr)); @@ -1152,7 +1270,7 @@ xf86InitialConfiguration (ScrnInfoPtr pScrn) /* * Set the position of each output */ - if (!xf86InitialOutputPositions (pScrn, modes)) + if (!xf86InitialOutputPositions (scrn, modes)) { xfree (crtcs); xfree (modes); @@ -1162,7 +1280,7 @@ xf86InitialConfiguration (ScrnInfoPtr pScrn) /* * Assign CRTCs to fit output configuration */ - if (!xf86PickCrtcs (pScrn, crtcs, modes, 0, width, height)) + if (!xf86PickCrtcs (scrn, crtcs, modes, 0, width, height)) { xfree (crtcs); xfree (modes); @@ -1171,8 +1289,8 @@ xf86InitialConfiguration (ScrnInfoPtr pScrn) /* XXX override xf86 common frame computation code */ - pScrn->display->frameX0 = 0; - pScrn->display->frameY0 = 0; + scrn->display->frameX0 = 0; + scrn->display->frameY0 = 0; for (c = 0; c < config->num_crtc; c++) { @@ -1201,24 +1319,24 @@ xf86InitialConfiguration (ScrnInfoPtr pScrn) } } - if (pScrn->display->virtualX == 0) + if (scrn->display->virtualX == 0) { /* * Expand virtual size to cover potential mode switches */ - xf86DefaultScreenLimits (pScrn, &width, &height); + xf86DefaultScreenLimits (scrn, &width, &height); - pScrn->display->virtualX = width; - pScrn->display->virtualY = height; + scrn->display->virtualX = width; + scrn->display->virtualY = height; } - if (width > pScrn->virtualX) - pScrn->virtualX = width; - if (height > pScrn->virtualY) - pScrn->virtualY = height; + if (width > scrn->virtualX) + scrn->virtualX = width; + if (height > scrn->virtualY) + scrn->virtualY = height; - /* Mirror output modes to pScrn mode list */ - xf86SetScrnInfoModes (pScrn); + /* Mirror output modes to scrn mode list */ + xf86SetScrnInfoModes (scrn); xfree (crtcs); xfree (modes); @@ -1232,9 +1350,9 @@ xf86InitialConfiguration (ScrnInfoPtr pScrn) * Otherwise, it will affect CRTCs before outputs. */ void -xf86DPMSSet(ScrnInfoPtr pScrn, int mode, int flags) +xf86DPMSSet(ScrnInfoPtr scrn, int mode, int flags) { - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); int i; if (mode == DPMSModeOff) { @@ -1260,6 +1378,35 @@ xf86DPMSSet(ScrnInfoPtr pScrn, int mode, int flags) } } +/** + * Disable all inactive crtcs and outputs + */ +void +xf86DisableUnusedFunctions(ScrnInfoPtr pScrn) +{ + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + int o, c; + + for (o = 0; o < xf86_config->num_output; o++) + { + xf86OutputPtr output = xf86_config->output[o]; + if (!output->crtc) + (*output->funcs->dpms)(output, DPMSModeOff); + } + + for (c = 0; c < xf86_config->num_crtc; c++) + { + xf86CrtcPtr crtc = xf86_config->crtc[c]; + + if (!crtc->enabled) + { + crtc->funcs->dpms(crtc, DPMSModeOff); + memset(&crtc->curMode, 0, sizeof(crtc->curMode)); + } + } +} + + #ifdef RANDR_12_INTERFACE #define EDID_ATOM_NAME "EDID_DATA" @@ -1290,10 +1437,10 @@ xf86OutputSetEDIDProperty (xf86OutputPtr output, void *data, int data_len) * Set the EDID information for the specified output */ void -i830_xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon) +xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon) { - ScrnInfoPtr pScrn = output->scrn; - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + ScrnInfoPtr scrn = output->scrn; + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); int i; #ifdef RANDR_12_INTERFACE int size; @@ -1305,12 +1452,12 @@ i830_xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon) output->MonInfo = edid_mon; /* Debug info for now, at least */ - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "EDID for output %s\n", output->name); + 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(pScrn, edid_mon); + xf86SetDDCproperties(scrn, edid_mon); #ifdef RANDR_12_INTERFACE /* Set the RandR output properties */ @@ -1354,20 +1501,20 @@ i830_xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon) * stored in 'output' */ DisplayModePtr -i830_xf86OutputGetEDIDModes (xf86OutputPtr output) +xf86OutputGetEDIDModes (xf86OutputPtr output) { - ScrnInfoPtr pScrn = output->scrn; + ScrnInfoPtr scrn = output->scrn; xf86MonPtr edid_mon = output->MonInfo; if (!edid_mon) return NULL; - return xf86DDCGetModes(pScrn->scrnIndex, edid_mon); + return xf86DDCGetModes(scrn->scrnIndex, edid_mon); } xf86MonPtr -i830_xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus) +xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus) { - ScrnInfoPtr pScrn = output->scrn; + ScrnInfoPtr scrn = output->scrn; - return xf86DoEDID_DDC2 (pScrn->scrnIndex, pDDCBus); + return xf86DoEDID_DDC2 (scrn->scrnIndex, pDDCBus); } diff --git a/src/i830_xf86Crtc.h b/src/i830_xf86Crtc.h index 8fea162e..e72dda63 100644 --- a/src/i830_xf86Crtc.h +++ b/src/i830_xf86Crtc.h @@ -24,8 +24,10 @@ #include #include "randrstr.h" +#include "i830_xf86Rename.h" #include "i830_xf86Modes.h" #include "xf86Parser.h" +#include "damage.h" /* Compat definitions for older X Servers. */ #ifndef M_T_PREFERRED @@ -69,6 +71,19 @@ typedef struct _xf86CrtcFuncs { (*restore)(xf86CrtcPtr crtc); + /** + * Lock CRTC prior to mode setting, mostly for DRI. + * Returns whether unlock is needed + */ + Bool + (*lock) (xf86CrtcPtr crtc); + + /** + * Unlock CRTC after mode setting, mostly for DRI + */ + void + (*unlock) (xf86CrtcPtr crtc); + /** * Callback to adjust the mode to be set in the CRTC. * @@ -94,6 +109,18 @@ typedef struct _xf86CrtcFuncs { (*gamma_set)(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue, int size); + /** + * Create shadow pixmap for rotation support + */ + PixmapPtr + (*shadow_create) (xf86CrtcPtr crtc, int width, int height); + + /** + * Destroy shadow pixmap + */ + void + (*shadow_destroy) (xf86CrtcPtr crtc, PixmapPtr pPixmap); + /** * Clean up driver-specific bits of the crtc */ @@ -135,6 +162,8 @@ struct _xf86Crtc { * during server startup */ DisplayModeRec curMode; + Rotation curRotation; + PixmapPtr rotatedPixmap; /** * Desired mode @@ -145,6 +174,7 @@ struct _xf86Crtc { * on VT switch. */ DisplayModeRec desiredMode; + Rotation desiredRotation; /** crtc-specific functions */ const xf86CrtcFuncsRec *funcs; @@ -363,6 +393,9 @@ typedef struct _xf86CrtcConfig { int minWidth, minHeight; int maxWidth, maxHeight; + + /* For crtc-based rotation */ + DamagePtr rotationDamage; } xf86CrtcConfigRec, *xf86CrtcConfigPtr; extern int xf86CrtcConfigPrivateIndex; @@ -411,6 +444,24 @@ xf86AllocCrtc (xf86OutputPtr output); void xf86FreeCrtc (xf86CrtcPtr crtc); +/** + * Sets the given video mode on the given crtc + */ +Bool +xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation); + +/* + * Assign crtc rotation during mode set + */ +Bool +xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation); + +/** + * Return whether any output is assigned to the crtc + */ +Bool +xf86CrtcInUse (xf86CrtcPtr crtc); + /* * Output functions */ @@ -437,20 +488,23 @@ xf86InitialConfiguration (ScrnInfoPtr pScrn); void xf86DPMSSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags); +void +xf86DisableUnusedFunctions(ScrnInfoPtr pScrn); + /** * Set the EDID information for the specified output */ void -i830_xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon); +xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon); /** * Return the list of modes supported by the EDID information * stored in 'output' */ DisplayModePtr -i830_xf86OutputGetEDIDModes (xf86OutputPtr output); +xf86OutputGetEDIDModes (xf86OutputPtr output); xf86MonPtr -i830_xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus); +xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus); #endif /* _XF86CRTC_H_ */ diff --git a/src/i830_xf86Modes.c b/src/i830_xf86Modes.c index 482a3320..f37eaeb7 100644 --- a/src/i830_xf86Modes.c +++ b/src/i830_xf86Modes.c @@ -337,7 +337,7 @@ xf86PrintModeline(int scrnIndex,DisplayModePtr mode) * This is not in xf86Modes.c, but would be part of the proposed new API. */ void -i830xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList, +xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList, int flags) { DisplayModePtr mode; @@ -358,7 +358,7 @@ i830xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList, * This is not in xf86Modes.c, but would be part of the proposed new API. */ void -i830xf86ValidateModesSize(ScrnInfoPtr pScrn, DisplayModePtr modeList, +xf86ValidateModesSize(ScrnInfoPtr pScrn, DisplayModePtr modeList, int maxX, int maxY, int maxPitch) { DisplayModePtr mode; @@ -387,7 +387,7 @@ i830xf86ValidateModesSize(ScrnInfoPtr pScrn, DisplayModePtr modeList, * This is not in xf86Modes.c, but would be part of the proposed new API. */ void -i830xf86ValidateModesSync(ScrnInfoPtr pScrn, DisplayModePtr modeList, +xf86ValidateModesSync(ScrnInfoPtr pScrn, DisplayModePtr modeList, MonPtr mon) { DisplayModePtr mode; @@ -434,7 +434,7 @@ i830xf86ValidateModesSync(ScrnInfoPtr pScrn, DisplayModePtr modeList, * This is not in xf86Modes.c, but would be part of the proposed new API. */ void -i830xf86ValidateModesClocks(ScrnInfoPtr pScrn, DisplayModePtr modeList, +xf86ValidateModesClocks(ScrnInfoPtr pScrn, DisplayModePtr modeList, int *min, int *max, int n_ranges) { DisplayModePtr mode; @@ -468,7 +468,7 @@ i830xf86ValidateModesClocks(ScrnInfoPtr pScrn, DisplayModePtr modeList, * This is not in xf86Modes.c, but would be part of the proposed new API. */ void -i830xf86ValidateModesUserConfig(ScrnInfoPtr pScrn, DisplayModePtr modeList) +xf86ValidateModesUserConfig(ScrnInfoPtr pScrn, DisplayModePtr modeList) { DisplayModePtr mode; @@ -502,7 +502,7 @@ i830xf86ValidateModesUserConfig(ScrnInfoPtr pScrn, DisplayModePtr modeList) * This is not in xf86Modes.c, but would be part of the proposed new API. */ void -i830xf86PruneInvalidModes(ScrnInfoPtr pScrn, DisplayModePtr *modeList, +xf86PruneInvalidModes(ScrnInfoPtr pScrn, DisplayModePtr *modeList, Bool verbose) { DisplayModePtr mode; @@ -558,7 +558,7 @@ xf86ModesAdd(DisplayModePtr modes, DisplayModePtr new) * Build a mode list from a list of config file modes */ static DisplayModePtr -i830xf86GetConfigModes (XF86ConfModeLinePtr conf_mode) +xf86GetConfigModes (XF86ConfModeLinePtr conf_mode) { DisplayModePtr head = NULL, prev = NULL, mode; @@ -604,7 +604,7 @@ i830xf86GetConfigModes (XF86ConfModeLinePtr conf_mode) * Build a mode list from a monitor configuration */ DisplayModePtr -i830xf86GetMonitorModes (ScrnInfoPtr pScrn, XF86ConfMonitorPtr conf_monitor) +xf86GetMonitorModes (ScrnInfoPtr pScrn, XF86ConfMonitorPtr conf_monitor) { DisplayModePtr modes = NULL; XF86ConfModesLinkPtr modes_link; @@ -625,18 +625,18 @@ i830xf86GetMonitorModes (ScrnInfoPtr pScrn, XF86ConfMonitorPtr conf_monitor) xf86configptr->conf_modes_lst); if (modes_link->ml_modes) modes = xf86ModesAdd (modes, - i830xf86GetConfigModes (modes_link->ml_modes->mon_modeline_lst)); + xf86GetConfigModes (modes_link->ml_modes->mon_modeline_lst)); } return xf86ModesAdd (modes, - i830xf86GetConfigModes (conf_monitor->mon_modeline_lst)); + xf86GetConfigModes (conf_monitor->mon_modeline_lst)); } /** * Build a mode list containing all of the default modes */ DisplayModePtr -i830xf86GetDefaultModes (Bool interlaceAllowed, Bool doubleScanAllowed) +xf86GetDefaultModes (Bool interlaceAllowed, Bool doubleScanAllowed) { DisplayModePtr head = NULL, prev = NULL, mode; int i; diff --git a/src/i830_xf86Modes.h b/src/i830_xf86Modes.h index a7d0839d..d032199d 100644 --- a/src/i830_xf86Modes.h +++ b/src/i830_xf86Modes.h @@ -29,67 +29,54 @@ #define _I830_XF86MODES_H_ #include "xorgVersion.h" #include "xf86Parser.h" +#include "i830_xf86Rename.h" -#if XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(7,2,99,2,0) -double i830_xf86ModeHSync(DisplayModePtr mode); -double i830_xf86ModeVRefresh(DisplayModePtr mode); -DisplayModePtr i830_xf86DuplicateMode(DisplayModePtr pMode); -DisplayModePtr i830_xf86DuplicateModes(ScrnInfoPtr pScrn, +double xf86ModeHSync(DisplayModePtr mode); +double xf86ModeVRefresh(DisplayModePtr mode); +DisplayModePtr xf86DuplicateMode(DisplayModePtr pMode); +DisplayModePtr xf86DuplicateModes(ScrnInfoPtr pScrn, DisplayModePtr modeList); -void i830_xf86SetModeDefaultName(DisplayModePtr mode); -void i830_xf86SetModeCrtc(DisplayModePtr p, int adjustFlags); -Bool i830_xf86ModesEqual(DisplayModePtr pMode1, DisplayModePtr pMode2); -void i830_xf86PrintModeline(int scrnIndex,DisplayModePtr mode); -DisplayModePtr i830_xf86ModesAdd(DisplayModePtr modes, DisplayModePtr new); +void xf86SetModeDefaultName(DisplayModePtr mode); +void xf86SetModeCrtc(DisplayModePtr p, int adjustFlags); +Bool xf86ModesEqual(DisplayModePtr pMode1, DisplayModePtr pMode2); +void xf86PrintModeline(int scrnIndex,DisplayModePtr mode); +DisplayModePtr xf86ModesAdd(DisplayModePtr modes, DisplayModePtr new); -DisplayModePtr i830_xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC); -DisplayModePtr i830_xf86CVTMode(int HDisplay, int VDisplay, float VRefresh, - Bool Reduced, Bool Interlaced); - -#define xf86ModeHSync i830_xf86ModeHSync -#define xf86ModeVRefresh i830_xf86ModeVRefresh -#define xf86DuplicateMode i830_xf86DuplicateMode -#define xf86DuplicateModes i830_xf86DuplicateModes -#define xf86SetModeDefaultName i830_xf86SetModeDefaultName -#define xf86SetModeCrtc i830_xf86SetModeCrtc -#define xf86ModesEqual i830_xf86ModesEqual -#define xf86PrintModeline i830_xf86PrintModeline -#define xf86ModesAdd i830_xf86ModesAdd -#define xf86DDCGetModes i830_xf86DDCGetModes -#define xf86CVTMode i830_xf86CVTMode -#endif /* XORG_VERSION_CURRENT <= 7.2.99.2 */ +DisplayModePtr xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC); +DisplayModePtr xf86CVTMode(int HDisplay, int VDisplay, float VRefresh, + Bool Reduced, Bool Interlaced); void -i830xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList, - int flags); +xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList, + int flags); void -i830xf86ValidateModesClocks(ScrnInfoPtr pScrn, DisplayModePtr modeList, - int *min, int *max, int n_ranges); +xf86ValidateModesClocks(ScrnInfoPtr pScrn, DisplayModePtr modeList, + int *min, int *max, int n_ranges); void -i830xf86ValidateModesSize(ScrnInfoPtr pScrn, DisplayModePtr modeList, - int maxX, int maxY, int maxPitch); +xf86ValidateModesSize(ScrnInfoPtr pScrn, DisplayModePtr modeList, + int maxX, int maxY, int maxPitch); void -i830xf86ValidateModesSync(ScrnInfoPtr pScrn, DisplayModePtr modeList, - MonPtr mon); +xf86ValidateModesSync(ScrnInfoPtr pScrn, DisplayModePtr modeList, + MonPtr mon); void -i830xf86PruneInvalidModes(ScrnInfoPtr pScrn, DisplayModePtr *modeList, - Bool verbose); +xf86PruneInvalidModes(ScrnInfoPtr pScrn, DisplayModePtr *modeList, + Bool verbose); void -i830xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList, - int flags); +xf86ValidateModesFlags(ScrnInfoPtr pScrn, DisplayModePtr modeList, + int flags); void -i830xf86ValidateModesUserConfig(ScrnInfoPtr pScrn, DisplayModePtr modeList); +xf86ValidateModesUserConfig(ScrnInfoPtr pScrn, DisplayModePtr modeList); DisplayModePtr -i830xf86GetMonitorModes (ScrnInfoPtr pScrn, XF86ConfMonitorPtr conf_monitor); +xf86GetMonitorModes (ScrnInfoPtr pScrn, XF86ConfMonitorPtr conf_monitor); DisplayModePtr -i830xf86GetDefaultModes (Bool interlaceAllowed, Bool doubleScanAllowed); +xf86GetDefaultModes (Bool interlaceAllowed, Bool doubleScanAllowed); #endif /* _I830_XF86MODES_H_ */ diff --git a/src/i830_xf86Rename.h b/src/i830_xf86Rename.h new file mode 100644 index 00000000..cf8de622 --- /dev/null +++ b/src/i830_xf86Rename.h @@ -0,0 +1,66 @@ +/* + * Copyright © 2006 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _XF86RENAME_H_ +#define _XF86RENAME_H_ + +#include "local_xf86Rename.h" + +#define xf86CrtcConfigInit XF86NAME(xf86CrtcConfigInit) +#define xf86CrtcConfigPrivateIndex XF86NAME(xf86CrtcConfigPrivateIndex) +#define xf86CrtcCreate XF86NAME(xf86CrtcCreate) +#define xf86CrtcDestroy XF86NAME(xf86CrtcDestroy) +#define xf86CrtcInUse XF86NAME(xf86CrtcInUse) +#define xf86CrtcRotate XF86NAME(xf86CrtcRotate) +#define xf86CrtcSetMode XF86NAME(xf86CrtcSetMode) +#define xf86CrtcSetSizeRange XF86NAME(xf86CrtcSetSizeRange) +#define xf86CVTMode XF86NAME(xf86CVTMode) +#define xf86DisableUnusedFunctions XF86NAME(xf86DisableUnusedFunctions) +#define xf86DPMSSet XF86NAME(xf86DPMSSet) +#define xf86DuplicateMode XF86NAME(xf86DuplicateMode) +#define xf86DuplicateModes XF86NAME(xf86DuplicateModes) +#define xf86GetDefaultModes XF86NAME(xf86GetDefaultModes) +#define xf86GetMonitorModes XF86NAME(xf86GetMonitorModes) +#define xf86InitialConfiguration XF86NAME(xf86InitialConfiguration) +#define xf86ModeHSync XF86NAME(xf86ModeHSync) +#define xf86ModesAdd XF86NAME(xf86ModesAdd) +#define xf86ModesEqual XF86NAME(xf86ModesEqual) +#define xf86ModeVRefresh XF86NAME(xf86ModeVRefresh) +#define xf86OutputCreate XF86NAME(xf86OutputCreate) +#define xf86OutputDestroy XF86NAME(xf86OutputDestroy) +#define xf86OutputGetEDID XF86NAME(xf86OutputGetEDID) +#define xf86OutputGetEDIDModes XF86NAME(xf86OutputGetEDIDModes) +#define xf86OutputRename XF86NAME(xf86OutputRename) +#define xf86OutputSetEDID XF86NAME(xf86OutputSetEDID) +#define xf86PrintModeline XF86NAME(xf86PrintModeline) +#define xf86ProbeOutputModes XF86NAME(xf86ProbeOutputModes) +#define xf86PruneInvalidModes XF86NAME(xf86PruneInvalidModes) +#define xf86SetModeCrtc XF86NAME(xf86SetModeCrtc) +#define xf86SetModeDefaultName XF86NAME(xf86SetModeDefaultName) +#define xf86SetScrnInfoModes XF86NAME(xf86SetScrnInfoModes) +#define xf86ValidateModesClocks XF86NAME(xf86ValidateModesClocks) +#define xf86ValidateModesFlags XF86NAME(xf86ValidateModesFlags) +#define xf86ValidateModesSize XF86NAME(xf86ValidateModesSize) +#define xf86ValidateModesSync XF86NAME(xf86ValidateModesSync) +#define xf86ValidateModesUserConfig XF86NAME(xf86ValidateModesUserConfig) + +#endif /* _XF86RENAME_H_ */ diff --git a/src/i830_xf86Rotate.c b/src/i830_xf86Rotate.c new file mode 100644 index 00000000..12b20919 --- /dev/null +++ b/src/i830_xf86Rotate.c @@ -0,0 +1,324 @@ +/* + * Copyright © 2006 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "xf86.h" +#include "xf86DDC.h" +/*#include "i830.h" */ +#include "i830_xf86Crtc.h" +#include "i830_xf86Modes.h" +#include "i830_randr.h" +#include "X11/extensions/render.h" +#define DPMS_SERVER +#include "X11/extensions/dpms.h" +#include "X11/Xatom.h" + +static int +mode_height (DisplayModePtr mode, Rotation rotation) +{ + switch (rotation & 0xf) { + case RR_Rotate_0: + case RR_Rotate_180: + return mode->VDisplay; + case RR_Rotate_90: + case RR_Rotate_270: + return mode->HDisplay; + default: + return 0; + } +} + +static int +mode_width (DisplayModePtr mode, Rotation rotation) +{ + switch (rotation & 0xf) { + case RR_Rotate_0: + case RR_Rotate_180: + return mode->HDisplay; + case RR_Rotate_90: + case RR_Rotate_270: + return mode->VDisplay; + default: + return 0; + } +} + +/* borrowed from composite extension, move to Render and publish? */ + +static VisualPtr +compGetWindowVisual (WindowPtr pWin) +{ + ScreenPtr pScreen = pWin->drawable.pScreen; + VisualID vid = wVisual (pWin); + int i; + + for (i = 0; i < pScreen->numVisuals; i++) + if (pScreen->visuals[i].vid == vid) + return &pScreen->visuals[i]; + return 0; +} + +static PictFormatPtr +compWindowFormat (WindowPtr pWin) +{ + ScreenPtr pScreen = pWin->drawable.pScreen; + + return PictureMatchVisual (pScreen, pWin->drawable.depth, + compGetWindowVisual (pWin)); +} + +static void +xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) +{ + ScrnInfoPtr scrn = crtc->scrn; + ScreenPtr screen = scrn->pScreen; + PixmapPtr src_pixmap = (*screen->GetScreenPixmap) (screen); + PixmapPtr dst_pixmap = crtc->rotatedPixmap; + PictFormatPtr format = compWindowFormat (WindowTable[screen->myNum]); + int error; + PicturePtr src, dst; + PictTransform transform; + + src = CreatePicture (None, + &src_pixmap->drawable, + format, + 0L, + NULL, + serverClient, + &error); + if (!src) + return; + dst = CreatePicture (None, + &dst_pixmap->drawable, + format, + 0L, + NULL, + serverClient, + &error); + if (!dst) + return; + SetPictureClipRegion (src, 0, 0, region); + memset (&transform, '\0', sizeof (transform)); + transform.matrix[2][2] = 1; + transform.matrix[0][2] = crtc->x; + transform.matrix[1][2] = crtc->y; + switch (crtc->curRotation & 0xf) { + case RR_Rotate_0: + transform.matrix[0][0] = 1; + transform.matrix[1][1] = 1; + break; + case RR_Rotate_90: + /* XXX probably wrong */ + transform.matrix[0][1] = 1; + transform.matrix[1][0] = -1; + transform.matrix[1][2] += crtc->curMode.HDisplay; + break; + case RR_Rotate_180: + /* XXX probably wrong */ + transform.matrix[0][0] = -1; + transform.matrix[1][1] = -1; + transform.matrix[0][2] += crtc->curMode.HDisplay; + transform.matrix[1][2] += crtc->curMode.VDisplay; + break; + case RR_Rotate_270: + /* XXX probably wrong */ + transform.matrix[0][1] = -1; + transform.matrix[1][0] = 1; + transform.matrix[0][2] += crtc->curMode.VDisplay; + break; + } + /* handle reflection */ + if (crtc->curRotation & RR_Reflect_X) + { + /* XXX figure this out */ + } + if (crtc->curRotation & RR_Reflect_Y) + { + /* XXX figure this out too */ + } + SetPictureTransform (src, &transform); + CompositePicture (PictOpSrc, + src, NULL, dst, + 0, 0, 0, 0, 0, 0, + dst_pixmap->drawable.width, + dst_pixmap->drawable.height); + FreePicture (src, None); + FreePicture (dst, None); +} + +static void +xf86RotateRedisplay(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + DamagePtr damage = xf86_config->rotationDamage; + RegionPtr region; + + if (!damage) + return; + region = DamageRegion(damage); + if (REGION_NOTEMPTY(pScreen, region)) + { + int c; + + for (c = 0; c < xf86_config->num_crtc; c++) + { + xf86CrtcPtr crtc = xf86_config->crtc[c]; + + if (crtc->curRotation != RR_Rotate_0) + { + BoxRec box; + RegionRec crtc_damage; + + /* compute portion of damage that overlaps crtc */ + box.x1 = crtc->x; + box.x2 = crtc->x + mode_width (&crtc->curMode, crtc->curRotation); + box.y1 = crtc->y; + box.y2 = crtc->y + mode_height (&crtc->curMode, crtc->curRotation); + REGION_INIT(pScreen, &crtc_damage, &box, 1); + REGION_INTERSECT (pScreen, &crtc_damage, &crtc_damage, region); + + /* update damaged region */ + if (REGION_NOTEMPTY(pScreen, &crtc_damage)) + xf86RotateCrtcRedisplay (crtc, &crtc_damage); + + REGION_UNINIT (pScreen, &crtc_damage); + } + } + DamageEmpty(damage); + } +} + +static void +xf86RotateBlockHandler(pointer data, OSTimePtr pTimeout, pointer pRead) +{ + ScreenPtr pScreen = (ScreenPtr) data; + + xf86RotateRedisplay(pScreen); +} + +static void +xf86RotateWakeupHandler(pointer data, int i, pointer LastSelectMask) +{ +} + +Bool +xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) +{ + ScrnInfoPtr pScrn = crtc->scrn; + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + ScreenPtr pScreen = pScrn->pScreen; + + if (rotation == RR_Rotate_0) + { + /* Free memory from rotation */ + if (crtc->rotatedPixmap) + { + crtc->funcs->shadow_destroy (crtc, crtc->rotatedPixmap); + crtc->rotatedPixmap = NULL; + } + + if (xf86_config->rotationDamage) + { + /* Free damage structure */ + DamageDestroy (xf86_config->rotationDamage); + xf86_config->rotationDamage = NULL; + /* Free block/wakeup handler */ + RemoveBlockAndWakeupHandlers (xf86RotateBlockHandler, + xf86RotateWakeupHandler, + (pointer) pScreen); + } + } + else + { + int width = mode_width (mode, rotation); + int height = mode_height (mode, rotation); + PixmapPtr shadow = crtc->rotatedPixmap; + int old_width = shadow ? shadow->drawable.width : 0; + int old_height = shadow ? shadow->drawable.height : 0; + + /* Allocate memory for rotation */ + if (old_width != width || old_height != height) + { + if (shadow) + { + crtc->funcs->shadow_destroy (crtc, shadow); + crtc->rotatedPixmap = NULL; + } + shadow = crtc->funcs->shadow_create (crtc, width, height); + if (!shadow) + goto bail1; + } + + if (!xf86_config->rotationDamage) + { + /* Create damage structure */ + xf86_config->rotationDamage = DamageCreate (NULL, NULL, + DamageReportNone, + TRUE, pScreen, pScreen); + if (!xf86_config->rotationDamage) + goto bail2; + + /* Hook damage to screen pixmap */ + DamageRegister (&(*pScreen->GetScreenPixmap)(pScreen)->drawable, + xf86_config->rotationDamage); + + /* Assign block/wakeup handler */ + if (!RegisterBlockAndWakeupHandlers (xf86RotateBlockHandler, + xf86RotateWakeupHandler, + (pointer) pScreen)) + { + goto bail3; + } + } + if (0) + { +bail3: + DamageDestroy (xf86_config->rotationDamage); + xf86_config->rotationDamage = NULL; + +bail2: + if (shadow) + { + crtc->funcs->shadow_destroy (crtc, shadow); + crtc->rotatedPixmap = NULL; + } +bail1: + if (old_width && old_height) + crtc->rotatedPixmap = crtc->funcs->shadow_create (crtc, + old_width, + old_height); + return FALSE; + } + } + + /* All done */ + crtc->curRotation = rotation; + return TRUE; +} diff --git a/src/local_xf86Rename.h b/src/local_xf86Rename.h new file mode 100644 index 00000000..e1e788f3 --- /dev/null +++ b/src/local_xf86Rename.h @@ -0,0 +1,23 @@ +/* + * Copyright © 2006 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#define XF86NAME(x) intel_##x From 37946c9c8a4afa4a4fc1fe9864a8eec1c4571d2c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 16 Jan 2007 12:14:55 +1100 Subject: [PATCH 02/35] Interim work on rotation support with new xf86 code. Yes, there are lots of bits tied together here, and we should split this patch apart. Move I830 mode setting to xf86 mode setting. Make mode setting function also set the base address. This should fix problems where the base gets set incorrectly at times. Add driver-independent rotation support, requires driver-specific hooks for shadow pixmap allocation, otherwise it uses Render for painting. --- src/i830.h | 2 ++ src/i830_crt.c | 2 +- src/i830_cursor.c | 2 +- src/i830_display.c | 10 ++++------ src/i830_driver.c | 10 ++++++++-- src/i830_randr.c | 37 ++++++++++++++++--------------------- src/i830_tv.c | 2 +- src/i830_xf86Crtc.c | 16 +++++++++++----- src/i830_xf86Crtc.h | 29 +++++++++++++++++------------ src/i830_xf86Rotate.c | 21 ++++++++++----------- 10 files changed, 71 insertions(+), 60 deletions(-) diff --git a/src/i830.h b/src/i830.h index 95bea2f0..66dad9b9 100644 --- a/src/i830.h +++ b/src/i830.h @@ -221,6 +221,7 @@ enum last_3d { LAST_3D_ROTATION }; +#if 0 typedef struct _I830PipeRec { Bool enabled; int x; @@ -233,6 +234,7 @@ typedef struct _I830PipeRec { RRCrtcPtr randr_crtc; #endif } I830PipeRec, *I830PipePtr; +#endif typedef struct _I830Rec { unsigned char *MMIOBase; diff --git a/src/i830_crt.c b/src/i830_crt.c index 00e637ad..573e6526 100644 --- a/src/i830_crt.c +++ b/src/i830_crt.c @@ -314,7 +314,7 @@ i830_crt_detect(xf86OutputPtr output) if (intel_output->load_detect_temp) { xf86SetModeCrtc (&mode, INTERLACE_HALVE_V); - xf86CrtcSetMode (crtc, &mode, RR_Rotate_0); + xf86CrtcSetMode (crtc, &mode, RR_Rotate_0, 0, 0); } connected = i830_crt_detect_load (crtc, output); diff --git a/src/i830_cursor.c b/src/i830_cursor.c index 81cb3bd8..5e7a21a1 100644 --- a/src/i830_cursor.c +++ b/src/i830_cursor.c @@ -492,7 +492,7 @@ I830SetCursorPosition(ScrnInfoPtr pScrn, int x, int y) for (pipe = 0; pipe < xf86_config->num_crtc; pipe++) { xf86CrtcPtr crtc = xf86_config->crtc[pipe]; - DisplayModePtr mode = &crtc->curMode; + DisplayModePtr mode = &crtc->mode; int thisx = x - crtc->x; int thisy = y - crtc->y; diff --git a/src/i830_display.c b/src/i830_display.c index d80eb4e0..de6c7225 100644 --- a/src/i830_display.c +++ b/src/i830_display.c @@ -358,9 +358,6 @@ i830PipeSetBase(xf86CrtcPtr crtc, int x, int y) OUTREG(dspbase, Start + ((y * pScrn->displayWidth + x) * pI830->cpp)); (void) INREG(dspbase); } - - crtc->x = x; - crtc->y = y; } /** @@ -601,7 +598,8 @@ i830_crtc_mode_fixup(xf86CrtcPtr crtc, DisplayModePtr mode, */ static void i830_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, - DisplayModePtr adjusted_mode) + DisplayModePtr adjusted_mode, + int x, int y) { ScrnInfoPtr pScrn = crtc->scrn; xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); @@ -837,7 +835,7 @@ i830_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, OUTREG(dspcntr_reg, dspcntr); /* Flush the plane changes */ - i830PipeSetBase(crtc, crtc->x, crtc->y); + i830PipeSetBase(crtc, x, y); i830WaitForVblank(pScrn); } @@ -901,7 +899,7 @@ i830SetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode, Rotation rotation) { ok = xf86CrtcSetMode(crtc, i830PipeFindClosestMode(crtc, pMode), - rotation); + rotation, 0, 0); if (!ok) goto done; crtc->desiredMode = *pMode; diff --git a/src/i830_driver.c b/src/i830_driver.c index daa5a3b2..56a599cc 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -3020,7 +3020,10 @@ i830AdjustFrame(int scrnIndex, int x, int y, int flags) (*pI830->AccelInfoRec->Sync)(pScrn); pI830->AccelInfoRec->NeedToSync = FALSE; } + /* XXX should have xf86-based frame adjuster */ i830PipeSetBase(crtc, output->initial_x + x, output->initial_y + y); + crtc->x = output->initial_x + x; + crtc->y = output->initial_y + y; } } @@ -3138,14 +3141,17 @@ I830EnterVT(int scrnIndex, int flags) xf86CrtcPtr crtc = xf86_config->crtc[i]; /* Mark that we'll need to re-set the mode for sure */ - memset(&crtc->curMode, 0, sizeof(crtc->curMode)); + memset(&crtc->mode, 0, sizeof(crtc->mode)); if (!crtc->desiredMode.CrtcHDisplay) { crtc->desiredMode = *i830PipeFindClosestMode (crtc, pScrn->currentMode); crtc->desiredRotation = RR_Rotate_0; + crtc->desiredX = 0; + crtc->desiredY = 0; } - if (!xf86CrtcSetMode (crtc, &crtc->desiredMode, crtc->desiredRotation)) + if (!xf86CrtcSetMode (crtc, &crtc->desiredMode, crtc->desiredRotation, + crtc->desiredX, crtc->desiredY)) return FALSE; } diff --git a/src/i830_randr.c b/src/i830_randr.c index d6df4190..3aaf88b1 100644 --- a/src/i830_randr.c +++ b/src/i830_randr.c @@ -393,8 +393,8 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen) for (c = 0; c < config->num_crtc; c++) { xf86CrtcPtr crtc = config->crtc[c]; - int crtc_width = crtc->x + crtc->curMode.HDisplay; - int crtc_height = crtc->y + crtc->curMode.VDisplay; + int crtc_width = crtc->x + crtc->mode.HDisplay; + int crtc_height = crtc->y + crtc->mode.VDisplay; if (crtc->enabled && crtc_width > width) width = crtc_width; @@ -533,7 +533,7 @@ xf86RandR12CrtcNotify (RRCrtcPtr randr_crtc) xf86CrtcPtr crtc = randr_crtc->devPrivate; xf86OutputPtr output; int i, j; - DisplayModePtr curMode = &crtc->curMode; + DisplayModePtr mode = &crtc->mode; Bool ret; randr_outputs = ALLOCATE_LOCAL(config->num_output * sizeof (RROutputPtr)); @@ -541,7 +541,7 @@ xf86RandR12CrtcNotify (RRCrtcPtr randr_crtc) return FALSE; x = crtc->x; y = crtc->y; - rotation = crtc->curRotation; + rotation = crtc->rotation; numOutputs = 0; randr_mode = NULL; for (i = 0; i < config->num_output; i++) @@ -558,7 +558,7 @@ xf86RandR12CrtcNotify (RRCrtcPtr randr_crtc) for (j = 0; j < randr_output->numModes; j++) { DisplayModePtr outMode = randr_output->modes[j]->devPrivate; - if (xf86ModesEqual(curMode, outMode)) + if (xf86ModesEqual(mode, outMode)) { randr_mode = randr_output->modes[j]; break; @@ -587,7 +587,6 @@ xf86RandR12CrtcSet (ScreenPtr pScreen, xf86CrtcPtr crtc = randr_crtc->devPrivate; DisplayModePtr mode = randr_mode ? randr_mode->devPrivate : NULL; Bool changed = FALSE; - Bool pos_changed; int o, ro; xf86CrtcPtr *save_crtcs; Bool save_enabled = crtc->enabled; @@ -595,12 +594,11 @@ xf86RandR12CrtcSet (ScreenPtr pScreen, save_crtcs = ALLOCATE_LOCAL(config->num_crtc * sizeof (xf86CrtcPtr)); if ((mode != NULL) != crtc->enabled) changed = TRUE; - else if (mode && !xf86ModesEqual (&crtc->curMode, mode)) + else if (mode && !xf86ModesEqual (&crtc->mode, mode)) changed = TRUE; - pos_changed = changed; if (x != crtc->x || y != crtc->y) - pos_changed = TRUE; + changed = TRUE; for (o = 0; o < config->num_output; o++) { xf86OutputPtr output = config->output[o]; @@ -627,18 +625,11 @@ xf86RandR12CrtcSet (ScreenPtr pScreen, /* XXX need device-independent mode setting code through an API */ if (changed) { - I830Ptr pI830 = I830PTR(pScrn); crtc->enabled = mode != NULL; - /* Sync the engine before adjust mode */ - if (pI830->AccelInfoRec && pI830->AccelInfoRec->NeedToSync) { - (*pI830->AccelInfoRec->Sync)(pScrn); - pI830->AccelInfoRec->NeedToSync = FALSE; - } - if (mode) { - if (!xf86CrtcSetMode (crtc, mode, rotation)) + if (!xf86CrtcSetMode (crtc, mode, rotation, x, y)) { crtc->enabled = save_enabled; for (o = 0; o < config->num_output; o++) @@ -649,14 +640,16 @@ xf86RandR12CrtcSet (ScreenPtr pScreen, DEALLOCATE_LOCAL(save_crtcs); return FALSE; } + /* + * Save the last successful setting for EnterVT + */ crtc->desiredMode = *mode; + crtc->desiredRotation = rotation; + crtc->desiredX = x; + crtc->desiredY = y; } xf86DisableUnusedFunctions (pScrn); - - i830DumpRegs(pScrn); } - if (pos_changed && mode) - i830PipeSetBase(crtc, x, y); DEALLOCATE_LOCAL(save_crtcs); return xf86RandR12CrtcNotify (randr_crtc); } @@ -817,6 +810,8 @@ xf86RandR12SetInfo12 (ScreenPtr pScreen) return TRUE; } + + /* * Query the hardware for the current state, then mirror * that to RandR diff --git a/src/i830_tv.c b/src/i830_tv.c index a76cbffa..79b6ae8b 100644 --- a/src/i830_tv.c +++ b/src/i830_tv.c @@ -1065,7 +1065,7 @@ i830_tv_detect(xf86OutputPtr output) /* we only need the pixel clock set correctly here */ mode = reported_modes[0]; xf86SetModeCrtc (&mode, INTERLACE_HALVE_V); - xf86CrtcSetMode (crtc, &mode, RR_Rotate_0); + xf86CrtcSetMode (crtc, &mode, RR_Rotate_0, 0, 0); } i830_tv_detect_type (crtc, output); i830ReleaseLoadDetectPipe (output); diff --git a/src/i830_xf86Crtc.c b/src/i830_xf86Crtc.c index 5eb55e96..504ea0b9 100644 --- a/src/i830_xf86Crtc.c +++ b/src/i830_xf86Crtc.c @@ -87,7 +87,7 @@ xf86CrtcCreate (ScrnInfoPtr scrn, #ifdef RANDR_12_INTERFACE crtc->randr_crtc = NULL; #endif - crtc->curRotation = RR_Rotate_0; + crtc->rotation = RR_Rotate_0; crtc->desiredRotation = RR_Rotate_0; if (xf86_config->crtc) crtcs = xrealloc (xf86_config->crtc, @@ -145,7 +145,8 @@ xf86CrtcInUse (xf86CrtcPtr crtc) * Sets the given video mode on the given crtc */ Bool -xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) +xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, + int x, int y) { ScrnInfoPtr scrn = crtc->scrn; xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); @@ -166,6 +167,8 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) didLock = crtc->funcs->lock (crtc); + /* XXX short-circuit changes to base location only */ + /* Pass our mode to the outputs and the CRTC to give them a chance to * adjust it according to limitations or output properties, and also * a chance to reject the mode entirely. @@ -211,7 +214,7 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) /* Set up the DPLL and any output state that needs to adjust or depend * on the DPLL. */ - crtc->funcs->mode_set(crtc, mode, adjusted_mode); + crtc->funcs->mode_set(crtc, mode, adjusted_mode, x, y); for (i = 0; i < xf86_config->num_output; i++) { xf86OutputPtr output = xf86_config->output[i]; @@ -228,7 +231,10 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) output->funcs->dpms(output, DPMSModeOn); } - crtc->curMode = *mode; + crtc->mode = *mode; + crtc->x = x; + crtc->y = y; + crtc->rotation = rotation; /* XXX free adjustedmode */ ret = TRUE; @@ -1401,7 +1407,7 @@ xf86DisableUnusedFunctions(ScrnInfoPtr pScrn) if (!crtc->enabled) { crtc->funcs->dpms(crtc, DPMSModeOff); - memset(&crtc->curMode, 0, sizeof(crtc->curMode)); + memset(&crtc->mode, 0, sizeof(crtc->mode)); } } } diff --git a/src/i830_xf86Crtc.h b/src/i830_xf86Crtc.h index e72dda63..4b17dce4 100644 --- a/src/i830_xf86Crtc.h +++ b/src/i830_xf86Crtc.h @@ -70,7 +70,6 @@ typedef struct _xf86CrtcFuncs { void (*restore)(xf86CrtcPtr crtc); - /** * Lock CRTC prior to mode setting, mostly for DRI. * Returns whether unlock is needed @@ -102,7 +101,8 @@ typedef struct _xf86CrtcFuncs { void (*mode_set)(xf86CrtcPtr crtc, DisplayModePtr mode, - DisplayModePtr adjusted_mode); + DisplayModePtr adjusted_mode, + int x, int y); /* Set the color ramps for the CRTC to the given values. */ void @@ -141,13 +141,6 @@ struct _xf86Crtc { */ Bool enabled; - /** - * Position on screen - * - * Locates this CRTC within the frame buffer - */ - int x, y; - /** Track whether cursor is within CRTC range */ Bool cursorInRange; @@ -161,9 +154,15 @@ struct _xf86Crtc { * It will be cleared when the VT is not active or * during server startup */ - DisplayModeRec curMode; - Rotation curRotation; + DisplayModeRec mode; + Rotation rotation; PixmapPtr rotatedPixmap; + /** + * Position on screen + * + * Locates this CRTC within the frame buffer + */ + int x, y; /** * Desired mode @@ -175,6 +174,7 @@ struct _xf86Crtc { */ DisplayModeRec desiredMode; Rotation desiredRotation; + int desiredX, desiredY; /** crtc-specific functions */ const xf86CrtcFuncsRec *funcs; @@ -396,6 +396,10 @@ typedef struct _xf86CrtcConfig { /* For crtc-based rotation */ DamagePtr rotationDamage; + + /* DGA */ + unsigned int dga_flags; + } xf86CrtcConfigRec, *xf86CrtcConfigPtr; extern int xf86CrtcConfigPrivateIndex; @@ -448,7 +452,8 @@ xf86FreeCrtc (xf86CrtcPtr crtc); * Sets the given video mode on the given crtc */ Bool -xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation); +xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, + int x, int y); /* * Assign crtc rotation during mode set diff --git a/src/i830_xf86Rotate.c b/src/i830_xf86Rotate.c index 12b20919..5482a6e1 100644 --- a/src/i830_xf86Rotate.c +++ b/src/i830_xf86Rotate.c @@ -128,7 +128,7 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) transform.matrix[2][2] = 1; transform.matrix[0][2] = crtc->x; transform.matrix[1][2] = crtc->y; - switch (crtc->curRotation & 0xf) { + switch (crtc->rotation & 0xf) { case RR_Rotate_0: transform.matrix[0][0] = 1; transform.matrix[1][1] = 1; @@ -137,28 +137,28 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) /* XXX probably wrong */ transform.matrix[0][1] = 1; transform.matrix[1][0] = -1; - transform.matrix[1][2] += crtc->curMode.HDisplay; + transform.matrix[1][2] += crtc->mode.HDisplay; break; case RR_Rotate_180: /* XXX probably wrong */ transform.matrix[0][0] = -1; transform.matrix[1][1] = -1; - transform.matrix[0][2] += crtc->curMode.HDisplay; - transform.matrix[1][2] += crtc->curMode.VDisplay; + transform.matrix[0][2] += crtc->mode.HDisplay; + transform.matrix[1][2] += crtc->mode.VDisplay; break; case RR_Rotate_270: /* XXX probably wrong */ transform.matrix[0][1] = -1; transform.matrix[1][0] = 1; - transform.matrix[0][2] += crtc->curMode.VDisplay; + transform.matrix[0][2] += crtc->mode.VDisplay; break; } /* handle reflection */ - if (crtc->curRotation & RR_Reflect_X) + if (crtc->rotation & RR_Reflect_X) { /* XXX figure this out */ } - if (crtc->curRotation & RR_Reflect_Y) + if (crtc->rotation & RR_Reflect_Y) { /* XXX figure this out too */ } @@ -191,16 +191,16 @@ xf86RotateRedisplay(ScreenPtr pScreen) { xf86CrtcPtr crtc = xf86_config->crtc[c]; - if (crtc->curRotation != RR_Rotate_0) + if (crtc->rotation != RR_Rotate_0) { BoxRec box; RegionRec crtc_damage; /* compute portion of damage that overlaps crtc */ box.x1 = crtc->x; - box.x2 = crtc->x + mode_width (&crtc->curMode, crtc->curRotation); + box.x2 = crtc->x + mode_width (&crtc->mode, crtc->rotation); box.y1 = crtc->y; - box.y2 = crtc->y + mode_height (&crtc->curMode, crtc->curRotation); + box.y2 = crtc->y + mode_height (&crtc->mode, crtc->rotation); REGION_INIT(pScreen, &crtc_damage, &box, 1); REGION_INTERSECT (pScreen, &crtc_damage, &crtc_damage, region); @@ -319,6 +319,5 @@ bail1: } /* All done */ - crtc->curRotation = rotation; return TRUE; } From 67a152c43cb7231695b99030c952c52d4edd1e65 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 17 Jan 2007 14:35:31 -0800 Subject: [PATCH 03/35] Set all CRTCs' allowable rotations when xf86RandR12SetRotations() is called. --- src/i830_randr.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/i830_randr.c b/src/i830_randr.c index 3aaf88b1..c1e9ac08 100644 --- a/src/i830_randr.c +++ b/src/i830_randr.c @@ -494,8 +494,19 @@ void xf86RandR12SetRotations (ScreenPtr pScreen, Rotation rotations) { XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + int c; randrp->supported_rotations = rotations; + +#if RANDR_12_INTERFACE + for (c = 0; c < config->num_crtc; c++) { + xf86CrtcPtr crtc = config->crtc[c]; + + RRCrtcSetRotations (crtc->randr_crtc, rotations); + } +#endif } void From d17c386aee55bd223297adf78cf0fc1db43baf2d Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 17 Jan 2007 15:49:08 -0800 Subject: [PATCH 04/35] Fix some segfaults: crtc->rotatedPixmap not set and dangling damage pointer. --- src/i830_xf86Rotate.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/i830_xf86Rotate.c b/src/i830_xf86Rotate.c index 5482a6e1..14c0c5dd 100644 --- a/src/i830_xf86Rotate.c +++ b/src/i830_xf86Rotate.c @@ -247,6 +247,8 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) if (xf86_config->rotationDamage) { /* Free damage structure */ + DamageUnregister (&(*pScreen->GetScreenPixmap)(pScreen)->drawable, + xf86_config->rotationDamage); DamageDestroy (xf86_config->rotationDamage); xf86_config->rotationDamage = NULL; /* Free block/wakeup handler */ @@ -274,6 +276,7 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) shadow = crtc->funcs->shadow_create (crtc, width, height); if (!shadow) goto bail1; + crtc->rotatedPixmap = shadow; } if (!xf86_config->rotationDamage) From f256243fff195f73bc8aa72e8dd2c6f7b33446cf Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 17 Jan 2007 16:01:18 -0800 Subject: [PATCH 05/35] Allocate per-crtc rotation buffers and hook up RandR 1.2 per-CRTC rotation. It currently displays garbage. --- src/i830.h | 3 +++ src/i830_display.c | 47 +++++++++++++++++++++++++++++++-- src/i830_memory.c | 64 ++++++++++++++++++++++++++++++++++++++++++++- src/i830_xf86Crtc.c | 5 +--- 4 files changed, 112 insertions(+), 7 deletions(-) diff --git a/src/i830.h b/src/i830.h index 66dad9b9..c7920730 100644 --- a/src/i830.h +++ b/src/i830.h @@ -195,8 +195,11 @@ extern const char *i830_output_type_names[]; typedef struct _I830CrtcPrivateRec { int pipe; + /* Lookup table values to be set when the CRTC is enabled */ CARD8 lut_r[256], lut_g[256], lut_b[256]; + + I830MemRange rotate_mem; } I830CrtcPrivateRec, *I830CrtcPrivatePtr; #define I830CrtcPrivate(c) ((I830CrtcPrivatePtr) (c)->driver_private) diff --git a/src/i830_display.c b/src/i830_display.c index de6c7225..08842ec9 100644 --- a/src/i830_display.c +++ b/src/i830_display.c @@ -342,9 +342,11 @@ i830PipeSetBase(xf86CrtcPtr crtc, int x, int y) int dspbase = (pipe == 0 ? DSPABASE : DSPBBASE); int dspsurf = (pipe == 0 ? DSPASURF : DSPBSURF); - if (I830IsPrimary(pScrn)) + if (intel_crtc->rotate_mem.Start != 0) { + Start = intel_crtc->rotate_mem.Start; + } else if (I830IsPrimary(pScrn)) { Start = pI830->FrontBuffer.Start; - else { + } else { I830Ptr pI8301 = I830PTR(pI830->entityPrivate->pScrn_1); Start = pI8301->FrontBuffer2.Start; } @@ -882,6 +884,45 @@ i830_crtc_gamma_set(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue, i830_crtc_load_lut(crtc); } +/** + * Creates a locked-in-framebuffer pixmap of the given width and height for + * this CRTC's rotated shadow framebuffer. + * + * The current implementation uses fixed buffers allocated at startup at the + * maximal size. + */ +static PixmapPtr +i830_crtc_shadow_create(xf86CrtcPtr crtc, int width, int height) +{ + ScrnInfoPtr pScrn = crtc->scrn; + I830Ptr pI830 = I830PTR(pScrn); + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + unsigned long rotate_pitch; + PixmapPtr rotate_pixmap; + pointer rotate_offset; + + if (intel_crtc->rotate_mem.Start == 0) + return NULL; + + rotate_pitch = pI830->displayWidth * pI830->cpp; + rotate_offset = pI830->FbBase + intel_crtc->rotate_mem.Start; + + rotate_pixmap = GetScratchPixmapHeader(pScrn->pScreen, + width, height, + pScrn->depth, + pScrn->bitsPerPixel, + rotate_pitch, + rotate_offset); + return rotate_pixmap; +} + +static void +i830_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap) +{ + FreeScratchPixmapHeader(rotate_pixmap); +} + + /** * This function configures the screens in clone mode on * all active outputs using a mode similar to the specified mode. @@ -1038,6 +1079,8 @@ static const xf86CrtcFuncsRec i830_crtc_funcs = { .mode_fixup = i830_crtc_mode_fixup, .mode_set = i830_crtc_mode_set, .gamma_set = i830_crtc_gamma_set, + .shadow_create = i830_crtc_shadow_create, + .shadow_destroy = i830_crtc_shadow_destroy, .destroy = NULL, /* XXX */ }; diff --git a/src/i830_memory.c b/src/i830_memory.c index 426242a9..ae14c06c 100644 --- a/src/i830_memory.c +++ b/src/i830_memory.c @@ -769,6 +769,63 @@ I830AllocateFramebuffer(ScrnInfoPtr pScrn, I830Ptr pI830, BoxPtr FbMemBox, return TRUE; } +/** + * Allocates memory for the rotated shadow buffers. + * + * This memory would be better allocated normally through the linear allocator, + * but it gets rotation working for now. + */ +static Bool +I830AllocateRotateBuffers(xf86CrtcPtr crtc, const int flags) +{ + ScrnInfoPtr pScrn = crtc->scrn; + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + I830Ptr pI830 = I830PTR(pScrn); + Bool dryrun = ((flags & ALLOCATE_DRY_RUN) != 0); + unsigned long avail, lineSize; + int verbosity = dryrun ? 4 : 1; + const char *s = dryrun ? "[dryrun] " : ""; + int align, alignflags; + long size, alloced; + int rotate_width, rotate_height; + + memset(&intel_crtc->rotate_mem, 0, sizeof(intel_crtc->rotate_mem)); + + rotate_width = pScrn->displayWidth; + if (pScrn->virtualX > pScrn->virtualY) + rotate_height = pScrn->virtualX; + else + rotate_height = pScrn->virtualY; + + lineSize = pScrn->displayWidth * pI830->cpp; + avail = pScrn->videoRam * 1024; + + align = KB(64); + alignflags = 0; + + size = lineSize * rotate_height; + size = ROUND_TO_PAGE(size); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity, + "%sInitial %sshadow framebuffer allocation size: " + "%ld kByte\n", + s, (intel_crtc->pipe == 0) ? "" : "secondary ", + size / 1024); + alloced = I830AllocVidMem(pScrn, &intel_crtc->rotate_mem, + &pI830->StolenPool, size, align, + flags | alignflags | + FROM_ANYWHERE | ALLOCATE_AT_BOTTOM); + if (alloced < size) { + if (!dryrun) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to allocate " + "%sshadow framebuffer. Is your VideoRAM set too low?\n", + (intel_crtc->pipe == 0) ? "" : "secondary "); + } + return FALSE; + } + + return TRUE; +} + /* * Allocate memory for 2D operation. This includes the (front) framebuffer, * ring buffer, scratch memory, HW cursor. @@ -782,7 +839,7 @@ I830Allocate2DMemory(ScrnInfoPtr pScrn, const int flags) int verbosity = dryrun ? 4 : 1; const char *s = dryrun ? "[dryrun] " : ""; Bool tileable; - int align, alignflags; + int align, alignflags, i; DPRINTF(PFX, "I830Allocate2DMemory: inital is %s\n", BOOLTOSTRING(flags & ALLOC_INITIAL)); @@ -814,6 +871,7 @@ I830Allocate2DMemory(ScrnInfoPtr pScrn, const int flags) pI830->StolenPool.Free.Size); if (flags & ALLOC_INITIAL) { + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); if (pI830->NeedRingBufferLow) AllocateRingBuffer(pScrn, flags | FORCE_LOW); @@ -839,6 +897,10 @@ I830Allocate2DMemory(ScrnInfoPtr pScrn, const int flags) return FALSE; } + for (i = 0; i < xf86_config->num_crtc; i++) { + I830AllocateRotateBuffers(xf86_config->crtc[i], flags); + } + #ifdef I830_USE_EXA if (pI830->useEXA) { /* Default EXA to having 3 screens worth of offscreen memory space diff --git a/src/i830_xf86Crtc.c b/src/i830_xf86Crtc.c index 504ea0b9..a926e9fb 100644 --- a/src/i830_xf86Crtc.c +++ b/src/i830_xf86Crtc.c @@ -190,13 +190,10 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, goto done; } -#if 0 - if (!xf86CrtcRotate (crtc, mode, rotation)) - { + if (!xf86CrtcRotate (crtc, mode, rotation)) { ret = FALSE; goto done; } -#endif /* Disable the outputs and CRTCs before setting the mode. */ for (i = 0; i < xf86_config->num_output; i++) { From 53e765d1cf5016961c25a798a27f0fe09bd1f237 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 17 Jan 2007 16:56:06 -0800 Subject: [PATCH 06/35] Fix broken last-minute change in determining whether we're rotated or not. --- src/i830_display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i830_display.c b/src/i830_display.c index 08842ec9..2313f768 100644 --- a/src/i830_display.c +++ b/src/i830_display.c @@ -342,7 +342,7 @@ i830PipeSetBase(xf86CrtcPtr crtc, int x, int y) int dspbase = (pipe == 0 ? DSPABASE : DSPBBASE); int dspsurf = (pipe == 0 ? DSPASURF : DSPBSURF); - if (intel_crtc->rotate_mem.Start != 0) { + if (crtc->rotation != RR_Rotate_0) { Start = intel_crtc->rotate_mem.Start; } else if (I830IsPrimary(pScrn)) { Start = pI830->FrontBuffer.Start; From 14d265a02312e9cda7a21614d77525c7140c0ca8 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 18 Jan 2007 11:21:58 -0800 Subject: [PATCH 07/35] Store fixed values, not integers, in the transformation matrix. Also, add a bit more error checking. --- src/i830_xf86Rotate.c | 47 ++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/i830_xf86Rotate.c b/src/i830_xf86Rotate.c index 14c0c5dd..39733fd6 100644 --- a/src/i830_xf86Rotate.c +++ b/src/i830_xf86Rotate.c @@ -112,8 +112,10 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) NULL, serverClient, &error); - if (!src) + if (!src) { + ErrorF("couldn't create src pict\n"); return; + } dst = CreatePicture (None, &dst_pixmap->drawable, format, @@ -121,38 +123,41 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) NULL, serverClient, &error); - if (!dst) + if (!dst) { + ErrorF("couldn't create src pict\n"); return; + } SetPictureClipRegion (src, 0, 0, region); memset (&transform, '\0', sizeof (transform)); - transform.matrix[2][2] = 1; - transform.matrix[0][2] = crtc->x; - transform.matrix[1][2] = crtc->y; + transform.matrix[2][2] = IntToxFixed(1); + transform.matrix[0][2] = IntToxFixed(crtc->x); + transform.matrix[1][2] = IntToxFixed(crtc->y); switch (crtc->rotation & 0xf) { case RR_Rotate_0: - transform.matrix[0][0] = 1; - transform.matrix[1][1] = 1; + transform.matrix[0][0] = IntToxFixed(1); + transform.matrix[1][1] = IntToxFixed(1); break; case RR_Rotate_90: /* XXX probably wrong */ - transform.matrix[0][1] = 1; - transform.matrix[1][0] = -1; - transform.matrix[1][2] += crtc->mode.HDisplay; + transform.matrix[0][1] = IntToxFixed(1); + transform.matrix[1][0] = IntToxFixed(-1); + transform.matrix[1][2] += IntToxFixed(crtc->mode.HDisplay); break; case RR_Rotate_180: /* XXX probably wrong */ - transform.matrix[0][0] = -1; - transform.matrix[1][1] = -1; - transform.matrix[0][2] += crtc->mode.HDisplay; - transform.matrix[1][2] += crtc->mode.VDisplay; + 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: /* XXX probably wrong */ - transform.matrix[0][1] = -1; - transform.matrix[1][0] = 1; - transform.matrix[0][2] += crtc->mode.VDisplay; + transform.matrix[0][1] = IntToxFixed(-1); + transform.matrix[1][0] = IntToxFixed(1); + transform.matrix[0][2] += IntToxFixed(crtc->mode.VDisplay); break; } + /* handle reflection */ if (crtc->rotation & RR_Reflect_X) { @@ -162,7 +167,13 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) { /* XXX figure this out too */ } - SetPictureTransform (src, &transform); + + error = SetPictureTransform (src, &transform); + if (error) { + ErrorF("Couldn't set transform\n"); + return; + } + CompositePicture (PictOpSrc, src, NULL, dst, 0, 0, 0, 0, 0, 0, From 92b0f3d2013c32d94fe57fe674da1b195288f347 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 18 Jan 2007 11:23:22 -0800 Subject: [PATCH 08/35] Disable the clipping for now, since it won't work. --- src/i830_xf86Rotate.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i830_xf86Rotate.c b/src/i830_xf86Rotate.c index 39733fd6..670ad7ac 100644 --- a/src/i830_xf86Rotate.c +++ b/src/i830_xf86Rotate.c @@ -127,7 +127,13 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) ErrorF("couldn't create src pict\n"); return; } - SetPictureClipRegion (src, 0, 0, region); + /* Unfortunately, we don't do clipping on transformed source pictures. + * So we can't use this. Instead, we'll just repaint the whole screen + * for now, and do transform of the source region into a dest region + * later. + */ + /* SetPictureClipRegion (src, 0, 0, region); */ + memset (&transform, '\0', sizeof (transform)); transform.matrix[2][2] = IntToxFixed(1); transform.matrix[0][2] = IntToxFixed(crtc->x); From d2ae2e2ccc3a8e7dc84745c235836cba150754d8 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 18 Jan 2007 11:37:14 -0800 Subject: [PATCH 09/35] Update CRTC values first so they can be used by the driver in mode setting. With this, the screen now gets rotated, though there are major issues. --- src/i830_xf86Crtc.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/i830_xf86Crtc.c b/src/i830_xf86Crtc.c index a926e9fb..c879d998 100644 --- a/src/i830_xf86Crtc.c +++ b/src/i830_xf86Crtc.c @@ -154,6 +154,9 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, Bool ret = FALSE; Bool didLock = FALSE; DisplayModePtr adjusted_mode; + DisplayModeRec saved_mode; + int saved_x, saved_y; + Rotation saved_rotation; adjusted_mode = xf86DuplicateMode(mode); @@ -167,6 +170,18 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, didLock = crtc->funcs->lock (crtc); + saved_mode = crtc->mode; + saved_x = crtc->x; + saved_y = crtc->y; + saved_rotation = crtc->rotation; + /* Update crtc values up front so the driver can rely on them for mode + * setting. + */ + crtc->mode = *mode; + crtc->x = x; + crtc->y = y; + crtc->rotation = rotation; + /* XXX short-circuit changes to base location only */ /* Pass our mode to the outputs and the CRTC to give them a chance to @@ -180,18 +195,15 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, continue; if (!output->funcs->mode_fixup(output, mode, adjusted_mode)) { - ret = FALSE; goto done; } } if (!crtc->funcs->mode_fixup(crtc, mode, adjusted_mode)) { - ret = FALSE; goto done; } if (!xf86CrtcRotate (crtc, mode, rotation)) { - ret = FALSE; goto done; } @@ -228,14 +240,16 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, output->funcs->dpms(output, DPMSModeOn); } - crtc->mode = *mode; - crtc->x = x; - crtc->y = y; - crtc->rotation = rotation; - /* XXX free adjustedmode */ ret = TRUE; done: + if (!ret) { + crtc->x = saved_x; + crtc->y = saved_y; + crtc->rotation = saved_rotation; + crtc->mode = saved_mode; + } + if (didLock) crtc->funcs->unlock (crtc); From b296cd9b8f63ab80e8fe46fcfcdba2e9af846468 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 18 Jan 2007 13:02:26 -0800 Subject: [PATCH 10/35] Fix transformation matrices for rotation at 90 and 270 degrees. --- src/i830_xf86Rotate.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/i830_xf86Rotate.c b/src/i830_xf86Rotate.c index 670ad7ac..8da79b6f 100644 --- a/src/i830_xf86Rotate.c +++ b/src/i830_xf86Rotate.c @@ -144,23 +144,20 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) transform.matrix[1][1] = IntToxFixed(1); break; case RR_Rotate_90: - /* XXX probably wrong */ - transform.matrix[0][1] = IntToxFixed(1); - transform.matrix[1][0] = IntToxFixed(-1); - transform.matrix[1][2] += IntToxFixed(crtc->mode.HDisplay); + 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: - /* XXX probably wrong */ 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: - /* XXX probably wrong */ - transform.matrix[0][1] = IntToxFixed(-1); - transform.matrix[1][0] = IntToxFixed(1); - transform.matrix[0][2] += IntToxFixed(crtc->mode.VDisplay); + transform.matrix[0][1] = IntToxFixed(1); + transform.matrix[1][0] = IntToxFixed(-1); + transform.matrix[1][2] += IntToxFixed(crtc->mode.VDisplay); break; } From 8759f4d89a141f7d69f1894ec3059ba6bd1cf86b Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 18 Jan 2007 13:13:25 -0800 Subject: [PATCH 11/35] Partially deal with cursor rotation. The remaining issue is having a cursor image per CRTC so that the cursors can be rotated on the independently rotated CRTCs. --- src/i830_cursor.c | 67 ++++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/src/i830_cursor.c b/src/i830_cursor.c index 5e7a21a1..364320e8 100644 --- a/src/i830_cursor.c +++ b/src/i830_cursor.c @@ -456,49 +456,50 @@ I830SetCursorPosition(ScrnInfoPtr pScrn, int x, int y) I830Ptr pI830 = I830PTR(pScrn); CARD32 temp; Bool inrange; - int oldx = x, oldy = y; - int hotspotx = 0, hotspoty = 0; + int root_x = x, root_y = y; int pipe; - oldx += pScrn->frameX0; /* undo what xf86HWCurs did */ - oldy += pScrn->frameY0; - - switch (pI830->rotation) { - case RR_Rotate_0: - x = oldx; - y = oldy; - break; - case RR_Rotate_90: - x = oldy; - y = pScrn->pScreen->width - oldx; - hotspoty = I810_CURSOR_X; - break; - case RR_Rotate_180: - x = pScrn->pScreen->width - oldx; - y = pScrn->pScreen->height - oldy; - hotspotx = I810_CURSOR_X; - hotspoty = I810_CURSOR_Y; - break; - case RR_Rotate_270: - x = pScrn->pScreen->height - oldy; - y = oldx; - hotspotx = I810_CURSOR_Y; - break; - } - - x -= hotspotx; - y -= hotspoty; + root_x = x + pScrn->frameX0; /* undo what xf86HWCurs did */ + root_y = y + pScrn->frameY0; for (pipe = 0; pipe < xf86_config->num_crtc; pipe++) { - xf86CrtcPtr crtc = xf86_config->crtc[pipe]; + xf86CrtcPtr crtc = xf86_config->crtc[pipe]; DisplayModePtr mode = &crtc->mode; - int thisx = x - crtc->x; - int thisy = y - crtc->y; + int thisx; + int thisy; + int hotspotx = 0, hotspoty = 0; if (!crtc->enabled) continue; + /* XXX: deal with hotspot issues */ + switch (crtc->rotation) { + case RR_Rotate_0: + thisx = (root_x - crtc->x); + thisy = (root_y - crtc->y); + break; + case RR_Rotate_90: + thisx = (root_y - crtc->y); + thisy = mode->VDisplay - (root_x - crtc->x); + /*hotspoty = I810_CURSOR_X;*/ + break; + case RR_Rotate_180: + thisx = mode->HDisplay - (root_x - crtc->x); + thisy = mode->VDisplay - (root_y - crtc->y); + /*hotspotx = I810_CURSOR_X; + hotspoty = I810_CURSOR_Y;*/ + break; + case RR_Rotate_270: + thisx = mode->VDisplay - (root_y - crtc->y); + thisy = (root_x - crtc->x); + /*hotspotx = I810_CURSOR_Y;*/ + break; + } + + thisx -= hotspotx; + thisy -= hotspoty; + /* * There is a screen display problem when the cursor position is set * wholely outside of the viewport. We trap that here, turning the From 74ebff6732b9bfcf8c865b52cbebfd9bf6b73eb2 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 18 Jan 2007 14:26:21 -0800 Subject: [PATCH 12/35] Allocate separate cursor memory per CRTC and rotate cursors appropriately. Also, add bind/unbind of the shadow rotate buffers, which was missed in a previous commit. --- src/i830.h | 4 +- src/i830_cursor.c | 101 +++++++++++++---------- src/i830_driver.c | 31 +------ src/i830_memory.c | 206 ++++++++++++++++++++++++++++++---------------- 4 files changed, 197 insertions(+), 145 deletions(-) diff --git a/src/i830.h b/src/i830.h index c7920730..a7c889d4 100644 --- a/src/i830.h +++ b/src/i830.h @@ -200,6 +200,8 @@ typedef struct _I830CrtcPrivateRec { CARD8 lut_r[256], lut_g[256], lut_b[256]; I830MemRange rotate_mem; + I830MemRange cursor_mem; + I830MemRange cursor_mem_argb; } I830CrtcPrivateRec, *I830CrtcPrivatePtr; #define I830CrtcPrivate(c) ((I830CrtcPrivatePtr) (c)->driver_private) @@ -276,8 +278,6 @@ typedef struct _I830Rec { I830MemRange EXAStateMem; /* specific exa state for G965 */ #endif /* Regions allocated either from the above pools, or from agpgart. */ - I830MemRange *CursorMem; - I830MemRange *CursorMemARGB; I830RingBuffer *LpRing; #if REMAP_RESERVED diff --git a/src/i830_cursor.c b/src/i830_cursor.c index 364320e8..bb5bc38d 100644 --- a/src/i830_cursor.c +++ b/src/i830_cursor.c @@ -94,9 +94,9 @@ I830SetPipeCursorBase (xf86CrtcPtr crtc) FatalError("Bad pipe number for cursor base setting\n"); if (pI830->CursorIsARGB) - cursor_mem = pI830->CursorMemARGB; + cursor_mem = &intel_crtc->cursor_mem_argb; else - cursor_mem = pI830->CursorMem; + cursor_mem = &intel_crtc->cursor_mem; if (pI830->CursorNeedsPhysical) { OUTREG(cursor_base, cursor_mem->Physical); @@ -251,21 +251,13 @@ I830CursorInit(ScreenPtr pScreen) infoPtr->HideCursor = I830HideCursor; infoPtr->ShowCursor = I830ShowCursor; infoPtr->UseHWCursor = I830UseHWCursor; +#ifdef ARGB_CURSOR + infoPtr->UseHWCursorARGB = I830UseHWCursorARGB; + infoPtr->LoadCursorARGB = I830LoadCursorARGB; +#endif pI830->pCurs = NULL; -#ifdef ARGB_CURSOR - pI830->CursorIsARGB = FALSE; - - if (pI830->CursorMemARGB->Start) { - /* Use ARGB if we were able to allocate the 16kb needed */ - infoPtr->UseHWCursorARGB = I830UseHWCursorARGB; - infoPtr->LoadCursorARGB = I830LoadCursorARGB; - } -#endif - - if (pI830->CursorNeedsPhysical && !pI830->CursorMem->Physical) - return FALSE; I830HideCursor(pScrn); @@ -280,18 +272,16 @@ I830UseHWCursor(ScreenPtr pScreen, CursorPtr pCurs) pI830->pCurs = pCurs; - DPRINTF(PFX, "I830UseHWCursor\n"); - if (pI830->CursorNeedsPhysical && !pI830->CursorMem->Physical) - return FALSE; - return TRUE; } static void -I830LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) +I830CRTCLoadCursorImage(xf86CrtcPtr crtc, unsigned char *src) { + ScrnInfoPtr pScrn = crtc->scrn; I830Ptr pI830 = I830PTR(pScrn); - CARD8 *pcurs = (CARD8 *) (pI830->FbBase + pI830->CursorMem->Start); + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + CARD8 *pcurs = (CARD8 *) (pI830->FbBase + intel_crtc->cursor_mem.Start); int x, y; DPRINTF(PFX, "I830LoadCursorImage\n"); @@ -310,7 +300,7 @@ I830LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) (*(image + (x) / 8 + (y) * (128/8)) |=\ (int) (1 << (7-((x) % 8)))) - switch (pI830->rotation) { + switch (crtc->rotation) { case RR_Rotate_90: for (y = 0; y < 64; y++) { for (x = 0; x < 64; x++) { @@ -353,6 +343,17 @@ I830LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) } } +static void +I830LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) +{ + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + int pipe; + + for (pipe = 0; pipe < xf86_config->num_crtc; pipe++) { + I830CRTCLoadCursorImage(xf86_config->crtc[pipe], src); + } +} + #ifdef ARGB_CURSOR #include "cursorstr.h" @@ -360,15 +361,22 @@ static Bool I830UseHWCursorARGB (ScreenPtr pScreen, CursorPtr pCurs) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + int i; DPRINTF(PFX, "I830UseHWCursorARGB\n"); pI830->pCurs = pCurs; - if (pScrn->bitsPerPixel == 8) - return FALSE; + /* Check that our ARGB allocations succeeded */ + for (i = 0; i < xf86_config->num_crtc; i++) { + I830CrtcPrivatePtr intel_crtc = xf86_config->crtc[i]->driver_private; - if (pI830->CursorNeedsPhysical && !pI830->CursorMemARGB->Physical) + if (!intel_crtc->cursor_mem_argb.Start) + return FALSE; + } + + if (pScrn->bitsPerPixel == 8) return FALSE; if (pCurs->bits->height <= 64 && pCurs->bits->width <= 64) @@ -377,10 +385,11 @@ static Bool I830UseHWCursorARGB (ScreenPtr pScreen, CursorPtr pCurs) return FALSE; } -static void I830LoadCursorARGB (ScrnInfoPtr pScrn, CursorPtr pCurs) +static void I830CRTCLoadCursorARGB (xf86CrtcPtr crtc, CursorPtr pCurs) { - I830Ptr pI830 = I830PTR(pScrn); - CARD32 *dst = (CARD32 *) (pI830->FbBase + pI830->CursorMemARGB->Start); + I830Ptr pI830 = I830PTR(crtc->scrn); + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + CARD32 *dst = (CARD32 *) (pI830->FbBase + intel_crtc->cursor_mem.Start); CARD32 *image = (CARD32 *)pCurs->bits->argb; int x, y, w, h; @@ -394,7 +403,7 @@ static void I830LoadCursorARGB (ScrnInfoPtr pScrn, CursorPtr pCurs) w = pCurs->bits->width; h = pCurs->bits->height; - switch (pI830->rotation) { + switch (crtc->rotation) { case RR_Rotate_90: for (y = 0; y < h; y++) { for (x = 0; x < w; x++) @@ -447,12 +456,23 @@ static void I830LoadCursorARGB (ScrnInfoPtr pScrn, CursorPtr pCurs) *dst++ = 0; } } + +static void +I830LoadCursorARGB(ScrnInfoPtr pScrn, CursorPtr pCurs) +{ + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + int pipe; + + for (pipe = 0; pipe < xf86_config->num_crtc; pipe++) { + I830CRTCLoadCursorARGB(xf86_config->crtc[pipe], pCurs); + } +} #endif static void I830SetCursorPosition(ScrnInfoPtr pScrn, int x, int y) { - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); I830Ptr pI830 = I830PTR(pScrn); CARD32 temp; Bool inrange; @@ -473,7 +493,6 @@ I830SetCursorPosition(ScrnInfoPtr pScrn, int x, int y) if (!crtc->enabled) continue; - /* XXX: deal with hotspot issues */ switch (crtc->rotation) { case RR_Rotate_0: thisx = (root_x - crtc->x); @@ -482,18 +501,18 @@ I830SetCursorPosition(ScrnInfoPtr pScrn, int x, int y) case RR_Rotate_90: thisx = (root_y - crtc->y); thisy = mode->VDisplay - (root_x - crtc->x); - /*hotspoty = I810_CURSOR_X;*/ + hotspoty = I810_CURSOR_X; break; case RR_Rotate_180: thisx = mode->HDisplay - (root_x - crtc->x); thisy = mode->VDisplay - (root_y - crtc->y); - /*hotspotx = I810_CURSOR_X; - hotspoty = I810_CURSOR_Y;*/ + hotspotx = I810_CURSOR_X; + hotspoty = I810_CURSOR_Y; break; case RR_Rotate_270: thisx = mode->VDisplay - (root_y - crtc->y); thisy = (root_x - crtc->x); - /*hotspotx = I810_CURSOR_Y;*/ + hotspotx = I810_CURSOR_Y; break; } @@ -542,19 +561,11 @@ I830SetCursorPosition(ScrnInfoPtr pScrn, int x, int y) static void I830ShowCursor(ScrnInfoPtr pScrn) { - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - I830Ptr pI830 = I830PTR(pScrn); + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + I830Ptr pI830 = I830PTR(pScrn); int pipe; - DPRINTF(PFX, "I830ShowCursor\n"); - DPRINTF(PFX, - "Value of CursorMem->Physical is %x, " - " Value of CursorMem->Start is %x ", - pI830->CursorMem->Physical, pI830->CursorMem->Start); - DPRINTF(PFX, - "Value of CursorMemARGB->Physical is %x, " - " Value of CursorMemARGB->Start is %x ", - pI830->CursorMemARGB->Physical, pI830->CursorMemARGB->Start); + DPRINTF(PFX, "I830ShowCursor\n"); pI830->cursorOn = TRUE; for (pipe = 0; pipe < xf86_config->num_crtc; pipe++) diff --git a/src/i830_driver.c b/src/i830_driver.c index 84fd9d86..644ea57f 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -765,12 +765,6 @@ PreInitCleanup(ScrnInfoPtr pScrn) if (pI830->LpRing) xfree(pI830->LpRing); pI830->LpRing = NULL; - if (pI830->CursorMem) - xfree(pI830->CursorMem); - pI830->CursorMem = NULL; - if (pI830->CursorMemARGB) - xfree(pI830->CursorMemARGB); - pI830->CursorMemARGB = NULL; if (pI830->OverlayMem) xfree(pI830->OverlayMem); pI830->OverlayMem = NULL; @@ -1527,12 +1521,10 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) /* Alloc our pointers for the primary head */ if (I830IsPrimary(pScrn)) { pI830->LpRing = xalloc(sizeof(I830RingBuffer)); - pI830->CursorMem = xalloc(sizeof(I830MemRange)); - pI830->CursorMemARGB = xalloc(sizeof(I830MemRange)); pI830->OverlayMem = xalloc(sizeof(I830MemRange)); pI830->overlayOn = xalloc(sizeof(Bool)); pI830->used3D = xalloc(sizeof(int)); - if (!pI830->LpRing || !pI830->CursorMem || !pI830->CursorMemARGB || + if (!pI830->LpRing || !pI830->OverlayMem || !pI830->overlayOn || !pI830->used3D) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Could not allocate primary data structures.\n"); @@ -2583,17 +2575,13 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) if (I830IsPrimary(pScrn)) { if (!pI830->LpRing) pI830->LpRing = xalloc(sizeof(I830RingBuffer)); - if (!pI830->CursorMem) - pI830->CursorMem = xalloc(sizeof(I830MemRange)); - if (!pI830->CursorMemARGB) - pI830->CursorMemARGB = xalloc(sizeof(I830MemRange)); if (!pI830->OverlayMem) pI830->OverlayMem = xalloc(sizeof(I830MemRange)); if (!pI830->overlayOn) pI830->overlayOn = xalloc(sizeof(Bool)); if (!pI830->used3D) pI830->used3D = xalloc(sizeof(int)); - if (!pI830->LpRing || !pI830->CursorMem || !pI830->CursorMemARGB || + if (!pI830->LpRing || !pI830->OverlayMem || !pI830->overlayOn || !pI830->used3D) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Could not allocate primary data structures.\n"); @@ -2608,8 +2596,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) if (!I830IsPrimary(pScrn)) { pI8301 = I830PTR(pI830->entityPrivate->pScrn_1); pI830->LpRing = pI8301->LpRing; - pI830->CursorMem = pI8301->CursorMem; - pI830->CursorMemARGB = pI8301->CursorMemARGB; pI830->OverlayMem = pI8301->OverlayMem; pI830->overlayOn = pI8301->overlayOn; pI830->used3D = pI8301->used3D; @@ -2658,15 +2644,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) } } - if (!pI830->SWCursor) { - if (pI830->CursorMem->Size == 0) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Disabling HW cursor because the cursor memory " - "allocation failed.\n"); - pI830->SWCursor = TRUE; - } - } - #ifdef I830_XV if (pI830->XvEnabled) { if (pI830->noAccel) { @@ -3354,10 +3331,6 @@ I830CloseScreen(int scrnIndex, ScreenPtr pScreen) xfree(pI830->LpRing); pI830->LpRing = NULL; - xfree(pI830->CursorMem); - pI830->CursorMem = NULL; - xfree(pI830->CursorMemARGB); - pI830->CursorMemARGB = NULL; xfree(pI830->OverlayMem); pI830->OverlayMem = NULL; xfree(pI830->overlayOn); diff --git a/src/i830_memory.c b/src/i830_memory.c index ae14c06c..14dacc86 100644 --- a/src/i830_memory.c +++ b/src/i830_memory.c @@ -826,6 +826,91 @@ I830AllocateRotateBuffers(xf86CrtcPtr crtc, const int flags) return TRUE; } +static Bool +I830AllocateCursorBuffers(xf86CrtcPtr crtc, const int flags) +{ + ScrnInfoPtr pScrn = crtc->scrn; + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + I830Ptr pI830 = I830PTR(pScrn); + Bool dryrun = ((flags & ALLOCATE_DRY_RUN) != 0); + int verbosity = dryrun ? 4 : 1; + const char *s = dryrun ? "[dryrun] " : ""; + long size, alloced; + int cursFlags = 0; + + /* Clear cursor info */ + memset(&intel_crtc->cursor_mem, 0, sizeof(I830MemRange)); + intel_crtc->cursor_mem.Key = -1; + memset(&intel_crtc->cursor_mem_argb, 0, sizeof(I830MemRange)); + intel_crtc->cursor_mem_argb.Key = -1; + + if (pI830->SWCursor) + return FALSE; + + /* + * Mouse cursor -- The i810-i830 need a physical address in system + * memory from which to upload the cursor. We get this from + * the agpgart module using a special memory type. + */ + + size = HWCURSOR_SIZE; + cursFlags = FROM_ANYWHERE | ALLOCATE_AT_TOP; + if (pI830->CursorNeedsPhysical) + cursFlags |= NEED_PHYSICAL_ADDR; + + alloced = I830AllocVidMem(pScrn, &intel_crtc->cursor_mem, + &pI830->StolenPool, size, + GTT_PAGE_SIZE, flags | cursFlags); + if (alloced < size || + (pI830->CursorNeedsPhysical && !intel_crtc->cursor_mem.Physical)) + { + if (!dryrun) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate HW cursor space.\n"); + return FALSE; + } + } else { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity, + "%sAllocated %ld kB for HW cursor at 0x%lx", s, + alloced / 1024, intel_crtc->cursor_mem.Start); + if (pI830->CursorNeedsPhysical) { + xf86ErrorFVerb(verbosity, " (0x%08lx)", + intel_crtc->cursor_mem.Physical); + } + xf86ErrorFVerb(verbosity, "\n"); + } + + /* Allocate the ARGB cursor space. Its success is optional -- we won't set + * SWCursor if it fails. + */ + size = HWCURSOR_SIZE_ARGB; + cursFlags = FROM_ANYWHERE | ALLOCATE_AT_TOP; + if (pI830->CursorNeedsPhysical) + cursFlags |= NEED_PHYSICAL_ADDR; + + alloced = I830AllocVidMem(pScrn, &intel_crtc->cursor_mem_argb, + &pI830->StolenPool, size, + GTT_PAGE_SIZE, flags | cursFlags); + if (alloced < size || + (pI830->CursorNeedsPhysical && !intel_crtc->cursor_mem_argb.Physical)) { + if (!dryrun) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate HW (ARGB) cursor space.\n"); + } + } else { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity, + "%sAllocated %ld kB for HW (ARGB) cursor at 0x%lx", s, + alloced / 1024, intel_crtc->cursor_mem_argb.Start); + if (pI830->CursorNeedsPhysical) { + xf86ErrorFVerb(verbosity, " (0x%08lx)", + intel_crtc->cursor_mem_argb.Physical); + } + xf86ErrorFVerb(verbosity, "\n"); + } + + return FALSE; +} + /* * Allocate memory for 2D operation. This includes the (front) framebuffer, * ring buffer, scratch memory, HW cursor. @@ -834,6 +919,7 @@ Bool I830Allocate2DMemory(ScrnInfoPtr pScrn, const int flags) { I830Ptr pI830 = I830PTR(pScrn); + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); long size, alloced; Bool dryrun = ((flags & ALLOCATE_DRY_RUN) != 0); int verbosity = dryrun ? 4 : 1; @@ -871,8 +957,6 @@ I830Allocate2DMemory(ScrnInfoPtr pScrn, const int flags) pI830->StolenPool.Free.Size); if (flags & ALLOC_INITIAL) { - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - if (pI830->NeedRingBufferLow) AllocateRingBuffer(pScrn, flags | FORCE_LOW); @@ -1041,63 +1125,18 @@ I830Allocate2DMemory(ScrnInfoPtr pScrn, const int flags) } #endif - /* Clear cursor info */ - memset(pI830->CursorMem, 0, sizeof(I830MemRange)); - pI830->CursorMem->Key = -1; - memset(pI830->CursorMemARGB, 0, sizeof(I830MemRange)); - pI830->CursorMemARGB->Key = -1; - - if (!pI830->SWCursor) { - int cursFlags = 0; - /* - * Mouse cursor -- The i810-i830 need a physical address in system - * memory from which to upload the cursor. We get this from - * the agpgart module using a special memory type. - */ - - size = HWCURSOR_SIZE; - cursFlags = FROM_ANYWHERE | ALLOCATE_AT_TOP; - if (pI830->CursorNeedsPhysical) - cursFlags |= NEED_PHYSICAL_ADDR; - - alloced = I830AllocVidMem(pScrn, pI830->CursorMem, - &(pI830->StolenPool), size, - GTT_PAGE_SIZE, flags | cursFlags); - if (alloced < size) { - if (!dryrun) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate HW cursor space.\n"); - } - } else { - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity, - "%sAllocated %ld kB for HW cursor at 0x%lx", s, - alloced / 1024, pI830->CursorMem->Start); - if (pI830->CursorNeedsPhysical) - xf86ErrorFVerb(verbosity, " (0x%08lx)", pI830->CursorMem->Physical); - xf86ErrorFVerb(verbosity, "\n"); - } - - size = HWCURSOR_SIZE_ARGB; - cursFlags = FROM_ANYWHERE | ALLOCATE_AT_TOP; - if (pI830->CursorNeedsPhysical) - cursFlags |= NEED_PHYSICAL_ADDR; - - alloced = I830AllocVidMem(pScrn, pI830->CursorMemARGB, - &(pI830->StolenPool), size, - GTT_PAGE_SIZE, flags | cursFlags); - if (alloced < size) { - if (!dryrun) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate HW (ARGB) cursor space.\n"); - } - } else { - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity, - "%sAllocated %ld kB for HW (ARGB) cursor at 0x%lx", s, - alloced / 1024, pI830->CursorMemARGB->Start); - if (pI830->CursorNeedsPhysical) - xf86ErrorFVerb(verbosity, " (0x%08lx)", pI830->CursorMemARGB->Physical); - xf86ErrorFVerb(verbosity, "\n"); - } + if (!pI830->SWCursor && !dryrun) { + for (i = 0; i < xf86_config->num_crtc; i++) { + if (!I830AllocateCursorBuffers(xf86_config->crtc[i], flags) && + pI830->SWCursor) + { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Disabling HW cursor because the cursor memory " + "allocation failed.\n"); + pI830->SWCursor = TRUE; + break; + } + } } #ifdef I830_XV @@ -1567,6 +1606,8 @@ Bool I830FixupOffsets(ScrnInfoPtr pScrn) { I830Ptr pI830 = I830PTR(pScrn); + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + int i; DPRINTF(PFX, "I830FixupOffsets\n"); @@ -1574,8 +1615,15 @@ I830FixupOffsets(ScrnInfoPtr pScrn) if (pI830->entityPrivate && pI830->entityPrivate->pScrn_2) I830FixOffset(pScrn, &(pI830->FrontBuffer2)); I830FixOffset(pScrn, &(pI830->FrontBuffer)); - I830FixOffset(pScrn, pI830->CursorMem); - I830FixOffset(pScrn, pI830->CursorMemARGB); + + for (i = 0; i < xf86_config->num_crtc; i++) { + I830CrtcPrivatePtr intel_crtc = xf86_config->crtc[i]->driver_private; + + I830FixOffset(pScrn, &intel_crtc->rotate_mem); + I830FixOffset(pScrn, &intel_crtc->cursor_mem); + I830FixOffset(pScrn, &intel_crtc->cursor_mem_argb); + } + I830FixOffset(pScrn, &(pI830->LpRing->mem)); I830FixOffset(pScrn, &(pI830->Scratch)); if (pI830->entityPrivate && pI830->entityPrivate->pScrn_2) @@ -1958,6 +2006,9 @@ I830BindAGPMemory(ScrnInfoPtr pScrn) return TRUE; if (xf86AgpGARTSupported() && !pI830->GttBound) { + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + int i; + if (!xf86AcquireGART(pScrn->scrnIndex)) return FALSE; @@ -1973,10 +2024,17 @@ I830BindAGPMemory(ScrnInfoPtr pScrn) return FALSE; if (!BindMemRange(pScrn, &(pI830->FrontBuffer))) return FALSE; - if (!BindMemRange(pScrn, pI830->CursorMem)) - return FALSE; - if (!BindMemRange(pScrn, pI830->CursorMemARGB)) - return FALSE; + + for (i = 0; i < xf86_config->num_crtc; i++) { + I830CrtcPrivatePtr intel_crtc = xf86_config->crtc[i]->driver_private; + + if (!BindMemRange(pScrn, &intel_crtc->rotate_mem)) + return FALSE; + if (!BindMemRange(pScrn, &intel_crtc->cursor_mem)) + return FALSE; + if (!BindMemRange(pScrn, &intel_crtc->cursor_mem_argb)) + return FALSE; + } if (!BindMemRange(pScrn, &(pI830->LpRing->mem))) return FALSE; if (!BindMemRange(pScrn, &(pI830->Scratch))) @@ -2053,6 +2111,8 @@ I830UnbindAGPMemory(ScrnInfoPtr pScrn) return TRUE; if (xf86AgpGARTSupported() && pI830->GttBound) { + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + int i; #if REMAP_RESERVED /* "unbind" the pre-allocated region. */ @@ -2066,10 +2126,18 @@ I830UnbindAGPMemory(ScrnInfoPtr pScrn) return FALSE; if (!UnbindMemRange(pScrn, &(pI830->FrontBuffer))) return FALSE; - if (!UnbindMemRange(pScrn, pI830->CursorMem)) - return FALSE; - if (!UnbindMemRange(pScrn, pI830->CursorMemARGB)) - return FALSE; + + for (i = 0; i < xf86_config->num_crtc; i++) { + I830CrtcPrivatePtr intel_crtc = xf86_config->crtc[i]->driver_private; + + if (!UnbindMemRange(pScrn, &intel_crtc->rotate_mem)) + return FALSE; + if (!UnbindMemRange(pScrn, &intel_crtc->cursor_mem)) + return FALSE; + if (!UnbindMemRange(pScrn, &intel_crtc->cursor_mem_argb)) + return FALSE; + } + if (!UnbindMemRange(pScrn, &(pI830->LpRing->mem))) return FALSE; if (!UnbindMemRange(pScrn, &(pI830->Scratch))) From e21332419581eff1d7651741bae0b640c84d0ecd Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 24 Jan 2007 12:32:38 +0800 Subject: [PATCH 13/35] Warning fix. --- src/i830_cursor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i830_cursor.c b/src/i830_cursor.c index bb5bc38d..da220f56 100644 --- a/src/i830_cursor.c +++ b/src/i830_cursor.c @@ -486,8 +486,8 @@ I830SetCursorPosition(ScrnInfoPtr pScrn, int x, int y) { xf86CrtcPtr crtc = xf86_config->crtc[pipe]; DisplayModePtr mode = &crtc->mode; - int thisx; - int thisy; + int thisx = 0; + int thisy = 0; int hotspotx = 0, hotspoty = 0; if (!crtc->enabled) From 83cc4601b27d871484a2408f31154e9387064b9e Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 24 Jan 2007 16:52:22 +0800 Subject: [PATCH 14/35] Fix a possible failure to misalign video allocation in XAA. --- src/i830_video.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i830_video.c b/src/i830_video.c index a330eb5f..79f5a7c8 100644 --- a/src/i830_video.c +++ b/src/i830_video.c @@ -2117,7 +2117,7 @@ I830AllocateMemory(ScrnInfoPtr pScrn, struct linear_alloc *linear, int size, } xf86PurgeUnlockedOffscreenAreas(pScreen); - linear->xaa = xf86AllocateOffscreenLinear(pScreen, size, 4, + linear->xaa = xf86AllocateOffscreenLinear(pScreen, size, align, NULL, NULL, NULL); linear->offset = XAA_OFFSET_TO_OFFSET(linear->xaa->offset); } From 5c1e27cdd243dc24dd2bfdeb46d757bbef6ba6af Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 25 Jan 2007 15:31:22 -0800 Subject: [PATCH 15/35] Make rotated shadow buffer allocation dynamic. For EXA, this requires version 2.1 of EXA to do rotation, as the VT switching issues were too complicated otherwise. --- src/i830.h | 16 ++++++- src/i830_display.c | 78 ++++++++++++++++++++++++++++++---- src/i830_driver.c | 18 +++++++- src/i830_exa.c | 13 ++++-- src/i830_memory.c | 104 +++++++++++++++++---------------------------- src/i830_video.c | 22 ++-------- 6 files changed, 152 insertions(+), 99 deletions(-) diff --git a/src/i830.h b/src/i830.h index a7c889d4..9ffae94c 100644 --- a/src/i830.h +++ b/src/i830.h @@ -199,7 +199,13 @@ typedef struct _I830CrtcPrivateRec { /* Lookup table values to be set when the CRTC is enabled */ CARD8 lut_r[256], lut_g[256], lut_b[256]; - I830MemRange rotate_mem; +#ifdef I830_USE_XAA + FBLinearPtr rotate_mem_xaa; +#endif +#ifdef I830_USE_EXA + ExaOffscreenArea *rotate_mem_exa; +#endif + I830MemRange cursor_mem; I830MemRange cursor_mem_argb; } I830CrtcPrivateRec, *I830CrtcPrivatePtr; @@ -613,6 +619,14 @@ extern void i830WaitSync(ScrnInfoPtr pScrn); /* i830_memory.c */ Bool I830BindAGPMemory(ScrnInfoPtr pScrn); Bool I830UnbindAGPMemory(ScrnInfoPtr pScrn); +#ifdef I830_USE_XAA +FBLinearPtr +i830_xf86AllocateOffscreenLinear(ScreenPtr pScreen, int length, + int granularity, + MoveLinearCallbackProcPtr moveCB, + RemoveLinearCallbackProcPtr removeCB, + pointer privData); +#endif /* I830_USE_EXA */ /* i830_modes.c */ DisplayModePtr i830_ddc_get_modes(xf86OutputPtr output); diff --git a/src/i830_display.c b/src/i830_display.c index 2313f768..82029850 100644 --- a/src/i830_display.c +++ b/src/i830_display.c @@ -342,8 +342,9 @@ i830PipeSetBase(xf86CrtcPtr crtc, int x, int y) int dspbase = (pipe == 0 ? DSPABASE : DSPBBASE); int dspsurf = (pipe == 0 ? DSPASURF : DSPBSURF); - if (crtc->rotation != RR_Rotate_0) { - Start = intel_crtc->rotate_mem.Start; + if (crtc->rotatedPixmap != NULL) { + Start = (char *)crtc->rotatedPixmap->devPrivate.ptr - + (char *)pI830->FbBase; } else if (I830IsPrimary(pScrn)) { Start = pI830->FrontBuffer.Start; } else { @@ -895,31 +896,92 @@ static PixmapPtr i830_crtc_shadow_create(xf86CrtcPtr crtc, int width, int height) { ScrnInfoPtr pScrn = crtc->scrn; + ScreenPtr pScreen = pScrn->pScreen; I830Ptr pI830 = I830PTR(pScrn); I830CrtcPrivatePtr intel_crtc = crtc->driver_private; unsigned long rotate_pitch; PixmapPtr rotate_pixmap; - pointer rotate_offset; - - if (intel_crtc->rotate_mem.Start == 0) - return NULL; + unsigned long rotate_offset; + int align = KB(4), size; rotate_pitch = pI830->displayWidth * pI830->cpp; - rotate_offset = pI830->FbBase + intel_crtc->rotate_mem.Start; + size = rotate_pitch * height; + +#ifdef I830_USE_EXA + /* We could get close to what we want here by just creating a pixmap like + * normal, but we have to lock it down in framebuffer, and there is no + * setter for offscreen area locking in EXA currently. So, we just + * allocate offscreen memory and fake up a pixmap header for it. + */ + if (pI830->useEXA) { + assert(intel_crtc->rotate_mem_exa == NULL); + + intel_crtc->rotate_mem_exa = exaOffscreenAlloc(pScreen, size, align, + TRUE, NULL, NULL); + if (intel_crtc->rotate_mem_exa == NULL) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Couldn't allocate shadow memory for rotated CRTC\n"); + return NULL; + } + rotate_offset = intel_crtc->rotate_mem_exa->offset; + } +#endif /* I830_USE_EXA */ +#ifdef I830_USE_XAA + if (!pI830->useEXA) { + /* The XFree86 linear allocator operates in units of screen pixels, + * sadly. + */ + size = (size + pI830->cpp - 1) / pI830->cpp; + align = (align + pI830->cpp - 1) / pI830->cpp; + + assert(intel_crtc->rotate_mem_xaa == NULL); + + intel_crtc->rotate_mem_xaa = + i830_xf86AllocateOffscreenLinear(pScreen, size, align, + NULL, NULL, NULL); + if (intel_crtc->rotate_mem_xaa == NULL) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Couldn't allocate shadow memory for rotated CRTC\n"); + return NULL; + } + rotate_offset = pI830->FrontBuffer.Start + + intel_crtc->rotate_mem_xaa->offset * pI830->cpp; + } +#endif /* I830_USE_XAA */ rotate_pixmap = GetScratchPixmapHeader(pScrn->pScreen, width, height, pScrn->depth, pScrn->bitsPerPixel, rotate_pitch, - rotate_offset); + pI830->FbBase + rotate_offset); + if (rotate_pixmap == NULL) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Couldn't allocate shadow pixmap for rotated CRTC\n"); + } return rotate_pixmap; } static void i830_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap) { + ScrnInfoPtr pScrn = crtc->scrn; + I830Ptr pI830 = I830PTR(pScrn); + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + FreeScratchPixmapHeader(rotate_pixmap); +#ifdef I830_USE_EXA + if (pI830->useEXA && intel_crtc->rotate_mem_exa != NULL) { + exaOffscreenFree(pScrn->pScreen, intel_crtc->rotate_mem_exa); + intel_crtc->rotate_mem_exa = NULL; + } +#endif /* I830_USE_EXA */ +#ifdef I830_USE_XAA + if (!pI830->useEXA) { + xf86FreeOffscreenLinear(intel_crtc->rotate_mem_xaa); + intel_crtc->rotate_mem_xaa = NULL; + } +#endif /* I830_USE_XAA */ } diff --git a/src/i830_driver.c b/src/i830_driver.c index 644ea57f..19e97b00 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -2879,7 +2879,23 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) shadowSetup(pScreen); /* support all rotations */ xf86RandR12Init (pScreen); - xf86RandR12SetRotations (pScreen, RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270); + if (pI830->useEXA) { +#ifdef I830_USE_EXA + if (pI830->EXADriverPtr->exa_minor >= 1) { + xf86RandR12SetRotations (pScreen, RR_Rotate_0 | RR_Rotate_90 | + RR_Rotate_180 | RR_Rotate_270); + } else { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "EXA version %d.%d too old to support rotation\n", + pI830->EXADriverPtr->exa_major, + pI830->EXADriverPtr->exa_minor); + xf86RandR12SetRotations (pScreen, RR_Rotate_0); + } +#endif /* I830_USE_EXA */ + } else { + xf86RandR12SetRotations (pScreen, RR_Rotate_0 | RR_Rotate_90 | + RR_Rotate_180 | RR_Rotate_270); + } pI830->PointerMoved = pScrn->PointerMoved; pScrn->PointerMoved = I830PointerMoved; pI830->CreateScreenResources = pScreen->CreateScreenResources; diff --git a/src/i830_exa.c b/src/i830_exa.c index f1cd1e36..3fd5e4ae 100644 --- a/src/i830_exa.c +++ b/src/i830_exa.c @@ -418,7 +418,7 @@ I830EXAInit(ScreenPtr pScreen) pI830->bufferOffset = 0; pI830->EXADriverPtr->exa_major = 2; - pI830->EXADriverPtr->exa_minor = 0; + pI830->EXADriverPtr->exa_minor = 1; pI830->EXADriverPtr->memoryBase = pI830->FbBase; pI830->EXADriverPtr->offScreenBase = pI830->Offscreen.Start; pI830->EXADriverPtr->memorySize = pI830->Offscreen.End; @@ -520,9 +520,14 @@ I830EXAInit(ScreenPtr pScreen) } if(!exaDriverInit(pScreen, pI830->EXADriverPtr)) { - xfree(pI830->EXADriverPtr); - pI830->noAccel = TRUE; - return FALSE; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "EXA initialization failed; trying older version\n"); + pI830->EXADriverPtr->exa_minor = 0; + if(!exaDriverInit(pScreen, pI830->EXADriverPtr)) { + xfree(pI830->EXADriverPtr); + pI830->noAccel = TRUE; + return FALSE; + } } I830SelectBuffer(pScrn, I830_SELECT_FRONT); diff --git a/src/i830_memory.c b/src/i830_memory.c index 14dacc86..24f0b296 100644 --- a/src/i830_memory.c +++ b/src/i830_memory.c @@ -769,63 +769,6 @@ I830AllocateFramebuffer(ScrnInfoPtr pScrn, I830Ptr pI830, BoxPtr FbMemBox, return TRUE; } -/** - * Allocates memory for the rotated shadow buffers. - * - * This memory would be better allocated normally through the linear allocator, - * but it gets rotation working for now. - */ -static Bool -I830AllocateRotateBuffers(xf86CrtcPtr crtc, const int flags) -{ - ScrnInfoPtr pScrn = crtc->scrn; - I830CrtcPrivatePtr intel_crtc = crtc->driver_private; - I830Ptr pI830 = I830PTR(pScrn); - Bool dryrun = ((flags & ALLOCATE_DRY_RUN) != 0); - unsigned long avail, lineSize; - int verbosity = dryrun ? 4 : 1; - const char *s = dryrun ? "[dryrun] " : ""; - int align, alignflags; - long size, alloced; - int rotate_width, rotate_height; - - memset(&intel_crtc->rotate_mem, 0, sizeof(intel_crtc->rotate_mem)); - - rotate_width = pScrn->displayWidth; - if (pScrn->virtualX > pScrn->virtualY) - rotate_height = pScrn->virtualX; - else - rotate_height = pScrn->virtualY; - - lineSize = pScrn->displayWidth * pI830->cpp; - avail = pScrn->videoRam * 1024; - - align = KB(64); - alignflags = 0; - - size = lineSize * rotate_height; - size = ROUND_TO_PAGE(size); - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity, - "%sInitial %sshadow framebuffer allocation size: " - "%ld kByte\n", - s, (intel_crtc->pipe == 0) ? "" : "secondary ", - size / 1024); - alloced = I830AllocVidMem(pScrn, &intel_crtc->rotate_mem, - &pI830->StolenPool, size, align, - flags | alignflags | - FROM_ANYWHERE | ALLOCATE_AT_BOTTOM); - if (alloced < size) { - if (!dryrun) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to allocate " - "%sshadow framebuffer. Is your VideoRAM set too low?\n", - (intel_crtc->pipe == 0) ? "" : "secondary "); - } - return FALSE; - } - - return TRUE; -} - static Bool I830AllocateCursorBuffers(xf86CrtcPtr crtc, const int flags) { @@ -981,10 +924,6 @@ I830Allocate2DMemory(ScrnInfoPtr pScrn, const int flags) return FALSE; } - for (i = 0; i < xf86_config->num_crtc; i++) { - I830AllocateRotateBuffers(xf86_config->crtc[i], flags); - } - #ifdef I830_USE_EXA if (pI830->useEXA) { /* Default EXA to having 3 screens worth of offscreen memory space @@ -1619,7 +1558,6 @@ I830FixupOffsets(ScrnInfoPtr pScrn) for (i = 0; i < xf86_config->num_crtc; i++) { I830CrtcPrivatePtr intel_crtc = xf86_config->crtc[i]->driver_private; - I830FixOffset(pScrn, &intel_crtc->rotate_mem); I830FixOffset(pScrn, &intel_crtc->cursor_mem); I830FixOffset(pScrn, &intel_crtc->cursor_mem_argb); } @@ -2028,8 +1966,6 @@ I830BindAGPMemory(ScrnInfoPtr pScrn) for (i = 0; i < xf86_config->num_crtc; i++) { I830CrtcPrivatePtr intel_crtc = xf86_config->crtc[i]->driver_private; - if (!BindMemRange(pScrn, &intel_crtc->rotate_mem)) - return FALSE; if (!BindMemRange(pScrn, &intel_crtc->cursor_mem)) return FALSE; if (!BindMemRange(pScrn, &intel_crtc->cursor_mem_argb)) @@ -2130,8 +2066,6 @@ I830UnbindAGPMemory(ScrnInfoPtr pScrn) for (i = 0; i < xf86_config->num_crtc; i++) { I830CrtcPrivatePtr intel_crtc = xf86_config->crtc[i]->driver_private; - if (!UnbindMemRange(pScrn, &intel_crtc->rotate_mem)) - return FALSE; if (!UnbindMemRange(pScrn, &intel_crtc->cursor_mem)) return FALSE; if (!UnbindMemRange(pScrn, &intel_crtc->cursor_mem_argb)) @@ -2209,3 +2143,41 @@ I830CheckAvailableMemory(ScrnInfoPtr pScrn) return maxPages * 4; } + +#ifdef I830_USE_XAA +/** + * Allocates memory from the XF86 linear allocator, but also purges + * memory if possible to cause the allocation to succeed. + */ +FBLinearPtr +i830_xf86AllocateOffscreenLinear(ScreenPtr pScreen, int length, + int granularity, + MoveLinearCallbackProcPtr moveCB, + RemoveLinearCallbackProcPtr removeCB, + pointer privData) +{ + FBLinearPtr linear; + int max_size; + + linear = xf86AllocateOffscreenLinear(pScreen, length, granularity, moveCB, + removeCB, privData); + if (linear != NULL) + return linear; + + /* The above allocation didn't succeed, so purge unlocked stuff and try + * again. + */ + xf86QueryLargestOffscreenLinear(pScreen, &max_size, granularity, + PRIORITY_EXTREME); + + if (max_size < length) + return NULL; + + xf86PurgeUnlockedOffscreenAreas(pScreen); + + linear = xf86AllocateOffscreenLinear(pScreen, length, granularity, moveCB, + removeCB, privData); + + return linear; +} +#endif diff --git a/src/i830_video.c b/src/i830_video.c index 79f5a7c8..22f5bee4 100644 --- a/src/i830_video.c +++ b/src/i830_video.c @@ -2073,8 +2073,6 @@ I830AllocateMemory(ScrnInfoPtr pScrn, struct linear_alloc *linear, int size, #endif /* I830_USE_EXA */ #ifdef I830_USE_XAA if (!pI830->useEXA) { - int max_size; - /* Converts an offset from XAA's linear allocator to an offset from the * start of fb. */ @@ -2100,25 +2098,11 @@ I830AllocateMemory(ScrnInfoPtr pScrn, struct linear_alloc *linear, int size, xf86FreeOffscreenLinear(linear->xaa); } - linear->xaa = xf86AllocateOffscreenLinear(pScreen, size, align, - NULL, NULL, NULL); - if (linear->xaa != NULL) { - linear->offset = XAA_OFFSET_TO_OFFSET(linear->xaa->offset); + linear->xaa = i830_xf86AllocateOffscreenLinear(pScreen, size, align, + NULL, NULL, NULL); + if (linear->xaa == NULL) return; - } - xf86QueryLargestOffscreenLinear(pScreen, &max_size, align, - PRIORITY_EXTREME); - - if (max_size < size) { - ErrorF("No memory available\n"); - linear->offset = 0; - return; - } - - xf86PurgeUnlockedOffscreenAreas(pScreen); - linear->xaa = xf86AllocateOffscreenLinear(pScreen, size, align, - NULL, NULL, NULL); linear->offset = XAA_OFFSET_TO_OFFSET(linear->xaa->offset); } #endif /* I830_USE_XAA */ From 2d95cb6f041653f7e530b1f32cf007929c23ef3b Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 27 Jan 2007 00:04:13 -0800 Subject: [PATCH 16/35] Make rotated pixmap size of mode, not rotated mode. Update only damage. Rotated pixmap should match size of displayed mode, not the rotated version of that size. Take damaged region, rotate each box and display them instead of displaying the whole screen after each damage update. This exposes a bug where the screen is not correctly damaged after rotation. --- src/i830_xf86Rotate.c | 78 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 14 deletions(-) diff --git a/src/i830_xf86Rotate.c b/src/i830_xf86Rotate.c index 8da79b6f..abfaec65 100644 --- a/src/i830_xf86Rotate.c +++ b/src/i830_xf86Rotate.c @@ -93,6 +93,46 @@ compWindowFormat (WindowPtr pWin) compGetWindowVisual (pWin)); } +static void +xf86RotateBox (BoxPtr dst, BoxPtr src, Rotation rotation, + int dest_width, int dest_height) +{ + switch (rotation & 0xf) { + default: + case RR_Rotate_0: + *dst = *src; + break; + case RR_Rotate_90: + dst->x1 = src->y1; + dst->y1 = dest_height - src->x2; + dst->x2 = src->y2; + dst->y2 = dest_height - src->x1; + break; + case RR_Rotate_180: + dst->x1 = dest_width - src->x2; + dst->y1 = dest_height - src->y2; + dst->x2 = dest_width - src->x1; + dst->y2 = dest_height - src->y1; + break; + case RR_Rotate_270: + dst->x1 = dest_width - src->y2; + dst->y1 = src->x1; + dst->y2 = src->x2; + dst->x2 = dest_width - src->y1; + break; + } + if (rotation & RR_Reflect_X) { + int x1 = dst->x1; + dst->x1 = dest_width - dst->x2; + dst->x2 = dest_width - x1; + } + if (rotation & RR_Reflect_Y) { + int y1 = dst->y1; + dst->y1 = dest_height - dst->y2; + dst->y2 = dest_height - y1; + } +} + static void xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) { @@ -104,6 +144,8 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) int error; PicturePtr src, dst; PictTransform transform; + int n = REGION_NUM_RECTS(region); + BoxPtr b = REGION_RECTS(region); src = CreatePicture (None, &src_pixmap->drawable, @@ -127,18 +169,13 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) ErrorF("couldn't create src pict\n"); return; } - /* Unfortunately, we don't do clipping on transformed source pictures. - * So we can't use this. Instead, we'll just repaint the whole screen - * for now, and do transform of the source region into a dest region - * later. - */ - /* SetPictureClipRegion (src, 0, 0, region); */ 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); @@ -177,11 +214,19 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) return; } - CompositePicture (PictOpSrc, - src, NULL, dst, - 0, 0, 0, 0, 0, 0, - dst_pixmap->drawable.width, - dst_pixmap->drawable.height); + while (n--) + { + BoxRec dst_box; + + xf86RotateBox (&dst_box, b, crtc->rotation, + crtc->mode.HDisplay, crtc->mode.VDisplay); + CompositePicture (PictOpSrc, + src, NULL, dst, + dst_box.x1, dst_box.y1, 0, 0, dst_box.x1, dst_box.y1, + dst_box.x2 - dst_box.x1, + dst_box.y2 - dst_box.y1); + b++; + } FreePicture (src, None); FreePicture (dst, None); } @@ -220,7 +265,7 @@ xf86RotateRedisplay(ScreenPtr pScreen) /* update damaged region */ if (REGION_NOTEMPTY(pScreen, &crtc_damage)) - xf86RotateCrtcRedisplay (crtc, &crtc_damage); + xf86RotateCrtcRedisplay (crtc, &crtc_damage); REGION_UNINIT (pScreen, &crtc_damage); } @@ -273,8 +318,13 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) } else { - int width = mode_width (mode, rotation); - int height = mode_height (mode, rotation); + /* + * these are the size of the shadow pixmap, which + * matches the mode, not the pre-rotated copy in the + * frame buffer + */ + int width = mode->HDisplay; + int height = mode->VDisplay; PixmapPtr shadow = crtc->rotatedPixmap; int old_width = shadow ? shadow->drawable.width : 0; int old_height = shadow ? shadow->drawable.height : 0; From 7a5f17087bda2833e84fa7e7ff0cb168943b89b6 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 27 Jan 2007 00:11:21 -0800 Subject: [PATCH 17/35] Mark crtc region as damaged when rotation is set. When shadow frame buffer is allocated for rotation, it needs to be initialized by copying from the frame buffer. Do this by simply marking the entire screen as damaged which will force an update. --- src/i830_xf86Rotate.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/i830_xf86Rotate.c b/src/i830_xf86Rotate.c index abfaec65..7d056e5a 100644 --- a/src/i830_xf86Rotate.c +++ b/src/i830_xf86Rotate.c @@ -328,6 +328,8 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) PixmapPtr shadow = crtc->rotatedPixmap; int old_width = shadow ? shadow->drawable.width : 0; int old_height = shadow ? shadow->drawable.height : 0; + BoxRec damage_box; + RegionRec damage_region; /* Allocate memory for rotation */ if (old_width != width || old_height != height) @@ -363,6 +365,14 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) { goto bail3; } + damage_box.x1 = 0; + damage_box.y1 = 0; + damage_box.x2 = mode_width (mode, rotation); + damage_box.y2 = mode_height (mode, rotation); + REGION_INIT (pScreen, &damage_region, &damage_box, 1); + DamageDamageRegion (&(*pScreen->GetScreenPixmap)(pScreen)->drawable, + &damage_region); + REGION_UNINIT (pScreen, &damage_region); } if (0) { From 00decd3b6cea0de22c88b9504dbe26d680e8ab16 Mon Sep 17 00:00:00 2001 From: Krzysztof Halasa Date: Sat, 27 Jan 2007 12:29:31 -0800 Subject: [PATCH 18/35] Don't zero out mode structure after setting name field. Instead of using memset to zero the structure (at the wrong time, no less), use xcalloc to gather pre-initialized memory. --- src/i830_xf86Modes.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/i830_xf86Modes.c b/src/i830_xf86Modes.c index f37eaeb7..b5f06d6c 100644 --- a/src/i830_xf86Modes.c +++ b/src/i830_xf86Modes.c @@ -564,7 +564,7 @@ xf86GetConfigModes (XF86ConfModeLinePtr conf_mode) for (; conf_mode; conf_mode = (XF86ConfModeLinePtr) conf_mode->list.next) { - mode = xalloc(sizeof(DisplayModeRec)); + mode = xcalloc(1, sizeof(DisplayModeRec)); if (!mode) continue; mode->name = xstrdup(conf_mode->ml_identifier); @@ -573,8 +573,6 @@ xf86GetConfigModes (XF86ConfModeLinePtr conf_mode) xfree (mode); continue; } - - memset(mode,'\0',sizeof(DisplayModeRec)); mode->type = 0; mode->Clock = conf_mode->ml_clock; mode->HDisplay = conf_mode->ml_hdisplay; From 20419d664c77e9a1a2de82987838b45f44774b47 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 27 Jan 2007 18:34:12 -0800 Subject: [PATCH 19/35] Paint ARGB cursor data to ARGB cursor memory space in frame buffer. When converting from global cursor to per-crtc cursor, the ARGB cursor data was accidentally painted to the wrong location, overwriting some critical data and causing the hardware to lock up. (along with generating a garbage cursor image from uninitialized data). --- src/i830_cursor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i830_cursor.c b/src/i830_cursor.c index da220f56..464eb6dd 100644 --- a/src/i830_cursor.c +++ b/src/i830_cursor.c @@ -389,7 +389,7 @@ static void I830CRTCLoadCursorARGB (xf86CrtcPtr crtc, CursorPtr pCurs) { I830Ptr pI830 = I830PTR(crtc->scrn); I830CrtcPrivatePtr intel_crtc = crtc->driver_private; - CARD32 *dst = (CARD32 *) (pI830->FbBase + intel_crtc->cursor_mem.Start); + CARD32 *dst = (CARD32 *) (pI830->FbBase + intel_crtc->cursor_mem_argb.Start); CARD32 *image = (CARD32 *)pCurs->bits->argb; int x, y, w, h; From d329fa121b2401cadb991c2854e077cfa68e15e8 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 27 Jan 2007 18:36:15 -0800 Subject: [PATCH 20/35] Fetch from root window instead of screen pixmap during rotation. The XAA Composite wrapper doesn't check for sourcing from the root pixmap when deciding whether to sync the hardware drawing. Fix the rotation code to reference the root window in IncludeInferiors mode to avoid reading without correct synchronization. --- src/i830_xf86Rotate.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/i830_xf86Rotate.c b/src/i830_xf86Rotate.c index 7d056e5a..3b8be613 100644 --- a/src/i830_xf86Rotate.c +++ b/src/i830_xf86Rotate.c @@ -138,7 +138,7 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) { ScrnInfoPtr scrn = crtc->scrn; ScreenPtr screen = scrn->pScreen; - PixmapPtr src_pixmap = (*screen->GetScreenPixmap) (screen); + WindowPtr root = WindowTable[screen->myNum]; PixmapPtr dst_pixmap = crtc->rotatedPixmap; PictFormatPtr format = compWindowFormat (WindowTable[screen->myNum]); int error; @@ -146,12 +146,13 @@ xf86RotateCrtcRedisplay (xf86CrtcPtr crtc, RegionPtr region) PictTransform transform; int n = REGION_NUM_RECTS(region); BoxPtr b = REGION_RECTS(region); + XID include_inferiors = IncludeInferiors; src = CreatePicture (None, - &src_pixmap->drawable, + &root->drawable, format, - 0L, - NULL, + CPSubwindowMode, + &include_inferiors, serverClient, &error); if (!src) { From 6eb69e737864d06dc6d4fbb4cd85a027cbb7643a Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Sun, 28 Jan 2007 19:40:12 +1100 Subject: [PATCH 21/35] ch7xxx: actually power up the chip around connection detection --- src/ch7xxx/ch7xxx.c | 13 ++++++++++++- src/ch7xxx/ch7xxx_reg.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/ch7xxx/ch7xxx.c b/src/ch7xxx/ch7xxx.c index 9e2a0055..161aebf4 100644 --- a/src/ch7xxx/ch7xxx.c +++ b/src/ch7xxx/ch7xxx.c @@ -183,9 +183,20 @@ static xf86OutputStatus ch7xxx_detect(I2CDevPtr d) { struct ch7xxx_priv *dev_priv = d->DriverPrivate.ptr; - CARD8 cdet; + CARD8 cdet, gpio, orig_pm, pm; + + ch7xxx_read(dev_priv, CH7xxx_PM, &orig_pm); + + pm = orig_pm; + pm &= ~CH7xxx_PM_FPD; + pm |= CH7xxx_PM_DVIL | CH7xxx_PM_DVIP; + + ch7xxx_write(dev_priv, CH7xxx_PM, pm); + ch7xxx_read(dev_priv, CH7xxx_CONNECTION_DETECT, &cdet); + ch7xxx_write(dev_priv, CH7xxx_PM, orig_pm); + if (cdet & CH7xxx_CDET_DVI) return XF86OutputStatusConnected; return XF86OutputStatusDisconnected; diff --git a/src/ch7xxx/ch7xxx_reg.h b/src/ch7xxx/ch7xxx_reg.h index 0ec84ea9..328b6533 100644 --- a/src/ch7xxx/ch7xxx_reg.h +++ b/src/ch7xxx/ch7xxx_reg.h @@ -44,6 +44,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #define CH7xxx_CM_MCP (1<<2) #define CH7xxx_INPUT_CLOCK 0x1D #define CH7xxx_GPIO 0x1E +#define CH7xxx_GPIO_HPIR (1<<3) #define CH7xxx_IDF 0x1F #define CH7xxx_IDF_HSP (1<<3) From 89ace3e81fe72075b1709b073c05532f13b7f0d1 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 29 Jan 2007 09:43:35 -0800 Subject: [PATCH 22/35] Bug #9680: Remove bogus blank length limiting in xf86SetModeCrtc(). Our modes typically come from EDID or default modes, and when the monitor asks for a specific mode, deciding to tweak it usually results in incorrect display. And if the user is specifying a mode by hand, tweaking it then is still pretty rude. Reviewed by: ajax --- src/i830_xf86Modes.c | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/src/i830_xf86Modes.c b/src/i830_xf86Modes.c index 482a3320..7403a4c2 100644 --- a/src/i830_xf86Modes.c +++ b/src/i830_xf86Modes.c @@ -150,45 +150,6 @@ xf86SetModeCrtc(DisplayModePtr p, int adjustFlags) } p->CrtcHAdjusted = FALSE; p->CrtcVAdjusted = FALSE; - - /* - * XXX - * - * The following is taken from VGA, but applies to other cores as well. - */ - p->CrtcVBlankStart = min(p->CrtcVSyncStart, p->CrtcVDisplay); - p->CrtcVBlankEnd = max(p->CrtcVSyncEnd, p->CrtcVTotal); - if ((p->CrtcVBlankEnd - p->CrtcVBlankStart) >= 127) { - /* - * V Blanking size must be < 127. - * Moving blank start forward is safer than moving blank end - * back, since monitors clamp just AFTER the sync pulse (or in - * the sync pulse), but never before. - */ - p->CrtcVBlankStart = p->CrtcVBlankEnd - 127; - /* - * If VBlankStart is now > VSyncStart move VBlankStart - * to VSyncStart using the maximum width that fits into - * VTotal. - */ - if (p->CrtcVBlankStart > p->CrtcVSyncStart) { - p->CrtcVBlankStart = p->CrtcVSyncStart; - p->CrtcVBlankEnd = min(p->CrtcHBlankStart + 127, p->CrtcVTotal); - } - } - p->CrtcHBlankStart = min(p->CrtcHSyncStart, p->CrtcHDisplay); - p->CrtcHBlankEnd = max(p->CrtcHSyncEnd, p->CrtcHTotal); - - if ((p->CrtcHBlankEnd - p->CrtcHBlankStart) >= 63 * 8) { - /* - * H Blanking size must be < 63*8. Same remark as above. - */ - p->CrtcHBlankStart = p->CrtcHBlankEnd - 63 * 8; - if (p->CrtcHBlankStart > p->CrtcHSyncStart) { - p->CrtcHBlankStart = p->CrtcHSyncStart; - p->CrtcHBlankEnd = min(p->CrtcHBlankStart + 63 * 8, p->CrtcHTotal); - } - } } /** From 67c6a490e63f6997f8198bc3ab180a1af097fe86 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 29 Jan 2007 09:53:58 -0800 Subject: [PATCH 23/35] Remove dead code to undo the damage of xf86SetModeCrtc() blank limiting. --- src/i830_driver.c | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/i830_driver.c b/src/i830_driver.c index 43f47252..32729c17 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -1600,25 +1600,6 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) PreInitCleanup(pScrn); return FALSE; } - - /* - * Fix up modes to make hblank start at hsync start. - * I don't know why the xf86 code mangles this... - */ - { - DisplayModePtr p; - - for (p = pScrn->modes; p;) { - xf86DrvMsg (pScrn->scrnIndex, - X_INFO, "move blank start from %d to %d\n", - p->CrtcHBlankStart, p->CrtcHDisplay); - p->CrtcHBlankStart = p->CrtcHDisplay; - p = p->next; - if (p == pScrn->modes) - break; - } - } - pScrn->currentMode = pScrn->modes; pI830->disableTiling = FALSE; From 9da1791eeca446cd59e2e7d0803e8a7920dbbea5 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 29 Jan 2007 17:10:14 -0800 Subject: [PATCH 24/35] Restore a few important lines from 89ace3e81fe72075b1709b073c05532f13b7f0d1 Typical results were failure to sync, and a black screen. --- src/i830_xf86Modes.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/i830_xf86Modes.c b/src/i830_xf86Modes.c index 7403a4c2..a08d5a47 100644 --- a/src/i830_xf86Modes.c +++ b/src/i830_xf86Modes.c @@ -148,6 +148,11 @@ xf86SetModeCrtc(DisplayModePtr p, int adjustFlags) p->CrtcVSyncEnd *= p->VScan; p->CrtcVTotal *= p->VScan; } + p->CrtcVBlankStart = min(p->CrtcVSyncStart, p->CrtcVDisplay); + p->CrtcVBlankEnd = max(p->CrtcVSyncEnd, p->CrtcVTotal); + p->CrtcHBlankStart = min(p->CrtcHSyncStart, p->CrtcHDisplay); + p->CrtcHBlankEnd = max(p->CrtcHSyncEnd, p->CrtcHTotal); + p->CrtcHAdjusted = FALSE; p->CrtcVAdjusted = FALSE; } From 6a628ae12b0568d656059891c5bca4415d8a735f Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 30 Jan 2007 14:19:05 -0800 Subject: [PATCH 25/35] Simplify EXA acceleration transform handling. --- src/i830.h | 2 +- src/i830_exa.c | 4 ++-- src/i830_exa_render.c | 10 ++-------- src/i915_exa_render.c | 9 ++------- src/i965_exa_render.c | 18 +++++------------- 5 files changed, 12 insertions(+), 31 deletions(-) diff --git a/src/i830.h b/src/i830.h index 9ffae94c..d9dae5b7 100644 --- a/src/i830.h +++ b/src/i830.h @@ -392,7 +392,7 @@ typedef struct _I830Rec { /* EXA render state */ float scale_units[2][2]; - Bool is_transform[2]; + /** Transform pointers for src/mask, or NULL if identity */ PictTransform *transform[2]; /* i915 EXA render state */ CARD32 mapstate[6]; diff --git a/src/i830_exa.c b/src/i830_exa.c index 3fd5e4ae..b976f548 100644 --- a/src/i830_exa.c +++ b/src/i830_exa.c @@ -308,7 +308,7 @@ IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, srcYend = srcY + h; maskXend = maskX + w; maskYend = maskY + h; - if (pI830->is_transform[0]) { + if (pI830->transform[0] != NULL) { v.vector[0] = IntToxFixed(srcX); v.vector[1] = IntToxFixed(srcY); v.vector[2] = xFixed1; @@ -322,7 +322,7 @@ IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, srcXend = xFixedToInt(v.vector[0]); srcYend = xFixedToInt(v.vector[1]); } - if (pI830->is_transform[1]) { + if (pI830->transform[1] != NULL) { v.vector[0] = IntToxFixed(maskX); v.vector[1] = IntToxFixed(maskY); v.vector[2] = xFixed1; diff --git a/src/i830_exa_render.c b/src/i830_exa_render.c index ae4f95f1..98a444f1 100644 --- a/src/i830_exa_render.c +++ b/src/i830_exa_render.c @@ -328,13 +328,7 @@ I830TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) ADVANCE_LP_RING(); } - /* XXX */ - if (pPict->transform != 0) { - pI830->is_transform[unit] = TRUE; - pI830->transform[unit] = pPict->transform; - } else { - pI830->is_transform[unit] = FALSE; - } + pI830->transform[unit] = pPict->transform; #ifdef I830DEBUG ErrorF("try to sync to show any errors..."); @@ -398,7 +392,7 @@ I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, if (!I830TextureSetup(pMaskPicture, pMask, 1)) I830FALLBACK("fail to setup mask texture\n"); } else { - pI830->is_transform[1] = FALSE; + pI830->transform[1] = NULL; pI830->scale_units[1][0] = -1; pI830->scale_units[1][1] = -1; } diff --git a/src/i915_exa_render.c b/src/i915_exa_render.c index 46533b35..8705c6de 100644 --- a/src/i915_exa_render.c +++ b/src/i915_exa_render.c @@ -296,12 +296,7 @@ I915TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) pI830->samplerstate[unit * 3 + 1] |= unit << SS3_TEXTUREMAP_INDEX_SHIFT; pI830->samplerstate[unit * 3 + 2] = 0x00000000; /* border color */ - if (pPict->transform != 0) { - pI830->is_transform[unit] = TRUE; - pI830->transform[unit] = pPict->transform; - } else { - pI830->is_transform[unit] = FALSE; - } + pI830->transform[unit] = pPict->transform; return TRUE; } @@ -333,7 +328,7 @@ I915EXAPrepareComposite(int op, PicturePtr pSrcPicture, if (!I915TextureSetup(pMaskPicture, pMask, 1)) I830FALLBACK("fail to setup mask texture\n"); } else { - pI830->is_transform[1] = FALSE; + pI830->transform[1] = NULL; pI830->scale_units[1][0] = -1; pI830->scale_units[1][1] = -1; } diff --git a/src/i965_exa_render.c b/src/i965_exa_render.c index 572efd65..3e620279 100644 --- a/src/i965_exa_render.c +++ b/src/i965_exa_render.c @@ -390,22 +390,14 @@ I965EXAPrepareComposite(int op, PicturePtr pSrcPicture, pI830->scale_units[0][0] = pSrc->drawable.width; pI830->scale_units[0][1] = pSrc->drawable.height; - if (pSrcPicture->transform) { - pI830->is_transform[0] = TRUE; - pI830->transform[0] = pSrcPicture->transform; - } else - pI830->is_transform[0] = FALSE; + pI830->transform[0] = pSrcPicture->transform; if (!pMask) { - pI830->is_transform[1] = FALSE; + pI830->transform[1] = NULL; pI830->scale_units[1][0] = -1; pI830->scale_units[1][1] = -1; } else { - if (pMaskPicture->transform) { - pI830->is_transform[1] = TRUE; - pI830->transform[1] = pMaskPicture->transform; - } else - pI830->is_transform[1] = FALSE; + pI830->transform[1] = pMaskPicture->transform; pI830->scale_units[1][0] = pMask->drawable.width; pI830->scale_units[1][1] = pMask->drawable.height; } @@ -1003,7 +995,7 @@ I965EXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, srcYend = srcY + h; maskXend = maskX + w; maskYend = maskY + h; - if (pI830->is_transform[0]) { + if (pI830->transform[0] != NULL) { v.vector[0] = IntToxFixed(srcX); v.vector[1] = IntToxFixed(srcY); v.vector[2] = xFixed1; @@ -1017,7 +1009,7 @@ I965EXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, srcXend = xFixedToInt(v.vector[0]); srcYend = xFixedToInt(v.vector[1]); } - if (pI830->is_transform[1]) { + if (pI830->transform[1] != NULL) { v.vector[0] = IntToxFixed(maskX); v.vector[1] = IntToxFixed(maskY); v.vector[2] = xFixed1; From 4cd552e8f4851e029e43bf778cd8340f6c2c4881 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 30 Jan 2007 16:34:50 -0800 Subject: [PATCH 26/35] Fix accelerated Render transformations. Previously, we tried to use 2 points instead of 3 to describe the source rectangles, which mostly just worked for scaling. --- src/i830.h | 4 ++ src/i830_exa.c | 135 ++++++++++++++++++++++-------------------- src/i965_exa_render.c | 103 ++++++++++++-------------------- 3 files changed, 114 insertions(+), 128 deletions(-) diff --git a/src/i830.h b/src/i830.h index d9dae5b7..66cfba1e 100644 --- a/src/i830.h +++ b/src/i830.h @@ -657,6 +657,10 @@ I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture, PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst); +void +i830_get_transformed_coordinates(int x, int y, PictTransformPtr transform, + float *x_out, float *y_out); + extern const int I830PatternROP[16]; extern const int I830CopyROP[16]; #endif diff --git a/src/i830_exa.c b/src/i830_exa.c index b976f548..b0d886b0 100644 --- a/src/i830_exa.c +++ b/src/i830_exa.c @@ -282,69 +282,76 @@ I830EXADoneCopy(PixmapPtr pDstPixmap) #endif } +#define xFixedToFloat(val) \ + ((float)xFixedToInt(val) + ((float)xFixedFrac(val) / 65536.0)) + +/** + * Returns the floating-point coordinates transformed by the given transform. + * + * transform may be null. + */ +void +i830_get_transformed_coordinates(int x, int y, PictTransformPtr transform, + float *x_out, float *y_out) +{ + if (transform == NULL) { + *x_out = x; + *y_out = y; + } else { + PictVector v; + + v.vector[0] = IntToxFixed(x); + v.vector[1] = IntToxFixed(y); + v.vector[2] = xFixed1; + PictureTransformPoint(transform, &v); + *x_out = xFixedToFloat(v.vector[0]); + *y_out = xFixedToFloat(v.vector[1]); + } +} + +/** + * Do a single rectangle composite operation. + * + * This function is shared between i830 and i915 generation code. + */ static void IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, int w, int h) { ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); - int srcXend, srcYend, maskXend, maskYend; - PictVector v; - int pMask = 1; + Bool has_mask; + float src_x[3], src_y[3], mask_x[3], mask_y[3]; - DPRINTF(PFX, "Composite: srcX %d, srcY %d\n\t maskX %d, maskY %d\n\t" - "dstX %d, dstY %d\n\twidth %d, height %d\n\t" - "src_scale_x %f, src_scale_y %f, " - "mask_scale_x %f, mask_scale_y %f\n", - srcX, srcY, maskX, maskY, dstX, dstY, w, h, - pI830->scale_units[0][0], pI830->scale_units[0][1], - pI830->scale_units[1][0], pI830->scale_units[1][1]); + i830_get_transformed_coordinates(srcX, srcY, + pI830->transform[0], + &src_x[0], &src_y[0]); + i830_get_transformed_coordinates(srcX, srcY + h, + pI830->transform[0], + &src_x[1], &src_y[1]); + i830_get_transformed_coordinates(srcX + w, srcY + h, + pI830->transform[0], + &src_x[2], &src_y[2]); if (pI830->scale_units[1][0] == -1 || pI830->scale_units[1][1] == -1) { - pMask = 0; + has_mask = FALSE; + } else { + has_mask = TRUE; + i830_get_transformed_coordinates(maskX, maskY, + pI830->transform[1], + &mask_x[0], &mask_y[0]); + i830_get_transformed_coordinates(maskX, maskY + h, + pI830->transform[1], + &mask_x[1], &mask_y[1]); + i830_get_transformed_coordinates(maskX + w, maskY + h, + pI830->transform[1], + &mask_x[2], &mask_y[2]); } - srcXend = srcX + w; - srcYend = srcY + h; - maskXend = maskX + w; - maskYend = maskY + h; - if (pI830->transform[0] != NULL) { - v.vector[0] = IntToxFixed(srcX); - v.vector[1] = IntToxFixed(srcY); - v.vector[2] = xFixed1; - PictureTransformPoint(pI830->transform[0], &v); - srcX = xFixedToInt(v.vector[0]); - srcY = xFixedToInt(v.vector[1]); - v.vector[0] = IntToxFixed(srcXend); - v.vector[1] = IntToxFixed(srcYend); - v.vector[2] = xFixed1; - PictureTransformPoint(pI830->transform[0], &v); - srcXend = xFixedToInt(v.vector[0]); - srcYend = xFixedToInt(v.vector[1]); - } - if (pI830->transform[1] != NULL) { - v.vector[0] = IntToxFixed(maskX); - v.vector[1] = IntToxFixed(maskY); - v.vector[2] = xFixed1; - PictureTransformPoint(pI830->transform[1], &v); - maskX = xFixedToInt(v.vector[0]); - maskY = xFixedToInt(v.vector[1]); - v.vector[0] = IntToxFixed(maskXend); - v.vector[1] = IntToxFixed(maskYend); - v.vector[2] = xFixed1; - PictureTransformPoint(pI830->transform[1], &v); - maskXend = xFixedToInt(v.vector[0]); - maskYend = xFixedToInt(v.vector[1]); - } - DPRINTF(PFX, "After transform: srcX %d, srcY %d,srcXend %d, srcYend %d\n\t" - "maskX %d, maskY %d, maskXend %d, maskYend %d\n\t" - "dstX %d, dstY %d\n", srcX, srcY, srcXend, srcYend, - maskX, maskY, maskXend, maskYend, dstX, dstY); - { int vertex_count; - if (pMask) + if (has_mask) vertex_count = 3*6; else vertex_count = 3*4; @@ -361,29 +368,29 @@ IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, OUT_RING_F(dstX); OUT_RING_F(dstY); - OUT_RING_F(srcX / pI830->scale_units[0][0]); - OUT_RING_F(srcY / pI830->scale_units[0][1]); - if (pMask) { - OUT_RING_F(maskX / pI830->scale_units[1][0]); - OUT_RING_F(maskY / pI830->scale_units[1][1]); + OUT_RING_F(src_x[0] / pI830->scale_units[0][0]); + OUT_RING_F(src_y[0] / pI830->scale_units[0][1]); + if (has_mask) { + OUT_RING_F(mask_x[0] / pI830->scale_units[1][0]); + OUT_RING_F(mask_y[0] / pI830->scale_units[1][1]); } OUT_RING_F(dstX); OUT_RING_F(dstY + h); - OUT_RING_F(srcX / pI830->scale_units[0][0]); - OUT_RING_F(srcYend / pI830->scale_units[0][1]); - if (pMask) { - OUT_RING_F(maskX / pI830->scale_units[1][0]); - OUT_RING_F(maskYend / pI830->scale_units[1][1]); + OUT_RING_F(src_x[1] / pI830->scale_units[0][0]); + OUT_RING_F(src_y[1] / pI830->scale_units[0][1]); + if (has_mask) { + OUT_RING_F(mask_x[1] / pI830->scale_units[1][0]); + OUT_RING_F(mask_y[1] / pI830->scale_units[1][1]); } OUT_RING_F(dstX + w); OUT_RING_F(dstY + h); - OUT_RING_F(srcXend / pI830->scale_units[0][0]); - OUT_RING_F(srcYend / pI830->scale_units[0][1]); - if (pMask) { - OUT_RING_F(maskXend / pI830->scale_units[1][0]); - OUT_RING_F(maskYend / pI830->scale_units[1][1]); + OUT_RING_F(src_x[2] / pI830->scale_units[0][0]); + OUT_RING_F(src_y[2] / pI830->scale_units[0][1]); + if (has_mask) { + OUT_RING_F(mask_x[2] / pI830->scale_units[1][0]); + OUT_RING_F(mask_y[2] / pI830->scale_units[1][1]); } ADVANCE_LP_RING(); } diff --git a/src/i965_exa_render.c b/src/i965_exa_render.c index 3e620279..1dbccc68 100644 --- a/src/i965_exa_render.c +++ b/src/i965_exa_render.c @@ -975,60 +975,35 @@ I965EXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, { ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); - int srcXend, srcYend, maskXend, maskYend; - PictVector v; - int pMask = 1, i; + Bool has_mask; + float src_x[3], src_y[3], mask_x[3], mask_y[3]; + int i; - DPRINTF(PFX, "Composite: srcX %d, srcY %d\n\t maskX %d, maskY %d\n\t" - "dstX %d, dstY %d\n\twidth %d, height %d\n\t" - "src_scale_x %f, src_scale_y %f, " - "mask_scale_x %f, mask_scale_y %f\n", - srcX, srcY, maskX, maskY, dstX, dstY, w, h, - pI830->scale_units[0][0], pI830->scale_units[0][1], - pI830->scale_units[1][0], pI830->scale_units[1][1]); + i830_get_transformed_coordinates(srcX, srcY, + pI830->transform[0], + &src_x[0], &src_y[0]); + i830_get_transformed_coordinates(srcX, srcY + h, + pI830->transform[0], + &src_x[1], &src_y[1]); + i830_get_transformed_coordinates(srcX + w, srcY + h, + pI830->transform[0], + &src_x[2], &src_y[2]); if (pI830->scale_units[1][0] == -1 || pI830->scale_units[1][1] == -1) { - pMask = 0; + has_mask = FALSE; + } else { + has_mask = TRUE; + i830_get_transformed_coordinates(maskX, maskY, + pI830->transform[1], + &mask_x[0], &mask_y[0]); + i830_get_transformed_coordinates(maskX, maskY + h, + pI830->transform[1], + &mask_x[1], &mask_y[1]); + i830_get_transformed_coordinates(maskX + w, maskY + h, + pI830->transform[1], + &mask_x[2], &mask_y[2]); } - srcXend = srcX + w; - srcYend = srcY + h; - maskXend = maskX + w; - maskYend = maskY + h; - if (pI830->transform[0] != NULL) { - v.vector[0] = IntToxFixed(srcX); - v.vector[1] = IntToxFixed(srcY); - v.vector[2] = xFixed1; - PictureTransformPoint(pI830->transform[0], &v); - srcX = xFixedToInt(v.vector[0]); - srcY = xFixedToInt(v.vector[1]); - v.vector[0] = IntToxFixed(srcXend); - v.vector[1] = IntToxFixed(srcYend); - v.vector[2] = xFixed1; - PictureTransformPoint(pI830->transform[0], &v); - srcXend = xFixedToInt(v.vector[0]); - srcYend = xFixedToInt(v.vector[1]); - } - if (pI830->transform[1] != NULL) { - v.vector[0] = IntToxFixed(maskX); - v.vector[1] = IntToxFixed(maskY); - v.vector[2] = xFixed1; - PictureTransformPoint(pI830->transform[1], &v); - maskX = xFixedToInt(v.vector[0]); - maskY = xFixedToInt(v.vector[1]); - v.vector[0] = IntToxFixed(maskXend); - v.vector[1] = IntToxFixed(maskYend); - v.vector[2] = xFixed1; - PictureTransformPoint(pI830->transform[1], &v); - maskXend = xFixedToInt(v.vector[0]); - maskYend = xFixedToInt(v.vector[1]); - } - - DPRINTF(PFX, "After transform: srcX %d, srcY %d,srcXend %d, srcYend %d\n\t" - "maskX %d, maskY %d, maskXend %d, maskYend %d\n\t" - "dstX %d, dstY %d\n", srcX, srcY, srcXend, srcYend, - maskX, maskY, maskXend, maskYend, dstX, dstY); - /* Wait for any existing composite rectangles to land before we overwrite * the VB with the next one. */ @@ -1036,31 +1011,31 @@ I965EXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, i = 0; /* rect (x2,y2) */ - vb[i++] = (float)(srcXend) / pI830->scale_units[0][0]; - vb[i++] = (float)(srcYend) / pI830->scale_units[0][1]; - if (pMask) { - vb[i++] = (float)maskXend / pI830->scale_units[1][0]; - vb[i++] = (float)maskYend / pI830->scale_units[1][1]; + vb[i++] = src_x[2] / pI830->scale_units[0][0]; + vb[i++] = src_y[2] / pI830->scale_units[0][1]; + if (has_mask) { + vb[i++] = mask_x[2] / pI830->scale_units[1][0]; + vb[i++] = mask_y[2] / pI830->scale_units[1][1]; } vb[i++] = (float)(dstX + w); vb[i++] = (float)(dstY + h); /* rect (x1,y2) */ - vb[i++] = (float)(srcX)/ pI830->scale_units[0][0]; - vb[i++] = (float)(srcYend)/ pI830->scale_units[0][1]; - if (pMask) { - vb[i++] = (float)maskX / pI830->scale_units[1][0]; - vb[i++] = (float)maskYend / pI830->scale_units[1][1]; + vb[i++] = src_x[1] / pI830->scale_units[0][0]; + vb[i++] = src_y[1] / pI830->scale_units[0][1]; + if (has_mask) { + vb[i++] = mask_x[1] / pI830->scale_units[1][0]; + vb[i++] = mask_y[1] / pI830->scale_units[1][1]; } vb[i++] = (float)dstX; vb[i++] = (float)(dstY + h); /* rect (x1,y1) */ - vb[i++] = (float)(srcX) / pI830->scale_units[0][0]; - vb[i++] = (float)(srcY) / pI830->scale_units[0][1]; - if (pMask) { - vb[i++] = (float)maskX / pI830->scale_units[1][0]; - vb[i++] = (float)maskY / pI830->scale_units[1][1]; + vb[i++] = src_x[0] / pI830->scale_units[0][0]; + vb[i++] = src_y[0] / pI830->scale_units[0][1]; + if (has_mask) { + vb[i++] = mask_x[0] / pI830->scale_units[1][0]; + vb[i++] = mask_y[0] / pI830->scale_units[1][1]; } vb[i++] = (float)dstX; vb[i++] = (float)dstY; From e62751db8b1a631c22ba0f77c932be4ab39ba741 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 31 Jan 2007 12:15:38 -0800 Subject: [PATCH 27/35] Add an accelerated path for rotation Render operations in XAA. The now-generic (kind of) EXA code will be cleaned up and moved to generic files in a later commit. --- src/i830.h | 20 ++++- src/i830_accel.c | 30 ++++++++ src/i830_exa.c | 4 +- src/i830_exa_render.c | 8 +- src/i830_xaa.c | 168 +++++++++++++++++++++++++++++++++++++++++- src/i915_exa_render.c | 8 +- src/i965_exa_render.c | 12 +-- 7 files changed, 231 insertions(+), 19 deletions(-) diff --git a/src/i830.h b/src/i830.h index 66cfba1e..58e4ec34 100644 --- a/src/i830.h +++ b/src/i830.h @@ -365,6 +365,18 @@ typedef struct _I830Rec { Bool cursorOn; #ifdef I830_USE_XAA XAAInfoRecPtr AccelInfoRec; + + /* additional XAA accelerated Composite support */ + CompositeProcPtr saved_composite; + Bool (*xaa_check_composite)(int op, PicturePtr pSrc, PicturePtr pMask, + PicturePtr pDst); + Bool (*xaa_prepare_composite)(int op, PicturePtr pSrc, PicturePtr pMask, + PicturePtr pDst, PixmapPtr pSrcPixmap, + PixmapPtr pMaskPixmap, PixmapPtr pDstPixmap); + void (*xaa_composite)(PixmapPtr pDst, int xSrc, int ySrc, + int xMask, int yMask, int xDst, int yDst, + int w, int h); + void (*xaa_done_composite)(PixmapPtr pDst); #endif xf86CursorInfoPtr CursorInfoRec; CloseScreenProcPtr CloseScreen; @@ -560,6 +572,8 @@ extern Bool I830DRILock(ScrnInfoPtr pScrn); extern Bool I830DRISetVBlankInterrupt (ScrnInfoPtr pScrn, Bool on); #endif +unsigned long intel_get_pixmap_offset(PixmapPtr pPix); +unsigned long intel_get_pixmap_pitch(PixmapPtr pPix); extern Bool I830AccelInit(ScreenPtr pScreen); extern void I830SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop, @@ -634,7 +648,6 @@ DisplayModePtr i830_ddc_get_modes(xf86OutputPtr output); /* i830_tv.c */ void i830_tv_init(ScrnInfoPtr pScrn); -#ifdef I830_USE_EXA extern Bool I830EXACheckComposite(int, PicturePtr, PicturePtr, PicturePtr); extern Bool I830EXAPrepareComposite(int, PicturePtr, PicturePtr, PicturePtr, PixmapPtr, PixmapPtr, PixmapPtr); @@ -647,6 +660,9 @@ extern Bool I965EXAPrepareComposite(int, PicturePtr, PicturePtr, PicturePtr, PixmapPtr, PixmapPtr, PixmapPtr); extern void I965EXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, int width, int height); +void IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, + int maskX, int maskY, int dstX, int dstY, int w, int h); +void IntelEXADoneComposite(PixmapPtr pDst); extern Bool I830EXACheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, @@ -663,7 +679,7 @@ i830_get_transformed_coordinates(int x, int y, PictTransformPtr transform, extern const int I830PatternROP[16]; extern const int I830CopyROP[16]; -#endif + /* Flags for memory allocation function */ #define FROM_ANYWHERE 0x00000000 #define FROM_POOL_ONLY 0x00000001 diff --git a/src/i830_accel.c b/src/i830_accel.c index 5fdd1012..db3168a8 100644 --- a/src/i830_accel.c +++ b/src/i830_accel.c @@ -60,6 +60,36 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "i810_reg.h" #include "i830_debug.h" +unsigned long +intel_get_pixmap_offset(PixmapPtr pPix) +{ + ScreenPtr pScreen = pPix->drawable.pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + I830Ptr pI830 = I830PTR(pScrn); + +#ifdef I830_USE_EXA + if (pI830->useEXA) + return exaGetPixmapOffset(pPix); +#endif + return (unsigned long)pPix->devPrivate.ptr - (unsigned long)pI830->FbBase; +} + +unsigned long +intel_get_pixmap_pitch(PixmapPtr pPix) +{ + ScreenPtr pScreen = pPix->drawable.pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + I830Ptr pI830 = I830PTR(pScrn); + +#ifdef I830_USE_EXA + if (pI830->useEXA) + return exaGetPixmapPitch(pPix); +#endif +#ifdef I830_USE_XAA + return (unsigned long)pPix->devKind; +#endif +} + int I830WaitLpRing(ScrnInfoPtr pScrn, int n, int timeout_millis) { diff --git a/src/i830_exa.c b/src/i830_exa.c index b0d886b0..02d2dcfe 100644 --- a/src/i830_exa.c +++ b/src/i830_exa.c @@ -314,7 +314,7 @@ i830_get_transformed_coordinates(int x, int y, PictTransformPtr transform, * * This function is shared between i830 and i915 generation code. */ -static void +void IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, int w, int h) { @@ -396,7 +396,7 @@ IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, } } -static void +void IntelEXADoneComposite(PixmapPtr pDst) { #if ALWAYS_SYNC diff --git a/src/i830_exa_render.c b/src/i830_exa_render.c index 98a444f1..bf521b45 100644 --- a/src/i830_exa_render.c +++ b/src/i830_exa_render.c @@ -256,8 +256,8 @@ I830TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) int w, h, i; CARD32 wrap_mode = TEXCOORDMODE_CLAMP; - offset = exaGetPixmapOffset(pPix); - pitch = exaGetPixmapPitch(pPix); + offset = intel_get_pixmap_offset(pPix); + pitch = intel_get_pixmap_pitch(pPix); w = pPict->pDrawable->width; h = pPict->pDrawable->height; pI830->scale_units[unit][0] = pPix->drawable.width; @@ -381,8 +381,8 @@ I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, CARD32 dst_format, dst_offset, dst_pitch; I830GetDestFormat(pDstPicture, &dst_format); - dst_offset = exaGetPixmapOffset(pDst); - dst_pitch = exaGetPixmapPitch(pDst); + dst_offset = intel_get_pixmap_offset(pDst); + dst_pitch = intel_get_pixmap_pitch(pDst); pI830->last_3d = LAST_3D_RENDER; diff --git a/src/i830_xaa.c b/src/i830_xaa.c index 13ba7432..be1fb831 100644 --- a/src/i830_xaa.c +++ b/src/i830_xaa.c @@ -52,6 +52,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "xaarop.h" #include "i830.h" #include "i810_reg.h" +#include "mipict.h" #ifndef DO_SCANLINE_IMAGE_WRITE #define DO_SCANLINE_IMAGE_WRITE 0 @@ -91,11 +92,26 @@ static void I830SubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno); #endif static void I830RestoreAccelState(ScrnInfoPtr pScrn); +void +i830_xaa_composite(CARD8 op, + PicturePtr pSrc, + PicturePtr pMask, + PicturePtr pDst, + INT16 xSrc, + INT16 ySrc, + INT16 xMask, + INT16 yMask, + INT16 xDst, + INT16 yDst, + CARD16 width, + CARD16 height); + Bool I830XAAInit(ScreenPtr pScreen) { XAAInfoRecPtr infoPtr; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); I830Ptr pI830 = I830PTR(pScrn); int i; int width = 0; @@ -220,7 +236,37 @@ I830XAAInit(ScreenPtr pScreen) I830SelectBuffer(pScrn, I830_SELECT_FRONT); - return XAAInit(pScreen, infoPtr); + if (!XAAInit(pScreen, infoPtr)) + return FALSE; + + if (ps != NULL) { + if (IS_I915G(pI830) || IS_I915GM(pI830) || + IS_I945G(pI830) || IS_I945GM(pI830)) + { + pI830->xaa_check_composite = I915EXACheckComposite; + pI830->xaa_prepare_composite = I915EXAPrepareComposite; + pI830->xaa_composite = IntelEXAComposite; + pI830->xaa_done_composite = IntelEXADoneComposite; + } else if (IS_I865G(pI830) || IS_I855(pI830) || + IS_845G(pI830) || IS_I830(pI830)) { + pI830->xaa_check_composite = I830EXACheckComposite; + pI830->xaa_prepare_composite = I830EXAPrepareComposite; + pI830->xaa_composite = IntelEXAComposite; + pI830->xaa_done_composite = IntelEXADoneComposite; + } else if (IS_I965G(pI830)) { + pI830->xaa_check_composite = I965EXACheckComposite; + pI830->xaa_prepare_composite = I965EXAPrepareComposite; + pI830->xaa_composite = I965EXAComposite; + pI830->xaa_done_composite = IntelEXADoneComposite; + } else { + return TRUE; + } + + pI830->saved_composite = ps->Composite; + ps->Composite = i830_xaa_composite; + } + + return TRUE; } #ifdef XF86DRI @@ -694,6 +740,126 @@ I830SubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno) #endif /* DO_SCANLINE_IMAGE_WRITE */ /* Support for multiscreen */ +/** + * Special case acceleration for Render acceleration of rotation operations + * by xf86Rotate.c + */ +void +i830_xaa_composite(CARD8 op, + PicturePtr pSrc, + PicturePtr pMask, + PicturePtr pDst, + INT16 xSrc, + INT16 ySrc, + INT16 xMask, + INT16 yMask, + INT16 xDst, + INT16 yDst, + CARD16 width, + CARD16 height) +{ + ScreenPtr pScreen = pDst->pDrawable->pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + I830Ptr pI830 = I830PTR(pScrn); + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + PictureScreenPtr ps; + PixmapPtr pSrcPixmap, pDstPixmap; + RegionRec region; + BoxPtr pbox; + int nbox; + int i; + + /* Throw out cases that aren't going to be our rotation first */ + if (pMask != NULL || op != PictOpSrc || pSrc->pDrawable == NULL) + goto fallback; + + if (pSrc->pDrawable->type != DRAWABLE_PIXMAP || + pDst->pDrawable->type != DRAWABLE_PIXMAP) + { + goto fallback; + } + pSrcPixmap = (PixmapPtr)pSrc->pDrawable; + pDstPixmap = (PixmapPtr)pDst->pDrawable; + + /* Check if the dest is one of our shadow pixmaps */ + for (i = 0; i < xf86_config->num_crtc; i++) { + xf86CrtcPtr crtc = xf86_config->crtc[i]; + + if (crtc->rotatedPixmap == pDstPixmap) + break; + } + if (i == xf86_config->num_crtc) + goto fallback; + + if (pSrcPixmap != pScreen->GetScreenPixmap(pScreen)) + goto fallback; + + /* OK, so we've got a Render operation on one of our shadow pixmaps, with + * the source being the real framebuffer. We know that both of these are + * in framebuffer, with no x/y offsets, i.e. normal pixmaps like our EXA- + * based Render acceleration code expects. + */ + assert(pSrcPixmap->drawable.x == 0); + assert(pSrcPixmap->drawable.y == 0); + assert(pDstPixmap->drawable.x == 0); + assert(pDstPixmap->drawable.y == 0); + + if (!miComputeCompositeRegion (®ion, pSrc, NULL, pDst, + xSrc, ySrc, 0, 0, xDst, yDst, + width, height)) + return; + + if (!pI830->xaa_check_composite(op, pSrc, NULL, pDst)) { + REGION_UNINIT(pScreen, ®ion); + goto fallback; + } + + if (!pI830->xaa_prepare_composite(op, pSrc, NULL, pDst, + pSrcPixmap, NULL, pDstPixmap)) + { + REGION_UNINIT(pScreen, ®ion); + goto fallback; + } + + nbox = REGION_NUM_RECTS(®ion); + pbox = REGION_RECTS(®ion); + + xSrc -= xDst; + ySrc -= yDst; + + while (nbox--) + { + pI830->xaa_composite(pDstPixmap, + pbox->x1 + xSrc, + pbox->y1 + ySrc, + 0, 0, + pbox->x1, + pbox->y1, + pbox->x2 - pbox->x1, + pbox->y2 - pbox->y1); + pbox++; + } + + REGION_UNINIT(pDst->pDrawable->pScreen, ®ion); + + pI830->xaa_done_composite(pDstPixmap); + i830MarkSync(pScrn); + + return; + +fallback: + /* Fallback path: Call down to the next level (XAA) */ + ps = GetPictureScreenIfSet(pScreen); + + ps->Composite = pI830->saved_composite; + + ps->Composite(op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, + width, height); + + pI830->saved_composite = ps->Composite; + ps->Composite = i830_xaa_composite; +} + static void I830RestoreAccelState(ScrnInfoPtr pScrn) { diff --git a/src/i915_exa_render.c b/src/i915_exa_render.c index 8705c6de..2fb41ad1 100644 --- a/src/i915_exa_render.c +++ b/src/i915_exa_render.c @@ -248,8 +248,8 @@ I915TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) int w, h, i; CARD32 wrap_mode = TEXCOORDMODE_CLAMP_BORDER; - offset = exaGetPixmapOffset(pPix); - pitch = exaGetPixmapPitch(pPix); + offset = intel_get_pixmap_offset(pPix); + pitch = intel_get_pixmap_pitch(pPix); w = pPict->pDrawable->width; h = pPict->pDrawable->height; pI830->scale_units[unit][0] = pPix->drawable.width; @@ -318,8 +318,8 @@ I915EXAPrepareComposite(int op, PicturePtr pSrcPicture, pI830->last_3d = LAST_3D_RENDER; I915GetDestFormat(pDstPicture, &dst_format); - dst_offset = exaGetPixmapOffset(pDst); - dst_pitch = exaGetPixmapPitch(pDst); + dst_offset = intel_get_pixmap_offset(pDst); + dst_pitch = intel_get_pixmap_pitch(pDst); FS_LOCALS(20); if (!I915TextureSetup(pSrcPicture, pSrc, 0)) diff --git a/src/i965_exa_render.c b/src/i965_exa_render.c index 1dbccc68..99bd6284 100644 --- a/src/i965_exa_render.c +++ b/src/i965_exa_render.c @@ -379,13 +379,13 @@ I965EXAPrepareComposite(int op, PicturePtr pSrcPicture, pI830->last_3d = LAST_3D_RENDER; - src_offset = exaGetPixmapOffset(pSrc); - src_pitch = exaGetPixmapPitch(pSrc); - dst_offset = exaGetPixmapOffset(pDst); - dst_pitch = exaGetPixmapPitch(pDst); + src_offset = intel_get_pixmap_offset(pSrc); + src_pitch = intel_get_pixmap_pitch(pSrc); + dst_offset = intel_get_pixmap_offset(pDst); + dst_pitch = intel_get_pixmap_pitch(pDst); if (pMask) { - mask_offset = exaGetPixmapOffset(pMask); - mask_pitch = exaGetPixmapPitch(pMask); + mask_offset = intel_get_pixmap_offset(pMask); + mask_pitch = intel_get_pixmap_pitch(pMask); } pI830->scale_units[0][0] = pSrc->drawable.width; pI830->scale_units[0][1] = pSrc->drawable.height; From 72ea0e514dcbebd009833c21f40e9bfb84074628 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 31 Jan 2007 12:43:38 -0800 Subject: [PATCH 28/35] Remove custom accelerated rotation code now that it's all done through Render. --- src/Makefile.am | 1 - src/i810_driver.c | 3 - src/i830.h | 9 - src/i830_dga.c | 10 +- src/i830_dri.c | 53 +- src/i830_driver.c | 52 +- src/i830_memory.c | 196 +--- src/i830_rotate.c | 1908 -------------------------------------- src/i830_xaa.c | 2 - src/rotation_sf0.g4a | 17 - src/rotation_sf90.g4a | 17 - src/rotation_sf_prog0.h | 17 - src/rotation_sf_prog90.h | 17 - src/rotation_wm0.g4a | 123 --- src/rotation_wm90.g4a | 127 --- src/rotation_wm_prog0.h | 68 -- src/rotation_wm_prog90.h | 68 -- 17 files changed, 18 insertions(+), 2670 deletions(-) delete mode 100644 src/i830_rotate.c delete mode 100644 src/rotation_sf0.g4a delete mode 100644 src/rotation_sf90.g4a delete mode 100644 src/rotation_sf_prog0.h delete mode 100644 src/rotation_sf_prog90.h delete mode 100644 src/rotation_wm0.g4a delete mode 100644 src/rotation_wm90.g4a delete mode 100644 src/rotation_wm_prog0.h delete mode 100644 src/rotation_wm_prog90.h diff --git a/src/Makefile.am b/src/Makefile.am index 02e85768..ba126357 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -74,7 +74,6 @@ i810_drv_la_SOURCES = \ i830_video.c \ i830_video.h \ i830_reg.h \ - i830_rotate.c \ i830_randr.c \ i830_sdvo.c \ i830_sdvo.h \ diff --git a/src/i810_driver.c b/src/i810_driver.c index 3d4c7d34..e7c85071 100644 --- a/src/i810_driver.c +++ b/src/i810_driver.c @@ -342,11 +342,8 @@ const char *I810driSymbols[] = { #endif /* I830_ONLY */ const char *I810shadowSymbols[] = { - "shadowInit", "shadowSetup", "shadowAdd", - "shadowRemove", - "shadowUpdateRotatePacked", NULL }; diff --git a/src/i830.h b/src/i830.h index 58e4ec34..4996cdd8 100644 --- a/src/i830.h +++ b/src/i830.h @@ -297,11 +297,7 @@ typedef struct _I830Rec { #endif unsigned long LinearAlloc; XF86ModReqInfo shadowReq; /* to test for later libshadow */ - I830MemRange RotatedMem; - I830MemRange RotatedMem2; - I830MemRange RotateStateMem; /* for G965 state buffer */ Rotation rotation; - int InitialRotation; int displayWidth; void (*PointerMoved)(int, int, int); CreateScreenResourcesProcPtr CreateScreenResources; @@ -321,8 +317,6 @@ typedef struct _I830Rec { unsigned int front_tiled; unsigned int back_tiled; unsigned int depth_tiled; - unsigned int rotated_tiled; - unsigned int rotated2_tiled; #endif Bool NeedRingBufferLow; @@ -550,8 +544,6 @@ extern void I830InitVideo(ScreenPtr pScreen); extern void i830_crtc_dpms_video(xf86CrtcPtr crtc, Bool on); #endif -extern Bool I830AllocateRotatedBuffer(ScrnInfoPtr pScrn, const int flags); -extern Bool I830AllocateRotated2Buffer(ScrnInfoPtr pScrn, const int flags); #ifdef XF86DRI extern Bool I830Allocate3DMemory(ScrnInfoPtr pScrn, const int flags); extern Bool I830AllocateBackBuffer(ScrnInfoPtr pScrn, const int flags); @@ -606,7 +598,6 @@ extern void I830ReadAllRegisters(I830Ptr pI830, I830RegPtr i830Reg); extern void I830ChangeFrontbuffer(ScrnInfoPtr pScrn,int buffer); extern Bool I830IsPrimary(ScrnInfoPtr pScrn); -extern Bool I830Rotate(ScrnInfoPtr pScrn, DisplayModePtr mode); extern Bool I830FixOffset(ScrnInfoPtr pScrn, I830MemRange *mem); extern Bool I830I2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, int i2c_reg, char *name); diff --git a/src/i830_dga.c b/src/i830_dga.c index c312c6d6..6d071ac3 100644 --- a/src/i830_dga.c +++ b/src/i830_dga.c @@ -397,17 +397,11 @@ I830_CloseFramebuffer(ScrnInfoPtr pScrn) }; if (I830IsPrimary(pScrn)) { - if (pI830->rotation != RR_Rotate_0) - pScrn->fbOffset = pI830->RotatedMem.Start; - else - pScrn->fbOffset = pI830->FrontBuffer.Start; + pScrn->fbOffset = pI830->FrontBuffer.Start; } else { I830Ptr pI8301 = I830PTR(pI830->entityPrivate->pScrn_1); - if (pI830->rotation != RR_Rotate_0) - pScrn->fbOffset = pI8301->RotatedMem2.Start; - else - pScrn->fbOffset = pI8301->FrontBuffer2.Start; + pScrn->fbOffset = pI8301->FrontBuffer2.Start; } I830SelectBuffer(pScrn, I830_SELECT_FRONT); diff --git a/src/i830_dri.c b/src/i830_dri.c index eeef2895..70e7e491 100644 --- a/src/i830_dri.c +++ b/src/i830_dri.c @@ -1446,22 +1446,13 @@ I830UpdateDRIBuffers(ScrnInfoPtr pScrn, drmI830Sarea *sarea) sarea->front_tiled = pI830->front_tiled; sarea->back_tiled = pI830->back_tiled; sarea->depth_tiled = pI830->depth_tiled; - sarea->rotated_tiled = pI830->rotated_tiled; -#if 0 - sarea->rotated2_tiled = pI830->rotated2_tiled; -#endif + sarea->rotated_tiled = FALSE; - if (pI830->rotation == RR_Rotate_0) { - sarea->front_offset = pI830->FrontBuffer.Start; - /* Don't use FrontBuffer.Size here as it includes the pixmap cache area - * Instead, calculate the entire framebuffer. - */ - sarea->front_size = pI830->displayWidth * pScrn->virtualY * pI830->cpp; - } else { - /* Need to deal with rotated2 once we have dual head DRI */ - sarea->front_offset = pI830->RotatedMem.Start; - sarea->front_size = pI830->RotatedMem.Size; - } + sarea->front_offset = pI830->FrontBuffer.Start; + /* Don't use FrontBuffer.Size here as it includes the pixmap cache area + * Instead, calculate the entire framebuffer. + */ + sarea->front_size = pI830->displayWidth * pScrn->virtualY * pI830->cpp; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] init sarea width,height = %d x %d (pitch %d)\n", @@ -1480,32 +1471,12 @@ I830UpdateDRIBuffers(ScrnInfoPtr pScrn, drmI830Sarea *sarea) sarea->virtualX = pScrn->virtualX; sarea->virtualY = pScrn->virtualY; - switch (pI830->rotation) { - case RR_Rotate_0: - sarea->rotation = 0; - break; - case RR_Rotate_90: - sarea->rotation = 90; - break; - case RR_Rotate_180: - sarea->rotation = 180; - break; - case RR_Rotate_270: - sarea->rotation = 270; - break; - default: - sarea->rotation = 0; - } - if (pI830->rotation == RR_Rotate_0) { - sarea->rotated_offset = -1; - sarea->rotated_size = 0; - } - else { - sarea->rotated_offset = pI830->FrontBuffer.Start; - sarea->rotated_size = pI830->FrontBuffer.Size; - } - - /* This is the original pitch */ + /* The rotation is now handled entirely by the X Server, so just leave the + * DRI unaware. + */ + sarea->rotation = 0; + sarea->rotated_offset = -1; + sarea->rotated_size = 0; sarea->rotated_pitch = pI830->displayWidth; success = I830DRIMapScreenRegions(pScrn, sarea); diff --git a/src/i830_driver.c b/src/i830_driver.c index d6d0df09..7c365db3 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -276,7 +276,6 @@ typedef enum { OPTION_MONITOR_LAYOUT, OPTION_CHECKDEVICES, OPTION_FIXEDPIPE, - OPTION_ROTATE, OPTION_LINEARALLOC, OPTION_INTELTEXPOOL, OPTION_INTELMMSIZE @@ -297,7 +296,6 @@ static OptionInfoRec I830Options[] = { {OPTION_MONITOR_LAYOUT, "MonitorLayout", OPTV_ANYSTR,{0}, FALSE}, {OPTION_CHECKDEVICES, "CheckDevices",OPTV_BOOLEAN, {0}, FALSE}, {OPTION_FIXEDPIPE, "FixedPipe", OPTV_ANYSTR, {0}, FALSE}, - {OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE}, {OPTION_LINEARALLOC, "LinearAlloc", OPTV_INTEGER, {0}, FALSE}, {OPTION_INTELTEXPOOL,"Legacy3D", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_INTELMMSIZE, "AperTexSize", OPTV_INTEGER, {0}, FALSE}, @@ -1368,17 +1366,9 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) RestoreHWState(pScrn); pScrn->displayWidth = (pScrn->virtualX + 63) & ~63; - + + /* XXX This should go away, replaced by xf86Crtc.c support for it */ pI830->rotation = RR_Rotate_0; - if ((s = xf86GetOptValString(pI830->Options, OPTION_ROTATE))) { - pI830->InitialRotation = 0; - if(!xf86NameCmp(s, "CW") || !xf86NameCmp(s, "270")) - pI830->InitialRotation = 270; - if(!xf86NameCmp(s, "CCW") || !xf86NameCmp(s, "90")) - pI830->InitialRotation = 90; - if(!xf86NameCmp(s, "180")) - pI830->InitialRotation = 180; - } /* * Let's setup the mobile systems to check the lid status @@ -2495,19 +2485,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pScrn->displayWidth = pI830->displayWidth; - if (I830IsPrimary(pScrn)) { - /* Rotated Buffer */ - memset(&(pI830->RotatedMem), 0, sizeof(pI830->RotatedMem)); - pI830->RotatedMem.Key = -1; - /* Rotated2 Buffer */ - memset(&(pI830->RotatedMem2), 0, sizeof(pI830->RotatedMem2)); - pI830->RotatedMem2.Key = -1; - if (IS_I965G(pI830)) { - memset(&(pI830->RotateStateMem), 0, sizeof(pI830->RotateStateMem)); - pI830->RotateStateMem.Key = -1; - } - } - #ifdef HAS_MTRR_SUPPORT { int fd; @@ -2906,29 +2883,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pI830->closing = FALSE; pI830->suspended = FALSE; - switch (pI830->InitialRotation) { - case 0: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 0 degrees\n"); - pI830->rotation = RR_Rotate_0; - break; - case 90: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 90 degrees\n"); - pI830->rotation = RR_Rotate_90; - break; - case 180: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 180 degrees\n"); - pI830->rotation = RR_Rotate_180; - break; - case 270: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 270 degrees\n"); - pI830->rotation = RR_Rotate_270; - break; - default: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Bad rotation setting - defaulting to 0 degrees\n"); - pI830->rotation = RR_Rotate_0; - break; - } - #ifdef XF86DRI_MM if (pI830->directRenderingEnabled && (pI830->mmModeFlags & I830_KERNEL_MM)) { unsigned long aperEnd = ROUND_DOWN_TO(pI830->FbMapSize, GTT_PAGE_SIZE) @@ -3187,7 +3141,7 @@ I830EnterVT(int scrnIndex, int flags) pI830->currentMode = pScrn->currentMode; - /* Force invarient state when rotated to be emitted */ + /* Force invarient 3D state to be emitted */ *pI830->used3D = 1<<31; return TRUE; diff --git a/src/i830_memory.c b/src/i830_memory.c index 24f0b296..6ceb05b5 100644 --- a/src/i830_memory.c +++ b/src/i830_memory.c @@ -471,156 +471,6 @@ IsTileable(ScrnInfoPtr pScrn, int pitch) } } -Bool -I830AllocateRotatedBuffer(ScrnInfoPtr pScrn, int flags) -{ - I830Ptr pI830 = I830PTR(pScrn); - unsigned long size, alloced; - Bool dryrun = ((flags & ALLOCATE_DRY_RUN) != 0); - int verbosity = dryrun ? 4 : 1; - const char *s = dryrun ? "[dryrun] " : ""; - int align; - Bool tileable; - int lines; - int height = (pI830->rotation & (RR_Rotate_0 | RR_Rotate_180)) ? pScrn->virtualY : pScrn->virtualX; - - /* Rotated Buffer */ - memset(&(pI830->RotatedMem), 0, sizeof(I830MemRange)); - pI830->RotatedMem.Key = -1; - tileable = !(flags & ALLOC_NO_TILING) && - IsTileable(pScrn, pScrn->displayWidth * pI830->cpp); - if (tileable) { - /* Make the height a multiple of the tile height (16) */ - lines = (height + 15) / 16 * 16; - } else { - lines = height; - } - - size = ROUND_TO_PAGE(pScrn->displayWidth * lines * pI830->cpp); - /* - * Try to allocate on the best tile-friendly boundaries. - */ - alloced = 0; - if (tileable) { - align = GetBestTileAlignment(size); - for (align = GetBestTileAlignment(size); align >= (IS_I9XX(pI830) ? MB(1) : KB(512)); align >>= 1) { - alloced = I830AllocVidMem(pScrn, &(pI830->RotatedMem), - &(pI830->StolenPool), size, align, - flags | FROM_ANYWHERE | ALLOCATE_AT_TOP | - ALIGN_BOTH_ENDS); - if (alloced >= size) - break; - } - } - if (alloced < size) { - /* Give up on trying to tile */ - tileable = FALSE; - size = ROUND_TO_PAGE(pScrn->displayWidth * height * pI830->cpp); - align = GTT_PAGE_SIZE; - alloced = I830AllocVidMem(pScrn, &(pI830->RotatedMem), - &(pI830->StolenPool), size, align, - flags | FROM_ANYWHERE | ALLOCATE_AT_TOP); - } - if (alloced < size) { - if (!dryrun) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate rotated buffer space.\n"); - } - return FALSE; - } - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity, - "%sAllocated %ld kB for the rotated buffer at 0x%lx.\n", s, - alloced / 1024, pI830->RotatedMem.Start); - -#define BRW_LINEAR_EXTRA (32*1024) - if (IS_I965G(pI830)) { - memset(&(pI830->RotateStateMem), 0, sizeof(I830MemRange)); - pI830->RotateStateMem.Key = -1; - size = ROUND_TO_PAGE(BRW_LINEAR_EXTRA); - align = GTT_PAGE_SIZE; - alloced = I830AllocVidMem(pScrn, &(pI830->RotateStateMem), - &(pI830->StolenPool), size, align, - flags | FROM_ANYWHERE | ALLOCATE_AT_TOP); - if (alloced < size) { - if (!dryrun) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "G965: Failed to allocate rotate state buffer space.\n"); - } - return FALSE; - } - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity, - "%sAllocated %ld kB for the G965 rotate state buffer at 0x%lx - 0x%lx.\n", s, - alloced / 1024, pI830->RotateStateMem.Start, pI830->RotateStateMem.End); - } - - return TRUE; -} - -Bool -I830AllocateRotated2Buffer(ScrnInfoPtr pScrn, int flags) -{ - I830Ptr pI830 = I830PTR(pScrn); - unsigned long size, alloced; - Bool dryrun = ((flags & ALLOCATE_DRY_RUN) != 0); - int verbosity = dryrun ? 4 : 1; - const char *s = dryrun ? "[dryrun] " : ""; - int align; - Bool tileable; - int lines; - I830EntPtr pI830Ent = pI830->entityPrivate; - I830Ptr pI8302 = I830PTR(pI830Ent->pScrn_2); - int height = (pI8302->rotation & (RR_Rotate_0 | RR_Rotate_180)) ? pI830Ent->pScrn_2->virtualY : pI830Ent->pScrn_2->virtualX; - - /* Rotated Buffer */ - memset(&(pI830->RotatedMem2), 0, sizeof(I830MemRange)); - pI830->RotatedMem2.Key = -1; - tileable = !(flags & ALLOC_NO_TILING) && - IsTileable(pScrn, pI830Ent->pScrn_2->displayWidth * pI8302->cpp); - if (tileable) { - /* Make the height a multiple of the tile height (16) */ - lines = (height + 15) / 16 * 16; - } else { - lines = height; - } - - size = ROUND_TO_PAGE(pI830Ent->pScrn_2->displayWidth * lines * pI8302->cpp); - /* - * Try to allocate on the best tile-friendly boundaries. - */ - alloced = 0; - if (tileable) { - align = GetBestTileAlignment(size); - for (align = GetBestTileAlignment(size); align >= (IS_I9XX(pI830) ? MB(1) : KB(512)); align >>= 1) { - alloced = I830AllocVidMem(pScrn, &(pI830->RotatedMem2), - &(pI830->StolenPool), size, align, - flags | FROM_ANYWHERE | ALLOCATE_AT_TOP | - ALIGN_BOTH_ENDS); - if (alloced >= size) - break; - } - } - if (alloced < size) { - /* Give up on trying to tile */ - tileable = FALSE; - size = ROUND_TO_PAGE(pI830Ent->pScrn_2->displayWidth * height * pI8302->cpp); - align = GTT_PAGE_SIZE; - alloced = I830AllocVidMem(pScrn, &(pI830->RotatedMem2), - &(pI830->StolenPool), size, align, - flags | FROM_ANYWHERE | ALLOCATE_AT_TOP); - } - if (alloced < size) { - if (!dryrun) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate rotated2 buffer space.\n"); - } - return FALSE; - } - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity, - "%sAllocated %ld kB for the rotated2 buffer at 0x%lx.\n", s, - alloced / 1024, pI830->RotatedMem2.Start); - return TRUE; -} - static unsigned long GetFreeSpace(ScrnInfoPtr pScrn) { @@ -1840,8 +1690,6 @@ I830SetupMemoryTiling(ScrnInfoPtr pScrn) pI830->front_tiled = FENCE_LINEAR; pI830->back_tiled = FENCE_LINEAR; pI830->depth_tiled = FENCE_LINEAR; - pI830->rotated_tiled = FENCE_LINEAR; - pI830->rotated2_tiled = FENCE_LINEAR; if (pI830->allowPageFlip) { if (pI830->allowPageFlip && pI830->FrontBuffer.Alignment >= KB(512)) { @@ -1888,35 +1736,7 @@ I830SetupMemoryTiling(ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "MakeTiles failed for the depth buffer.\n"); } - } - -/* XXX tiled rotate mem not ready on G965*/ - - if(!IS_I965G(pI830)) { - if (pI830->RotatedMem.Alignment >= KB(512)) { - if (MakeTiles(pScrn, &(pI830->RotatedMem), FENCE_XMAJOR)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Activating tiled memory for the rotated buffer.\n"); - pI830->rotated_tiled = FENCE_XMAJOR; - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "MakeTiles failed for the rotated buffer.\n"); - } - } - } -#if 0 - if (pI830->RotatedMem2.Alignment >= KB(512)) { - if (MakeTiles(pScrn, &(pI830->RotatedMem2), FENCE_XMAJOR)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Activating tiled memory for the rotated2 buffer.\n"); - pI830->rotated2_tiled = FENCE_XMAJOR; - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "MakeTiles failed for the rotated buffer.\n"); - } - } -#endif -} + }} #endif /* XF86DRI */ static Bool @@ -1987,13 +1807,6 @@ I830BindAGPMemory(ScrnInfoPtr pScrn) return FALSE; } #endif - if (pI830->RotatedMem.Start) - if (!BindMemRange(pScrn, &(pI830->RotatedMem))) - return FALSE; - if (pI830->entityPrivate && pI830->entityPrivate->pScrn_2 && - pI830->RotatedMem2.Start) - if (!BindMemRange(pScrn, &(pI830->RotatedMem2))) - return FALSE; #ifdef XF86DRI if (pI830->directRenderingEnabled) { if (!BindMemRange(pScrn, &(pI830->ContextMem))) @@ -2088,13 +1901,6 @@ I830UnbindAGPMemory(ScrnInfoPtr pScrn) return FALSE; } #endif - if (pI830->RotatedMem.Start) - if (!UnbindMemRange(pScrn, &(pI830->RotatedMem))) - return FALSE; - if (pI830->entityPrivate && pI830->entityPrivate->pScrn_2 && - pI830->RotatedMem2.Start) - if (!UnbindMemRange(pScrn, &(pI830->RotatedMem2))) - return FALSE; #ifdef XF86DRI if (pI830->directRenderingEnabled) { if (!UnbindMemRange(pScrn, &(pI830->ContextMem))) diff --git a/src/i830_rotate.c b/src/i830_rotate.c deleted file mode 100644 index efa76edc..00000000 --- a/src/i830_rotate.c +++ /dev/null @@ -1,1908 +0,0 @@ -/* -*- c-basic-offset: 3 -*- */ -/************************************************************************** - -Copyright 2005 Tungsten Graphics, Inc., Cedar Park, Texas. - -All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sub license, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice (including the -next paragraph) shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. -IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND/OR THEIR SUPPLIERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -**************************************************************************/ - -/* - * Reformatted with GNU indent (2.2.8), using the following options: - * - * -bad -bap -c41 -cd0 -ncdb -ci6 -cli0 -cp0 -ncs -d0 -di3 -i3 -ip3 -l78 - * -lp -npcs -psl -sob -ss -br -ce -sc -hnl - * - * This provides a good match with the original i810 code and preferred - * XFree86 formatting conventions. - * - * When editing this driver, please follow the existing formatting, and edit - * with characters expanded at 8-column intervals. - */ - -/* - * Authors: - * Alan Hourihane - * Brian Paul - * Keith Whitwell - */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include "xf86.h" -#include "xf86_OSproc.h" -#include "servermd.h" -#include "shadow.h" - -#include "i830.h" -#include "i915_reg.h" -#include "i915_3d.h" -#include "brw_defines.h" -#include "brw_structs.h" - -#ifdef XF86DRI -#include "dri.h" -#endif - -static void * -I830WindowLinear (ScreenPtr pScreen, - CARD32 row, - CARD32 offset, - int mode, - CARD32 *size, - void *closure) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - CARD8 *ptr; - - *size = (pScrn->bitsPerPixel * pI830->displayWidth >> 3); - if (I830IsPrimary(pScrn)) - ptr = (CARD8 *) (pI830->FbBase + pI830->FrontBuffer.Start) + row * (*size) + offset; - else { - I830Ptr pI8301 = I830PTR(pI830->entityPrivate->pScrn_1); - ptr = (CARD8 *) (pI830->FbBase + pI8301->FrontBuffer2.Start) + row * (*size) + offset; - } - return (void *)ptr; -} - -struct matrix23 -{ - int m00, m01, m02; - int m10, m11, m12; -}; - -static void -matrix23Set(struct matrix23 *m, - int m00, int m01, int m02, - int m10, int m11, int m12) -{ - m->m00 = m00; m->m01 = m01; m->m02 = m02; - m->m10 = m10; m->m11 = m11; m->m12 = m12; -} - - -/* - * Transform (x,y) coordinate by the given matrix. - */ -static void -matrix23TransformCoordf(const struct matrix23 *m, float *x, float *y) -{ - const float x0 = *x; - const float y0 = *y; - - *x = m->m00 * x0 + m->m01 * y0 + m->m02; - *y = m->m10 * x0 + m->m11 * y0 + m->m12; -} - -/* - * Make rotation matrix for width X height screen. - */ -static void -matrix23Rotate(struct matrix23 *m, int width, int height, int angle) -{ - switch (angle) { - case 0: - matrix23Set(m, 1, 0, 0, 0, 1, 0); - break; - case 90: - matrix23Set(m, 0, 1, 0, -1, 0, width); - break; - case 180: - matrix23Set(m, -1, 0, width, 0, -1, height); - break; - case 270: - matrix23Set(m, 0, -1, height, 1, 0, 0); - break; - default: - break; - } -} - -/* Doesn't matter on the order for our purposes */ -typedef struct { - unsigned char red, green, blue, alpha; -} intel_color_t; - -/* Vertex format */ -typedef union { - struct { - float x, y, z, w; - intel_color_t color; - intel_color_t specular; - float u0, v0; - float u1, v1; - float u2, v2; - float u3, v3; - } v; - float f[24]; - unsigned int ui[24]; - unsigned char ub4[24][4]; -} intelVertex, *intelVertexPtr; - -static void draw_poly(CARD32 *vb, - float verts[][2], - float texcoords[][2]) -{ - int vertex_size = 8; - intelVertex tmp; - int i, k; - - /* initial constant vertex fields */ - tmp.v.z = 1.0; - tmp.v.w = 1.0; - tmp.v.color.red = 255; - tmp.v.color.green = 255; - tmp.v.color.blue = 255; - tmp.v.color.alpha = 255; - tmp.v.specular.red = 0; - tmp.v.specular.green = 0; - tmp.v.specular.blue = 0; - tmp.v.specular.alpha = 0; - - for (k = 0; k < 4; k++) { - tmp.v.x = verts[k][0]; - tmp.v.y = verts[k][1]; - tmp.v.u0 = texcoords[k][0]; - tmp.v.v0 = texcoords[k][1]; - - for (i = 0 ; i < vertex_size ; i++) - vb[i] = tmp.ui[i]; - - vb += vertex_size; - } -} - - -/* Our PS kernel uses less than 32 GRF registers (about 20) */ -#define PS_KERNEL_NUM_GRF 32 -#define PS_MAX_THREADS 32 - -#define BRW_GRF_BLOCKS(nreg) ((nreg + 15) / 16 - 1) - -static const CARD32 ps_kernel_static0[][4] = { -#include "rotation_wm_prog0.h" -}; - -static const CARD32 ps_kernel_static90[][4] = { -#include "rotation_wm_prog90.h" -}; - -#define ALIGN(i,m) (((i) + (m) - 1) & ~((m) - 1)) -#define MIN(a,b) ((a) < (b) ? (a) : (b)) -#define BRW_LINEAR_EXTRA (32*1024) -#define WM_BINDING_TABLE_ENTRIES 2 - -static const CARD32 sip_kernel_static[][4] = { -/* wait (1) a0<1>UW a145<0,1,0>UW { align1 + } */ - { 0x00000030, 0x20000108, 0x00001220, 0x00000000 }, -/* nop (4) g0<1>UD { align1 + } */ - { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 }, -/* nop (4) g0<1>UD { align1 + } */ - { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 }, -/* nop (4) g0<1>UD { align1 + } */ - { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 }, -/* nop (4) g0<1>UD { align1 + } */ - { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 }, -/* nop (4) g0<1>UD { align1 + } */ - { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 }, -/* nop (4) g0<1>UD { align1 + } */ - { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 }, -/* nop (4) g0<1>UD { align1 + } */ - { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 }, -/* nop (4) g0<1>UD { align1 + } */ - { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 }, -/* nop (4) g0<1>UD { align1 + } */ - { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 }, -}; - -#define SF_KERNEL_NUM_GRF 16 -#define SF_MAX_THREADS 1 - -static const CARD32 sf_kernel_static0[][4] = { -#include "rotation_sf_prog0.h" -}; - - -static const CARD32 sf_kernel_static90[][4] = { -#include "rotation_sf_prog90.h" -}; - -static void -I965UpdateRotate (ScreenPtr pScreen, - shadowBufPtr pBuf) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - ScrnInfoPtr pScrn1 = pScrn; - I830Ptr pI8301 = NULL; - RegionPtr damage = shadowDamage(pBuf); - int nbox = REGION_NUM_RECTS (damage); - BoxPtr pbox = REGION_RECTS (damage); - int box_x1, box_x2, box_y1, box_y2; - float verts[4][2]; - struct matrix23 rotMatrix; - Bool updateInvarient = FALSE; -#ifdef XF86DRI - drmI830Sarea *sarea = NULL; - drm_context_t myContext = 0; -#endif - Bool didLock = FALSE; - -/* Gen4 states */ - int urb_vs_start, urb_vs_size; - int urb_gs_start, urb_gs_size; - int urb_clip_start, urb_clip_size; - int urb_sf_start, urb_sf_size; - int urb_cs_start, urb_cs_size; - struct brw_surface_state *dest_surf_state; - struct brw_surface_state *src_surf_state; - struct brw_sampler_state *src_sampler_state; - struct brw_vs_unit_state *vs_state; - struct brw_sf_unit_state *sf_state; - struct brw_wm_unit_state *wm_state; - struct brw_cc_unit_state *cc_state; - struct brw_cc_viewport *cc_viewport; - struct brw_instruction *sf_kernel; - struct brw_instruction *ps_kernel; - struct brw_instruction *sip_kernel; - float *vb; - BOOL first_output = TRUE; - CARD32 *binding_table; - int dest_surf_offset, src_surf_offset, src_sampler_offset, vs_offset; - int sf_offset, wm_offset, cc_offset, vb_offset, cc_viewport_offset; - int wm_scratch_offset; - int sf_kernel_offset, ps_kernel_offset, sip_kernel_offset; - int binding_table_offset; - int next_offset, total_state_size; - int vb_size = (4 * 4) * 4; /* 4 DWORDS per vertex */ - char *state_base; - int state_base_offset; - - DPRINTF(PFX, "I965UpdateRotate: from (%d x %d) -> (%d x %d)\n", - pScrn->virtualX, pScrn->virtualY, pScreen->width, pScreen->height); - - if (I830IsPrimary(pScrn)) { - pI8301 = pI830; - } else { - pI8301 = I830PTR(pI830->entityPrivate->pScrn_1); - pScrn1 = pI830->entityPrivate->pScrn_1; - } - - switch (pI830->rotation) { - case RR_Rotate_90: - matrix23Rotate(&rotMatrix, - pScreen->width, pScreen->height, - 90); - break; - case RR_Rotate_180: - matrix23Rotate(&rotMatrix, - pScreen->width, pScreen->height, - 180); - break; - case RR_Rotate_270: - matrix23Rotate(&rotMatrix, - pScreen->width, pScreen->height, - 270); - break; - default: - break; - } - -#ifdef XF86DRI - if (pI8301->directRenderingEnabled) { - sarea = DRIGetSAREAPrivate(pScrn1->pScreen); - myContext = DRIGetContext(pScrn1->pScreen); - didLock = I830DRILock(pScrn1); - } -#endif - - if (pScrn->scrnIndex != *pI830->used3D) - updateInvarient = TRUE; - -#ifdef XF86DRI - if (sarea && sarea->ctxOwner != myContext) - updateInvarient = TRUE; -#endif - - /*XXX we'll always update state */ - *pI830->used3D = pScrn->scrnIndex; -#ifdef XF86DRI - if (sarea) - sarea->ctxOwner = myContext; -#endif - - /* this starts initialize 3D engine for rotation mapping*/ - next_offset = 0; - - /* Set up our layout of state in framebuffer. First the general state: */ - vs_offset = ALIGN(next_offset, 64); - next_offset = vs_offset + sizeof(*vs_state); - sf_offset = ALIGN(next_offset, 32); - next_offset = sf_offset + sizeof(*sf_state); - wm_offset = ALIGN(next_offset, 32); - next_offset = wm_offset + sizeof(*wm_state); - wm_scratch_offset = ALIGN(next_offset, 1024); - next_offset = wm_scratch_offset + 1024 * PS_MAX_THREADS; - cc_offset = ALIGN(next_offset, 32); - next_offset = cc_offset + sizeof(*cc_state); - - sf_kernel_offset = ALIGN(next_offset, 64); - - switch (pI830->rotation) { - case RR_Rotate_90: - case RR_Rotate_270: - next_offset = sf_kernel_offset + sizeof (sf_kernel_static90); - ps_kernel_offset = ALIGN(next_offset, 64); - next_offset = ps_kernel_offset + sizeof (ps_kernel_static90); - break; - case RR_Rotate_180: - default: - next_offset = sf_kernel_offset + sizeof (sf_kernel_static0); - ps_kernel_offset = ALIGN(next_offset, 64); - next_offset = ps_kernel_offset + sizeof (ps_kernel_static0); - break; - } - - sip_kernel_offset = ALIGN(next_offset, 64); - next_offset = sip_kernel_offset + sizeof (sip_kernel_static); - cc_viewport_offset = ALIGN(next_offset, 32); - next_offset = cc_viewport_offset + sizeof(*cc_viewport); - - src_sampler_offset = ALIGN(next_offset, 32); - next_offset = src_sampler_offset + sizeof(*src_sampler_state); - - /* Align VB to native size of elements, for safety */ - vb_offset = ALIGN(next_offset, 8); - next_offset = vb_offset + vb_size; - - dest_surf_offset = ALIGN(next_offset, 32); - next_offset = dest_surf_offset + sizeof(*dest_surf_state); - src_surf_offset = ALIGN(next_offset, 32); - next_offset = src_surf_offset + sizeof(*src_surf_state); - binding_table_offset = ALIGN(next_offset, 32); - next_offset = binding_table_offset + (WM_BINDING_TABLE_ENTRIES * 4); - - total_state_size = next_offset; - assert (total_state_size < BRW_LINEAR_EXTRA); - - state_base_offset = pI830->RotateStateMem.Start; - state_base_offset = ALIGN(state_base_offset, 64); - state_base = (char *)(pI830->FbBase + state_base_offset); - DPRINTF(PFX, "rotate state buffer start 0x%x, addr 0x%x, base 0x%x\n", - pI830->RotateStateMem.Start, state_base, pI830->FbBase); - - vs_state = (void *)(state_base + vs_offset); - sf_state = (void *)(state_base + sf_offset); - wm_state = (void *)(state_base + wm_offset); - cc_state = (void *)(state_base + cc_offset); - sf_kernel = (void *)(state_base + sf_kernel_offset); - ps_kernel = (void *)(state_base + ps_kernel_offset); - sip_kernel = (void *)(state_base + sip_kernel_offset); - - cc_viewport = (void *)(state_base + cc_viewport_offset); - dest_surf_state = (void *)(state_base + dest_surf_offset); - src_surf_state = (void *)(state_base + src_surf_offset); - src_sampler_state = (void *)(state_base + src_sampler_offset); - binding_table = (void *)(state_base + binding_table_offset); - vb = (void *)(state_base + vb_offset); - - /* For 3D, the VS must have 8, 12, 16, 24, or 32 VUEs allocated to it. - * A VUE consists of a 256-bit vertex header followed by the vertex data, - * which in our case is 4 floats (128 bits), thus a single 512-bit URB - * entry. - */ -#define URB_VS_ENTRIES 8 -#define URB_VS_ENTRY_SIZE 1 - -#define URB_GS_ENTRIES 0 -#define URB_GS_ENTRY_SIZE 0 - -#define URB_CLIP_ENTRIES 0 -#define URB_CLIP_ENTRY_SIZE 0 - - /* The SF kernel we use outputs only 4 256-bit registers, leading to an - * entry size of 2 512-bit URBs. We don't need to have many entries to - * output as we're generally working on large rectangles and don't care - * about having WM threads running on different rectangles simultaneously. - */ -#define URB_SF_ENTRIES 1 -#define URB_SF_ENTRY_SIZE 2 - -#define URB_CS_ENTRIES 0 -#define URB_CS_ENTRY_SIZE 0 - - urb_vs_start = 0; - urb_vs_size = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE; - urb_gs_start = urb_vs_start + urb_vs_size; - urb_gs_size = URB_GS_ENTRIES * URB_GS_ENTRY_SIZE; - urb_clip_start = urb_gs_start + urb_gs_size; - urb_clip_size = URB_CLIP_ENTRIES * URB_CLIP_ENTRY_SIZE; - urb_sf_start = urb_clip_start + urb_clip_size; - urb_sf_size = URB_SF_ENTRIES * URB_SF_ENTRY_SIZE; - urb_cs_start = urb_sf_start + urb_sf_size; - urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE; - - memset (cc_viewport, 0, sizeof (*cc_viewport)); - cc_viewport->min_depth = -1.e35; - cc_viewport->max_depth = 1.e35; - - memset(cc_state, 0, sizeof(*cc_state)); - cc_state->cc0.stencil_enable = 0; /* disable stencil */ - cc_state->cc2.depth_test = 0; /* disable depth test */ - cc_state->cc2.logicop_enable = 1; /* enable logic op */ - cc_state->cc3.ia_blend_enable = 1; /* blend alpha just like colors */ - cc_state->cc3.blend_enable = 0; /* disable color blend */ - cc_state->cc3.alpha_test = 0; /* disable alpha test */ - cc_state->cc4.cc_viewport_state_offset = (state_base_offset + cc_viewport_offset) >> 5; - cc_state->cc5.dither_enable = 0; /* disable dither */ - cc_state->cc5.logicop_func = 0xc; /* COPY S*/ - cc_state->cc5.statistics_enable = 1; - cc_state->cc5.ia_blend_function = BRW_BLENDFUNCTION_ADD; - cc_state->cc5.ia_src_blend_factor = BRW_BLENDFACTOR_ONE; - cc_state->cc5.ia_dest_blend_factor = BRW_BLENDFACTOR_ZERO; - - /* Upload system kernel */ - memcpy (sip_kernel, sip_kernel_static, sizeof (sip_kernel_static)); - - memset(dest_surf_state, 0, sizeof(*dest_surf_state)); - dest_surf_state->ss0.surface_type = BRW_SURFACE_2D; - dest_surf_state->ss0.data_return_format = BRW_SURFACERETURNFORMAT_FLOAT32; - if (pI8301->cpp == 2) - dest_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B5G6R5_UNORM; - else - dest_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM; - dest_surf_state->ss0.writedisable_alpha = 0; - dest_surf_state->ss0.writedisable_red = 0; - dest_surf_state->ss0.writedisable_green = 0; - dest_surf_state->ss0.writedisable_blue = 0; - dest_surf_state->ss0.color_blend = 0; - dest_surf_state->ss0.vert_line_stride = 0; - dest_surf_state->ss0.vert_line_stride_ofs = 0; - dest_surf_state->ss0.mipmap_layout_mode = 0; - dest_surf_state->ss0.render_cache_read_mode = 0; - - if (I830IsPrimary(pScrn)) - dest_surf_state->ss1.base_addr = pI830->FrontBuffer.Start; - else - dest_surf_state->ss1.base_addr = pI8301->FrontBuffer2.Start; - dest_surf_state->ss2.width = pScrn->virtualX - 1; - dest_surf_state->ss2.height = pScrn->virtualY - 1; - dest_surf_state->ss2.mip_count = 0; - dest_surf_state->ss2.render_target_rotation = 0; /*XXX how to use? */ - dest_surf_state->ss3.pitch = (pI830->displayWidth * pI830->cpp) - 1; - if (pI830->front_tiled) { - dest_surf_state->ss3.tiled_surface = 1; - dest_surf_state->ss3.tile_walk = 0; /* X major */ - } - - memset(src_surf_state, 0, sizeof(*src_surf_state)); - src_surf_state->ss0.surface_type = BRW_SURFACE_2D; -/* src_surf_state->ss0.data_return_format = BRW_SURFACERETURNFORMAT_FLOAT32;*/ - if (pI8301->cpp == 2) - src_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B5G6R5_UNORM; - else - src_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM; - src_surf_state->ss0.writedisable_alpha = 0; - src_surf_state->ss0.writedisable_red = 0; - src_surf_state->ss0.writedisable_green = 0; - src_surf_state->ss0.writedisable_blue = 0; - src_surf_state->ss0.color_blend = 0; - src_surf_state->ss0.vert_line_stride = 0; - src_surf_state->ss0.vert_line_stride_ofs = 0; - src_surf_state->ss0.mipmap_layout_mode = 0; - src_surf_state->ss0.render_cache_read_mode = 0; - - if (I830IsPrimary(pScrn)) - src_surf_state->ss1.base_addr = pI830->RotatedMem.Start; - else - src_surf_state->ss1.base_addr = pI8301->RotatedMem2.Start; - src_surf_state->ss2.width = pScreen->width - 1; - src_surf_state->ss2.height = pScreen->height - 1; - src_surf_state->ss2.mip_count = 0; - src_surf_state->ss2.render_target_rotation = 0; - src_surf_state->ss3.pitch = (pScrn->displayWidth * pI830->cpp) - 1; - if (pI830->rotated_tiled) { - src_surf_state->ss3.tiled_surface = 1; - src_surf_state->ss3.tile_walk = 0; /* X major */ - } - - binding_table[0] = state_base_offset + dest_surf_offset; - binding_table[1] = state_base_offset + src_surf_offset; - - memset(src_sampler_state, 0, sizeof(*src_sampler_state)); - src_sampler_state->ss0.min_filter = BRW_MAPFILTER_LINEAR; - src_sampler_state->ss0.mag_filter = BRW_MAPFILTER_LINEAR; - src_sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP; - src_sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP; - src_sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP; - - /* Set up the vertex shader to be disabled (passthrough) */ - memset(vs_state, 0, sizeof(*vs_state)); - vs_state->thread4.nr_urb_entries = URB_VS_ENTRIES; - vs_state->thread4.urb_entry_allocation_size = URB_VS_ENTRY_SIZE - 1; - vs_state->vs6.vs_enable = 0; - vs_state->vs6.vert_cache_disable = 1; - - /* Set up the SF kernel to do coord interp: for each attribute, - * calculate dA/dx and dA/dy. Hand these interpolation coefficients - * back to SF which then hands pixels off to WM. - */ - - switch (pI830->rotation) { - case RR_Rotate_90: - case RR_Rotate_270: - memcpy (sf_kernel, sf_kernel_static90, sizeof (sf_kernel_static90)); - memcpy (ps_kernel, ps_kernel_static90, sizeof (ps_kernel_static90)); - break; - case RR_Rotate_180: - default: - memcpy (sf_kernel, sf_kernel_static0, sizeof (sf_kernel_static0)); - memcpy (ps_kernel, ps_kernel_static0, sizeof (ps_kernel_static0)); - break; - } - - memset(sf_state, 0, sizeof(*sf_state)); - sf_state->thread0.kernel_start_pointer = - (state_base_offset + sf_kernel_offset) >> 6; - sf_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF); - sf_state->sf1.single_program_flow = 1; /* XXX */ - sf_state->sf1.binding_table_entry_count = 0; - sf_state->sf1.thread_priority = 0; - sf_state->sf1.floating_point_mode = 0; - sf_state->sf1.illegal_op_exception_enable = 1; - sf_state->sf1.mask_stack_exception_enable = 1; - sf_state->sf1.sw_exception_enable = 1; - sf_state->thread2.per_thread_scratch_space = 0; - sf_state->thread2.scratch_space_base_pointer = 0; /* not used in our kernel */ - sf_state->thread3.const_urb_entry_read_length = 0; /* no const URBs */ - sf_state->thread3.const_urb_entry_read_offset = 0; /* no const URBs */ - sf_state->thread3.urb_entry_read_length = 1; /* 1 URB per vertex */ - sf_state->thread3.urb_entry_read_offset = 0; - sf_state->thread3.dispatch_grf_start_reg = 3; - sf_state->thread4.max_threads = SF_MAX_THREADS - 1; - sf_state->thread4.urb_entry_allocation_size = URB_SF_ENTRY_SIZE - 1; - sf_state->thread4.nr_urb_entries = URB_SF_ENTRIES; - sf_state->thread4.stats_enable = 1; - sf_state->sf5.viewport_transform = FALSE; /* skip viewport */ - sf_state->sf6.cull_mode = BRW_CULLMODE_NONE; - sf_state->sf6.scissor = 0; - sf_state->sf7.trifan_pv = 2; - sf_state->sf6.dest_org_vbias = 0x8; - sf_state->sf6.dest_org_hbias = 0x8; - - memset (wm_state, 0, sizeof (*wm_state)); - wm_state->thread0.kernel_start_pointer = - (state_base_offset + ps_kernel_offset) >> 6; - wm_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF); - wm_state->thread1.single_program_flow = 1; /* XXX */ - wm_state->thread1.binding_table_entry_count = 2; - /* Though we never use the scratch space in our WM kernel, it has to be - * set, and the minimum allocation is 1024 bytes. - */ - wm_state->thread2.scratch_space_base_pointer = (state_base_offset + - wm_scratch_offset) >> 10; - wm_state->thread2.per_thread_scratch_space = 0; /* 1024 bytes */ - wm_state->thread3.dispatch_grf_start_reg = 3; - wm_state->thread3.const_urb_entry_read_length = 0; - wm_state->thread3.const_urb_entry_read_offset = 0; - wm_state->thread3.urb_entry_read_length = 1; - wm_state->thread3.urb_entry_read_offset = 0; - wm_state->wm4.stats_enable = 1; - wm_state->wm4.sampler_state_pointer = (state_base_offset + src_sampler_offset) >> 5; - wm_state->wm4.sampler_count = 1; /* 1-4 samplers used */ - wm_state->wm5.max_threads = PS_MAX_THREADS - 1; - wm_state->wm5.thread_dispatch_enable = 1; - wm_state->wm5.enable_16_pix = 1; - wm_state->wm5.enable_8_pix = 0; - wm_state->wm5.early_depth_test = 1; - - - { - BEGIN_LP_RING(2); - OUT_RING(MI_FLUSH | - MI_STATE_INSTRUCTION_CACHE_FLUSH | - BRW_MI_GLOBAL_SNAPSHOT_RESET); - OUT_RING(MI_NOOP); - ADVANCE_LP_RING(); - } - - { - BEGIN_LP_RING(12); - OUT_RING(BRW_PIPELINE_SELECT | PIPELINE_SELECT_3D); - - /* Mesa does this. Who knows... */ - OUT_RING(BRW_CS_URB_STATE | 0); - OUT_RING((0 << 4) | /* URB Entry Allocation Size */ - (0 << 0)); /* Number of URB Entries */ - - /* Zero out the two base address registers so all offsets are absolute */ - OUT_RING(BRW_STATE_BASE_ADDRESS | 4); - OUT_RING(0 | BASE_ADDRESS_MODIFY); /* Generate state base address */ - OUT_RING(0 | BASE_ADDRESS_MODIFY); /* Surface state base address */ - OUT_RING(0 | BASE_ADDRESS_MODIFY); /* media base addr, don't care */ - OUT_RING(0x10000000 | BASE_ADDRESS_MODIFY); /* general state max addr, disabled */ - OUT_RING(0x10000000 | BASE_ADDRESS_MODIFY); /* media object state max addr, disabled */ - - /* Set system instruction pointer */ - OUT_RING(BRW_STATE_SIP | 0); - OUT_RING(state_base_offset + sip_kernel_offset); /* system instruction pointer */ - - OUT_RING(MI_NOOP); - ADVANCE_LP_RING(); - } - - - { - BEGIN_LP_RING(36); - /* Enable VF statistics */ - OUT_RING(BRW_3DSTATE_VF_STATISTICS | 1); - - /* Pipe control */ - OUT_RING(BRW_PIPE_CONTROL | - BRW_PIPE_CONTROL_NOWRITE | - BRW_PIPE_CONTROL_IS_FLUSH | - 2); - OUT_RING(0); /* Destination address */ - OUT_RING(0); /* Immediate data low DW */ - OUT_RING(0); /* Immediate data high DW */ - - /* Binding table pointers */ - OUT_RING(BRW_3DSTATE_BINDING_TABLE_POINTERS | 4); - OUT_RING(0); /* vs */ - OUT_RING(0); /* gs */ - OUT_RING(0); /* clip */ - OUT_RING(0); /* sf */ - /* Only the PS uses the binding table */ - OUT_RING(state_base_offset + binding_table_offset); /* ps */ - - /* XXX: Blend constant color (magenta is fun) */ - //OUT_RING(BRW_3DSTATE_CONSTANT_COLOR | 3); - //OUT_RING(float_to_uint (1.0)); - //OUT_RING(float_to_uint (0.0)); - //OUT_RING(float_to_uint (1.0)); - //OUT_RING(float_to_uint (1.0)); - - /* The drawing rectangle clipping is always on. Set it to values that - * shouldn't do any clipping. - */ - OUT_RING(BRW_3DSTATE_DRAWING_RECTANGLE | 2); /* XXX 3 for BLC or CTG */ - OUT_RING(0x00000000); /* ymin, xmin */ - OUT_RING((pScrn->virtualX - 1) | - (pScrn->virtualY - 1) << 16); /* ymax, xmax */ - OUT_RING(0x00000000); /* yorigin, xorigin */ - - /* skip the depth buffer */ - /* skip the polygon stipple */ - /* skip the polygon stipple offset */ - /* skip the line stipple */ - - /* Set the pointers to the 3d pipeline state */ - OUT_RING(BRW_3DSTATE_PIPELINED_POINTERS | 5); - OUT_RING(state_base_offset + vs_offset); /* 32 byte aligned */ - OUT_RING(BRW_GS_DISABLE); /* disable GS, resulting in passthrough */ - OUT_RING(BRW_CLIP_DISABLE); /* disable CLIP, resulting in passthrough */ - OUT_RING(state_base_offset + sf_offset); /* 32 byte aligned */ - OUT_RING(state_base_offset + wm_offset); /* 32 byte aligned */ - OUT_RING(state_base_offset + cc_offset); /* 64 byte aligned */ - - /* URB fence */ - OUT_RING(BRW_URB_FENCE | - UF0_CS_REALLOC | - UF0_SF_REALLOC | - UF0_CLIP_REALLOC | - UF0_GS_REALLOC | - UF0_VS_REALLOC | - 1); - OUT_RING(((urb_clip_start + urb_clip_size) << UF1_CLIP_FENCE_SHIFT) | - ((urb_gs_start + urb_gs_size) << UF1_GS_FENCE_SHIFT) | - ((urb_vs_start + urb_vs_size) << UF1_VS_FENCE_SHIFT)); - OUT_RING(((urb_cs_start + urb_cs_size) << UF2_CS_FENCE_SHIFT) | - ((urb_sf_start + urb_sf_size) << UF2_SF_FENCE_SHIFT)); - - /* Constant buffer state */ - OUT_RING(BRW_CS_URB_STATE | 0); - OUT_RING(((URB_CS_ENTRY_SIZE - 1) << 4) | /* URB Entry Allocation Size */ - (URB_CS_ENTRIES << 0)); /* Number of URB Entries */ - - /* Set up the pointer to our vertex buffer */ - OUT_RING(BRW_3DSTATE_VERTEX_BUFFERS | 2); - OUT_RING((0 << VB0_BUFFER_INDEX_SHIFT) | - VB0_VERTEXDATA | - ((4 * 4) << VB0_BUFFER_PITCH_SHIFT)); /* four 32-bit floats per vertex */ - OUT_RING(state_base_offset + vb_offset); - OUT_RING(3); /* four corners to our rectangle */ - - /* Set up our vertex elements, sourced from the single vertex buffer. */ - OUT_RING(BRW_3DSTATE_VERTEX_ELEMENTS | 3); - /* offset 0: X,Y -> {X, Y, 1.0, 1.0} */ - OUT_RING((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | - VE0_VALID | - (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | - (0 << VE0_OFFSET_SHIFT)); - OUT_RING((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | - (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | - (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | - (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | - (0 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); - /* offset 8: S0, T0 -> {S0, T0, 1.0, 1.0} */ - OUT_RING((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | - VE0_VALID | - (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | - (8 << VE0_OFFSET_SHIFT)); - OUT_RING((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | - (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | - (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | - (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | - (4 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); - - //OUT_RING(MI_NOOP); /* pad to quadword */ - ADVANCE_LP_RING(); - } - - { - BEGIN_LP_RING(2); - OUT_RING(MI_FLUSH | - MI_STATE_INSTRUCTION_CACHE_FLUSH | - BRW_MI_GLOBAL_SNAPSHOT_RESET); - OUT_RING(MI_NOOP); - ADVANCE_LP_RING(); - } - - while (nbox--) - { - float src_scale_x, src_scale_y; - int i; - box_x1 = pbox->x1; - box_y1 = pbox->y1; - box_x2 = pbox->x2; - box_y2 = pbox->y2; - - if (!first_output) { - /* Since we use the same little vertex buffer over and over, sync for - * subsequent rectangles. - */ - i830WaitSync(pScrn); - } - - pbox++; - - verts[0][0] = box_x1; verts[0][1] = box_y1; - verts[1][0] = box_x2; verts[1][1] = box_y1; - verts[2][0] = box_x2; verts[2][1] = box_y2; - verts[3][0] = box_x1; verts[3][1] = box_y2; - - /* transform coordinates to rotated versions, but leave texcoords unchanged */ - for (i = 0; i < 4; i++) - matrix23TransformCoordf(&rotMatrix, &verts[i][0], &verts[i][1]); - - src_scale_x = (float)1.0 / (float)pScreen->width; - src_scale_y = (float)1.0 / (float)pScreen->height; - i = 0; - - DPRINTF(PFX, "box size (%d, %d) -> (%d, %d)\n", - box_x1, box_y1, box_x2, box_y2); - - switch (pI830->rotation) { - case RR_Rotate_90: - vb[i++] = (float)box_x1 * src_scale_x; - vb[i++] = (float)box_y2 * src_scale_y; - vb[i++] = verts[3][0]; - vb[i++] = verts[3][1]; - - vb[i++] = (float)box_x1 * src_scale_x; - vb[i++] = (float)box_y1 * src_scale_y; - vb[i++] = verts[0][0]; - vb[i++] = verts[0][1]; - - vb[i++] = (float)box_x2 * src_scale_x; - vb[i++] = (float)box_y1 * src_scale_y; - vb[i++] = verts[1][0]; - vb[i++] = verts[1][1]; - break; - case RR_Rotate_270: - vb[i++] = (float)box_x2 * src_scale_x; - vb[i++] = (float)box_y1 * src_scale_y; - vb[i++] = verts[1][0]; - vb[i++] = verts[1][1]; - - vb[i++] = (float)box_x2 * src_scale_x; - vb[i++] = (float)box_y2 * src_scale_y; - vb[i++] = verts[2][0]; - vb[i++] = verts[2][1]; - - vb[i++] = (float)box_x1 * src_scale_x; - vb[i++] = (float)box_y2 * src_scale_y; - vb[i++] = verts[3][0]; - vb[i++] = verts[3][1]; - break; - case RR_Rotate_180: - default: - vb[i++] = (float)box_x1 * src_scale_x; - vb[i++] = (float)box_y1 * src_scale_y; - vb[i++] = verts[0][0]; - vb[i++] = verts[0][1]; - - vb[i++] = (float)box_x2 * src_scale_x; - vb[i++] = (float)box_y1 * src_scale_y; - vb[i++] = verts[1][0]; - vb[i++] = verts[1][1]; - - vb[i++] = (float)box_x2 * src_scale_x; - vb[i++] = (float)box_y2 * src_scale_y; - vb[i++] = verts[2][0]; - vb[i++] = verts[2][1]; - break; - } - - BEGIN_LP_RING(6); - OUT_RING(BRW_3DPRIMITIVE | - BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL | - (_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) | - (0 << 9) | /* CTG - indirect vertex count */ - 4); - OUT_RING(3); /* vertex count per instance */ - OUT_RING(0); /* start vertex offset */ - OUT_RING(1); /* single instance */ - OUT_RING(0); /* start instance location */ - OUT_RING(0); /* index buffer offset, ignored */ - ADVANCE_LP_RING(); - - first_output = FALSE; - i830MarkSync(pScrn); - } - - i830WaitSync(pScrn); -#ifdef XF86DRI - if (didLock) - I830DRIUnlock(pScrn1); -#endif -} - - -static void -I915UpdateRotate (ScreenPtr pScreen, - shadowBufPtr pBuf) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - ScrnInfoPtr pScrn1 = pScrn; - I830Ptr pI8301 = NULL; - RegionPtr damage = shadowDamage(pBuf); - int nbox = REGION_NUM_RECTS (damage); - BoxPtr pbox = REGION_RECTS (damage); - int box_x1, box_x2, box_y1, box_y2; - CARD32 vb[32]; /* 32 dword vertex buffer */ - float verts[4][2], tex[4][2]; - struct matrix23 rotMatrix; - int j; - int use_fence; - Bool didLock = FALSE; - - if (I830IsPrimary(pScrn)) { - pI8301 = pI830; - } else { - pI8301 = I830PTR(pI830->entityPrivate->pScrn_1); - pScrn1 = pI830->entityPrivate->pScrn_1; - } - - switch (pI830->rotation) { - case RR_Rotate_90: - matrix23Rotate(&rotMatrix, - pScreen->width, pScreen->height, - 90); - break; - case RR_Rotate_180: - matrix23Rotate(&rotMatrix, - pScreen->width, pScreen->height, - 180); - break; - case RR_Rotate_270: - matrix23Rotate(&rotMatrix, - pScreen->width, pScreen->height, - 270); - break; - default: - break; - } - -#ifdef XF86DRI - if (pI8301->directRenderingEnabled) - didLock = I830DRILock(pScrn1); -#endif - - /* If another screen was active, we don't know the current state. */ - if (pScrn->scrnIndex != *pI830->used3D) - pI830->last_3d = LAST_3D_OTHER; - - if (pI830->last_3d != LAST_3D_ROTATION) { - FS_LOCALS(3); - *pI830->used3D = pScrn->scrnIndex; - - BEGIN_LP_RING(34); - /* invarient state */ - - /* flush map & render cache */ - OUT_RING(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE); - OUT_RING(0x00000000); - - /* draw rect */ - OUT_RING(_3DSTATE_DRAW_RECT_CMD); - OUT_RING(DRAW_DITHER_OFS_X(0) | DRAW_DITHER_OFS_Y(0)); - OUT_RING(DRAW_XMIN(0) | DRAW_YMIN(0)); - OUT_RING(DRAW_XMAX(pScrn->virtualX - 1) | - DRAW_YMAX(pScrn->virtualY - 1)); - OUT_RING(DRAW_XORG(0) | DRAW_YORG(0)); - - OUT_RING(MI_NOOP); - - OUT_RING(0x7c000003); /* XXX: magic numbers */ - OUT_RING(0x7d070000); - OUT_RING(0x00000000); - OUT_RING(0x68000002); - - OUT_RING(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | - I1_LOAD_S(2) | I1_LOAD_S(4) | I1_LOAD_S(5) | I1_LOAD_S(6) | 3); - - OUT_RING(S2_TEXCOORD_FMT(0, TEXCOORDFMT_2D) | - S2_TEXCOORD_FMT(1, TEXCOORDFMT_NOT_PRESENT) | - S2_TEXCOORD_FMT(2, TEXCOORDFMT_NOT_PRESENT) | - S2_TEXCOORD_FMT(3, TEXCOORDFMT_NOT_PRESENT) | - S2_TEXCOORD_FMT(4, TEXCOORDFMT_NOT_PRESENT) | - S2_TEXCOORD_FMT(5, TEXCOORDFMT_NOT_PRESENT) | - S2_TEXCOORD_FMT(6, TEXCOORDFMT_NOT_PRESENT) | - S2_TEXCOORD_FMT(7, TEXCOORDFMT_NOT_PRESENT)); - OUT_RING((1 << S4_POINT_WIDTH_SHIFT) | S4_LINE_WIDTH_ONE | - S4_CULLMODE_NONE | S4_VFMT_SPEC_FOG | S4_VFMT_COLOR | - S4_VFMT_XYZW); - OUT_RING(0x00000000); /* S5 -- enable bits */ - OUT_RING((2 << S6_DEPTH_TEST_FUNC_SHIFT) | - (2 << S6_CBUF_SRC_BLEND_FACT_SHIFT) | - (1 << S6_CBUF_DST_BLEND_FACT_SHIFT) | S6_COLOR_WRITE_ENABLE | - (2 << S6_TRISTRIP_PV_SHIFT)); - - OUT_RING(_3DSTATE_CONST_BLEND_COLOR_CMD); - OUT_RING(0x00000000); - - OUT_RING(_3DSTATE_DST_BUF_VARS_CMD); - if (pI830->cpp == 1) { - OUT_RING(LOD_PRECLAMP_OGL | DSTORG_HORT_BIAS(0x8) | - DSTORG_VERT_BIAS(0x8) | COLR_BUF_8BIT); - } else if (pI830->cpp == 2) { - OUT_RING(LOD_PRECLAMP_OGL | DSTORG_HORT_BIAS(0x8) | - DSTORG_VERT_BIAS(0x8) | COLR_BUF_RGB565); - } else { - OUT_RING(LOD_PRECLAMP_OGL | DSTORG_HORT_BIAS(0x8) | - DSTORG_VERT_BIAS(0x8) | COLR_BUF_ARGB8888 | - DEPTH_FRMT_24_FIXED_8_OTHER); - } - - /* texture sampler state */ - OUT_RING(_3DSTATE_SAMPLER_STATE | 3); - OUT_RING(0x00000001); - OUT_RING(0x00000000); - OUT_RING(0x00000000); - OUT_RING(0x00000000); - - /* front buffer, pitch, offset */ - OUT_RING(_3DSTATE_BUF_INFO_CMD); - OUT_RING(BUF_3D_ID_COLOR_BACK | BUF_3D_USE_FENCE | - BUF_3D_PITCH(pI830->displayWidth * pI830->cpp)); - if (I830IsPrimary(pScrn)) - OUT_RING(pI830->FrontBuffer.Start); - else - OUT_RING(pI8301->FrontBuffer2.Start); - - /* Set the entire frontbuffer up as a texture */ - OUT_RING(_3DSTATE_MAP_STATE | 3); - OUT_RING(0x00000001); - - if (I830IsPrimary(pScrn)) - OUT_RING(pI830->RotatedMem.Start); - else - OUT_RING(pI8301->RotatedMem2.Start); - - if (pI830->disableTiling) - use_fence = 0; - else - use_fence = MS3_USE_FENCE_REGS; - - if (pI830->cpp == 1) - use_fence |= MAPSURF_8BIT; - else - if (pI830->cpp == 2) - use_fence |= MAPSURF_16BIT; - else - use_fence |= MAPSURF_32BIT; - OUT_RING(use_fence | (pScreen->height - 1) << 21 | (pScreen->width - 1) << 10); - OUT_RING(((((pScrn->displayWidth * pI830->cpp) / 4) - 1) << 21)); - ADVANCE_LP_RING(); - - /* fragment program - texture blend replace*/ - FS_BEGIN(); - i915_fs_dcl(FS_S0); - i915_fs_dcl(FS_T0); - i915_fs_texld(FS_OC, FS_S0, FS_T0); - FS_END(); - } - - { - BEGIN_LP_RING(2); - OUT_RING(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE); - OUT_RING(0x00000000); - ADVANCE_LP_RING(); - } - - while (nbox--) - { - box_x1 = pbox->x1; - box_y1 = pbox->y1; - box_x2 = pbox->x2; - box_y2 = pbox->y2; - pbox++; - - BEGIN_LP_RING(40); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - - /* vertex data */ - OUT_RING(PRIM3D_INLINE | PRIM3D_TRIFAN | (32 - 1)); - verts[0][0] = box_x1; verts[0][1] = box_y1; - verts[1][0] = box_x2; verts[1][1] = box_y1; - verts[2][0] = box_x2; verts[2][1] = box_y2; - verts[3][0] = box_x1; verts[3][1] = box_y2; - tex[0][0] = box_x1; tex[0][1] = box_y1; - tex[1][0] = box_x2; tex[1][1] = box_y1; - tex[2][0] = box_x2; tex[2][1] = box_y2; - tex[3][0] = box_x1; tex[3][1] = box_y2; - - /* transform coordinates to rotated versions, but leave texcoords unchanged */ - for (j = 0; j < 4; j++) - matrix23TransformCoordf(&rotMatrix, &verts[j][0], &verts[j][1]); - - /* emit vertex buffer */ - draw_poly(vb, verts, tex); - for (j = 0; j < 32; j++) - OUT_RING(vb[j]); - - ADVANCE_LP_RING(); - } - -#ifdef XF86DRI - if (didLock) - I830DRIUnlock(pScrn1); -#endif -} - -static void -I830UpdateRotate (ScreenPtr pScreen, - shadowBufPtr pBuf) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - I830Ptr pI8301 = NULL; - ScrnInfoPtr pScrn1 = pScrn; - RegionPtr damage = shadowDamage(pBuf); - int nbox = REGION_NUM_RECTS (damage); - BoxPtr pbox = REGION_RECTS (damage); - int box_x1, box_x2, box_y1, box_y2; - CARD32 vb[32]; /* 32 dword vertex buffer */ - float verts[4][2], tex[4][2]; - struct matrix23 rotMatrix; - int use_fence; - int j; - Bool didLock = FALSE; - - if (I830IsPrimary(pScrn)) { - pI8301 = pI830; - } else { - pI8301 = I830PTR(pI830->entityPrivate->pScrn_1); - pScrn1 = pI830->entityPrivate->pScrn_1; - } - - switch (pI830->rotation) { - case RR_Rotate_90: - matrix23Rotate(&rotMatrix, - pScreen->width, pScreen->height, - 90); - break; - case RR_Rotate_180: - matrix23Rotate(&rotMatrix, - pScreen->width, pScreen->height, - 180); - break; - case RR_Rotate_270: - matrix23Rotate(&rotMatrix, - pScreen->width, pScreen->height, - 270); - break; - default: - break; - } - -#ifdef XF86DRI - if (pI8301->directRenderingEnabled) - didLock = I830DRILock(pScrn1); -#endif - - if (pScrn->scrnIndex != *pI830->used3D) - pI830->last_3d = LAST_3D_OTHER; - - if (pI830->last_3d != LAST_3D_ROTATION) { - *pI830->used3D = pScrn->scrnIndex; - - pI830->last_3d = LAST_3D_ROTATION; - - BEGIN_LP_RING(48); - OUT_RING(0x682008a1); - OUT_RING(0x6f402100); - OUT_RING(0x62120aa9); - OUT_RING(0x76b3ffff); - OUT_RING(0x6c818a01); - OUT_RING(0x6ba008a1); - OUT_RING(0x69802100); - OUT_RING(0x63a00aaa); - OUT_RING(0x6423070e); - OUT_RING(0x66014142); - OUT_RING(0x75000000); - OUT_RING(0x7d880000); - OUT_RING(0x00000000); - OUT_RING(0x650001c4); - OUT_RING(0x6a000000); - OUT_RING(0x7d020000); - OUT_RING(0x0000ba98); - - /* flush map & render cache */ - OUT_RING(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE); - OUT_RING(0x00000000); - /* draw rect */ - OUT_RING(_3DSTATE_DRAW_RECT_CMD); - OUT_RING(0x00000000); /* flags */ - OUT_RING(0x00000000); /* ymin, xmin */ - OUT_RING((pScrn->virtualX - 1) | (pScrn->virtualY - 1) << 16); /* ymax, xmax */ - OUT_RING(0x00000000); /* yorigin, xorigin */ - OUT_RING(MI_NOOP); - - /* front buffer */ - OUT_RING(_3DSTATE_BUF_INFO_CMD); - OUT_RING(0x03800000 | (((pI830->displayWidth * pI830->cpp) / 4) << 2)); - if (I830IsPrimary(pScrn)) - OUT_RING(pI830->FrontBuffer.Start); - else - OUT_RING(pI8301->FrontBuffer2.Start); - OUT_RING(0x7d850000); - if (pI830->cpp == 1) - OUT_RING(0x00880000); - else - if (pI830->cpp == 2) - OUT_RING(0x00880200); - else - OUT_RING(0x00880308); - /* scissor */ - OUT_RING(0x7c800002); - OUT_RING(0x7d810001); - OUT_RING(0x00000000); - OUT_RING(0x00000000); - /* stipple */ - OUT_RING(0x7d830000); - OUT_RING(0x00000000); - - /* texture blend replace */ - OUT_RING(0x7c088088); - OUT_RING(0x00000000); - OUT_RING(0x6d021181); - OUT_RING(0x6d060101); - OUT_RING(0x6e008046); - OUT_RING(0x6e048046); - - - /* Set the entire frontbuffer up as a texture */ - OUT_RING(0x7d030804); - - if (pI830->disableTiling) - use_fence = 0; - else - use_fence = 2; - - if (I830IsPrimary(pScrn)) - OUT_RING(pI830->RotatedMem.Start | use_fence); - else - OUT_RING(pI8301->RotatedMem2.Start | use_fence); - - if (pI830->cpp == 1) - OUT_RING(0x40 | (pScreen->height - 1) << 21 | (pScreen->width - 1) << 10); - else if (pI830->cpp == 2) - OUT_RING(0x80 | (pScreen->height - 1) << 21 | (pScreen->width - 1) << 10); - else - OUT_RING(0xc0 | (pScreen->height - 1) << 21 | (pScreen->width - 1) << 10); - - OUT_RING((((pScrn->displayWidth * pI830->cpp / 4) - 1) << 21)); - OUT_RING(0x00000000); - OUT_RING(0x00000000); - - - ADVANCE_LP_RING(); - } - - { - BEGIN_LP_RING(2); - /* flush map & render cache */ - OUT_RING(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE); - OUT_RING(0x00000000); - ADVANCE_LP_RING(); - } - - while (nbox--) - { - box_x1 = pbox->x1; - box_y1 = pbox->y1; - box_x2 = pbox->x2; - box_y2 = pbox->y2; - pbox++; - - BEGIN_LP_RING(40); - - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - - /* vertex data */ - OUT_RING(0x7f0c001f); - verts[0][0] = box_x1; verts[0][1] = box_y1; - verts[1][0] = box_x2; verts[1][1] = box_y1; - verts[2][0] = box_x2; verts[2][1] = box_y2; - verts[3][0] = box_x1; verts[3][1] = box_y2; - tex[0][0] = box_x1; tex[0][1] = box_y1; - tex[1][0] = box_x2; tex[1][1] = box_y1; - tex[2][0] = box_x2; tex[2][1] = box_y2; - tex[3][0] = box_x1; tex[3][1] = box_y2; - - /* transform coordinates to rotated versions, but leave texcoords unchanged */ - for (j = 0; j < 4; j++) - matrix23TransformCoordf(&rotMatrix, &verts[j][0], &verts[j][1]); - - /* emit vertex buffer */ - draw_poly(vb, verts, tex); - for (j = 0; j < 32; j++) - OUT_RING(vb[j]); - - OUT_RING(0x05000000); - OUT_RING(0x00000000); - - ADVANCE_LP_RING(); - } - - { - BEGIN_LP_RING(2); - /* flush map & render cache */ - OUT_RING(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE); - OUT_RING(0x00000000); - ADVANCE_LP_RING(); - } - -#ifdef XF86DRI - if (didLock) - I830DRIUnlock(pScrn1); -#endif -} - -Bool -I830Rotate(ScrnInfoPtr pScrn, DisplayModePtr mode) -{ - I830Ptr pI830 = I830PTR(pScrn); - I830Ptr pI8301 = NULL; - I830Ptr pI8302 = NULL; - ScrnInfoPtr pScrn1 = NULL; - ScrnInfoPtr pScrn2 = NULL; - int i; - ShadowUpdateProc func = NULL; - Rotation oldRotation = pI830->rotation; /* save old state */ - int displayWidth = pScrn->displayWidth; /* save displayWidth */ - Bool reAllocate = TRUE; - Bool didLock = FALSE; - - /* Good pitches to allow tiling. Don't care about pitches < 1024. */ - static const int pitches[] = { -/* - 128 * 2, - 128 * 4, -*/ - 128 * 8, - 128 * 16, - 128 * 32, - 128 * 64, - 0 - }; - - if (pI830->noAccel) - func = LoaderSymbol("shadowUpdateRotatePacked"); - else { - if (IS_I9XX(pI830)) { - if (IS_I965G(pI830)) - func = I965UpdateRotate; - else - func = I915UpdateRotate; - } else - func = I830UpdateRotate; - } - - if (I830IsPrimary(pScrn)) { - pI8301 = pI830; - pScrn1 = pScrn; - if (pI830->entityPrivate) { - pI8302 = I830PTR(pI830->entityPrivate->pScrn_2); - pScrn2 = pI830->entityPrivate->pScrn_2; - } - } else { - pI8301 = I830PTR(pI830->entityPrivate->pScrn_1); - pScrn1 = pI830->entityPrivate->pScrn_1; - pI8302 = pI830; - pScrn2 = pScrn; - } - - pI830->rotation = xf86RandR12GetRotation(pScrn->pScreen); - - /* Check if we've still got the same orientation, or same mode */ - if (pI830->rotation == oldRotation && pI830->currentMode == mode) -#if 0 - reAllocate = FALSE; -#else - return TRUE; -#endif - - /* - * We grab the DRI lock when reallocating buffers to avoid DRI clients - * getting bogus information. - */ - -#ifdef XF86DRI - if (pI8301->directRenderingEnabled && reAllocate) { - didLock = I830DRILock(pScrn1); - - /* Do heap teardown here - */ - if (pI8301->mmModeFlags & I830_KERNEL_TEX) { - drmI830MemDestroyHeap destroy; - destroy.region = I830_MEM_REGION_AGP; - - if (drmCommandWrite(pI8301->drmSubFD, - DRM_I830_DESTROY_HEAP, - &destroy, sizeof(destroy))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] I830 destroy heap failed\n"); - } - } - - if (pI8301->mmModeFlags & I830_KERNEL_TEX) { - if (pI8301->TexMem.Key != -1) - xf86UnbindGARTMemory(pScrn1->scrnIndex, pI8301->TexMem.Key); - I830FreeVidMem(pScrn1, &(pI8301->TexMem)); - } - if (pI8301->StolenPool.Allocated.Key != -1) { - xf86UnbindGARTMemory(pScrn1->scrnIndex, pI8301->StolenPool.Allocated.Key); - xf86DeallocateGARTMemory(pScrn1->scrnIndex, pI8301->StolenPool.Allocated.Key); - } - if (pI8301->DepthBuffer.Key != -1) - xf86UnbindGARTMemory(pScrn1->scrnIndex, pI8301->DepthBuffer.Key); - I830FreeVidMem(pScrn1, &(pI8301->DepthBuffer)); - if (pI8301->BackBuffer.Key != -1) - xf86UnbindGARTMemory(pScrn1->scrnIndex, pI8301->BackBuffer.Key); - I830FreeVidMem(pScrn1, &(pI8301->BackBuffer)); - } -#endif - - if (reAllocate) { - *pI830->used3D |= 1<<31; /* use high bit to denote new rotation occured */ - - if (pI8301->RotatedMem.Key != -1) - xf86UnbindGARTMemory(pScrn1->scrnIndex, pI8301->RotatedMem.Key); - - I830FreeVidMem(pScrn1, &(pI8301->RotatedMem)); - memset(&(pI8301->RotatedMem), 0, sizeof(pI8301->RotatedMem)); - pI8301->RotatedMem.Key = -1; - - if (IS_I965G(pI8301)) { - if (pI8301->RotateStateMem.Key != -1) - xf86UnbindGARTMemory(pScrn1->scrnIndex, pI8301->RotateStateMem.Key); - - I830FreeVidMem(pScrn1, &(pI8301->RotateStateMem)); - memset(&(pI8301->RotateStateMem), 0, sizeof(pI8301->RotateStateMem)); - pI8301->RotateStateMem.Key = -1; - } - - if (pI830->entityPrivate) { - if (pI8301->RotatedMem2.Key != -1) - xf86UnbindGARTMemory(pScrn1->scrnIndex, pI8301->RotatedMem2.Key); - - I830FreeVidMem(pScrn1, &(pI8301->RotatedMem2)); - memset(&(pI8301->RotatedMem2), 0, sizeof(pI8301->RotatedMem2)); - pI8301->RotatedMem2.Key = -1; - } - } - - switch (pI830->rotation) { - case RR_Rotate_0: - if (reAllocate) - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Rotating Screen to 0 degrees\n"); - pScrn->displayWidth = pI830->displayWidth; - break; - case RR_Rotate_90: - if (reAllocate) - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Rotating Screen to 90 degrees\n"); - pScrn->displayWidth = pScrn->pScreen->width; - break; - case RR_Rotate_180: - if (reAllocate) - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Rotating Screen to 180 degrees\n"); - pScrn->displayWidth = pI830->displayWidth; - break; - case RR_Rotate_270: - if (reAllocate) - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Rotating Screen to 270 degrees\n"); - pScrn->displayWidth = pScrn->pScreen->width; - break; - } - - /* As DRI doesn't run on the secondary head, we know that disableTiling - * is always TRUE. - */ - if (I830IsPrimary(pScrn) && !pI830->disableTiling) { -#if 0 - int dWidth = pScrn->displayWidth; /* save current displayWidth */ -#endif - - for (i = 0; pitches[i] != 0; i++) { - if (pitches[i] >= pScrn->displayWidth) { - pScrn->displayWidth = pitches[i]; - break; - } - } - - /* - * If the displayWidth is a tilable pitch, test if there's enough - * memory available to enable tiling. - */ - if (pScrn->displayWidth == pitches[i]) { - /* TODO */ - } - } - - if (reAllocate) { - if (pI830->entityPrivate) { - if (pI8302->rotation != RR_Rotate_0) { - if (!I830AllocateRotated2Buffer(pScrn1, - pI8302->disableTiling ? ALLOC_NO_TILING : 0)) - goto BAIL0; - - I830FixOffset(pScrn1, &(pI8301->RotatedMem2)); - if (pI8301->RotatedMem2.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->RotatedMem2.Key, pI8301->RotatedMem2.Offset); - } - } - - if (pI8301->rotation != RR_Rotate_0) { - if (!I830AllocateRotatedBuffer(pScrn1, - pI8301->disableTiling ? ALLOC_NO_TILING : 0)) - goto BAIL1; - - I830FixOffset(pScrn1, &(pI8301->RotatedMem)); - if (pI8301->RotatedMem.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->RotatedMem.Key, pI8301->RotatedMem.Offset); - if (IS_I965G(pI8301)) { - I830FixOffset(pScrn1, &(pI8301->RotateStateMem)); - if (pI8301->RotateStateMem.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->RotateStateMem.Key, - pI8301->RotateStateMem.Offset); - } - } - } - - shadowRemove (pScrn->pScreen, NULL); - if (pI830->rotation != RR_Rotate_0) - shadowAdd (pScrn->pScreen, - (*pScrn->pScreen->GetScreenPixmap) (pScrn->pScreen), - func, I830WindowLinear, pI830->rotation, NULL); - - if (I830IsPrimary(pScrn)) { - if (pI830->rotation != RR_Rotate_0) - pScrn->fbOffset = pI830->RotatedMem.Start; - else - pScrn->fbOffset = pI830->FrontBuffer.Start; - if (pI830->entityPrivate) { - if (pI8302->rotation != RR_Rotate_0) - pScrn2->fbOffset = pI8301->RotatedMem2.Start; - else - pScrn2->fbOffset = pI8301->FrontBuffer2.Start; - I830SelectBuffer(pScrn2, I830_SELECT_FRONT); - } - } else { - if (pI830->rotation != RR_Rotate_0) - pScrn->fbOffset = pI8301->RotatedMem2.Start; - else - pScrn->fbOffset = pI8301->FrontBuffer2.Start; - if (pI8301->rotation != RR_Rotate_0) - pScrn1->fbOffset = pI8301->RotatedMem.Start; - else - pScrn1->fbOffset = pI8301->FrontBuffer.Start; - I830SelectBuffer(pScrn1, I830_SELECT_FRONT); - } - I830SelectBuffer(pScrn, I830_SELECT_FRONT); - -#ifdef XF86DRI - if (pI8301->directRenderingEnabled && reAllocate) { - if (!I830AllocateBackBuffer(pScrn1, - pI8301->disableTiling ? ALLOC_NO_TILING : 0)) - goto BAIL2; - - if (!I830AllocateDepthBuffer(pScrn1, - pI8301->disableTiling ? ALLOC_NO_TILING : 0)) - goto BAIL3; - - if (pI8301->mmModeFlags & I830_KERNEL_TEX) { - if (!I830AllocateTextureMemory(pScrn1, - pI8301->disableTiling ? ALLOC_NO_TILING : 0)) - goto BAIL4; - } - - I830DoPoolAllocation(pScrn1, &(pI8301->StolenPool)); - - I830FixOffset(pScrn1, &(pI8301->BackBuffer)); - I830FixOffset(pScrn1, &(pI8301->DepthBuffer)); - - if (pI8301->BackBuffer.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->BackBuffer.Key, pI8301->BackBuffer.Offset); - if (pI8301->DepthBuffer.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->DepthBuffer.Key, pI8301->DepthBuffer.Offset); - if (pI8301->StolenPool.Allocated.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->StolenPool.Allocated.Key, pI8301->StolenPool.Allocated.Offset); - if (pI8301->mmModeFlags & I830_KERNEL_TEX) { - if (pI8301->TexMem.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->TexMem.Key, pI8301->TexMem.Offset); - } - I830SetupMemoryTiling(pScrn1); - /* update fence registers */ - if (IS_I965G(pI830)) { - for (i = 0; i < FENCE_NEW_NR; i++) { - OUTREG(FENCE_NEW + i * 8, pI830->ModeReg.Fence[i]); - OUTREG(FENCE_NEW + 4 + i * 8, pI830->ModeReg.Fence[i+FENCE_NEW_NR]); - } - } else { - for (i = 0; i < 8; i++) - OUTREG(FENCE + i * 4, pI8301->ModeReg.Fence[i]); - } - - { - drmI830Sarea *sarea = DRIGetSAREAPrivate(pScrn1->pScreen); - I830UpdateDRIBuffers(pScrn1, sarea ); - } - - if (didLock) - I830DRIUnlock(pScrn1); - } -#endif - -#if 0 - if (I830IsPrimary(pScrn)) { - pI830->xoffset = (pI830->FrontBuffer.Start / pI830->cpp) % pI830->displayWidth; - pI830->yoffset = (pI830->FrontBuffer.Start / pI830->cpp) / pI830->displayWidth; - } else { - I830Ptr pI8301 = I830PTR(pI830->entityPrivate->pScrn_1); - pI830->xoffset = (pI8301->FrontBuffer2.Start / pI830->cpp) % pI830->displayWidth; - pI830->yoffset = (pI8301->FrontBuffer2.Start / pI830->cpp) / pI830->displayWidth; - } -#endif - - pScrn->pScreen->ModifyPixmapHeader((*pScrn->pScreen->GetScreenPixmap)(pScrn->pScreen), pScrn->pScreen->width, - pScrn->pScreen->height, pScrn->pScreen->rootDepth, pScrn->bitsPerPixel, - PixmapBytePad(pScrn->displayWidth, pScrn->pScreen->rootDepth), - (pointer)(pI8301->FbBase + pScrn->fbOffset)); - - if (pI830->entityPrivate) { - if (I830IsPrimary(pScrn)) { - if (!pI830->starting) { - pScrn2->pScreen->ModifyPixmapHeader((*pScrn2->pScreen->GetScreenPixmap)(pScrn2->pScreen), pScrn2->pScreen->width, - pScrn2->pScreen->height, pScrn2->pScreen->rootDepth, pScrn2->bitsPerPixel, - PixmapBytePad(pScrn2->displayWidth, pScrn2->pScreen->rootDepth), - (pointer)(pI8301->FbBase + pScrn2->fbOffset)); - - /* Repaint the second head */ - (*pScrn2->EnableDisableFBAccess) (pScrn2->pScreen->myNum, FALSE); - (*pScrn2->EnableDisableFBAccess) (pScrn2->pScreen->myNum, TRUE); - } - } else { - if (!pI830->starting) { - pScrn1->pScreen->ModifyPixmapHeader((*pScrn1->pScreen->GetScreenPixmap)(pScrn1->pScreen), pScrn1->pScreen->width, - pScrn1->pScreen->height, pScrn1->pScreen->rootDepth, pScrn1->bitsPerPixel, - PixmapBytePad(pScrn1->displayWidth, pScrn1->pScreen->rootDepth), - (pointer)(pI8301->FbBase + pScrn1->fbOffset)); - - /* Repaint the first head */ - (*pScrn1->EnableDisableFBAccess) (pScrn1->pScreen->myNum, FALSE); - (*pScrn1->EnableDisableFBAccess) (pScrn1->pScreen->myNum, TRUE); - } - } - } - -#ifdef I830_USE_XAA - if (pI830->AccelInfoRec != NULL) { - /* Don't allow pixmap cache or offscreen pixmaps when rotated */ - /* XAA needs some serious fixing for this to happen */ - if (pI830->rotation == RR_Rotate_0) { - pI830->AccelInfoRec->Flags = LINEAR_FRAMEBUFFER | OFFSCREEN_PIXMAPS | - PIXMAP_CACHE; - pI830->AccelInfoRec->UsingPixmapCache = TRUE; - /* funny as it seems this will enable XAA's createpixmap */ - pI830->AccelInfoRec->maxOffPixWidth = 0; - pI830->AccelInfoRec->maxOffPixHeight = 0; - } else { - pI830->AccelInfoRec->Flags = LINEAR_FRAMEBUFFER; - pI830->AccelInfoRec->UsingPixmapCache = FALSE; - /* funny as it seems this will disable XAA's createpixmap */ - pI830->AccelInfoRec->maxOffPixWidth = 1; - pI830->AccelInfoRec->maxOffPixHeight = 1; - } - } -#endif - - return TRUE; - -BAIL4: -#ifdef XF86DRI - if (pI8301->directRenderingEnabled) - I830FreeVidMem(pScrn1, &(pI8301->DepthBuffer)); -#endif -BAIL3: -#ifdef XF86DRI - if (pI8301->directRenderingEnabled) - I830FreeVidMem(pScrn1, &(pI8301->BackBuffer)); -#endif -BAIL2: - if (pI8301->rotation != RR_Rotate_0) { - if (pI8301->RotatedMem.Key != -1) - xf86UnbindGARTMemory(pScrn1->scrnIndex, pI8301->RotatedMem.Key); - - I830FreeVidMem(pScrn1, &(pI8301->RotatedMem)); - memset(&(pI8301->RotatedMem), 0, sizeof(pI8301->RotatedMem)); - pI8301->RotatedMem.Key = -1; - } -BAIL1: - if (pI830->entityPrivate) { - if (pI8302->rotation != RR_Rotate_0) { - if (pI8301->RotatedMem.Key != -1) - xf86UnbindGARTMemory(pScrn1->scrnIndex, pI8301->RotatedMem.Key); - - I830FreeVidMem(pScrn1, &(pI8301->RotatedMem)); - memset(&(pI8301->RotatedMem), 0, sizeof(pI8301->RotatedMem)); - pI8301->RotatedMem.Key = -1; - } - } -BAIL0: - pScrn->displayWidth = displayWidth; - - /* must flip mmWidth & mmHeight */ - if ( ((oldRotation & (RR_Rotate_90 | RR_Rotate_270)) && - (pI830->rotation & (RR_Rotate_0 | RR_Rotate_180))) || - ((oldRotation & (RR_Rotate_0 | RR_Rotate_180)) && - (pI830->rotation & (RR_Rotate_90 | RR_Rotate_270))) ) { - int tmp = pScrn->pScreen->mmWidth; - pScrn->pScreen->mmWidth = pScrn->pScreen->mmHeight; - pScrn->pScreen->mmHeight = tmp; - } - - if (oldRotation & (RR_Rotate_0 | RR_Rotate_180)) { - pScrn->pScreen->width = pScrn->virtualX; - pScrn->pScreen->height = pScrn->virtualY; - } else { - pScrn->pScreen->width = pScrn->virtualY; - pScrn->pScreen->height = pScrn->virtualX; - } - - pI830->rotation = oldRotation; - - if (pI830->entityPrivate) { - if (pI8302->rotation != RR_Rotate_0) { - if (!I830AllocateRotated2Buffer(pScrn1, - pI8302->disableTiling ? ALLOC_NO_TILING : 0)) - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Oh dear, the rotated2 buffer failed - badness\n"); - - I830FixOffset(pScrn1, &(pI8301->RotatedMem2)); - if (pI8301->RotatedMem2.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->RotatedMem2.Key, pI8301->RotatedMem2.Offset); - } - } - - if (pI8301->rotation != RR_Rotate_0) { - if (!I830AllocateRotatedBuffer(pScrn1, - pI8301->disableTiling ? ALLOC_NO_TILING : 0)) - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Oh dear, the rotated buffer failed - badness\n"); - - I830FixOffset(pScrn1, &(pI8301->RotatedMem)); - if (pI8301->RotatedMem.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->RotatedMem.Key, pI8301->RotatedMem.Offset); - } - - shadowRemove (pScrn->pScreen, NULL); - if (pI830->rotation != RR_Rotate_0) - shadowAdd (pScrn->pScreen, - (*pScrn->pScreen->GetScreenPixmap) (pScrn->pScreen), - func, I830WindowLinear, pI830->rotation, NULL); - - if (I830IsPrimary(pScrn)) { - if (pI830->rotation != RR_Rotate_0) - pScrn->fbOffset = pI830->RotatedMem.Start; - else - pScrn->fbOffset = pI830->FrontBuffer.Start; - if (pI830->entityPrivate) { - if (pI8302->rotation != RR_Rotate_0) - pScrn2->fbOffset = pI8301->RotatedMem2.Start; - else - pScrn2->fbOffset = pI8301->FrontBuffer2.Start; - I830SelectBuffer(pScrn2, I830_SELECT_FRONT); - } - } else { - if (pI830->rotation != RR_Rotate_0) - pScrn->fbOffset = pI8301->RotatedMem2.Start; - else - pScrn->fbOffset = pI8301->FrontBuffer2.Start; - if (pI8301->rotation != RR_Rotate_0) - pScrn1->fbOffset = pI8301->RotatedMem.Start; - else - pScrn1->fbOffset = pI8301->FrontBuffer.Start; - I830SelectBuffer(pScrn1, I830_SELECT_FRONT); - } - I830SelectBuffer(pScrn, I830_SELECT_FRONT); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Reverting to previous configured mode\n"); - - switch (oldRotation) { - case RR_Rotate_0: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Rotating Screen back to 0 degrees\n"); - break; - case RR_Rotate_90: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Rotating Screen back to 90 degrees\n"); - break; - case RR_Rotate_180: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Rotating Screen back to 180 degrees\n"); - break; - case RR_Rotate_270: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Rotating Screen back to 270 degrees\n"); - break; - } - -#ifdef XF86DRI - if (pI8301->directRenderingEnabled) { - if (!I830AllocateBackBuffer(pScrn1, - pI8301->disableTiling ? ALLOC_NO_TILING : 0)) - xf86DrvMsg(pScrn1->scrnIndex, X_INFO, - "Oh dear, the back buffer failed - badness\n"); - - if (!I830AllocateDepthBuffer(pScrn1, - pI8301->disableTiling ? ALLOC_NO_TILING : 0)) - xf86DrvMsg(pScrn1->scrnIndex, X_INFO, - "Oh dear, the depth buffer failed - badness\n"); - if (pI8301->mmModeFlags & I830_KERNEL_TEX) { - if (!I830AllocateTextureMemory(pScrn1, - pI8301->disableTiling ? ALLOC_NO_TILING : 0)) - xf86DrvMsg(pScrn1->scrnIndex, X_INFO, - "Oh dear, the texture cache failed - badness\n"); - } - - I830DoPoolAllocation(pScrn1, &(pI8301->StolenPool)); - - I830FixOffset(pScrn1, &(pI8301->BackBuffer)); - I830FixOffset(pScrn1, &(pI8301->DepthBuffer)); - - if (pI8301->BackBuffer.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->BackBuffer.Key, pI8301->BackBuffer.Offset); - if (pI8301->DepthBuffer.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->DepthBuffer.Key, pI8301->DepthBuffer.Offset); - if (pI8301->StolenPool.Allocated.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->StolenPool.Allocated.Key, pI8301->StolenPool.Allocated.Offset); - if (pI8301->mmModeFlags & I830_KERNEL_TEX) { - if (pI8301->TexMem.Key != -1) - xf86BindGARTMemory(pScrn1->scrnIndex, pI8301->TexMem.Key, pI8301->TexMem.Offset); - } - I830SetupMemoryTiling(pScrn1); - /* update fence registers */ - for (i = 0; i < 8; i++) - OUTREG(FENCE + i * 4, pI8301->ModeReg.Fence[i]); - { - drmI830Sarea *sarea = DRIGetSAREAPrivate(pScrn1->pScreen); - I830UpdateDRIBuffers(pScrn1, sarea ); - } - - if (didLock) - I830DRIUnlock(pScrn1); - } -#endif - - pScrn->pScreen->ModifyPixmapHeader((*pScrn->pScreen->GetScreenPixmap)(pScrn->pScreen), pScrn->pScreen->width, - pScrn->pScreen->height, pScrn->pScreen->rootDepth, pScrn->bitsPerPixel, - PixmapBytePad(pScrn->displayWidth, pScrn->pScreen->rootDepth), - (pointer)(pI8301->FbBase + pScrn->fbOffset)); - - if (pI830->entityPrivate) { - if (I830IsPrimary(pScrn)) { - pScrn2->pScreen->ModifyPixmapHeader((*pScrn2->pScreen->GetScreenPixmap)(pScrn2->pScreen), pScrn2->pScreen->width, - pScrn2->pScreen->height, pScrn2->pScreen->rootDepth, pScrn2->bitsPerPixel, - PixmapBytePad(pScrn2->displayWidth, pScrn2->pScreen->rootDepth), - (pointer)(pI8301->FbBase + pScrn2->fbOffset)); - - /* Repaint the second head */ - (*pScrn2->EnableDisableFBAccess) (pScrn2->pScreen->myNum, FALSE); - (*pScrn2->EnableDisableFBAccess) (pScrn2->pScreen->myNum, TRUE); - } else { - pScrn1->pScreen->ModifyPixmapHeader((*pScrn1->pScreen->GetScreenPixmap)(pScrn1->pScreen), pScrn1->pScreen->width, - pScrn1->pScreen->height, pScrn1->pScreen->rootDepth, pScrn1->bitsPerPixel, - PixmapBytePad(pScrn1->displayWidth, pScrn1->pScreen->rootDepth), - (pointer)(pI8301->FbBase + pScrn1->fbOffset)); - - /* Repaint the first head */ - (*pScrn1->EnableDisableFBAccess) (pScrn1->pScreen->myNum, FALSE); - (*pScrn1->EnableDisableFBAccess) (pScrn1->pScreen->myNum, TRUE); - } - } - - return FALSE; -} diff --git a/src/i830_xaa.c b/src/i830_xaa.c index be1fb831..96b23fa6 100644 --- a/src/i830_xaa.c +++ b/src/i830_xaa.c @@ -280,8 +280,6 @@ CheckTiling(ScrnInfoPtr pScrn) if (IS_I965G(pI830)) { if (pI830->bufferOffset == pScrn->fbOffset && pI830->front_tiled == FENCE_XMAJOR) tiled = 1; - if (pI830->bufferOffset == pI830->RotatedMem.Start && pI830->rotated_tiled == FENCE_XMAJOR) - tiled = 1; if (pI830->bufferOffset == pI830->BackBuffer.Start && pI830->back_tiled == FENCE_XMAJOR) tiled = 1; /* not really supported as it's always YMajor tiled */ diff --git a/src/rotation_sf0.g4a b/src/rotation_sf0.g4a deleted file mode 100644 index 8c1398f4..00000000 --- a/src/rotation_sf0.g4a +++ /dev/null @@ -1,17 +0,0 @@ -send (1) 0 g6<1>F g1.12<0,1,0>F math inv scalar mlen 1 rlen 1 { align1 }; -send (1) 0 g6.4<1>F g1.20<0,1,0>F math inv scalar mlen 1 rlen 1 { align1 }; -add (8) g7<1>F g4<8,8,1>F -g3<8,8,1>F { align1 }; -mul (1) g7<1>F g7<0,1,0>F g6<0,1,0>F { align1 }; -mul (1) g7.4<1>F g7.4<0,1,0>F g6.4<0,1,0>F { align1 }; -mov (8) m1<1>F g7<0,1,0>F { align1 }; -mov (8) m2<1>F g7.4<0,1,0>F { align1 }; -mov (8) m3<1>F g3<8,8,1>F { align1 }; -send (8) 0 null g0<8,8,1>F urb 0 transpose used complete mlen 4 rlen 0 { align1 EOT }; -nop; -nop; -nop; -nop; -nop; -nop; -nop; -nop; diff --git a/src/rotation_sf90.g4a b/src/rotation_sf90.g4a deleted file mode 100644 index 2648dffd..00000000 --- a/src/rotation_sf90.g4a +++ /dev/null @@ -1,17 +0,0 @@ -send (1) 0 g6<1>F g1.20<0,1,0>F math inv scalar mlen 1 rlen 1 { align1 }; -send (1) 0 g6.4<1>F g1.12<0,1,0>F math inv scalar mlen 1 rlen 1 { align1 }; -add (8) g7<1>F g4<8,8,1>F -g3<8,8,1>F { align1 }; -mul (1) g7<1>F g7<0,1,0>F g6<0,1,0>F { align1 }; -mul (1) g7.4<1>F g7.4<0,1,0>F g6.4<0,1,0>F { align1 }; -mov (8) m1<1>F g7<0,1,0>F { align1 }; -mov (8) m2<1>F g7.4<0,1,0>F { align1 }; -mov (8) m3<1>F g3<8,8,1>F { align1 }; -send (8) 0 null g0<8,8,1>F urb 0 transpose used complete mlen 4 rlen 0 { align1 EOT }; -nop; -nop; -nop; -nop; -nop; -nop; -nop; -nop; diff --git a/src/rotation_sf_prog0.h b/src/rotation_sf_prog0.h deleted file mode 100644 index 830d1760..00000000 --- a/src/rotation_sf_prog0.h +++ /dev/null @@ -1,17 +0,0 @@ - { 0x00000031, 0x20c01fbd, 0x0000002c, 0x01110081 }, - { 0x00000031, 0x20c41fbd, 0x00000034, 0x01110081 }, - { 0x00600040, 0x20e077bd, 0x008d0080, 0x008d4060 }, - { 0x00000041, 0x20e077bd, 0x000000e0, 0x000000c0 }, - { 0x00000041, 0x20e477bd, 0x000000e4, 0x000000c4 }, - { 0x00600001, 0x202003be, 0x000000e0, 0x00000000 }, - { 0x00600001, 0x204003be, 0x000000e4, 0x00000000 }, - { 0x00600001, 0x206003be, 0x008d0060, 0x00000000 }, - { 0x00600031, 0x20001fbc, 0x008d0000, 0x8640c800 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, diff --git a/src/rotation_sf_prog90.h b/src/rotation_sf_prog90.h deleted file mode 100644 index 2e94b8fb..00000000 --- a/src/rotation_sf_prog90.h +++ /dev/null @@ -1,17 +0,0 @@ - { 0x00000031, 0x20c01fbd, 0x00000034, 0x01110081 }, - { 0x00000031, 0x20c41fbd, 0x0000002c, 0x01110081 }, - { 0x00600040, 0x20e077bd, 0x008d0080, 0x008d4060 }, - { 0x00000041, 0x20e077bd, 0x000000e0, 0x000000c0 }, - { 0x00000041, 0x20e477bd, 0x000000e4, 0x000000c4 }, - { 0x00600001, 0x202003be, 0x000000e0, 0x00000000 }, - { 0x00600001, 0x204003be, 0x000000e4, 0x00000000 }, - { 0x00600001, 0x206003be, 0x008d0060, 0x00000000 }, - { 0x00600031, 0x20001fbc, 0x008d0000, 0x8640c800 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, diff --git a/src/rotation_wm0.g4a b/src/rotation_wm0.g4a deleted file mode 100644 index fe097340..00000000 --- a/src/rotation_wm0.g4a +++ /dev/null @@ -1,123 +0,0 @@ -/* The initial payload of the thread is always g0. - * WM_URB (incoming URB entries) is g3 - * X0_R is g4 - * X1_R is g5 - * Y0_R is g6 - * Y1_R is g7 - */ - - /* Set up the X/Y screen coordinates of the pixels in our 4 subspans. Each - * subspan is a 2x2 rectangle, and the screen x/y of the upper left of each - * subspan are given in GRF register 1.2 through 1.5 (which, with the word - * addressing below, are 1.4 through 1.11). - * - * The result is WM_X*_R and WM_Y*R being: - * - * X0: {ss0.x, ss0.x+1, ss0.x, ss0.x+1, ss1.x, ss1.x+1, ss1.x, ss1.x+y} - * Y0: {ss0.y, ss0.y, ss0.y+1, ss0.y+1, ss1.y, ss1.y, ss1.y+1, ss1.y+1} - * X1: {ss2.x, ss2.x+1, ss2.x, ss2.x+1, ss3.x, ss3.x+1, ss3.x, ss3.x+y} - * Y1: {ss2.y, ss2.y, ss2.y+1, ss2.y+1, ss3.y, ss3.y, ss3.y+1, ss3.y+1} - */ - - /* Set up ss0.x coordinates*/ -mov (1) g4<1>F g1.8<0,1,0>UW { align1 }; -add (1) g4.4<1>F g1.8<0,1,0>UW 1UB { align1 }; -mov (1) g4.8<1>F g1.8<0,1,0>UW { align1 }; -add (1) g4.12<1>F g1.8<0,1,0>UW 1UB { align1 }; - /* Set up ss0.y coordinates */ -mov (1) g6<1>F g1.10<0,1,0>UW { align1 }; -mov (1) g6.4<1>F g1.10<0,1,0>UW { align1 }; -add (1) g6.8<1>F g1.10<0,1,0>UW 1UB { align1 }; -add (1) g6.12<1>F g1.10<0,1,0>UW 1UB { align1 }; - /* set up ss1.x coordinates */ -mov (1) g4.16<1>F g1.12<0,1,0>UW { align1 }; -add (1) g4.20<1>F g1.12<0,1,0>UW 1UB { align1 }; -mov (1) g4.24<1>F g1.12<0,1,0>UW { align1 }; -add (1) g4.28<1>F g1.12<0,1,0>UW 1UB { align1 }; - /* set up ss1.y coordinates */ -mov (1) g6.16<1>F g1.14<0,1,0>UW { align1 }; -mov (1) g6.20<1>F g1.14<0,1,0>UW { align1 }; -add (1) g6.24<1>F g1.14<0,1,0>UW 1UB { align1 }; -add (1) g6.28<1>F g1.14<0,1,0>UW 1UB { align1 }; - /* Set up ss2.x coordinates */ -mov (1) g5<1>F g1.16<0,1,0>UW { align1 }; -add (1) g5.4<1>F g1.16<0,1,0>UW 1UB { align1 }; -mov (1) g5.8<1>F g1.16<0,1,0>UW { align1 }; -add (1) g5.12<1>F g1.16<0,1,0>UW 1UB { align1 }; - /* Set up ss2.y coordinates */ -mov (1) g7<1>F g1.18<0,1,0>UW { align1 }; -mov (1) g7.4<1>F g1.18<0,1,0>UW { align1 }; -add (1) g7.8<1>F g1.18<0,1,0>UW 1UB { align1 }; -add (1) g7.12<1>F g1.18<0,1,0>UW 1UB { align1 }; - /* Set up ss3.x coordinates */ -mov (1) g5.16<1>F g1.20<0,1,0>UW { align1 }; -add (1) g5.20<1>F g1.20<0,1,0>UW 1UB { align1 }; -mov (1) g5.24<1>F g1.20<0,1,0>UW { align1 }; -add (1) g5.28<1>F g1.20<0,1,0>UW 1UB { align1 }; - /* Set up ss3.y coordinates */ -mov (1) g7.16<1>F g1.22<0,1,0>UW { align1 }; -mov (1) g7.20<1>F g1.22<0,1,0>UW { align1 }; -add (1) g7.24<1>F g1.22<0,1,0>UW 1UB { align1 }; -add (1) g7.28<1>F g1.22<0,1,0>UW 1UB { align1 }; - - /* Now, map these screen space coordinates into texture coordinates. */ - /* subtract screen-space X origin of vertex 0. */ -add (8) g4<1>F g4<8,8,1>F -g1<0,1,0>F { align1 }; -add (8) g5<1>F g5<8,8,1>F -g1<0,1,0>F { align1 }; - /* scale by texture X increment */ -mul (8) g4<1>F g4<8,8,1>F g3<0,1,0>F { align1 }; -mul (8) g5<1>F g5<8,8,1>F g3<0,1,0>F { align1 }; - /* add in texture X offset */ -add (8) g4<1>F g4<8,8,1>F g3.12<0,1,0>F { align1 }; -add (8) g5<1>F g5<8,8,1>F g3.12<0,1,0>F { align1 }; - /* subtract screen-space Y origin of vertex 0. */ -add (8) g6<1>F g6<8,8,1>F -g1.4<0,1,0>F { align1 }; -add (8) g7<1>F g7<8,8,1>F -g1.4<0,1,0>F { align1 }; - /* scale by texture Y increment */ - /* XXX: double check the fields in Cx,Cy,Co and attributes*/ -mul (8) g6<1>F g6<8,8,1>F g3.20<0,1,0>F { align1 }; -mul (8) g7<1>F g7<8,8,1>F g3.20<0,1,0>F { align1 }; - /* add in texture Y offset */ -add (8) g6<1>F g6<8,8,1>F g3.28<0,1,0>F { align1 }; -add (8) g7<1>F g7<8,8,1>F g3.28<0,1,0>F { align1 }; - /* sampler */ -mov (8) m1<1>F g4<8,8,1>F { align1 }; -mov (8) m2<1>F g5<8,8,1>F { align1 }; -mov (8) m3<1>F g6<8,8,1>F { align1 }; -mov (8) m4<1>F g7<8,8,1>F { align1 }; - - /* - * g0 holds the PS thread payload, which (oddly) contains - * precisely what the sampler wants to see in m0 - */ -send (16) 0 g12<1>UW g0<8,8,1>UW sampler (1,0,F) mlen 5 rlen 8 { align1 }; -mov (8) g19<1>UD g19<8,8,1>UD { align1 }; - -mov (8) m2<1>F g12<8,8,1>F { align1 }; -mov (8) m3<1>F g14<8,8,1>F { align1 }; -mov (8) m4<1>F g16<8,8,1>F { align1 }; -mov (8) m5<1>F g18<8,8,1>F { align1 }; -mov (8) m6<1>F g13<8,8,1>F { align1 }; -mov (8) m7<1>F g15<8,8,1>F { align1 }; -mov (8) m8<1>F g17<8,8,1>F { align1 }; -mov (8) m9<1>F g19<8,8,1>F { align1 }; - - /* Pass through control information: - */ -mov (8) m1<1>UD g1<8,8,1>UD { align1 mask_disable }; - /* Send framebuffer write message: XXX: acc0? */ -send (16) 0 acc0<1>UW g0<8,8,1>UW write ( - 0, /* binding table index 0 */ - 8, /* pixel scoreboard clear */ - 4, /* render target write */ - 0 /* no write commit message */ - ) mlen 10 rlen 0 { align1 EOT }; - /* padding */ -nop; -nop; -nop; -nop; -nop; -nop; -nop; -nop; diff --git a/src/rotation_wm90.g4a b/src/rotation_wm90.g4a deleted file mode 100644 index fd600bfe..00000000 --- a/src/rotation_wm90.g4a +++ /dev/null @@ -1,127 +0,0 @@ -/* The initial payload of the thread is always g0. - * WM_URB (incoming URB entries) is g3 - * X0_R is g4 - * X1_R is g5 - * Y0_R is g6 - * Y1_R is g7 - */ - - /* Set up the X/Y screen coordinates of the pixels in our 4 subspans. Each - * subspan is a 2x2 rectangle, and the screen x/y of the upper left of each - * subspan are given in GRF register 1.2 through 1.5 (which, with the word - * addressing below, are 1.4 through 1.11). - * - * The result is WM_X*_R and WM_Y*R being: - * - * X0: {ss0.x, ss0.x+1, ss0.x, ss0.x+1, ss1.x, ss1.x+1, ss1.x, ss1.x+y} - * Y0: {ss0.y, ss0.y, ss0.y+1, ss0.y+1, ss1.y, ss1.y, ss1.y+1, ss1.y+1} - * X1: {ss2.x, ss2.x+1, ss2.x, ss2.x+1, ss3.x, ss3.x+1, ss3.x, ss3.x+y} - * Y1: {ss2.y, ss2.y, ss2.y+1, ss2.y+1, ss3.y, ss3.y, ss3.y+1, ss3.y+1} - */ - - /* Set up ss0.x coordinates*/ -mov (1) g4<1>F g1.8<0,1,0>UW { align1 }; -add (1) g4.4<1>F g1.8<0,1,0>UW 1UB { align1 }; -mov (1) g4.8<1>F g1.8<0,1,0>UW { align1 }; -add (1) g4.12<1>F g1.8<0,1,0>UW 1UB { align1 }; - /* Set up ss0.y coordinates */ -mov (1) g6<1>F g1.10<0,1,0>UW { align1 }; -mov (1) g6.4<1>F g1.10<0,1,0>UW { align1 }; -add (1) g6.8<1>F g1.10<0,1,0>UW 1UB { align1 }; -add (1) g6.12<1>F g1.10<0,1,0>UW 1UB { align1 }; - /* set up ss1.x coordinates */ -mov (1) g4.16<1>F g1.12<0,1,0>UW { align1 }; -add (1) g4.20<1>F g1.12<0,1,0>UW 1UB { align1 }; -mov (1) g4.24<1>F g1.12<0,1,0>UW { align1 }; -add (1) g4.28<1>F g1.12<0,1,0>UW 1UB { align1 }; - /* set up ss1.y coordinates */ -mov (1) g6.16<1>F g1.14<0,1,0>UW { align1 }; -mov (1) g6.20<1>F g1.14<0,1,0>UW { align1 }; -add (1) g6.24<1>F g1.14<0,1,0>UW 1UB { align1 }; -add (1) g6.28<1>F g1.14<0,1,0>UW 1UB { align1 }; - /* Set up ss2.x coordinates */ -mov (1) g5<1>F g1.16<0,1,0>UW { align1 }; -add (1) g5.4<1>F g1.16<0,1,0>UW 1UB { align1 }; -mov (1) g5.8<1>F g1.16<0,1,0>UW { align1 }; -add (1) g5.12<1>F g1.16<0,1,0>UW 1UB { align1 }; - /* Set up ss2.y coordinates */ -mov (1) g7<1>F g1.18<0,1,0>UW { align1 }; -mov (1) g7.4<1>F g1.18<0,1,0>UW { align1 }; -add (1) g7.8<1>F g1.18<0,1,0>UW 1UB { align1 }; -add (1) g7.12<1>F g1.18<0,1,0>UW 1UB { align1 }; - /* Set up ss3.x coordinates */ -mov (1) g5.16<1>F g1.20<0,1,0>UW { align1 }; -add (1) g5.20<1>F g1.20<0,1,0>UW 1UB { align1 }; -mov (1) g5.24<1>F g1.20<0,1,0>UW { align1 }; -add (1) g5.28<1>F g1.20<0,1,0>UW 1UB { align1 }; - /* Set up ss3.y coordinates */ -mov (1) g7.16<1>F g1.22<0,1,0>UW { align1 }; -mov (1) g7.20<1>F g1.22<0,1,0>UW { align1 }; -add (1) g7.24<1>F g1.22<0,1,0>UW 1UB { align1 }; -add (1) g7.28<1>F g1.22<0,1,0>UW 1UB { align1 }; - - /* Now, map these screen space coordinates into texture coordinates. */ -/* XXX: convert it to calculate (u,v) in 90 and 270 case */ - /* subtract screen-space Y origin of vertex 0. */ -add (8) g6<1>F g6<8,8,1>F -g1.4<0,1,0>F { align1 }; -add (8) g7<1>F g7<8,8,1>F -g1.4<0,1,0>F { align1 }; - -/* (Yp - Ystart) * Cx */ -mul (8) g6<1>F g6<8,8,1>F g3<0,1,0>F { align1 }; -mul (8) g7<1>F g7<8,8,1>F g3<0,1,0>F { align1 }; - - /* scale by texture Y increment */ -add (8) g6<1>F g6<8,8,1>F g3.12<0,1,0>F { align1 }; -add (8) g7<1>F g7<8,8,1>F g3.12<0,1,0>F { align1 }; - - /* subtract screen-space X origin of vertex 0. */ -add (8) g4<1>F g4<8,8,1>F -g1<0,1,0>F { align1 }; -add (8) g5<1>F g5<8,8,1>F -g1<0,1,0>F { align1 }; - /* scale by texture X increment */ -mul (8) g4<1>F g4<8,8,1>F g3.20<0,1,0>F { align1 }; -mul (8) g5<1>F g5<8,8,1>F g3.20<0,1,0>F { align1 }; - /* add in texture X offset */ -add (8) g4<1>F g4<8,8,1>F g3.28<0,1,0>F { align1 }; -add (8) g5<1>F g5<8,8,1>F g3.28<0,1,0>F { align1 }; - - /* sampler */ -mov (8) m1<1>F g6<8,8,1>F { align1 }; -mov (8) m2<1>F g7<8,8,1>F { align1 }; -mov (8) m3<1>F g4<8,8,1>F { align1 }; -mov (8) m4<1>F g5<8,8,1>F { align1 }; - - /* - * g0 holds the PS thread payload, which (oddly) contains - * precisely what the sampler wants to see in m0 - */ -send (16) 0 g12<1>UW g0<8,8,1>UW sampler (1,0,F) mlen 5 rlen 8 { align1 }; -mov (8) g19<1>UD g19<8,8,1>UD { align1 }; - -mov (8) m2<1>F g12<8,8,1>F { align1 }; -mov (8) m3<1>F g14<8,8,1>F { align1 }; -mov (8) m4<1>F g16<8,8,1>F { align1 }; -mov (8) m5<1>F g18<8,8,1>F { align1 }; -mov (8) m6<1>F g13<8,8,1>F { align1 }; -mov (8) m7<1>F g15<8,8,1>F { align1 }; -mov (8) m8<1>F g17<8,8,1>F { align1 }; -mov (8) m9<1>F g19<8,8,1>F { align1 }; - - /* Pass through control information: - */ -mov (8) m1<1>UD g1<8,8,1>UD { align1 mask_disable }; - /* Send framebuffer write message: XXX: acc0? */ -send (16) 0 acc0<1>UW g0<8,8,1>UW write ( - 0, /* binding table index 0 */ - 8, /* pixel scoreboard clear */ - 4, /* render target write */ - 0 /* no write commit message */ - ) mlen 10 rlen 0 { align1 EOT }; - /* padding */ -nop; -nop; -nop; -nop; -nop; -nop; -nop; -nop; diff --git a/src/rotation_wm_prog0.h b/src/rotation_wm_prog0.h deleted file mode 100644 index 08269b73..00000000 --- a/src/rotation_wm_prog0.h +++ /dev/null @@ -1,68 +0,0 @@ - { 0x00000001, 0x2080013d, 0x00000028, 0x00000000 }, - { 0x00000040, 0x20840d3d, 0x00000028, 0x00000001 }, - { 0x00000001, 0x2088013d, 0x00000028, 0x00000000 }, - { 0x00000040, 0x208c0d3d, 0x00000028, 0x00000001 }, - { 0x00000001, 0x20c0013d, 0x0000002a, 0x00000000 }, - { 0x00000001, 0x20c4013d, 0x0000002a, 0x00000000 }, - { 0x00000040, 0x20c80d3d, 0x0000002a, 0x00000001 }, - { 0x00000040, 0x20cc0d3d, 0x0000002a, 0x00000001 }, - { 0x00000001, 0x2090013d, 0x0000002c, 0x00000000 }, - { 0x00000040, 0x20940d3d, 0x0000002c, 0x00000001 }, - { 0x00000001, 0x2098013d, 0x0000002c, 0x00000000 }, - { 0x00000040, 0x209c0d3d, 0x0000002c, 0x00000001 }, - { 0x00000001, 0x20d0013d, 0x0000002e, 0x00000000 }, - { 0x00000001, 0x20d4013d, 0x0000002e, 0x00000000 }, - { 0x00000040, 0x20d80d3d, 0x0000002e, 0x00000001 }, - { 0x00000040, 0x20dc0d3d, 0x0000002e, 0x00000001 }, - { 0x00000001, 0x20a0013d, 0x00000030, 0x00000000 }, - { 0x00000040, 0x20a40d3d, 0x00000030, 0x00000001 }, - { 0x00000001, 0x20a8013d, 0x00000030, 0x00000000 }, - { 0x00000040, 0x20ac0d3d, 0x00000030, 0x00000001 }, - { 0x00000001, 0x20e0013d, 0x00000032, 0x00000000 }, - { 0x00000001, 0x20e4013d, 0x00000032, 0x00000000 }, - { 0x00000040, 0x20e80d3d, 0x00000032, 0x00000001 }, - { 0x00000040, 0x20ec0d3d, 0x00000032, 0x00000001 }, - { 0x00000001, 0x20b0013d, 0x00000034, 0x00000000 }, - { 0x00000040, 0x20b40d3d, 0x00000034, 0x00000001 }, - { 0x00000001, 0x20b8013d, 0x00000034, 0x00000000 }, - { 0x00000040, 0x20bc0d3d, 0x00000034, 0x00000001 }, - { 0x00000001, 0x20f0013d, 0x00000036, 0x00000000 }, - { 0x00000001, 0x20f4013d, 0x00000036, 0x00000000 }, - { 0x00000040, 0x20f80d3d, 0x00000036, 0x00000001 }, - { 0x00000040, 0x20fc0d3d, 0x00000036, 0x00000001 }, - { 0x00600040, 0x208077bd, 0x008d0080, 0x00004020 }, - { 0x00600040, 0x20a077bd, 0x008d00a0, 0x00004020 }, - { 0x00600041, 0x208077bd, 0x008d0080, 0x00000060 }, - { 0x00600041, 0x20a077bd, 0x008d00a0, 0x00000060 }, - { 0x00600040, 0x208077bd, 0x008d0080, 0x0000006c }, - { 0x00600040, 0x20a077bd, 0x008d00a0, 0x0000006c }, - { 0x00600040, 0x20c077bd, 0x008d00c0, 0x00004024 }, - { 0x00600040, 0x20e077bd, 0x008d00e0, 0x00004024 }, - { 0x00600041, 0x20c077bd, 0x008d00c0, 0x00000074 }, - { 0x00600041, 0x20e077bd, 0x008d00e0, 0x00000074 }, - { 0x00600040, 0x20c077bd, 0x008d00c0, 0x0000007c }, - { 0x00600040, 0x20e077bd, 0x008d00e0, 0x0000007c }, - { 0x00600001, 0x202003be, 0x008d0080, 0x00000000 }, - { 0x00600001, 0x204003be, 0x008d00a0, 0x00000000 }, - { 0x00600001, 0x206003be, 0x008d00c0, 0x00000000 }, - { 0x00600001, 0x208003be, 0x008d00e0, 0x00000000 }, - { 0x00800031, 0x21801d29, 0x008d0000, 0x02580001 }, - { 0x00600001, 0x22600021, 0x008d0260, 0x00000000 }, - { 0x00600001, 0x204003be, 0x008d0180, 0x00000000 }, - { 0x00600001, 0x206003be, 0x008d01c0, 0x00000000 }, - { 0x00600001, 0x208003be, 0x008d0200, 0x00000000 }, - { 0x00600001, 0x20a003be, 0x008d0240, 0x00000000 }, - { 0x00600001, 0x20c003be, 0x008d01a0, 0x00000000 }, - { 0x00600001, 0x20e003be, 0x008d01e0, 0x00000000 }, - { 0x00600001, 0x210003be, 0x008d0220, 0x00000000 }, - { 0x00600001, 0x212003be, 0x008d0260, 0x00000000 }, - { 0x00600201, 0x20200022, 0x008d0020, 0x00000000 }, - { 0x00800031, 0x24001d28, 0x008d0000, 0x85a04800 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, diff --git a/src/rotation_wm_prog90.h b/src/rotation_wm_prog90.h deleted file mode 100644 index 9b87750d..00000000 --- a/src/rotation_wm_prog90.h +++ /dev/null @@ -1,68 +0,0 @@ - { 0x00000001, 0x2080013d, 0x00000028, 0x00000000 }, - { 0x00000040, 0x20840d3d, 0x00000028, 0x00000001 }, - { 0x00000001, 0x2088013d, 0x00000028, 0x00000000 }, - { 0x00000040, 0x208c0d3d, 0x00000028, 0x00000001 }, - { 0x00000001, 0x20c0013d, 0x0000002a, 0x00000000 }, - { 0x00000001, 0x20c4013d, 0x0000002a, 0x00000000 }, - { 0x00000040, 0x20c80d3d, 0x0000002a, 0x00000001 }, - { 0x00000040, 0x20cc0d3d, 0x0000002a, 0x00000001 }, - { 0x00000001, 0x2090013d, 0x0000002c, 0x00000000 }, - { 0x00000040, 0x20940d3d, 0x0000002c, 0x00000001 }, - { 0x00000001, 0x2098013d, 0x0000002c, 0x00000000 }, - { 0x00000040, 0x209c0d3d, 0x0000002c, 0x00000001 }, - { 0x00000001, 0x20d0013d, 0x0000002e, 0x00000000 }, - { 0x00000001, 0x20d4013d, 0x0000002e, 0x00000000 }, - { 0x00000040, 0x20d80d3d, 0x0000002e, 0x00000001 }, - { 0x00000040, 0x20dc0d3d, 0x0000002e, 0x00000001 }, - { 0x00000001, 0x20a0013d, 0x00000030, 0x00000000 }, - { 0x00000040, 0x20a40d3d, 0x00000030, 0x00000001 }, - { 0x00000001, 0x20a8013d, 0x00000030, 0x00000000 }, - { 0x00000040, 0x20ac0d3d, 0x00000030, 0x00000001 }, - { 0x00000001, 0x20e0013d, 0x00000032, 0x00000000 }, - { 0x00000001, 0x20e4013d, 0x00000032, 0x00000000 }, - { 0x00000040, 0x20e80d3d, 0x00000032, 0x00000001 }, - { 0x00000040, 0x20ec0d3d, 0x00000032, 0x00000001 }, - { 0x00000001, 0x20b0013d, 0x00000034, 0x00000000 }, - { 0x00000040, 0x20b40d3d, 0x00000034, 0x00000001 }, - { 0x00000001, 0x20b8013d, 0x00000034, 0x00000000 }, - { 0x00000040, 0x20bc0d3d, 0x00000034, 0x00000001 }, - { 0x00000001, 0x20f0013d, 0x00000036, 0x00000000 }, - { 0x00000001, 0x20f4013d, 0x00000036, 0x00000000 }, - { 0x00000040, 0x20f80d3d, 0x00000036, 0x00000001 }, - { 0x00000040, 0x20fc0d3d, 0x00000036, 0x00000001 }, - { 0x00600040, 0x20c077bd, 0x008d00c0, 0x00004024 }, - { 0x00600040, 0x20e077bd, 0x008d00e0, 0x00004024 }, - { 0x00600041, 0x20c077bd, 0x008d00c0, 0x00000060 }, - { 0x00600041, 0x20e077bd, 0x008d00e0, 0x00000060 }, - { 0x00600040, 0x20c077bd, 0x008d00c0, 0x0000006c }, - { 0x00600040, 0x20e077bd, 0x008d00e0, 0x0000006c }, - { 0x00600040, 0x208077bd, 0x008d0080, 0x00004020 }, - { 0x00600040, 0x20a077bd, 0x008d00a0, 0x00004020 }, - { 0x00600041, 0x208077bd, 0x008d0080, 0x00000074 }, - { 0x00600041, 0x20a077bd, 0x008d00a0, 0x00000074 }, - { 0x00600040, 0x208077bd, 0x008d0080, 0x0000007c }, - { 0x00600040, 0x20a077bd, 0x008d00a0, 0x0000007c }, - { 0x00600001, 0x202003be, 0x008d00c0, 0x00000000 }, - { 0x00600001, 0x204003be, 0x008d00e0, 0x00000000 }, - { 0x00600001, 0x206003be, 0x008d0080, 0x00000000 }, - { 0x00600001, 0x208003be, 0x008d00a0, 0x00000000 }, - { 0x00800031, 0x21801d29, 0x008d0000, 0x02580001 }, - { 0x00600001, 0x22600021, 0x008d0260, 0x00000000 }, - { 0x00600001, 0x204003be, 0x008d0180, 0x00000000 }, - { 0x00600001, 0x206003be, 0x008d01c0, 0x00000000 }, - { 0x00600001, 0x208003be, 0x008d0200, 0x00000000 }, - { 0x00600001, 0x20a003be, 0x008d0240, 0x00000000 }, - { 0x00600001, 0x20c003be, 0x008d01a0, 0x00000000 }, - { 0x00600001, 0x20e003be, 0x008d01e0, 0x00000000 }, - { 0x00600001, 0x210003be, 0x008d0220, 0x00000000 }, - { 0x00600001, 0x212003be, 0x008d0260, 0x00000000 }, - { 0x00600201, 0x20200022, 0x008d0020, 0x00000000 }, - { 0x00800031, 0x24001d28, 0x008d0000, 0x85a04800 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, - { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, From c47210d94ed17ad9e8e489a1e1886732e6dc7220 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 31 Jan 2007 12:50:31 -0800 Subject: [PATCH 29/35] Move the render code to non-EXA-specific filenames. --- src/Makefile.am | 6 +- src/common.h | 11 +++ src/i830_exa.c | 109 ----------------------- src/{i830_exa_render.c => i830_render.c} | 97 ++++++++++++++++++++ src/{i915_exa_render.c => i915_render.c} | 0 src/i915_video.c | 12 --- src/{i965_exa_render.c => i965_render.c} | 0 7 files changed, 111 insertions(+), 124 deletions(-) rename src/{i830_exa_render.c => i830_render.c} (86%) rename src/{i915_exa_render.c => i915_render.c} (100%) rename src/{i965_exa_render.c => i965_render.c} (100%) diff --git a/src/Makefile.am b/src/Makefile.am index ba126357..7656e02e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -92,9 +92,9 @@ i810_drv_la_SOURCES = \ i965_video.c \ i830_exa.c \ i830_xaa.c \ - i830_exa_render.c \ - i915_exa_render.c \ - i965_exa_render.c + i830_render.c \ + i915_render.c \ + i965_render.c if HAVE_GEN4ASM sf_prog.h: packed_yuv_sf.g4a diff --git a/src/common.h b/src/common.h index 561dfac7..91e31b5f 100644 --- a/src/common.h +++ b/src/common.h @@ -130,6 +130,17 @@ extern void I830DPRINTF_stub(const char *filename, int line, outring &= ringmask; \ } while (0) +union intfloat { + float f; + unsigned int ui; +}; + +#define OUT_RING_F(x) do { \ + union intfloat tmp; \ + tmp.f = (float)(x); \ + OUT_RING(tmp.ui); \ +} while(0) + #define ADVANCE_LP_RING() do { \ if (ringused > needed) \ FatalError("%s: ADVANCE_LP_RING: exceeded allocation %d/%d\n ", \ diff --git a/src/i830_exa.c b/src/i830_exa.c index 02d2dcfe..8a1577af 100644 --- a/src/i830_exa.c +++ b/src/i830_exa.c @@ -97,18 +97,6 @@ const int I830PatternROP[16] = ROP_1 }; -/* move to common.h */ -union intfloat { - float f; - unsigned int ui; -}; - -#define OUT_RING_F(x) do { \ - union intfloat tmp; \ - tmp.f = (float)(x); \ - OUT_RING(tmp.ui); \ -} while(0) - /** * I830EXASync - wait for a command to finish * @pScreen: current screen @@ -309,103 +297,6 @@ i830_get_transformed_coordinates(int x, int y, PictTransformPtr transform, } } -/** - * Do a single rectangle composite operation. - * - * This function is shared between i830 and i915 generation code. - */ -void -IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, - int dstX, int dstY, int w, int h) -{ - ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - Bool has_mask; - float src_x[3], src_y[3], mask_x[3], mask_y[3]; - - i830_get_transformed_coordinates(srcX, srcY, - pI830->transform[0], - &src_x[0], &src_y[0]); - i830_get_transformed_coordinates(srcX, srcY + h, - pI830->transform[0], - &src_x[1], &src_y[1]); - i830_get_transformed_coordinates(srcX + w, srcY + h, - pI830->transform[0], - &src_x[2], &src_y[2]); - - if (pI830->scale_units[1][0] == -1 || pI830->scale_units[1][1] == -1) { - has_mask = FALSE; - } else { - has_mask = TRUE; - i830_get_transformed_coordinates(maskX, maskY, - pI830->transform[1], - &mask_x[0], &mask_y[0]); - i830_get_transformed_coordinates(maskX, maskY + h, - pI830->transform[1], - &mask_x[1], &mask_y[1]); - i830_get_transformed_coordinates(maskX + w, maskY + h, - pI830->transform[1], - &mask_x[2], &mask_y[2]); - } - - { - int vertex_count; - - if (has_mask) - vertex_count = 3*6; - else - vertex_count = 3*4; - - BEGIN_LP_RING(6+vertex_count); - - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - OUT_RING(MI_NOOP); - - OUT_RING(PRIM3D_INLINE | PRIM3D_RECTLIST | (vertex_count-1)); - - OUT_RING_F(dstX); - OUT_RING_F(dstY); - OUT_RING_F(src_x[0] / pI830->scale_units[0][0]); - OUT_RING_F(src_y[0] / pI830->scale_units[0][1]); - if (has_mask) { - OUT_RING_F(mask_x[0] / pI830->scale_units[1][0]); - OUT_RING_F(mask_y[0] / pI830->scale_units[1][1]); - } - - OUT_RING_F(dstX); - OUT_RING_F(dstY + h); - OUT_RING_F(src_x[1] / pI830->scale_units[0][0]); - OUT_RING_F(src_y[1] / pI830->scale_units[0][1]); - if (has_mask) { - OUT_RING_F(mask_x[1] / pI830->scale_units[1][0]); - OUT_RING_F(mask_y[1] / pI830->scale_units[1][1]); - } - - OUT_RING_F(dstX + w); - OUT_RING_F(dstY + h); - OUT_RING_F(src_x[2] / pI830->scale_units[0][0]); - OUT_RING_F(src_y[2] / pI830->scale_units[0][1]); - if (has_mask) { - OUT_RING_F(mask_x[2] / pI830->scale_units[1][0]); - OUT_RING_F(mask_y[2] / pI830->scale_units[1][1]); - } - ADVANCE_LP_RING(); - } -} - -void -IntelEXADoneComposite(PixmapPtr pDst) -{ -#if ALWAYS_SYNC - ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; - - I830Sync(pScrn); -#endif -} - /* * TODO: * - Dual head? diff --git a/src/i830_exa_render.c b/src/i830_render.c similarity index 86% rename from src/i830_exa_render.c rename to src/i830_render.c index bf521b45..c335f6d0 100644 --- a/src/i830_exa_render.c +++ b/src/i830_render.c @@ -492,3 +492,100 @@ I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, return TRUE; } + +/** + * Do a single rectangle composite operation. + * + * This function is shared between i830 and i915 generation code. + */ +void +IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, + int dstX, int dstY, int w, int h) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + I830Ptr pI830 = I830PTR(pScrn); + Bool has_mask; + float src_x[3], src_y[3], mask_x[3], mask_y[3]; + + i830_get_transformed_coordinates(srcX, srcY, + pI830->transform[0], + &src_x[0], &src_y[0]); + i830_get_transformed_coordinates(srcX, srcY + h, + pI830->transform[0], + &src_x[1], &src_y[1]); + i830_get_transformed_coordinates(srcX + w, srcY + h, + pI830->transform[0], + &src_x[2], &src_y[2]); + + if (pI830->scale_units[1][0] == -1 || pI830->scale_units[1][1] == -1) { + has_mask = FALSE; + } else { + has_mask = TRUE; + i830_get_transformed_coordinates(maskX, maskY, + pI830->transform[1], + &mask_x[0], &mask_y[0]); + i830_get_transformed_coordinates(maskX, maskY + h, + pI830->transform[1], + &mask_x[1], &mask_y[1]); + i830_get_transformed_coordinates(maskX + w, maskY + h, + pI830->transform[1], + &mask_x[2], &mask_y[2]); + } + + { + int vertex_count; + + if (has_mask) + vertex_count = 3*6; + else + vertex_count = 3*4; + + BEGIN_LP_RING(6+vertex_count); + + OUT_RING(MI_NOOP); + OUT_RING(MI_NOOP); + OUT_RING(MI_NOOP); + OUT_RING(MI_NOOP); + OUT_RING(MI_NOOP); + + OUT_RING(PRIM3D_INLINE | PRIM3D_RECTLIST | (vertex_count-1)); + + OUT_RING_F(dstX); + OUT_RING_F(dstY); + OUT_RING_F(src_x[0] / pI830->scale_units[0][0]); + OUT_RING_F(src_y[0] / pI830->scale_units[0][1]); + if (has_mask) { + OUT_RING_F(mask_x[0] / pI830->scale_units[1][0]); + OUT_RING_F(mask_y[0] / pI830->scale_units[1][1]); + } + + OUT_RING_F(dstX); + OUT_RING_F(dstY + h); + OUT_RING_F(src_x[1] / pI830->scale_units[0][0]); + OUT_RING_F(src_y[1] / pI830->scale_units[0][1]); + if (has_mask) { + OUT_RING_F(mask_x[1] / pI830->scale_units[1][0]); + OUT_RING_F(mask_y[1] / pI830->scale_units[1][1]); + } + + OUT_RING_F(dstX + w); + OUT_RING_F(dstY + h); + OUT_RING_F(src_x[2] / pI830->scale_units[0][0]); + OUT_RING_F(src_y[2] / pI830->scale_units[0][1]); + if (has_mask) { + OUT_RING_F(mask_x[2] / pI830->scale_units[1][0]); + OUT_RING_F(mask_y[2] / pI830->scale_units[1][1]); + } + ADVANCE_LP_RING(); + } +} + +void +IntelEXADoneComposite(PixmapPtr pDst) +{ +#if ALWAYS_SYNC + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + + I830Sync(pScrn); +#endif +} diff --git a/src/i915_exa_render.c b/src/i915_render.c similarity index 100% rename from src/i915_exa_render.c rename to src/i915_render.c diff --git a/src/i915_video.c b/src/i915_video.c index 591b6f82..e837097d 100644 --- a/src/i915_video.c +++ b/src/i915_video.c @@ -39,18 +39,6 @@ #include "i915_reg.h" #include "i915_3d.h" -union intfloat { - CARD32 ui; - float f; -}; - -#define OUT_RING_F(x) do { \ - union intfloat _tmp; \ - _tmp.f = x; \ - OUT_RING(_tmp.ui); \ -} while (0) - - void I915DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, RegionPtr dstRegion, diff --git a/src/i965_exa_render.c b/src/i965_render.c similarity index 100% rename from src/i965_exa_render.c rename to src/i965_render.c From 5238ff9c80718f9f8baa06123aa1bb6e3193fce6 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 31 Jan 2007 14:01:41 -0800 Subject: [PATCH 30/35] Naming and formatting cleanup in Render acceleration code. --- src/i830.h | 47 ++- src/i830_exa.c | 36 +- src/i830_render.c | 210 +++++------ src/i830_xaa.c | 35 +- src/i915_render.c | 110 +++--- src/i965_render.c | 868 ++++++++++++++++++++++++---------------------- 6 files changed, 675 insertions(+), 631 deletions(-) diff --git a/src/i830.h b/src/i830.h index 4996cdd8..42933f92 100644 --- a/src/i830.h +++ b/src/i830.h @@ -639,30 +639,29 @@ DisplayModePtr i830_ddc_get_modes(xf86OutputPtr output); /* i830_tv.c */ void i830_tv_init(ScrnInfoPtr pScrn); -extern Bool I830EXACheckComposite(int, PicturePtr, PicturePtr, PicturePtr); -extern Bool I830EXAPrepareComposite(int, PicturePtr, PicturePtr, PicturePtr, - PixmapPtr, PixmapPtr, PixmapPtr); -extern Bool I915EXACheckComposite(int, PicturePtr, PicturePtr, PicturePtr); -extern Bool I915EXAPrepareComposite(int, PicturePtr, PicturePtr, PicturePtr, - PixmapPtr, PixmapPtr, PixmapPtr); - -extern Bool I965EXACheckComposite(int, PicturePtr, PicturePtr, PicturePtr); -extern Bool I965EXAPrepareComposite(int, PicturePtr, PicturePtr, PicturePtr, - PixmapPtr, PixmapPtr, PixmapPtr); -extern void I965EXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, - int maskY, int dstX, int dstY, int width, int height); -void IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, - int maskX, int maskY, int dstX, int dstY, int w, int h); -void IntelEXADoneComposite(PixmapPtr pDst); - -extern Bool -I830EXACheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, - PicturePtr pDstPicture); - -extern Bool -I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, - PicturePtr pMaskPicture, PicturePtr pDstPicture, - PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst); +/* i830_render.c */ +Bool i830_check_composite(int op, PicturePtr pSrc, PicturePtr pMask, + PicturePtr pDst); +Bool i830_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMask, + PicturePtr pDst, PixmapPtr pSrcPixmap, + PixmapPtr pMaskPixmap, PixmapPtr pDstPixmap); +void i830_composite(PixmapPtr pDst, int srcX, int srcY, + int maskX, int maskY, int dstX, int dstY, int w, int h); +void i830_done_composite(PixmapPtr pDst); +/* i915_render.c */ +Bool i915_check_composite(int op, PicturePtr pSrc, PicturePtr pMask, + PicturePtr pDst); +Bool i915_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMask, + PicturePtr pDst, PixmapPtr pSrcPixmap, + PixmapPtr pMaskPixmap, PixmapPtr pDstPixmap); +/* i965_render.c */ +Bool i965_check_composite(int op, PicturePtr pSrc, PicturePtr pMask, + PicturePtr pDst); +Bool i965_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMask, + PicturePtr pDst, PixmapPtr pSrcPixmap, + PixmapPtr pMaskPixmap, PixmapPtr pDstPixmap); +void i965_composite(PixmapPtr pDst, int srcX, int srcY, + int maskX, int maskY, int dstX, int dstY, int w, int h); void i830_get_transformed_coordinates(int x, int y, PictTransformPtr transform, diff --git a/src/i830_exa.c b/src/i830_exa.c index 8a1577af..97b4a98e 100644 --- a/src/i830_exa.c +++ b/src/i830_exa.c @@ -398,23 +398,25 @@ I830EXAInit(ScreenPtr pScreen) pI830->EXADriverPtr->DoneCopy = I830EXADoneCopy; /* Composite */ - if (IS_I915G(pI830) || IS_I915GM(pI830) || - IS_I945G(pI830) || IS_I945GM(pI830)) { - pI830->EXADriverPtr->CheckComposite = I915EXACheckComposite; - pI830->EXADriverPtr->PrepareComposite = I915EXAPrepareComposite; - pI830->EXADriverPtr->Composite = IntelEXAComposite; - pI830->EXADriverPtr->DoneComposite = IntelEXADoneComposite; - } else if (IS_I865G(pI830) || IS_I855(pI830) || - IS_845G(pI830) || IS_I830(pI830)) { - pI830->EXADriverPtr->CheckComposite = I830EXACheckComposite; - pI830->EXADriverPtr->PrepareComposite = I830EXAPrepareComposite; - pI830->EXADriverPtr->Composite = IntelEXAComposite; - pI830->EXADriverPtr->DoneComposite = IntelEXADoneComposite; - } else if (IS_I965G(pI830)) { - pI830->EXADriverPtr->CheckComposite = I965EXACheckComposite; - pI830->EXADriverPtr->PrepareComposite = I965EXAPrepareComposite; - pI830->EXADriverPtr->Composite = I965EXAComposite; - pI830->EXADriverPtr->DoneComposite = IntelEXADoneComposite; + if (IS_I865G(pI830) || IS_I855(pI830) || + IS_845G(pI830) || IS_I830(pI830)) + { + pI830->EXADriverPtr->CheckComposite = i830_check_composite; + pI830->EXADriverPtr->PrepareComposite = i830_prepare_composite; + pI830->EXADriverPtr->Composite = i830_composite; + pI830->EXADriverPtr->DoneComposite = i830_done_composite; + } else if (IS_I915G(pI830) || IS_I915GM(pI830) || + IS_I945G(pI830) || IS_I945GM(pI830)) + { + pI830->EXADriverPtr->CheckComposite = i915_check_composite; + pI830->EXADriverPtr->PrepareComposite = i915_prepare_composite; + pI830->EXADriverPtr->Composite = i830_composite; + pI830->EXADriverPtr->DoneComposite = i830_done_composite; + } else { + pI830->EXADriverPtr->CheckComposite = i965_check_composite; + pI830->EXADriverPtr->PrepareComposite = i965_prepare_composite; + pI830->EXADriverPtr->Composite = i965_composite; + pI830->EXADriverPtr->DoneComposite = i830_done_composite; } if(!exaDriverInit(pScreen, pI830->EXADriverPtr)) { diff --git a/src/i830_render.c b/src/i830_render.c index c335f6d0..99338439 100644 --- a/src/i830_render.c +++ b/src/i830_render.c @@ -48,7 +48,7 @@ do { \ #define I830FALLBACK(s, arg...) \ do { \ return FALSE; \ -} while(0) +} while(0) #endif struct blendinfo { @@ -112,7 +112,7 @@ struct formatinfo { #define TB0A_ARG1_SEL_TEXEL2 (8 << 6) #define TB0A_ARG1_SEL_TEXEL3 (9 << 6) -static struct blendinfo I830BlendOp[] = { +static struct blendinfo i830_blend_op[] = { /* Clear */ {0, 0, BLENDFACTOR_ZERO, BLENDFACTOR_ZERO}, /* Src */ @@ -141,21 +141,20 @@ static struct blendinfo I830BlendOp[] = { {0, 0, BLENDFACTOR_ONE, BLENDFACTOR_ONE}, }; - -static struct formatinfo I830TexFormats[] = { - {PICT_a8r8g8b8, MT_32BIT_ARGB8888 }, - {PICT_x8r8g8b8, MT_32BIT_ARGB8888 }, - {PICT_a8b8g8r8, MT_32BIT_ABGR8888 }, - {PICT_x8b8g8r8, MT_32BIT_ABGR8888 }, - {PICT_r5g6b5, MT_16BIT_RGB565 }, - {PICT_a1r5g5b5, MT_16BIT_ARGB1555 }, - {PICT_x1r5g5b5, MT_16BIT_ARGB1555 }, - {PICT_a8, MT_8BIT_I8 }, +static struct formatinfo i830_tex_formats[] = { + {PICT_a8r8g8b8, MT_32BIT_ARGB8888 }, + {PICT_x8r8g8b8, MT_32BIT_ARGB8888 }, + {PICT_a8b8g8r8, MT_32BIT_ABGR8888 }, + {PICT_x8b8g8r8, MT_32BIT_ABGR8888 }, + {PICT_r5g6b5, MT_16BIT_RGB565 }, + {PICT_a1r5g5b5, MT_16BIT_ARGB1555 }, + {PICT_x1r5g5b5, MT_16BIT_ARGB1555 }, + {PICT_a8, MT_8BIT_I8 }, }; -static Bool I830GetDestFormat(PicturePtr pDstPicture, CARD32 *dst_format) +static Bool i830_get_dest_format(PicturePtr pDstPicture, CARD32 *dst_format) { - /* XXX: color buffer format for i830 */ + /* XXX: color buffer format for i830 */ switch (pDstPicture->format) { case PICT_a8r8g8b8: case PICT_x8r8g8b8: @@ -177,35 +176,35 @@ static Bool I830GetDestFormat(PicturePtr pDstPicture, CARD32 *dst_format) break; default: I830FALLBACK("Unsupported dest format 0x%x\n", - (int)pDstPicture->format); + (int)pDstPicture->format); } return TRUE; } -static CARD32 I830GetBlendCntl(int op, PicturePtr pMask, CARD32 dst_format) +static CARD32 i830_get_blend_cntl(int op, PicturePtr pMask, CARD32 dst_format) { CARD32 sblend, dblend; - sblend = I830BlendOp[op].src_blend; - dblend = I830BlendOp[op].dst_blend; + sblend = i830_blend_op[op].src_blend; + dblend = i830_blend_op[op].dst_blend; /* If there's no dst alpha channel, adjust the blend op so that we'll treat * it as always 1. */ - if (PICT_FORMAT_A(dst_format) == 0 && I830BlendOp[op].dst_alpha) { + if (PICT_FORMAT_A(dst_format) == 0 && i830_blend_op[op].dst_alpha) { if (sblend == BLENDFACTOR_DST_ALPHA) sblend = BLENDFACTOR_ONE; else if (sblend == BLENDFACTOR_INV_DST_ALPHA) sblend = BLENDFACTOR_ZERO; } - /* If the source alpha is being used, then we should only be in a case where - * the source blend factor is 0, and the source blend value is the mask - * channels multiplied by the source picture's alpha. + /* If the source alpha is being used, then we should only be in a case + * where the source blend factor is 0, and the source blend value is the + * mask channels multiplied by the source picture's alpha. */ - if (pMask && pMask->componentAlpha && I830BlendOp[op].src_alpha) { + if (pMask && pMask->componentAlpha && i830_blend_op[op].src_alpha) { if (dblend == BLENDFACTOR_SRC_ALPHA) { dblend = BLENDFACTOR_SRC_COLR; } else if (dblend == BLENDFACTOR_INV_SRC_ALPHA) { @@ -213,27 +212,28 @@ static CARD32 I830GetBlendCntl(int op, PicturePtr pMask, CARD32 dst_format) } } - return (sblend << S8_SRC_BLEND_FACTOR_SHIFT) | - (dblend << S8_DST_BLEND_FACTOR_SHIFT); + return (sblend << S8_SRC_BLEND_FACTOR_SHIFT) | + (dblend << S8_DST_BLEND_FACTOR_SHIFT); } -static Bool I830CheckCompositeTexture(PicturePtr pPict, int unit) +static Bool i830_check_composite_texture(PicturePtr pPict, int unit) { int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; int i; - + if ((w > 0x7ff) || (h > 0x7ff)) I830FALLBACK("Picture w/h too large (%dx%d)\n", w, h); - for (i = 0; i < sizeof(I830TexFormats) / sizeof(I830TexFormats[0]); i++) + for (i = 0; i < sizeof(i830_tex_formats) / sizeof(i830_tex_formats[0]); + i++) { - if (I830TexFormats[i].fmt == pPict->format) + if (i830_tex_formats[i].fmt == pPict->format) break; } - if (i == sizeof(I830TexFormats) / sizeof(I830TexFormats[0])) + if (i == sizeof(i830_tex_formats) / sizeof(i830_tex_formats[0])) I830FALLBACK("Unsupported picture format 0x%x\n", - (int)pPict->format); + (int)pPict->format); /* FIXME: fix repeat support */ if (pPict->repeat) @@ -241,20 +241,22 @@ static Bool I830CheckCompositeTexture(PicturePtr pPict, int unit) if (pPict->filter != PictFilterNearest && pPict->filter != PictFilterBilinear) + { I830FALLBACK("Unsupported filter 0x%x\n", pPict->filter); + } return TRUE; } static Bool -I830TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) +i830_texture_setup(PicturePtr pPict, PixmapPtr pPix, int unit) { ScrnInfoPtr pScrn = xf86Screens[pPict->pDrawable->pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); CARD32 format, offset, pitch, filter; int w, h, i; - CARD32 wrap_mode = TEXCOORDMODE_CLAMP; + CARD32 wrap_mode = TEXCOORDMODE_CLAMP; offset = intel_get_pixmap_offset(pPix); pitch = intel_get_pixmap_pitch(pPix); @@ -263,25 +265,27 @@ I830TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) pI830->scale_units[unit][0] = pPix->drawable.width; pI830->scale_units[unit][1] = pPix->drawable.height; - for (i = 0; i < sizeof(I830TexFormats) / sizeof(I830TexFormats[0]); i++) { - if (I830TexFormats[i].fmt == pPict->format) + for (i = 0; i < sizeof(i830_tex_formats) / sizeof(i830_tex_formats[0]); + i++) + { + if (i830_tex_formats[i].fmt == pPict->format) break; } - if ( i == sizeof(I830TexFormats)/ sizeof(I830TexFormats[0]) ) + if (i == sizeof(i830_tex_formats)/ sizeof(i830_tex_formats[0])) I830FALLBACK("unknown texture format\n"); - format = I830TexFormats[i].card_fmt; + format = i830_tex_formats[i].card_fmt; - if (pPict->repeat) + if (pPict->repeat) wrap_mode = TEXCOORDMODE_WRAP; /* XXX: correct ? */ - + switch (pPict->filter) { case PictFilterNearest: - filter = ((FILTER_NEAREST<drawable.height - 1) << 16) | - (pPix->drawable.width - 1)); /* height, width */ + (pPix->drawable.width - 1)); /* height, width */ OUT_RING(offset); /* map address */ OUT_RING(((pitch / 4) - 1) << 2); /* map pitch */ OUT_RING(0); @@ -310,16 +314,19 @@ I830TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) { BEGIN_LP_RING(2); /* coord sets */ - OUT_RING(_3DSTATE_MAP_COORD_SET_CMD | TEXCOORD_SET(unit) | - ENABLE_TEXCOORD_PARAMS | TEXCOORDS_ARE_NORMAL | - TEXCOORDTYPE_CARTESIAN | ENABLE_ADDR_V_CNTL | - TEXCOORD_ADDR_V_MODE(wrap_mode) | - ENABLE_ADDR_U_CNTL | TEXCOORD_ADDR_U_MODE(wrap_mode)); + OUT_RING(_3DSTATE_MAP_COORD_SET_CMD | TEXCOORD_SET(unit) | + ENABLE_TEXCOORD_PARAMS | TEXCOORDS_ARE_NORMAL | + TEXCOORDTYPE_CARTESIAN | ENABLE_ADDR_V_CNTL | + TEXCOORD_ADDR_V_MODE(wrap_mode) | + ENABLE_ADDR_U_CNTL | TEXCOORD_ADDR_U_MODE(wrap_mode)); OUT_RING(MI_NOOP); /* XXX: filter seems hang engine...*/ #if 0 - OUT_RING(I830_STATE3D_MAP_FILTER | FILTER_MAP_INDEX(unit) | ENABLE_KEYS| DISABLE_COLOR_KEY | DISABLE_CHROMA_KEY | DISABLE_KILL_PIXEL |ENABLE_MIP_MODE_FILTER | MIPFILTER_NONE | filter); + OUT_RING(I830_STATE3D_MAP_FILTER | FILTER_MAP_INDEX(unit) | + ENABLE_KEYS| DISABLE_COLOR_KEY | DISABLE_CHROMA_KEY | + DISABLE_KILL_PIXEL |ENABLE_MIP_MODE_FILTER | + MIPFILTER_NONE | filter); OUT_RING(0); #endif @@ -334,63 +341,63 @@ I830TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) ErrorF("try to sync to show any errors..."); I830Sync(pScrn); #endif - + return TRUE; } Bool -I830EXACheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, - PicturePtr pDstPicture) +i830_check_composite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, + PicturePtr pDstPicture) { CARD32 tmp1; - + /* Check for unsupported compositing operations. */ - if (op >= sizeof(I830BlendOp) / sizeof(I830BlendOp[0])) + if (op >= sizeof(i830_blend_op) / sizeof(i830_blend_op[0])) I830FALLBACK("Unsupported Composite op 0x%x\n", op); - + if (pMaskPicture != NULL && pMaskPicture->componentAlpha) { /* Check if it's component alpha that relies on a source alpha and on * the source value. We can only get one of those into the single * source value that we get to blend with. */ - if (I830BlendOp[op].src_alpha && - (I830BlendOp[op].src_blend != BLENDFACTOR_ZERO)) + if (i830_blend_op[op].src_alpha && + (i830_blend_op[op].src_blend != BLENDFACTOR_ZERO)) I830FALLBACK("Component alpha not supported with source " - "alpha and source value blending.\n"); + "alpha and source value blending.\n"); } - if (!I830CheckCompositeTexture(pSrcPicture, 0)) + if (!i830_check_composite_texture(pSrcPicture, 0)) I830FALLBACK("Check Src picture texture\n"); - if (pMaskPicture != NULL && !I830CheckCompositeTexture(pMaskPicture, 1)) + if (pMaskPicture != NULL && !i830_check_composite_texture(pMaskPicture, 1)) I830FALLBACK("Check Mask picture texture\n"); - if (!I830GetDestFormat(pDstPicture, &tmp1)) + if (!i830_get_dest_format(pDstPicture, &tmp1)) I830FALLBACK("Get Color buffer format\n"); return TRUE; } Bool -I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, - PicturePtr pMaskPicture, PicturePtr pDstPicture, - PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) +i830_prepare_composite(int op, PicturePtr pSrcPicture, + PicturePtr pMaskPicture, PicturePtr pDstPicture, + PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) { -/* XXX: setup texture map from pixmap, vertex format, blend cntl */ + /* XXX: setup texture map from pixmap, vertex format, blend cntl */ ScrnInfoPtr pScrn = xf86Screens[pSrcPicture->pDrawable->pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); CARD32 dst_format, dst_offset, dst_pitch; - I830GetDestFormat(pDstPicture, &dst_format); + i830_get_dest_format(pDstPicture, &dst_format); dst_offset = intel_get_pixmap_offset(pDst); dst_pitch = intel_get_pixmap_pitch(pDst); pI830->last_3d = LAST_3D_RENDER; - if (!I830TextureSetup(pSrcPicture, pSrc, 0)) + if (!i830_texture_setup(pSrcPicture, pSrc, 0)) I830FALLBACK("fail to setup src texture\n"); if (pMask != NULL) { - if (!I830TextureSetup(pMaskPicture, pMask, 1)) - I830FALLBACK("fail to setup mask texture\n"); + if (!i830_texture_setup(pMaskPicture, pMask, 1)) + I830FALLBACK("fail to setup mask texture\n"); } else { pI830->transform[1] = NULL; pI830->scale_units[1][0] = -1; @@ -398,17 +405,16 @@ I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, } { - CARD32 cblend, ablend, blendctl, vf2; BEGIN_LP_RING(22+6); - - /*color buffer*/ + + /* color buffer */ OUT_RING(_3DSTATE_BUF_INFO_CMD); OUT_RING(BUF_3D_ID_COLOR_BACK| BUF_3D_PITCH(dst_pitch)); OUT_RING(BUF_3D_ADDR(dst_offset)); OUT_RING(MI_NOOP); - + OUT_RING(_3DSTATE_DST_BUF_VARS_CMD); OUT_RING(dst_format); @@ -423,10 +429,10 @@ I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, OUT_RING(_3DSTATE_DFLT_SPEC_CMD); OUT_RING(0); - + OUT_RING(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(3) | 0); - OUT_RING((1 << S3_POINT_WIDTH_SHIFT) | (2 << S3_LINE_WIDTH_SHIFT) | - S3_CULLMODE_NONE | S3_VERTEXHAS_XY); + OUT_RING((1 << S3_POINT_WIDTH_SHIFT) | (2 << S3_LINE_WIDTH_SHIFT) | + S3_CULLMODE_NONE | S3_VERTEXHAS_XY); OUT_RING(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(2) | 0); if (pMask) vf2 = 2 << 12; /* 2 texture coord sets */ @@ -437,7 +443,7 @@ I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, vf2 |= (TEXCOORDFMT_2D << 18); else vf2 |= (TEXCOORDFMT_1D << 18); - + vf2 |= (TEXCOORDFMT_1D << 20); vf2 |= (TEXCOORDFMT_1D << 22); vf2 |= (TEXCOORDFMT_1D << 24); @@ -452,10 +458,10 @@ I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, /* IN operator: Multiply src by mask components or mask alpha.*/ /* TEXBLENDOP_MODULE: arg1*arg2 */ cblend = TB0C_LAST_STAGE | TB0C_RESULT_SCALE_1X | TB0C_OP_MODULE | - TB0C_OUTPUT_WRITE_CURRENT; - ablend = TB0A_RESULT_SCALE_1X | TB0A_OP_MODULE | + TB0C_OUTPUT_WRITE_CURRENT; + ablend = TB0A_RESULT_SCALE_1X | TB0A_OP_MODULE | TB0A_OUTPUT_WRITE_CURRENT; - + cblend |= TB0C_ARG1_SEL_TEXEL0; ablend |= TB0A_ARG1_SEL_TEXEL0; if (pMask) { @@ -465,11 +471,12 @@ I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, cblend |= (TB0C_ARG2_SEL_TEXEL1 | TB0C_ARG2_REPLICATE_ALPHA); ablend |= TB0A_ARG2_SEL_TEXEL1; } else { - cblend |= TB0C_ARG2_SEL_ONE; - ablend |= TB0A_ARG2_SEL_ONE; + cblend |= TB0C_ARG2_SEL_ONE; + ablend |= TB0A_ARG2_SEL_ONE; } - - OUT_RING(_3DSTATE_LOAD_STATE_IMMEDIATE_2 | LOAD_TEXTURE_BLEND_STAGE(0)|1); + + OUT_RING(_3DSTATE_LOAD_STATE_IMMEDIATE_2 | + LOAD_TEXTURE_BLEND_STAGE(0)|1); OUT_RING(cblend); OUT_RING(ablend); OUT_RING(0); @@ -477,16 +484,16 @@ I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, OUT_RING(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE); OUT_RING(MI_NOOP); /* pad to quadword */ - blendctl = I830GetBlendCntl(op, pMaskPicture, pDstPicture->format); + blendctl = i830_get_blend_cntl(op, pMaskPicture, pDstPicture->format); OUT_RING(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(8) | 0); OUT_RING(S8_ENABLE_COLOR_BLEND | S8_BLENDFUNC_ADD |(blendctl<<4) | - S8_ENABLE_COLOR_BUFFER_WRITE); + S8_ENABLE_COLOR_BUFFER_WRITE); ADVANCE_LP_RING(); } #ifdef I830DEBUG - Error("try to sync to show any errors..."); - I830Sync(pScrn); + Error("try to sync to show any errors..."); + I830Sync(pScrn); #endif return TRUE; @@ -499,8 +506,8 @@ I830EXAPrepareComposite(int op, PicturePtr pSrcPicture, * This function is shared between i830 and i915 generation code. */ void -IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, - int dstX, int dstY, int w, int h) +i830_composite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, + int dstX, int dstY, int w, int h) { ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); @@ -533,7 +540,7 @@ IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, } { - int vertex_count; + int vertex_count; if (has_mask) vertex_count = 3*6; @@ -555,8 +562,8 @@ IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, OUT_RING_F(src_x[0] / pI830->scale_units[0][0]); OUT_RING_F(src_y[0] / pI830->scale_units[0][1]); if (has_mask) { - OUT_RING_F(mask_x[0] / pI830->scale_units[1][0]); - OUT_RING_F(mask_y[0] / pI830->scale_units[1][1]); + OUT_RING_F(mask_x[0] / pI830->scale_units[1][0]); + OUT_RING_F(mask_y[0] / pI830->scale_units[1][1]); } OUT_RING_F(dstX); @@ -564,8 +571,8 @@ IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, OUT_RING_F(src_x[1] / pI830->scale_units[0][0]); OUT_RING_F(src_y[1] / pI830->scale_units[0][1]); if (has_mask) { - OUT_RING_F(mask_x[1] / pI830->scale_units[1][0]); - OUT_RING_F(mask_y[1] / pI830->scale_units[1][1]); + OUT_RING_F(mask_x[1] / pI830->scale_units[1][0]); + OUT_RING_F(mask_y[1] / pI830->scale_units[1][1]); } OUT_RING_F(dstX + w); @@ -573,15 +580,20 @@ IntelEXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, OUT_RING_F(src_x[2] / pI830->scale_units[0][0]); OUT_RING_F(src_y[2] / pI830->scale_units[0][1]); if (has_mask) { - OUT_RING_F(mask_x[2] / pI830->scale_units[1][0]); - OUT_RING_F(mask_y[2] / pI830->scale_units[1][1]); + OUT_RING_F(mask_x[2] / pI830->scale_units[1][0]); + OUT_RING_F(mask_y[2] / pI830->scale_units[1][1]); } ADVANCE_LP_RING(); } } +/** + * Do any cleanup from the Composite operation. + * + * This is shared between i830 through i965. + */ void -IntelEXADoneComposite(PixmapPtr pDst) +i830_done_composite(PixmapPtr pDst) { #if ALWAYS_SYNC ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; diff --git a/src/i830_xaa.c b/src/i830_xaa.c index 96b23fa6..dbe1521c 100644 --- a/src/i830_xaa.c +++ b/src/i830_xaa.c @@ -240,26 +240,25 @@ I830XAAInit(ScreenPtr pScreen) return FALSE; if (ps != NULL) { - if (IS_I915G(pI830) || IS_I915GM(pI830) || - IS_I945G(pI830) || IS_I945GM(pI830)) + if (IS_I865G(pI830) || IS_I855(pI830) || + IS_845G(pI830) || IS_I830(pI830)) { - pI830->xaa_check_composite = I915EXACheckComposite; - pI830->xaa_prepare_composite = I915EXAPrepareComposite; - pI830->xaa_composite = IntelEXAComposite; - pI830->xaa_done_composite = IntelEXADoneComposite; - } else if (IS_I865G(pI830) || IS_I855(pI830) || - IS_845G(pI830) || IS_I830(pI830)) { - pI830->xaa_check_composite = I830EXACheckComposite; - pI830->xaa_prepare_composite = I830EXAPrepareComposite; - pI830->xaa_composite = IntelEXAComposite; - pI830->xaa_done_composite = IntelEXADoneComposite; - } else if (IS_I965G(pI830)) { - pI830->xaa_check_composite = I965EXACheckComposite; - pI830->xaa_prepare_composite = I965EXAPrepareComposite; - pI830->xaa_composite = I965EXAComposite; - pI830->xaa_done_composite = IntelEXADoneComposite; + pI830->EXADriverPtr->CheckComposite = i830_check_composite; + pI830->EXADriverPtr->PrepareComposite = i830_prepare_composite; + pI830->EXADriverPtr->Composite = i830_composite; + pI830->EXADriverPtr->DoneComposite = i830_done_composite; + } else if (IS_I915G(pI830) || IS_I915GM(pI830) || + IS_I945G(pI830) || IS_I945GM(pI830)) + { + pI830->EXADriverPtr->CheckComposite = i915_check_composite; + pI830->EXADriverPtr->PrepareComposite = i915_prepare_composite; + pI830->EXADriverPtr->Composite = i830_composite; + pI830->EXADriverPtr->DoneComposite = i830_done_composite; } else { - return TRUE; + pI830->EXADriverPtr->CheckComposite = i965_check_composite; + pI830->EXADriverPtr->PrepareComposite = i965_prepare_composite; + pI830->EXADriverPtr->Composite = i965_composite; + pI830->EXADriverPtr->DoneComposite = i830_done_composite; } pI830->saved_composite = ps->Composite; diff --git a/src/i915_render.c b/src/i915_render.c index 2fb41ad1..4d422428 100644 --- a/src/i915_render.c +++ b/src/i915_render.c @@ -64,7 +64,7 @@ struct blendinfo { CARD32 dst_blend; }; -static struct blendinfo I915BlendOp[] = { +static struct blendinfo i915_blend_op[] = { /* Clear */ {0, 0, BLENDFACT_ZERO, BLENDFACT_ZERO}, /* Src */ @@ -93,42 +93,42 @@ static struct blendinfo I915BlendOp[] = { {0, 0, BLENDFACT_ONE, BLENDFACT_ONE}, }; -static struct formatinfo I915TexFormats[] = { - {PICT_a8r8g8b8, MAPSURF_32BIT | MT_32BIT_ARGB8888 }, - {PICT_x8r8g8b8, MAPSURF_32BIT | MT_32BIT_XRGB8888 }, - {PICT_a8b8g8r8, MAPSURF_32BIT | MT_32BIT_ABGR8888 }, - {PICT_x8b8g8r8, MAPSURF_32BIT | MT_32BIT_XBGR8888 }, - {PICT_r5g6b5, MAPSURF_16BIT | MT_16BIT_RGB565 }, - {PICT_a1r5g5b5, MAPSURF_16BIT | MT_16BIT_ARGB1555 }, - {PICT_x1r5g5b5, MAPSURF_16BIT | MT_16BIT_ARGB1555 }, - {PICT_a4r4g4b4, MAPSURF_16BIT | MT_16BIT_ARGB4444 }, - {PICT_x4r4g4b4, MAPSURF_16BIT | MT_16BIT_ARGB4444 }, - {PICT_a8, MAPSURF_8BIT | MT_8BIT_A8 }, +static struct formatinfo i915_tex_formats[] = { + {PICT_a8r8g8b8, MAPSURF_32BIT | MT_32BIT_ARGB8888 }, + {PICT_x8r8g8b8, MAPSURF_32BIT | MT_32BIT_XRGB8888 }, + {PICT_a8b8g8r8, MAPSURF_32BIT | MT_32BIT_ABGR8888 }, + {PICT_x8b8g8r8, MAPSURF_32BIT | MT_32BIT_XBGR8888 }, + {PICT_r5g6b5, MAPSURF_16BIT | MT_16BIT_RGB565 }, + {PICT_a1r5g5b5, MAPSURF_16BIT | MT_16BIT_ARGB1555 }, + {PICT_x1r5g5b5, MAPSURF_16BIT | MT_16BIT_ARGB1555 }, + {PICT_a4r4g4b4, MAPSURF_16BIT | MT_16BIT_ARGB4444 }, + {PICT_x4r4g4b4, MAPSURF_16BIT | MT_16BIT_ARGB4444 }, + {PICT_a8, MAPSURF_8BIT | MT_8BIT_A8 }, }; -static CARD32 I915GetBlendCntl(int op, PicturePtr pMask, CARD32 dst_format) +static CARD32 i915_get_blend_cntl(int op, PicturePtr pMask, CARD32 dst_format) { CARD32 sblend, dblend; - sblend = I915BlendOp[op].src_blend; - dblend = I915BlendOp[op].dst_blend; + sblend = i915_blend_op[op].src_blend; + dblend = i915_blend_op[op].dst_blend; /* If there's no dst alpha channel, adjust the blend op so that we'll treat * it as always 1. */ - if (PICT_FORMAT_A(dst_format) == 0 && I915BlendOp[op].dst_alpha) { + if (PICT_FORMAT_A(dst_format) == 0 && i915_blend_op[op].dst_alpha) { if (sblend == BLENDFACT_DST_ALPHA) sblend = BLENDFACT_ONE; else if (sblend == BLENDFACT_INV_DST_ALPHA) sblend = BLENDFACT_ZERO; } - /* If the source alpha is being used, then we should only be in a case where - * the source blend factor is 0, and the source blend value is the mask - * channels multiplied by the source picture's alpha. + /* If the source alpha is being used, then we should only be in a case + * where the source blend factor is 0, and the source blend value is the + * mask channels multiplied by the source picture's alpha. */ if (pMask && pMask->componentAlpha && PICT_FORMAT_RGB(pMask->format) && - I915BlendOp[op].src_alpha) + i915_blend_op[op].src_alpha) { if (dblend == BLENDFACT_SRC_ALPHA) { dblend = BLENDFACT_SRC_COLR; @@ -141,7 +141,7 @@ static CARD32 I915GetBlendCntl(int op, PicturePtr pMask, CARD32 dst_format) (dblend << S6_CBUF_DST_BLEND_FACT_SHIFT); } -static Bool I915GetDestFormat(PicturePtr pDstPicture, CARD32 *dst_format) +static Bool i915_get_dest_format(PicturePtr pDstPicture, CARD32 *dst_format) { switch (pDstPicture->format) { case PICT_a8r8g8b8: @@ -171,13 +171,13 @@ static Bool I915GetDestFormat(PicturePtr pDstPicture, CARD32 *dst_format) break; default: I830FALLBACK("Unsupported dest format 0x%x\n", - (int)pDstPicture->format); + (int)pDstPicture->format); } return TRUE; } -static Bool I915CheckCompositeTexture(PicturePtr pPict, int unit) +static Bool i915_check_composite_texture(PicturePtr pPict, int unit) { int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; @@ -186,14 +186,15 @@ static Bool I915CheckCompositeTexture(PicturePtr pPict, int unit) if ((w > 0x7ff) || (h > 0x7ff)) I830FALLBACK("Picture w/h too large (%dx%d)\n", w, h); - for (i = 0; i < sizeof(I915TexFormats) / sizeof(I915TexFormats[0]); i++) + for (i = 0; i < sizeof(i915_tex_formats) / sizeof(i915_tex_formats[0]); + i++) { - if (I915TexFormats[i].fmt == pPict->format) + if (i915_tex_formats[i].fmt == pPict->format) break; } - if (i == sizeof(I915TexFormats) / sizeof(I915TexFormats[0])) + if (i == sizeof(i915_tex_formats) / sizeof(i915_tex_formats[0])) I830FALLBACK("Unsupported picture format 0x%x\n", - (int)pPict->format); + (int)pPict->format); if (pPict->repeat && pPict->repeatType != RepeatNormal) I830FALLBACK("extended repeat (%d) not supported\n", @@ -207,13 +208,13 @@ static Bool I915CheckCompositeTexture(PicturePtr pPict, int unit) } Bool -I915EXACheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, - PicturePtr pDstPicture) +i915_check_composite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, + PicturePtr pDstPicture) { CARD32 tmp1; /* Check for unsupported compositing operations. */ - if (op >= sizeof(I915BlendOp) / sizeof(I915BlendOp[0])) + if (op >= sizeof(i915_blend_op) / sizeof(i915_blend_op[0])) I830FALLBACK("Unsupported Composite op 0x%x\n", op); if (pMaskPicture != NULL && pMaskPicture->componentAlpha && PICT_FORMAT_RGB(pMaskPicture->format)) @@ -222,25 +223,25 @@ I915EXACheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, * the source value. We can only get one of those into the single * source value that we get to blend with. */ - if (I915BlendOp[op].src_alpha && - (I915BlendOp[op].src_blend != BLENDFACT_ZERO)) + if (i915_blend_op[op].src_alpha && + (i915_blend_op[op].src_blend != BLENDFACT_ZERO)) I830FALLBACK("Component alpha not supported with source " - "alpha and source value blending.\n"); + "alpha and source value blending.\n"); } - if (!I915CheckCompositeTexture(pSrcPicture, 0)) + if (!i915_check_composite_texture(pSrcPicture, 0)) I830FALLBACK("Check Src picture texture\n"); - if (pMaskPicture != NULL && !I915CheckCompositeTexture(pMaskPicture, 1)) + if (pMaskPicture != NULL && !i915_check_composite_texture(pMaskPicture, 1)) I830FALLBACK("Check Mask picture texture\n"); - if (!I915GetDestFormat(pDstPicture, &tmp1)) + if (!i915_get_dest_format(pDstPicture, &tmp1)) I830FALLBACK("Get Color buffer format\n"); return TRUE; } static Bool -I915TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) +i915_texture_setup(PicturePtr pPict, PixmapPtr pPix, int unit) { ScrnInfoPtr pScrn = xf86Screens[pPict->pDrawable->pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); @@ -255,13 +256,15 @@ I915TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) pI830->scale_units[unit][0] = pPix->drawable.width; pI830->scale_units[unit][1] = pPix->drawable.height; - for (i = 0; i < sizeof(I915TexFormats) / sizeof(I915TexFormats[0]); i++) { - if (I915TexFormats[i].fmt == pPict->format) + for (i = 0; i < sizeof(i915_tex_formats) / sizeof(i915_tex_formats[0]); + i++) + { + if (i915_tex_formats[i].fmt == pPict->format) break; } - if (i == sizeof(I915TexFormats)/ sizeof(I915TexFormats[0])) + if (i == sizeof(i915_tex_formats)/ sizeof(i915_tex_formats[0])) I830FALLBACK("unknown texture format\n"); - format = I915TexFormats[i].card_fmt; + format = i915_tex_formats[i].card_fmt; if (pPict->repeat) wrap_mode = TEXCOORDMODE_WRAP; @@ -269,11 +272,11 @@ I915TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) switch (pPict->filter) { case PictFilterNearest: filter = (FILTER_NEAREST << SS2_MAG_FILTER_SHIFT) | - (FILTER_NEAREST << SS2_MIN_FILTER_SHIFT); + (FILTER_NEAREST << SS2_MIN_FILTER_SHIFT); break; case PictFilterBilinear: filter = (FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) | - (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT); + (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT); break; default: filter = 0; @@ -288,7 +291,8 @@ I915TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) pI830->samplerstate[unit * 3 + 1] |= MS3_USE_FENCE_REGS; pI830->mapstate[unit * 3 + 2] = ((pitch / 4) - 1) << MS4_PITCH_SHIFT; - pI830->samplerstate[unit * 3 + 0] = (MIPFILTER_NONE << SS2_MIP_FILTER_SHIFT); + pI830->samplerstate[unit * 3 + 0] = (MIPFILTER_NONE << + SS2_MIP_FILTER_SHIFT); pI830->samplerstate[unit * 3 + 0] |= filter; pI830->samplerstate[unit * 3 + 1] = SS3_NORMALIZED_COORDS; pI830->samplerstate[unit * 3 + 1] |= wrap_mode << SS3_TCX_ADDR_MODE_SHIFT; @@ -302,9 +306,9 @@ I915TextureSetup(PicturePtr pPict, PixmapPtr pPix, int unit) } Bool -I915EXAPrepareComposite(int op, PicturePtr pSrcPicture, - PicturePtr pMaskPicture, PicturePtr pDstPicture, - PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) +i915_prepare_composite(int op, PicturePtr pSrcPicture, + PicturePtr pMaskPicture, PicturePtr pDstPicture, + PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) { ScrnInfoPtr pScrn = xf86Screens[pSrcPicture->pDrawable->pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); @@ -317,16 +321,16 @@ I915EXAPrepareComposite(int op, PicturePtr pSrcPicture, pI830->last_3d = LAST_3D_RENDER; - I915GetDestFormat(pDstPicture, &dst_format); + i915_get_dest_format(pDstPicture, &dst_format); dst_offset = intel_get_pixmap_offset(pDst); dst_pitch = intel_get_pixmap_pitch(pDst); FS_LOCALS(20); - if (!I915TextureSetup(pSrcPicture, pSrc, 0)) + if (!i915_texture_setup(pSrcPicture, pSrc, 0)) I830FALLBACK("fail to setup src texture\n"); if (pMask != NULL) { - if (!I915TextureSetup(pMaskPicture, pMask, 1)) - I830FALLBACK("fail to setup mask texture\n"); + if (!i915_texture_setup(pMaskPicture, pMask, 1)) + I830FALLBACK("fail to setup mask texture\n"); } else { pI830->transform[1] = NULL; pI830->scale_units[1][0] = -1; @@ -399,7 +403,7 @@ I915EXAPrepareComposite(int op, PicturePtr pSrcPicture, OUT_RING(ss2); OUT_RING((1 << S4_POINT_WIDTH_SHIFT) | S4_LINE_WIDTH_ONE | S4_CULLMODE_NONE| S4_VFMT_XY); - blendctl = I915GetBlendCntl(op, pMaskPicture, pDstPicture->format); + blendctl = i915_get_blend_cntl(op, pMaskPicture, pDstPicture->format); OUT_RING(0x00000000); /* Disable stencil buffer */ OUT_RING(S6_CBUF_BLEND_ENABLE | S6_COLOR_WRITE_ENABLE | (BLENDFUNC_ADD << S6_CBUF_BLEND_FUNC_SHIFT) | blendctl); @@ -459,7 +463,7 @@ I915EXAPrepareComposite(int op, PicturePtr pSrcPicture, if (pMaskPicture->componentAlpha && PICT_FORMAT_RGB(pMaskPicture->format)) { - if (I915BlendOp[op].src_alpha) { + if (i915_blend_op[op].src_alpha) { i915_fs_mul(FS_OC, i915_fs_operand(FS_R0, W, W, W, W), i915_fs_operand_reg(FS_R1)); } else { diff --git a/src/i965_render.c b/src/i965_render.c index 99bd6284..5ff174da 100644 --- a/src/i965_render.c +++ b/src/i965_render.c @@ -52,12 +52,9 @@ do { \ #define I830FALLBACK(s, arg...) \ do { \ return FALSE; \ -} while(0) +} while(0) #endif -static void I965GetBlendCntl(int op, PicturePtr pMask, CARD32 dst_format, - CARD32 *sblend, CARD32 *dblend); - struct blendinfo { Bool dst_alpha; Bool src_alpha; @@ -73,7 +70,7 @@ struct formatinfo { // refer vol2, 3d rasterization 3.8.1 /* defined in brw_defines.h */ -static struct blendinfo I965BlendOp[] = { +static struct blendinfo i965_blend_op[] = { /* Clear */ {0, 0, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_ZERO}, /* Src */ @@ -102,28 +99,30 @@ static struct blendinfo I965BlendOp[] = { {0, 0, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_ONE}, }; -/* FIXME: surface format defined in brw_defines.h, shared Sampling engine 1.7.2*/ -static struct formatinfo I965TexFormats[] = { - {PICT_a8r8g8b8, BRW_SURFACEFORMAT_B8G8R8A8_UNORM }, - {PICT_x8r8g8b8, BRW_SURFACEFORMAT_B8G8R8X8_UNORM }, - {PICT_a8b8g8r8, BRW_SURFACEFORMAT_R8G8B8A8_UNORM }, - {PICT_x8b8g8r8, BRW_SURFACEFORMAT_R8G8B8X8_UNORM }, - {PICT_r5g6b5, BRW_SURFACEFORMAT_B5G6R5_UNORM }, - {PICT_a1r5g5b5, BRW_SURFACEFORMAT_B5G5R5A1_UNORM }, - {PICT_a8, BRW_SURFACEFORMAT_A8_UNORM }, +/* FIXME: surface format defined in brw_defines.h, shared Sampling engine + * 1.7.2 + */ +static struct formatinfo i965_tex_formats[] = { + {PICT_a8r8g8b8, BRW_SURFACEFORMAT_B8G8R8A8_UNORM }, + {PICT_x8r8g8b8, BRW_SURFACEFORMAT_B8G8R8X8_UNORM }, + {PICT_a8b8g8r8, BRW_SURFACEFORMAT_R8G8B8A8_UNORM }, + {PICT_x8b8g8r8, BRW_SURFACEFORMAT_R8G8B8X8_UNORM }, + {PICT_r5g6b5, BRW_SURFACEFORMAT_B5G6R5_UNORM }, + {PICT_a1r5g5b5, BRW_SURFACEFORMAT_B5G5R5A1_UNORM }, + {PICT_a8, BRW_SURFACEFORMAT_A8_UNORM }, }; -static void I965GetBlendCntl(int op, PicturePtr pMask, CARD32 dst_format, - CARD32 *sblend, CARD32 *dblend) +static void i965_get_blend_cntl(int op, PicturePtr pMask, CARD32 dst_format, + CARD32 *sblend, CARD32 *dblend) { - *sblend = I965BlendOp[op].src_blend; - *dblend = I965BlendOp[op].dst_blend; + *sblend = i965_blend_op[op].src_blend; + *dblend = i965_blend_op[op].dst_blend; /* If there's no dst alpha channel, adjust the blend op so that we'll treat * it as always 1. */ - if (PICT_FORMAT_A(dst_format) == 0 && I965BlendOp[op].dst_alpha) { + if (PICT_FORMAT_A(dst_format) == 0 && i965_blend_op[op].dst_alpha) { if (*sblend == BRW_BLENDFACTOR_DST_ALPHA) *sblend = BRW_BLENDFACTOR_ONE; else if (*sblend == BRW_BLENDFACTOR_INV_DST_ALPHA) @@ -134,7 +133,7 @@ static void I965GetBlendCntl(int op, PicturePtr pMask, CARD32 dst_format, * the source blend factor is 0, and the source blend value is the mask * channels multiplied by the source picture's alpha. */ - if (pMask && pMask->componentAlpha && I965BlendOp[op].src_alpha) { + if (pMask && pMask->componentAlpha && i965_blend_op[op].src_alpha) { if (*dblend == BRW_BLENDFACTOR_SRC_ALPHA) { *dblend = BRW_BLENDFACTOR_SRC_COLOR; } else if (*dblend == BRW_BLENDFACTOR_INV_SRC_ALPHA) { @@ -144,7 +143,7 @@ static void I965GetBlendCntl(int op, PicturePtr pMask, CARD32 dst_format, } -static Bool I965GetDestFormat(PicturePtr pDstPicture, CARD32 *dst_format) +static Bool i965_get_dest_format(PicturePtr pDstPicture, CARD32 *dst_format) { switch (pDstPicture->format) { case PICT_a8r8g8b8: @@ -172,33 +171,34 @@ static Bool I965GetDestFormat(PicturePtr pDstPicture, CARD32 *dst_format) */ case PICT_a4r4g4b4: case PICT_x4r4g4b4: - *dst_format = BRW_SURFACEFORMAT_B4G4R4A4_UNORM; + *dst_format = BRW_SURFACEFORMAT_B4G4R4A4_UNORM; break; default: I830FALLBACK("Unsupported dest format 0x%x\n", - (int)pDstPicture->format); + (int)pDstPicture->format); } return TRUE; } -static Bool I965CheckCompositeTexture(PicturePtr pPict, int unit) +static Bool i965_check_composite_texture(PicturePtr pPict, int unit) { int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; int i; - + if ((w > 0x7ff) || (h > 0x7ff)) I830FALLBACK("Picture w/h too large (%dx%d)\n", w, h); - for (i = 0; i < sizeof(I965TexFormats) / sizeof(I965TexFormats[0]); i++) + for (i = 0; i < sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]); + i++) { - if (I965TexFormats[i].fmt == pPict->format) + if (i965_tex_formats[i].fmt == pPict->format) break; } - if (i == sizeof(I965TexFormats) / sizeof(I965TexFormats[0])) + if (i == sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0])) I830FALLBACK("Unsupported picture format 0x%x\n", - (int)pPict->format); + (int)pPict->format); if (pPict->repeat && pPict->repeatType != RepeatNormal) I830FALLBACK("extended repeat (%d) not supported\n", @@ -206,19 +206,21 @@ static Bool I965CheckCompositeTexture(PicturePtr pPict, int unit) if (pPict->filter != PictFilterNearest && pPict->filter != PictFilterBilinear) + { I830FALLBACK("Unsupported filter 0x%x\n", pPict->filter); + } return TRUE; } Bool -I965EXACheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, - PicturePtr pDstPicture) +i965_check_composite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, + PicturePtr pDstPicture) { CARD32 tmp1; - + /* Check for unsupported compositing operations. */ - if (op >= sizeof(I965BlendOp) / sizeof(I965BlendOp[0])) + if (op >= sizeof(i965_blend_op) / sizeof(i965_blend_op[0])) I830FALLBACK("Unsupported Composite op 0x%x\n", op); if (pMaskPicture != NULL && pMaskPicture->componentAlpha) { @@ -226,20 +228,22 @@ I965EXACheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, * the source value. We can only get one of those into the single * source value that we get to blend with. */ - if (I965BlendOp[op].src_alpha && - (I965BlendOp[op].src_blend != BRW_BLENDFACTOR_ZERO)) - I830FALLBACK("Component alpha not supported with source " - "alpha and source value blending.\n"); + if (i965_blend_op[op].src_alpha && + (i965_blend_op[op].src_blend != BRW_BLENDFACTOR_ZERO)) + { + I830FALLBACK("Component alpha not supported with source " + "alpha and source value blending.\n"); + } /* XXX: fallback now for mask with componentAlpha */ I830FALLBACK("mask componentAlpha not ready.\n"); } - if (!I965CheckCompositeTexture(pSrcPicture, 0)) + if (!i965_check_composite_texture(pSrcPicture, 0)) I830FALLBACK("Check Src picture texture\n"); - if (pMaskPicture != NULL && !I965CheckCompositeTexture(pMaskPicture, 1)) + if (pMaskPicture != NULL && !i965_check_composite_texture(pMaskPicture, 1)) I830FALLBACK("Check Mask picture texture\n"); - if (!I965GetDestFormat(pDstPicture, &tmp1)) + if (!i965_get_dest_format(pDstPicture, &tmp1)) I830FALLBACK("Get Color buffer format\n"); return TRUE; @@ -260,7 +264,7 @@ static struct brw_surface_state *dest_surf_state; static struct brw_surface_state *src_surf_state; static struct brw_surface_state *mask_surf_state; static struct brw_sampler_state *src_sampler_state; -static struct brw_sampler_state *mask_sampler_state; +static struct brw_sampler_state *mask_sampler_state; static struct brw_sampler_default_color *default_color_state; static struct brw_vs_unit_state *vs_state; @@ -274,7 +278,7 @@ static struct brw_instruction *ps_kernel; static struct brw_instruction *sip_kernel; static CARD32 *binding_table; -static int binding_table_entries; +static int binding_table_entries; static int dest_surf_offset, src_surf_offset, mask_surf_offset; static int src_sampler_offset, mask_sampler_offset,vs_offset; @@ -282,12 +286,12 @@ static int sf_offset, wm_offset, cc_offset, vb_offset, cc_viewport_offset; static int sf_kernel_offset, ps_kernel_offset, sip_kernel_offset; static int wm_scratch_offset; static int binding_table_offset; -static int default_color_offset; +static int default_color_offset; static int next_offset, total_state_size; static char *state_base; static int state_base_offset; static float *vb; -static int vb_size = (4 * 4) * 4 ; /* 4 DWORDS per vertex*/ +static int vb_size = (4 * 4) * 4 ; /* 4 DWORDS per vertex*/ static CARD32 src_blend, dst_blend; @@ -348,20 +352,23 @@ static const CARD32 ps_kernel_static_masknoca [][4] = { #include "exa_wm_masknoca_prog.h" }; -static CARD32 i965_get_card_format(PicturePtr pPict) +static CARD32 i965_get_card_format(PicturePtr pPict) { - int i; - for (i = 0; i < sizeof(I965TexFormats) / sizeof(I965TexFormats[0]); i++) { - if (I965TexFormats[i].fmt == pPict->format) - break; - } - return I965TexFormats[i].card_fmt; + int i; + + for (i = 0; i < sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]); + i++) + { + if (i965_tex_formats[i].fmt == pPict->format) + break; + } + return i965_tex_formats[i].card_fmt; } Bool -I965EXAPrepareComposite(int op, PicturePtr pSrcPicture, - PicturePtr pMaskPicture, PicturePtr pDstPicture, - PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) +i965_prepare_composite(int op, PicturePtr pSrcPicture, + PicturePtr pMaskPicture, PicturePtr pDstPicture, + PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) { ScrnInfoPtr pScrn = xf86Screens[pSrcPicture->pDrawable->pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); @@ -402,235 +409,241 @@ I965EXAPrepareComposite(int op, PicturePtr pSrcPicture, pI830->scale_units[1][1] = pMask->drawable.height; } - /* setup 3d pipeline state */ + /* setup 3d pipeline state */ - binding_table_entries = 2; /* default no mask */ + binding_table_entries = 2; /* default no mask */ - /* Wait for sync before we start setting up our new state */ - i830WaitSync(pScrn); + /* Wait for sync before we start setting up our new state */ + i830WaitSync(pScrn); - /* Set up our layout of state in framebuffer. First the general state: */ - next_offset = 0; - vs_offset = ALIGN(next_offset, 64); - next_offset = vs_offset + sizeof(*vs_state); - - sf_offset = ALIGN(next_offset, 32); - next_offset = sf_offset + sizeof(*sf_state); - - wm_offset = ALIGN(next_offset, 32); - next_offset = wm_offset + sizeof(*wm_state); - - wm_scratch_offset = ALIGN(next_offset, 1024); - next_offset = wm_scratch_offset + 1024 * PS_MAX_THREADS; + /* Set up our layout of state in framebuffer. First the general state: */ + next_offset = 0; + vs_offset = ALIGN(next_offset, 64); + next_offset = vs_offset + sizeof(*vs_state); - cc_offset = ALIGN(next_offset, 32); - next_offset = cc_offset + sizeof(*cc_state); + sf_offset = ALIGN(next_offset, 32); + next_offset = sf_offset + sizeof(*sf_state); - /* keep current sf_kernel, which will send one setup urb entry to - PS kernel */ - sf_kernel_offset = ALIGN(next_offset, 64); - if (pMask) - next_offset = sf_kernel_offset + sizeof (sf_kernel_static_mask); - else - next_offset = sf_kernel_offset + sizeof (sf_kernel_static); + wm_offset = ALIGN(next_offset, 32); + next_offset = wm_offset + sizeof(*wm_state); - //XXX: ps_kernel may be seperated, fix with offset - ps_kernel_offset = ALIGN(next_offset, 64); - if (pMask) { + wm_scratch_offset = ALIGN(next_offset, 1024); + next_offset = wm_scratch_offset + 1024 * PS_MAX_THREADS; + + cc_offset = ALIGN(next_offset, 32); + next_offset = cc_offset + sizeof(*cc_state); + + /* keep current sf_kernel, which will send one setup urb entry to + * PS kernel + */ + sf_kernel_offset = ALIGN(next_offset, 64); + if (pMask) + next_offset = sf_kernel_offset + sizeof (sf_kernel_static_mask); + else + next_offset = sf_kernel_offset + sizeof (sf_kernel_static); + + /* XXX: ps_kernel may be seperated, fix with offset */ + ps_kernel_offset = ALIGN(next_offset, 64); + if (pMask) { if (pMaskPicture->componentAlpha) next_offset = ps_kernel_offset + sizeof(ps_kernel_static_maskca); - else + else next_offset = ps_kernel_offset + sizeof(ps_kernel_static_masknoca); - } else + } else { next_offset = ps_kernel_offset + sizeof (ps_kernel_static_nomask); - - sip_kernel_offset = ALIGN(next_offset, 64); - next_offset = sip_kernel_offset + sizeof (sip_kernel_static); - - // needed? - cc_viewport_offset = ALIGN(next_offset, 32); - next_offset = cc_viewport_offset + sizeof(*cc_viewport); + } - // for texture sampler - src_sampler_offset = ALIGN(next_offset, 32); - next_offset = src_sampler_offset + sizeof(*src_sampler_state); + sip_kernel_offset = ALIGN(next_offset, 64); + next_offset = sip_kernel_offset + sizeof (sip_kernel_static); - if (pMask) { + /* needed? */ + cc_viewport_offset = ALIGN(next_offset, 32); + next_offset = cc_viewport_offset + sizeof(*cc_viewport); + + /* for texture sampler */ + src_sampler_offset = ALIGN(next_offset, 32); + next_offset = src_sampler_offset + sizeof(*src_sampler_state); + + if (pMask) { mask_sampler_offset = ALIGN(next_offset, 32); next_offset = mask_sampler_offset + sizeof(*mask_sampler_state); - } - /* Align VB to native size of elements, for safety */ - vb_offset = ALIGN(next_offset, 8); - next_offset = vb_offset + vb_size; + } + /* Align VB to native size of elements, for safety */ + vb_offset = ALIGN(next_offset, 8); + next_offset = vb_offset + vb_size; - /* And then the general state: */ - dest_surf_offset = ALIGN(next_offset, 32); - next_offset = dest_surf_offset + sizeof(*dest_surf_state); + /* And then the general state: */ + dest_surf_offset = ALIGN(next_offset, 32); + next_offset = dest_surf_offset + sizeof(*dest_surf_state); - src_surf_offset = ALIGN(next_offset, 32); - next_offset = src_surf_offset + sizeof(*src_surf_state); + src_surf_offset = ALIGN(next_offset, 32); + next_offset = src_surf_offset + sizeof(*src_surf_state); - if (pMask) { + if (pMask) { mask_surf_offset = ALIGN(next_offset, 32); next_offset = mask_surf_offset + sizeof(*mask_surf_state); binding_table_entries = 3; - } + } - binding_table_offset = ALIGN(next_offset, 32); - next_offset = binding_table_offset + (binding_table_entries * 4); + binding_table_offset = ALIGN(next_offset, 32); + next_offset = binding_table_offset + (binding_table_entries * 4); - default_color_offset = ALIGN(next_offset, 32); - next_offset = default_color_offset + sizeof(*default_color_state); + default_color_offset = ALIGN(next_offset, 32); + next_offset = default_color_offset + sizeof(*default_color_state); - total_state_size = next_offset; - assert(total_state_size < EXA_LINEAR_EXTRA); + total_state_size = next_offset; + assert(total_state_size < EXA_LINEAR_EXTRA); - state_base_offset = pI830->EXAStateMem.Start; - state_base_offset = ALIGN(state_base_offset, 64); - state_base = (char *)(pI830->FbBase + state_base_offset); + state_base_offset = pI830->EXAStateMem.Start; + state_base_offset = ALIGN(state_base_offset, 64); + state_base = (char *)(pI830->FbBase + state_base_offset); - vs_state = (void *)(state_base + vs_offset); - sf_state = (void *)(state_base + sf_offset); - wm_state = (void *)(state_base + wm_offset); - cc_state = (void *)(state_base + cc_offset); - sf_kernel = (void *)(state_base + sf_kernel_offset); - ps_kernel = (void *)(state_base + ps_kernel_offset); - sip_kernel = (void *)(state_base + sip_kernel_offset); - - cc_viewport = (void *)(state_base + cc_viewport_offset); - - dest_surf_state = (void *)(state_base + dest_surf_offset); - src_surf_state = (void *)(state_base + src_surf_offset); - if (pMask) + vs_state = (void *)(state_base + vs_offset); + sf_state = (void *)(state_base + sf_offset); + wm_state = (void *)(state_base + wm_offset); + cc_state = (void *)(state_base + cc_offset); + sf_kernel = (void *)(state_base + sf_kernel_offset); + ps_kernel = (void *)(state_base + ps_kernel_offset); + sip_kernel = (void *)(state_base + sip_kernel_offset); + + cc_viewport = (void *)(state_base + cc_viewport_offset); + + dest_surf_state = (void *)(state_base + dest_surf_offset); + src_surf_state = (void *)(state_base + src_surf_offset); + if (pMask) mask_surf_state = (void *)(state_base + mask_surf_offset); - src_sampler_state = (void *)(state_base + src_sampler_offset); - if (pMask) + src_sampler_state = (void *)(state_base + src_sampler_offset); + if (pMask) mask_sampler_state = (void *)(state_base + mask_sampler_offset); - binding_table = (void *)(state_base + binding_table_offset); + binding_table = (void *)(state_base + binding_table_offset); - vb = (void *)(state_base + vb_offset); + vb = (void *)(state_base + vb_offset); - default_color_state = (void*)(state_base + default_color_offset); + default_color_state = (void*)(state_base + default_color_offset); - /* Set up a default static partitioning of the URB, which is supposed to - * allow anything we would want to do, at potentially lower performance. - */ + /* Set up a default static partitioning of the URB, which is supposed to + * allow anything we would want to do, at potentially lower performance. + */ #define URB_CS_ENTRY_SIZE 0 #define URB_CS_ENTRIES 0 - + #define URB_VS_ENTRY_SIZE 1 // each 512-bit row #define URB_VS_ENTRIES 8 // we needs at least 8 entries - + #define URB_GS_ENTRY_SIZE 0 #define URB_GS_ENTRIES 0 - + #define URB_CLIP_ENTRY_SIZE 0 #define URB_CLIP_ENTRIES 0 - + #define URB_SF_ENTRY_SIZE 2 #define URB_SF_ENTRIES 1 - urb_vs_start = 0; - urb_vs_size = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE; - urb_gs_start = urb_vs_start + urb_vs_size; - urb_gs_size = URB_GS_ENTRIES * URB_GS_ENTRY_SIZE; - urb_clip_start = urb_gs_start + urb_gs_size; - urb_clip_size = URB_CLIP_ENTRIES * URB_CLIP_ENTRY_SIZE; - urb_sf_start = urb_clip_start + urb_clip_size; - urb_sf_size = URB_SF_ENTRIES * URB_SF_ENTRY_SIZE; - urb_cs_start = urb_sf_start + urb_sf_size; - urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE; + urb_vs_start = 0; + urb_vs_size = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE; + urb_gs_start = urb_vs_start + urb_vs_size; + urb_gs_size = URB_GS_ENTRIES * URB_GS_ENTRY_SIZE; + urb_clip_start = urb_gs_start + urb_gs_size; + urb_clip_size = URB_CLIP_ENTRIES * URB_CLIP_ENTRY_SIZE; + urb_sf_start = urb_clip_start + urb_clip_size; + urb_sf_size = URB_SF_ENTRIES * URB_SF_ENTRY_SIZE; + urb_cs_start = urb_sf_start + urb_sf_size; + urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE; - /* We'll be poking the state buffers that could be in use by the 3d hardware - * here, but we should have synced the 3D engine already in I830PutImage. - */ + /* We'll be poking the state buffers that could be in use by the 3d + * hardware here, but we should have synced the 3D engine already in + * I830PutImage. XXX + */ - memset (cc_viewport, 0, sizeof (*cc_viewport)); - cc_viewport->min_depth = -1.e35; - cc_viewport->max_depth = 1.e35; + memset (cc_viewport, 0, sizeof (*cc_viewport)); + cc_viewport->min_depth = -1.e35; + cc_viewport->max_depth = 1.e35; - /* Color calculator state */ - memset(cc_state, 0, sizeof(*cc_state)); - cc_state->cc0.stencil_enable = 0; /* disable stencil */ - cc_state->cc2.depth_test = 0; /* disable depth test */ - cc_state->cc2.logicop_enable = 0; /* disable logic op */ - cc_state->cc3.ia_blend_enable = 1; /* blend alpha just like colors */ - cc_state->cc3.blend_enable = 1; /* enable color blend */ - cc_state->cc3.alpha_test = 0; /* disable alpha test */ - cc_state->cc4.cc_viewport_state_offset = (state_base_offset + cc_viewport_offset) >> 5; - cc_state->cc5.dither_enable = 0; /* disable dither */ - cc_state->cc5.logicop_func = 0xc; /* COPY */ - cc_state->cc5.statistics_enable = 1; - cc_state->cc5.ia_blend_function = BRW_BLENDFUNCTION_ADD; - I965GetBlendCntl(op, pMaskPicture, pDstPicture->format, - &src_blend, &dst_blend); - /* XXX: alpha blend factor should be same as color, but check - for CA case in future */ - cc_state->cc5.ia_src_blend_factor = src_blend; - cc_state->cc5.ia_dest_blend_factor = dst_blend; - cc_state->cc6.blend_function = BRW_BLENDFUNCTION_ADD; - cc_state->cc6.src_blend_factor = src_blend; - cc_state->cc6.dest_blend_factor = dst_blend; - cc_state->cc6.clamp_post_alpha_blend = 1; - cc_state->cc6.clamp_pre_alpha_blend = 1; - cc_state->cc6.clamp_range = 0; /* clamp range [0,1] */ + /* Color calculator state */ + memset(cc_state, 0, sizeof(*cc_state)); + cc_state->cc0.stencil_enable = 0; /* disable stencil */ + cc_state->cc2.depth_test = 0; /* disable depth test */ + cc_state->cc2.logicop_enable = 0; /* disable logic op */ + cc_state->cc3.ia_blend_enable = 1; /* blend alpha just like colors */ + cc_state->cc3.blend_enable = 1; /* enable color blend */ + cc_state->cc3.alpha_test = 0; /* disable alpha test */ + cc_state->cc4.cc_viewport_state_offset = (state_base_offset + + cc_viewport_offset) >> 5; + cc_state->cc5.dither_enable = 0; /* disable dither */ + cc_state->cc5.logicop_func = 0xc; /* COPY */ + cc_state->cc5.statistics_enable = 1; + cc_state->cc5.ia_blend_function = BRW_BLENDFUNCTION_ADD; + i965_get_blend_cntl(op, pMaskPicture, pDstPicture->format, + &src_blend, &dst_blend); + /* XXX: alpha blend factor should be same as color, but check + * for CA case in future + */ + cc_state->cc5.ia_src_blend_factor = src_blend; + cc_state->cc5.ia_dest_blend_factor = dst_blend; + cc_state->cc6.blend_function = BRW_BLENDFUNCTION_ADD; + cc_state->cc6.src_blend_factor = src_blend; + cc_state->cc6.dest_blend_factor = dst_blend; + cc_state->cc6.clamp_post_alpha_blend = 1; + cc_state->cc6.clamp_pre_alpha_blend = 1; + cc_state->cc6.clamp_range = 0; /* clamp range [0,1] */ - /* Upload system kernel */ - memcpy (sip_kernel, sip_kernel_static, sizeof (sip_kernel_static)); - - /* Set up the state buffer for the destination surface */ - memset(dest_surf_state, 0, sizeof(*dest_surf_state)); - dest_surf_state->ss0.surface_type = BRW_SURFACE_2D; - dest_surf_state->ss0.data_return_format = BRW_SURFACERETURNFORMAT_FLOAT32; - I965GetDestFormat(pDstPicture, &dst_format); - dest_surf_state->ss0.surface_format = dst_format; + /* Upload system kernel */ + memcpy (sip_kernel, sip_kernel_static, sizeof (sip_kernel_static)); - dest_surf_state->ss0.writedisable_alpha = 0; - dest_surf_state->ss0.writedisable_red = 0; - dest_surf_state->ss0.writedisable_green = 0; - dest_surf_state->ss0.writedisable_blue = 0; - dest_surf_state->ss0.color_blend = 1; - dest_surf_state->ss0.vert_line_stride = 0; - dest_surf_state->ss0.vert_line_stride_ofs = 0; - dest_surf_state->ss0.mipmap_layout_mode = 0; - dest_surf_state->ss0.render_cache_read_mode = 0; - - dest_surf_state->ss1.base_addr = dst_offset; - dest_surf_state->ss2.height = pDst->drawable.height - 1; - dest_surf_state->ss2.width = pDst->drawable.width - 1; - dest_surf_state->ss2.mip_count = 0; - dest_surf_state->ss2.render_target_rotation = 0; - dest_surf_state->ss3.pitch = dst_pitch - 1; + /* Set up the state buffer for the destination surface */ + memset(dest_surf_state, 0, sizeof(*dest_surf_state)); + dest_surf_state->ss0.surface_type = BRW_SURFACE_2D; + dest_surf_state->ss0.data_return_format = BRW_SURFACERETURNFORMAT_FLOAT32; + i965_get_dest_format(pDstPicture, &dst_format); + dest_surf_state->ss0.surface_format = dst_format; - /* Set up the source surface state buffer */ - memset(src_surf_state, 0, sizeof(*src_surf_state)); - src_surf_state->ss0.surface_type = BRW_SURFACE_2D; - src_surf_state->ss0.surface_format = i965_get_card_format(pSrcPicture); + dest_surf_state->ss0.writedisable_alpha = 0; + dest_surf_state->ss0.writedisable_red = 0; + dest_surf_state->ss0.writedisable_green = 0; + dest_surf_state->ss0.writedisable_blue = 0; + dest_surf_state->ss0.color_blend = 1; + dest_surf_state->ss0.vert_line_stride = 0; + dest_surf_state->ss0.vert_line_stride_ofs = 0; + dest_surf_state->ss0.mipmap_layout_mode = 0; + dest_surf_state->ss0.render_cache_read_mode = 0; - src_surf_state->ss0.writedisable_alpha = 0; - src_surf_state->ss0.writedisable_red = 0; - src_surf_state->ss0.writedisable_green = 0; - src_surf_state->ss0.writedisable_blue = 0; - src_surf_state->ss0.color_blend = 1; - src_surf_state->ss0.vert_line_stride = 0; - src_surf_state->ss0.vert_line_stride_ofs = 0; - src_surf_state->ss0.mipmap_layout_mode = 0; - src_surf_state->ss0.render_cache_read_mode = 0; - - src_surf_state->ss1.base_addr = src_offset; - src_surf_state->ss2.width = pSrc->drawable.width - 1; - src_surf_state->ss2.height = pSrc->drawable.height - 1; - src_surf_state->ss2.mip_count = 0; - src_surf_state->ss2.render_target_rotation = 0; - src_surf_state->ss3.pitch = src_pitch - 1; + dest_surf_state->ss1.base_addr = dst_offset; + dest_surf_state->ss2.height = pDst->drawable.height - 1; + dest_surf_state->ss2.width = pDst->drawable.width - 1; + dest_surf_state->ss2.mip_count = 0; + dest_surf_state->ss2.render_target_rotation = 0; + dest_surf_state->ss3.pitch = dst_pitch - 1; - /* setup mask surface */ - if (pMask) { + /* Set up the source surface state buffer */ + memset(src_surf_state, 0, sizeof(*src_surf_state)); + src_surf_state->ss0.surface_type = BRW_SURFACE_2D; + src_surf_state->ss0.surface_format = i965_get_card_format(pSrcPicture); + + src_surf_state->ss0.writedisable_alpha = 0; + src_surf_state->ss0.writedisable_red = 0; + src_surf_state->ss0.writedisable_green = 0; + src_surf_state->ss0.writedisable_blue = 0; + src_surf_state->ss0.color_blend = 1; + src_surf_state->ss0.vert_line_stride = 0; + src_surf_state->ss0.vert_line_stride_ofs = 0; + src_surf_state->ss0.mipmap_layout_mode = 0; + src_surf_state->ss0.render_cache_read_mode = 0; + + src_surf_state->ss1.base_addr = src_offset; + src_surf_state->ss2.width = pSrc->drawable.width - 1; + src_surf_state->ss2.height = pSrc->drawable.height - 1; + src_surf_state->ss2.mip_count = 0; + src_surf_state->ss2.render_target_rotation = 0; + src_surf_state->ss3.pitch = src_pitch - 1; + + /* setup mask surface */ + if (pMask) { memset(mask_surf_state, 0, sizeof(*mask_surf_state)); mask_surf_state->ss0.surface_type = BRW_SURFACE_2D; - mask_surf_state->ss0.surface_format = i965_get_card_format(pMaskPicture); + mask_surf_state->ss0.surface_format = + i965_get_card_format(pMaskPicture); mask_surf_state->ss0.writedisable_alpha = 0; mask_surf_state->ss0.writedisable_red = 0; @@ -641,68 +654,68 @@ I965EXAPrepareComposite(int op, PicturePtr pSrcPicture, mask_surf_state->ss0.vert_line_stride_ofs = 0; mask_surf_state->ss0.mipmap_layout_mode = 0; mask_surf_state->ss0.render_cache_read_mode = 0; - + mask_surf_state->ss1.base_addr = mask_offset; mask_surf_state->ss2.width = pMask->drawable.width - 1; mask_surf_state->ss2.height = pMask->drawable.height - 1; mask_surf_state->ss2.mip_count = 0; mask_surf_state->ss2.render_target_rotation = 0; - mask_surf_state->ss3.pitch = mask_pitch - 1; - } + mask_surf_state->ss3.pitch = mask_pitch - 1; + } - /* Set up a binding table for our surfaces. Only the PS will use it */ - binding_table[0] = state_base_offset + dest_surf_offset; - binding_table[1] = state_base_offset + src_surf_offset; - if (pMask) + /* Set up a binding table for our surfaces. Only the PS will use it */ + binding_table[0] = state_base_offset + dest_surf_offset; + binding_table[1] = state_base_offset + src_surf_offset; + if (pMask) binding_table[2] = state_base_offset + mask_surf_offset; - /* PS kernel use this sampler */ - memset(src_sampler_state, 0, sizeof(*src_sampler_state)); - src_sampler_state->ss0.lod_preclamp = 1; /* GL mode */ - switch(pSrcPicture->filter) { - case PictFilterNearest: - src_sampler_state->ss0.min_filter = BRW_MAPFILTER_NEAREST; + /* PS kernel use this sampler */ + memset(src_sampler_state, 0, sizeof(*src_sampler_state)); + src_sampler_state->ss0.lod_preclamp = 1; /* GL mode */ + switch(pSrcPicture->filter) { + case PictFilterNearest: + src_sampler_state->ss0.min_filter = BRW_MAPFILTER_NEAREST; src_sampler_state->ss0.mag_filter = BRW_MAPFILTER_NEAREST; break; - case PictFilterBilinear: - src_sampler_state->ss0.min_filter = BRW_MAPFILTER_LINEAR; + case PictFilterBilinear: + src_sampler_state->ss0.min_filter = BRW_MAPFILTER_LINEAR; src_sampler_state->ss0.mag_filter = BRW_MAPFILTER_LINEAR; break; - default: + default: I830FALLBACK("Bad filter 0x%x\n", pSrcPicture->filter); - } + } - memset(default_color_state, 0, sizeof(*default_color_state)); - default_color_state->color[0] = 0.0; /* R */ - default_color_state->color[1] = 0.0; /* G */ - default_color_state->color[2] = 0.0; /* B */ - default_color_state->color[3] = 1.0; /* A */ + memset(default_color_state, 0, sizeof(*default_color_state)); + default_color_state->color[0] = 0.0; /* R */ + default_color_state->color[1] = 0.0; /* G */ + default_color_state->color[2] = 0.0; /* B */ + default_color_state->color[3] = 1.0; /* A */ - src_sampler_state->ss0.default_color_mode = 0; /* GL mode */ + src_sampler_state->ss0.default_color_mode = 0; /* GL mode */ - if (!pSrcPicture->repeat) { - src_sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER; + if (!pSrcPicture->repeat) { + src_sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER; src_sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER; src_sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER; - src_sampler_state->ss2.default_color_pointer = - (state_base_offset + default_color_offset) >> 5; - } else { - src_sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_WRAP; + src_sampler_state->ss2.default_color_pointer = + (state_base_offset + default_color_offset) >> 5; + } else { + src_sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_WRAP; src_sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_WRAP; src_sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_WRAP; - } - src_sampler_state->ss3.chroma_key_enable = 0; /* disable chromakey */ + } + src_sampler_state->ss3.chroma_key_enable = 0; /* disable chromakey */ - if (pMask) { + if (pMask) { memset(mask_sampler_state, 0, sizeof(*mask_sampler_state)); mask_sampler_state->ss0.lod_preclamp = 1; /* GL mode */ switch(pMaskPicture->filter) { case PictFilterNearest: - mask_sampler_state->ss0.min_filter = BRW_MAPFILTER_NEAREST; + mask_sampler_state->ss0.min_filter = BRW_MAPFILTER_NEAREST; mask_sampler_state->ss0.mag_filter = BRW_MAPFILTER_NEAREST; break; case PictFilterBilinear: - mask_sampler_state->ss0.min_filter = BRW_MAPFILTER_LINEAR; + mask_sampler_state->ss0.min_filter = BRW_MAPFILTER_LINEAR; mask_sampler_state->ss0.mag_filter = BRW_MAPFILTER_LINEAR; break; default: @@ -710,189 +723,203 @@ I965EXAPrepareComposite(int op, PicturePtr pSrcPicture, } if (!pMaskPicture->repeat) { - mask_sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER; - mask_sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER; - mask_sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER; - mask_sampler_state->ss2.default_color_pointer = - (state_base_offset + default_color_offset)>>5; + mask_sampler_state->ss1.r_wrap_mode = + BRW_TEXCOORDMODE_CLAMP_BORDER; + mask_sampler_state->ss1.s_wrap_mode = + BRW_TEXCOORDMODE_CLAMP_BORDER; + mask_sampler_state->ss1.t_wrap_mode = + BRW_TEXCOORDMODE_CLAMP_BORDER; + mask_sampler_state->ss2.default_color_pointer = + (state_base_offset + default_color_offset)>>5; } else { - mask_sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_WRAP; + mask_sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_WRAP; mask_sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_WRAP; mask_sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_WRAP; } mask_sampler_state->ss3.chroma_key_enable = 0; /* disable chromakey */ - } + } - /* Set up the vertex shader to be disabled (passthrough) */ - memset(vs_state, 0, sizeof(*vs_state)); - vs_state->thread4.nr_urb_entries = URB_VS_ENTRIES; - vs_state->thread4.urb_entry_allocation_size = URB_VS_ENTRY_SIZE - 1; - vs_state->vs6.vs_enable = 0; - vs_state->vs6.vert_cache_disable = 1; + /* Set up the vertex shader to be disabled (passthrough) */ + memset(vs_state, 0, sizeof(*vs_state)); + vs_state->thread4.nr_urb_entries = URB_VS_ENTRIES; + vs_state->thread4.urb_entry_allocation_size = URB_VS_ENTRY_SIZE - 1; + vs_state->vs6.vs_enable = 0; + vs_state->vs6.vert_cache_disable = 1; - // XXX: sf_kernel? keep it as now - /* Set up the SF kernel to do coord interp: for each attribute, - * calculate dA/dx and dA/dy. Hand these interpolation coefficients - * back to SF which then hands pixels off to WM. - */ - if (pMask) - memcpy (sf_kernel, sf_kernel_static_mask, sizeof (sf_kernel_static)); - else - memcpy (sf_kernel, sf_kernel_static, sizeof (sf_kernel_static)); + /* XXX: sf_kernel? keep it as now */ + /* Set up the SF kernel to do coord interp: for each attribute, + * calculate dA/dx and dA/dy. Hand these interpolation coefficients + * back to SF which then hands pixels off to WM. + */ + if (pMask) + memcpy(sf_kernel, sf_kernel_static_mask, sizeof (sf_kernel_static)); + else + memcpy(sf_kernel, sf_kernel_static, sizeof (sf_kernel_static)); - memset(sf_state, 0, sizeof(*sf_state)); - sf_state->thread0.kernel_start_pointer = - (state_base_offset + sf_kernel_offset) >> 6; - sf_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF); - sf_state->sf1.single_program_flow = 1; - sf_state->sf1.binding_table_entry_count = 0; - sf_state->sf1.thread_priority = 0; - sf_state->sf1.floating_point_mode = 0; /* Mesa does this */ - sf_state->sf1.illegal_op_exception_enable = 1; - sf_state->sf1.mask_stack_exception_enable = 1; - sf_state->sf1.sw_exception_enable = 1; - sf_state->thread2.per_thread_scratch_space = 0; - sf_state->thread2.scratch_space_base_pointer = 0; /* not used in our kernel */ - sf_state->thread3.const_urb_entry_read_length = 0; /* no const URBs */ - sf_state->thread3.const_urb_entry_read_offset = 0; /* no const URBs */ - sf_state->thread3.urb_entry_read_length = 1; /* 1 URB per vertex */ - sf_state->thread3.urb_entry_read_offset = 0; - sf_state->thread3.dispatch_grf_start_reg = 3; - sf_state->thread4.max_threads = SF_MAX_THREADS - 1; - sf_state->thread4.urb_entry_allocation_size = URB_SF_ENTRY_SIZE - 1; - sf_state->thread4.nr_urb_entries = URB_SF_ENTRIES; - sf_state->thread4.stats_enable = 1; - sf_state->sf5.viewport_transform = FALSE; /* skip viewport */ - sf_state->sf6.cull_mode = BRW_CULLMODE_NONE; - sf_state->sf6.scissor = 0; - sf_state->sf7.trifan_pv = 2; - sf_state->sf6.dest_org_vbias = 0x8; - sf_state->sf6.dest_org_hbias = 0x8; + memset(sf_state, 0, sizeof(*sf_state)); + sf_state->thread0.kernel_start_pointer = + (state_base_offset + sf_kernel_offset) >> 6; + sf_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF); + sf_state->sf1.single_program_flow = 1; + sf_state->sf1.binding_table_entry_count = 0; + sf_state->sf1.thread_priority = 0; + sf_state->sf1.floating_point_mode = 0; /* Mesa does this */ + sf_state->sf1.illegal_op_exception_enable = 1; + sf_state->sf1.mask_stack_exception_enable = 1; + sf_state->sf1.sw_exception_enable = 1; + sf_state->thread2.per_thread_scratch_space = 0; + /* scratch space is not used in our kernel */ + sf_state->thread2.scratch_space_base_pointer = 0; + sf_state->thread3.const_urb_entry_read_length = 0; /* no const URBs */ + sf_state->thread3.const_urb_entry_read_offset = 0; /* no const URBs */ + sf_state->thread3.urb_entry_read_length = 1; /* 1 URB per vertex */ + sf_state->thread3.urb_entry_read_offset = 0; + sf_state->thread3.dispatch_grf_start_reg = 3; + sf_state->thread4.max_threads = SF_MAX_THREADS - 1; + sf_state->thread4.urb_entry_allocation_size = URB_SF_ENTRY_SIZE - 1; + sf_state->thread4.nr_urb_entries = URB_SF_ENTRIES; + sf_state->thread4.stats_enable = 1; + sf_state->sf5.viewport_transform = FALSE; /* skip viewport */ + sf_state->sf6.cull_mode = BRW_CULLMODE_NONE; + sf_state->sf6.scissor = 0; + sf_state->sf7.trifan_pv = 2; + sf_state->sf6.dest_org_vbias = 0x8; + sf_state->sf6.dest_org_hbias = 0x8; - /* Set up the PS kernel (dispatched by WM) - */ - - if (pMask) { + /* Set up the PS kernel (dispatched by WM) */ + if (pMask) { if (pMaskPicture->componentAlpha) - memcpy (ps_kernel, ps_kernel_static_maskca, sizeof (ps_kernel_static_maskca)); + memcpy(ps_kernel, ps_kernel_static_maskca, + sizeof (ps_kernel_static_maskca)); else - memcpy (ps_kernel, ps_kernel_static_masknoca, sizeof (ps_kernel_static_masknoca)); - } else - memcpy (ps_kernel, ps_kernel_static_nomask, sizeof (ps_kernel_static_nomask)); + memcpy(ps_kernel, ps_kernel_static_masknoca, + sizeof (ps_kernel_static_masknoca)); + } else { + memcpy(ps_kernel, ps_kernel_static_nomask, + sizeof (ps_kernel_static_nomask)); + } - memset (wm_state, 0, sizeof (*wm_state)); - wm_state->thread0.kernel_start_pointer = - (state_base_offset + ps_kernel_offset) >> 6; - wm_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF); - wm_state->thread1.single_program_flow = 1; - if (!pMask) - wm_state->thread1.binding_table_entry_count = 2; /* 1 tex and fb */ - else - wm_state->thread1.binding_table_entry_count = 3; /* 2 tex and fb */ + memset(wm_state, 0, sizeof (*wm_state)); + wm_state->thread0.kernel_start_pointer = + (state_base_offset + ps_kernel_offset) >> 6; + wm_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF); + wm_state->thread1.single_program_flow = 1; + if (!pMask) + wm_state->thread1.binding_table_entry_count = 2; /* 1 tex and fb */ + else + wm_state->thread1.binding_table_entry_count = 3; /* 2 tex and fb */ - wm_state->thread2.scratch_space_base_pointer = (state_base_offset + - wm_scratch_offset)>>10; - wm_state->thread2.per_thread_scratch_space = 0; - // XXX: urb allocation - wm_state->thread3.const_urb_entry_read_length = 0; - wm_state->thread3.const_urb_entry_read_offset = 0; - if (pMask) - wm_state->thread3.urb_entry_read_length = 2; /* two per pair of attrib */ - else - wm_state->thread3.urb_entry_read_length = 1; /* one per pair of attrib */ - wm_state->thread3.urb_entry_read_offset = 0; - // wm kernel use urb from 3, see wm_program in compiler module - wm_state->thread3.dispatch_grf_start_reg = 3; /* must match kernel */ + wm_state->thread2.scratch_space_base_pointer = (state_base_offset + + wm_scratch_offset)>>10; + wm_state->thread2.per_thread_scratch_space = 0; + // XXX: urb allocation + wm_state->thread3.const_urb_entry_read_length = 0; + wm_state->thread3.const_urb_entry_read_offset = 0; + /* Each pair of attributes (src/mask coords) is one URB entry */ + if (pMask) + wm_state->thread3.urb_entry_read_length = 2; + else + wm_state->thread3.urb_entry_read_length = 1; + wm_state->thread3.urb_entry_read_offset = 0; + /* wm kernel use urb from 3, see wm_program in compiler module */ + wm_state->thread3.dispatch_grf_start_reg = 3; /* must match kernel */ - wm_state->wm4.stats_enable = 1; /* statistic */ - wm_state->wm4.sampler_state_pointer = (state_base_offset + src_sampler_offset) >> 5; - wm_state->wm4.sampler_count = 1; /* 1-4 samplers used */ - wm_state->wm5.max_threads = PS_MAX_THREADS - 1; - wm_state->wm5.thread_dispatch_enable = 1; - //just use 16-pixel dispatch (4 subspans), don't need to change kernel start point - wm_state->wm5.enable_16_pix = 1; - wm_state->wm5.enable_8_pix = 0; - wm_state->wm5.early_depth_test = 1; + wm_state->wm4.stats_enable = 1; /* statistic */ + wm_state->wm4.sampler_state_pointer = (state_base_offset + + src_sampler_offset) >> 5; + wm_state->wm4.sampler_count = 1; /* 1-4 samplers used */ + wm_state->wm5.max_threads = PS_MAX_THREADS - 1; + wm_state->wm5.thread_dispatch_enable = 1; + /* just use 16-pixel dispatch (4 subspans), don't need to change kernel + * start point + */ + wm_state->wm5.enable_16_pix = 1; + wm_state->wm5.enable_8_pix = 0; + wm_state->wm5.early_depth_test = 1; - /* Begin the long sequence of commands needed to set up the 3D - * rendering pipe - */ - { + /* Begin the long sequence of commands needed to set up the 3D + * rendering pipe + */ + { BEGIN_LP_RING(2); - OUT_RING(MI_FLUSH | - MI_STATE_INSTRUCTION_CACHE_FLUSH | - BRW_MI_GLOBAL_SNAPSHOT_RESET); + OUT_RING(MI_FLUSH | + MI_STATE_INSTRUCTION_CACHE_FLUSH | + BRW_MI_GLOBAL_SNAPSHOT_RESET); OUT_RING(MI_NOOP); ADVANCE_LP_RING(); - } - { + } + { BEGIN_LP_RING(12); - + /* Match Mesa driver setup */ OUT_RING(BRW_PIPELINE_SELECT | PIPELINE_SELECT_3D); - + OUT_RING(BRW_CS_URB_STATE | 0); OUT_RING((0 << 4) | /* URB Entry Allocation Size */ - (0 << 0)); /* Number of URB Entries */ + (0 << 0)); /* Number of URB Entries */ - /* Zero out the two base address registers so all offsets are absolute */ + /* Zero out the two base address registers so all offsets are + * absolute. + */ OUT_RING(BRW_STATE_BASE_ADDRESS | 4); OUT_RING(0 | BASE_ADDRESS_MODIFY); /* Generate state base address */ OUT_RING(0 | BASE_ADDRESS_MODIFY); /* Surface state base address */ OUT_RING(0 | BASE_ADDRESS_MODIFY); /* media base addr, don't care */ - OUT_RING(0x10000000 | BASE_ADDRESS_MODIFY); /* general state max addr, disabled */ - OUT_RING(0x10000000 | BASE_ADDRESS_MODIFY); /* media object state max addr, disabled */ + /* general state max addr, disabled */ + OUT_RING(0x10000000 | BASE_ADDRESS_MODIFY); + /* media object state max addr, disabled */ + OUT_RING(0x10000000 | BASE_ADDRESS_MODIFY); - /* Set system instruction pointer */ + /* Set system instruction pointer */ OUT_RING(BRW_STATE_SIP | 0); - OUT_RING(state_base_offset + sip_kernel_offset); /* system instruction pointer */ + OUT_RING(state_base_offset + sip_kernel_offset); OUT_RING(MI_NOOP); ADVANCE_LP_RING(); - } - { + } + { BEGIN_LP_RING(26); - /* Pipe control */ + /* Pipe control */ OUT_RING(BRW_PIPE_CONTROL | - BRW_PIPE_CONTROL_NOWRITE | - BRW_PIPE_CONTROL_IS_FLUSH | - 2); + BRW_PIPE_CONTROL_NOWRITE | + BRW_PIPE_CONTROL_IS_FLUSH | + 2); OUT_RING(0); /* Destination address */ OUT_RING(0); /* Immediate data low DW */ OUT_RING(0); /* Immediate data high DW */ - /* Binding table pointers */ + /* Binding table pointers */ OUT_RING(BRW_3DSTATE_BINDING_TABLE_POINTERS | 4); OUT_RING(0); /* vs */ OUT_RING(0); /* gs */ OUT_RING(0); /* clip */ OUT_RING(0); /* sf */ - /* Only the PS uses the binding table */ + /* Only the PS uses the binding table */ OUT_RING(state_base_offset + binding_table_offset); /* ps */ - /* The drawing rectangle clipping is always on. Set it to values that - * shouldn't do any clipping. - */ - OUT_RING(BRW_3DSTATE_DRAWING_RECTANGLE | 2); /* XXX 3 for BLC or CTG */ + /* The drawing rectangle clipping is always on. Set it to values that + * shouldn't do any clipping. + */ + OUT_RING(BRW_3DSTATE_DRAWING_RECTANGLE | 2); /* XXX 3 for BLC or CTG */ OUT_RING(0x00000000); /* ymin, xmin */ OUT_RING((pScrn->virtualX - 1) | (pScrn->virtualY - 1) << 16); /* ymax, xmax */ OUT_RING(0x00000000); /* yorigin, xorigin */ - /* skip the depth buffer */ - /* skip the polygon stipple */ - /* skip the polygon stipple offset */ - /* skip the line stipple */ - - /* Set the pointers to the 3d pipeline state */ + /* skip the depth buffer */ + /* skip the polygon stipple */ + /* skip the polygon stipple offset */ + /* skip the line stipple */ + + /* Set the pointers to the 3d pipeline state */ OUT_RING(BRW_3DSTATE_PIPELINED_POINTERS | 5); OUT_RING(state_base_offset + vs_offset); /* 32 byte aligned */ - OUT_RING(BRW_GS_DISABLE); /* disable GS, resulting in passthrough */ - OUT_RING(BRW_CLIP_DISABLE); /* disable CLIP, resulting in passthrough */ + OUT_RING(BRW_GS_DISABLE); /* disable GS, resulting in passthrough */ + OUT_RING(BRW_CLIP_DISABLE); /* disable CLIP, resulting in passthrough */ OUT_RING(state_base_offset + sf_offset); /* 32 byte aligned */ OUT_RING(state_base_offset + wm_offset); /* 32 byte aligned */ OUT_RING(state_base_offset + cc_offset); /* 64 byte aligned */ - /* URB fence */ + /* URB fence */ OUT_RING(BRW_URB_FENCE | UF0_CS_REALLOC | UF0_SF_REALLOC | @@ -906,27 +933,28 @@ I965EXAPrepareComposite(int op, PicturePtr pSrcPicture, OUT_RING(((urb_cs_start + urb_cs_size) << UF2_CS_FENCE_SHIFT) | ((urb_sf_start + urb_sf_size) << UF2_SF_FENCE_SHIFT)); - /* Constant buffer state */ + /* Constant buffer state */ OUT_RING(BRW_CS_URB_STATE | 0); - OUT_RING(((URB_CS_ENTRY_SIZE - 1) << 4) | /* URB Entry Allocation Size */ - (URB_CS_ENTRIES << 0)); /* Number of URB Entries */ + OUT_RING(((URB_CS_ENTRY_SIZE - 1) << 4) | + (URB_CS_ENTRIES << 0)); ADVANCE_LP_RING(); - } - { + } + { int nelem = pMask ? 3: 2; BEGIN_LP_RING(pMask?12:10); - /* Set up the pointer to our vertex buffer */ - OUT_RING(BRW_3DSTATE_VERTEX_BUFFERS | 3); + /* Set up the pointer to our vertex buffer */ + OUT_RING(BRW_3DSTATE_VERTEX_BUFFERS | 3); OUT_RING((0 << VB0_BUFFER_INDEX_SHIFT) | VB0_VERTEXDATA | - ((4 * 2 * nelem) << VB0_BUFFER_PITCH_SHIFT)); + ((4 * 2 * nelem) << VB0_BUFFER_PITCH_SHIFT)); OUT_RING(state_base_offset + vb_offset); OUT_RING(2); // max index, prim has 4 coords OUT_RING(0); // ignore for VERTEXDATA, but still there - /* Set up our vertex elements, sourced from the single vertex buffer. */ - OUT_RING(BRW_3DSTATE_VERTEX_ELEMENTS | ((2 * nelem) - 1)); - /* offset 0: X,Y -> {X, Y, 1.0, 1.0} */ + /* Set up our vertex elements, sourced from the single vertex buffer. + */ + OUT_RING(BRW_3DSTATE_VERTEX_ELEMENTS | ((2 * nelem) - 1)); + /* offset 0: X,Y -> {X, Y, 1.0, 1.0} */ OUT_RING((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | VE0_VALID | (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | @@ -936,7 +964,7 @@ I965EXAPrepareComposite(int op, PicturePtr pSrcPicture, (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | (0 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); - /* offset 8: S0, T0 -> {S0, T0, 1.0, 1.0} */ + /* offset 8: S0, T0 -> {S0, T0, 1.0, 1.0} */ OUT_RING((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | VE0_VALID | (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | @@ -948,30 +976,30 @@ I965EXAPrepareComposite(int op, PicturePtr pSrcPicture, (4 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); if (pMask) { - OUT_RING((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | - VE0_VALID | - (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | - (16 << VE0_OFFSET_SHIFT)); - OUT_RING((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | - (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | - (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | - (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | - (8 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); + OUT_RING((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | + VE0_VALID | + (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | + (16 << VE0_OFFSET_SHIFT)); + OUT_RING((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | + (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | + (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) | + (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | + (8 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); } - + ADVANCE_LP_RING(); - } + } #ifdef I830DEBUG ErrorF("try to sync to show any errors..."); I830Sync(pScrn); #endif return TRUE; -} +} void -I965EXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, - int dstX, int dstY, int w, int h) +i965_composite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, + int dstX, int dstY, int w, int h) { ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); @@ -1039,12 +1067,12 @@ I965EXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, } vb[i++] = (float)dstX; vb[i++] = (float)dstY; - + { BEGIN_LP_RING(6); - OUT_RING(BRW_3DPRIMITIVE | + OUT_RING(BRW_3DPRIMITIVE | BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL | - (_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) | + (_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) | (0 << 9) | /* CTG - indirect vertex count */ 4); OUT_RING(3); /* vertex count per instance */ From 96783a458957ca280ebb6275fa692dd415df6931 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 31 Jan 2007 15:48:02 -0800 Subject: [PATCH 31/35] Fix copy-and-paste-o in the render code cleanup that broke XAA. --- src/i830_xaa.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/i830_xaa.c b/src/i830_xaa.c index dbe1521c..5ef5d3c4 100644 --- a/src/i830_xaa.c +++ b/src/i830_xaa.c @@ -243,22 +243,22 @@ I830XAAInit(ScreenPtr pScreen) if (IS_I865G(pI830) || IS_I855(pI830) || IS_845G(pI830) || IS_I830(pI830)) { - pI830->EXADriverPtr->CheckComposite = i830_check_composite; - pI830->EXADriverPtr->PrepareComposite = i830_prepare_composite; - pI830->EXADriverPtr->Composite = i830_composite; - pI830->EXADriverPtr->DoneComposite = i830_done_composite; + pI830->xaa_check_composite = i830_check_composite; + pI830->xaa_prepare_composite = i830_prepare_composite; + pI830->xaa_composite = i830_composite; + pI830->xaa_done_composite = i830_done_composite; } else if (IS_I915G(pI830) || IS_I915GM(pI830) || IS_I945G(pI830) || IS_I945GM(pI830)) { - pI830->EXADriverPtr->CheckComposite = i915_check_composite; - pI830->EXADriverPtr->PrepareComposite = i915_prepare_composite; - pI830->EXADriverPtr->Composite = i830_composite; - pI830->EXADriverPtr->DoneComposite = i830_done_composite; + pI830->xaa_check_composite = i915_check_composite; + pI830->xaa_prepare_composite = i915_prepare_composite; + pI830->xaa_composite = i830_composite; + pI830->xaa_done_composite = i830_done_composite; } else { - pI830->EXADriverPtr->CheckComposite = i965_check_composite; - pI830->EXADriverPtr->PrepareComposite = i965_prepare_composite; - pI830->EXADriverPtr->Composite = i965_composite; - pI830->EXADriverPtr->DoneComposite = i830_done_composite; + pI830->xaa_check_composite = i965_check_composite; + pI830->xaa_prepare_composite = i965_prepare_composite; + pI830->xaa_composite = i965_composite; + pI830->xaa_done_composite = i830_done_composite; } pI830->saved_composite = ps->Composite; From 351866b0328b1d7afdc6b414c77d9ab4da4bd085 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 31 Jan 2007 15:48:52 -0800 Subject: [PATCH 32/35] Sync before overwriting Render acceleration state on the 965. --- src/i965_render.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i965_render.c b/src/i965_render.c index 5ff174da..266b461f 100644 --- a/src/i965_render.c +++ b/src/i965_render.c @@ -552,10 +552,10 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture, urb_cs_start = urb_sf_start + urb_sf_size; urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE; - /* We'll be poking the state buffers that could be in use by the 3d - * hardware here, but we should have synced the 3D engine already in - * I830PutImage. XXX + /* Because we only have a single static buffer for our state currently, + * we have to sync before updating it every time. */ + i830WaitSync(pScrn); memset (cc_viewport, 0, sizeof (*cc_viewport)); cc_viewport->min_depth = -1.e35; From d6bc03c379c46842676f640b8edb13ea828bf20c Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 1 Feb 2007 11:28:34 -0800 Subject: [PATCH 33/35] Bug #9819: Add two headers that are apparently necessary on older X Servers. --- src/i830_xf86Rotate.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i830_xf86Rotate.c b/src/i830_xf86Rotate.c index 3b8be613..bd4d5a60 100644 --- a/src/i830_xf86Rotate.c +++ b/src/i830_xf86Rotate.c @@ -30,7 +30,8 @@ #include "xf86.h" #include "xf86DDC.h" -/*#include "i830.h" */ +#include "fb.h" +#include "windowstr.h" #include "i830_xf86Crtc.h" #include "i830_xf86Modes.h" #include "i830_randr.h" From 9bfeadbd5b37acb56cb646009239a94727ec52bc Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 1 Feb 2007 12:04:58 -0800 Subject: [PATCH 34/35] Remove some more dead options. --- man/i810.man | 45 --------------------------------------------- src/i830_driver.c | 7 ------- 2 files changed, 52 deletions(-) diff --git a/man/i810.man b/man/i810.man index d1ee2da0..2215c7a4 100644 --- a/man/i810.man +++ b/man/i810.man @@ -129,51 +129,6 @@ other drivers. Disable or enable XVideo support. Default: XVideo is enabled for configurations where it is supported. .TP -.BI "Option \*qMonitorLayout\*q \*q" anystr \*q -Allow different monitor configurations. e.g. \*qCRT,LFP\*q will -configure a CRT on Pipe A and an LFP on Pipe B. Regardless of the -primary heads' pipe it is always configured as \*q,\*q. -Additionally you can add different configurations such as -\*qCRT+DFP,LFP\*q which would put a digital flat panel and a CRT -on pipe A, and a local flat panel on pipe B. -For single pipe configurations you can just specify the monitors types -on Pipe A, such as \*qCRT+DFP\*q which will enable the CRT and DFP -on Pipe A. -Valid monitors are CRT, LFP, DFP, TV, CRT2, LFP2, DFP2, TV2 and NONE. -NOTE: Some configurations of monitor types may fail, this depends on -the Video BIOS and system configuration. -Default: Not configured, and will use the current head's pipe and monitor. -.TP -.BI "Option \*qClone\*q \*q" boolean \*q -Enable Clone mode on pipe B. This will setup the second head as a complete -mirror of the monitor attached to pipe A. -NOTE: Video overlay functions will not work on the second head in this mode. -If you require this, then use the MonitorLayout above and do (as an example) -\*qCRT+DFP,NONE\*q to configure both a CRT and DFP on Pipe A to achieve -local mirroring and disable the use of this option. -Default: Clone mode on pipe B is disabled. -.TP -.BI "Option \*qCloneRefresh\*q \*q" integer \*q -When the Clone option is specified we can drive the second monitor at a -different refresh rate than the primary. -Default: 60Hz. -.TP -.BI "Option \*qCheckLid\*q \*q" boolean \*q -On mobile platforms it's desirable to monitor the lid status and switch -the outputs accordingly when the lid is opened or closed. By default this -option is on, but may incur a very minor performance penalty as we need -to poll a register on the card to check for this activity. It can be -turned off using this option. This only works with the 830M, 852GM and 855GM -systems. -Default: enabled. -.TP -.BI "Option \*qFlipPrimary\*q \*q" boolean \*q -When using a dual pipe system, it may be preferable to switch the primary -screen to the alternate pipe to display on the other monitor connection. -NOTE: Using this option may cause text mode to be restored incorrectly, -and thus should be used with caution. -Default: disabled. -.TP .BI "Option \*qRotate\*q \*q90\*q" Rotate the desktop 90 degrees counterclockwise. Other valid options are 0, 90, 180 and 270 degrees. The RandR extension is used for rotation diff --git a/src/i830_driver.c b/src/i830_driver.c index 7c365db3..cbba4373 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -270,12 +270,7 @@ typedef enum { OPTION_XVIDEO, OPTION_VIDEO_KEY, OPTION_COLOR_KEY, - OPTION_VBE_RESTORE, - OPTION_DISPLAY_INFO, - OPTION_DEVICE_PRESENCE, - OPTION_MONITOR_LAYOUT, OPTION_CHECKDEVICES, - OPTION_FIXEDPIPE, OPTION_LINEARALLOC, OPTION_INTELTEXPOOL, OPTION_INTELMMSIZE @@ -293,9 +288,7 @@ static OptionInfoRec I830Options[] = { {OPTION_XVIDEO, "XVideo", OPTV_BOOLEAN, {0}, TRUE}, {OPTION_COLOR_KEY, "ColorKey", OPTV_INTEGER, {0}, FALSE}, {OPTION_VIDEO_KEY, "VideoKey", OPTV_INTEGER, {0}, FALSE}, - {OPTION_MONITOR_LAYOUT, "MonitorLayout", OPTV_ANYSTR,{0}, FALSE}, {OPTION_CHECKDEVICES, "CheckDevices",OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_FIXEDPIPE, "FixedPipe", OPTV_ANYSTR, {0}, FALSE}, {OPTION_LINEARALLOC, "LinearAlloc", OPTV_INTEGER, {0}, FALSE}, {OPTION_INTELTEXPOOL,"Legacy3D", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_INTELMMSIZE, "AperTexSize", OPTV_INTEGER, {0}, FALSE}, From 1ba45a3fcd40aaf4d373447fb9f252ca053f9105 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 1 Feb 2007 13:26:38 -0800 Subject: [PATCH 35/35] Improve register debugging output. This includes not reporting some fields on hardware where those bits are reserved, correcting one of the hardware error bit numbers, and reducing the severity of the debugging output warnings. --- src/i810_reg.h | 2 +- src/i830_debug.c | 49 +++++++++++++++++++++++++++++------------------ src/i830_driver.c | 4 ++-- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/i810_reg.h b/src/i810_reg.h index 33b059d6..68cce930 100644 --- a/src/i810_reg.h +++ b/src/i810_reg.h @@ -401,7 +401,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # define ERR_VERTEX_MAX (1 << 5) /* lpt/cst */ # define ERR_PGTBL_ERROR (1 << 4) # define ERR_DISPLAY_OVERLAY_UNDERRUN (1 << 3) -# define ERR_MAIN_MEMORY_REFRESH (1 << 2) +# define ERR_MAIN_MEMORY_REFRESH (1 << 1) # define ERR_INSTRUCTION_ERROR (1 << 0) diff --git a/src/i830_debug.c b/src/i830_debug.c index 897ab926..e0be0a4a 100644 --- a/src/i830_debug.c +++ b/src/i830_debug.c @@ -462,7 +462,7 @@ void i830DumpRegs (ScrnInfoPtr pScrn) break; default: p2 = 1; - xf86DrvMsg (pScrn->scrnIndex, X_ERROR, "p2 out of range\n"); + xf86DrvMsg (pScrn->scrnIndex, X_WARNING, "p2 out of range\n"); break; } switch ((dpll >> 16) & 0xff) { @@ -484,33 +484,39 @@ void i830DumpRegs (ScrnInfoPtr pScrn) p1 = 8; break; default: p1 = 1; - xf86DrvMsg (pScrn->scrnIndex, X_ERROR, "p1 out of range\n"); + xf86DrvMsg (pScrn->scrnIndex, X_WARNING, "p1 out of range\n"); break; } switch ((dpll >> 13) & 0x3) { case 0: ref = 96000; break; + case 3: + ref = 100000; + break; default: ref = 0; - xf86DrvMsg (pScrn->scrnIndex, X_ERROR, "ref out of range\n"); + xf86DrvMsg (pScrn->scrnIndex, X_WARNING, "ref out of range\n"); break; } - phase = (dpll >> 9) & 0xf; - switch (phase) { - case 6: - break; - default: - xf86DrvMsg (pScrn->scrnIndex, X_INFO, - "SDVO phase shift %d out of range -- probobly not " - "an issue.\n", phase); - break; + if (IS_I965G(pI830)) { + phase = (dpll >> 9) & 0xf; + switch (phase) { + case 6: + break; + default: + xf86DrvMsg (pScrn->scrnIndex, X_INFO, + "SDVO phase shift %d out of range -- probobly not " + "an issue.\n", phase); + break; + } } switch ((dpll >> 8) & 1) { case 0: break; default: - xf86DrvMsg (pScrn->scrnIndex, X_ERROR, "fp select out of range\n"); + xf86DrvMsg (pScrn->scrnIndex, X_WARNING, + "fp select out of range\n"); break; } n = ((fp >> 16) & 0x3f); @@ -645,13 +651,18 @@ i830_check_error_state(ScrnInfoPtr pScrn) temp = INREG16(ESR); if (temp != 0) { + Bool vertex_max = !IS_I965G(pI830) && (temp & ERR_VERTEX_MAX); + Bool pgtbl = temp & ERR_PGTBL_ERROR; + Bool underrun = !IS_I965G(pI830) && + (temp & ERR_DISPLAY_OVERLAY_UNDERRUN); + Bool instruction = !IS_I965G(pI830) && (temp & ERR_INSTRUCTION_ERROR); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "ESR is 0x%08lx%s%s%s%s\n", temp, - temp & ERR_VERTEX_MAX ? ", max vertices exceeded" : "", - temp & ERR_PGTBL_ERROR ? ", page table error" : "", - temp & ERR_DISPLAY_OVERLAY_UNDERRUN ? - ", display/overlay underrun" : "", - temp & ERR_INSTRUCTION_ERROR ? ", instruction error" : ""); + vertex_max ? ", max vertices exceeded" : "", + pgtbl ? ", page table error" : "", + underrun ? ", display/overlay underrun" : "", + instruction ? ", instruction error" : ""); errors++; } /* Check first for page table errors */ @@ -665,7 +676,7 @@ i830_check_error_state(ScrnInfoPtr pScrn) } else { temp = INREG(PGTBL_ER); if (temp != 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "PGTBL_ER is 0x%08lx" "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", temp, temp & PGTBL_ERR_HOST_GTT_PTE ? ", host gtt pte" : "", diff --git a/src/i830_driver.c b/src/i830_driver.c index cbba4373..0f663115 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -3042,8 +3042,8 @@ I830EnterVT(int scrnIndex, int flags) return FALSE; if (i830_check_error_state(pScrn)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Existing errors found in hardware state\n"); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Existing errors found in hardware state.\n"); } ResetState(pScrn, FALSE);