diff options
author | Rob Clark <[email protected]> | 2020-06-17 09:59:19 -0700 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-06-21 00:52:02 +0000 |
commit | e0f93f68986cdee8afeeb2fb7c7fa57decfcfca3 (patch) | |
tree | 6313bead2a53ca5bf5f5006830ce7473c79677cb /src/freedreno | |
parent | f2226acd74485905506f0efa545d91582dfe9afb (diff) |
freedreno/ir3: splitup get_existing_range()
This serves two purposes, one during ubo range analysis, where we want
to create new ranges, and another during the actual ubo lowering. Split
these in two, with read-only ubo analysis state in the second case, to
prepare to split this pass in two.
Signed-off-by: Rob Clark <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5526>
Diffstat (limited to 'src/freedreno')
-rw-r--r-- | src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c b/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c index ec78ff79fc9..3feb60ed711 100644 --- a/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c +++ b/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c @@ -74,10 +74,36 @@ get_ubo_info(nir_intrinsic_instr *instr, struct ir3_ubo_info *ubo) return false; } -static struct ir3_ubo_range * +/** + * Get an existing range, but don't create a new range associated with + * the ubo, but don't create a new one if one does not already exist. + */ +static const struct ir3_ubo_range * get_existing_range(nir_intrinsic_instr *instr, - struct ir3_ubo_analysis_state *state, - bool create_new) + const struct ir3_ubo_analysis_state *state) +{ + struct ir3_ubo_info ubo = {}; + + if (!get_ubo_info(instr, &ubo)) + return NULL; + + for (int i = 0; i < IR3_MAX_UBO_PUSH_RANGES; i++) { + const struct ir3_ubo_range *range = &state->range[i]; + if (range->end < range->start) { + break; + } else if (!memcmp(&range->ubo, &ubo, sizeof(ubo))) { + return range; + } + } + + return NULL; +} + +/** + * Get an existing range, or create a new one if necessary/possible. + */ +static struct ir3_ubo_range * +get_range(nir_intrinsic_instr *instr, struct ir3_ubo_analysis_state *state) { struct ir3_ubo_info ubo = {}; @@ -89,12 +115,8 @@ get_existing_range(nir_intrinsic_instr *instr, if (range->end < range->start) { /* We don't have a matching range, but there are more available. */ - if (create_new) { - range->ubo = ubo; - return range; - } else { - return NULL; - } + range->ubo = ubo; + return range; } else if (!memcmp(&range->ubo, &ubo, sizeof(ubo))) { return range; } @@ -110,7 +132,7 @@ gather_ubo_ranges(nir_shader *nir, nir_intrinsic_instr *instr, if (ir3_shader_debug & IR3_DBG_NOUBOOPT) return; - struct ir3_ubo_range *old_r = get_existing_range(instr, state, true); + struct ir3_ubo_range *old_r = get_range(instr, state); if (!old_r) return; @@ -217,7 +239,7 @@ lower_ubo_load_to_uniform(nir_intrinsic_instr *instr, nir_builder *b, * could probably with some effort determine a block stride in number of * registers. */ - struct ir3_ubo_range *range = get_existing_range(instr, state, false); + const struct ir3_ubo_range *range = get_existing_range(instr, state); if (!range) { track_ubo_use(instr, b, num_ubos); return; |