[Mesa-dev] gallium: remove support for predicates from TGSI

Submitted by Marek Olšák on Sept. 1, 2015, 9:19 p.m.

Details

Message ID 1441142397-2317-1-git-send-email-maraeo@gmail.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Marek Olšák Sept. 1, 2015, 9:19 p.m.
From: Marek Olšák <marek.olsak@amd.com>

Neved used.
---
Take 2. Let's see how people feel about TGSI now.

 src/gallium/auxiliary/gallivm/lp_bld_limits.h      |   4 -
 src/gallium/auxiliary/gallivm/lp_bld_tgsi.h        |   2 -
 src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c    |  46 -------
 src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c   |   6 +-
 src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c    | 138 ++-----------------
 src/gallium/auxiliary/tgsi/tgsi_build.c            |  66 ---------
 src/gallium/auxiliary/tgsi/tgsi_build.h            |   3 -
 src/gallium/auxiliary/tgsi/tgsi_dump.c             |  24 ----
 src/gallium/auxiliary/tgsi/tgsi_exec.c             |  59 --------
 src/gallium/auxiliary/tgsi/tgsi_exec.h             |   7 -
 src/gallium/auxiliary/tgsi/tgsi_parse.c            |   4 -
 src/gallium/auxiliary/tgsi/tgsi_parse.h            |   1 -
 src/gallium/auxiliary/tgsi/tgsi_sanity.c           |   1 -
 src/gallium/auxiliary/tgsi/tgsi_strings.c          |   1 -
 src/gallium/auxiliary/tgsi/tgsi_text.c             |  37 -----
 src/gallium/auxiliary/tgsi/tgsi_ureg.c             |  84 +-----------
 src/gallium/auxiliary/tgsi/tgsi_ureg.h             | 149 +--------------------
 src/gallium/docs/source/screen.rst                 |   1 -
 src/gallium/drivers/freedreno/freedreno_screen.c   |   2 -
 src/gallium/drivers/i915/i915_fpc.h                |   1 -
 src/gallium/drivers/i915/i915_screen.c             |   2 -
 src/gallium/drivers/ilo/ilo_screen.c               |   2 -
 src/gallium/drivers/ilo/shader/toy_tgsi.c          |   5 -
 .../drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp  |  10 +-
 src/gallium/drivers/nouveau/nv30/nv30_screen.c     |   2 -
 src/gallium/drivers/nouveau/nv50/nv50_screen.c     |   2 -
 src/gallium/drivers/nouveau/nvc0/nvc0_screen.c     |   2 -
 src/gallium/drivers/r300/r300_screen.c             |   4 -
 src/gallium/drivers/r600/r600_pipe.c               |   2 -
 src/gallium/drivers/r600/r600_shader.c             |   4 -
 src/gallium/drivers/radeonsi/si_pipe.c             |   2 -
 src/gallium/drivers/svga/svga_screen.c             |   4 -
 src/gallium/include/pipe/p_defines.h               |   1 -
 src/gallium/include/pipe/p_shader_tokens.h         |  25 +---
 src/gallium/state_trackers/nine/nine_shader.c      |  18 +--
 35 files changed, 27 insertions(+), 694 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_limits.h b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
index 571c615..da774bf 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_limits.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
@@ -49,8 +49,6 @@ 
 
 #define LP_MAX_TGSI_IMMEDIATES 4096
 
-#define LP_MAX_TGSI_PREDS 16
-
 #define LP_MAX_TGSI_CONSTS 4096
 
 #define LP_MAX_TGSI_CONST_BUFFERS 16
@@ -109,8 +107,6 @@  gallivm_get_shader_param(enum pipe_shader_cap param)
       return PIPE_MAX_CONSTANT_BUFFERS;
    case PIPE_SHADER_CAP_MAX_TEMPS:
       return LP_MAX_TGSI_TEMPS;
-   case PIPE_SHADER_CAP_MAX_PREDS:
-      return LP_MAX_TGSI_PREDS;
    case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
       return 1;
    case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
index 2ca9c61..a48f008 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
@@ -455,7 +455,6 @@  struct lp_build_tgsi_soa_context
    LLVMValueRef immediates[LP_MAX_INLINED_IMMEDIATES][TGSI_NUM_CHANNELS];
    LLVMValueRef temps[LP_MAX_INLINED_TEMPS][TGSI_NUM_CHANNELS];
    LLVMValueRef addr[LP_MAX_TGSI_ADDRS][TGSI_NUM_CHANNELS];
-   LLVMValueRef preds[LP_MAX_TGSI_PREDS][TGSI_NUM_CHANNELS];
 
    /* We allocate/use this array of temps if (1 << TGSI_FILE_TEMPORARY) is
     * set in the indirect_files field.
@@ -549,7 +548,6 @@  struct lp_build_tgsi_aos_context
    LLVMValueRef immediates[LP_MAX_INLINED_IMMEDIATES];
    LLVMValueRef temps[LP_MAX_INLINED_TEMPS];
    LLVMValueRef addr[LP_MAX_TGSI_ADDRS];
-   LLVMValueRef preds[LP_MAX_TGSI_PREDS];
 
    /* We allocate/use this array of temps if (1 << TGSI_FILE_TEMPORARY) is
     * set in the indirect_files field.
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
index 610283d..8094efc 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
@@ -256,10 +256,6 @@  lp_emit_store_aos(
       ptr = bld->addr[reg->Indirect.Index];
       break;
 
-   case TGSI_FILE_PREDICATE:
-      ptr = bld->preds[reg->Register.Index];
-      break;
-
    default:
       assert(0);
       return;
@@ -267,43 +263,6 @@  lp_emit_store_aos(
 
    if (!ptr)
       return;
-   /*
-    * Predicate
-    */
-
-   if (inst->Instruction.Predicate) {
-      LLVMValueRef pred;
-
-      assert(inst->Predicate.Index < LP_MAX_TGSI_PREDS);
-
-      pred = LLVMBuildLoad(builder,
-                           bld->preds[inst->Predicate.Index], "");
-
-      /*
-       * Convert the value to an integer mask.
-       */
-      pred = lp_build_compare(bld->bld_base.base.gallivm,
-                               bld->bld_base.base.type,
-                               PIPE_FUNC_NOTEQUAL,
-                               pred,
-                               bld->bld_base.base.zero);
-
-      if (inst->Predicate.Negate) {
-         pred = LLVMBuildNot(builder, pred, "");
-      }
-
-      pred = bld->bld_base.emit_swizzle(&bld->bld_base, pred,
-                         inst->Predicate.SwizzleX,
-                         inst->Predicate.SwizzleY,
-                         inst->Predicate.SwizzleZ,
-                         inst->Predicate.SwizzleW);
-
-      if (mask) {
-         mask = LLVMBuildAnd(builder, mask, pred, "");
-      } else {
-         mask = pred;
-      }
-   }
 
    /*
     * Writemask
@@ -442,11 +401,6 @@  lp_emit_declaration_aos(
          bld->addr[idx] = lp_build_alloca(gallivm, vec_type, "");
          break;
 
-      case TGSI_FILE_PREDICATE:
-         assert(idx < LP_MAX_TGSI_PREDS);
-         bld->preds[idx] = lp_build_alloca(gallivm, vec_type, "");
-         break;
-
       case TGSI_FILE_SAMPLER_VIEW:
          /*
           * The target stored here MUST match whatever there actually
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
index 906a174..a5d80a2 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
@@ -305,8 +305,7 @@  analyse_instruction(struct analysis_context *ctx,
       } else if (dst->File == TGSI_FILE_OUTPUT) {
          regs = info->output;
          max_regs = Elements(info->output);
-      } else if (dst->File == TGSI_FILE_ADDRESS ||
-                 dst->File == TGSI_FILE_PREDICATE) {
+      } else if (dst->File == TGSI_FILE_ADDRESS) {
          continue;
       } else {
          assert(0);
@@ -389,8 +388,7 @@  analyse_instruction(struct analysis_context *ctx,
 
          memset(res, 0, sizeof res);
 
-         if (!inst->Instruction.Predicate &&
-             !inst->Instruction.Saturate) {
+         if (!inst->Instruction.Saturate) {
             for (chan = 0; chan < 4; ++chan) {
                if (dst->WriteMask & (1 << chan)) {
                   if (inst->Instruction.Opcode == TGSI_OPCODE_MOV) {
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
index fae604e..7a31434 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
@@ -753,25 +753,16 @@  static void lp_exec_default(struct lp_exec_mask *mask,
  */
 static void lp_exec_mask_store(struct lp_exec_mask *mask,
                                struct lp_build_context *bld_store,
-                               LLVMValueRef pred,
                                LLVMValueRef val,
                                LLVMValueRef dst_ptr)
 {
    LLVMBuilderRef builder = mask->bld->gallivm->builder;
+   LLVMValueRef pred = mask->has_mask ? mask->exec_mask : NULL;
 
    assert(lp_check_value(bld_store->type, val));
    assert(LLVMGetTypeKind(LLVMTypeOf(dst_ptr)) == LLVMPointerTypeKind);
    assert(LLVMGetElementType(LLVMTypeOf(dst_ptr)) == LLVMTypeOf(val));
 
-   /* Mix the predicate and execution mask */
-   if (mask->has_mask) {
-      if (pred) {
-         pred = LLVMBuildAnd(builder, pred, mask->exec_mask, "");
-      } else {
-         pred = mask->exec_mask;
-      }
-   }
-
    if (pred) {
       LLVMValueRef res, dst;
 
@@ -1036,22 +1027,12 @@  emit_mask_scatter(struct lp_build_tgsi_soa_context *bld,
                   LLVMValueRef base_ptr,
                   LLVMValueRef indexes,
                   LLVMValueRef values,
-                  struct lp_exec_mask *mask,
-                  LLVMValueRef pred)
+                  struct lp_exec_mask *mask)
 {
    struct gallivm_state *gallivm = bld->bld_base.base.gallivm;
    LLVMBuilderRef builder = gallivm->builder;
    unsigned i;
-
-   /* Mix the predicate and execution mask */
-   if (mask->has_mask) {
-      if (pred) {
-         pred = LLVMBuildAnd(builder, pred, mask->exec_mask, "");
-      }
-      else {
-         pred = mask->exec_mask;
-      }
-   }
+   LLVMValueRef pred = mask->has_mask ? mask->exec_mask : NULL;
 
    /*
     * Loop over elements of index_vec, store scalar value.
@@ -1713,74 +1694,6 @@  emit_fetch_deriv(
       *ddy = lp_build_ddy(&bld->bld_base.base, src);
 }
 
-
-/**
- * Predicate.
- */
-static void
-emit_fetch_predicate(
-   struct lp_build_tgsi_soa_context *bld,
-   const struct tgsi_full_instruction *inst,
-   LLVMValueRef *pred)
-{
-   LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder;
-   unsigned index;
-   unsigned char swizzles[4];
-   LLVMValueRef unswizzled[4] = {NULL, NULL, NULL, NULL};
-   LLVMValueRef value;
-   unsigned chan;
-
-   if (!inst->Instruction.Predicate) {
-      TGSI_FOR_EACH_CHANNEL( chan ) {
-         pred[chan] = NULL;
-      }
-      return;
-   }
-
-   swizzles[0] = inst->Predicate.SwizzleX;
-   swizzles[1] = inst->Predicate.SwizzleY;
-   swizzles[2] = inst->Predicate.SwizzleZ;
-   swizzles[3] = inst->Predicate.SwizzleW;
-
-   index = inst->Predicate.Index;
-   assert(index < LP_MAX_TGSI_PREDS);
-
-   TGSI_FOR_EACH_CHANNEL( chan ) {
-      unsigned swizzle = swizzles[chan];
-
-      /*
-       * Only fetch the predicate register channels that are actually listed
-       * in the swizzles
-       */
-      if (!unswizzled[swizzle]) {
-         value = LLVMBuildLoad(builder,
-                               bld->preds[index][swizzle], "");
-
-         /*
-          * Convert the value to an integer mask.
-          *
-          * TODO: Short-circuit this comparison -- a D3D setp_xx instructions
-          * is needlessly causing two comparisons due to storing the intermediate
-          * result as float vector instead of an integer mask vector.
-          */
-         value = lp_build_compare(bld->bld_base.base.gallivm,
-                                  bld->bld_base.base.type,
-                                  PIPE_FUNC_NOTEQUAL,
-                                  value,
-                                  bld->bld_base.base.zero);
-         if (inst->Predicate.Negate) {
-            value = LLVMBuildNot(builder, value, "");
-         }
-
-         unswizzled[swizzle] = value;
-      } else {
-         value = unswizzled[swizzle];
-      }
-
-      pred[chan] = value;
-   }
-}
-
 /**
  * store an array of 8 doubles into two arrays of 8 floats
  * i.e.
@@ -1794,7 +1707,6 @@  static void
 emit_store_double_chan(struct lp_build_tgsi_context *bld_base,
                        int dtype,
                        LLVMValueRef chan_ptr, LLVMValueRef chan_ptr2,
-                       LLVMValueRef pred,
                        LLVMValueRef value)
 {
    struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
@@ -1822,8 +1734,8 @@  emit_store_double_chan(struct lp_build_tgsi_context *bld_base,
                                                   bld_base->base.type.length),
                                   "");
 
-   lp_exec_mask_store(&bld->exec_mask, float_bld, pred, temp, chan_ptr);
-   lp_exec_mask_store(&bld->exec_mask, float_bld, pred, temp2, chan_ptr2);
+   lp_exec_mask_store(&bld->exec_mask, float_bld, temp, chan_ptr);
+   lp_exec_mask_store(&bld->exec_mask, float_bld, temp2, chan_ptr2);
 }
 
 /**
@@ -1835,7 +1747,6 @@  emit_store_chan(
    const struct tgsi_full_instruction *inst,
    unsigned index,
    unsigned chan_index,
-   LLVMValueRef pred,
    LLVMValueRef value)
 {
    struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
@@ -1898,7 +1809,7 @@  emit_store_chan(
 
          /* Scatter store values into output registers */
          emit_mask_scatter(bld, outputs_array, index_vec, value,
-                           &bld->exec_mask, pred);
+                           &bld->exec_mask);
       }
       else {
          LLVMValueRef out_ptr = lp_get_output_ptr(bld, reg->Register.Index,
@@ -1908,9 +1819,9 @@  emit_store_chan(
             LLVMValueRef out_ptr2 = lp_get_output_ptr(bld, reg->Register.Index,
                                                       chan_index + 1);
             emit_store_double_chan(bld_base, dtype, out_ptr, out_ptr2,
-                                   pred, value);
+                                   value);
          } else
-            lp_exec_mask_store(&bld->exec_mask, float_bld, pred, value, out_ptr);
+            lp_exec_mask_store(&bld->exec_mask, float_bld, value, out_ptr);
       }
       break;
 
@@ -1936,7 +1847,7 @@  emit_store_chan(
 
          /* Scatter store values into temp registers */
          emit_mask_scatter(bld, temps_array, index_vec, value,
-                           &bld->exec_mask, pred);
+                           &bld->exec_mask);
       }
       else {
          LLVMValueRef temp_ptr;
@@ -1947,10 +1858,10 @@  emit_store_chan(
                                                          reg->Register.Index,
                                                          chan_index + 1);
             emit_store_double_chan(bld_base, dtype, temp_ptr, temp_ptr2,
-                                   pred, value);
+                                   value);
          }
          else
-            lp_exec_mask_store(&bld->exec_mask, float_bld, pred, value, temp_ptr);
+            lp_exec_mask_store(&bld->exec_mask, float_bld, value, temp_ptr);
       }
       break;
 
