dri_interface: Introduce DRI tokens for the texBuffer texture formats
[mesa.git] / src / mesa / drivers / dri / r300 / r300_emit.h
index 89d738339f8cab3d01904f94f0bfb88d2161359b..a456d8867c4aaaa92d9b72dcb8a3708d49727b58 100644 (file)
 #include "main/glheader.h"
 #include "r300_context.h"
 #include "r300_cmdbuf.h"
-#include "radeon_reg.h"
 
-/* TODO: move these defines (and the ones from DRM) into r300_reg.h and sync up
- * with DRM */
-#define CP_PACKET0(reg, n)     (RADEON_CP_PACKET0 | ((n)<<16) | ((reg)>>2))
-#define CP_PACKET3( pkt, n )                                           \
-       (RADEON_CP_PACKET3 | (pkt) | ((n) << 16))
-
-static INLINE uint32_t cmdpacket0(int reg, int count)
+static INLINE uint32_t cmdpacket0(struct radeon_screen *rscrn,
+                                  int reg, int count)
 {
-       drm_r300_cmd_header_t cmd;
-
-       cmd.packet0.cmd_type = R300_CMD_PACKET0;
-       cmd.packet0.count = count;
-       cmd.packet0.reghi = ((unsigned int)reg & 0xFF00) >> 8;
-       cmd.packet0.reglo = ((unsigned int)reg & 0x00FF);
-
-       return cmd.u;
+    if (!rscrn->kernel_mm) {
+           drm_r300_cmd_header_t cmd;
+
+       cmd.u = 0;
+       cmd.packet0.cmd_type = R300_CMD_PACKET0;
+           cmd.packet0.count = count;
+       cmd.packet0.reghi = ((unsigned int)reg & 0xFF00) >> 8;
+           cmd.packet0.reglo = ((unsigned int)reg & 0x00FF);
+
+       return cmd.u;
+    }
+    if (count) {
+        return CP_PACKET0(reg, count - 1);
+    }
+    return CP_PACKET2;
 }
 
-static INLINE uint32_t cmdvpu(int addr, int count)
+static INLINE uint32_t cmdvpu(struct radeon_screen *rscrn, int addr, int count)
 {
        drm_r300_cmd_header_t cmd;
 
+       cmd.u = 0;
        cmd.vpu.cmd_type = R300_CMD_VPU;
        cmd.vpu.count = count;
        cmd.vpu.adrhi = ((unsigned int)addr & 0xFF00) >> 8;
@@ -74,10 +76,12 @@ static INLINE uint32_t cmdvpu(int addr, int count)
        return cmd.u;
 }
 
-static INLINE uint32_t cmdr500fp(int addr, int count, int type, int clamp)
+static INLINE uint32_t cmdr500fp(struct radeon_screen *rscrn,
+                                 int addr, int count, int type, int clamp)
 {
        drm_r300_cmd_header_t cmd;
 
+       cmd.u = 0;
        cmd.r500fp.cmd_type = R300_CMD_R500FP;
        cmd.r500fp.count = count;
        cmd.r500fp.adrhi_flags = ((unsigned int)addr & 0x100) >> 8;
@@ -88,181 +92,137 @@ static INLINE uint32_t cmdr500fp(int addr, int count, int type, int clamp)
        return cmd.u;
 }
 
-static INLINE uint32_t cmdpacket3(int packet)
+static INLINE uint32_t cmdpacket3(struct radeon_screen *rscrn, int packet)
 {
        drm_r300_cmd_header_t cmd;
 
+       cmd.u = 0;
        cmd.packet3.cmd_type = R300_CMD_PACKET3;
        cmd.packet3.packet = packet;
 
        return cmd.u;
 }
 
-static INLINE uint32_t cmdcpdelay(unsigned short count)
+static INLINE uint32_t cmdcpdelay(struct radeon_screen *rscrn,
+                                  unsigned short count)
 {
        drm_r300_cmd_header_t cmd;
 
+       cmd.u = 0;
+
        cmd.delay.cmd_type = R300_CMD_CP_DELAY;
        cmd.delay.count = count;
 
        return cmd.u;
 }
 
-static INLINE uint32_t cmdwait(unsigned char flags)
+static INLINE uint32_t cmdwait(struct radeon_screen *rscrn,
+                               unsigned char flags)
 {
        drm_r300_cmd_header_t cmd;
 
+       cmd.u = 0;
        cmd.wait.cmd_type = R300_CMD_WAIT;
        cmd.wait.flags = flags;
 
        return cmd.u;
 }
 
