pan/midgard: Analyze simple loads/store
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 21 Aug 2019 22:07:36 +0000 (15:07 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 22 Aug 2019 19:51:21 +0000 (12:51 -0700)
For shaders using exclusively direct attribute/varyings, we can work
this out statically. For shaders with indirect access, we just set an
upper bound of 16 (the max attributes/varyings we support) and the
actual count will be reported regardless.

We proceed similarly for textures/samplers, as well as for UBOs. While
UBOs can be *indexed* indirectly, the *UBO itself* -- which is what we
count in the shader descriptor (rather than the UBO descriptors) -- is
statically determinable.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/panfrost/midgard/disassemble.c

index 1880ae8352cb88e6b99749952fb60d3ac2d04980..c4bdacdef6854a5f6bafe984ff32b79958de56a5 100644 (file)
@@ -1028,6 +1028,20 @@ is_op_varying(unsigned op)
         return false;
 }
 
+static bool
+is_op_attribute(unsigned op)
+{
+        switch (op) {
+        case midgard_op_ld_attr_16:
+        case midgard_op_ld_attr_32:
+        case midgard_op_ld_attr_32i:
+        case midgard_op_ld_attr_32u:
+                return true;
+        }
+
+        return false;
+}
+
 static void
 print_load_store_arg(uint8_t arg, unsigned index)
 {
@@ -1059,6 +1073,13 @@ print_load_store_arg(uint8_t arg, unsigned index)
         }
 }
 
+static void
+update_stats(signed *stat, unsigned address)
+{
+        if (*stat >= 0)
+                *stat = MAX2(*stat, address + 1);
+}
+
 static void
 print_load_store_instr(uint64_t data,
                        unsigned tabs)
@@ -1067,14 +1088,27 @@ print_load_store_instr(uint64_t data,
 
         print_ld_st_opcode(word->op);
 
-        if (is_op_varying(word->op))
+        unsigned address = word->address;
+
+        if (is_op_varying(word->op)) {
                 print_varying_parameters(word);
 
+                /* Do some analysis: check if direct cacess */
+
+                if ((word->arg_2 == 0x1E) && midg_stats.varying_count >= 0)
+                        update_stats(&midg_stats.varying_count, address);
+                else
+                        midg_stats.varying_count = -16;
+        } else if (is_op_attribute(word->op)) {
+                if ((word->arg_2 == 0x1E) && midg_stats.attribute_count >= 0)
+                        update_stats(&midg_stats.attribute_count, address);
+                else
+                        midg_stats.attribute_count = -16;
+        }
+
         printf(" r%d", word->reg);
         print_mask_4(word->mask);
 
-        unsigned address = word->address;
-
         if (!OP_IS_STORE(word->op))
                 update_dest(word->reg);
 
@@ -1096,9 +1130,10 @@ print_load_store_instr(uint64_t data,
 
         printf(", ");
 
-        if (is_ubo)
+        if (is_ubo) {
                 printf("ubo%d", word->arg_1);
-        else
+                update_stats(&midg_stats.uniform_buffer_count, word->arg_1);
+        } else
                 print_load_store_arg(word->arg_1, 0);
 
         printf(", ");
@@ -1272,12 +1307,19 @@ print_texture_word(uint32_t *word, unsigned tabs)
         print_mask_4(texture->mask);
         printf(", ");
 
+        /* Depending on whether we read from textures directly or indirectly,
+         * we may be able to update our analysis */
+
         if (texture->texture_register) {
                 printf("texture[");
                 print_texture_reg_select(texture->texture_handle);
                 printf("], ");
+
+                /* Indirect, tut tut */
+                midg_stats.texture_count = -16;
         } else {
                 printf("texture%d, ", texture->texture_handle);
+                update_stats(&midg_stats.texture_count, texture->texture_handle);
         }
 
         /* Print the type, GL style */
@@ -1287,8 +1329,11 @@ print_texture_word(uint32_t *word, unsigned tabs)
                 printf("[");
                 print_texture_reg_select(texture->sampler_handle);
                 printf("]");
+
+                midg_stats.sampler_count = -16;
         } else {
                 printf("%d", texture->sampler_handle);
+                update_stats(&midg_stats.sampler_count, texture->sampler_handle);
         }
 
         print_swizzle_vec4(texture->swizzle, false, false);