Module: Mesa
Branch: master
Commit: 3623202834e9ca1073a4aa66f72f584812fb14df
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=3623202834e9ca1073a4aa66f72f584812fb14df

Author: Corbin Simpson <mostawesomed...@gmail.com>
Date:   Tue Mar 30 10:43:51 2010 -0700

r300/compiler: Unbreak DDX/DDY.

Fixes progs/glsl/deriv.

---

 .../drivers/dri/r300/compiler/r500_fragprog_emit.c |   23 ++++++++++++++++++-
 .../drivers/dri/r300/compiler/radeon_opcodes.c     |    4 +-
 .../dri/r300/compiler/radeon_pair_translate.c      |    5 ----
 3 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c 
b/src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c
index 4e84eef..b6dfe28 100644
--- a/src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c
+++ b/src/mesa/drivers/dri/r300/compiler/r500_fragprog_emit.c
@@ -190,6 +190,17 @@ static unsigned int use_source(struct 
r500_fragment_program_code* code, struct r
        return 0;
 }
 
+/**
+ * NOP the specified instruction if it is not a texture lookup.
+ */
+static void alu_nop(struct r300_fragment_program_compiler *c, int ip)
+{
+       PROG_CODE;
+
+       if ((code->inst[ip].inst0 & 0x3) != R500_INST_TYPE_TEX) {
+               code->inst[ip].inst0 |= R500_INST_NOP;
+       }
+}
 
 /**
  * Emit a paired ALU instruction.
@@ -205,6 +216,14 @@ static void emit_paired(struct 
r300_fragment_program_compiler *c, struct rc_pair
 
        int ip = ++code->inst_end;
 
+       /* Quirk: MDH/MDV (DDX/DDY) need a NOP on previous non-TEX 
instructions. */
+       if (inst->RGB.Opcode == RC_OPCODE_DDX || inst->Alpha.Opcode == 
RC_OPCODE_DDX ||
+               inst->RGB.Opcode == RC_OPCODE_DDY || inst->Alpha.Opcode == 
RC_OPCODE_DDY) {
+               if (ip > 0) {
+                       alu_nop(c, ip - 1);
+               }
+       }
+
        code->inst[ip].inst5 = translate_rgb_op(c, inst->RGB.Opcode);
        code->inst[ip].inst4 = translate_alpha_op(c, inst->Alpha.Opcode);
 
@@ -252,8 +271,8 @@ static void emit_paired(struct 
r300_fragment_program_compiler *c, struct rc_pair
        code->inst[ip].inst4 |= translate_arg_alpha(inst, 1) << 
R500_ALPHA_SEL_B_SHIFT;
        code->inst[ip].inst5 |= translate_arg_alpha(inst, 2) << 
R500_ALU_RGBA_ALPHA_SEL_C_SHIFT;
 
-    code->inst[ip].inst3 |= R500_ALU_RGB_TARGET(inst->RGB.Target);
-    code->inst[ip].inst4 |= R500_ALPHA_TARGET(inst->Alpha.Target);
+       code->inst[ip].inst3 |= R500_ALU_RGB_TARGET(inst->RGB.Target);
+       code->inst[ip].inst4 |= R500_ALPHA_TARGET(inst->Alpha.Target);
 
        if (inst->WriteALUResult) {
                code->inst[ip].inst3 |= R500_ALU_RGB_WMASK;
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c 
b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c
index c1c0181..9d289fc 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_opcodes.c
@@ -75,14 +75,14 @@ struct rc_opcode_info rc_opcodes[MAX_RC_OPCODE] = {
        {
                .Opcode = RC_OPCODE_DDX,
                .Name = "DDX",
-               .NumSrcRegs = 1,
+               .NumSrcRegs = 2,
                .HasDstReg = 1,
                .IsComponentwise = 1
        },
        {
                .Opcode = RC_OPCODE_DDY,
                .Name = "DDY",
-               .NumSrcRegs = 1,
+               .NumSrcRegs = 2,
                .HasDstReg = 1,
                .IsComponentwise = 1
        },
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_pair_translate.c 
b/src/mesa/drivers/dri/r300/compiler/radeon_pair_translate.c
index fff5b0c..3a26e7d 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_pair_translate.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_pair_translate.c
@@ -159,11 +159,6 @@ static void set_pair_instruction(struct 
r300_fragment_program_compiler *c,
        int nargs = opcode->NumSrcRegs;
        int i;
 
-       /* Special case for DDX/DDY (MDH/MDV). */
-       if (inst->Opcode == RC_OPCODE_DDX || inst->Opcode == RC_OPCODE_DDY) {
-               nargs++;
-       }
-
        for(i = 0; i < opcode->NumSrcRegs; ++i) {
                int source;
                if (needrgb && !istranscendent) {

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to