Public feed
#600054
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;