Пример #1
0
static void
validate_alu_src(nir_alu_instr *instr, unsigned index, validate_state *state)
{
   nir_alu_src *src = &instr->src[index];

   unsigned num_components;
   unsigned src_bit_size;
   if (src->src.is_ssa) {
      src_bit_size = src->src.ssa->bit_size;
      num_components = src->src.ssa->num_components;
   } else {
      src_bit_size = src->src.reg.reg->bit_size;
      if (src->src.reg.reg->is_packed)
         num_components = 4; /* can't check anything */
      else
         num_components = src->src.reg.reg->num_components;
   }
   for (unsigned i = 0; i < 4; i++) {
      validate_assert(state, src->swizzle[i] < 4);

      if (nir_alu_instr_channel_used(instr, index, i))
         validate_assert(state, src->swizzle[i] < num_components);
   }

   nir_alu_type src_type = nir_op_infos[instr->op].input_types[index];

   /* 8-bit float isn't a thing */
   if (nir_alu_type_get_base_type(src_type) == nir_type_float)
      validate_assert(state, src_bit_size == 16 || src_bit_size == 32 || src_bit_size == 64);

   if (nir_alu_type_get_type_size(src_type)) {
      /* This source has an explicit bit size */
      validate_assert(state, nir_alu_type_get_type_size(src_type) == src_bit_size);
   } else {
      if (!nir_alu_type_get_type_size(nir_op_infos[instr->op].output_type)) {
         unsigned dest_bit_size =
            instr->dest.dest.is_ssa ? instr->dest.dest.ssa.bit_size
                                    : instr->dest.dest.reg.reg->bit_size;
         validate_assert(state, dest_bit_size == src_bit_size);
      }
   }

   validate_src(&src->src, state);
}
Пример #2
0
static void
validate_alu_src(nir_alu_instr *instr, unsigned index, validate_state *state)
{
   nir_alu_src *src = &instr->src[index];

   unsigned num_components;
   if (src->src.is_ssa)
      num_components = src->src.ssa->num_components;
   else {
      if (src->src.reg.reg->is_packed)
         num_components = 4; /* can't check anything */
      else
         num_components = src->src.reg.reg->num_components;
   }
   for (unsigned i = 0; i < 4; i++) {
      assert(src->swizzle[i] < 4);

      if (nir_alu_instr_channel_used(instr, index, i))
         assert(src->swizzle[i] < num_components);
   }

   validate_src(&src->src, state);
}