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

Author: Tom Stellard <tstel...@gmail.com>
Date:   Thu Nov 11 01:28:44 2010 -0800

r300/compiler: Make sure presubtract sources use supported swizzles

NOTE: This is a candidate for the 7.9 branch.

---

 .../dri/r300/compiler/r300_fragprog_swizzle.c      |    6 ++++--
 .../drivers/dri/r300/compiler/radeon_optimize.c    |   15 +++++++++++----
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/compiler/r300_fragprog_swizzle.c 
b/src/mesa/drivers/dri/r300/compiler/r300_fragprog_swizzle.c
index 2d28b06..05d3da8 100644
--- a/src/mesa/drivers/dri/r300/compiler/r300_fragprog_swizzle.c
+++ b/src/mesa/drivers/dri/r300/compiler/r300_fragprog_swizzle.c
@@ -94,6 +94,7 @@ static const struct swizzle_data* 
lookup_native_swizzle(unsigned int swizzle)
  */
 static int r300_swizzle_is_native(rc_opcode opcode, struct rc_src_register reg)
 {
+       const struct swizzle_data* sd;
        unsigned int relevant;
        int j;
 
@@ -127,7 +128,8 @@ static int r300_swizzle_is_native(rc_opcode opcode, struct 
rc_src_register reg)
        if ((reg.Negate & relevant) && ((reg.Negate & relevant) != relevant))
                return 0;
 
-       if (!lookup_native_swizzle(reg.Swizzle))
+       sd = lookup_native_swizzle(reg.Swizzle);
+       if (!sd || (reg.File == RC_FILE_PRESUB && sd->srcp_stride == 0))
                return 0;
 
        return 1;
@@ -201,7 +203,7 @@ unsigned int r300FPTranslateRGBSwizzle(unsigned int src, 
unsigned int swizzle)
 {
        const struct swizzle_data* sd = lookup_native_swizzle(swizzle);
 
-       if (!sd) {
+       if (!sd || (src == RC_PAIR_PRESUB_SRC && sd->srcp_stride == 0)) {
                fprintf(stderr, "Not a native swizzle: %08x\n", swizzle);
                return 0;
        }
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c 
b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
index 15b9c5e..96badb0 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
@@ -505,7 +505,9 @@ static void presub_replace_add(
        inst_reader->U.I.SrcReg[src_index].Index = presub_opcode;
 }
 
-static int is_presub_candidate(struct rc_instruction * inst)
+static int is_presub_candidate(
+       struct radeon_compiler * c,
+       struct rc_instruction * inst)
 {
        const struct rc_opcode_info * info = 
rc_get_opcode_info(inst->U.I.Opcode);
        unsigned int i;
@@ -514,7 +516,12 @@ static int is_presub_candidate(struct rc_instruction * 
inst)
                return 0;
 
        for(i = 0; i < info->NumSrcRegs; i++) {
-               if (src_reads_dst_mask(inst->U.I.SrcReg[i], inst->U.I.DstReg))
+               struct rc_src_register src = inst->U.I.SrcReg[i];
+               if (src_reads_dst_mask(src, inst->U.I.DstReg))
+                       return 0;
+
+               src.File = RC_FILE_PRESUB;
+               if (!c->SwizzleCaps->IsNative(inst->U.I.Opcode, src))
                        return 0;
        }
        return 1;
@@ -528,7 +535,7 @@ static int peephole_add_presub_add(
        struct rc_src_register * src1 = NULL;
        unsigned int i;
 
-       if (!is_presub_candidate(inst_add))
+       if (!is_presub_candidate(c, inst_add))
                return 0;
 
        if (inst_add->U.I.SrcReg[0].Swizzle != inst_add->U.I.SrcReg[1].Swizzle)
@@ -592,7 +599,7 @@ static int peephole_add_presub_inv(
 {
        unsigned int i, swz, mask;
 
-       if (!is_presub_candidate(inst_add))
+       if (!is_presub_candidate(c, inst_add))
                return 0;
 
        mask = inst_add->U.I.DstReg.WriteMask;

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

Reply via email to