@@ -1958,17 +1869,10 @@  emit_store_chan(
       assert(dtype == TGSI_TYPE_SIGNED);
       assert(LLVMTypeOf(value) == int_bld->vec_type);
       value = LLVMBuildBitCast(builder, value, int_bld->vec_type, "");
-      lp_exec_mask_store(&bld->exec_mask, int_bld, pred, value,
+      lp_exec_mask_store(&bld->exec_mask, int_bld, value,
                          bld->addr[reg->Register.Index][chan_index]);
       break;
 
-   case TGSI_FILE_PREDICATE:
-      assert(LLVMTypeOf(value) == float_bld->vec_type);
-      value = LLVMBuildBitCast(builder, value, float_bld->vec_type, "");
-      lp_exec_mask_store(&bld->exec_mask, float_bld, pred, value,
-                         bld->preds[reg->Register.Index][chan_index]);
-      break;
-
    default:
       assert( 0 );
    }
@@ -2018,18 +1922,13 @@  emit_store(
 
 {
    unsigned chan_index;
-   struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
    enum tgsi_opcode_type dtype = tgsi_opcode_infer_dst_type(inst->Instruction.Opcode);
-   if(info->num_dst) {
-      LLVMValueRef pred[TGSI_NUM_CHANNELS];
-
-      emit_fetch_predicate( bld, inst, pred );
 
+   if(info->num_dst) {
       TGSI_FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
-
          if (dtype == TGSI_TYPE_DOUBLE && (chan_index == 1 || chan_index == 3))
              continue;
-         emit_store_chan(bld_base, inst, 0, chan_index, pred[chan_index], dst[chan_index]);
+         emit_store_chan(bld_base, inst, 0, chan_index, dst[chan_index]);
       }
    }
 }
@@ -2963,15 +2862,6 @@  lp_emit_declaration_soa(
       }
       break;
 
-   case TGSI_FILE_PREDICATE:
-      assert(last < LP_MAX_TGSI_PREDS);
-      for (idx = first; idx <= last; ++idx) {
-         for (i = 0; i < TGSI_NUM_CHANNELS; i++)
-            bld->preds[idx][i] = lp_build_alloca(gallivm, vec_type,
-                                                 "predicate");
-      }
-      break;
-
    case TGSI_FILE_SAMPLER_VIEW:
       /*
        * The target stored here MUST match whatever there actually
diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c b/src/gallium/auxiliary/tgsi/tgsi_build.c
index fdb7feb..b237df4 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_build.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_build.c
@@ -611,7 +611,6 @@  tgsi_default_instruction( void )
    instruction.NrTokens = 0;
    instruction.Opcode = TGSI_OPCODE_MOV;
    instruction.Saturate = 0;
-   instruction.Predicate = 0;
    instruction.NumDstRegs = 1;
    instruction.NumSrcRegs = 1;
    instruction.Label = 0;
@@ -624,7 +623,6 @@  tgsi_default_instruction( void )
 static struct tgsi_instruction
 tgsi_build_instruction(unsigned opcode,
                        unsigned saturate,
-                       unsigned predicate,
                        unsigned num_dst_regs,
                        unsigned num_src_regs,
                        struct tgsi_header *header)
@@ -639,7 +637,6 @@  tgsi_build_instruction(unsigned opcode,
    instruction = tgsi_default_instruction();
    instruction.Opcode = opcode;
    instruction.Saturate = saturate;
-   instruction.Predicate = predicate;
    instruction.NumDstRegs = num_dst_regs;
    instruction.NumSrcRegs = num_src_regs;
 
@@ -660,47 +657,6 @@  instruction_grow(
    header_bodysize_grow( header );
 }
 
-struct tgsi_instruction_predicate
-tgsi_default_instruction_predicate(void)
-{
-   struct tgsi_instruction_predicate instruction_predicate;
-
-   instruction_predicate.SwizzleX = TGSI_SWIZZLE_X;
-   instruction_predicate.SwizzleY = TGSI_SWIZZLE_Y;
-   instruction_predicate.SwizzleZ = TGSI_SWIZZLE_Z;
-   instruction_predicate.SwizzleW = TGSI_SWIZZLE_W;
-   instruction_predicate.Negate = 0;
-   instruction_predicate.Index = 0;
-   instruction_predicate.Padding = 0;
-
-   return instruction_predicate;
-}
-
-static struct tgsi_instruction_predicate
-tgsi_build_instruction_predicate(int index,
-                                 unsigned negate,
-                                 unsigned swizzleX,
-                                 unsigned swizzleY,
-                                 unsigned swizzleZ,
-                                 unsigned swizzleW,
-                                 struct tgsi_instruction *instruction,
-                                 struct tgsi_header *header)
-{
-   struct tgsi_instruction_predicate instruction_predicate;
-
-   instruction_predicate = tgsi_default_instruction_predicate();
-   instruction_predicate.SwizzleX = swizzleX;
-   instruction_predicate.SwizzleY = swizzleY;
-   instruction_predicate.SwizzleZ = swizzleZ;
-   instruction_predicate.SwizzleW = swizzleW;
-   instruction_predicate.Negate = negate;
-   instruction_predicate.Index = index;
-
-   instruction_grow(instruction, header);
-
-   return instruction_predicate;
-}
-
 static struct tgsi_instruction_label
 tgsi_default_instruction_label( void )
 {
@@ -1005,7 +961,6 @@  tgsi_default_full_instruction( void )
    unsigned i;
 
    full_instruction.Instruction = tgsi_default_instruction();
-   full_instruction.Predicate = tgsi_default_instruction_predicate();
    full_instruction.Label = tgsi_default_instruction_label();
    full_instruction.Texture = tgsi_default_instruction_texture();
    for( i = 0;  i < TGSI_FULL_MAX_TEX_OFFSETS; i++ ) {
@@ -1040,32 +995,11 @@  tgsi_build_full_instruction(
 
    *instruction = tgsi_build_instruction(full_inst->Instruction.Opcode,
                                          full_inst->Instruction.Saturate,
-                                         full_inst->Instruction.Predicate,
                                          full_inst->Instruction.NumDstRegs,
                                          full_inst->Instruction.NumSrcRegs,
                                          header);
    prev_token = (struct tgsi_token  *) instruction;
 
-   if (full_inst->Instruction.Predicate) {
-      struct tgsi_instruction_predicate *instruction_predicate;
-
-      if (maxsize <= size) {
-         return 0;
-      }
-      instruction_predicate = (struct tgsi_instruction_predicate *)&tokens[size];
-      size++;
-
-      *instruction_predicate =
-         tgsi_build_instruction_predicate(full_inst->Predicate.Index,
-                                          full_inst->Predicate.Negate,
-                                          full_inst->Predicate.SwizzleX,
-                                          full_inst->Predicate.SwizzleY,
-                                          full_inst->Predicate.SwizzleZ,
-                                          full_inst->Predicate.SwizzleW,
-                                          instruction,
-                                          header);
-   }
-
    if (full_inst->Instruction.Label) {
       struct tgsi_instruction_label *instruction_label;
 
diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.h b/src/gallium/auxiliary/tgsi/tgsi_build.h
index c5127e1..c782a50 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_build.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_build.h
@@ -108,9 +108,6 @@  tgsi_build_full_instruction(
    struct tgsi_header *header,
    unsigned maxsize );
 
-struct tgsi_instruction_predicate
-tgsi_default_instruction_predicate(void);
-
 #if defined __cplusplus
 }
 #endif
diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c
index 8ceb5b4..37a8879 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
@@ -517,30 +517,6 @@  iter_instruction(
       TXT( "  " );
    ctx->indent += info->post_indent;
 
-   if (inst->Instruction.Predicate) {
-      CHR( '(' );
-
-      if (inst->Predicate.Negate)
-         CHR( '!' );
-
-      TXT( "PRED[" );
-      SID( inst->Predicate.Index );
-      CHR( ']' );
-
-      if (inst->Predicate.SwizzleX != TGSI_SWIZZLE_X ||
-          inst->Predicate.SwizzleY != TGSI_SWIZZLE_Y ||
-          inst->Predicate.SwizzleZ != TGSI_SWIZZLE_Z ||
-          inst->Predicate.SwizzleW != TGSI_SWIZZLE_W) {
-         CHR( '.' );
-         ENM( inst->Predicate.SwizzleX, tgsi_swizzle_names );
-         ENM( inst->Predicate.SwizzleY, tgsi_swizzle_names );
-         ENM( inst->Predicate.SwizzleZ, tgsi_swizzle_names );
-         ENM( inst->Predicate.SwizzleW, tgsi_swizzle_names );
-      }
-
-      TXT( ") " );
-   }
-
    TXT( info->mnemonic );
 
    if (inst->Instruction.Saturate) {
diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index 75cd0d5..2954d4d 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -1037,7 +1037,6 @@  tgsi_exec_machine_create( void )
 
    mach->Addrs = &mach->Temps[TGSI_EXEC_TEMP_ADDR];
    mach->MaxGeometryShaderOutputs = TGSI_MAX_TOTAL_VERTICES;
-   mach->Predicates = &mach->Temps[TGSI_EXEC_TEMP_P0];
 
    mach->Inputs = align_malloc(sizeof(struct tgsi_exec_vector) * PIPE_MAX_SHADER_INPUTS, 16);
    mach->Outputs = align_malloc(sizeof(struct tgsi_exec_vector) * PIPE_MAX_SHADER_OUTPUTS, 16);
@@ -1303,15 +1302,6 @@  fetch_src_file_channel(const struct tgsi_exec_machine *mach,
       }
       break;
 
-   case TGSI_FILE_PREDICATE:
-      for (i = 0; i < TGSI_QUAD_SIZE; i++) {
-         assert(index->i[i] >= 0 && index->i[i] < TGSI_EXEC_NUM_PREDS);
-         assert(index2D->i[i] == 0);
-
-         chan->u[i] = mach->Predicates[0].xyzw[swizzle].u[i];
-      }
-      break;
-
    case TGSI_FILE_OUTPUT:
       /* vertex/fragment output vars can be read too */
       for (i = 0; i < TGSI_QUAD_SIZE; i++) {
@@ -1514,11 +1504,9 @@  store_dest_dstret(struct tgsi_exec_machine *mach,
                  uint chan_index,
                  enum tgsi_exec_datatype dst_datatype)
 {
-   uint i;
    static union tgsi_exec_channel null;
    union tgsi_exec_channel *dst;
    union tgsi_exec_channel index2D;
-   uint execmask = mach->ExecMask;
    int offset = 0;  /* indirection offset */
    int index;
 
@@ -1670,58 +1658,11 @@  store_dest_dstret(struct tgsi_exec_machine *mach,
       dst = &mach->Addrs[index].xyzw[chan_index];
       break;
 
-   case TGSI_FILE_PREDICATE:
-      index = reg->Register.Index;
-      assert(index < TGSI_EXEC_NUM_PREDS);
-      dst = &mach->Predicates[index].xyzw[chan_index];
-      break;
-
    default:
       assert( 0 );
       return NULL;
    }
 
-   if (inst->Instruction.Predicate) {
-      uint swizzle;
-      union tgsi_exec_channel *pred;
-
-      switch (chan_index) {
-      case TGSI_CHAN_X:
-         swizzle = inst->Predicate.SwizzleX;
-         break;
-      case TGSI_CHAN_Y:
-         swizzle = inst->Predicate.SwizzleY;
-         break;
-      case TGSI_CHAN_Z:
-         swizzle = inst->Predicate.SwizzleZ;
-         break;
-      case TGSI_CHAN_W:
-         swizzle = inst->Predicate.SwizzleW;
-         break;
-      default:
-         assert(0);
-         return NULL;
-      }
-
-      assert(inst->Predicate.Index == 0);
-
-      pred = &mach->Predicates[inst->Predicate.Index].xyzw[swizzle];
-
-      if (inst->Predicate.Negate) {
-         for (i = 0; i < TGSI_QUAD_SIZE; i++) {
-            if (pred->u[i]) {
-               execmask &= ~(1 << i);
-            }
-         }
-      } else {
-         for (i = 0; i < TGSI_QUAD_SIZE; i++) {
-            if (!pred->u[i]) {
-               execmask &= ~(1 << i);
-            }
-         }
-      }
-   }
-
    return dst;
 }
 
diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h b/src/gallium/auxiliary/tgsi/tgsi_exec.h
index 5d56aab..a425c51 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
@@ -195,10 +195,6 @@  struct tgsi_sampler
 
 #define TGSI_EXEC_TEMP_ADDR         (TGSI_EXEC_NUM_TEMPS + 8)
 
-/* predicate register */
-#define TGSI_EXEC_TEMP_P0           (TGSI_EXEC_NUM_TEMPS + 9)
-#define TGSI_EXEC_NUM_PREDS         1
-
 #define TGSI_EXEC_NUM_TEMP_EXTRAS   10
 
 
@@ -281,7 +277,6 @@  struct tgsi_exec_machine
    union tgsi_exec_channel       SystemValue[TGSI_MAX_MISC_INPUTS];
 
    struct tgsi_exec_vector       *Addrs;
-   struct tgsi_exec_vector       *Predicates;
 
    struct tgsi_sampler           *Sampler;
 
@@ -435,8 +430,6 @@  tgsi_exec_get_shader_param(enum pipe_shader_cap param)
       return PIPE_MAX_CONSTANT_BUFFERS;
    case PIPE_SHADER_CAP_MAX_TEMPS:
       return TGSI_EXEC_NUM_TEMPS;
-   case PIPE_SHADER_CAP_MAX_PREDS:
-      return TGSI_EXEC_NUM_PREDS;
    case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
       return 1;
    case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.c b/src/gallium/auxiliary/tgsi/tgsi_parse.c
index 0729b5d..58b0119 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_parse.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_parse.c
@@ -180,10 +180,6 @@  tgsi_parse_token(
       memset(inst, 0, sizeof *inst);
       copy_token(&inst->Instruction, &token);
 
-      if (inst->Instruction.Predicate) {
-         next_token(ctx, &inst->Predicate);
-      }
-
       if (inst->Instruction.Label) {
          next_token( ctx, &inst->Label);
       }
diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.h b/src/gallium/auxiliary/tgsi/tgsi_parse.h
index 35e1c7c..f0f4a58 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_parse.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_parse.h
@@ -88,7 +88,6 @@  struct tgsi_full_property
 struct tgsi_full_instruction
 {
    struct tgsi_instruction             Instruction;
-   struct tgsi_instruction_predicate   Predicate;
    struct tgsi_instruction_label       Label;
    struct tgsi_instruction_texture     Texture;
    struct tgsi_full_dst_register       Dst[TGSI_FULL_MAX_DST_REGISTERS];
diff --git a/src/gallium/auxiliary/tgsi/tgsi_sanity.c b/src/gallium/auxiliary/tgsi/tgsi_sanity.c
index d14372f..e9cbf10 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_sanity.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_sanity.c
@@ -256,7 +256,6 @@  static const char *file_names[TGSI_FILE_COUNT] =
    "SAMP",
    "ADDR",
    "IMM",
-   "PRED",
    "SV",
    "RES"
 };
diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c b/src/gallium/auxiliary/tgsi/tgsi_strings.c
index 8271ea0..5c4eb98 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_strings.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c
@@ -52,7 +52,6 @@  static const char *tgsi_file_names[] =
    "SAMP",
    "ADDR",
    "IMM",
-   "PRED",
    "SV",
    "RES",
    "SVIEW"
diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c
index 3e3ed5b..c414c58 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_text.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
@@ -952,43 +952,6 @@  parse_instruction(
 
    inst = tgsi_default_full_instruction();
 
-   /* Parse predicate.
-    */
-   eat_opt_white( &ctx->cur );
-   if (*ctx->cur == '(') {
-      uint file;
-      int index;
-      uint swizzle[4];
-      boolean parsed_swizzle;
-
-      inst.Instruction.Predicate = 1;
-
-      ctx->cur++;
-      if (*ctx->cur == '!') {
-         ctx->cur++;
-         inst.Predicate.Negate = 1;
-      }
-
-      if (!parse_register_1d( ctx, &file, &index ))
-         return FALSE;
-
-      if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle, 4 )) {
-         if (parsed_swizzle) {
-            inst.Predicate.SwizzleX = swizzle[0];
-            inst.Predicate.SwizzleY = swizzle[1];
-            inst.Predicate.SwizzleZ = swizzle[2];
-            inst.Predicate.SwizzleW = swizzle[3];
-         }
-      }
-
-      if (*ctx->cur != ')') {
-         report_error( ctx, "Expected `)'" );
-         return FALSE;
-      }
-
-      ctx->cur++;
-   }
-
    /* Parse instruction name.
     */
    eat_opt_white( &ctx->cur );
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
index 3d21319..a292b97 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
@@ -55,7 +55,6 @@  union tgsi_any_token {
    struct tgsi_immediate imm;
    union  tgsi_immediate_data imm_data;
    struct tgsi_instruction insn;
-   struct tgsi_instruction_predicate insn_predicate;
    struct tgsi_instruction_label insn_label;
    struct tgsi_instruction_texture insn_texture;
    struct tgsi_texture_offset insn_texture_offset;
@@ -80,7 +79,6 @@  struct ureg_tokens {
 #define UREG_MAX_CONSTANT_RANGE 32
 #define UREG_MAX_IMMEDIATE 4096
 #define UREG_MAX_ADDR 3
-#define UREG_MAX_PRED 1
 #define UREG_MAX_ARRAY_TEMPS 256
 
 struct const_decl {
@@ -168,7 +166,6 @@  struct ureg_program
    unsigned properties[TGSI_PROPERTY_COUNT];
 
    unsigned nr_addrs;
-   unsigned nr_preds;
    unsigned nr_instructions;
 
    struct ureg_tokens domain[2];
@@ -241,6 +238,7 @@  static union tgsi_any_token *retrieve_token( struct ureg_program *ureg,
    return &ureg->domain[domain].tokens[nr];
 }
 
+
 void
 ureg_property(struct ureg_program *ureg, unsigned name, unsigned value)
 {
@@ -577,19 +575,6 @@  struct ureg_dst ureg_DECL_address( struct ureg_program *ureg )
    return ureg_dst_register( TGSI_FILE_ADDRESS, 0 );
 }
 
-/* Allocate a new predicate register.
- */
-struct ureg_dst
-ureg_DECL_predicate(struct ureg_program *ureg)
-{
-   if (ureg->nr_preds < UREG_MAX_PRED) {
-      return ureg_dst_register(TGSI_FILE_PREDICATE, ureg->nr_preds++);
-   }
-
-   assert(0);
-   return ureg_dst_register(TGSI_FILE_PREDICATE, 0);
-}
-
 /* Allocate a new sampler.
  */
 struct ureg_src ureg_DECL_sampler( struct ureg_program *ureg,
@@ -1028,17 +1013,11 @@  struct ureg_emit_insn_result
 ureg_emit_insn(struct ureg_program *ureg,
                unsigned opcode,
                boolean saturate,
-               boolean predicate,
-               boolean pred_negate,
-               unsigned pred_swizzle_x,
-               unsigned pred_swizzle_y,
-               unsigned pred_swizzle_z,
-               unsigned pred_swizzle_w,
                unsigned num_dst,
-               unsigned num_src )
+               unsigned num_src)
 {
    union tgsi_any_token *out;
-   uint count = predicate ? 2 : 1;
+   uint count = 1;
    struct ureg_emit_insn_result result;
 
    validate( opcode, num_dst, num_src );
@@ -1053,16 +1032,6 @@  ureg_emit_insn(struct ureg_program *ureg,
    result.insn_token = ureg->domain[DOMAIN_INSN].count - count;
    result.extended_token = result.insn_token;
 
-   if (predicate) {
-      out[0].insn.Predicate = 1;
-      out[1].insn_predicate = tgsi_default_instruction_predicate();
-      out[1].insn_predicate.Negate = pred_negate;
-      out[1].insn_predicate.SwizzleX = pred_swizzle_x;
-      out[1].insn_predicate.SwizzleY = pred_swizzle_y;
-      out[1].insn_predicate.SwizzleZ = pred_swizzle_z;
-      out[1].insn_predicate.SwizzleW = pred_swizzle_w;
-   }
-
    ureg->nr_instructions++;
 
    return result;
@@ -1170,33 +1139,16 @@  ureg_insn(struct ureg_program *ureg,
    struct ureg_emit_insn_result insn;
    unsigned i;
    boolean saturate;
-   boolean predicate;
-   boolean negate = FALSE;
-   unsigned swizzle[4] = { 0 };
 
    if (nr_dst && ureg_dst_is_empty(dst[0])) {
       return;
    }
 
    saturate = nr_dst ? dst[0].Saturate : FALSE;
-   predicate = nr_dst ? dst[0].Predicate : FALSE;
-   if (predicate) {
-      negate = dst[0].PredNegate;
-      swizzle[0] = dst[0].PredSwizzleX;
-      swizzle[1] = dst[0].PredSwizzleY;
-      swizzle[2] = dst[0].PredSwizzleZ;
-      swizzle[3] = dst[0].PredSwizzleW;
-   }
 
    insn = ureg_emit_insn(ureg,
                          opcode,
                          saturate,
-                         predicate,
-                         negate,
-                         swizzle[0],
-                         swizzle[1],
-                         swizzle[2],
-                         swizzle[3],
                          nr_dst,
                          nr_src);
 
@@ -1223,33 +1175,16 @@  ureg_tex_insn(struct ureg_program *ureg,
    struct ureg_emit_insn_result insn;
    unsigned i;
    boolean saturate;
-   boolean predicate;
-   boolean negate = FALSE;
-   unsigned swizzle[4] = { 0 };
 
    if (nr_dst && ureg_dst_is_empty(dst[0])) {
       return;
    }
 
    saturate = nr_dst ? dst[0].Saturate : FALSE;
-   predicate = nr_dst ? dst[0].Predicate : FALSE;
-   if (predicate) {
-      negate = dst[0].PredNegate;
-      swizzle[0] = dst[0].PredSwizzleX;
-      swizzle[1] = dst[0].PredSwizzleY;
-      swizzle[2] = dst[0].PredSwizzleZ;
-      swizzle[3] = dst[0].PredSwizzleW;
-   }
 
    insn = ureg_emit_insn(ureg,
                          opcode,
                          saturate,
-                         predicate,
-                         negate,
-                         swizzle[0],
-                         swizzle[1],
-                         swizzle[2],
-                         swizzle[3],
                          nr_dst,
                          nr_src);
 
@@ -1281,12 +1216,6 @@  ureg_label_insn(struct ureg_program *ureg,
    insn = ureg_emit_insn(ureg,
                          opcode,
                          FALSE,
-                         FALSE,
-                         FALSE,
-                         TGSI_SWIZZLE_X,
-                         TGSI_SWIZZLE_Y,
-                         TGSI_SWIZZLE_Z,
-                         TGSI_SWIZZLE_W,
                          0,
                          nr_src);
 
@@ -1682,13 +1611,6 @@  static void emit_decls( struct ureg_program *ureg )
                        0, ureg->nr_addrs );
    }
 
-   if (ureg->nr_preds) {
-      emit_decl_range(ureg,
-                      TGSI_FILE_PREDICATE,
-                      0,
-                      ureg->nr_preds);
-   }
-
    for (i = 0; i < ureg->nr_immediates; i++) {
       emit_immediate( ureg,
                       ureg->immediate[i].value.u,
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
index 0aae550..203d24a 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
@@ -79,12 +79,6 @@  struct ureg_dst
    unsigned DimIndirect     : 1;  /* BOOL */
    unsigned Dimension       : 1;  /* BOOL */
    unsigned Saturate        : 1;  /* BOOL */
-   unsigned Predicate       : 1;
-   unsigned PredNegate      : 1;  /* BOOL */
-   unsigned PredSwizzleX    : 2;  /* TGSI_SWIZZLE_ */
-   unsigned PredSwizzleY    : 2;  /* TGSI_SWIZZLE_ */
-   unsigned PredSwizzleZ    : 2;  /* TGSI_SWIZZLE_ */
-   unsigned PredSwizzleW    : 2;  /* TGSI_SWIZZLE_ */
    int      Index           : 16; /* SINT */
    int      IndirectIndex   : 16; /* SINT */
    unsigned IndirectFile    : 4;  /* TGSI_FILE_ */
@@ -306,9 +300,6 @@  ureg_release_temporary( struct ureg_program *ureg,
 struct ureg_dst
 ureg_DECL_address( struct ureg_program * );
 
-struct ureg_dst
-ureg_DECL_predicate(struct ureg_program *);
-
 /* Supply an index to the sampler declaration as this is the hook to
  * the external pipe_sampler state.  Users of this function probably
  * don't want just any sampler, but a specific one which they've set
@@ -536,14 +527,8 @@  struct ureg_emit_insn_result
 ureg_emit_insn(struct ureg_program *ureg,
                unsigned opcode,
                boolean saturate,
-               boolean predicate,
-               boolean pred_negate,
-               unsigned pred_swizzle_x,
-               unsigned pred_swizzle_y,
-               unsigned pred_swizzle_z,
-               unsigned pred_swizzle_w,
                unsigned num_dst,
-               unsigned num_src );
+               unsigned num_src);
 
 void
 ureg_emit_label(struct ureg_program *ureg,
@@ -580,12 +565,6 @@  static inline void ureg_##op( struct ureg_program *ureg )       \
    insn = ureg_emit_insn(ureg,                                  \
                          opcode,                                \
                          FALSE,                                 \
-                         FALSE,                                 \
-                         FALSE,                                 \
-                         TGSI_SWIZZLE_X,                        \
-                         TGSI_SWIZZLE_Y,                        \
-                         TGSI_SWIZZLE_Z,                        \
-                         TGSI_SWIZZLE_W,                        \
                          0,                                     \
                          0);                                    \
    ureg_fixup_insn_size( ureg, insn.insn_token );               \
@@ -600,12 +579,6 @@  static inline void ureg_##op( struct ureg_program *ureg,        \
    insn = ureg_emit_insn(ureg,                                  \
                          opcode,                                \
                          FALSE,                                 \
-                         FALSE,                                 \
-                         FALSE,                                 \
-                         TGSI_SWIZZLE_X,                        \
-                         TGSI_SWIZZLE_Y,                        \
-                         TGSI_SWIZZLE_Z,                        \
-                         TGSI_SWIZZLE_W,                        \
                          0,                                     \
                          1);                                    \
    ureg_emit_src( ureg, src );                                  \
@@ -621,12 +594,6 @@  static inline void ureg_##op( struct ureg_program *ureg,        \
    insn = ureg_emit_insn(ureg,                                  \
                          opcode,                                \
                          FALSE,                                 \
-                         FALSE,                                 \
-                         FALSE,                                 \
-                         TGSI_SWIZZLE_X,                        \
-                         TGSI_SWIZZLE_Y,                        \
-                         TGSI_SWIZZLE_Z,                        \
-                         TGSI_SWIZZLE_W,                        \
                          0,                                     \
                          0);                                    \
    ureg_emit_label( ureg, insn.extended_token, label_token );   \
@@ -643,12 +610,6 @@  static inline void ureg_##op( struct ureg_program *ureg,        \
    insn = ureg_emit_insn(ureg,                                  \
                          opcode,                                \
                          FALSE,                                 \
-                         FALSE,                                 \
-                         FALSE,                                 \
-                         TGSI_SWIZZLE_X,                        \
-                         TGSI_SWIZZLE_Y,                        \
-                         TGSI_SWIZZLE_Z,                        \
-                         TGSI_SWIZZLE_W,                        \
                          0,                                     \
                          1);                                    \
    ureg_emit_label( ureg, insn.extended_token, label_token );   \
@@ -667,12 +628,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          0);                                            \
    ureg_emit_dst( ureg, dst );                                          \
@@ -692,12 +647,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          1);                                            \
    ureg_emit_dst( ureg, dst );                                          \
@@ -718,12 +667,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          2);                                            \
    ureg_emit_dst( ureg, dst );                                          \
@@ -746,12 +689,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          2);                                            \
    ureg_emit_texture( ureg, insn.extended_token, target, 0 );		\
@@ -775,12 +712,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          2);                                            \
    ureg_emit_texture( ureg, insn.extended_token, target, 0 );           \
@@ -804,12 +735,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          3);                                            \
    ureg_emit_dst( ureg, dst );                                          \
@@ -834,12 +759,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          3);                                            \
    ureg_emit_texture( ureg, insn.extended_token, target, 0 );           \
@@ -866,12 +785,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          4);                                            \
    ureg_emit_texture( ureg, insn.extended_token, target, 0 );		\
@@ -899,12 +812,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          4);                                            \
    ureg_emit_texture( ureg, insn.extended_token, target, 0 );           \
@@ -932,12 +839,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          4);                                            \
    ureg_emit_dst( ureg, dst );                                          \
@@ -965,12 +866,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          5);                                            \
    ureg_emit_dst( ureg, dst );                                          \
@@ -999,12 +894,6 @@  static inline void ureg_##op( struct ureg_program *ureg,                \
    insn = ureg_emit_insn(ureg,                                          \
                          opcode,                                        \
                          dst.Saturate,                                  \
-                         dst.Predicate,                                 \
-                         dst.PredNegate,                                \
-                         dst.PredSwizzleX,                              \
-                         dst.PredSwizzleY,                              \
-                         dst.PredSwizzleZ,                              \
-                         dst.PredSwizzleW,                              \
                          1,                                             \
                          5);                                            \
    ureg_emit_texture( ureg, insn.extended_token, target, 0 );           \
@@ -1088,24 +977,6 @@  ureg_saturate( struct ureg_dst reg )
    return reg;
 }
 
-static inline struct ureg_dst
-ureg_predicate(struct ureg_dst reg,
-               boolean negate,
-               unsigned swizzle_x,
-               unsigned swizzle_y,
-               unsigned swizzle_z,
-               unsigned swizzle_w)
-{
-   assert(reg.File != TGSI_FILE_NULL);
-   reg.Predicate = 1;
-   reg.PredNegate = negate;
-   reg.PredSwizzleX = swizzle_x;
-   reg.PredSwizzleY = swizzle_y;
-   reg.PredSwizzleZ = swizzle_z;
-   reg.PredSwizzleW = swizzle_w;
-   return reg;
-}
-
 static inline struct ureg_dst 
 ureg_dst_indirect( struct ureg_dst reg, struct ureg_src addr )
 {
@@ -1206,12 +1077,6 @@  ureg_dst_array_register(unsigned file,
    dst.IndirectIndex = 0;
    dst.IndirectSwizzle = 0;
    dst.Saturate  = 0;
-   dst.Predicate = 0;
-   dst.PredNegate = 0;
-   dst.PredSwizzleX = TGSI_SWIZZLE_X;
-   dst.PredSwizzleY = TGSI_SWIZZLE_Y;
-   dst.PredSwizzleZ = TGSI_SWIZZLE_Z;
-   dst.PredSwizzleW = TGSI_SWIZZLE_W;
    dst.Index     = index;
    dst.Dimension = 0;
    dst.DimensionIndex = 0;
@@ -1247,12 +1112,6 @@  ureg_dst( struct ureg_src src )
    dst.IndirectIndex = src.IndirectIndex;
    dst.IndirectSwizzle = src.IndirectSwizzle;
    dst.Saturate  = 0;
-   dst.Predicate = 0;
-   dst.PredNegate = 0;
-   dst.PredSwizzleX = TGSI_SWIZZLE_X;
-   dst.PredSwizzleY = TGSI_SWIZZLE_Y;
-   dst.PredSwizzleZ = TGSI_SWIZZLE_Z;
-   dst.PredSwizzleW = TGSI_SWIZZLE_W;
    dst.Index     = src.Index;
    dst.Dimension = src.Dimension;
    dst.DimensionIndex = src.DimensionIndex;
@@ -1344,12 +1203,6 @@  ureg_dst_undef( void )
    dst.IndirectIndex = 0;
    dst.IndirectSwizzle = 0;
    dst.Saturate  = 0;
-   dst.Predicate = 0;
-   dst.PredNegate = 0;
-   dst.PredSwizzleX = TGSI_SWIZZLE_X;
-   dst.PredSwizzleY = TGSI_SWIZZLE_Y;
-   dst.PredSwizzleZ = TGSI_SWIZZLE_Z;
-   dst.PredSwizzleW = TGSI_SWIZZLE_W;
    dst.Index     = 0;
    dst.Dimension = 0;
    dst.DimensionIndex = 0;
diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
index 2c0da01..127dbba 100644
--- a/src/gallium/docs/source/screen.rst
+++ b/src/gallium/docs/source/screen.rst
@@ -325,7 +325,6 @@  file is still supported. In that case, the constbuf index is assumed
 to be 0.
 
 * ``PIPE_SHADER_CAP_MAX_TEMPS``: The maximum number of temporary registers.
-* ``PIPE_SHADER_CAP_MAX_PREDS``: The maximum number of predicate registers.
 * ``PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED``: Whether the continue opcode is supported.
 * ``PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR``: Whether indirect addressing
   of the input file is supported.
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
index 17dd47c..b9c61a0 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -380,8 +380,6 @@  fd_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
 		return ((is_a3xx(screen) || is_a4xx(screen)) ? 4096 : 64) * sizeof(float[4]);
 	case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
 		return is_ir3(screen) ? 16 : 1;
-	case PIPE_SHADER_CAP_MAX_PREDS:
-		return 0; /* nothing uses this */
 	case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
 		return 1;
 	case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
diff --git a/src/gallium/drivers/i915/i915_fpc.h b/src/gallium/drivers/i915/i915_fpc.h
index adc4254..309cf8e 100644
--- a/src/gallium/drivers/i915/i915_fpc.h
+++ b/src/gallium/drivers/i915/i915_fpc.h
@@ -296,7 +296,6 @@  struct i915_full_instruction
 {
    struct tgsi_instruction             Instruction;
 /*
-   struct tgsi_instruction_predicate   Predicate;
    struct tgsi_instruction_label       Label;
 */
    struct tgsi_instruction_texture     Texture;
diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
index 19a94a8..7dc4148 100644
--- a/src/gallium/drivers/i915/i915_screen.c
+++ b/src/gallium/drivers/i915/i915_screen.c
@@ -144,8 +144,6 @@  i915_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_sha
          return 1;
       case PIPE_SHADER_CAP_MAX_TEMPS:
          return 12; /* XXX: 12 -> 32 ? */
-      case PIPE_SHADER_CAP_MAX_PREDS:
-         return 0;
       case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
       case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
          return 0;
diff --git a/src/gallium/drivers/ilo/ilo_screen.c b/src/gallium/drivers/ilo/ilo_screen.c
index ab4d137..275b969 100644
--- a/src/gallium/drivers/ilo/ilo_screen.c
+++ b/src/gallium/drivers/ilo/ilo_screen.c
@@ -114,8 +114,6 @@  ilo_get_shader_param(struct pipe_screen *screen, unsigned shader,
       return ILO_MAX_CONST_BUFFERS;
    case PIPE_SHADER_CAP_MAX_TEMPS:
       return 256;
-   case PIPE_SHADER_CAP_MAX_PREDS:
-      return 0;
    case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
       return 1;
    case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
diff --git a/src/gallium/drivers/ilo/shader/toy_tgsi.c b/src/gallium/drivers/ilo/shader/toy_tgsi.c
index d38585f..0c249d7 100644
--- a/src/gallium/drivers/ilo/shader/toy_tgsi.c
+++ b/src/gallium/drivers/ilo/shader/toy_tgsi.c
@@ -1723,7 +1723,6 @@  ra_get_dst(struct toy_tgsi *tgsi,
    case TGSI_FILE_OUTPUT:
    case TGSI_FILE_TEMPORARY:
    case TGSI_FILE_ADDRESS:
-   case TGSI_FILE_PREDICATE:
       need_vrf = true;
       break;
    default:
@@ -1844,7 +1843,6 @@  ra_get_src_indirect(struct toy_tgsi *tgsi,
    case TGSI_FILE_TEMPORARY:
    case TGSI_FILE_ADDRESS:
    case TGSI_FILE_IMMEDIATE:
-   case TGSI_FILE_PREDICATE:
       need_vrf = true;
       break;
    default:
@@ -1914,7 +1912,6 @@  ra_get_src(struct toy_tgsi *tgsi,
       break;
    case TGSI_FILE_TEMPORARY:
    case TGSI_FILE_ADDRESS:
-   case TGSI_FILE_PREDICATE:
       need_vrf = true;
       break;
    case TGSI_FILE_SAMPLER:
@@ -1971,7 +1968,6 @@  ra_get_src(struct toy_tgsi *tgsi,
          switch (s->Register.File) {
          case TGSI_FILE_TEMPORARY:
          case TGSI_FILE_ADDRESS:
-         case TGSI_FILE_PREDICATE:
             {
                struct toy_dst dst = tdst_from(src);
                dst.writemask = TOY_WRITEMASK_XYZW;
@@ -2254,7 +2250,6 @@  parse_declaration(struct toy_tgsi *tgsi,
    case TGSI_FILE_NULL:
    case TGSI_FILE_TEMPORARY:
    case TGSI_FILE_SAMPLER:
-   case TGSI_FILE_PREDICATE:
    case TGSI_FILE_ADDRESS:
    case TGSI_FILE_RESOURCE:
    case TGSI_FILE_SAMPLER_VIEW:
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
index f153674..cd00db5 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
@@ -345,7 +345,6 @@  static nv50_ir::DataFile translateFile(uint file)
    case TGSI_FILE_OUTPUT:          return nv50_ir::FILE_SHADER_OUTPUT;
    case TGSI_FILE_TEMPORARY:       return nv50_ir::FILE_GPR;
    case TGSI_FILE_ADDRESS:         return nv50_ir::FILE_ADDRESS;
-   case TGSI_FILE_PREDICATE:       return nv50_ir::FILE_PREDICATE;
    case TGSI_FILE_IMMEDIATE:       return nv50_ir::FILE_IMMEDIATE;
    case TGSI_FILE_SYSTEM_VALUE:    return nv50_ir::FILE_SYSTEM_VALUE;
    case TGSI_FILE_RESOURCE:        return nv50_ir::FILE_MEMORY_GLOBAL;
@@ -1150,7 +1149,6 @@  bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)
    case TGSI_FILE_ADDRESS:
    case TGSI_FILE_CONSTANT:
    case TGSI_FILE_IMMEDIATE:
-   case TGSI_FILE_PREDICATE:
    case TGSI_FILE_SAMPLER:
       break;
    default:
@@ -1384,7 +1382,6 @@  private:
 
    DataArray tData; // TGSI_FILE_TEMPORARY
    DataArray aData; // TGSI_FILE_ADDRESS
-   DataArray pData; // TGSI_FILE_PREDICATE
    DataArray oData; // TGSI_FILE_OUTPUT (if outputs in registers)
 
    Value *zero;
@@ -1587,8 +1584,6 @@  Converter::getArrayForFile(unsigned file, int idx)
    switch (file) {
    case TGSI_FILE_TEMPORARY:
       return &tData;
-   case TGSI_FILE_PREDICATE:
-      return &pData;
    case TGSI_FILE_ADDRESS:
       return &aData;
    case TGSI_FILE_OUTPUT:
@@ -1729,7 +1724,6 @@  Converter::storeDst(const tgsi::Instruction::DstRegister dst, int c,
       }
    } else
    if (f == TGSI_FILE_TEMPORARY ||
-       f == TGSI_FILE_PREDICATE ||
        f == TGSI_FILE_ADDRESS ||
        f == TGSI_FILE_OUTPUT) {
       getArrayForFile(f, idx2d)->store(sub.cur->values, idx, c, ptr, val);
@@ -3263,19 +3257,17 @@  Converter::exportOutputs()
 Converter::Converter(Program *ir, const tgsi::Source *code) : BuildUtil(ir),
      code(code),
      tgsi(NULL),
-     tData(this), aData(this), pData(this), oData(this)
+     tData(this), aData(this), oData(this)
 {
    info = code->info;
 
    const DataFile tFile = code->mainTempsInLMem ? FILE_MEMORY_LOCAL : FILE_GPR;
 
    const unsigned tSize = code->fileSize(TGSI_FILE_TEMPORARY);
-   const unsigned pSize = code->fileSize(TGSI_FILE_PREDICATE);
    const unsigned aSize = code->fileSize(TGSI_FILE_ADDRESS);
    const unsigned oSize = code->fileSize(TGSI_FILE_OUTPUT);
 
    tData.setup(TGSI_FILE_TEMPORARY, 0, 0, tSize, 4, 4, tFile, 0);
-   pData.setup(TGSI_FILE_PREDICATE, 0, 0, pSize, 4, 4, FILE_PREDICATE, 0);
    aData.setup(TGSI_FILE_ADDRESS, 0, 0, aSize, 4, 4, FILE_GPR, 0);
    oData.setup(TGSI_FILE_OUTPUT, 0, 0, oSize, 4, 4, FILE_GPR, 0);
 
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
index 7aad26b..eb9920b 100644
--- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
+++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
@@ -246,7 +246,6 @@  nv30_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
       case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
       case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
          return 0;
-      case PIPE_SHADER_CAP_MAX_PREDS:
       case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
       case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
       case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
@@ -288,7 +287,6 @@  nv30_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
       case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
       case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
          return 16;
-      case PIPE_SHADER_CAP_MAX_PREDS:
       case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
       case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
       case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
index 30e6e04..b4d1420 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
@@ -275,8 +275,6 @@  nv50_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
    case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
    case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
       return 1;
-   case PIPE_SHADER_CAP_MAX_PREDS:
-      return 0;
    case PIPE_SHADER_CAP_MAX_TEMPS:
       return nv50_screen(pscreen)->max_tls_space / ONE_TEMP_SIZE;
    case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
index ab19b26..2b0ea0e 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
@@ -286,8 +286,6 @@  nvc0_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
    case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
    case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
       return 1;
-   case PIPE_SHADER_CAP_MAX_PREDS:
-      return 0;
    case PIPE_SHADER_CAP_MAX_TEMPS:
       return NVC0_CAP_MAX_PROGRAM_TEMPS;
    case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
index 4ca0b26..882c172 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -282,8 +282,6 @@  static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e
             return 1;
         case PIPE_SHADER_CAP_MAX_TEMPS:
             return is_r500 ? 128 : is_r400 ? 64 : 32;
-        case PIPE_SHADER_CAP_MAX_PREDS:
-            return 0; /* unused */
         case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
         case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
            return r300screen->caps.num_tex_units;
@@ -335,8 +333,6 @@  static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e
             return 1;
         case PIPE_SHADER_CAP_MAX_TEMPS:
             return 32;
-        case PIPE_SHADER_CAP_MAX_PREDS:
-            return 0; /* unused */
         case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
         case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
             return 1;
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
index f6efaa3..542e8b7 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -470,8 +470,6 @@  static int r600_get_shader_param(struct pipe_screen* pscreen, unsigned shader, e
 		}
 	case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
 		return R600_MAX_USER_CONST_BUFFERS;
-	case PIPE_SHADER_CAP_MAX_PREDS:
-		return 0; /* nothing uses this */
 	case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
 		return 1;
 	case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index 1ab389c..118d49e 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -344,10 +344,6 @@  static int tgsi_is_supported(struct r600_shader_ctx *ctx)
 		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
 		return -EINVAL;
 	}
-	if (i->Instruction.Predicate) {
-		R600_ERR("predicate unsupported\n");
-		return -EINVAL;
-	}
 #if 0
 	if (i->Instruction.Label) {
 		R600_ERR("label unsupported\n");
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index 7dbb2e3..ec4573b 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -468,8 +468,6 @@  static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu
 		return 4096 * sizeof(float[4]); /* actually only memory limits this */
 	case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
 		return SI_NUM_USER_CONST_BUFFERS;
-	case PIPE_SHADER_CAP_MAX_PREDS:
-		return 0; /* FIXME */
 	case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
 		return 1;
 	case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c
index 66c3dea..af940d7 100644
--- a/src/gallium/drivers/svga/svga_screen.c
+++ b/src/gallium/drivers/svga/svga_screen.c
@@ -358,8 +358,6 @@  static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, en
 	  * does it is better to defer loop unrolling to the state tracker.
 	  */
          return 0;
-      case PIPE_SHADER_CAP_MAX_PREDS:
-         return 1;
       case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
          return 0;
       case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
@@ -413,8 +411,6 @@  static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, en
          if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_TEMPS, &result))
             return 32;
          return MIN2(result.u, SVGA3D_TEMPREG_MAX);
-      case PIPE_SHADER_CAP_MAX_PREDS:
-         return 1;
       case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
          return 0;
       case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
index 88e37e9..a80a396 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -677,7 +677,6 @@  enum pipe_shader_cap
    PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE,
    PIPE_SHADER_CAP_MAX_CONST_BUFFERS,
    PIPE_SHADER_CAP_MAX_TEMPS,
-   PIPE_SHADER_CAP_MAX_PREDS,
    /* boolean caps */
    PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED,
    PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR,
diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
index 6e07b2c..6cf8132 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -74,10 +74,9 @@  enum tgsi_file_type {
    TGSI_FILE_SAMPLER             =5,
    TGSI_FILE_ADDRESS             =6,
    TGSI_FILE_IMMEDIATE           =7,
-   TGSI_FILE_PREDICATE           =8,
-   TGSI_FILE_SYSTEM_VALUE        =9,
-   TGSI_FILE_RESOURCE            =10,
-   TGSI_FILE_SAMPLER_VIEW        =11,
+   TGSI_FILE_SYSTEM_VALUE        =8,
+   TGSI_FILE_RESOURCE            =9,
+   TGSI_FILE_SAMPLER_VIEW        =10,
    TGSI_FILE_COUNT      /**< how many TGSI_FILE_ types */
 };
 
@@ -547,8 +546,6 @@  struct tgsi_property_data {
  * respectively. For a given operation code, those numbers are fixed and are
  * present here only for convenience.
  *
- * If Predicate is TRUE, tgsi_instruction_predicate token immediately follows.
- *
  * Saturate controls how are final results in destination registers modified.
  */
 
@@ -560,7 +557,6 @@  struct tgsi_instruction
    unsigned Saturate   : 1;  /* BOOL */
    unsigned NumDstRegs : 2;  /* UINT */
    unsigned NumSrcRegs : 4;  /* UINT */
-   unsigned Predicate  : 1;  /* BOOL */
    unsigned Label      : 1;
    unsigned Texture    : 1;
    unsigned Padding    : 2;
@@ -635,21 +631,6 @@  struct tgsi_texture_offset
    unsigned Padding  : 6;
 };
 
-/*
- * For SM3, the following constraint applies.
- *   - Swizzle is either set to identity or replicate.
- */
-struct tgsi_instruction_predicate
-{
-   int      Index    : 16; /* SINT */
-   unsigned SwizzleX : 2;  /* TGSI_SWIZZLE_x */
-   unsigned SwizzleY : 2;  /* TGSI_SWIZZLE_x */
-   unsigned SwizzleZ : 2;  /* TGSI_SWIZZLE_x */
-   unsigned SwizzleW : 2;  /* TGSI_SWIZZLE_x */
-   unsigned Negate   : 1;  /* BOOL */
-   unsigned Padding  : 7;
-};
-
 /**
  * File specifies the register array to access.
  *
diff --git a/src/gallium/state_trackers/nine/nine_shader.c b/src/gallium/state_trackers/nine/nine_shader.c
index 28f2787..8380067 100644
--- a/src/gallium/state_trackers/nine/nine_shader.c
+++ b/src/gallium/state_trackers/nine/nine_shader.c
@@ -673,14 +673,6 @@  tx_addr_alloc(struct shader_translator *tx, INT idx)
         tx->regs.a0 = ureg_DECL_temporary(tx->ureg);
 }
 
-static inline void
-tx_pred_alloc(struct shader_translator *tx, INT idx)
-{
-    assert(idx == 0);
-    if (ureg_dst_is_undef(tx->regs.p))
-        tx->regs.p = ureg_DECL_predicate(tx->ureg);
-}
-
 /* NOTE: It's not very clear on which ps1.1-ps1.3 instructions
  * the projection should be applied on the texture. It doesn't
  * apply on texkill.
@@ -879,9 +871,7 @@  tx_src_param(struct shader_translator *tx, const struct sm1_src_param *param)
         }
         break;
     case D3DSPR_PREDICATE:
-        assert(!param->rel);
-        tx_pred_alloc(tx, param->idx);
-        src = ureg_src(tx->regs.p);
+        assert(!"D3DSPR_PREDICATE");
         break;
     case D3DSPR_SAMPLER:
         assert(param->mod == NINED3DSPSM_NONE);
@@ -1168,9 +1158,7 @@  _tx_dst_param(struct shader_translator *tx, const struct sm1_dst_param *param)
         dst = tx->regs.oDepth; /* XXX: must write .z component */
         break;
     case D3DSPR_PREDICATE:
-        assert(!param->rel);
-        tx_pred_alloc(tx, param->idx);
-        dst = tx->regs.p;
+        assert(!"D3DSPR_PREDICATE");
         break;
     case D3DSPR_TEMPFLOAT16:
         DBG("unhandled D3DSPR: %u\n", param->file);
@@ -3339,7 +3327,7 @@  nine_translate_shader(struct NineDevice9 *device, struct nine_shader_info *info)
 
     tx->native_integers = GET_SHADER_CAP(INTEGERS);
     tx->inline_subroutines = !GET_SHADER_CAP(SUBROUTINES);
-    tx->lower_preds = !GET_SHADER_CAP(MAX_PREDS);
+    tx->lower_preds = true;
     tx->want_texcoord = GET_CAP(TGSI_TEXCOORD);
     tx->shift_wpos = !GET_CAP(TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
     tx->texcoord_sn = tx->want_texcoord ?

Comments

Hi,

There is predication in direct3D9 HLSL,
however we don't implement them and never had any complaint about that.

Reason is that HLSL Microsoft compiler doesn't generate any predication.
I read somewhere they did this choice because for drivers it is possible
to lower efficiently if conditions to predicates if hardware supports 
it, but not
the opposite.

If never a d3d9 apps needs predication, we'll implement them with if 
conditions.

I'm totally fine with predication support being removed from TGSI.

A little nitpicking: instead of setting lower_preds to true, just remove it.
The variable isn't used.

Axel Davy

On 01/09/2015 23:19, Marek Olšák wrote :
> From: Marek Olšák <marek.olsak@amd.com>
>
> Neved used.
> ---
>
I'm all for TGIS simplification, but I just checked, and we rely on TGSI 
predicates for some of our internal state trackers.  So I'll need more 
time to evaluate how much effort it would be to not rely on it, and when 
can it be done.

Jose

On 01/09/15 22:19, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak@amd.com>
>
> Neved used.
> ---
> Take 2. Let's see how people feel about TGSI now.
>
>   src/gallium/auxiliary/gallivm/lp_bld_limits.h      |   4 -
>   src/gallium/auxiliary/gallivm/lp_bld_tgsi.h        |   2 -
>   src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c    |  46 -------
>   src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c   |   6 +-
>   src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c    | 138 ++-----------------
>   src/gallium/auxiliary/tgsi/tgsi_build.c            |  66 ---------
>   src/gallium/auxiliary/tgsi/tgsi_build.h            |   3 -
>   src/gallium/auxiliary/tgsi/tgsi_dump.c             |  24 ----
>   src/gallium/auxiliary/tgsi/tgsi_exec.c             |  59 --------
>   src/gallium/auxiliary/tgsi/tgsi_exec.h             |   7 -
>   src/gallium/auxiliary/tgsi/tgsi_parse.c            |   4 -
>   src/gallium/auxiliary/tgsi/tgsi_parse.h            |   1 -
>   src/gallium/auxiliary/tgsi/tgsi_sanity.c           |   1 -
>   src/gallium/auxiliary/tgsi/tgsi_strings.c          |   1 -
>   src/gallium/auxiliary/tgsi/tgsi_text.c             |  37 -----
>   src/gallium/auxiliary/tgsi/tgsi_ureg.c             |  84 +-----------
>   src/gallium/auxiliary/tgsi/tgsi_ureg.h             | 149 +--------------------
>   src/gallium/docs/source/screen.rst                 |   1 -
>   src/gallium/drivers/freedreno/freedreno_screen.c   |   2 -
>   src/gallium/drivers/i915/i915_fpc.h                |   1 -
>   src/gallium/drivers/i915/i915_screen.c             |   2 -
>   src/gallium/drivers/ilo/ilo_screen.c               |   2 -
>   src/gallium/drivers/ilo/shader/toy_tgsi.c          |   5 -
>   .../drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp  |  10 +-
>   src/gallium/drivers/nouveau/nv30/nv30_screen.c     |   2 -
>   src/gallium/drivers/nouveau/nv50/nv50_screen.c     |   2 -
>   src/gallium/drivers/nouveau/nvc0/nvc0_screen.c     |   2 -
>   src/gallium/drivers/r300/r300_screen.c             |   4 -
>   src/gallium/drivers/r600/r600_pipe.c               |   2 -
>   src/gallium/drivers/r600/r600_shader.c             |   4 -
>   src/gallium/drivers/radeonsi/si_pipe.c             |   2 -
>   src/gallium/drivers/svga/svga_screen.c             |   4 -
>   src/gallium/include/pipe/p_defines.h               |   1 -
>   src/gallium/include/pipe/p_shader_tokens.h         |  25 +---
>   src/gallium/state_trackers/nine/nine_shader.c      |  18 +--
>   35 files changed, 27 insertions(+), 694 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_limits.h b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
> index 571c615..da774bf 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_limits.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
> @@ -49,8 +49,6 @@
>
>   #define LP_MAX_TGSI_IMMEDIATES 4096
>
> -#define LP_MAX_TGSI_PREDS 16
> -
>   #define LP_MAX_TGSI_CONSTS 4096
>
>   #define LP_MAX_TGSI_CONST_BUFFERS 16
> @@ -109,8 +107,6 @@ gallivm_get_shader_param(enum pipe_shader_cap param)
>         return PIPE_MAX_CONSTANT_BUFFERS;
>      case PIPE_SHADER_CAP_MAX_TEMPS:
>         return LP_MAX_TGSI_TEMPS;
> -   case PIPE_SHADER_CAP_MAX_PREDS:
> -      return LP_MAX_TGSI_PREDS;
>      case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
>         return 1;
>      case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> index 2ca9c61..a48f008 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> @@ -455,7 +455,6 @@ struct lp_build_tgsi_soa_context
>      LLVMValueRef immediates[LP_MAX_INLINED_IMMEDIATES][TGSI_NUM_CHANNELS];
>      LLVMValueRef temps[LP_MAX_INLINED_TEMPS][TGSI_NUM_CHANNELS];
>      LLVMValueRef addr[LP_MAX_TGSI_ADDRS][TGSI_NUM_CHANNELS];
> -   LLVMValueRef preds[LP_MAX_TGSI_PREDS][TGSI_NUM_CHANNELS];
>
>      /* We allocate/use this array of temps if (1 << TGSI_FILE_TEMPORARY) is
>       * set in the indirect_files field.
> @@ -549,7 +548,6 @@ struct lp_build_tgsi_aos_context
>      LLVMValueRef immediates[LP_MAX_INLINED_IMMEDIATES];
>      LLVMValueRef temps[LP_MAX_INLINED_TEMPS];
>      LLVMValueRef addr[LP_MAX_TGSI_ADDRS];
> -   LLVMValueRef preds[LP_MAX_TGSI_PREDS];
>
>      /* We allocate/use this array of temps if (1 << TGSI_FILE_TEMPORARY) is
>       * set in the indirect_files field.
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
> index 610283d..8094efc 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
> @@ -256,10 +256,6 @@ lp_emit_store_aos(
>         ptr = bld->addr[reg->Indirect.Index];
>         break;
>
> -   case TGSI_FILE_PREDICATE:
> -      ptr = bld->preds[reg->Register.Index];
> -      break;
> -
>      default:
>         assert(0);
>         return;
> @@ -267,43 +263,6 @@ lp_emit_store_aos(
>
>      if (!ptr)
>         return;
> -   /*
> -    * Predicate
> -    */
> -
> -   if (inst->Instruction.Predicate) {
> -      LLVMValueRef pred;
> -
> -      assert(inst->Predicate.Index < LP_MAX_TGSI_PREDS);
> -
> -      pred = LLVMBuildLoad(builder,
> -                           bld->preds[inst->Predicate.Index], "");
> -
> -      /*
> -       * Convert the value to an integer mask.
> -       */
> -      pred = lp_build_compare(bld->bld_base.base.gallivm,
> -                               bld->bld_base.base.type,
> -                               PIPE_FUNC_NOTEQUAL,
> -                               pred,
> -                               bld->bld_base.base.zero);
> -
> -      if (inst->Predicate.Negate) {
> -         pred = LLVMBuildNot(builder, pred, "");
> -      }
> -
> -      pred = bld->bld_base.emit_swizzle(&bld->bld_base, pred,
> -                         inst->Predicate.SwizzleX,
> -                         inst->Predicate.SwizzleY,
> -                         inst->Predicate.SwizzleZ,
> -                         inst->Predicate.SwizzleW);
> -
> -      if (mask) {
> -         mask = LLVMBuildAnd(builder, mask, pred, "");
> -      } else {
> -         mask = pred;
> -      }
> -   }
>
>      /*
>       * Writemask
> @@ -442,11 +401,6 @@ lp_emit_declaration_aos(
>            bld->addr[idx] = lp_build_alloca(gallivm, vec_type, "");
>            break;
>
> -      case TGSI_FILE_PREDICATE:
> -         assert(idx < LP_MAX_TGSI_PREDS);
> -         bld->preds[idx] = lp_build_alloca(gallivm, vec_type, "");
> -         break;
> -
>         case TGSI_FILE_SAMPLER_VIEW:
>            /*
>             * The target stored here MUST match whatever there actually
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
> index 906a174..a5d80a2 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
> @@ -305,8 +305,7 @@ analyse_instruction(struct analysis_context *ctx,
>         } else if (dst->File == TGSI_FILE_OUTPUT) {
>            regs = info->output;
>            max_regs = Elements(info->output);
> -      } else if (dst->File == TGSI_FILE_ADDRESS ||
> -                 dst->File == TGSI_FILE_PREDICATE) {
> +      } else if (dst->File == TGSI_FILE_ADDRESS) {
>            continue;
>         } else {
>            assert(0);
> @@ -389,8 +388,7 @@ analyse_instruction(struct analysis_context *ctx,
>
>            memset(res, 0, sizeof res);
>
> -         if (!inst->Instruction.Predicate &&
> -             !inst->Instruction.Saturate) {
> +         if (!inst->Instruction.Saturate) {
>               for (chan = 0; chan < 4; ++chan) {
>                  if (dst->WriteMask & (1 << chan)) {
>                     if (inst->Instruction.Opcode == TGSI_OPCODE_MOV) {
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> index fae604e..7a31434 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> @@ -753,25 +753,16 @@ static void lp_exec_default(struct lp_exec_mask *mask,
>    */
>   static void lp_exec_mask_store(struct lp_exec_mask *mask,
>                                  struct lp_build_context *bld_store,
> -                               LLVMValueRef pred,
>                                  LLVMValueRef val,
>                                  LLVMValueRef dst_ptr)
>   {
>      LLVMBuilderRef builder = mask->bld->gallivm->builder;
> +   LLVMValueRef pred = mask->has_mask ? mask->exec_mask : NULL;
>
>      assert(lp_check_value(bld_store->type, val));
>      assert(LLVMGetTypeKind(LLVMTypeOf(dst_ptr)) == LLVMPointerTypeKind);
>      assert(LLVMGetElementType(LLVMTypeOf(dst_ptr)) == LLVMTypeOf(val));
>
> -   /* Mix the predicate and execution mask */
> -   if (mask->has_mask) {
> -      if (pred) {
> -         pred = LLVMBuildAnd(builder, pred, mask->exec_mask, "");
> -      } else {
> -         pred = mask->exec_mask;
> -      }
> -   }
> -
>      if (pred) {
>         LLVMValueRef res, dst;
>
> @@ -1036,22 +1027,12 @@ emit_mask_scatter(struct lp_build_tgsi_soa_context *bld,
>                     LLVMValueRef base_ptr,
>                     LLVMValueRef indexes,
>                     LLVMValueRef values,
> -                  struct lp_exec_mask *mask,
> -                  LLVMValueRef pred)
> +                  struct lp_exec_mask *mask)
>   {
>      struct gallivm_state *gallivm = bld->bld_base.base.gallivm;
>      LLVMBuilderRef builder = gallivm->builder;
>      unsigned i;
> -
> -   /* Mix the predicate and execution mask */
> -   if (mask->has_mask) {
> -      if (pred) {
> -         pred = LLVMBuildAnd(builder, pred, mask->exec_mask, "");
> -      }
> -      else {
> -         pred = mask->exec_mask;
> -      }
> -   }
> +   LLVMValueRef pred = mask->has_mask ? mask->exec_mask : NULL;
>
>      /*
>       * Loop over elements of index_vec, store scalar value.
> @@ -1713,74 +1694,6 @@ emit_fetch_deriv(
>         *ddy = lp_build_ddy(&bld->bld_base.base, src);
>   }
>
> -
> -/**
> - * Predicate.
> - */
> -static void
> -emit_fetch_predicate(
> -   struct lp_build_tgsi_soa_context *bld,
> -   const struct tgsi_full_instruction *inst,
> -   LLVMValueRef *pred)
> -{
> -   LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder;
> -   unsigned index;
> -   unsigned char swizzles[4];
> -   LLVMValueRef unswizzled[4] = {NULL, NULL, NULL, NULL};
> -   LLVMValueRef value;
> -   unsigned chan;
> -
> -   if (!inst->Instruction.Predicate) {
> -      TGSI_FOR_EACH_CHANNEL( chan ) {
> -         pred[chan] = NULL;
> -      }
> -      return;
> -   }
> -
> -   swizzles[0] = inst->Predicate.SwizzleX;
> -   swizzles[1] = inst->Predicate.SwizzleY;
> -   swizzles[2] = inst->Predicate.SwizzleZ;
> -   swizzles[3] = inst->Predicate.SwizzleW;
> -
> -   index = inst->Predicate.Index;
> -   assert(index < LP_MAX_TGSI_PREDS);
> -
> -   TGSI_FOR_EACH_CHANNEL( chan ) {
> -      unsigned swizzle = swizzles[chan];
> -
> -      /*
> -       * Only fetch the predicate register channels that are actually listed
> -       * in the swizzles
> -       */
> -      if (!unswizzled[swizzle]) {
> -         value = LLVMBuildLoad(builder,
> -                               bld->preds[index][swizzle], "");
> -
> -         /*
> -          * Convert the value to an integer mask.
> -          *
> -          * TODO: Short-circuit this comparison -- a D3D setp_xx instructions
> -          * is needlessly causing two comparisons due to storing the intermediate
> -          * result as float vector instead of an integer mask vector.
> -          */
> -         value = lp_build_compare(bld->bld_base.base.gallivm,
> -                                  bld->bld_base.base.type,
> -                                  PIPE_FUNC_NOTEQUAL,
> -                                  value,
> -                                  bld->bld_base.base.zero);
> -         if (inst->Predicate.Negate) {
> -            value = LLVMBuildNot(builder, value, "");
> -         }
> -
> -         unswizzled[swizzle] = value;
> -      } else {
> -         value = unswizzled[swizzle];
> -      }
> -
> -      pred[chan] = value;
> -   }
> -}
> -
>   /**
>    * store an array of 8 doubles into two arrays of 8 floats
>    * i.e.
> @@ -1794,7 +1707,6 @@ static void
>   emit_store_double_chan(struct lp_build_tgsi_context *bld_base,
>                          int dtype,
>                          LLVMValueRef chan_ptr, LLVMValueRef chan_ptr2,
> -                       LLVMValueRef pred,
>                          LLVMValueRef value)
>   {
>      struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
> @@ -1822,8 +1734,8 @@ emit_store_double_chan(struct lp_build_tgsi_context *bld_base,
>                                                     bld_base->base.type.length),
>                                     "");
>
> -   lp_exec_mask_store(&bld->exec_mask, float_bld, pred, temp, chan_ptr);
> -   lp_exec_mask_store(&bld->exec_mask, float_bld, pred, temp2, chan_ptr2);
> +   lp_exec_mask_store(&bld->exec_mask, float_bld, temp, chan_ptr);
> +   lp_exec_mask_store(&bld->exec_mask, float_bld, temp2, chan_ptr2);
>   }
>
>   /**
> @@ -1835,7 +1747,6 @@ emit_store_chan(
>      const struct tgsi_full_instruction *inst,
>      unsigned index,
>      unsigned chan_index,
> -   LLVMValueRef pred,
>      LLVMValueRef value)
>   {
>      struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
> @@ -1898,7 +1809,7 @@ emit_store_chan(
>
>            /* Scatter store values into output registers */
>            emit_mask_scatter(bld, outputs_array, index_vec, value,
> -                           &bld->exec_mask, pred);
> +                           &bld->exec_mask);
>         }
>         else {
>            LLVMValueRef out_ptr = lp_get_output_ptr(bld, reg->Register.Index,
> @@ -1908,9 +1819,9 @@ emit_store_chan(
>               LLVMValueRef out_ptr2 = lp_get_output_ptr(bld, reg->Register.Index,
>                                                         chan_index + 1);
>               emit_store_double_chan(bld_base, dtype, out_ptr, out_ptr2,
> -                                   pred, value);
> +                                   value);
>            } else
> -            lp_exec_mask_store(&bld->exec_mask, float_bld, pred, value, out_ptr);
> +            lp_exec_mask_store(&bld->exec_mask, float_bld, value, out_ptr);
>         }
>         break;
>
> @@ -1936,7 +1847,7 @@ emit_store_chan(
>
>            /* Scatter store values into temp registers */
>            emit_mask_scatter(bld, temps_array, index_vec, value,
> -                           &bld->exec_mask, pred);
> +                           &bld->exec_mask);
>         }
>         else {
>            LLVMValueRef temp_ptr;
> @@ -1947,10 +1858,10 @@ emit_store_chan(
>                                                            reg->Register.Index,
>                                                            chan_index + 1);
>               emit_store_double_chan(bld_base, dtype, temp_ptr, temp_ptr2,
> -                                   pred, value);
> +                                   value);
>            }
>            else
> -            lp_exec_mask_store(&bld->exec_mask, float_bld, pred, value, temp_ptr);
> +            lp_exec_mask_store(&bld->exec_mask, float_bld, value, temp_ptr);
>         }
>         break;
>
> @@ -1958,17 +1869,10 @@ emit_store_chan(
>         assert(dtype == TGSI_TYPE_SIGNED);
>         assert(LLVMTypeOf(value) == int_bld->vec_type);
>         value = LLVMBuildBitCast(builder, value, int_bld->vec_type, "");
> -      lp_exec_mask_store(&bld->exec_mask, int_bld, pred, value,
> +      lp_exec_mask_store(&bld->exec_mask, int_bld, value,
>                            bld->addr[reg->Register.Index][chan_index]);
>         break;
>
> -   case TGSI_FILE_PREDICATE:
> -      assert(LLVMTypeOf(value) == float_bld->vec_type);
> -      value = LLVMBuildBitCast(builder, value, float_bld->vec_type, "");
> -      lp_exec_mask_store(&bld->exec_mask, float_bld, pred, value,
> -                         bld->preds[reg->Register.Index][chan_index]);
> -      break;
> -
>      default:
>         assert( 0 );
>      }
> @@ -2018,18 +1922,13 @@ emit_store(
>
>   {
>      unsigned chan_index;
> -   struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
>      enum tgsi_opcode_type dtype = tgsi_opcode_infer_dst_type(inst->Instruction.Opcode);
> -   if(info->num_dst) {
> -      LLVMValueRef pred[TGSI_NUM_CHANNELS];
> -
> -      emit_fetch_predicate( bld, inst, pred );
>
> +   if(info->num_dst) {
>         TGSI_FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
> -
>            if (dtype == TGSI_TYPE_DOUBLE && (chan_index == 1 || chan_index == 3))
>                continue;
> -         emit_store_chan(bld_base, inst, 0, chan_index, pred[chan_index], dst[chan_index]);
> +         emit_store_chan(bld_base, inst, 0, chan_index, dst[chan_index]);
>         }
>      }
>   }
> @@ -2963,15 +2862,6 @@ lp_emit_declaration_soa(
>         }
>         break;
>
> -   case TGSI_FILE_PREDICATE:
> -      assert(last < LP_MAX_TGSI_PREDS);
> -      for (idx = first; idx <= last; ++idx) {
> -         for (i = 0; i < TGSI_NUM_CHANNELS; i++)
> -            bld->preds[idx][i] = lp_build_alloca(gallivm, vec_type,
> -                                                 "predicate");
> -      }
> -      break;
> -
>      case TGSI_FILE_SAMPLER_VIEW:
>         /*
>          * The target stored here MUST match whatever there actually
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c b/src/gallium/auxiliary/tgsi/tgsi_build.c
> index fdb7feb..b237df4 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_build.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_build.c
> @@ -611,7 +611,6 @@ tgsi_default_instruction( void )
>      instruction.NrTokens = 0;
>      instruction.Opcode = TGSI_OPCODE_MOV;
>      instruction.Saturate = 0;
> -   instruction.Predicate = 0;
>      instruction.NumDstRegs = 1;
>      instruction.NumSrcRegs = 1;
>      instruction.Label = 0;
> @@ -624,7 +623,6 @@ tgsi_default_instruction( void )
>   static struct tgsi_instruction
>   tgsi_build_instruction(unsigned opcode,
>                          unsigned saturate,
> -                       unsigned predicate,
>                          unsigned num_dst_regs,
>                          unsigned num_src_regs,
>                          struct tgsi_header *header)
> @@ -639,7 +637,6 @@ tgsi_build_instruction(unsigned opcode,
>      instruction = tgsi_default_instruction();
>      instruction.Opcode = opcode;
>      instruction.Saturate = saturate;
> -   instruction.Predicate = predicate;
>      instruction.NumDstRegs = num_dst_regs;
>      instruction.NumSrcRegs = num_src_regs;
>
> @@ -660,47 +657,6 @@ instruction_grow(
>      header_bodysize_grow( header );
>   }
>
> -struct tgsi_instruction_predicate
> -tgsi_default_instruction_predicate(void)
> -{
> -   struct tgsi_instruction_predicate instruction_predicate;
> -
> -   instruction_predicate.SwizzleX = TGSI_SWIZZLE_X;
> -   instruction_predicate.SwizzleY = TGSI_SWIZZLE_Y;
> -   instruction_predicate.SwizzleZ = TGSI_SWIZZLE_Z;
> -   instruction_predicate.SwizzleW = TGSI_SWIZZLE_W;
> -   instruction_predicate.Negate = 0;
> -   instruction_predicate.Index = 0;
> -   instruction_predicate.Padding = 0;
> -
> -   return instruction_predicate;
> -}
> -
> -static struct tgsi_instruction_predicate
> -tgsi_build_instruction_predicate(int index,
> -                                 unsigned negate,
> -                                 unsigned swizzleX,
> -                                 unsigned swizzleY,
> -                                 unsigned swizzleZ,
> -                                 unsigned swizzleW,
> -                                 struct tgsi_instruction *instruction,
> -                                 struct tgsi_header *header)
> -{
> -   struct tgsi_instruction_predicate instruction_predicate;
> -
> -   instruction_predicate = tgsi_default_instruction_predicate();
> -   instruction_predicate.SwizzleX = swizzleX;
> -   instruction_predicate.SwizzleY = swizzleY;
> -   instruction_predicate.SwizzleZ = swizzleZ;
> -   instruction_predicate.SwizzleW = swizzleW;
> -   instruction_predicate.Negate = negate;
> -   instruction_predicate.Index = index;
> -
> -   instruction_grow(instruction, header);
> -
> -   return instruction_predicate;
> -}
> -
>   static struct tgsi_instruction_label
>   tgsi_default_instruction_label( void )
>   {
> @@ -1005,7 +961,6 @@ tgsi_default_full_instruction( void )
>      unsigned i;
>
>      full_instruction.Instruction = tgsi_default_instruction();
> -   full_instruction.Predicate = tgsi_default_instruction_predicate();
>      full_instruction.Label = tgsi_default_instruction_label();
>      full_instruction.Texture = tgsi_default_instruction_texture();
>      for( i = 0;  i < TGSI_FULL_MAX_TEX_OFFSETS; i++ ) {
> @@ -1040,32 +995,11 @@ tgsi_build_full_instruction(
>
>      *instruction = tgsi_build_instruction(full_inst->Instruction.Opcode,
>                                            full_inst->Instruction.Saturate,
> -                                         full_inst->Instruction.Predicate,
>                                            full_inst->Instruction.NumDstRegs,
>                                            full_inst->Instruction.NumSrcRegs,
>                                            header);
>      prev_token = (struct tgsi_token  *) instruction;
>
> -   if (full_inst->Instruction.Predicate) {
> -      struct tgsi_instruction_predicate *instruction_predicate;
> -
> -      if (maxsize <= size) {
> -         return 0;
> -      }
> -      instruction_predicate = (struct tgsi_instruction_predicate *)&tokens[size];
> -      size++;
> -
> -      *instruction_predicate =
> -         tgsi_build_instruction_predicate(full_inst->Predicate.Index,
> -                                          full_inst->Predicate.Negate,
> -                                          full_inst->Predicate.SwizzleX,
> -                                          full_inst->Predicate.SwizzleY,
> -                                          full_inst->Predicate.SwizzleZ,
> -                                          full_inst->Predicate.SwizzleW,
> -                                          instruction,
> -                                          header);
> -   }
> -
>      if (full_inst->Instruction.Label) {
>         struct tgsi_instruction_label *instruction_label;
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.h b/src/gallium/auxiliary/tgsi/tgsi_build.h
> index c5127e1..c782a50 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_build.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_build.h
> @@ -108,9 +108,6 @@ tgsi_build_full_instruction(
>      struct tgsi_header *header,
>      unsigned maxsize );
>
> -struct tgsi_instruction_predicate
> -tgsi_default_instruction_predicate(void);
> -
>   #if defined __cplusplus
>   }
>   #endif
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> index 8ceb5b4..37a8879 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> @@ -517,30 +517,6 @@ iter_instruction(
>         TXT( "  " );
>      ctx->indent += info->post_indent;
>
> -   if (inst->Instruction.Predicate) {
> -      CHR( '(' );
> -
> -      if (inst->Predicate.Negate)
> -         CHR( '!' );
> -
> -      TXT( "PRED[" );
> -      SID( inst->Predicate.Index );
> -      CHR( ']' );
> -
> -      if (inst->Predicate.SwizzleX != TGSI_SWIZZLE_X ||
> -          inst->Predicate.SwizzleY != TGSI_SWIZZLE_Y ||
> -          inst->Predicate.SwizzleZ != TGSI_SWIZZLE_Z ||
> -          inst->Predicate.SwizzleW != TGSI_SWIZZLE_W) {
> -         CHR( '.' );
> -         ENM( inst->Predicate.SwizzleX, tgsi_swizzle_names );
> -         ENM( inst->Predicate.SwizzleY, tgsi_swizzle_names );
> -         ENM( inst->Predicate.SwizzleZ, tgsi_swizzle_names );
> -         ENM( inst->Predicate.SwizzleW, tgsi_swizzle_names );
> -      }
> -
> -      TXT( ") " );
> -   }
> -
>      TXT( info->mnemonic );
>
>      if (inst->Instruction.Saturate) {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> index 75cd0d5..2954d4d 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> @@ -1037,7 +1037,6 @@ tgsi_exec_machine_create( void )
>
>      mach->Addrs = &mach->Temps[TGSI_EXEC_TEMP_ADDR];
>      mach->MaxGeometryShaderOutputs = TGSI_MAX_TOTAL_VERTICES;
> -   mach->Predicates = &mach->Temps[TGSI_EXEC_TEMP_P0];
>
>      mach->Inputs = align_malloc(sizeof(struct tgsi_exec_vector) * PIPE_MAX_SHADER_INPUTS, 16);
>      mach->Outputs = align_malloc(sizeof(struct tgsi_exec_vector) * PIPE_MAX_SHADER_OUTPUTS, 16);
> @@ -1303,15 +1302,6 @@ fetch_src_file_channel(const struct tgsi_exec_machine *mach,
>         }
>         break;
>
> -   case TGSI_FILE_PREDICATE:
> -      for (i = 0; i < TGSI_QUAD_SIZE; i++) {
> -         assert(index->i[i] >= 0 && index->i[i] < TGSI_EXEC_NUM_PREDS);
> -         assert(index2D->i[i] == 0);
> -
> -         chan->u[i] = mach->Predicates[0].xyzw[swizzle].u[i];
> -      }
> -      break;
> -
>      case TGSI_FILE_OUTPUT:
>         /* vertex/fragment output vars can be read too */
>         for (i = 0; i < TGSI_QUAD_SIZE; i++) {
> @@ -1514,11 +1504,9 @@ store_dest_dstret(struct tgsi_exec_machine *mach,
>                    uint chan_index,
>                    enum tgsi_exec_datatype dst_datatype)
>   {
> -   uint i;
>      static union tgsi_exec_channel null;
>      union tgsi_exec_channel *dst;
>      union tgsi_exec_channel index2D;
> -   uint execmask = mach->ExecMask;
>      int offset = 0;  /* indirection offset */
>      int index;
>
> @@ -1670,58 +1658,11 @@ store_dest_dstret(struct tgsi_exec_machine *mach,
>         dst = &mach->Addrs[index].xyzw[chan_index];
>         break;
>
> -   case TGSI_FILE_PREDICATE:
> -      index = reg->Register.Index;
> -      assert(index < TGSI_EXEC_NUM_PREDS);
> -      dst = &mach->Predicates[index].xyzw[chan_index];
> -      break;
> -
>      default:
>         assert( 0 );
>         return NULL;
>      }
>
> -   if (inst->Instruction.Predicate) {
> -      uint swizzle;
> -      union tgsi_exec_channel *pred;
> -
> -      switch (chan_index) {
> -      case TGSI_CHAN_X:
> -         swizzle = inst->Predicate.SwizzleX;
> -         break;
> -      case TGSI_CHAN_Y:
> -         swizzle = inst->Predicate.SwizzleY;
> -         break;
> -      case TGSI_CHAN_Z:
> -         swizzle = inst->Predicate.SwizzleZ;
> -         break;
> -      case TGSI_CHAN_W:
> -         swizzle = inst->Predicate.SwizzleW;
> -         break;
> -      default:
> -         assert(0);
> -         return NULL;
> -      }
> -
> -      assert(inst->Predicate.Index == 0);
> -
> -      pred = &mach->Predicates[inst->Predicate.Index].xyzw[swizzle];
> -
> -      if (inst->Predicate.Negate) {
> -         for (i = 0; i < TGSI_QUAD_SIZE; i++) {
> -            if (pred->u[i]) {
> -               execmask &= ~(1 << i);
> -            }
> -         }
> -      } else {
> -         for (i = 0; i < TGSI_QUAD_SIZE; i++) {
> -            if (!pred->u[i]) {
> -               execmask &= ~(1 << i);
> -            }
> -         }
> -      }
> -   }
> -
>      return dst;
>   }
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> index 5d56aab..a425c51 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> @@ -195,10 +195,6 @@ struct tgsi_sampler
>
>   #define TGSI_EXEC_TEMP_ADDR         (TGSI_EXEC_NUM_TEMPS + 8)
>
> -/* predicate register */
> -#define TGSI_EXEC_TEMP_P0           (TGSI_EXEC_NUM_TEMPS + 9)
> -#define TGSI_EXEC_NUM_PREDS         1
> -
>   #define TGSI_EXEC_NUM_TEMP_EXTRAS   10
>
>
> @@ -281,7 +277,6 @@ struct tgsi_exec_machine
>      union tgsi_exec_channel       SystemValue[TGSI_MAX_MISC_INPUTS];
>
>      struct tgsi_exec_vector       *Addrs;
> -   struct tgsi_exec_vector       *Predicates;
>
>      struct tgsi_sampler           *Sampler;
>
> @@ -435,8 +430,6 @@ tgsi_exec_get_shader_param(enum pipe_shader_cap param)
>         return PIPE_MAX_CONSTANT_BUFFERS;
>      case PIPE_SHADER_CAP_MAX_TEMPS:
>         return TGSI_EXEC_NUM_TEMPS;
> -   case PIPE_SHADER_CAP_MAX_PREDS:
> -      return TGSI_EXEC_NUM_PREDS;
>      case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
>         return 1;
>      case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.c b/src/gallium/auxiliary/tgsi/tgsi_parse.c
> index 0729b5d..58b0119 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_parse.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_parse.c
> @@ -180,10 +180,6 @@ tgsi_parse_token(
>         memset(inst, 0, sizeof *inst);
>         copy_token(&inst->Instruction, &token);
>
> -      if (inst->Instruction.Predicate) {
> -         next_token(ctx, &inst->Predicate);
> -      }
> -
>         if (inst->Instruction.Label) {
>            next_token( ctx, &inst->Label);
>         }
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.h b/src/gallium/auxiliary/tgsi/tgsi_parse.h
> index 35e1c7c..f0f4a58 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_parse.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_parse.h
> @@ -88,7 +88,6 @@ struct tgsi_full_property
>   struct tgsi_full_instruction
>   {
>      struct tgsi_instruction             Instruction;
> -   struct tgsi_instruction_predicate   Predicate;
>      struct tgsi_instruction_label       Label;
>      struct tgsi_instruction_texture     Texture;
>      struct tgsi_full_dst_register       Dst[TGSI_FULL_MAX_DST_REGISTERS];
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_sanity.c b/src/gallium/auxiliary/tgsi/tgsi_sanity.c
> index d14372f..e9cbf10 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_sanity.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_sanity.c
> @@ -256,7 +256,6 @@ static const char *file_names[TGSI_FILE_COUNT] =
>      "SAMP",
>      "ADDR",
>      "IMM",
> -   "PRED",
>      "SV",
>      "RES"
>   };
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c b/src/gallium/auxiliary/tgsi/tgsi_strings.c
> index 8271ea0..5c4eb98 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_strings.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c
> @@ -52,7 +52,6 @@ static const char *tgsi_file_names[] =
>      "SAMP",
>      "ADDR",
>      "IMM",
> -   "PRED",
>      "SV",
>      "RES",
>      "SVIEW"
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c
> index 3e3ed5b..c414c58 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_text.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
> @@ -952,43 +952,6 @@ parse_instruction(
>
>      inst = tgsi_default_full_instruction();
>
> -   /* Parse predicate.
> -    */
> -   eat_opt_white( &ctx->cur );
> -   if (*ctx->cur == '(') {
> -      uint file;
> -      int index;
> -      uint swizzle[4];
> -      boolean parsed_swizzle;
> -
> -      inst.Instruction.Predicate = 1;
> -
> -      ctx->cur++;
> -      if (*ctx->cur == '!') {
> -         ctx->cur++;
> -         inst.Predicate.Negate = 1;
> -      }
> -
> -      if (!parse_register_1d( ctx, &file, &index ))
> -         return FALSE;
> -
> -      if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle, 4 )) {
> -         if (parsed_swizzle) {
> -            inst.Predicate.SwizzleX = swizzle[0];
> -            inst.Predicate.SwizzleY = swizzle[1];
> -            inst.Predicate.SwizzleZ = swizzle[2];
> -            inst.Predicate.SwizzleW = swizzle[3];
> -         }
> -      }
> -
> -      if (*ctx->cur != ')') {
> -         report_error( ctx, "Expected `)'" );
> -         return FALSE;
> -      }
> -
> -      ctx->cur++;
> -   }
> -
>      /* Parse instruction name.
>       */
>      eat_opt_white( &ctx->cur );
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> index 3d21319..a292b97 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> @@ -55,7 +55,6 @@ union tgsi_any_token {
>      struct tgsi_immediate imm;
>      union  tgsi_immediate_data imm_data;
>      struct tgsi_instruction insn;
> -   struct tgsi_instruction_predicate insn_predicate;
>      struct tgsi_instruction_label insn_label;
>      struct tgsi_instruction_texture insn_texture;
>      struct tgsi_texture_offset insn_texture_offset;
> @@ -80,7 +79,6 @@ struct ureg_tokens {
>   #define UREG_MAX_CONSTANT_RANGE 32
>   #define UREG_MAX_IMMEDIATE 4096
>   #define UREG_MAX_ADDR 3
> -#define UREG_MAX_PRED 1
>   #define UREG_MAX_ARRAY_TEMPS 256
>
>   struct const_decl {
> @@ -168,7 +166,6 @@ struct ureg_program
>      unsigned properties[TGSI_PROPERTY_COUNT];
>
>      unsigned nr_addrs;
> -   unsigned nr_preds;
>      unsigned nr_instructions;
>
>      struct ureg_tokens domain[2];
> @@ -241,6 +238,7 @@ static union tgsi_any_token *retrieve_token( struct ureg_program *ureg,
>      return &ureg->domain[domain].tokens[nr];
>   }
>
> +
>   void
>   ureg_property(struct ureg_program *ureg, unsigned name, unsigned value)
>   {
> @@ -577,19 +575,6 @@ struct ureg_dst ureg_DECL_address( struct ureg_program *ureg )
>      return ureg_dst_register( TGSI_FILE_ADDRESS, 0 );
>   }
>
> -/* Allocate a new predicate register.
> - */
> -struct ureg_dst
> -ureg_DECL_predicate(struct ureg_program *ureg)
> -{
> -   if (ureg->nr_preds < UREG_MAX_PRED) {
> -      return ureg_dst_register(TGSI_FILE_PREDICATE, ureg->nr_preds++);
> -   }
> -
> -   assert(0);
> -   return ureg_dst_register(TGSI_FILE_PREDICATE, 0);
> -}
> -
>   /* Allocate a new sampler.
>    */
>   struct ureg_src ureg_DECL_sampler( struct ureg_program *ureg,
> @@ -1028,17 +1013,11 @@ struct ureg_emit_insn_result
>   ureg_emit_insn(struct ureg_program *ureg,
>                  unsigned opcode,
>                  boolean saturate,
> -               boolean predicate,
> -               boolean pred_negate,
> -               unsigned pred_swizzle_x,
> -               unsigned pred_swizzle_y,
> -               unsigned pred_swizzle_z,
> -               unsigned pred_swizzle_w,
>                  unsigned num_dst,
> -               unsigned num_src )
> +               unsigned num_src)
>   {
>      union tgsi_any_token *out;
> -   uint count = predicate ? 2 : 1;
> +   uint count = 1;
>      struct ureg_emit_insn_result result;
>
>      validate( opcode, num_dst, num_src );
> @@ -1053,16 +1032,6 @@ ureg_emit_insn(struct ureg_program *ureg,
>      result.insn_token = ureg->domain[DOMAIN_INSN].count - count;
>      result.extended_token = result.insn_token;
>
> -   if (predicate) {
> -      out[0].insn.Predicate = 1;
> -      out[1].insn_predicate = tgsi_default_instruction_predicate();
> -      out[1].insn_predicate.Negate = pred_negate;
> -      out[1].insn_predicate.SwizzleX = pred_swizzle_x;
> -      out[1].insn_predicate.SwizzleY = pred_swizzle_y;
> -      out[1].insn_predicate.SwizzleZ = pred_swizzle_z;
> -      out[1].insn_predicate.SwizzleW = pred_swizzle_w;
> -   }
> -
>      ureg->nr_instructions++;
>
>      return result;
> @@ -1170,33 +1139,16 @@ ureg_insn(struct ureg_program *ureg,
>      struct ureg_emit_insn_result insn;
>      unsigned i;
>      boolean saturate;
> -   boolean predicate;
> -   boolean negate = FALSE;
> -   unsigned swizzle[4] = { 0 };
>
>      if (nr_dst && ureg_dst_is_empty(dst[0])) {
>         return;
>      }
>
>      saturate = nr_dst ? dst[0].Saturate : FALSE;
> -   predicate = nr_dst ? dst[0].Predicate : FALSE;
> -   if (predicate) {
> -      negate = dst[0].PredNegate;
> -      swizzle[0] = dst[0].PredSwizzleX;
> -      swizzle[1] = dst[0].PredSwizzleY;
> -      swizzle[2] = dst[0].PredSwizzleZ;
> -      swizzle[3] = dst[0].PredSwizzleW;
> -   }
>
>      insn = ureg_emit_insn(ureg,
>                            opcode,
>                            saturate,
> -                         predicate,
> -                         negate,
> -                         swizzle[0],
> -                         swizzle[1],
> -                         swizzle[2],
> -                         swizzle[3],
>                            nr_dst,
>                            nr_src);
>
> @@ -1223,33 +1175,16 @@ ureg_tex_insn(struct ureg_program *ureg,
>      struct ureg_emit_insn_result insn;
>      unsigned i;
>      boolean saturate;
> -   boolean predicate;
> -   boolean negate = FALSE;
> -   unsigned swizzle[4] = { 0 };
>
>      if (nr_dst && ureg_dst_is_empty(dst[0])) {
>         return;
>      }
>
>      saturate = nr_dst ? dst[0].Saturate : FALSE;
> -   predicate = nr_dst ? dst[0].Predicate : FALSE;
> -   if (predicate) {
> -      negate = dst[0].PredNegate;
> -      swizzle[0] = dst[0].PredSwizzleX;
> -      swizzle[1] = dst[0].PredSwizzleY;
> -      swizzle[2] = dst[0].PredSwizzleZ;
> -      swizzle[3] = dst[0].PredSwizzleW;
> -   }
>
>      insn = ureg_emit_insn(ureg,
>                            opcode,
>                            saturate,
> -                         predicate,
> -                         negate,
> -                         swizzle[0],
> -                         swizzle[1],
> -                         swizzle[2],
> -                         swizzle[3],
>                            nr_dst,
>                            nr_src);
>
> @@ -1281,12 +1216,6 @@ ureg_label_insn(struct ureg_program *ureg,
>      insn = ureg_emit_insn(ureg,
>                            opcode,
>                            FALSE,
> -                         FALSE,
> -                         FALSE,
> -                         TGSI_SWIZZLE_X,
> -                         TGSI_SWIZZLE_Y,
> -                         TGSI_SWIZZLE_Z,
> -                         TGSI_SWIZZLE_W,
>                            0,
>                            nr_src);
>
> @@ -1682,13 +1611,6 @@ static void emit_decls( struct ureg_program *ureg )
>                          0, ureg->nr_addrs );
>      }
>
> -   if (ureg->nr_preds) {
> -      emit_decl_range(ureg,
> -                      TGSI_FILE_PREDICATE,
> -                      0,
> -                      ureg->nr_preds);
> -   }
> -
>      for (i = 0; i < ureg->nr_immediates; i++) {
>         emit_immediate( ureg,
>                         ureg->immediate[i].value.u,
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> index 0aae550..203d24a 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> @@ -79,12 +79,6 @@ struct ureg_dst
>      unsigned DimIndirect     : 1;  /* BOOL */
>      unsigned Dimension       : 1;  /* BOOL */
>      unsigned Saturate        : 1;  /* BOOL */
> -   unsigned Predicate       : 1;
> -   unsigned PredNegate      : 1;  /* BOOL */
> -   unsigned PredSwizzleX    : 2;  /* TGSI_SWIZZLE_ */
> -   unsigned PredSwizzleY    : 2;  /* TGSI_SWIZZLE_ */
> -   unsigned PredSwizzleZ    : 2;  /* TGSI_SWIZZLE_ */
> -   unsigned PredSwizzleW    : 2;  /* TGSI_SWIZZLE_ */
>      int      Index           : 16; /* SINT */
>      int      IndirectIndex   : 16; /* SINT */
>      unsigned IndirectFile    : 4;  /* TGSI_FILE_ */
> @@ -306,9 +300,6 @@ ureg_release_temporary( struct ureg_program *ureg,
>   struct ureg_dst
>   ureg_DECL_address( struct ureg_program * );
>
> -struct ureg_dst
> -ureg_DECL_predicate(struct ureg_program *);
> -
>   /* Supply an index to the sampler declaration as this is the hook to
>    * the external pipe_sampler state.  Users of this function probably
>    * don't want just any sampler, but a specific one which they've set
> @@ -536,14 +527,8 @@ struct ureg_emit_insn_result
>   ureg_emit_insn(struct ureg_program *ureg,
>                  unsigned opcode,
>                  boolean saturate,
> -               boolean predicate,
> -               boolean pred_negate,
> -               unsigned pred_swizzle_x,
> -               unsigned pred_swizzle_y,
> -               unsigned pred_swizzle_z,
> -               unsigned pred_swizzle_w,
>                  unsigned num_dst,
> -               unsigned num_src );
> +               unsigned num_src);
>
>   void
>   ureg_emit_label(struct ureg_program *ureg,
> @@ -580,12 +565,6 @@ static inline void ureg_##op( struct ureg_program *ureg )       \
>      insn = ureg_emit_insn(ureg,                                  \
>                            opcode,                                \
>                            FALSE,                                 \
> -                         FALSE,                                 \
> -                         FALSE,                                 \
> -                         TGSI_SWIZZLE_X,                        \
> -                         TGSI_SWIZZLE_Y,                        \
> -                         TGSI_SWIZZLE_Z,                        \
> -                         TGSI_SWIZZLE_W,                        \
>                            0,                                     \
>                            0);                                    \
>      ureg_fixup_insn_size( ureg, insn.insn_token );               \
> @@ -600,12 +579,6 @@ static inline void ureg_##op( struct ureg_program *ureg,        \
>      insn = ureg_emit_insn(ureg,                                  \
>                            opcode,                                \
>                            FALSE,                                 \
> -                         FALSE,                                 \
> -                         FALSE,                                 \
> -                         TGSI_SWIZZLE_X,                        \
> -                         TGSI_SWIZZLE_Y,                        \
> -                         TGSI_SWIZZLE_Z,                        \
> -                         TGSI_SWIZZLE_W,                        \
>                            0,                                     \
>                            1);                                    \
>      ureg_emit_src( ureg, src );                                  \
> @@ -621,12 +594,6 @@ static inline void ureg_##op( struct ureg_program *ureg,        \
>      insn = ureg_emit_insn(ureg,                                  \
>                            opcode,                                \
>                            FALSE,                                 \
> -                         FALSE,                                 \
> -                         FALSE,                                 \
> -                         TGSI_SWIZZLE_X,                        \
> -                         TGSI_SWIZZLE_Y,                        \
> -                         TGSI_SWIZZLE_Z,                        \
> -                         TGSI_SWIZZLE_W,                        \
>                            0,                                     \
>                            0);                                    \
>      ureg_emit_label( ureg, insn.extended_token, label_token );   \
> @@ -643,12 +610,6 @@ static inline void ureg_##op( struct ureg_program *ureg,        \
>      insn = ureg_emit_insn(ureg,                                  \
>                            opcode,                                \
>                            FALSE,                                 \
> -                         FALSE,                                 \
> -                         FALSE,                                 \
> -                         TGSI_SWIZZLE_X,                        \
> -                         TGSI_SWIZZLE_Y,                        \
> -                         TGSI_SWIZZLE_Z,                        \
> -                         TGSI_SWIZZLE_W,                        \
>                            0,                                     \
>                            1);                                    \
>      ureg_emit_label( ureg, insn.extended_token, label_token );   \
> @@ -667,12 +628,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            0);                                            \
>      ureg_emit_dst( ureg, dst );                                          \
> @@ -692,12 +647,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            1);                                            \
>      ureg_emit_dst( ureg, dst );                                          \
> @@ -718,12 +667,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            2);                                            \
>      ureg_emit_dst( ureg, dst );                                          \
> @@ -746,12 +689,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            2);                                            \
>      ureg_emit_texture( ureg, insn.extended_token, target, 0 );		\
> @@ -775,12 +712,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            2);                                            \
>      ureg_emit_texture( ureg, insn.extended_token, target, 0 );           \
> @@ -804,12 +735,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            3);                                            \
>      ureg_emit_dst( ureg, dst );                                          \
> @@ -834,12 +759,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            3);                                            \
>      ureg_emit_texture( ureg, insn.extended_token, target, 0 );           \
> @@ -866,12 +785,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            4);                                            \
>      ureg_emit_texture( ureg, insn.extended_token, target, 0 );		\
> @@ -899,12 +812,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            4);                                            \
>      ureg_emit_texture( ureg, insn.extended_token, target, 0 );           \
> @@ -932,12 +839,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            4);                                            \
>      ureg_emit_dst( ureg, dst );                                          \
> @@ -965,12 +866,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            5);                                            \
>      ureg_emit_dst( ureg, dst );                                          \
> @@ -999,12 +894,6 @@ static inline void ureg_##op( struct ureg_program *ureg,                \
>      insn = ureg_emit_insn(ureg,                                          \
>                            opcode,                                        \
>                            dst.Saturate,                                  \
> -                         dst.Predicate,                                 \
> -                         dst.PredNegate,                                \
> -                         dst.PredSwizzleX,                              \
> -                         dst.PredSwizzleY,                              \
> -                         dst.PredSwizzleZ,                              \
> -                         dst.PredSwizzleW,                              \
>                            1,                                             \
>                            5);                                            \
>      ureg_emit_texture( ureg, insn.extended_token, target, 0 );           \
> @@ -1088,24 +977,6 @@ ureg_saturate( struct ureg_dst reg )
>      return reg;
>   }
>
> -static inline struct ureg_dst
> -ureg_predicate(struct ureg_dst reg,
> -               boolean negate,
> -               unsigned swizzle_x,
> -               unsigned swizzle_y,
> -               unsigned swizzle_z,
> -               unsigned swizzle_w)
> -{
> -   assert(reg.File != TGSI_FILE_NULL);
> -   reg.Predicate = 1;
> -   reg.PredNegate = negate;
> -   reg.PredSwizzleX = swizzle_x;
> -   reg.PredSwizzleY = swizzle_y;
> -   reg.PredSwizzleZ = swizzle_z;
> -   reg.PredSwizzleW = swizzle_w;
> -   return reg;
> -}
> -
>   static inline struct ureg_dst
>   ureg_dst_indirect( struct ureg_dst reg, struct ureg_src addr )
>   {
> @@ -1206,12 +1077,6 @@ ureg_dst_array_register(unsigned file,
>      dst.IndirectIndex = 0;
>      dst.IndirectSwizzle = 0;
>      dst.Saturate  = 0;
> -   dst.Predicate = 0;
> -   dst.PredNegate = 0;
> -   dst.PredSwizzleX = TGSI_SWIZZLE_X;
> -   dst.PredSwizzleY = TGSI_SWIZZLE_Y;
> -   dst.PredSwizzleZ = TGSI_SWIZZLE_Z;
> -   dst.PredSwizzleW = TGSI_SWIZZLE_W;
>      dst.Index     = index;
>      dst.Dimension = 0;
>      dst.DimensionIndex = 0;
> @@ -1247,12 +1112,6 @@ ureg_dst( struct ureg_src src )
>      dst.IndirectIndex = src.IndirectIndex;
>      dst.IndirectSwizzle = src.IndirectSwizzle;
>      dst.Saturate  = 0;
> -   dst.Predicate = 0;
> -   dst.PredNegate = 0;
> -   dst.PredSwizzleX = TGSI_SWIZZLE_X;
> -   dst.PredSwizzleY = TGSI_SWIZZLE_Y;
> -   dst.PredSwizzleZ = TGSI_SWIZZLE_Z;
> -   dst.PredSwizzleW = TGSI_SWIZZLE_W;
>      dst.Index     = src.Index;
>      dst.Dimension = src.Dimension;
>      dst.DimensionIndex = src.DimensionIndex;
> @@ -1344,12 +1203,6 @@ ureg_dst_undef( void )
>      dst.IndirectIndex = 0;
>      dst.IndirectSwizzle = 0;
>      dst.Saturate  = 0;
> -   dst.Predicate = 0;
> -   dst.PredNegate = 0;
> -   dst.PredSwizzleX = TGSI_SWIZZLE_X;
> -   dst.PredSwizzleY = TGSI_SWIZZLE_Y;
> -   dst.PredSwizzleZ = TGSI_SWIZZLE_Z;
> -   dst.PredSwizzleW = TGSI_SWIZZLE_W;
>      dst.Index     = 0;
>      dst.Dimension = 0;
>      dst.DimensionIndex = 0;
> diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
> index 2c0da01..127dbba 100644
> --- a/src/gallium/docs/source/screen.rst
> +++ b/src/gallium/docs/source/screen.rst
> @@ -325,7 +325,6 @@ file is still supported. In that case, the constbuf index is assumed
>   to be 0.
>
>   * ``PIPE_SHADER_CAP_MAX_TEMPS``: The maximum number of temporary registers.
> -* ``PIPE_SHADER_CAP_MAX_PREDS``: The maximum number of predicate registers.
>   * ``PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED``: Whether the continue opcode is supported.
>   * ``PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR``: Whether indirect addressing
>     of the input file is supported.
> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
> index 17dd47c..b9c61a0 100644
> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
> @@ -380,8 +380,6 @@ fd_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
>   		return ((is_a3xx(screen) || is_a4xx(screen)) ? 4096 : 64) * sizeof(float[4]);
>   	case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
>   		return is_ir3(screen) ? 16 : 1;
> -	case PIPE_SHADER_CAP_MAX_PREDS:
> -		return 0; /* nothing uses this */
>   	case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
>   		return 1;
>   	case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
> diff --git a/src/gallium/drivers/i915/i915_fpc.h b/src/gallium/drivers/i915/i915_fpc.h
> index adc4254..309cf8e 100644
> --- a/src/gallium/drivers/i915/i915_fpc.h
> +++ b/src/gallium/drivers/i915/i915_fpc.h
> @@ -296,7 +296,6 @@ struct i915_full_instruction
>   {
>      struct tgsi_instruction             Instruction;
>   /*
> -   struct tgsi_instruction_predicate   Predicate;
>      struct tgsi_instruction_label       Label;
>   */
>      struct tgsi_instruction_texture     Texture;
> diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
> index 19a94a8..7dc4148 100644
> --- a/src/gallium/drivers/i915/i915_screen.c
> +++ b/src/gallium/drivers/i915/i915_screen.c
> @@ -144,8 +144,6 @@ i915_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_sha
>            return 1;
>         case PIPE_SHADER_CAP_MAX_TEMPS:
>            return 12; /* XXX: 12 -> 32 ? */
> -      case PIPE_SHADER_CAP_MAX_PREDS:
> -         return 0;
>         case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
>         case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
>            return 0;
> diff --git a/src/gallium/drivers/ilo/ilo_screen.c b/src/gallium/drivers/ilo/ilo_screen.c
> index ab4d137..275b969 100644
> --- a/src/gallium/drivers/ilo/ilo_screen.c
> +++ b/src/gallium/drivers/ilo/ilo_screen.c
> @@ -114,8 +114,6 @@ ilo_get_shader_param(struct pipe_screen *screen, unsigned shader,
>         return ILO_MAX_CONST_BUFFERS;
>      case PIPE_SHADER_CAP_MAX_TEMPS:
>         return 256;
> -   case PIPE_SHADER_CAP_MAX_PREDS:
> -      return 0;
>      case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
>         return 1;
>      case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
> diff --git a/src/gallium/drivers/ilo/shader/toy_tgsi.c b/src/gallium/drivers/ilo/shader/toy_tgsi.c
> index d38585f..0c249d7 100644
> --- a/src/gallium/drivers/ilo/shader/toy_tgsi.c
> +++ b/src/gallium/drivers/ilo/shader/toy_tgsi.c
> @@ -1723,7 +1723,6 @@ ra_get_dst(struct toy_tgsi *tgsi,
>      case TGSI_FILE_OUTPUT:
>      case TGSI_FILE_TEMPORARY:
>      case TGSI_FILE_ADDRESS:
> -   case TGSI_FILE_PREDICATE:
>         need_vrf = true;
>         break;
>      default:
> @@ -1844,7 +1843,6 @@ ra_get_src_indirect(struct toy_tgsi *tgsi,
>      case TGSI_FILE_TEMPORARY:
>      case TGSI_FILE_ADDRESS:
>      case TGSI_FILE_IMMEDIATE:
> -   case TGSI_FILE_PREDICATE:
>         need_vrf = true;
>         break;
>      default:
> @@ -1914,7 +1912,6 @@ ra_get_src(struct toy_tgsi *tgsi,
>         break;
>      case TGSI_FILE_TEMPORARY:
>      case TGSI_FILE_ADDRESS:
> -   case TGSI_FILE_PREDICATE:
>         need_vrf = true;
>         break;
>      case TGSI_FILE_SAMPLER:
> @@ -1971,7 +1968,6 @@ ra_get_src(struct toy_tgsi *tgsi,
>            switch (s->Register.File) {
>            case TGSI_FILE_TEMPORARY:
>            case TGSI_FILE_ADDRESS:
> -         case TGSI_FILE_PREDICATE:
>               {
>                  struct toy_dst dst = tdst_from(src);
>                  dst.writemask = TOY_WRITEMASK_XYZW;
> @@ -2254,7 +2250,6 @@ parse_declaration(struct toy_tgsi *tgsi,
>      case TGSI_FILE_NULL:
>      case TGSI_FILE_TEMPORARY:
>      case TGSI_FILE_SAMPLER:
> -   case TGSI_FILE_PREDICATE:
>      case TGSI_FILE_ADDRESS:
>      case TGSI_FILE_RESOURCE:
>      case TGSI_FILE_SAMPLER_VIEW:
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> index f153674..cd00db5 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> @@ -345,7 +345,6 @@ static nv50_ir::DataFile translateFile(uint file)
>      case TGSI_FILE_OUTPUT:          return nv50_ir::FILE_SHADER_OUTPUT;
>      case TGSI_FILE_TEMPORARY:       return nv50_ir::FILE_GPR;
>      case TGSI_FILE_ADDRESS:         return nv50_ir::FILE_ADDRESS;
> -   case TGSI_FILE_PREDICATE:       return nv50_ir::FILE_PREDICATE;
>      case TGSI_FILE_IMMEDIATE:       return nv50_ir::FILE_IMMEDIATE;
>      case TGSI_FILE_SYSTEM_VALUE:    return nv50_ir::FILE_SYSTEM_VALUE;
>      case TGSI_FILE_RESOURCE:        return nv50_ir::FILE_MEMORY_GLOBAL;
> @@ -1150,7 +1149,6 @@ bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)
>      case TGSI_FILE_ADDRESS:
>      case TGSI_FILE_CONSTANT:
>      case TGSI_FILE_IMMEDIATE:
> -   case TGSI_FILE_PREDICATE:
>      case TGSI_FILE_SAMPLER:
>         break;
>      default:
> @@ -1384,7 +1382,6 @@ private:
>
>      DataArray tData; // TGSI_FILE_TEMPORARY
>      DataArray aData; // TGSI_FILE_ADDRESS
> -   DataArray pData; // TGSI_FILE_PREDICATE
>      DataArray oData; // TGSI_FILE_OUTPUT (if outputs in registers)
>
>      Value *zero;
> @@ -1587,8 +1584,6 @@ Converter::getArrayForFile(unsigned file, int idx)
>      switch (file) {
>      case TGSI_FILE_TEMPORARY:
>         return &tData;
> -   case TGSI_FILE_PREDICATE:
> -      return &pData;
>      case TGSI_FILE_ADDRESS:
>         return &aData;
>      case TGSI_FILE_OUTPUT:
> @@ -1729,7 +1724,6 @@ Converter::storeDst(const tgsi::Instruction::DstRegister dst, int c,
>         }
>      } else
>      if (f == TGSI_FILE_TEMPORARY ||
> -       f == TGSI_FILE_PREDICATE ||
>          f == TGSI_FILE_ADDRESS ||
>          f == TGSI_FILE_OUTPUT) {
>         getArrayForFile(f, idx2d)->store(sub.cur->values, idx, c, ptr, val);
> @@ -3263,19 +3257,17 @@ Converter::exportOutputs()
>   Converter::Converter(Program *ir, const tgsi::Source *code) : BuildUtil(ir),
>        code(code),
>        tgsi(NULL),
> -     tData(this), aData(this), pData(this), oData(this)
> +     tData(this), aData(this), oData(this)
>   {
>      info = code->info;
>
>      const DataFile tFile = code->mainTempsInLMem ? FILE_MEMORY_LOCAL : FILE_GPR;
>
>      const unsigned tSize = code->fileSize(TGSI_FILE_TEMPORARY);
> -   const unsigned pSize = code->fileSize(TGSI_FILE_PREDICATE);
>      const unsigned aSize = code->fileSize(TGSI_FILE_ADDRESS);
>      const unsigned oSize = code->fileSize(TGSI_FILE_OUTPUT);
>
>      tData.setup(TGSI_FILE_TEMPORARY, 0, 0, tSize, 4, 4, tFile, 0);
> -   pData.setup(TGSI_FILE_PREDICATE, 0, 0, pSize, 4, 4, FILE_PREDICATE, 0);
>      aData.setup(TGSI_FILE_ADDRESS, 0, 0, aSize, 4, 4, FILE_GPR, 0);
>      oData.setup(TGSI_FILE_OUTPUT, 0, 0, oSize, 4, 4, FILE_GPR, 0);
>
> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> index 7aad26b..eb9920b 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> @@ -246,7 +246,6 @@ nv30_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
>         case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
>         case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>            return 0;
> -      case PIPE_SHADER_CAP_MAX_PREDS:
>         case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
>         case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
>         case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
> @@ -288,7 +287,6 @@ nv30_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
>         case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
>         case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>            return 16;
> -      case PIPE_SHADER_CAP_MAX_PREDS:
>         case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
>         case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
>         case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> index 30e6e04..b4d1420 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> @@ -275,8 +275,6 @@ nv50_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
>      case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
>      case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
>         return 1;
> -   case PIPE_SHADER_CAP_MAX_PREDS:
> -      return 0;
>      case PIPE_SHADER_CAP_MAX_TEMPS:
>         return nv50_screen(pscreen)->max_tls_space / ONE_TEMP_SIZE;
>      case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> index ab19b26..2b0ea0e 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> @@ -286,8 +286,6 @@ nvc0_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
>      case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
>      case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
>         return 1;
> -   case PIPE_SHADER_CAP_MAX_PREDS:
> -      return 0;
>      case PIPE_SHADER_CAP_MAX_TEMPS:
>         return NVC0_CAP_MAX_PROGRAM_TEMPS;
>      case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
> diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
> index 4ca0b26..882c172 100644
> --- a/src/gallium/drivers/r300/r300_screen.c
> +++ b/src/gallium/drivers/r300/r300_screen.c
> @@ -282,8 +282,6 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e
>               return 1;
>           case PIPE_SHADER_CAP_MAX_TEMPS:
>               return is_r500 ? 128 : is_r400 ? 64 : 32;
> -        case PIPE_SHADER_CAP_MAX_PREDS:
> -            return 0; /* unused */
>           case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
>           case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
>              return r300screen->caps.num_tex_units;
> @@ -335,8 +333,6 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e
>               return 1;
>           case PIPE_SHADER_CAP_MAX_TEMPS:
>               return 32;
> -        case PIPE_SHADER_CAP_MAX_PREDS:
> -            return 0; /* unused */
>           case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
>           case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
>               return 1;
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index f6efaa3..542e8b7 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -470,8 +470,6 @@ static int r600_get_shader_param(struct pipe_screen* pscreen, unsigned shader, e
>   		}
>   	case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
>   		return R600_MAX_USER_CONST_BUFFERS;
> -	case PIPE_SHADER_CAP_MAX_PREDS:
> -		return 0; /* nothing uses this */
>   	case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
>   		return 1;
>   	case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
> diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
> index 1ab389c..118d49e 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -344,10 +344,6 @@ static int tgsi_is_supported(struct r600_shader_ctx *ctx)
>   		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
>   		return -EINVAL;
>   	}
> -	if (i->Instruction.Predicate) {
> -		R600_ERR("predicate unsupported\n");
> -		return -EINVAL;
> -	}
>   #if 0
>   	if (i->Instruction.Label) {
>   		R600_ERR("label unsupported\n");
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
> index 7dbb2e3..ec4573b 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -468,8 +468,6 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu
>   		return 4096 * sizeof(float[4]); /* actually only memory limits this */
>   	case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
>   		return SI_NUM_USER_CONST_BUFFERS;
> -	case PIPE_SHADER_CAP_MAX_PREDS:
> -		return 0; /* FIXME */
>   	case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
>   		return 1;
>   	case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
> diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c
> index 66c3dea..af940d7 100644
> --- a/src/gallium/drivers/svga/svga_screen.c
> +++ b/src/gallium/drivers/svga/svga_screen.c
> @@ -358,8 +358,6 @@ static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, en
>   	  * does it is better to defer loop unrolling to the state tracker.
>   	  */
>            return 0;
> -      case PIPE_SHADER_CAP_MAX_PREDS:
> -         return 1;
>         case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
>            return 0;
>         case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
> @@ -413,8 +411,6 @@ static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, en
>            if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_TEMPS, &result))
>               return 32;
>            return MIN2(result.u, SVGA3D_TEMPREG_MAX);
> -      case PIPE_SHADER_CAP_MAX_PREDS:
> -         return 1;
>         case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
>            return 0;
>         case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> index 88e37e9..a80a396 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -677,7 +677,6 @@ enum pipe_shader_cap
>      PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE,
>      PIPE_SHADER_CAP_MAX_CONST_BUFFERS,
>      PIPE_SHADER_CAP_MAX_TEMPS,
> -   PIPE_SHADER_CAP_MAX_PREDS,
>      /* boolean caps */
>      PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED,
>      PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR,
> diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
> index 6e07b2c..6cf8132 100644
> --- a/src/gallium/include/pipe/p_shader_tokens.h
> +++ b/src/gallium/include/pipe/p_shader_tokens.h
> @@ -74,10 +74,9 @@ enum tgsi_file_type {
>      TGSI_FILE_SAMPLER             =5,
>      TGSI_FILE_ADDRESS             =6,
>      TGSI_FILE_IMMEDIATE           =7,
> -   TGSI_FILE_PREDICATE           =8,
> -   TGSI_FILE_SYSTEM_VALUE        =9,
> -   TGSI_FILE_RESOURCE            =10,
> -   TGSI_FILE_SAMPLER_VIEW        =11,
> +   TGSI_FILE_SYSTEM_VALUE        =8,
> +   TGSI_FILE_RESOURCE            =9,
> +   TGSI_FILE_SAMPLER_VIEW        =10,
>      TGSI_FILE_COUNT      /**< how many TGSI_FILE_ types */
>   };
>
> @@ -547,8 +546,6 @@ struct tgsi_property_data {
>    * respectively. For a given operation code, those numbers are fixed and are
>    * present here only for convenience.
>    *
> - * If Predicate is TRUE, tgsi_instruction_predicate token immediately follows.
> - *
>    * Saturate controls how are final results in destination registers modified.
>    */
>
> @@ -560,7 +557,6 @@ struct tgsi_instruction
>      unsigned Saturate   : 1;  /* BOOL */
>      unsigned NumDstRegs : 2;  /* UINT */
>      unsigned NumSrcRegs : 4;  /* UINT */
> -   unsigned Predicate  : 1;  /* BOOL */
>      unsigned Label      : 1;
>      unsigned Texture    : 1;
>      unsigned Padding    : 2;
> @@ -635,21 +631,6 @@ struct tgsi_texture_offset
>      unsigned Padding  : 6;
>   };
>
> -/*
> - * For SM3, the following constraint applies.
> - *   - Swizzle is either set to identity or replicate.
> - */
> -struct tgsi_instruction_predicate
> -{
> -   int      Index    : 16; /* SINT */
> -   unsigned SwizzleX : 2;  /* TGSI_SWIZZLE_x */
> -   unsigned SwizzleY : 2;  /* TGSI_SWIZZLE_x */
> -   unsigned SwizzleZ : 2;  /* TGSI_SWIZZLE_x */
> -   unsigned SwizzleW : 2;  /* TGSI_SWIZZLE_x */
> -   unsigned Negate   : 1;  /* BOOL */
> -   unsigned Padding  : 7;
> -};
> -
>   /**
>    * File specifies the register array to access.
>    *
> diff --git a/src/gallium/state_trackers/nine/nine_shader.c b/src/gallium/state_trackers/nine/nine_shader.c
> index 28f2787..8380067 100644
> --- a/src/gallium/state_trackers/nine/nine_shader.c
> +++ b/src/gallium/state_trackers/nine/nine_shader.c
> @@ -673,14 +673,6 @@ tx_addr_alloc(struct shader_translator *tx, INT idx)
>           tx->regs.a0 = ureg_DECL_temporary(tx->ureg);
>   }
>
> -static inline void
> -tx_pred_alloc(struct shader_translator *tx, INT idx)
> -{
> -    assert(idx == 0);
> -    if (ureg_dst_is_undef(tx->regs.p))
> -        tx->regs.p = ureg_DECL_predicate(tx->ureg);
> -}
> -
>   /* NOTE: It's not very clear on which ps1.1-ps1.3 instructions
>    * the projection should be applied on the texture. It doesn't
>    * apply on texkill.
> @@ -879,9 +871,7 @@ tx_src_param(struct shader_translator *tx, const struct sm1_src_param *param)
>           }
>           break;
>       case D3DSPR_PREDICATE:
> -        assert(!param->rel);
> -        tx_pred_alloc(tx, param->idx);
> -        src = ureg_src(tx->regs.p);
> +        assert(!"D3DSPR_PREDICATE");
>           break;
>       case D3DSPR_SAMPLER:
>           assert(param->mod == NINED3DSPSM_NONE);
> @@ -1168,9 +1158,7 @@ _tx_dst_param(struct shader_translator *tx, const struct sm1_dst_param *param)
>           dst = tx->regs.oDepth; /* XXX: must write .z component */
>           break;
>       case D3DSPR_PREDICATE:
> -        assert(!param->rel);
> -        tx_pred_alloc(tx, param->idx);
> -        dst = tx->regs.p;
> +        assert(!"D3DSPR_PREDICATE");
>           break;
>       case D3DSPR_TEMPFLOAT16:
>           DBG("unhandled D3DSPR: %u\n", param->file);
> @@ -3339,7 +3327,7 @@ nine_translate_shader(struct NineDevice9 *device, struct nine_shader_info *info)
>
>       tx->native_integers = GET_SHADER_CAP(INTEGERS);
>       tx->inline_subroutines = !GET_SHADER_CAP(SUBROUTINES);
> -    tx->lower_preds = !GET_SHADER_CAP(MAX_PREDS);
> +    tx->lower_preds = true;
>       tx->want_texcoord = GET_CAP(TGSI_TEXCOORD);
>       tx->shift_wpos = !GET_CAP(TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
>       tx->texcoord_sn = tx->want_texcoord ?
>
On the flip side, we could remove TGSI_FILE_ADDR, TGSI_OPCODE_ARL, and 
TGSI_OPCODE_ARR.

We already remove all dependencies of these from our internal state tracers.

And it is trivial to do so, at least for HW with native integer support.

Jose

On 01/09/15 23:55, Jose Fonseca wrote:
> I'm all for TGIS simplification, but I just checked, and we rely on TGSI
> predicates for some of our internal state trackers.  So I'll need more
> time to evaluate how much effort it would be to not rely on it, and when
> can it be done.
>
> Jose
>
> On 01/09/15 22:19, Marek Olšák wrote:
>> From: Marek Olšák <marek.olsak@amd.com>
>>
>> Neved used.
On Thu, Sep 3, 2015 at 1:17 PM, Jose Fonseca <jfonseca@vmware.com> wrote:
> On the flip side, we could remove TGSI_FILE_ADDR, TGSI_OPCODE_ARL, and
> TGSI_OPCODE_ARR.
>
> We already remove all dependencies of these from our internal state tracers.
>
> And it is trivial to do so, at least for HW with native integer support.

Unfortunately, r600 has native address registers and generates
bytecode directly from TGSI, so the only radeon driver that can drop
support for TGSI_FILE_ADDR is radeonsi. Sadly, TGSI_FILE_ADDR has a
lot of users (newly nine), so it's not going away just yet.

Marek
On Wed, Sep 2, 2015 at 12:55 AM, Jose Fonseca <jfonseca@vmware.com> wrote:
> I'm all for TGIS simplification, but I just checked, and we rely on TGSI
> predicates for some of our internal state trackers.  So I'll need more time
> to evaluate how much effort it would be to not rely on it, and when can it
> be done.

Any news? :)

Marek
On 24/09/15 19:01, Marek Olšák wrote:
> On Wed, Sep 2, 2015 at 12:55 AM, Jose Fonseca <jfonseca@vmware.com> wrote:
>> I'm all for TGIS simplification, but I just checked, and we rely on TGSI
>> predicates for some of our internal state trackers.  So I'll need more time
>> to evaluate how much effort it would be to not rely on it, and when can it
>> be done.
>
> Any news? :)
>
> Marek
>

We already removed predicate usage from one user.  But we still have 
another user to go.  We'll need a bit more time.

Jose