Merge branch 'new-frag-attribs'
[mesa.git] / src / mesa / drivers / dri / r300 / r300_ioctl.c
index 4ae0b4504c2fb8f817b08d904392bd41d83014fb..7558f9e225b23b790a87375b0cf5e31e7af33bb0 100644 (file)
@@ -55,7 +55,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r300_vertprog.h"
 #include "radeon_reg.h"
 #include "r300_emit.h"
-#include "r300_fragprog.h"
 #include "r300_context.h"
 
 #include "vblank.h"
@@ -66,12 +65,67 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define CLEARBUFFER_DEPTH      0x2
 #define CLEARBUFFER_STENCIL    0x4
 
-static void r300EmitClearState(GLcontext * ctx);
+#if 1
 
-static void r300UserClear(GLcontext *ctx, GLuint mask)
-{
-       radeon_clear_tris(ctx, mask);
-}
+/**
+ * Fragment program helper macros
+ */
+
+/* Produce unshifted source selectors */
+#define FP_TMP(idx) (idx)
+#define FP_CONST(idx) ((idx) | (1 << 5))
+
+/* Produce source/dest selector dword */
+#define FP_SELC_MASK_NO                0
+#define FP_SELC_MASK_X         1
+#define FP_SELC_MASK_Y         2
+#define FP_SELC_MASK_XY                3
+#define FP_SELC_MASK_Z         4
+#define FP_SELC_MASK_XZ                5
+#define FP_SELC_MASK_YZ                6
+#define FP_SELC_MASK_XYZ       7
+
+#define FP_SELC(destidx,regmask,outmask,src0,src1,src2) \
+       (((destidx) << R300_ALU_DSTC_SHIFT) |           \
+        (FP_SELC_MASK_##regmask << 23) |               \
+        (FP_SELC_MASK_##outmask << 26) |               \
+        ((src0) << R300_ALU_SRC0C_SHIFT) |             \
+        ((src1) << R300_ALU_SRC1C_SHIFT) |             \
+        ((src2) << R300_ALU_SRC2C_SHIFT))
+
+#define FP_SELA_MASK_NO                0
+#define FP_SELA_MASK_W         1
+
+#define FP_SELA(destidx,regmask,outmask,src0,src1,src2) \
+       (((destidx) << R300_ALU_DSTA_SHIFT) |           \
+        (FP_SELA_MASK_##regmask << 23) |               \
+        (FP_SELA_MASK_##outmask << 24) |               \
+        ((src0) << R300_ALU_SRC0A_SHIFT) |             \
+        ((src1) << R300_ALU_SRC1A_SHIFT) |             \
+        ((src2) << R300_ALU_SRC2A_SHIFT))
+
+/* Produce unshifted argument selectors */
+#define FP_ARGC(source)        R300_ALU_ARGC_##source
+#define FP_ARGA(source) R300_ALU_ARGA_##source
+#define FP_ABS(arg) ((arg) | (1 << 6))
+#define FP_NEG(arg) ((arg) ^ (1 << 5))
+
+/* Produce instruction dword */
+#define FP_INSTRC(opcode,arg0,arg1,arg2) \
+       (R300_ALU_OUTC_##opcode |               \
+       ((arg0) << R300_ALU_ARG0C_SHIFT) |      \
+       ((arg1) << R300_ALU_ARG1C_SHIFT) |      \
+       ((arg2) << R300_ALU_ARG2C_SHIFT))
+
+#define FP_INSTRA(opcode,arg0,arg1,arg2) \
+       (R300_ALU_OUTA_##opcode |               \
+       ((arg0) << R300_ALU_ARG0A_SHIFT) |      \
+       ((arg1) << R300_ALU_ARG1A_SHIFT) |      \
+       ((arg2) << R300_ALU_ARG2A_SHIFT))
+
+#endif
+
+static void r300EmitClearState(GLcontext * ctx);
 
 static void r300ClearBuffer(r300ContextPtr r300, int flags,
                            struct radeon_renderbuffer *rrb,
@@ -114,18 +168,21 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags,
        }
 #if 1
        if (flags & (CLEARBUFFER_DEPTH | CLEARBUFFER_STENCIL)) {
-               assert(rrbd != 0);
-               cbpitch = (rrbd->pitch / rrbd->cpp);
+               uint32_t zbpitch = (rrbd->pitch / rrbd->cpp);
                if (rrbd->bo->flags & RADEON_BO_FLAGS_MACRO_TILE){
-                       cbpitch |= R300_DEPTHMACROTILE_ENABLE;
+                       zbpitch |= R300_DEPTHMACROTILE_ENABLE;
         }
                if (rrbd->bo->flags & RADEON_BO_FLAGS_MICRO_TILE){
-            cbpitch |= R300_DEPTHMICROTILE_TILED;
+            zbpitch |= R300_DEPTHMICROTILE_TILED;
         }
                BEGIN_BATCH_NO_AUTOSTATE(6);
                OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET, 1);
                OUT_BATCH_RELOC(0, rrbd->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
-               OUT_BATCH_REGVAL(R300_ZB_DEPTHPITCH, cbpitch);
+               OUT_BATCH_REGSEQ(R300_ZB_DEPTHPITCH, 1);
+               if (!r300->radeon.radeonScreen->kernel_mm)
+                       OUT_BATCH(zbpitch);
+               else
+                       OUT_BATCH_RELOC(zbpitch, rrbd->bo, zbpitch, 0, RADEON_GEM_DOMAIN_VRAM, 0);
                END_BATCH();
        }
 #endif
@@ -513,12 +570,12 @@ static void r300EmitClearState(GLcontext * ctx)
                                          0, 0xf, PVS_DST_REG_OUT);
                vpu.cmd[2] = PVS_SRC_OPERAND(0, PVS_SRC_SELECT_X, PVS_SRC_SELECT_Y,
                                       PVS_SRC_SELECT_Z, PVS_SRC_SELECT_W,
-                                      PVS_SRC_REG_INPUT, VSF_FLAG_NONE);
+                                      PVS_SRC_REG_INPUT, NEGATE_NONE);
                vpu.cmd[3] = PVS_SRC_OPERAND(0, PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
-                                      PVS_SRC_REG_INPUT, VSF_FLAG_NONE);
+                                      PVS_SRC_REG_INPUT, NEGATE_NONE);
                vpu.cmd[4] = 0x0;
 
                vpu.cmd[5] = PVS_OP_DST_OPERAND(VE_ADD, GL_FALSE, GL_FALSE, 1, 0xf,
@@ -526,13 +583,12 @@ static void r300EmitClearState(GLcontext * ctx)
                vpu.cmd[6] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_X,
                                       PVS_SRC_SELECT_Y, PVS_SRC_SELECT_Z,
                                       PVS_SRC_SELECT_W, PVS_SRC_REG_INPUT,
-
-                                      VSF_FLAG_NONE);
+                                      NEGATE_NONE);
                vpu.cmd[7] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
                                       PVS_SRC_SELECT_FORCE_0,
