Mesa (master): intel: Fix 3DSTATE_CONSTANT buffer decoding.

Kenneth Graunke kwg at kemper.freedesktop.org
Wed May 2 17:12:24 UTC 2018


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

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Wed May  2 09:43:27 2018 -0700

intel: Fix 3DSTATE_CONSTANT buffer decoding.

First, this was iterating over the 3DSTATE_CONSTANT_* instruction
but trying to process fields of the 3DSTATE_CONSTANT_BODY substructure.

Secondly, the fields have been called Buffer[0] and Read Length[0],
for a while now, and we were not handling the subscripts correctly.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>

---

 src/intel/common/gen_batch_decoder.c | 40 ++++++++++++++++++++++--------------
 1 file changed, 25 insertions(+), 15 deletions(-)

diff --git a/src/intel/common/gen_batch_decoder.c b/src/intel/common/gen_batch_decoder.c
index dd78e07827..c059b19497 100644
--- a/src/intel/common/gen_batch_decoder.c
+++ b/src/intel/common/gen_batch_decoder.c
@@ -543,31 +543,41 @@ static void
 decode_3dstate_constant(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
 {
    struct gen_group *inst = gen_spec_find_instruction(ctx->spec, p);
+   struct gen_group *body =
+      gen_spec_find_struct(ctx->spec, "3DSTATE_CONSTANT_BODY");
 
    uint32_t read_length[4];
    struct gen_batch_decode_bo buffer[4];
    memset(buffer, 0, sizeof(buffer));
 
-   int rlidx = 0, bidx = 0;
+   struct gen_field_iterator outer;
+   gen_field_iterator_init(&outer, inst, p, 0, false);
+   while (gen_field_iterator_next(&outer)) {
+      if (outer.struct_desc != body)
+         continue;
 
-   struct gen_field_iterator iter;
-   gen_field_iterator_init(&iter, inst, p, 0, false);
-   while (gen_field_iterator_next(&iter)) {
-      if (strcmp(iter.name, "Read Length") == 0) {
-         read_length[rlidx++] = iter.raw_value;
-      } else if (strcmp(iter.name, "Buffer") == 0) {
-         buffer[bidx++] = ctx_get_bo(ctx, iter.raw_value);
+      struct gen_field_iterator iter;
+      gen_field_iterator_init(&iter, body, &outer.p[outer.start_bit / 32],
+                              0, false);
+
+      while (gen_field_iterator_next(&iter)) {
+         int idx;
+         if (sscanf(iter.name, "Read Length[%d]", &idx) == 1) {
+            read_length[idx] = iter.raw_value;
+         } else if (sscanf(iter.name, "Buffer[%d]", &idx) == 1) {
+            buffer[idx] = ctx_get_bo(ctx, iter.raw_value);
+         }
       }
-   }
 
-   for (int i = 0; i < 4; i++) {
-      if (read_length[i] == 0 || buffer[i].map == NULL)
-         continue;
+      for (int i = 0; i < 4; i++) {
+         if (read_length[i] == 0 || buffer[i].map == NULL)
+            continue;
 
-      unsigned size = read_length[i] * 32;
-      fprintf(ctx->fp, "constant buffer %d, size %u\n", i, size);
+         unsigned size = read_length[i] * 32;
+         fprintf(ctx->fp, "constant buffer %d, size %u\n", i, size);
 
-      ctx_print_buffer(ctx, buffer[i], size, 0);
+         ctx_print_buffer(ctx, buffer[i], size, 0);
+      }
    }
 }
 




More information about the mesa-commit mailing list