intel: Give the batch decoder a callback to ask about state size.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 2 May 2018 04:49:17 +0000 (21:49 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 2 May 2018 16:27:56 +0000 (09:27 -0700)
Given an arbitrary batch, we don't always know what the size of certain
things are, such as how many entries are in a binding table.  But it's
easy for the driver to track that information, so with a simple callback
we can calculate this correctly for INTEL_DEBUG=bat.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/common/gen_batch_decoder.c
src/intel/common/gen_decoder.h
src/intel/tools/aubinator.c
src/intel/tools/aubinator_error_decode.c

index a0d6dbd3e589a9666d9bf49b234d71231267e2d0..dd78e07827e424fd1663b467ec0de50b2ba505d3 100644 (file)
@@ -33,11 +33,13 @@ gen_batch_decode_ctx_init(struct gen_batch_decode_ctx *ctx,
                           const char *xml_path,
                           struct gen_batch_decode_bo (*get_bo)(void *,
                                                                uint64_t),
+                          unsigned (*get_state_size)(void *, uint32_t),
                           void *user_data)
 {
    memset(ctx, 0, sizeof(*ctx));
 
    ctx->get_bo = get_bo;
+   ctx->get_state_size = get_state_size;
    ctx->user_data = user_data;
    ctx->fp = fp;
    ctx->flags = flags;
@@ -103,6 +105,24 @@ ctx_get_bo(struct gen_batch_decode_ctx *ctx, uint64_t addr)
    return bo;
 }
 
+static int
+update_count(struct gen_batch_decode_ctx *ctx,
+             uint32_t offset_from_dsba,
+             unsigned element_dwords,
+             unsigned guess)
+{
+   unsigned size = 0;
+
+   if (ctx->get_state_size)
+      size = ctx->get_state_size(ctx->user_data, offset_from_dsba);
+
+   if (size > 0)
+      return size / (sizeof(uint32_t) * element_dwords);
+
+   /* In the absence of any information, just guess arbitrarily. */
+   return guess;
+}
+
 static void
 ctx_disassemble_program(struct gen_batch_decode_ctx *ctx,
                         uint32_t ksp, const char *type)
@@ -196,9 +216,8 @@ dump_binding_table(struct gen_batch_decode_ctx *ctx, uint32_t offset, int count)
       return;
    }
 
-   /* If we don't know the actual count, guess. */
    if (count < 0)
-      count = 8;
+      count = update_count(ctx, offset, 1, 8);
 
    if (ctx->surface_base.map == NULL) {
       fprintf(ctx->fp, "  binding table unavailable\n");
@@ -233,9 +252,8 @@ dump_samplers(struct gen_batch_decode_ctx *ctx, uint32_t offset, int count)
 {
    struct gen_group *strct = gen_spec_find_struct(ctx->spec, "SAMPLER_STATE");
 
-   /* If we don't know the actual count, guess. */
    if (count < 0)
-      count = 4;
+      count = update_count(ctx, offset, strct->dw_length, 4);
 
    if (ctx->dynamic_base.map == NULL) {
       fprintf(ctx->fp, "  samplers unavailable\n");
index 8324ff95696df926e03ab15e0cf12956010e221c..37f6c3ee989bedc74fa8d7de75c5eebe108051e7 100644 (file)
@@ -207,6 +207,8 @@ struct gen_disasm *disasm;
 struct gen_batch_decode_ctx {
    struct gen_batch_decode_bo (*get_bo)(void *user_data,
                                         uint64_t base_address);
+   unsigned (*get_state_size)(void *user_data,
+                              uint32_t offset_from_dynamic_state_base_addr);
    void *user_data;
 
    FILE *fp;
@@ -226,6 +228,8 @@ void gen_batch_decode_ctx_init(struct gen_batch_decode_ctx *ctx,
                                const char *xml_path,
                                struct gen_batch_decode_bo (*get_bo)(void *,
                                                                     uint64_t),
+
+                               unsigned (*get_state_size)(void *, uint32_t),
                                void *user_data);
 void gen_batch_decode_ctx_finish(struct gen_batch_decode_ctx *ctx);
 
index 2a72efa8a2c45276b0be609b7ede99863188012d..ab053c66b3684da9551ce7161f7debc5fc06807e 100644 (file)
@@ -178,7 +178,7 @@ aubinator_init(uint16_t aub_pci_id, const char *app_name)
    batch_flags |= GEN_BATCH_DECODE_FLOATS;
 
    gen_batch_decode_ctx_init(&batch_ctx, &devinfo, outfile, batch_flags,
-                             xml_path, get_gen_batch_bo, NULL);
+                             xml_path, get_gen_batch_bo, NULL, NULL);
 
    char *color = GREEN_HEADER, *reset_color = NORMAL;
    if (option_color == COLOR_NEVER)
index 0234c59371d395a5d37abb10209b6c0540af67d7..2735bd7271478fe4d77403ce5e9044fe146230de 100644 (file)
@@ -595,7 +595,7 @@ read_data_file(FILE *file)
 
    struct gen_batch_decode_ctx batch_ctx;
    gen_batch_decode_ctx_init(&batch_ctx, &devinfo, stdout, batch_flags,
-                             xml_path, get_gen_batch_bo, NULL);
+                             xml_path, get_gen_batch_bo, NULL, NULL);
 
 
    for (int s = 0; s < sect_num; s++) {