Merge branch 'mesa_7_7_branch'
[mesa.git] / src / mesa / drivers / dri / unichrome / via_ioctl.h
index fec13c9362de9fa163fd46f3de7fe3f7b7a298aa..14a833a97d001eee270f88ab99e7b375e2830050 100644 (file)
 #include "via_context.h"
 
 
-void viaEmitPrim(viaContextPtr vmesa);
-void viaFlushPrims(viaContextPtr vmesa);
-void viaFlushPrimsLocked(viaContextPtr vmesa);
+void viaFinishPrimitive(struct via_context *vmesa);
+void viaFlushDma(struct via_context *vmesa);
+void viaFlushDmaLocked(struct via_context *vmesa, GLuint flags);
 
-void viaDmaFinish(viaContextPtr vmesa);
-void viaRegetLockQuiescent(viaContextPtr vmesa);
 void viaInitIoctlFuncs(GLcontext *ctx);
-void viaCopyBuffer(const __DRIdrawablePrivate *dpriv);
-void viaPageFlip(const __DRIdrawablePrivate *dpriv);
-int via_check_copy(int fd);
-void viaFillFrontBuffer(viaContextPtr vmesa);
-void viaFillFrontPBuffer(viaContextPtr vmesa);
-void viaFillBackBuffer(viaContextPtr vmesa);
-void viaFillDepthBuffer(viaContextPtr vmesa, GLuint pixel, GLuint mask);
-void viaDoSwapBuffers(viaContextPtr vmesa);
-void viaDoSwapPBuffers(viaContextPtr vmesa);
-
-int flush_agp(viaContextPtr vmesa, drm_via_flush_agp_t* agpCmd); 
-int flush_sys(viaContextPtr vmesa, drm_via_flush_sys_t* buf); 
-
-#define VIA_STATECHANGE(vmesa, flag)                            \
-    do {                                                        \
-        if (vmesa->dmaLow != vmesa->dmaLastPrim)                \
-            viaFlushPrims(vmesa);                               \
-        vmesa->dirty |= flag;                                   \
-    } while (0)                                                 \
-
-
-#define VIA_FIREVERTICES(vmesa)                                 \
-    do {                                                        \
-        if (vmesa->dmaLow) {                                    \
-            viaFlushPrims(vmesa);                               \
-        }                                                       \
-    } while (0)
+void viaCopyBuffer(__DRIdrawablePrivate *dpriv);
+void viaPageFlip(__DRIdrawablePrivate *dpriv);
+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);
+
+GLboolean viaCheckBreadcrumb( struct via_context *vmesa, GLuint value );
+void viaEmitBreadcrumb( struct via_context *vmesa );
+
+
+#define VIA_FINISH_PRIM(vmesa) do {            \
+   if (vmesa->dmaLastPrim)                     \
+      viaFinishPrimitive( vmesa );             \
+} while (0)
+
+#define VIA_FLUSH_DMA(vmesa) do {              \
+   VIA_FINISH_PRIM(vmesa);                     \
+   if (vmesa->dmaLow)          \
+      viaFlushDma(vmesa);                      \
+} while (0)
     
 
-static __inline GLuint *viaCheckDma(viaContextPtr vmesa, int bytes)
+void viaWrapPrimitive( struct via_context *vmesa );
+
+static INLINE GLuint *viaAllocDma(struct via_context *vmesa, int bytes)
+{
+   if (vmesa->dmaLow + bytes > VIA_DMA_HIGHWATER) {
+      viaFlushDma(vmesa);
+   }
+
+   {
+      GLuint *start = (GLuint *)(vmesa->dma + vmesa->dmaLow);
+      vmesa->dmaLow += bytes;
+      return start;
+   }
+}
+
+
+static GLuint INLINE *viaExtendPrimitive(struct via_context *vmesa, int bytes)
 {
-    if (vmesa->dmaLow + bytes > vmesa->dmaHigh) {
-       if (VIA_DEBUG) fprintf(stderr, "buffer overflow in check dma = %d + %d = %d\n", 
-                              vmesa->dmaLow, bytes, vmesa->dmaLow + bytes);
-       viaFlushPrims(vmesa);
-    }
-
-    {
-        GLuint *start = (GLuint *)(vmesa->dmaAddr + vmesa->dmaLow);
-        return start;
-    }
+   if (vmesa->dmaLow + bytes > VIA_DMA_HIGHWATER) {
+      viaWrapPrimitive(vmesa);
+   }
+
+   {
+      GLuint *start = (GLuint *)(vmesa->dma + vmesa->dmaLow);
+      vmesa->dmaLow += bytes;
+      return start;
+   }
 }
+
+
+
+
+#define RING_VARS GLuint *_vb = 0, _nr, _x;
+
+#define BEGIN_RING(n) do {                             \
+   if (_vb != 0) abort();                              \
+   _vb = viaAllocDma(vmesa, (n) * sizeof(GLuint));     \
+   _nr = (n);                                          \
+   _x = 0;                                             \
+} while (0)
+
+#define BEGIN_RING_NOCHECK(n) do {                     \
+   if (_vb != 0) abort();                              \
+   _vb = (GLuint *)(vmesa->dma + vmesa->dmaLow);       \
+   vmesa->dmaLow += (n) * sizeof(GLuint);              \
+   _nr = (n);                                          \
+   _x = 0;                                             \
+} while (0)
+
+#define OUT_RING(n) _vb[_x++] = (n)
+
+#define ADVANCE_RING() do {                    \
+   if (_x != _nr) abort();                     \
+   _vb = 0;                                            \
+} while (0)
+
+#define ADVANCE_RING_VARIABLE() do {                   \
+   if (_x > _nr) abort();                              \
+   vmesa->dmaLow -= (_nr - _x) * sizeof(GLuint);       \
+   _vb = 0;                                            \
+} while (0)
+
+
+#define QWORD_PAD_RING() do {                  \
+   if (vmesa->dmaLow & 0x4) {                  \
+      BEGIN_RING(1);                           \
+      OUT_RING(HC_DUMMY);                      \
+      ADVANCE_RING();                          \
+   }                                           \
+} while (0)
+
+#define VIA_GEQ_WRAP(left, right) \
+    (((left) - (right)) < ( 1 << 23))
+      
 #endif