[Mesa-dev] [PATCH 1/5] intel: decoder: make the field iterator use more natural
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Tue May 1 23:43:02 UTC 2018
while (iter_next()) { ... }
instead of
do { ... } while (iter_next());
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
src/intel/common/gen_decoder.c | 26 +++++++++++--------
src/intel/tools/gen_batch_decoder.c | 40 ++++++++++++++---------------
2 files changed, 36 insertions(+), 30 deletions(-)
diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c
index 1b8123bf394..7c462a0be4e 100644
--- a/src/intel/common/gen_decoder.c
+++ b/src/intel/common/gen_decoder.c
@@ -981,25 +981,31 @@ gen_field_iterator_init(struct gen_field_iterator *iter,
memset(iter, 0, sizeof(*iter));
iter->group = group;
- if (group->fields)
- iter->field = group->fields;
- else
- iter->field = group->next->fields;
iter->p = p;
iter->p_bit = p_bit;
int length = gen_group_get_length(iter->group, iter->p);
iter->p_end = length > 0 ? &p[length] : NULL;
iter->print_colors = print_colors;
-
- bool result = iter_decode_field(iter);
- if (length >= 0)
- assert(result);
}
bool
gen_field_iterator_next(struct gen_field_iterator *iter)
{
+ /* Initial condition */
+ if (!iter->field) {
+ if (iter->group->fields)
+ iter->field = iter->group->fields;
+ else
+ iter->field = iter->group->next->fields;
+
+ bool result = iter_decode_field(iter);
+ if (iter->p_end)
+ assert(result);
+
+ return true;
+ }
+
if (!iter_advance_field(iter))
return false;
@@ -1040,7 +1046,7 @@ gen_print_group(FILE *outfile, struct gen_group *group, uint64_t offset,
int last_dword = -1;
gen_field_iterator_init(&iter, group, p, p_bit, color);
- do {
+ while (gen_field_iterator_next(&iter)) {
int iter_dword = iter.end_bit / 32;
if (last_dword != iter_dword) {
for (int i = last_dword + 1; i <= iter_dword; i++)
@@ -1055,5 +1061,5 @@ gen_print_group(FILE *outfile, struct gen_group *group, uint64_t offset,
&p[iter_dword], iter.start_bit % 32, color);
}
}
- } while (gen_field_iterator_next(&iter));
+ }
}
diff --git a/src/intel/tools/gen_batch_decoder.c b/src/intel/tools/gen_batch_decoder.c
index c6b908758b2..e8d0e11682f 100644
--- a/src/intel/tools/gen_batch_decoder.c
+++ b/src/intel/tools/gen_batch_decoder.c
@@ -175,7 +175,7 @@ handle_state_base_address(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
struct gen_field_iterator iter;
gen_field_iterator_init(&iter, inst, p, 0, false);
- do {
+ while (gen_field_iterator_next(&iter)) {
if (strcmp(iter.name, "Surface State Base Address") == 0) {
ctx->surface_base = ctx_get_bo(ctx, iter.raw_value);
} else if (strcmp(iter.name, "Dynamic State Base Address") == 0) {
@@ -183,7 +183,7 @@ handle_state_base_address(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
} else if (strcmp(iter.name, "Instruction Base Address") == 0) {
ctx->instruction_base = ctx_get_bo(ctx, iter.raw_value);
}
- } while (gen_field_iterator_next(&iter));
+ }
}
static void
@@ -272,14 +272,14 @@ handle_media_interface_descriptor_load(struct gen_batch_decode_ctx *ctx,
gen_field_iterator_init(&iter, inst, p, 0, false);
uint32_t descriptor_offset = 0;
int descriptor_count = 0;
- do {
+ while (gen_field_iterator_next(&iter)) {
if (strcmp(iter.name, "Interface Descriptor Data Start Address") == 0) {
descriptor_offset = strtol(iter.value, NULL, 16);
} else if (strcmp(iter.name, "Interface Descriptor Total Length") == 0) {
descriptor_count =
strtol(iter.value, NULL, 16) / (desc->dw_length * 4);
}
- } while (gen_field_iterator_next(&iter));
+ }
uint64_t desc_addr = ctx->dynamic_base.addr + descriptor_offset;
const uint32_t *desc_map = ctx->dynamic_base.map + descriptor_offset;
@@ -292,7 +292,7 @@ handle_media_interface_descriptor_load(struct gen_batch_decode_ctx *ctx,
uint64_t ksp;
uint32_t sampler_offset, sampler_count;
uint32_t binding_table_offset, binding_entry_count;
- do {
+ while (gen_field_iterator_next(&iter)) {
if (strcmp(iter.name, "Kernel Start Pointer") == 0) {
ksp = strtoll(iter.value, NULL, 16);
} else if (strcmp(iter.name, "Sampler State Pointer") == 0) {
@@ -304,7 +304,7 @@ handle_media_interface_descriptor_load(struct gen_batch_decode_ctx *ctx,
} else if (strcmp(iter.name, "Binding Table Entry Count") == 0) {
binding_entry_count = strtol(iter.value, NULL, 10);
}
- } while (gen_field_iterator_next(&iter));
+ }
ctx_disassemble_program(ctx, ksp, "compute shader");
printf("\n");
@@ -331,7 +331,7 @@ handle_3dstate_vertex_buffers(struct gen_batch_decode_ctx *ctx,
struct gen_field_iterator iter;
gen_field_iterator_init(&iter, inst, p, 0, false);
- do {
+ while (gen_field_iterator_next(&iter)) {
if (strcmp(iter.name, "Vertex Buffer Index") == 0) {
index = iter.raw_value;
} else if (strcmp(iter.name, "Buffer Pitch") == 0) {
@@ -369,7 +369,7 @@ handle_3dstate_vertex_buffers(struct gen_batch_decode_ctx *ctx,
index = -1;
pitch = -1;
ready = false;
- } while (gen_field_iterator_next(&iter));
+ }
}
static void
@@ -384,7 +384,7 @@ handle_3dstate_index_buffer(struct gen_batch_decode_ctx *ctx,
struct gen_field_iterator iter;
gen_field_iterator_init(&iter, inst, p, 0, false);
- do {
+ while (gen_field_iterator_next(&iter)) {
if (strcmp(iter.name, "Index Format") == 0) {
format = iter.raw_value;
} else if (strcmp(iter.name, "Buffer Starting Address") == 0) {
@@ -392,7 +392,7 @@ handle_3dstate_index_buffer(struct gen_batch_decode_ctx *ctx,
} else if (strcmp(iter.name, "Buffer Size") == 0) {
ib_size = iter.raw_value;
}
- } while (gen_field_iterator_next(&iter));
+ }
if (ib.map == NULL) {
fprintf(ctx->fp, " buffer contents unavailable\n");
@@ -434,7 +434,7 @@ decode_single_ksp(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
struct gen_field_iterator iter;
gen_field_iterator_init(&iter, inst, p, 0, false);
- do {
+ while (gen_field_iterator_next(&iter)) {
if (strcmp(iter.name, "Kernel Start Pointer") == 0) {
ksp = iter.raw_value;
} else if (strcmp(iter.name, "SIMD8 Dispatch Enable") == 0) {
@@ -446,7 +446,7 @@ decode_single_ksp(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
} else if (strcmp(iter.name, "Enable") == 0) {
is_enabled = iter.raw_value;
}
- } while (gen_field_iterator_next(&iter));
+ }
const char *type =
strcmp(inst->name, "VS_STATE") == 0 ? "vertex shader" :
@@ -475,7 +475,7 @@ decode_ps_kernels(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
struct gen_field_iterator iter;
gen_field_iterator_init(&iter, inst, p, 0, false);
- do {
+ while (gen_field_iterator_next(&iter)) {
if (strncmp(iter.name, "Kernel Start Pointer ",
strlen("Kernel Start Pointer ")) == 0) {
int idx = iter.name[strlen("Kernel Start Pointer ")] - '0';
@@ -487,7 +487,7 @@ decode_ps_kernels(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
} else if (strcmp(iter.name, "32 Pixel Dispatch Enable") == 0) {
enabled[2] = strcmp(iter.value, "true") == 0;
}
- } while (gen_field_iterator_next(&iter));
+ }
/* Reorder KSPs to be [8, 16, 32] instead of the hardware order. */
if (enabled[0] + enabled[1] + enabled[2] == 1) {
@@ -526,13 +526,13 @@ decode_3dstate_constant(struct gen_batch_decode_ctx *ctx, const uint32_t *p)
struct gen_field_iterator iter;
gen_field_iterator_init(&iter, inst, p, 0, false);
- do {
+ 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);
}
- } while (gen_field_iterator_next(&iter));
+ }
for (int i = 0; i < 4; i++) {
if (read_length[i] == 0 || buffer[i].map == NULL)
@@ -595,12 +595,12 @@ decode_dynamic_state_pointers(struct gen_batch_decode_ctx *ctx,
struct gen_field_iterator iter;
gen_field_iterator_init(&iter, inst, p, 0, false);
- do {
+ while (gen_field_iterator_next(&iter)) {
if (str_ends_with(iter.name, "Pointer")) {
state_offset = iter.raw_value;
break;
}
- } while (gen_field_iterator_next(&iter));
+ }
uint32_t state_addr = ctx->dynamic_base.addr + state_offset;
const uint32_t *state_map = ctx->dynamic_base.map + state_offset;
@@ -788,13 +788,13 @@ gen_print_batch(struct gen_batch_decode_ctx *ctx,
bool second_level;
struct gen_field_iterator iter;
gen_field_iterator_init(&iter, inst, p, 0, false);
- do {
+ while (gen_field_iterator_next(&iter)) {
if (strcmp(iter.name, "Batch Buffer Start Address") == 0) {
next_batch = ctx_get_bo(ctx, iter.raw_value);
} else if (strcmp(iter.name, "Second Level Batch Buffer") == 0) {
second_level = iter.raw_value;
}
- } while (gen_field_iterator_next(&iter));
+ }
if (next_batch.map == NULL) {
fprintf(ctx->fp, "Secondary batch at 0x%08"PRIx64" unavailable",
--
2.17.0
More information about the mesa-dev
mailing list