Ejemplo n.º 1
0
static boolean
iter_declaration(
   struct tgsi_iterate_context *iter,
   struct tgsi_full_declaration *decl )
{
   struct sanity_check_ctx *ctx = (struct sanity_check_ctx *) iter;
   uint file;
   uint i;

   /* No declarations allowed after the first instruction.
    */
   if (ctx->num_instructions > 0)
      report_error( ctx, "Instruction expected but declaration found" );

   /* Check registers' validity.
    * Mark the registers as declared.
    */
   file = decl->Declaration.File;
   if (!check_file_name( ctx, file ))
      return TRUE;
   for (i = decl->Range.First; i <= decl->Range.Last; i++) {
      /* declared TGSI_FILE_INPUT's for geometry and tessellation
       * have an implied second dimension */
      uint processor = ctx->iter.processor.Processor;
      uint patch = decl->Semantic.Name == TGSI_SEMANTIC_PATCH ||
         decl->Semantic.Name == TGSI_SEMANTIC_TESSOUTER ||
         decl->Semantic.Name == TGSI_SEMANTIC_TESSINNER;
      if (file == TGSI_FILE_INPUT && !patch && (
                processor == TGSI_PROCESSOR_GEOMETRY ||
                processor == TGSI_PROCESSOR_TESS_CTRL ||
                processor == TGSI_PROCESSOR_TESS_EVAL)) {
         uint vert;
         for (vert = 0; vert < ctx->implied_array_size; ++vert) {
            scan_register *reg = MALLOC(sizeof(scan_register));
            fill_scan_register2d(reg, file, i, vert);
            check_and_declare(ctx, reg);
         }
      } else if (file == TGSI_FILE_OUTPUT && !patch &&
                 processor == TGSI_PROCESSOR_TESS_CTRL) {
         uint vert;
         for (vert = 0; vert < ctx->implied_out_array_size; ++vert) {
            scan_register *reg = MALLOC(sizeof(scan_register));
            fill_scan_register2d(reg, file, i, vert);
            check_and_declare(ctx, reg);
         }
      } else {
         scan_register *reg = MALLOC(sizeof(scan_register));
         if (decl->Declaration.Dimension) {
            fill_scan_register2d(reg, file, i, decl->Dim.Index2D);
         } else {
            fill_scan_register1d(reg, file, i);
         }
         check_and_declare(ctx, reg);
      }
   }

   return TRUE;
}
Ejemplo n.º 2
0
static void
scan_register_dst(scan_register *reg,
                  struct tgsi_full_dst_register *dst)
{
   if (dst->Register.Dimension) {
      /*FIXME: right now we don't support indirect
       * multidimensional addressing */
      fill_scan_register2d(reg,
                           dst->Register.File,
                           dst->Register.Index,
                           dst->Dimension.Index);
   } else {
      fill_scan_register1d(reg,
                           dst->Register.File,
                           dst->Register.Index);
   }
}
Ejemplo n.º 3
0
static void
scan_register_src(scan_register *reg,
                  struct tgsi_full_src_register *src)
{
   if (src->Register.Dimension) {
      /*FIXME: right now we don't support indirect
       * multidimensional addressing */
      debug_assert(!src->Dimension.Indirect);
      fill_scan_register2d(reg,
                           src->Register.File,
                           src->Register.Index,
                           src->Dimension.Index);
   } else {
      fill_scan_register1d(reg,
                           src->Register.File,
                           src->Register.Index);
   }
}