diff options
author | Zack Rusin <[email protected]> | 2014-02-04 19:32:04 -0500 |
---|---|---|
committer | Zack Rusin <[email protected]> | 2014-02-05 19:40:53 -0500 |
commit | efb152dd04ad3debfbb510b68a905a5ccb805fbe (patch) | |
tree | eadb4ec1baea356aa598d377af79cf96b584c281 /src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c | |
parent | 69ee3f431f9f1bb782485ede992b95e01ad790a5 (diff) |
gallivm: make sure analysis works with large number of immediates
We need to handle a lot more immediates and in order to do that
we also switch from allocating this structure on the stack to
allocating it on the heap.
Signed-off-by: Zack Rusin <[email protected]>
Reviewed-by: Jose Fonseca <[email protected]>
Reviewed-by: Brian Paul <[email protected]>
Reviewed-by: Roland Scheidegger <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c')
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c index 184790b702f..48d1c52f128 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c @@ -47,7 +47,7 @@ struct analysis_context struct lp_tgsi_info *info; unsigned num_imms; - float imm[128][4]; + float imm[LP_MAX_TGSI_IMMEDIATES][4]; struct lp_tgsi_channel_info temp[32][4]; }; @@ -487,7 +487,7 @@ lp_build_tgsi_info(const struct tgsi_token *tokens, struct lp_tgsi_info *info) { struct tgsi_parse_context parse; - struct analysis_context ctx; + struct analysis_context *ctx; unsigned index; unsigned chan; @@ -495,8 +495,8 @@ lp_build_tgsi_info(const struct tgsi_token *tokens, tgsi_scan_shader(tokens, &info->base); - memset(&ctx, 0, sizeof ctx); - ctx.info = info; + ctx = CALLOC(1, sizeof(struct analysis_context)); + ctx->info = info; tgsi_parse_init(&parse, tokens); @@ -518,7 +518,7 @@ lp_build_tgsi_info(const struct tgsi_token *tokens, goto finished; } - analyse_instruction(&ctx, inst); + analyse_instruction(ctx, inst); } break; @@ -527,16 +527,16 @@ lp_build_tgsi_info(const struct tgsi_token *tokens, const unsigned size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1; assert(size <= 4); - if (ctx.num_imms < Elements(ctx.imm)) { + if (ctx->num_imms < Elements(ctx->imm)) { for (chan = 0; chan < size; ++chan) { float value = parse.FullToken.FullImmediate.u[chan].Float; - ctx.imm[ctx.num_imms][chan] = value; + ctx->imm[ctx->num_imms][chan] = value; if (value < 0.0f || value > 1.0f) { info->unclamped_immediates = TRUE; } } - ++ctx.num_imms; + ++ctx->num_imms; } } break; @@ -551,6 +551,7 @@ lp_build_tgsi_info(const struct tgsi_token *tokens, finished: tgsi_parse_free(&parse); + FREE(ctx); /* |