diff options
author | Ilia Mirkin <imirkin@alum.mit.edu> | 2014-07-12 20:06:03 -0400 |
---|---|---|
committer | Marek Olšák <marek.olsak@amd.com> | 2015-05-16 14:51:23 +0200 |
commit | 93c940736f03b3eaf53d3a5703963b87a506747e (patch) | |
tree | a213eb38e232d061a2b1f68c043a13e9c85284b3 | |
parent | 5b45cbe7e2bcf1709ab1fcc50dfc877b3e43bcae (diff) |
tgsi/sanity: set implicit in/out array sizes based on patch sizes
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_sanity.c | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_sanity.c b/src/gallium/auxiliary/tgsi/tgsi_sanity.c index fbfe652e42..2ac74fb15d 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_sanity.c +++ b/src/gallium/auxiliary/tgsi/tgsi_sanity.c @@ -58,6 +58,7 @@ struct sanity_check_ctx uint errors; uint warnings; uint implied_array_size; + uint implied_out_array_size; boolean print; }; @@ -406,16 +407,30 @@ iter_declaration( 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 processor + /* declared TGSI_FILE_INPUT's for geometry and tessellation * have an implied second dimension */ - if (file == TGSI_FILE_INPUT && - ctx->iter.processor.Processor == TGSI_PROCESSOR_GEOMETRY) { + 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_TESSCTRL || + processor == TGSI_PROCESSOR_TESSEVAL)) { 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_TESSCTRL) { + 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) { @@ -474,6 +489,19 @@ iter_property( prop->Property.PropertyName == TGSI_PROPERTY_GS_INPUT_PRIM) { ctx->implied_array_size = u_vertices_per_prim(prop->u[0].Data); } + if (iter->processor.Processor == TGSI_PROCESSOR_TESSCTRL && + prop->Property.PropertyName == TGSI_PROPERTY_TCS_VERTICES_OUT) + ctx->implied_out_array_size = prop->u[0].Data; + return TRUE; +} + +static boolean +prolog(struct tgsi_iterate_context *iter) +{ + struct sanity_check_ctx *ctx = (struct sanity_check_ctx *) iter; + if (iter->processor.Processor == TGSI_PROCESSOR_TESSCTRL || + iter->processor.Processor == TGSI_PROCESSOR_TESSEVAL) + ctx->implied_array_size = 32; return TRUE; } @@ -532,7 +560,7 @@ tgsi_sanity_check( { struct sanity_check_ctx ctx; - ctx.iter.prolog = NULL; + ctx.iter.prolog = prolog; ctx.iter.iterate_instruction = iter_instruction; ctx.iter.iterate_declaration = iter_declaration; ctx.iter.iterate_immediate = iter_immediate; |