static void annotation_add_state(struct annotations_context *ctx, uint32_t state_type, uint32_t start_offset, size_t size) { assert(ctx->index < MAX_ANNOTATIONS); add_annotation(&ctx->annotations[ctx->index++], AUB_TRACE_TYPE_NOTYPE, 0, start_offset); add_annotation(&ctx->annotations[ctx->index++], AUB_TRACE_TYPE(state_type), AUB_TRACE_SUBTYPE(state_type), start_offset + size); }
/** * Generate a set of aub file annotations for the current batch buffer, and * deliver them to DRM. * * The "used" section of the batch buffer (the portion containing batch * commands) is annotated with AUB_TRACE_TYPE_BATCH. The remainder of the * batch buffer (which contains data structures pointed to by batch commands) * is annotated according to the type of each data structure. */ void brw_annotate_aub(struct brw_context *brw) { unsigned annotation_count = 2 * brw->state_batch_count + 1; drm_intel_aub_annotation annotations[annotation_count]; int a = 0; make_annotation(&annotations[a++], AUB_TRACE_TYPE_BATCH, 0, 4*brw->batch.used); for (int i = brw->state_batch_count; i-- > 0; ) { uint32_t type = brw->state_batch_list[i].type; uint32_t start_offset = brw->state_batch_list[i].offset; uint32_t end_offset = start_offset + brw->state_batch_list[i].size; make_annotation(&annotations[a++], AUB_TRACE_TYPE_NOTYPE, 0, start_offset); make_annotation(&annotations[a++], AUB_TRACE_TYPE(type), AUB_TRACE_SUBTYPE(type), end_offset); } assert(a == annotation_count); drm_intel_bufmgr_gem_set_aub_annotations(brw->batch.bo, annotations, annotation_count); }