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

Author: Tom Stellard <tstel...@gmail.com>
Date:   Tue Oct  5 22:53:40 2010 -0700

r300/compiler: Fix incorrect assumption

It is possible for a single pair instruction arg to select from both an
RGB and an Alpha source.

---

 .../dri/r300/compiler/radeon_pair_schedule.c       |    6 ++--
 .../dri/r300/compiler/radeon_program_pair.c        |   28 +++++--------------
 .../dri/r300/compiler/radeon_program_pair.h        |   15 ++++------
 3 files changed, 17 insertions(+), 32 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_pair_schedule.c 
b/src/mesa/drivers/dri/r300/compiler/radeon_pair_schedule.c
index 15e7c0b..d4a3860 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_pair_schedule.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_pair_schedule.c
@@ -286,7 +286,7 @@ static void emit_all_tex(struct schedule_state * s, struct 
rc_instruction * befo
 static int merge_presub_sources(
        struct rc_pair_instruction * dst_full,
        struct rc_pair_sub_instruction src,
-       rc_pair_source_type type)
+       unsigned int type)
 {
        unsigned int srcp_src, srcp_regs, is_rgb, is_alpha;
        struct rc_pair_sub_instruction * dst_sub;
@@ -355,9 +355,9 @@ static int merge_presub_sources(
                for(arg = 0; arg < info->NumSrcRegs; arg++) {
                        /*If this arg does not read from an rgb source,
                         * do nothing. */
-                       if (rc_source_type_that_arg_reads(
+                       if (!(rc_source_type_that_arg_reads(
                                dst_full->RGB.Arg[arg].Source,
-                               dst_full->RGB.Arg[arg].Swizzle, 3) != type) {
+                               dst_full->RGB.Arg[arg].Swizzle) & type)) {
                                continue;
                        }
                        if (dst_full->RGB.Arg[arg].Source == srcp_src)
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_program_pair.c 
b/src/mesa/drivers/dri/r300/compiler/radeon_program_pair.c
index c31efdb..a21fe8d 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_program_pair.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_program_pair.c
@@ -206,34 +206,22 @@ void rc_pair_foreach_source_that_rgb_reads(
 
 /*return 0 for rgb, 1 for alpha -1 for error. */
 
-rc_pair_source_type rc_source_type_that_arg_reads(
+unsigned int rc_source_type_that_arg_reads(
        unsigned int source,
-       unsigned int swizzle,
-       unsigned int channels)
+       unsigned int swizzle)
 {
        unsigned int chan;
        unsigned int swz = RC_SWIZZLE_UNUSED;
-       int isRGB = 0;
-       int isAlpha = 0;
-       /* Find a swizzle that is either X,Y,Z,or W.  We assume here
-        * that if one channel swizzles X,Y, or Z, then none of the
-        * other channels swizzle W, and vice-versa. */
-       for(chan = 0; chan < channels; chan++) {
+       unsigned int ret = RC_PAIR_SOURCE_NONE;
+
+       for(chan = 0; chan < 3; chan++) {
                swz = GET_SWZ(swizzle, chan);
                if (swz == RC_SWIZZLE_W) {
-                       isAlpha = 1;
+                       ret |= RC_PAIR_SOURCE_ALPHA;
                } else if (swz == RC_SWIZZLE_X || swz == RC_SWIZZLE_Y
                                                || swz == RC_SWIZZLE_Z) {
-                       isRGB = 1;
+                       ret |= RC_PAIR_SOURCE_RGB;
                }
        }
-       assert(!isRGB || !isAlpha);
-
-       if(!isRGB && !isAlpha)
-               return RC_PAIR_SOURCE_NONE;
-
-       if (isRGB)
-               return RC_PAIR_SOURCE_RGB;
-       /*isAlpha*/
-       return RC_PAIR_SOURCE_ALPHA;
+       return ret;
 }
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_program_pair.h 
b/src/mesa/drivers/dri/r300/compiler/radeon_program_pair.h
index 01cdb15..54d44a2 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_program_pair.h
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_program_pair.h
@@ -55,6 +55,10 @@ struct radeon_compiler;
  */
 #define RC_PAIR_PRESUB_SRC 3
 
+#define RC_PAIR_SOURCE_NONE  0x0
+#define RC_PAIR_SOURCE_RGB   0x1
+#define RC_PAIR_SOURCE_ALPHA 0x2
+
 struct rc_pair_instruction_source {
        unsigned int Used:1;
        unsigned int File:3;
@@ -93,12 +97,6 @@ struct rc_pair_instruction {
 typedef void (*rc_pair_foreach_src_fn)
                        (void *, struct rc_pair_instruction_source *);
 
-typedef enum {
-       RC_PAIR_SOURCE_NONE = 0,
-       RC_PAIR_SOURCE_RGB,
-       RC_PAIR_SOURCE_ALPHA
-} rc_pair_source_type;
-
 /**
  * General helper functions for dealing with the paired instruction format.
  */
@@ -117,10 +115,9 @@ void rc_pair_foreach_source_that_rgb_reads(
        void * data,
        rc_pair_foreach_src_fn cb);
 
-rc_pair_source_type rc_source_type_that_arg_reads(
+unsigned int rc_source_type_that_arg_reads(
        unsigned int source,
-       unsigned int swizzle,
-       unsigned int channels);
+       unsigned int swizzle);
 /*...@}*/
 
 

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

Reply via email to