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.
This commit is contained in:
parent
8759f4d89a
commit
74ebff6732
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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++)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)))
|
||||
|
|
|
|||
Loading…
Reference in New Issue