[Mesa-dev] [PATCH 10/11] mesa/st/glsl_to_tgsi: add array life range evaluation into tracking code

Gert Wollny gw.fossdev at gmail.com
Fri Feb 9 10:11:15 UTC 2018


This adds the array live range tracking harvesting the already implemented
live range tracking for temporary registers. With this patch the array live
range tracking is not yet exposed, and since some tests that track reladdr 
access arrays, some array live range tracker instances need to be available, 
so some are added as a placeholder in get_temp_registers_required_live_ranges.

Signed-off-by: Gert Wollny <gw.fossdev at gmail.com>
---
 .../state_tracker/st_glsl_to_tgsi_temprename.cpp   | 61 +++++++++++++++++-----
 1 file changed, 49 insertions(+), 12 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi_temprename.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi_temprename.cpp
index bdd52ac23a..e27647154e 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi_temprename.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi_temprename.cpp
@@ -995,28 +995,34 @@ public:
 
 class access_recorder {
 public:
-   access_recorder(int _ntemps);
+   access_recorder(int _ntemps, int _narrays);
    ~access_recorder();
 
    void record_read(const st_src_reg& src, int line, prog_scope *scope);
-   void record_write(const st_dst_reg& src, int line, prog_scope *scope);
+   void record_write(const st_dst_reg& src, int line, prog_scope *scope,
+                     bool no_reswizzle);
 
-   void get_required_live_ranges(register_live_range *register_live_ranges);
+   void get_required_live_ranges(register_live_range *register_live_ranges,
+                                 array_live_range *array_live_ranges);
 private:
 
    int ntemps;
+   int narrays;
    temp_access *temp_acc;
-
+   array_access *array_acc;
 };
 
-access_recorder::access_recorder(int _ntemps):
-   ntemps(_ntemps)
+access_recorder::access_recorder(int _ntemps, int _narrays):
+   ntemps(_ntemps),
+   narrays(_narrays)
 {
    temp_acc = new temp_access[ntemps];
+   array_acc = new array_access[narrays];
 }
 
 access_recorder::~access_recorder()
 {
+   delete[] array_acc;
    delete[] temp_acc;
 }
 
@@ -1032,6 +1038,11 @@ void access_recorder::record_read(const st_src_reg& src, int line,
    if (src.file == PROGRAM_TEMPORARY)
       temp_acc[src.index].record_read(line, scope, readmask);
 
+   if (src.file == PROGRAM_ARRAY) {
+      assert(src.array_id <= narrays);
+      array_acc[src.array_id - 1].record_access(line, scope, readmask);
+   }
+
    if (src.reladdr)
       record_read(*src.reladdr, line, scope);
    if (src.reladdr2)
@@ -1039,18 +1050,30 @@ void access_recorder::record_read(const st_src_reg& src, int line,
 }
 
 void access_recorder::record_write(const st_dst_reg& dst, int line,
-                                   prog_scope *scope)
+                                   prog_scope *scope, bool can_reswizzle)
 {
    if (dst.file == PROGRAM_TEMPORARY)
       temp_acc[dst.index].record_write(line, scope, dst.writemask);
 
+   if (dst.file == PROGRAM_ARRAY) {
+      assert(dst.array_id <= narrays);
+
+      /* If the array is written as dst of a multi-dst operation, we must not
+       * reswizzle the access, because we would have to reswizzle also the
+       * other dst. For now just fill the mask to make interleaving impossible.
+       */
+      array_acc[dst.array_id - 1].record_access(line, scope,
+                                                can_reswizzle ? dst.writemask: 0xF);
+   }
+
    if (dst.reladdr)
       record_read(*dst.reladdr, line, scope);
    if (dst.reladdr2)
       record_read(*dst.reladdr2, line, scope);
 }
 
-void access_recorder::get_required_live_ranges(struct register_live_range *register_live_ranges)
+void access_recorder::get_required_live_ranges(struct register_live_range *register_live_ranges,
+                                               struct array_live_range *array_live_ranges)
 {
    RENAME_DEBUG(debug_log << "== register live ranges ==========\n");
    for(int i = 0; i < ntemps; ++i) {
@@ -1060,6 +1083,15 @@ void access_recorder::get_required_live_ranges(struct register_live_range *regis
                         <<register_live_ranges[i].end << "]\n");
    }
    RENAME_DEBUG(debug_log << "==================================\n\n");
+
+   RENAME_DEBUG(debug_log << "== array live ranges ==========\n");
+   for(int i = 0; i < narrays; ++i) {
+      RENAME_DEBUG(debug_log<< setw(4) << i);
+      array_acc[i].get_required_live_range(array_live_ranges[i]);
+      RENAME_DEBUG(debug_log << ": [" <<array_live_ranges[i].begin() << ", "
+                        << array_live_ranges[i].end() << "]\n");
+   }
+   RENAME_DEBUG(debug_log << "==================================\n\n");
 }
 
 }
@@ -1084,6 +1116,10 @@ get_temp_registers_required_live_ranges(void *mem_ctx, exec_list *instructions,
    bool is_at_end = false;
    int n_scopes = 1;
 
+   /* Placeholder to make the reladdr tests pass, will be removed with the next patch. */
+   int narrays = 2;
+   struct array_live_range array_live_ranges[3];
+
    /* Count scopes to allocate the needed space without the need for
     * re-allocation
     */
@@ -1100,7 +1136,7 @@ get_temp_registers_required_live_ranges(void *mem_ctx, exec_list *instructions,
 
    prog_scope_storage scopes(mem_ctx, n_scopes);
 
-   access_recorder access(ntemps);
+   access_recorder access(ntemps, narrays);
 
    prog_scope *cur_scope = scopes.create(nullptr, outer_scope, 0, 0, line);
 
@@ -1226,8 +1262,9 @@ get_temp_registers_required_live_ranges(void *mem_ctx, exec_list *instructions,
          for (unsigned j = 0; j < inst->tex_offset_num_offset; j++) {
             access.record_read(inst->tex_offsets[j], line, cur_scope);
          }
-         for (unsigned j = 0; j < num_inst_dst_regs(inst); j++) {
-            access.record_write(inst->dst[j], line, cur_scope);
+         unsigned ndst = num_inst_dst_regs(inst);
+         for (unsigned j = 0; j < ndst; j++) {
+            access.record_write(inst->dst[j], line, cur_scope, ndst == 1);
          }
       }
       }
@@ -1242,7 +1279,7 @@ get_temp_registers_required_live_ranges(void *mem_ctx, exec_list *instructions,
    if (cur_scope->end() < 0)
       cur_scope->set_end(line - 1);
 
-   access.get_required_live_ranges(register_live_ranges);
+   access.get_required_live_ranges(register_live_ranges, array_live_ranges);
    return true;
 }
 
-- 
2.13.6



More information about the mesa-dev mailing list