diff options
author | David Nusinow <dnusinow@debian.org> | 2006-09-24 21:11:46 +0000 |
---|---|---|
committer | David Nusinow <dnusinow@debian.org> | 2006-09-24 21:11:46 +0000 |
commit | eadb76b3f8e0e9b82da762bd29e53895bf9e6351 (patch) | |
tree | b9f68fc763f9ea055287c366e61de84191b200ce /src/mesa/drivers/dri/i915/server | |
parent | b3f7313ae4f4cd418522595e90e7d06ef6992f0a (diff) |
Bump to latest mesa in Debian
Diffstat (limited to 'src/mesa/drivers/dri/i915/server')
-rw-r--r-- | src/mesa/drivers/dri/i915/server/intel.h | 44 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/server/intel_dri.c | 397 |
2 files changed, 400 insertions, 41 deletions
diff --git a/src/mesa/drivers/dri/i915/server/intel.h b/src/mesa/drivers/dri/i915/server/intel.h index 606db974b1c..d7858a20c8d 100644 --- a/src/mesa/drivers/dri/i915/server/intel.h +++ b/src/mesa/drivers/dri/i915/server/intel.h @@ -137,11 +137,6 @@ typedef struct { int space; } I830RingBuffer; -typedef struct { - unsigned int Fence[8]; -} I830RegRec, *I830RegPtr; - - typedef struct _I830Rec { unsigned char *MMIOBase; unsigned char *FbBase; @@ -194,6 +189,7 @@ typedef struct _I830Rec { int GttBound; drm_handle_t ring_map; + unsigned int Fence[8]; } I830Rec; @@ -271,6 +267,44 @@ typedef struct _I830Rec { #define RING_INVALID 0x00000000 +/* Fence/Tiling ranges [0..7] + */ +#define FENCE 0x2000 +#define FENCE_NR 8 + +#define I915G_FENCE_START_MASK 0x0ff00000 + +#define I830_FENCE_START_MASK 0x07f80000 + +#define FENCE_START_MASK 0x03F80000 +#define FENCE_X_MAJOR 0x00000000 +#define FENCE_Y_MAJOR 0x00001000 +#define FENCE_SIZE_MASK 0x00000700 +#define FENCE_SIZE_512K 0x00000000 +#define FENCE_SIZE_1M 0x00000100 +#define FENCE_SIZE_2M 0x00000200 +#define FENCE_SIZE_4M 0x00000300 +#define FENCE_SIZE_8M 0x00000400 +#define FENCE_SIZE_16M 0x00000500 +#define FENCE_SIZE_32M 0x00000600 +#define FENCE_SIZE_64M 0x00000700 +#define I915G_FENCE_SIZE_1M 0x00000000 +#define I915G_FENCE_SIZE_2M 0x00000100 +#define I915G_FENCE_SIZE_4M 0x00000200 +#define I915G_FENCE_SIZE_8M 0x00000300 +#define I915G_FENCE_SIZE_16M 0x00000400 +#define I915G_FENCE_SIZE_32M 0x00000500 +#define I915G_FENCE_SIZE_64M 0x00000600 +#define I915G_FENCE_SIZE_128M 0x00000700 +#define FENCE_PITCH_1 0x00000000 +#define FENCE_PITCH_2 0x00000010 +#define FENCE_PITCH_4 0x00000020 +#define FENCE_PITCH_8 0x00000030 +#define FENCE_PITCH_16 0x00000040 +#define FENCE_PITCH_32 0x00000050 +#define FENCE_PITCH_64 0x00000060 +#define FENCE_VALID 0x00000001 + #include <mmio.h> # define MMIO_IN8(base, offset) \ diff --git a/src/mesa/drivers/dri/i915/server/intel_dri.c b/src/mesa/drivers/dri/i915/server/intel_dri.c index 2fd4a13052f..169fdbece30 100644 --- a/src/mesa/drivers/dri/i915/server/intel_dri.c +++ b/src/mesa/drivers/dri/i915/server/intel_dri.c @@ -46,10 +46,250 @@ #include "pciaccess.h" static size_t drm_page_size; +static int nextTile = 0; #define xf86DrvMsg(...) do {} while(0) +static const int pitches[] = { + 128 * 8, + 128 * 16, + 128 * 32, + 128 * 64, + 0 +}; + static Bool I830DRIDoMappings(DRIDriverContext *ctx, I830Rec *pI830, drmI830Sarea *sarea); +static unsigned long +GetBestTileAlignment(unsigned long size) +{ + unsigned long i; + + for (i = KB(512); i < size; i <<= 1) + ; + + if (i > MB(64)) + i = MB(64); + + return i; +} + +static void SetFenceRegs(const DRIDriverContext *ctx, I830Rec *pI830) +{ + int i; + unsigned char *MMIO = ctx->MMIOAddress; + + for (i = 0; i < 8; i++) { + OUTREG(FENCE + i * 4, pI830->Fence[i]); + // if (I810_DEBUG & DEBUG_VERBOSE_VGA) + fprintf(stderr,"Fence Register : %x\n", pI830->Fence[i]); + } +} + +/* Tiled memory is good... really, really good... + * + * Need to make it less likely that we miss out on this - probably + * need to move the frontbuffer away from the 'guarenteed' alignment + * of the first memory segment, or perhaps allocate a discontigous + * framebuffer to get more alignment 'sweet spots'. + */ +static void +SetFence(const DRIDriverContext *ctx, I830Rec *pI830, + int nr, unsigned int start, unsigned int pitch, + unsigned int size) +{ + unsigned int val; + unsigned int fence_mask = 0; + unsigned int fence_pitch; + + if (nr < 0 || nr > 7) { + fprintf(stderr, + "SetFence: fence %d out of range\n",nr); + return; + } + + pI830->Fence[nr] = 0; + + if (IS_I9XX(pI830)) + fence_mask = ~I915G_FENCE_START_MASK; + else + fence_mask = ~I830_FENCE_START_MASK; + + if (start & fence_mask) { + fprintf(stderr, + "SetFence: %d: start (0x%08x) is not %s aligned\n", + nr, start, (IS_I9XX(pI830)) ? "1MB" : "512k"); + return; + } + + if (start % size) { + fprintf(stderr, + "SetFence: %d: start (0x%08x) is not size (%dk) aligned\n", + nr, start, size / 1024); + return; + } + + if (pitch & 127) { + fprintf(stderr, + "SetFence: %d: pitch (%d) not a multiple of 128 bytes\n", + nr, pitch); + return; + } + + val = (start | FENCE_X_MAJOR | FENCE_VALID); + + if (IS_I9XX(pI830)) { + switch (size) { + case MB(1): + val |= I915G_FENCE_SIZE_1M; + break; + case MB(2): + val |= I915G_FENCE_SIZE_2M; + break; + case MB(4): + val |= I915G_FENCE_SIZE_4M; + break; + case MB(8): + val |= I915G_FENCE_SIZE_8M; + break; + case MB(16): + val |= I915G_FENCE_SIZE_16M; + break; + case MB(32): + val |= I915G_FENCE_SIZE_32M; + break; + case MB(64): + val |= I915G_FENCE_SIZE_64M; + break; + default: + fprintf(stderr, + "SetFence: %d: illegal size (%d kByte)\n", nr, size / 1024); + return; + } + } else { + switch (size) { + case KB(512): + val |= FENCE_SIZE_512K; + break; + case MB(1): + val |= FENCE_SIZE_1M; + break; + case MB(2): + val |= FENCE_SIZE_2M; + break; + case MB(4): + val |= FENCE_SIZE_4M; + break; + case MB(8): + val |= FENCE_SIZE_8M; + break; + case MB(16): + val |= FENCE_SIZE_16M; + break; + case MB(32): + val |= FENCE_SIZE_32M; + break; + case MB(64): + val |= FENCE_SIZE_64M; + break; + default: + fprintf(stderr, + "SetFence: %d: illegal size (%d kByte)\n", nr, size / 1024); + return; + } + } + + if (IS_I9XX(pI830)) + fence_pitch = pitch / 512; + else + fence_pitch = pitch / 128; + + switch (fence_pitch) { + case 1: + val |= FENCE_PITCH_1; + break; + case 2: + val |= FENCE_PITCH_2; + break; + case 4: + val |= FENCE_PITCH_4; + break; + case 8: + val |= FENCE_PITCH_8; + break; + case 16: + val |= FENCE_PITCH_16; + break; + case 32: + val |= FENCE_PITCH_32; + break; + case 64: + val |= FENCE_PITCH_64; + break; + default: + fprintf(stderr, + "SetFence: %d: illegal pitch (%d)\n", nr, pitch); + return; + } + + pI830->Fence[nr] = val; +} + +static Bool +MakeTiles(const DRIDriverContext *ctx, I830Rec *pI830, I830MemRange *pMem) +{ + int pitch, ntiles, i; + + pitch = pMem->Pitch * ctx->cpp; + /* + * Simply try to break the region up into at most four pieces of size + * equal to the alignment. + */ + ntiles = ROUND_TO(pMem->Size, pMem->Alignment) / pMem->Alignment; + if (ntiles >= 4) { + return FALSE; + } + + for (i = 0; i < ntiles; i++, nextTile++) { + SetFence(ctx, pI830, nextTile, pMem->Start + i * pMem->Alignment, + pitch, pMem->Alignment); + } + return TRUE; +} + +static void I830SetupMemoryTiling(const DRIDriverContext *ctx, I830Rec *pI830) +{ + int i; + + /* Clear out */ + for (i = 0; i < 8; i++) + pI830->Fence[i] = 0; + + nextTile = 0; + + if (pI830->BackBuffer.Alignment >= KB(512)) { + if (MakeTiles(ctx, pI830, &(pI830->BackBuffer))) { + fprintf(stderr, + "Activating tiled memory for the back buffer.\n"); + } else { + fprintf(stderr, + "MakeTiles failed for the back buffer.\n"); + pI830->allowPageFlip = FALSE; + } + } + + if (pI830->DepthBuffer.Alignment >= KB(512)) { + if (MakeTiles(ctx, pI830, &(pI830->DepthBuffer))) { + fprintf(stderr, + "Activating tiled memory for the depth buffer.\n"); + } else { + fprintf(stderr, + "MakeTiles failed for the depth buffer.\n"); + } + } + + return; +} + static int I830DetectMemory(const DRIDriverContext *ctx, I830Rec *pI830) { struct pci_device host_bridge; @@ -139,6 +379,43 @@ static int AgpInit(const DRIDriverContext *ctx, I830Rec *info) return 1; } +/* + * Allocate memory from the given pool. Grow the pool if needed and if + * possible. + */ +static unsigned long +AllocFromPool(const DRIDriverContext *ctx, I830Rec *pI830, + I830MemRange *result, I830MemPool *pool, + long size, unsigned long alignment, int flags) +{ + long needed, start, end; + + if (!result || !pool || !size) + return 0; + + /* Calculate how much space is needed. */ + if (alignment <= GTT_PAGE_SIZE) + needed = size; + else { + start = ROUND_TO(pool->Free.Start, alignment); + end = ROUND_TO(start + size, alignment); + needed = end - pool->Free.Start; + } + if (needed > pool->Free.Size) { + return 0; + } + + result->Start = ROUND_TO(pool->Free.Start, alignment); + pool->Free.Start += needed; + result->End = pool->Free.Start; + + pool->Free.Size = pool->Free.End - pool->Free.Start; + result->Size = result->End - result->Start; + result->Pool = pool; + result->Alignment = alignment; + return needed; +} + static unsigned long AllocFromAGP(const DRIDriverContext *ctx, I830Rec *pI830, long size, unsigned long alignment, I830MemRange *result) { unsigned long start, end; @@ -166,7 +443,7 @@ static unsigned long AllocFromAGP(const DRIDriverContext *ctx, I830Rec *pI830, l pI830->MemoryAperture.Start = newApStart; pI830->MemoryAperture.End = newApEnd; pI830->MemoryAperture.Size = newApEnd - newApStart; - pI830->FreeMemory -= size; + // pI830->FreeMemory -= size; result->Start = start; result->End = start + size; result->Size = size; @@ -177,6 +454,34 @@ static unsigned long AllocFromAGP(const DRIDriverContext *ctx, I830Rec *pI830, l return size; } +unsigned long +I830AllocVidMem(const DRIDriverContext *ctx, I830Rec *pI830, I830MemRange *result, I830MemPool *pool, long size, unsigned long alignment, int flags) +{ + int ret; + + if (!result) + return 0; + + /* Make sure these are initialised. */ + result->Size = 0; + result->Key = -1; + + if (!size) { + return 0; + } + + if (pool->Free.Size < size) + return AllocFromAGP(ctx, pI830, size, alignment, result); + else + { + ret = AllocFromPool(ctx, pI830, result, pool, size, alignment, flags); + + if (ret==0) + return AllocFromAGP(ctx, pI830, size, alignment, result); + return ret; + } +} + static Bool BindAgpRange(const DRIDriverContext *ctx, I830MemRange *mem) { if (!mem) @@ -185,7 +490,7 @@ static Bool BindAgpRange(const DRIDriverContext *ctx, I830MemRange *mem) if (mem->Key == -1) return TRUE; - return drmAgpBind(ctx->drmFD, mem->Key, mem->Offset); + return !drmAgpBind(ctx->drmFD, mem->Key, mem->Offset); } /* simple memory allocation routines needed */ @@ -207,7 +512,7 @@ I830AllocateMemory(const DRIDriverContext *ctx, I830Rec *pI830) size = PRIMARY_RINGBUFFER_SIZE; - ret = AllocFromAGP(ctx, pI830, size, 0x1000, &pI830->LpRing->mem); + ret = I830AllocVidMem(ctx, pI830, &pI830->LpRing->mem, &pI830->StolenPool, size, 0x1000, 0); if (ret != size) { @@ -230,8 +535,10 @@ I830AllocateMemory(const DRIDriverContext *ctx, I830Rec *pI830) size = lineSize * lines; size = ROUND_TO_PAGE(size); - ret = AllocFromAGP(ctx, pI830, size, align, &pI830->FrontBuffer); - if (ret != size) + align = GetBestTileAlignment(size); + + ret = I830AllocVidMem(ctx, pI830, &pI830->FrontBuffer, &pI830->StolenPool, size, align, 0); + if (ret < size) { fprintf(stderr,"unable to allocate front buffer %ld\n", ret); return FALSE; @@ -241,8 +548,8 @@ I830AllocateMemory(const DRIDriverContext *ctx, I830Rec *pI830) pI830->BackBuffer.Key = -1; pI830->BackBuffer.Pitch = ctx->shared.virtualWidth; - ret = AllocFromAGP(ctx, pI830, size, align, &pI830->BackBuffer); - if (ret != size) + ret = I830AllocVidMem(ctx, pI830, &pI830->BackBuffer, &pI830->StolenPool, size, align, 0); + if (ret < size) { fprintf(stderr,"unable to allocate back buffer %ld\n", ret); return FALSE; @@ -252,8 +559,8 @@ I830AllocateMemory(const DRIDriverContext *ctx, I830Rec *pI830) pI830->DepthBuffer.Key = -1; pI830->DepthBuffer.Pitch = ctx->shared.virtualWidth; - ret = AllocFromAGP(ctx, pI830, size, align, &pI830->DepthBuffer); - if (ret != size) + ret = I830AllocVidMem(ctx, pI830, &pI830->DepthBuffer, &pI830->StolenPool, size, align, 0); + if (ret < size) { fprintf(stderr,"unable to allocate depth buffer %ld\n", ret); return FALSE; @@ -263,10 +570,10 @@ I830AllocateMemory(const DRIDriverContext *ctx, I830Rec *pI830) pI830->ContextMem.Key = -1; size = KB(32); - ret = AllocFromAGP(ctx, pI830, size, align, &pI830->ContextMem); - if (ret != size) + ret = I830AllocVidMem(ctx, pI830, &pI830->ContextMem, &pI830->StolenPool, size, align, 0); + if (ret < size) { - fprintf(stderr,"unable to allocate back buffer %ld\n", ret); + fprintf(stderr,"unable to allocate context buffer %ld\n", ret); return FALSE; } @@ -275,7 +582,7 @@ I830AllocateMemory(const DRIDriverContext *ctx, I830Rec *pI830) size = 32768 * 1024; ret = AllocFromAGP(ctx, pI830, size, align, &pI830->TexMem); - if (ret != size) + if (ret < size) { fprintf(stderr,"unable to allocate texture memory %ld\n", ret); return FALSE; @@ -287,17 +594,17 @@ I830AllocateMemory(const DRIDriverContext *ctx, I830Rec *pI830) static Bool I830BindMemory(const DRIDriverContext *ctx, I830Rec *pI830) { - if (BindAgpRange(ctx, &pI830->LpRing->mem)) + if (!BindAgpRange(ctx, &pI830->LpRing->mem)) return FALSE; - if (BindAgpRange(ctx, &pI830->FrontBuffer)) + if (!BindAgpRange(ctx, &pI830->FrontBuffer)) return FALSE; - if (BindAgpRange(ctx, &pI830->BackBuffer)) + if (!BindAgpRange(ctx, &pI830->BackBuffer)) return FALSE; - if (BindAgpRange(ctx, &pI830->DepthBuffer)) + if (!BindAgpRange(ctx, &pI830->DepthBuffer)) return FALSE; - if (BindAgpRange(ctx, &pI830->ContextMem)) + if (!BindAgpRange(ctx, &pI830->ContextMem)) return FALSE; - if (BindAgpRange(ctx, &pI830->TexMem)) + if (!BindAgpRange(ctx, &pI830->TexMem)) return FALSE; return TRUE; @@ -313,7 +620,7 @@ I830CleanupDma(const DRIDriverContext *ctx) if (drmCommandWrite(ctx->drmFD, DRM_I830_INIT, &info, sizeof(drmI830Init))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "I830 Dma Cleanup Failed\n"); + fprintf(stderr, "I830 Dma Cleanup Failed\n"); return FALSE; } @@ -345,11 +652,11 @@ I830InitDma(const DRIDriverContext *ctx, I830Rec *pI830) info.pitch = ctx->shared.virtualWidth; info.back_pitch = pI830->BackBuffer.Pitch; info.depth_pitch = pI830->DepthBuffer.Pitch; - info.cpp = pI830->cpp; + info.cpp = ctx->cpp; if (drmCommandWrite(ctx->drmFD, DRM_I830_INIT, &info, sizeof(drmI830Init))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + fprintf(stderr, "I830 Dma Initialization Failed\n"); return FALSE; } @@ -408,7 +715,7 @@ I830SetRingRegs(const DRIDriverContext *ctx, I830Rec *pI830) if ((long)(pI830->LpRing->mem.Start & I830_RING_START_MASK) != pI830->LpRing->mem.Start) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + fprintf(stderr, "I830SetRingRegs: Ring buffer start (%lx) violates its " "mask (%x)\n", pI830->LpRing->mem.Start, I830_RING_START_MASK); } @@ -418,7 +725,7 @@ I830SetRingRegs(const DRIDriverContext *ctx, I830Rec *pI830) if (((pI830->LpRing->mem.Size - 4096) & I830_RING_NR_PAGES) != pI830->LpRing->mem.Size - 4096) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + fprintf(stderr, "I830SetRingRegs: Ring buffer size - 4096 (%lx) violates its " "mask (%x)\n", pI830->LpRing->mem.Size - 4096, I830_RING_NR_PAGES); @@ -433,6 +740,8 @@ I830SetRingRegs(const DRIDriverContext *ctx, I830Rec *pI830) pI830->LpRing->space = pI830->LpRing->head - (pI830->LpRing->tail + 8); if (pI830->LpRing->space < 0) pI830->LpRing->space += pI830->LpRing->mem.Size; + + SetFenceRegs(ctx, pI830); /* RESET THE DISPLAY PIPE TO POINT TO THE FRONTBUFFER - hacky hacky hacky */ @@ -450,7 +759,7 @@ I830SetParam(const DRIDriverContext *ctx, int param, int value) sp.value = value; if (drmCommandWrite(ctx->drmFD, DRM_I830_SETPARAM, &sp, sizeof(sp))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "I830 SetParam Failed\n"); + fprintf(stderr, "I830 SetParam Failed\n"); return FALSE; } @@ -482,7 +791,7 @@ I830DRIMapScreenRegions(DRIDriverContext *ctx, I830Rec *pI830, drmI830Sarea *sar (drm_handle_t)(sarea->back_offset), sarea->back_size, DRM_AGP, 0, &sarea->back_handle) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + fprintf(stderr, "[drm] drmAddMap(back_handle) failed. Disabling DRI\n"); return FALSE; } @@ -493,7 +802,7 @@ I830DRIMapScreenRegions(DRIDriverContext *ctx, I830Rec *pI830, drmI830Sarea *sar (drm_handle_t)sarea->depth_offset, sarea->depth_size, DRM_AGP, 0, &sarea->depth_handle) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + fprintf(stderr, "[drm] drmAddMap(depth_handle) failed. Disabling DRI\n"); return FALSE; } @@ -504,7 +813,7 @@ I830DRIMapScreenRegions(DRIDriverContext *ctx, I830Rec *pI830, drmI830Sarea *sar (drm_handle_t)sarea->tex_offset, sarea->tex_size, DRM_AGP, 0, &sarea->tex_handle) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + fprintf(stderr, "[drm] drmAddMap(tex_handle) failed. Disabling DRI\n"); return FALSE; } @@ -549,10 +858,10 @@ I830InitTextureHeap(const DRIDriverContext *ctx, I830Rec *pI830, drmI830Sarea *s if (drmCommandWrite(ctx->drmFD, DRM_I830_INIT_HEAP, &drmHeap, sizeof(drmHeap))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + fprintf(stderr, "[drm] Failed to initialized agp heap manager\n"); } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, + fprintf(stderr, "[drm] Initialized kernel agp heap manager, %d\n", sarea->tex_size); @@ -597,18 +906,18 @@ I830DRIDoMappings(DRIDriverContext *ctx, I830Rec *pI830, drmI830Sarea *sarea) ctx->pciFunc); if (drmCtlInstHandler(ctx->drmFD, pI830->irq)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + fprintf(stderr, "[drm] failure adding irq handler\n"); pI830->irq = 0; return FALSE; } else - xf86DrvMsg(pScrn->scrnIndex, X_INFO, + fprintf(stderr, "[drm] dma control initialized, using IRQ %d\n", - pI830DRI->irq); + pI830->irq); } - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] visual configs initialized\n"); + fprintf(stderr, "[dri] visual configs initialized\n"); return TRUE; } @@ -663,7 +972,6 @@ I830ScreenInit(DRIDriverContext *ctx, I830Rec *pI830) I830DRIPtr pI830DRI; drmI830Sarea *pSAREAPriv; int err; - drm_page_size = getpagesize(); @@ -675,7 +983,7 @@ I830ScreenInit(DRIDriverContext *ctx, I830Rec *pI830) */ ctx->shared.SAREASize = SAREA_MAX; - /* Note that drmOpen will try to load the kernel module, if needed. */ + /* Note that drmOpen will try to load the kernel module, if needed. */ ctx->drmFD = drmOpen("i915", NULL ); if (ctx->drmFD < 0) { fprintf(stderr, "[drm] drmOpen failed\n"); @@ -757,6 +1065,11 @@ I830ScreenInit(DRIDriverContext *ctx, I830Rec *pI830) pI830->MemoryAperture.End = KB(40000); pI830->MemoryAperture.Size = pI830->MemoryAperture.End - pI830->MemoryAperture.Start; + pI830->StolenPool.Fixed = pI830->StolenMemory; + pI830->StolenPool.Total = pI830->StolenMemory; + pI830->StolenPool.Free = pI830->StolenPool.Total; + pI830->FreeMemory = pI830->StolenPool.Total.Size; + if (!AgpInit(ctx, pI830)) return FALSE; @@ -810,6 +1123,8 @@ I830ScreenInit(DRIDriverContext *ctx, I830Rec *pI830) if (err == FALSE) return FALSE; + I830SetupMemoryTiling(ctx, pI830); + /* Quick hack to clear the front & back buffers. Could also use * the clear ioctl to do this, but would need to setup hw state * first. @@ -873,6 +1188,7 @@ static int i830PostValidateMode( const DRIDriverContext *ctx ) static int i830InitFBDev( DRIDriverContext *ctx ) { I830Rec *pI830 = calloc(1, sizeof(I830Rec)); + int i; { int dummy = ctx->shared.virtualWidth; @@ -885,6 +1201,15 @@ static int i830InitFBDev( DRIDriverContext *ctx ) } ctx->shared.virtualWidth = dummy; + ctx->shared.Width = ctx->shared.virtualWidth; + } + + + for (i = 0; pitches[i] != 0; i++) { + if (pitches[i] >= ctx->shared.virtualWidth) { + ctx->shared.virtualWidth = pitches[i]; + break; + } } ctx->driverPrivate = (void *)pI830; |