diff --git a/src/mesa/drivers/dri/unichrome/via_3d_reg.h b/src/mesa/drivers/dri/unichrome/via_3d_reg.h index 77b24dc..055c47d 100644 --- a/src/mesa/drivers/dri/unichrome/via_3d_reg.h +++ b/src/mesa/drivers/dri/unichrome/via_3d_reg.h @@ -26,6 +26,12 @@ #define VIA_3D_REG_H #define HC_REG_BASE 0x0400 +/* VIA_REG_STATUS(0x400): Engine Status */ +#define VIA_CMD_RGTR_BUSY 0x00000080 /* Command Regulator is busy */ +#define VIA_2D_ENG_BUSY 0x00000002 /* 2D Engine is busy */ +#define VIA_3D_ENG_BUSY 0x00000001 /* 3D Engine is busy */ +#define VIA_VR_QUEUE_BUSY 0x00020000 /* Virtual Queue is busy */ + #define HC_ParaN_MASK 0xffffffff #define HC_Para_MASK 0x00ffffff #define HC_SubA_MASK 0xff000000 diff --git a/src/mesa/drivers/dri/unichrome/via_context.c b/src/mesa/drivers/dri/unichrome/via_context.c index ffde1b6..6946a29 100644 --- a/src/mesa/drivers/dri/unichrome/via_context.c +++ b/src/mesa/drivers/dri/unichrome/via_context.c @@ -668,12 +668,22 @@ viaCreateContext(const __GLcontextModes *visual, /* Hack this up in its place: */ - vmesa->vblank_flags = (getenv("VIA_VSYNC") ? - VBLANK_FLAG_SYNC : VBLANK_FLAG_NO_IRQ); + vmesa->vblank_flags = (getenv("VIA_VSYNC") ? + VBLANK_FLAG_SYNC : VBLANK_FLAG_NO_IRQ); + +/* + if (getenv("VIA_VSYNC")) + vmesa->vblank_flags = VBLANK_FLAG_SYNC; +*/ if (getenv("VIA_PAGEFLIP")) vmesa->allowPageFlip = 1; + if (getenv("VIA_NO_ACCEL_SYNC")) + vmesa->accelSync = GL_FALSE ; + else + vmesa->accelSync = GL_TRUE ; + (*dri_interface->getUST)( &vmesa->swap_ust ); diff --git a/src/mesa/drivers/dri/unichrome/via_context.h b/src/mesa/drivers/dri/unichrome/via_context.h index 9d7a0e6..e3add30 100644 --- a/src/mesa/drivers/dri/unichrome/via_context.h +++ b/src/mesa/drivers/dri/unichrome/via_context.h @@ -51,6 +51,8 @@ enum VIACHIPTAGS { VIA_LAST }; +#define MAXLOOP 0xffffff + #define VIA_FALLBACK_TEXTURE 0x1 #define VIA_FALLBACK_DRAW_BUFFER 0x2 #define VIA_FALLBACK_READ_BUFFER 0x4 @@ -338,6 +340,8 @@ struct via_context { struct via_tex_buffer tex_image_list[VIA_MEM_SYSTEM+1]; struct via_tex_buffer freed_tex_buffers; + + GLboolean accelSync ; }; diff --git a/src/mesa/drivers/dri/unichrome/via_ioctl.c b/src/mesa/drivers/dri/unichrome/via_ioctl.c index c8c6dc0..3e9882c 100644 --- a/src/mesa/drivers/dri/unichrome/via_ioctl.c +++ b/src/mesa/drivers/dri/unichrome/via_ioctl.c @@ -75,11 +75,9 @@ #define VIA_BLIT_FILL 0xF0 #define VIA_BLIT_SET 0xFF -static void dump_dma( struct via_context *vmesa ) -{ +static void dump_buffer( GLuint* data, GLuint length ) { GLuint i; - GLuint *data = (GLuint *)vmesa->dma; - for (i = 0; i < vmesa->dmaLow; i += 16) { + for (i = 0; i < length; i += 16) { fprintf(stderr, "%04x: ", i); fprintf(stderr, "%08x ", *data++); fprintf(stderr, "%08x ", *data++); @@ -89,7 +87,10 @@ static void dump_dma( struct via_context *vmesa ) fprintf(stderr, "******************************************\n"); } - +static void dump_dma( struct via_context *vmesa ) +{ + dump_buffer( (GLuint*)vmesa->dma, vmesa->dmaLow ) ; +} void viaCheckDma(struct via_context *vmesa, GLuint bytes) { @@ -512,9 +513,14 @@ static void viaWaitIdleVBlank( const __DRIdrawablePrivate *dPriv, if (value < vmesa->lastBreadcrumbRead || vmesa->thrashing) viaSwapOutWork(vmesa); + missed_target = GL_FALSE; + if (vmesa->accelSync) + viaAccelSync(vmesa); driWaitForVBlank( dPriv, & vmesa->vbl_seq, - vmesa->vblank_flags, & missed_target ); + vmesa->vblank_flags, & missed_target ); + +/* viaAccelSync(vmesa); */ if ( missed_target ) { vmesa->swap_missed_count++; (*dri_interface->getUST)( &vmesa->swap_missed_ust ); @@ -577,6 +583,23 @@ void viaResetPageFlippingLocked(struct via_context *vmesa) vmesa->doPageFlip = vmesa->allowPageFlip = 0; } +void viaAccelSync(struct via_context *vmesa) +{ + GLuint loop; + loop = 0; + + while(!viaCheckIdle(vmesa) && (loop++ < MAXLOOP)); +/* + while (!(VIAGETREG(VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) + && (loop++ < MAXLOOP)) ; +*/ + loop = 0; + while ((vmesa->regEngineStatus[0] & + (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | VIA_3D_ENG_BUSY)) && + (loop++ < MAXLOOP)) ; + + +} /* * Copy the back buffer to the front buffer. @@ -631,12 +654,13 @@ void viaPageFlip(const __DRIdrawablePrivate *dPriv) struct via_renderbuffer buffer_tmp; VIA_FLUSH_DMA(vmesa); + if (vmesa->vblank_flags == VBLANK_FLAG_SYNC && vmesa->lastBreadcrumbWrite > 1) viaWaitIdleVBlank(dPriv, vmesa, vmesa->lastBreadcrumbWrite - 1); else viaWaitIdleVBlank(dPriv, vmesa, vmesa->lastSwap[0]); - + LOCK_HARDWARE(vmesa); viaDoPageFlipLocked(vmesa, vmesa->back.offset); vmesa->lastSwap[1] = vmesa->lastSwap[0]; @@ -655,8 +679,11 @@ void viaPageFlip(const __DRIdrawablePrivate *dPriv) memcpy(&vmesa->front, &buffer_tmp, sizeof(struct via_renderbuffer)); } - - +/* +GLuint previousBuffer[ VIA_DMA_BUFSIZ ] ; +GLuint previousBufferLength = 0; +GLuint *previousDma; +*/ #define VIA_CMDBUF_MAX_LAG 50000 @@ -664,6 +691,9 @@ static int fire_buffer(struct via_context *vmesa) { drm_via_cmdbuffer_t bufI; int ret; +/* + GLuint dmaHeaderCheck; +*/ bufI.buf = (char *)vmesa->dma; bufI.size = vmesa->dmaLow; @@ -687,13 +717,33 @@ static int fire_buffer(struct via_context *vmesa) abort(); return ret; } - +/* + dmaHeaderCheck = *((GLuint*)vmesa->dma) & 0xFF000000 ; + if ( dmaHeaderCheck == 0x42000000 || dmaHeaderCheck == 0x43000000 ) { + fprintf(stderr, "error: dmaHeader = 0x%08x, %s, %d\n", + *((GLuint*)vmesa->dma), __FILE__, __LINE__); + fprintf(stderr, "previousBufferLength = %d, previousDma = %0x%08x, dma = 0x%08x\n", + previousBufferLength, previousDma, vmesa->dma); + if ( previousBufferLength != 0 ) + dump_buffer(previousBuffer,previousBufferLength); + dump_dma(vmesa); + + } +*/ /* Actually fire the buffer: */ do { ret = drmCommandWrite(vmesa->driFd, DRM_VIA_CMDBUFFER, &bufI, sizeof(bufI)); } while (ret == -EAGAIN); + + /* maintain a copy of the buffer for debug */ +/* + previousBufferLength = vmesa->dmaLow ; + memcpy(&previousBuffer,vmesa->dma,previousBufferLength); + previousDma = vmesa->dma; +*/ + if (ret) { UNLOCK_HARDWARE(vmesa); fprintf(stderr, "%s: DRM_VIA_CMDBUFFER returned %d\n", diff --git a/src/mesa/drivers/dri/unichrome/via_ioctl.h b/src/mesa/drivers/dri/unichrome/via_ioctl.h index a81b427..74841fe 100644 --- a/src/mesa/drivers/dri/unichrome/via_ioctl.h +++ b/src/mesa/drivers/dri/unichrome/via_ioctl.h @@ -39,6 +39,7 @@ void viaCheckDma(struct via_context *vmesa, GLuint bytes); void viaResetPageFlippingLocked(struct via_context *vmesa); void viaWaitIdle(struct via_context *vmesa, GLboolean light); void viaWaitIdleLocked(struct via_context *vmesa, GLboolean light); +void viaAccelSync(struct via_context *vmesa); GLboolean viaCheckBreadcrumb( struct via_context *vmesa, GLuint value ); void viaEmitBreadcrumb( struct via_context *vmesa ); diff --git a/src/mesa/drivers/dri/unichrome/via_tris.c b/src/mesa/drivers/dri/unichrome/via_tris.c index 4cc7942..3c013f3 100644 --- a/src/mesa/drivers/dri/unichrome/via_tris.c +++ b/src/mesa/drivers/dri/unichrome/via_tris.c @@ -922,7 +922,7 @@ void viaRasterPrimitive(GLcontext *ctx, VIA_FINISH_PRIM(vmesa); /* Ensure no wrapping inside this function */ - viaCheckDma( vmesa, 1024 ); + viaCheckDma( vmesa, 1024 * 3 ); if (vmesa->newEmitState) { viaEmitState(vmesa); @@ -1077,7 +1077,7 @@ void viaFinishPrimitive(struct via_context *vmesa) else { if (VIA_DEBUG & (DEBUG_DMA|DEBUG_PRIMS)) fprintf(stderr, "remove empty primitive\n"); - + /* Remove the primitive header: */ vmesa->dmaLastPrim = 0; @@ -1089,6 +1089,7 @@ void viaFinishPrimitive(struct via_context *vmesa) vmesa->dmaLow -= 8 * sizeof(GLuint); vmesa->dmaCliprectAddr = ~0; } + } vmesa->renderPrimitive = GL_POLYGON + 1;