summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2018-05-02 09:43:27 -0700
committerKenneth Graunke <[email protected]>2018-05-02 10:09:28 -0700
commit169d8e011aef79192f056ba8bc0a001cbea938c4 (patch)
tree75a39360dce8058a45b185d2f8707457b6ab5319 /src
parentcf1d58787909757bb2d137fd8a53ef00e2cd6578 (diff)
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/intel/common/gen_batch_decoder.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/src/intel/common/gen_batch_decoder.c b/src/intel/common/gen_batch_decoder.c
index dd78e07827e..c059b194974 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);
+ }
}
}