r300/compiler: More agressive RGB to Alpha conversions
authorTom Stellard <tstellar@gmail.com>
Sat, 15 Oct 2011 21:55:40 +0000 (17:55 -0400)
committerTom Stellard <tstellar@gmail.com>
Mon, 17 Oct 2011 02:54:48 +0000 (19:54 -0700)
src/gallium/drivers/r300/compiler/radeon_pair_schedule.c

index 7ecdc7c43d83667b7fb084be6a7fe9da4fb88594..94cf9a77cea5e06faa026d0a9ec9e7f294935f9e 100644 (file)
@@ -781,7 +781,7 @@ static void is_rgb_to_alpha_possible(
        struct rc_pair_instruction_arg * arg,
        struct rc_pair_instruction_source * src)
 {
-       unsigned int chan_count = 0;
+       unsigned int read_chan = RC_SWIZZLE_UNUSED;
        unsigned int alpha_sources = 0;
        unsigned int i;
        struct rc_reader_data * reader_data = userdata;
@@ -803,8 +803,9 @@ static void is_rgb_to_alpha_possible(
                return;
        }
 
-       /* Make sure the source only reads from one component.
-        * XXX We should allow the source to read from the same component twice.
+       /* Make sure the source only reads the register component that we
+        * are going to be convering from.  It is OK if the instruction uses
+        * this component more than once.
         * XXX If the index we will be converting to is the same as the
         * current index, then it is OK to read from more than one component.
         */
@@ -815,16 +816,17 @@ static void is_rgb_to_alpha_possible(
                case RC_SWIZZLE_Y:
                case RC_SWIZZLE_Z:
                case RC_SWIZZLE_W:
-                       chan_count++;
+                       if (read_chan == RC_SWIZZLE_UNUSED) {
+                               read_chan = swz;
+                       } else if (read_chan != swz) {
+                               reader_data->Abort = 1;
+                               return;
+                       }
                        break;
                default:
                        break;
                }
        }
-       if (chan_count > 1) {
-               reader_data->Abort = 1;
-               return;
-       }
 
        /* Make sure there are enough alpha sources.
         * XXX If we know what register all the readers are going