Module: Mesa
Branch: master
Commit: f74c3b0404c21568ec3621aad28f450c788ebfd4
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=f74c3b0404c21568ec3621aad28f450c788ebfd4

Author: Eric Anholt <[email protected]>
Date:   Fri Aug 14 16:11:06 2020 -0700

freedreno/ir3: Use the new NIR UBO ranges in UBO analysis.

Now that NIR doesn't lose the original base/range on the
nir_lower_uniforms_to_ubo() path, we get a lot more indirect arrays
uploaded in shader-db.

total instructions in shared programs: 8125988 -> 8103788 (-0.27%)
total constlen in shared programs: 1313096 -> 1448864 (10.34%)
total cat6 in shared programs: 104089 -> 97824 (-6.02%)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6359>

---

 src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c | 53 ++++++++++----------------
 1 file changed, 21 insertions(+), 32 deletions(-)

diff --git a/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c 
b/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c
index 8a9503feb74..57c00779465 100644
--- a/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c
+++ b/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c
@@ -27,31 +27,28 @@
 #include "compiler/nir/nir_builder.h"
 #include "util/u_math.h"
 
-static bool
-ubo_is_gl_uniforms(const struct ir3_ubo_info *ubo)
+static inline bool
+get_ubo_load_range(nir_shader *nir, nir_intrinsic_instr *instr, uint32_t 
alignment, struct ir3_ubo_range *r)
 {
-       return !ubo->bindless && ubo->block == 0;
-}
-
-static inline struct ir3_ubo_range
-get_ubo_load_range(nir_shader *nir, nir_intrinsic_instr *instr, uint32_t 
alignment)
-{
-       struct ir3_ubo_range r;
+       uint32_t offset = nir_intrinsic_range_base(instr);
+       uint32_t size = nir_intrinsic_range(instr);
 
+       /* If the offset is constant, the range is trivial (and NIR may not have
+        * figured it out).
+        */
        if (nir_src_is_const(instr->src[1])) {
-               int offset = nir_src_as_uint(instr->src[1]);
-               const int bytes = nir_intrinsic_dest_components(instr) * 4;
-
-               r.start = ROUND_DOWN_TO(offset, alignment * 16);
-               r.end = ALIGN(offset + bytes, alignment * 16);
-       } else {
-               /* The other valid place to call this is on the GL default 
uniform block */
-               assert(nir_src_as_uint(instr->src[0]) == 0);
-               r.start = 0;
-               r.end = ALIGN(nir->num_uniforms * 16, alignment * 16);
+               offset = nir_src_as_uint(instr->src[1]);
+               size = nir_intrinsic_dest_components(instr) * 4;
        }
 
-       return r;
+       /* If we haven't figured out the range accessed in the UBO, bail. */
+       if (size == ~0)
+               return false;
+
+       r->start = ROUND_DOWN_TO(offset, alignment * 16);
+       r->end = ALIGN(offset + size, alignment * 16);
+
+       return true;
 }
 
 static bool
@@ -136,14 +133,10 @@ gather_ubo_ranges(nir_shader *nir, nir_intrinsic_instr 
*instr,
        if (!old_r)
                return;
 
-       /* We don't know how to get the size of UBOs being indirected on, other
-        * than on the GL uniforms where we have some other shader_info data.
-        */
-       if (!nir_src_is_const(instr->src[1]) && 
!ubo_is_gl_uniforms(&old_r->ubo))
+       struct ir3_ubo_range r;
+       if (!get_ubo_load_range(nir, instr, alignment, &r))
                return;
 
-       const struct ir3_ubo_range r = get_ubo_load_range(nir, instr, 
alignment);
-
        if (r.start < old_r->start)
                old_r->start = r.start;
        if (old_r->end < r.end)
@@ -246,10 +239,8 @@ lower_ubo_load_to_uniform(nir_intrinsic_instr *instr, 
nir_builder *b,
                return false;
        }
 
-       /* We don't have a good way of determining the range of the dynamic
-        * access in general, so for now just fall back to pulling.
-        */
-       if (!nir_src_is_const(instr->src[1]) && 
!ubo_is_gl_uniforms(&range->ubo)) {
+       struct ir3_ubo_range r;
+       if (!get_ubo_load_range(b->shader, instr, alignment, &r)) {
                track_ubo_use(instr, b, num_ubos);
                return false;
        }
@@ -257,8 +248,6 @@ lower_ubo_load_to_uniform(nir_intrinsic_instr *instr, 
nir_builder *b,
        /* After gathering the UBO access ranges, we limit the total
         * upload. Don't lower if this load is outside the range.
         */
-       const struct ir3_ubo_range r = get_ubo_load_range(b->shader,
-                       instr, alignment);
        if (!(range->start <= r.start && r.end <= range->end)) {
                track_ubo_use(instr, b, num_ubos);
                return false;

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to