summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/unichrome/via_ioctl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/unichrome/via_ioctl.h')
-rw-r--r--src/mesa/drivers/dri/unichrome/via_ioctl.h86
1 files changed, 63 insertions, 23 deletions
diff --git a/src/mesa/drivers/dri/unichrome/via_ioctl.h b/src/mesa/drivers/dri/unichrome/via_ioctl.h
index 627d8ad8f2..193aab8a99 100644
--- a/src/mesa/drivers/dri/unichrome/via_ioctl.h
+++ b/src/mesa/drivers/dri/unichrome/via_ioctl.h
@@ -28,43 +28,83 @@
#include "via_context.h"
-void viaEmitPrim(viaContextPtr vmesa);
+void viaFinishPrimitive(viaContextPtr vmesa);
void viaFlushPrims(viaContextPtr vmesa);
void viaFlushPrimsLocked(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);
+void viaCheckDma(viaContextPtr vmesa, GLuint bytes);
-int flush_agp(viaContextPtr vmesa, drm_via_flush_agp_t* agpCmd);
-int flush_sys(viaContextPtr vmesa, drm_via_flush_sys_t* buf);
+#define VIA_FINISH_PRIM(vmesa) do { \
+ if (vmesa->dmaLastPrim) \
+ viaFinishPrimitive( vmesa ); \
+} while (0)
-#define VIA_FIREVERTICES(vmesa) \
- do { \
- if (vmesa->dmaLow != DMA_OFFSET) { \
- viaFlushPrims(vmesa); \
- } \
- } while (0)
+#define VIA_FLUSH_DMA(vmesa) do { \
+ VIA_FINISH_PRIM(vmesa); \
+ if (vmesa->dmaLow != DMA_OFFSET) \
+ viaFlushPrims(vmesa); \
+} while (0)
-static __inline GLuint *viaCheckDma(viaContextPtr 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;
- }
-}
+GLuint *viaAllocDmaFunc(viaContextPtr vmesa, int bytes, const char *func, int line);
+#define viaAllocDma( v, b ) viaAllocDmaFunc(v, b, __FUNCTION__, __LINE__)
+
+
+
+/* Room for the cliprect and other preamble at the head of each dma
+ * buffer: (What about buffers which only contain blits?)
+ */
+#define DMA_OFFSET 32
+
+#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->dmaAddr + 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)
+
+
+
+
#endif