Index: via_context.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_context.c,v retrieving revision 1.12 diff -u -r1.12 via_context.c --- via_context.c 13 Oct 2004 22:36:26 -0000 1.12 +++ via_context.c 27 Nov 2004 22:56:07 -0000 @@ -326,7 +326,7 @@ #ifdef DEBUG if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); #endif - if (vmesa->dma[0].map && vmesa->dma[1].map) + if (vmesa->dma) via_free_dma_buffer(vmesa); if (!via_alloc_dma_buffer(vmesa)) { @@ -350,22 +350,15 @@ { GLuint *addr; - addr = (GLuint *)vmesa->dma[0].map; - *addr = 0xF210F110; - *addr = (HC_ParaType_NotTex << 16); - *addr = 0xcccccccc; - *addr = 0xdddddddd; - - addr = (GLuint *)vmesa->dma[1].map; + addr = (GLuint *)vmesa->dma; *addr = 0xF210F110; *addr = (HC_ParaType_NotTex << 16); *addr = 0xcccccccc; *addr = 0xdddddddd; - vmesa->dmaIndex = 0; vmesa->dmaLow = DMA_OFFSET; - vmesa->dmaHigh = vmesa->dma[0].size; - vmesa->dmaAddr = (unsigned char *)vmesa->dma[0].map; + vmesa->dmaHigh = VIA_DMA_BUFSIZ; + vmesa->dmaAddr = (unsigned char *)vmesa->dma; vmesa->dmaLastPrim = vmesa->dmaLow; } @@ -381,7 +374,7 @@ if (vmesa->depth.map) via_free_depth_buffer(vmesa); - if (vmesa->dma[0].map && vmesa->dma[1].map) + if (vmesa->dma) via_free_dma_buffer(vmesa); } @@ -534,9 +527,6 @@ vmesa->CurrentTexObj[0] = 0; vmesa->CurrentTexObj[1] = 0; - vmesa->dma[0].size = DMA_SIZE * 1024 * 1024; - vmesa->dma[1].size = DMA_SIZE * 1024 * 1024; - _math_matrix_ctr(&vmesa->ViewportMatrix); driInitExtensions( ctx, card_extensions, GL_TRUE ); @@ -640,35 +630,13 @@ viaDestroyContext(__DRIcontextPrivate *driContextPriv) { viaContextPtr vmesa = (viaContextPtr)driContextPriv->driverPrivate; - /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/ - __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; - viaScreenPrivate *viaScreen = (viaScreenPrivate *)sPriv->private; #ifdef DEBUG if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); #endif assert(vmesa); /* should never be null */ viaFlushPrimsLocked(vmesa); WAIT_IDLE - /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/ - /* Enable VQ */ - if (viaScreen->VQEnable) { - *vmesa->regTranSet = 0x00fe0000; - *vmesa->regTranSet = 0x00fe0000; - *vmesa->regTranSpace = 0x00000006; - *vmesa->regTranSpace = 0x40008c0f; - *vmesa->regTranSpace = 0x44000000; - *vmesa->regTranSpace = 0x45080c04; - *vmesa->regTranSpace = 0x46800408; - } if (vmesa) { - /*=* John Sheng [2003.5.31] flip *=*/ - if(vmesa->doPageFlip) { - *((volatile GLuint *)((GLuint)vmesa->regMMIOBase + 0x43c)) = 0x00fe0000; - *((volatile GLuint *)((GLuint)vmesa->regMMIOBase + 0x440)) = 0x00001004; - WAIT_IDLE - *((volatile GLuint *)((GLuint)vmesa->regMMIOBase + 0x214)) = 0; - } - /*=* John Sheng [2003.5.31] agp tex *=*/ if(VIA_DEBUG) fprintf(stderr, "agpFullCount = %d\n", agpFullCount); _swsetup_DestroyContext(vmesa->glCtx); Index: via_context.h =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_context.h,v retrieving revision 1.8 diff -u -r1.8 via_context.h --- via_context.h 8 Oct 2004 01:15:52 -0000 1.8 +++ via_context.h 27 Nov 2004 22:56:07 -0000 @@ -69,7 +69,8 @@ #define VIA_UPLOAD_DEPTHBUFFER 0x0800 #define VIA_UPLOAD_ENABLE 0x0800 #define VIA_UPLOAD_ALL 0x1000 - + +#define VIA_DMA_BUFSIZ 512000 /* Use the templated vertex formats: */ #define TAG(x) via##x @@ -121,7 +122,7 @@ GLboolean hasAccum; GLuint depthBits; GLuint stencilBits; - viaDmaBuffer dma[2]; + GLuint *dma; viaRegion tex; GLuint isAGP; @@ -157,7 +158,6 @@ /* drmBufPtr dma_buffer; */ unsigned char* dmaAddr; - GLuint dmaIndex; GLuint dmaLow; GLuint dmaHigh; GLuint dmaLastPrim; @@ -297,8 +297,6 @@ volatile GLuint* regTranSpace; GLuint* agpBase; GLuint drawType; - /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/ - int VQEnable; }; /*#define DMA_OFFSET 16*/ #define DMA_OFFSET 32 Index: via_fb.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_fb.c,v retrieving revision 1.2 diff -u -r1.2 via_fb.c --- via_fb.c 23 Feb 2004 21:07:12 -0000 1.2 +++ via_fb.c 27 Nov 2004 22:56:07 -0000 @@ -27,6 +27,7 @@ #include "via_context.h" #include "via_ioctl.h" #include "via_fb.h" +#include "xf86drm.h" #include GLboolean @@ -170,101 +171,34 @@ GLboolean via_alloc_dma_buffer(viaContextPtr vmesa) { - drm_via_mem_t fb; - drmVIADMABuf dma; + drmVIADMAInit init; + #ifdef DEBUG if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); #endif - if (vmesa->viaScreen->agpLinearStart) { - /* Allocate DMA in AGP memory*/ - fb.context = vmesa->hHWContext; - fb.size = vmesa->dma[0].size; - fb.type = AGP; - if (!ioctl(vmesa->driFd, DRM_IOCTL_VIA_ALLOCMEM, &fb)) { - vmesa->dma[0].offset = fb.offset; - vmesa->dma[0].index = fb.index; - vmesa->dma[0].map = (unsigned char *)((GLuint)vmesa->viaScreen->agpLinearStart + fb.offset); - if (!ioctl(vmesa->driFd, DRM_IOCTL_VIA_ALLOCMEM, &fb)) { - vmesa->dma[1].offset = fb.offset; - vmesa->dma[1].index = fb.index; - vmesa->dma[1].map = (unsigned char *)((GLuint)vmesa->viaScreen->agpLinearStart + fb.offset); - vmesa->useAgp = GL_TRUE; - - return GL_TRUE; - } - else { - /* release dma[0]*/ - return GL_FALSE; - } - } - return GL_FALSE; - } - else { - /* Allocate DMA in System memory */ - dma.size = vmesa->dma[0].size; + vmesa->dma = (GLuint *) malloc(VIA_DMA_BUFSIZ); + init.func = VIA_DMA_INITIALIZED; - if (drmVIAAllocateDMA(vmesa->driFd,&dma) < 0) { - return GL_FALSE; - } - - vmesa->dma[0].offset = 0; - vmesa->dma[0].map = (unsigned char *)dma.address; - vmesa->dma[0].index = dma.index; - - drmVIAAllocateDMA(vmesa->driFd, &dma); - - vmesa->dma[1].offset = 0; - vmesa->dma[1].map = (unsigned char *)dma.address; - vmesa->dma[1].index = dma.index; - vmesa->useAgp = GL_FALSE; - - return GL_TRUE; - } + vmesa->useAgp = + ( 0 == drmCommandWrite(vmesa->driFd, DRMCMD_VIA_DMA_INIT, + &init, sizeof(init))); + if (vmesa->useAgp) + printf("Using AGP\n"); + else + printf("Using PCI\n"); + #ifdef DEBUG if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); #endif + return ((vmesa->dma) ? GL_TRUE : GL_FALSE); } void via_free_dma_buffer(viaContextPtr vmesa) { - drmVIADMABuf dma; - drm_via_mem_t fb; - - if (!vmesa) return; - - /* Release AGP command buffer */ - if (vmesa->useAgp) { - fb.context = vmesa->hHWContext; - fb.index = vmesa->dma[0].index; - fb.type = AGP; - ioctl(vmesa->driFd, DRM_IOCTL_VIA_FREEMEM, &fb); - vmesa->dma[0].map = NULL; - fb.index = vmesa->dma[1].index; - ioctl(vmesa->driFd, DRM_IOCTL_VIA_FREEMEM, &fb); - vmesa->dma[1].map = NULL; - } - /* Release System command buffer */ - else { - /*=* John Sheng [2003.7.18] viewperf frames/sec *=*/ - /*dma.address = (unsigned long *)vmesa->dma[0].offset;*/ - dma.address = (unsigned long *)vmesa->dma[0].map; - /*=* John Sheng [2003.6.16] fix pci path *=*/ - dma.size = (unsigned int)vmesa->dma[0].size; - drmVIAReleaseDMA(vmesa->driFd, &dma); - /*=* John Sheng [2003.7.18] viewperf frames/sec *=*/ - /*dma.address = (unsigned long *)vmesa->dma[1].offset;*/ - dma.address = (unsigned long *)vmesa->dma[1].map; - /*=* John Sheng [2003.6.16] fix pci path *=*/ - dma.size = (unsigned int)vmesa->dma[1].size; - drmVIAReleaseDMA(vmesa->driFd, &dma); - /*=* John Sheng [2003.7.18] viewperf frames/sec *=*/ - /*vmesa->dma[0].offset = 0; - vmesa->dma[1].offset = 0;*/ - vmesa->dma[0].map = 0; - vmesa->dma[1].map = 0; - } + free(vmesa->dma); + vmesa->dma = 0; } GLboolean Index: via_ioctl.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_ioctl.c,v retrieving revision 1.6 diff -u -r1.6 via_ioctl.c --- via_ioctl.c 8 Oct 2004 01:15:52 -0000 1.6 +++ via_ioctl.c 27 Nov 2004 22:56:07 -0000 @@ -1,27 +1,4 @@ -#/* - * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. - * Copyright 2001-2003 S3 Graphics, Inc. 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 - * VIA, S3 GRAPHICS, AND/OR ITS 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. - */ -#include + #include #include "glheader.h" @@ -36,7 +13,9 @@ #include "via_state.h" #include "drm.h" +#include "xf86drm.h" #include +#include GLuint FrameCount = 0; GLuint dmaLow = 0; @@ -526,7 +505,6 @@ drm_clip_rect_t *pbox = (drm_clip_rect_t *)vmesa->pClipRects; int nbox = vmesa->numClipRects; drm_via_sarea_t *sarea = vmesa->sarea; - drm_via_flush_agp_t agpCmd; drm_via_flush_sys_t sysCmd; GLuint *vb = viaCheckDma(vmesa, 0); int i; @@ -534,7 +512,7 @@ if (vmesa->dmaLow == DMA_OFFSET) { return; } - if (vmesa->dmaLow > 2097152) + if (vmesa->dmaLow > (VIA_DMA_BUFSIZ - 256)) fprintf(stderr, "buffer overflow in Flush Prims = %d\n",vmesa->dmaLow); switch (vmesa->dmaLow & 0x1F) { @@ -573,26 +551,15 @@ break; } - if (vmesa->useAgp) { - agpCmd.offset = 0x0; - agpCmd.size = vmesa->dmaLow; - agpCmd.index = vmesa->dma[vmesa->dmaIndex].index; - agpCmd.discard = 0; - } - else { - sysCmd.offset = 0x0; - sysCmd.size = vmesa->dmaLow; - sysCmd.index = (GLuint)vmesa->dma[vmesa->dmaIndex].map; - sysCmd.discard = 0; - } + sysCmd.offset = 0x0; + sysCmd.size = vmesa->dmaLow; + sysCmd.index = (GLuint)vmesa->dma; + sysCmd.discard = 0; sarea->vertexPrim = vmesa->hwPrimitive; if (!nbox) { - if (vmesa->useAgp) - agpCmd.size = 0; - else - sysCmd.size = 0; + sysCmd.size = 0; } else if (nbox > VIA_NR_SAREA_CLIPRECTS) { vmesa->uploadCliprects = GL_TRUE; @@ -617,14 +584,8 @@ else sarea->nbox = nbox; - if (vmesa->useAgp) { - agpCmd.discard = 1; - flush_agp(vmesa, &agpCmd); - } - else { - sysCmd.discard = 1; - flush_sys(vmesa, &sysCmd); - } + sysCmd.discard = 1; + flush_sys(vmesa, &sysCmd); } else { GLuint scrn; @@ -652,7 +613,7 @@ } if (!sarea->nbox) { if (nr < nbox) continue; - agpCmd.size = 0; + sysCmd.size = 0; } } else { @@ -680,7 +641,7 @@ } if (!sarea->nbox) { if (nr < nbox) continue; - agpCmd.size = 0; + sysCmd.size = 0; } } else { @@ -711,7 +672,7 @@ } if (!sarea->nbox) { if (nr < nbox) continue; - agpCmd.size = 0; + sysCmd.size = 0; } } else { @@ -726,14 +687,8 @@ } if (nr == nbox) { - if (vmesa->useAgp) { - agpCmd.discard = 1; - flush_agp(vmesa, &agpCmd); - } - else { - sysCmd.discard = 1; - flush_sys(vmesa, &sysCmd); - } + sysCmd.discard = 1; + flush_sys(vmesa, &sysCmd); } if (scrn == (S0 | S1)) { @@ -757,7 +712,7 @@ } if (!sarea->nbox) { if (nr < nbox) continue; - agpCmd.size = 0; + sysCmd.size = 0; } } else { @@ -770,7 +725,7 @@ } } } - flush_agp_saam(vmesa, &agpCmd); + flush_sys(vmesa, &sysCmd); } } } @@ -790,18 +745,9 @@ /* Reset vmesa vars: */ vmesa->dmaLow = DMA_OFFSET; - if (vmesa->dmaIndex) { - vmesa->dmaAddr = vmesa->dma[0].map; - vmesa->dmaHigh = vmesa->dma[0].size; - vmesa->dmaLastPrim = DMA_OFFSET; - vmesa->dmaIndex = 0; - } - else { - vmesa->dmaAddr = vmesa->dma[1].map; - vmesa->dmaHigh = vmesa->dma[1].size; - vmesa->dmaLastPrim = DMA_OFFSET; - vmesa->dmaIndex = 1; - } + vmesa->dmaAddr = (unsigned char *)vmesa->dma; + vmesa->dmaHigh = VIA_DMA_BUFSIZ; + vmesa->dmaLastPrim = DMA_OFFSET; } void viaFlushPrims(viaContextPtr vmesa) @@ -810,9 +756,9 @@ if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__); #endif if (vmesa->dmaLow) { - LOCK_HARDWARE(vmesa); + LOCK_HARDWARE(vmesa); viaFlushPrimsLocked(vmesa); - UNLOCK_HARDWARE(vmesa); + UNLOCK_HARDWARE(vmesa); } #ifdef DEBUG if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__); @@ -1436,504 +1382,16 @@ } -int flush_agp(viaContextPtr vmesa, drm_via_flush_agp_t* agpCmd) -{ - GLuint *pnAGPCurrentPhysStart; - GLuint *pnAGPCurrentPhysEnd; - GLuint *pnAGPCurrentStart; - GLuint *pnAGPCurrentEnd; - volatile GLuint *pnMMIOBase; - volatile GLuint *pnEngBaseTranSet; - volatile GLuint *pnEngBaseTranSpace; - GLuint *agpBase; - GLuint ofs = vmesa->dma[vmesa->dmaIndex].offset; - GLuint *vb = (GLuint *)vmesa->dmaAddr; - GLuint i = 0; - - pnMMIOBase = vmesa->regMMIOBase; - pnEngBaseTranSet = vmesa->regTranSet; - pnEngBaseTranSpace = vmesa->regTranSpace; - *pnEngBaseTranSet = (0x0010 << 16); - agpBase = vmesa->agpBase; - - if (!agpCmd->size) { - return -1; - } - - { - volatile GLuint *pnEngBase = vmesa->regEngineStatus; - int nStatus; - - while (1) { - nStatus = *pnEngBase; - if ((nStatus & 0xFFFEFFFF) == 0x00020000) - break; - i++; - } - } - - pnAGPCurrentStart = (GLuint *)(ofs + agpCmd->offset); - pnAGPCurrentEnd = (GLuint *)((GLuint)pnAGPCurrentStart + vmesa->dmaHigh); - pnAGPCurrentPhysStart = (GLuint *)( (GLuint)pnAGPCurrentStart + (GLuint)agpBase ); - pnAGPCurrentPhysEnd = (GLuint *)( (GLuint)pnAGPCurrentEnd + (GLuint)agpBase ); - - /*=* [DBG] make draw to front buffer *=*/ - if(DRAW_FRONT) - vmesa->glCtx->Color._DrawDestMask[0] = __GL_FRONT_BUFFER_MASK; - - if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) { - - *vb++ = HC_HEADER2; - *vb++ = (HC_ParaType_NotTex << 16); - if (vmesa->driDrawable->w == 0 || vmesa->driDrawable->h == 0) { - *vb++ = (HC_SubA_HClipTB << 24) | 0x0; - *vb++ = (HC_SubA_HClipLR << 24) | 0x0; - } - else { - *vb++ = ((HC_SubA_HClipTB << 24) | (0x0 << 12) | vmesa->driDrawable->h); - *vb++ = ((HC_SubA_HClipLR << 24) | (vmesa->drawXoff << 12) | (vmesa->driDrawable->w + vmesa->drawXoff)); - } - - { - GLuint pitch, format, offset; - - if (vmesa->viaScreen->bitsPerPixel == 0x20) { - format = HC_HDBFM_ARGB8888; - } - else if (vmesa->viaScreen->bitsPerPixel == 0x10) { - format = HC_HDBFM_RGB565; - } - else - { - return -1; - } - - offset = vmesa->back.offset; - pitch = vmesa->back.pitch; - - *vb++ = ((HC_SubA_HDBBasL << 24) | (offset & 0xFFFFFF)); - *vb++ = ((HC_SubA_HDBBasH << 24) | ((offset & 0xFF000000)) >> 24); - *vb++ = ((HC_SubA_HDBFM << 24) | HC_HDBLoc_Local | format | pitch); - *vb++ = 0xcccccccc; - } - - *pnEngBaseTranSpace = (HC_SubA_HAGPBstL << 24) | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFFFFFF); - *pnEngBaseTranSpace = (HC_SubA_HAGPBendL << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFFFFFF); - *pnEngBaseTranSpace = (HC_SubA_HAGPCMNT << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFF000000) >> 16 | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFF000000) >> 24; - *pnEngBaseTranSpace = (HC_SubA_HAGPBpH << 24) | - ((GLuint)((GLbyte *)pnAGPCurrentPhysStart + agpCmd->size - 4) & 0xFF000000) >> 24; - *pnEngBaseTranSpace = (HC_SubA_HAGPBpL << 24) | - ((GLuint)((GLbyte *)pnAGPCurrentPhysStart + agpCmd->size - 4) & 0xFFFFFF) | - HC_HAGPBpID_STOP; - *pnEngBaseTranSpace = (HC_SubA_HAGPCMNT << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFF000000) >> 16 | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFF000000) >> 24 | - HC_HAGPCMNT_MASK; - } - else { - GLuint *head; - GLuint clipL, clipR, clipT, clipB; - drm_clip_rect_t *b = vmesa->sarea->boxes; - *vb++ = HC_HEADER2; - *vb++ = (HC_ParaType_NotTex << 16); - head = vb; - - *pnEngBaseTranSpace = (HC_SubA_HAGPBstL << 24) | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFFFFFF); - *pnEngBaseTranSpace = (HC_SubA_HAGPBendL << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFFFFFF); - *pnEngBaseTranSpace = (HC_SubA_HAGPCMNT << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFF000000) >> 16 | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFF000000) >> 24; - *pnEngBaseTranSpace = (HC_SubA_HAGPBpH << 24) | - ((GLuint)((GLbyte *)pnAGPCurrentPhysStart + agpCmd->size - 4) & 0xFF000000) >> 24; - *pnEngBaseTranSpace = (HC_SubA_HAGPBpL << 24) | - ((GLuint)((GLbyte *)pnAGPCurrentPhysStart + agpCmd->size - 4) & 0xFFFFFF) | - HC_HAGPBpID_STOP; - - for (i = 0; i < vmesa->sarea->nbox; i++) { - if (1) { - volatile GLuint *pnEngBase = vmesa->regEngineStatus; - int nStatus; - - while (1) { - nStatus = *pnEngBase; - if ((nStatus & 0xFFFEFFFF) == 0x00020000) - break; - } - } - - clipL = b->x1 + vmesa->drawXoff; - clipR = b->x2; - clipT = b->y1; - clipB = b->y2; -#ifdef DEBUG - if (VIA_DEBUG) fprintf(stderr, "clip = %d\n", i); -#endif - if (vmesa->driDrawable->w == 0 || vmesa->driDrawable->h == 0) { - - *vb = (HC_SubA_HClipTB << 24) | 0x0; - vb++; - - *vb = (HC_SubA_HClipLR << 24) | 0x0; - vb++; - } - else { - *vb = (HC_SubA_HClipTB << 24) | (clipT << 12) | clipB; - vb++; - - *vb = (HC_SubA_HClipLR << 24) | (clipL << 12) | clipR; - vb++; - } - - { - GLuint pitch, format, offset; - GLuint bytePerPixel = vmesa->viaScreen->bitsPerPixel >> 3; - - if (vmesa->viaScreen->bitsPerPixel == 0x20) { - format = HC_HDBFM_ARGB8888; - } - else if (vmesa->viaScreen->bitsPerPixel == 0x10) { - format = HC_HDBFM_RGB565; - } - else - return -1; - - pitch = vmesa->front.pitch; - offset = vmesa->viaScreen->fbOffset + (vmesa->drawY * pitch + vmesa->drawX * bytePerPixel); - offset = offset & 0xffffffe0; - - *vb++ = ((HC_SubA_HDBBasL << 24) | (offset & 0xFFFFFF)); - *vb++ = ((HC_SubA_HDBBasH << 24) | ((offset & 0xFF000000)) >> 24); - *vb++ = ((HC_SubA_HDBFM << 24) | HC_HDBLoc_Local | format | pitch); - *vb++ = 0xcccccccc; - } - *pnEngBaseTranSpace = (HC_SubA_HAGPCMNT << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFF000000) >> 16 | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFF000000) >> 24 | - HC_HAGPCMNT_MASK; -#ifdef DEBUG - if (VIA_DEBUG) { - GLuint i; - GLuint *data = (GLuint *)vmesa->dmaAddr; - for (i = 0; i < vmesa->dmaLow; i += 16) { - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x\n", *data++); - } - fprintf(stderr, "******************************************\n"); - } -#endif - b++; - vb = head; - } - } - -#ifdef DEBUG - if (VIA_DEBUG) { - volatile GLuint *pnEngBase = (volatile GLuint *)((GLuint)pnMMIOBase + 0x400); - int nStatus; - int i = 0; - - while (1) { - nStatus = *pnEngBase; - if ((nStatus & 0xFFFEFFFF) == 0x00020000) { - break; - } - else { - GLuint j; - GLuint *data; - /* dump current command buffer */ - data = (GLuint *)vmesa->dmaAddr; - - if (i == 500000) { - fprintf(stderr, "current command buffer"); - fprintf(stderr, "i = %d\n", i); - for (j = 0; j < vmesa->dmaLow; j += 16) { - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x\n", *data++); - } - } - /* dump previous command buffer */ - if (vmesa->dmaIndex) { - data = (GLuint *)vmesa->dma[0].map; - } - else { - data = (GLuint *)vmesa->dma[1].map; - } - if (i == 500000) { - fprintf(stderr, "previous command buffer"); - fprintf(stderr, "i = %d\n", i); - for (j = 0; j < dmaLow; j += 16) { - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x\n", *data++); - } - } - } - i++; - } - } -#endif - dmaLow = vmesa->dmaLow; - return 0; -} - -int flush_agp_saam(viaContextPtr vmesa, drm_via_flush_agp_t* agpCmd) -{ - GLuint *pnAGPCurrentPhysStart; - GLuint *pnAGPCurrentPhysEnd; - GLuint *pnAGPCurrentStart; - GLuint *pnAGPCurrentEnd; - volatile GLuint *pnMMIOBase; - volatile GLuint *pnEngBaseTranSet; - volatile GLuint *pnEngBaseTranSpace; - GLuint *agpBase; - GLuint ofs = vmesa->dma[vmesa->dmaIndex].offset; - GLuint *vb = (GLuint *)vmesa->dmaAddr; - GLuint i = 0; - - pnMMIOBase = vmesa->regMMIOBase; - pnEngBaseTranSet = vmesa->regTranSet; - pnEngBaseTranSpace = vmesa->regTranSpace; - *pnEngBaseTranSet = (0x0010 << 16); - agpBase = vmesa->agpBase; - - if (!agpCmd->size) { - return -1; - } - - { - volatile GLuint *pnEngBase = vmesa->regEngineStatus; - int nStatus; - - while (1) { - nStatus = *pnEngBase; - if ((nStatus & 0xFFFEFFFF) == 0x00020000) - break; - i++; - } - } - - pnAGPCurrentStart = (GLuint *)(ofs + agpCmd->offset); - pnAGPCurrentEnd = (GLuint *)((GLuint)pnAGPCurrentStart + vmesa->dmaHigh); - pnAGPCurrentPhysStart = (GLuint *)( (GLuint)pnAGPCurrentStart + (GLuint)agpBase ); - pnAGPCurrentPhysEnd = (GLuint *)( (GLuint)pnAGPCurrentEnd + (GLuint)agpBase ); - - /*=* [DBG] make draw to front buffer *=*/ - if(DRAW_FRONT) - vmesa->glCtx->Color._DrawDestMask[0] = __GL_FRONT_BUFFER_MASK; - - if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) { - - *vb++ = HC_HEADER2; - *vb++ = (HC_ParaType_NotTex << 16); - if (vmesa->driDrawable->w == 0 || vmesa->driDrawable->h == 0) { - *vb++ = (HC_SubA_HClipTB << 24) | 0x0; - *vb++ = (HC_SubA_HClipLR << 24) | 0x0; - } - else { - *vb++ = ((HC_SubA_HClipTB << 24) | (0x0 << 12) | vmesa->driDrawable->h); - *vb++ = ((HC_SubA_HClipLR << 24) | (vmesa->drawXoff << 12) | (vmesa->driDrawable->w + vmesa->drawXoff)); - } - - { - GLuint pitch, format, offset; - - if (vmesa->viaScreen->bitsPerPixel == 0x20) { - format = HC_HDBFM_ARGB8888; - } - else if (vmesa->viaScreen->bitsPerPixel == 0x10) { - format = HC_HDBFM_RGB565; - } - else - return -1; - - offset = vmesa->back.offset; - pitch = vmesa->back.pitch; - - *vb++ = ((HC_SubA_HDBBasL << 24) | (offset & 0xFFFFFF)); - *vb++ = ((HC_SubA_HDBBasH << 24) | ((offset & 0xFF000000)) >> 24); - *vb++ = ((HC_SubA_HDBFM << 24) | HC_HDBLoc_Local | format | pitch); - *vb++ = 0xcccccccc; - } - - *pnEngBaseTranSpace = (HC_SubA_HAGPBstL << 24) | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFFFFFF); - *pnEngBaseTranSpace = (HC_SubA_HAGPBendL << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFFFFFF); - *pnEngBaseTranSpace = (HC_SubA_HAGPCMNT << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFF000000) >> 16 | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFF000000) >> 24; - *pnEngBaseTranSpace = (HC_SubA_HAGPBpH << 24) | - ((GLuint)((GLbyte *)pnAGPCurrentPhysStart + agpCmd->size - 4) & 0xFF000000) >> 24; - *pnEngBaseTranSpace = (HC_SubA_HAGPBpL << 24) | - ((GLuint)((GLbyte *)pnAGPCurrentPhysStart + agpCmd->size - 4) & 0xFFFFFF) | - HC_HAGPBpID_STOP; - *pnEngBaseTranSpace = (HC_SubA_HAGPCMNT << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFF000000) >> 16 | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFF000000) >> 24 | - HC_HAGPCMNT_MASK; - } - else { - GLuint *head; - GLuint clipL, clipR, clipT, clipB; - drm_clip_rect_t *b = vmesa->sarea->boxes; - *vb++ = HC_HEADER2; - *vb++ = (HC_ParaType_NotTex << 16); - head = vb; - - *pnEngBaseTranSpace = (HC_SubA_HAGPBstL << 24) | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFFFFFF); - *pnEngBaseTranSpace = (HC_SubA_HAGPBendL << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFFFFFF); - *pnEngBaseTranSpace = (HC_SubA_HAGPCMNT << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFF000000) >> 16 | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFF000000) >> 24; - *pnEngBaseTranSpace = (HC_SubA_HAGPBpH << 24) | - ((GLuint)((GLbyte *)pnAGPCurrentPhysStart + agpCmd->size - 4) & 0xFF000000) >> 24; - *pnEngBaseTranSpace = (HC_SubA_HAGPBpL << 24) | - ((GLuint)((GLbyte *)pnAGPCurrentPhysStart + agpCmd->size - 4) & 0xFFFFFF) | - HC_HAGPBpID_STOP; - - for (i = 0; i < vmesa->sarea->nbox; i++) { - if (1) { - volatile GLuint *pnEngBase = vmesa->regEngineStatus; - int nStatus; - - while (1) { - nStatus = *pnEngBase; - if ((nStatus & 0xFFFEFFFF) == 0x00020000) - break; - } - } - - clipL = b->x1 + vmesa->drawXoff; - clipR = b->x2; - clipT = b->y1; - clipB = b->y2; -#ifdef DEBUG - if (VIA_DEBUG) fprintf(stderr, "clip = %d\n", i); -#endif - if (vmesa->driDrawable->w == 0 || vmesa->driDrawable->h == 0) { - - *vb = (HC_SubA_HClipTB << 24) | 0x0; - vb++; - - *vb = (HC_SubA_HClipLR << 24) | 0x0; - vb++; - } - else { - *vb = (HC_SubA_HClipTB << 24) | (clipT << 12) | clipB; - vb++; - - *vb = (HC_SubA_HClipLR << 24) | (clipL << 12) | clipR; - vb++; - } - - { - GLuint pitch, format, offset; - GLuint bytePerPixel = vmesa->viaScreen->bitsPerPixel >> 3; - - if (vmesa->viaScreen->bitsPerPixel == 0x20) { - format = HC_HDBFM_ARGB8888; - } - else if (vmesa->viaScreen->bitsPerPixel == 0x10) { - format = HC_HDBFM_RGB565; - } - else - return -1; - - pitch = vmesa->front.pitch; - offset = vmesa->viaScreen->fbOffset + (vmesa->drawY * pitch + vmesa->drawX * bytePerPixel); - offset = offset & 0xffffffe0; - - *vb++ = ((HC_SubA_HDBBasL << 24) | (offset & 0xFFFFFF)); - *vb++ = ((HC_SubA_HDBBasH << 24) | ((offset & 0xFF000000)) >> 24); - *vb++ = ((HC_SubA_HDBFM << 24) | HC_HDBLoc_Local | format | pitch); - *vb++ = 0xcccccccc; - } - *pnEngBaseTranSpace = (HC_SubA_HAGPCMNT << 24) | - ((GLuint)(pnAGPCurrentPhysEnd) & 0xFF000000) >> 16 | - ((GLuint)(pnAGPCurrentPhysStart) & 0xFF000000) >> 24 | - HC_HAGPCMNT_MASK; -#ifdef DEBUG - if (VIA_DEBUG) { - GLuint i; - GLuint *data = (GLuint *)vmesa->dmaAddr; - for (i = 0; i < vmesa->dmaLow; i += 16) { - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x\n", *data++); - } - fprintf(stderr, "******************************************\n"); - } -#endif - b++; - vb = head; - } - } - -#ifdef DEBUG - if (VIA_DEBUG) { - volatile GLuint *pnEngBase = (GLuint *)((GLuint)pnMMIOBase + 0x400); - int nStatus; - int i = 0; - - while (1) { - nStatus = *pnEngBase; - if ((nStatus & 0xFFFEFFFF) == 0x00020000) { - break; - } - else { - GLuint j; - GLuint *data; - /* dump current command buffer */ - data = (GLuint *)vmesa->dmaAddr; - - if (i == 500000) { - fprintf(stderr, "current command buffer"); - fprintf(stderr, "i = %d\n", i); - for (j = 0; j < vmesa->dmaLow; j += 16) { - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x\n", *data++); - } - } - /* dump previous command buffer */ - if (vmesa->dmaIndex) { - data = (GLuint *)vmesa->dma[0].map; - } - else { - data = (GLuint *)vmesa->dma[1].map; - } - if (i == 500000) { - fprintf(stderr, "previous command buffer"); - fprintf(stderr, "i = %d\n", i); - for (j = 0; j < dmaLow; j += 16) { - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x ", *data++); - fprintf(stderr, "%08x\n", *data++); - } - } - } - i++; - } - } -#endif - dmaLow = vmesa->dmaLow; - return 0; +static void wait_reg_idle(viaContextPtr vmesa) +{ + volatile GLuint *pnEngBase = vmesa->regEngineStatus; + int nStatus; + + while (1) { + nStatus = *pnEngBase; + if ((nStatus & 0xFFFEFFFF) == 0x00020000) + break; + } } int flush_sys(viaContextPtr vmesa, drm_via_flush_sys_t* buf) @@ -1942,16 +1400,12 @@ GLuint *pnBuf; GLuint *pnEnd; volatile GLuint *pnMMIOBase; - volatile GLuint *pnEngBaseTranSet; - volatile GLuint *pnEngBaseTranSpace; - GLuint uCheck2DCmd = GL_TRUE; - GLuint addr; GLuint *vb = (GLuint *)vmesa->dmaAddr; GLuint i = 0; + drmVIACommandBuffer bufI; + int ret; pnMMIOBase = vmesa->regMMIOBase; - pnEngBaseTranSet = vmesa->regTranSet; - pnEngBaseTranSpace = vmesa->regTranSpace; pnBuf = (GLuint *)(buf->index + buf->offset); pnEnd = (GLuint *)((GLuint)pnBuf + buf->size); @@ -1960,37 +1414,11 @@ if(DRAW_FRONT) vmesa->glCtx->Color._DrawDestMask[0] = __GL_FRONT_BUFFER_MASK; - - /*=* John Sheng [2003.6.20] fix pci *=*/ - { - volatile GLuint *pnEngBase = vmesa->regEngineStatus; - int nStatus; - - while (1) { - nStatus = *pnEngBase; - if ((nStatus & 0xFFFEFFFF) == 0x00020000) - break; - i++; - } - } - /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/ - /*=* Disable VQ *=*/ - if (vmesa->VQEnable) - { - WAIT_IDLE - *vmesa->regTranSet = 0x00fe0000; - *vmesa->regTranSet = 0x00fe0000; - *vmesa->regTranSpace = 0x00000004; - *vmesa->regTranSpace = 0x40008c0f; - *vmesa->regTranSpace = 0x44000000; - *vmesa->regTranSpace = 0x45080c04; - *vmesa->regTranSpace = 0x46800408; - vmesa->VQEnable = 0; - } if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) { + wait_reg_idle(vmesa); *vb++ = HC_HEADER2; *vb++ = (HC_ParaType_NotTex << 16); - + if (vmesa->driDrawable->w == 0 || vmesa->driDrawable->h == 0) { *vb++ = (HC_SubA_HClipTB << 24) | 0x0; *vb++ = (HC_SubA_HClipLR << 24) | 0x0; @@ -2022,38 +1450,20 @@ *vb++ = 0xcccccccc; } - while (pnBuf != pnEnd) { - if (*pnBuf == HALCYON_HEADER2) { - pnBuf++; - if (*pnBuf == HALCYON_SUB_ADDR0) { - *pnEngBaseTranSet = *pnBuf; - pnBuf++; - uCheck2DCmd = GL_FALSE; - } - else { - *pnEngBaseTranSet = *pnBuf; - pnBuf++; - uCheck2DCmd = GL_TRUE; - } - } - else if (uCheck2DCmd && ((*pnBuf&HALCYON_HEADER1MASK)==HALCYON_HEADER1)) { - addr = ((*pnBuf)&0x0000001f) << 2; - pnBuf++; - *((GLuint*)((GLuint)pnMMIOBase+addr)) = *pnBuf; - pnBuf++; - } - else if ((*pnBuf&HALCYON_FIREMASK) == HALCYON_FIRECMD) { - *pnEngBaseTranSpace = *pnBuf; - pnBuf++; - if ((pnBuf!=pnEnd)&&((*pnBuf&HALCYON_FIREMASK)==HALCYON_FIRECMD)) - pnBuf++; - if ((*pnBuf&HALCYON_CMDBMASK) != HC_ACMD_HCmdB) - uCheck2DCmd = GL_TRUE; - } - else { - *pnEngBaseTranSpace = *pnBuf; - pnBuf++; - } + bufI.buf = (char *) pnBuf; + bufI.size = buf->size; + + /* + * If AGP is enabled, try it. Otherwise or if it fails, use PCI MMIO. + */ + + ret = 1; + if (vmesa->useAgp) { + while ( -EAGAIN == (ret = drmCommandWrite(vmesa->driFd, DRMCMD_VIA_CMDBUFFER, + &bufI, sizeof(bufI)))); + } + if (ret) { + drmCommandWrite(vmesa->driFd, DRMCMD_VIA_PCICMD, &bufI, sizeof(bufI)); } } else { @@ -2069,8 +1479,9 @@ pnTmp = pnBuf; for (i = 0; i < vmesa->sarea->nbox; i++) { + wait_reg_idle(vmesa); clipL = b->x1 + vmesa->drawXoff; - clipR = b->x2 + vmesa->drawXoff; + clipR = b->x2 + vmesa->drawXoff; /* FIXME: is this correct? */ clipT = b->y1; clipB = b->y2; @@ -2099,7 +1510,7 @@ format = HC_HDBFM_RGB565; } else - return -1; + return -1; pitch = vmesa->front.pitch; offset = vmesa->viaScreen->fbOffset + (vmesa->drawY * pitch + vmesa->drawX * bytePerPixel); @@ -2113,39 +1524,17 @@ pnBuf = pnTmp; - while (pnBuf != pnEnd) { - if (*pnBuf == HALCYON_HEADER2) { - pnBuf++; - if (*pnBuf == HALCYON_SUB_ADDR0) { - *pnEngBaseTranSet = *pnBuf; - pnBuf++; - uCheck2DCmd = GL_FALSE; - } - else { - *pnEngBaseTranSet = *pnBuf; - pnBuf++; - uCheck2DCmd = GL_TRUE; - } - } - else if (uCheck2DCmd && ((*pnBuf&HALCYON_HEADER1MASK)==HALCYON_HEADER1)) { - addr = ((*pnBuf)&0x0000001f) << 2; - pnBuf++; - *((GLuint*)((GLuint)pnMMIOBase+addr)) = *pnBuf; - pnBuf++; - } - else if ((*pnBuf&HALCYON_FIREMASK) == HALCYON_FIRECMD) { - *pnEngBaseTranSpace = *pnBuf; - pnBuf++; - if ((pnBuf!=pnEnd)&&((*pnBuf&HALCYON_FIREMASK)==HALCYON_FIRECMD)) - pnBuf++; - if ((*pnBuf&HALCYON_CMDBMASK) != HC_ACMD_HCmdB) - uCheck2DCmd = GL_TRUE; - } - else { - *pnEngBaseTranSpace = *pnBuf; - pnBuf++; - } + bufI.buf = (char *) pnBuf; + bufI.size = buf->size; + ret = 1; + if (vmesa->useAgp) { + while ( -EAGAIN == (ret = drmCommandWrite(vmesa->driFd, DRMCMD_VIA_CMDBUFFER, + &bufI, sizeof(bufI)))); } + if (ret) { + drmCommandWrite(vmesa->driFd, DRMCMD_VIA_PCICMD, &bufI, sizeof(bufI)); + } + b++; vb = head; } @@ -2164,7 +1553,6 @@ else { GLuint j; GLuint *data; - /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/ GLuint k; GLuint *ES; @@ -2172,7 +1560,6 @@ ES = pnEngBase; if (i == 500000) { - /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/ for (k =0 ; k < 35; k++) { fprintf(stderr, "%02xh - %02xh\n", k*4 + 3, k*4); fprintf(stderr, "%08x\n", *ES); @@ -2187,12 +1574,7 @@ fprintf(stderr, "%08x\n", *data++); } } - if (vmesa->dmaIndex) { - data = (GLuint *)vmesa->dma[0].map; - } - else { - data = (GLuint *)vmesa->dma[1].map; - } + data = (GLuint *)vmesa->dma; if (i == 500000) { fprintf(stderr, "previous command buffer"); fprintf(stderr, "i = %d\n", i); Index: via_render.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_render.c,v retrieving revision 1.3 diff -u -r1.3 via_render.c --- via_render.c 1 Jul 2004 13:14:06 -0000 1.3 +++ via_render.c 27 Nov 2004 22:56:08 -0000 @@ -179,7 +179,7 @@ tnl->Driver.Render.Finish(ctx); /*=* DBG - viewperf7.0 : fix command buffer overflow *=*/ - if (vmesa->dmaLow > (vmesa->dma[0].size / 2)) + if (vmesa->dmaLow > (VIA_DMA_BUFSIZ / 2)) viaFlushPrims(vmesa); #ifdef DEBUG if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); @@ -468,7 +468,7 @@ }*/ /*=* DBG viewperf7.0 : fix command buffer overflow *=*/ - if (vmesa->dmaLow > (vmesa->dma[0].size / 2)) + if (vmesa->dmaLow > (VIA_DMA_BUFSIZ / 2)) viaFlushPrims(vmesa); #ifdef DEBUG if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); Index: via_screen.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_screen.c,v retrieving revision 1.7 diff -u -r1.7 via_screen.c --- via_screen.c 25 Nov 2004 14:05:05 -0000 1.7 +++ via_screen.c 27 Nov 2004 22:56:08 -0000 @@ -95,8 +95,6 @@ #ifdef USE_XINERAMA viaScreen->drixinerama = gDRIPriv->drixinerama; #endif - /*=* John Sheng [2003.12.9] Tuxracer & VQ *=*/ - viaScreen->VQEnable = gDRIPriv->VQEnable; #ifdef DEBUG if (VIA_DEBUG) { fprintf(stderr, "deviceID = %08x\n", viaScreen->deviceID); @@ -390,7 +388,7 @@ __DRIscreenPrivate *psp; static const __DRIversion ddx_expected = { 4, 0, 0 }; static const __DRIversion dri_expected = { 4, 0, 0 }; - static const __DRIversion drm_expected = { 2, 0, 0 }; + static const __DRIversion drm_expected = { 2, 1, 0 }; if ( ! driCheckDriDdxDrmVersions2( "Unichrome", dri_version, & dri_expected, Index: via_tex.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_tex.c,v retrieving revision 1.2 diff -u -r1.2 via_tex.c --- via_tex.c 23 Feb 2004 21:07:12 -0000 1.2 +++ via_tex.c 27 Nov 2004 22:56:08 -0000 @@ -253,7 +253,7 @@ if (vmesa) { /*=* John Sheng [2003.7.18] viewperf frames/sec *=*/ /*VIA_FIREVERTICES(vmesa);*/ - if (vmesa->dma[0].map) { /* imply vmesa is not under destroying */ + if (vmesa->dma) { /* imply vmesa is not under destroying */ VIA_FIREVERTICES(vmesa); } viaDestroyTexObj(vmesa, t); Index: via_tris.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/via_tris.c,v retrieving revision 1.3 diff -u -r1.3 via_tris.c --- via_tris.c 1 Jul 2004 13:14:06 -0000 1.3 +++ via_tris.c 27 Nov 2004 22:56:08 -0000 @@ -1614,7 +1614,7 @@ /*=* John Sheng [2003.6.20] fix pci *=*/ /*if (vmesa->dmaLow & 0x1) {*/ - if (vmesa->dmaLow & 0x1 || !vmesa->useAgp) { + if (vmesa->dmaLow & 0x1 || !vmesa->useAgp ) { *vb++ = cmdA ; vmesa->dmaLow += 4; } Index: xf86drmVIA.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/xf86drmVIA.c,v retrieving revision 1.3 diff -u -r1.3 xf86drmVIA.c --- xf86drmVIA.c 10 Jul 2004 17:09:57 -0000 1.3 +++ xf86drmVIA.c 27 Nov 2004 22:56:08 -0000 @@ -131,3 +131,13 @@ return 0; } + +int drmVIACmdBuffer(int fd, drmVIACommandBuffer *buf) +{ + if (ioctl(fd, 0x48, buf ) < 0) { + return -errno; + } + else + return 0; +} + Index: xf86drmVIA.h =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/unichrome/xf86drmVIA.h,v retrieving revision 1.1 diff -u -r1.1 xf86drmVIA.h --- xf86drmVIA.h 30 Jan 2004 23:26:19 -0000 1.1 +++ xf86drmVIA.h 27 Nov 2004 22:56:08 -0000 @@ -25,6 +25,11 @@ #ifndef __XF86DRI_VIA_H__ #define __XF86DRI_VIA_H__ +#define DRMCMD_VIA_DMA_INIT 0x07 +#define DRMCMD_VIA_CMDBUFFER 0x08 +#define DRMCMD_VIA_FLUSH 0x09 +#define DRMCMD_VIA_PCICMD 0x0A + typedef struct { unsigned long sarea_priv_offset; unsigned long fb_offset; @@ -45,10 +50,35 @@ unsigned long *address; } drmVIADMABuf; +typedef struct { + char *buf; + unsigned long size; +} drmVIACommandBuffer; + +typedef struct { + unsigned int offset; + unsigned int size; + unsigned long index; + int discard; /* client is finished with the buffer? */ +} drmVIAFlush; + +typedef struct{ + enum { + VIA_INIT_DMA = 0x01, + VIA_CLEANUP_DMA = 0x02, + VIA_DMA_INITIALIZED = 0x03 + } func; + + unsigned long offset; + unsigned long size; + unsigned long reg_pause_addr; +} drmVIADMAInit; + extern int drmVIAAgpInit(int fd, int offset, int size); extern int drmVIAFBInit(int fd, int offset, int size); extern int drmVIAInitMAP(int fd, drmVIAInit *info); extern int drmVIAAllocateDMA(int fd, drmVIADMABuf *buf); extern int drmVIAReleaseDMA(int fd, drmVIADMABuf *buf); + #endif