Beispiel #1
0
static struct ureg_src
decl_immediate( struct ureg_program *ureg,
                const unsigned *v,
                unsigned nr,
                unsigned type )
{
   unsigned i, j;
   unsigned swizzle = 0;

   /* Could do a first pass where we examine all existing immediates
    * without expanding.
    */

   for (i = 0; i < ureg->nr_immediates; i++) {
      if (ureg->immediate[i].type != type) {
         continue;
      }
      if (match_or_expand_immediate(v,
                                    nr,
                                    ureg->immediate[i].value.u,
                                    &ureg->immediate[i].nr,
                                    &swizzle)) {
         goto out;
      }
   }

   if (ureg->nr_immediates < UREG_MAX_IMMEDIATE) {
      i = ureg->nr_immediates++;
      ureg->immediate[i].type = type;
      if (match_or_expand_immediate(v,
                                    nr,
                                    ureg->immediate[i].value.u,
                                    &ureg->immediate[i].nr,
                                    &swizzle)) {
         goto out;
      }
   }

   set_bad(ureg);

out:
   /* Make sure that all referenced elements are from this immediate.
    * Has the effect of making size-one immediates into scalars.
    */
   for (j = nr; j < 4; j++) {
      swizzle |= (swizzle & 0x3) << (j * 2);
   }

   return ureg_swizzle(ureg_src_register(TGSI_FILE_IMMEDIATE, i),
                       (swizzle >> 0) & 0x3,
                       (swizzle >> 2) & 0x3,
                       (swizzle >> 4) & 0x3,
                       (swizzle >> 6) & 0x3);
}
Beispiel #2
0
/* Internally generated immediates: overkill...
 */
static struct brw_fp_src src_imm( struct brw_wm_compile *c, 
				  const GLfloat *v, 
				  unsigned nr)
{
   unsigned i, j;
   unsigned swizzle;

   /* Could do a first pass where we examine all existing immediates
    * without expanding.
    */

   for (i = 0; i < c->nr_immediates; i++) {
      if (match_or_expand_immediate( v, 
                                     nr,
                                     c->immediate[i].v,
                                     &c->immediate[i].nr, 
                                     &swizzle ))
         goto out;
   }

   if (c->nr_immediates < Elements(c->immediate)) {
      i = c->nr_immediates++;
      if (match_or_expand_immediate( v,
                                     nr,
                                     c->immediate[i].v,
                                     &c->immediate[i].nr, 
                                     &swizzle ))
         goto out;
   }

   c->error = 1;
   return src_undef();

out:
   /* Make sure that all referenced elements are from this immediate.
    * Has the effect of making size-one immediates into scalars.
    */
   for (j = nr; j < 4; j++)
      swizzle |= (swizzle & 0x3) << (j * 2);

   return src_swizzle( src_reg( TGSI_FILE_IMMEDIATE, i ),
		       BRW_GET_SWZ(swizzle, X),
		       BRW_GET_SWZ(swizzle, Y),
		       BRW_GET_SWZ(swizzle, Z),
		       BRW_GET_SWZ(swizzle, W) );
}