-static INLINE uint32_t cmdpacify(void)
+static INLINE uint32_t cmdpacify(struct radeon_screen *rscrn)
 {
        drm_r300_cmd_header_t cmd;
 
+       cmd.u = 0;
        cmd.header.cmd_type = R300_CMD_END3D;
 
        return cmd.u;
 }
 
 /**
- * Prepare to write a register value to register at address reg.
- * If num_extra > 0 then the following extra values are written
- * to registers with address +4, +8 and so on..
- */
-#define reg_start(reg, num_extra)                                      \
-       do {                                                            \
-               int _n;                                                 \
-               _n=(num_extra);                                         \
-               cmd = (drm_radeon_cmd_header_t*)                        \
-                       r300AllocCmdBuf(rmesa,                          \
-                                       (_n+2),                         \
-                                       __FUNCTION__);                  \
-               cmd_reserved=_n+2;                                      \
-               cmd_written=1;                                          \
-               cmd[0].i=cmdpacket0((reg), _n+1);                       \
-       } while (0);
-
-/**
- * Emit GLuint freestyle
+ * Write the header of a packet3 to the command buffer.
+ * Outputs 2 dwords and expects (num_extra+1) additional dwords afterwards.
  */
-#define e32(dword)                                                     \
-       do {                                                            \
-               if(cmd_written<cmd_reserved) {                          \
-                       cmd[cmd_written].i=(dword);                     \
-                       cmd_written++;                                  \
-               } else {                                                \
-                       fprintf(stderr,                                 \
-                               "e32 but no previous packet "           \
-                               "declaration.\n"                        \
-                               "Aborting! in %s::%s at line %d, "      \
-                               "cmd_written=%d cmd_reserved=%d\n",     \
-                               __FILE__, __FUNCTION__, __LINE__,       \
-                               cmd_written, cmd_reserved);             \
-                       _mesa_exit(-1);                                 \
-               }                                                       \
+#define OUT_BATCH_PACKET3(packet, num_extra) do {\
+    if (!b_l_rmesa->radeonScreen->kernel_mm) {         \
+       OUT_BATCH(cmdpacket3(b_l_rmesa->radeonScreen,\
+                  R300_CMD_PACKET3_RAW)); \
+    } else b_l_rmesa->cmdbuf.cs->section_cdw++;\
+       OUT_BATCH(CP_PACKET3((packet), (num_extra))); \
        } while(0)
 
-#define        efloat(f) e32(r300PackFloat32(f))
-
-#define vsf_start_fragment(dest, length)                               \
-       do {                                                            \
-               int _n;                                                 \
-               _n = (length);                                          \
-               cmd = (drm_radeon_cmd_header_t*)                        \
-                       r300AllocCmdBuf(rmesa,                          \
-                                       (_n+1),                         \
-                                       __FUNCTION__);                  \
-               cmd_reserved = _n+2;                                    \
-               cmd_written =1;                                         \
-               cmd[0].i = cmdvpu((dest), _n/4);                        \
-       } while (0);
-
-#define r500fp_start_fragment(dest, length)                            \
-       do {                                                            \
-               int _n;                                                 \
-               _n = (length);                                          \
-               cmd = (drm_radeon_cmd_header_t*)                        \
-                       r300AllocCmdBuf(rmesa,                          \
-                                       (_n+1),                         \
-                                       __FUNCTION__);                  \
-               cmd_reserved = _n+1;                                    \
-               cmd_written =1;                                         \
-               cmd[0].i = cmdr500fp((dest), _n/6, 0, 0);               \
-       } while (0);
-
-#define start_packet3(packet, count)                                   \
-       {                                                               \
-               int _n;                                                 \
-               GLuint _p;                                              \
-               _n = (count);                                           \
-               _p = (packet);                                          \
-               cmd = (drm_radeon_cmd_header_t*)                        \
-                       r300AllocCmdBuf(rmesa,                          \
-                                       (_n+3),                         \
-                                       __FUNCTION__);                  \
-               cmd_reserved = _n+3;                                    \
-               cmd_written = 2;                                        \
-               if(_n > 0x3fff) {                                       \
-                       fprintf(stderr,"Too big packet3 %08x: cannot "  \
-                               "store %d dwords\n",                    \
-                               _p, _n);                                \
-                       _mesa_exit(-1);                                 \
-               }                                                       \
-               cmd[0].i = cmdpacket3(R300_CMD_PACKET3_RAW);            \
-               cmd[1].i = _p | ((_n & 0x3fff)<<16);                    \
-       }
-
 /**
  * Must be sent to switch to 2d commands
  */
