Public feed #600054

Stuff

public text v1 · immutable
Raw Edit
·published 2007-07-02 16:29 UTC
rendered paste body
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;