-                                      PVS_SRC_REG_INPUT, VSF_FLAG_NONE);
+                                      PVS_SRC_REG_INPUT, NEGATE_NONE);
                vpu.cmd[8] = 0x0;
 
                r300->vap_flush_needed = GL_TRUE;
@@ -551,7 +607,7 @@ static int r300KernelClear(GLcontext *ctx, GLuint flags)
 
        /* Make sure it fits there. */
        radeon_cs_space_reset_bos(r300->radeon.cmdbuf.cs);
-       
+
        if (flags & BUFFER_BIT_COLOR0) {
                rrb = radeon_get_renderbuffer(&rfb->base, BUFFER_COLOR0);
                radeon_cs_space_add_persistent_bo(r300->radeon.cmdbuf.cs,
@@ -646,6 +702,8 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
 
        if (colorMask == ~0)
          tri_mask |= (mask & BUFFER_BITS_COLOR);
+       else
+         tri_mask |= (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT));
 
 
        /* HW stencil */
@@ -678,7 +736,7 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
        ret = 0;
        if (tri_mask) {
                if (r300->radeon.radeonScreen->kernel_mm)
-                       r300UserClear(ctx, tri_mask);
+                       radeonUserClear(ctx, tri_mask);
                else {
                        /* if kernel clear fails due to size restraints fallback */
                        ret = r300KernelClear(ctx, tri_mask);