-void static INLINE end_3d(r300ContextPtr rmesa)
+void static INLINE end_3d(radeonContextPtr radeon)
 {
-       drm_radeon_cmd_header_t *cmd = NULL;
+       BATCH_LOCALS(radeon);
 
-       cmd =
-           (drm_radeon_cmd_header_t *) r300AllocCmdBuf(rmesa, 1, __FUNCTION__);
-       cmd[0].header.cmd_type = R300_CMD_END3D;
+       if (!radeon->radeonScreen->kernel_mm) {
+               BEGIN_BATCH_NO_AUTOSTATE(1);
+               OUT_BATCH(cmdpacify(radeon->radeonScreen));
+               END_BATCH();
+       }
 }
 
 void static INLINE cp_delay(r300ContextPtr rmesa, unsigned short count)
 {
-       drm_radeon_cmd_header_t *cmd = NULL;
+       BATCH_LOCALS(&rmesa->radeon);
 
-       cmd =
-           (drm_radeon_cmd_header_t *) r300AllocCmdBuf(rmesa, 1, __FUNCTION__);
-       cmd[0].i = cmdcpdelay(count);
+       if (!rmesa->radeon.radeonScreen->kernel_mm) {
+               BEGIN_BATCH_NO_AUTOSTATE(1);
+               OUT_BATCH(cmdcpdelay(rmesa->radeon.radeonScreen, count));
+               END_BATCH();
+       }
 }
 
-void static INLINE cp_wait(r300ContextPtr rmesa, unsigned char flags)
+void static INLINE cp_wait(radeonContextPtr radeon, unsigned char flags)
 {
-       drm_radeon_cmd_header_t *cmd = NULL;
-
-       cmd =
-           (drm_radeon_cmd_header_t *) r300AllocCmdBuf(rmesa, 1, __FUNCTION__);
-       cmd[0].i = cmdwait(flags);
+       BATCH_LOCALS(radeon);
+       uint32_t wait_until;
+
+       if (!radeon->radeonScreen->kernel_mm) {
+               BEGIN_BATCH_NO_AUTOSTATE(1);
+               OUT_BATCH(cmdwait(radeon->radeonScreen, flags));
+               END_BATCH();
+       } else {
+               switch(flags) {
+               case R300_WAIT_2D:
+                       wait_until = (1 << 14);
+                       break;
+               case R300_WAIT_3D:
+                       wait_until = (1 << 15);
+                       break;
+               case R300_NEW_WAIT_2D_3D:
+                       wait_until = (1 << 14) | (1 << 15);
+                       break;
+               case R300_NEW_WAIT_2D_2D_CLEAN:
+                       wait_until = (1 << 14) | (1 << 16) | (1 << 18);
+                       break;
+               case R300_NEW_WAIT_3D_3D_CLEAN:
+                       wait_until = (1 << 15) | (1 << 17) | (1 << 18);
+                       break;
+               case R300_NEW_WAIT_2D_2D_CLEAN_3D_3D_CLEAN:
+                       wait_until  = (1 << 14) | (1 << 16) | (1 << 18);
+                       wait_until |= (1 << 15) | (1 << 17) | (1 << 18);
+                       break;
+               default:
+                       return;
+               }
+               BEGIN_BATCH_NO_AUTOSTATE(2);
+               OUT_BATCH(CP_PACKET0(RADEON_WAIT_UNTIL, 0));
+               OUT_BATCH(wait_until);
+               END_BATCH();
+       }
 }
 
-extern int r300EmitArrays(GLcontext * ctx);
-
-#ifdef USER_BUFFERS
-void r300UseArrays(GLcontext * ctx);
-#endif
-
-extern void r300ReleaseArrays(GLcontext * ctx);
 extern int r300PrimitiveType(r300ContextPtr rmesa, int prim);
 extern int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim);
 
 extern void r300EmitCacheFlush(r300ContextPtr rmesa);
 
-extern GLuint r300VAPInputRoute0(uint32_t * dst, GLvector4f ** attribptr,
-                                int *inputs, GLint * tab, GLuint nr);
-extern GLuint r300VAPInputRoute1(uint32_t * dst, int swizzle[][4], GLuint nr);
 extern GLuint r300VAPInputCntl0(GLcontext * ctx, GLuint InputsRead);
 extern GLuint r300VAPInputCntl1(GLcontext * ctx, GLuint InputsRead);
-extern GLuint r300VAPOutputCntl0(GLcontext * ctx, GLuint OutputsWritten);
-extern GLuint r300VAPOutputCntl1(GLcontext * ctx, GLuint OutputsWritten);
+extern GLuint r300VAPOutputCntl0(GLcontext * ctx, GLuint vp_writes);
+extern GLuint r300VAPOutputCntl1(GLcontext * ctx, GLuint vp_writes);
 
 #endif