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; }
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); } }
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); } }