+ switch (gen_group_get_opcode(inst) >> 16) {
+ case _3DSTATE_PIPELINED_POINTERS:
+ /* Note: these Gen4-5 pointers are full relocations rather than
+ * offsets from the start of the batch. So we need to subtract
+ * gtt_offset (the start of the batch) to obtain an offset we
+ * can add to the map and get at the data.
+ */
+ decode_struct(brw, spec, "VS_STATE", data, gtt_offset,
+ (p[1] & ~0x1fu) - gtt_offset, color);
+ if (p[2] & 1) {
+ decode_struct(brw, spec, "GS_STATE", data, gtt_offset,
+ (p[2] & ~0x1fu) - gtt_offset, color);
+ }
+ if (p[3] & 1) {
+ decode_struct(brw, spec, "CLIP_STATE", data, gtt_offset,
+ (p[3] & ~0x1fu) - gtt_offset, color);
+ }
+ decode_struct(brw, spec, "SF_STATE", data, gtt_offset,
+ (p[4] & ~0x1fu) - gtt_offset, color);
+ decode_struct(brw, spec, "WM_STATE", data, gtt_offset,
+ (p[5] & ~0x1fu) - gtt_offset, color);
+ decode_struct(brw, spec, "COLOR_CALC_STATE", data, gtt_offset,
+ (p[6] & ~0x3fu) - gtt_offset, color);
+ break;
+ case _3DSTATE_BINDING_TABLE_POINTERS_VS:
+ case _3DSTATE_BINDING_TABLE_POINTERS_HS:
+ case _3DSTATE_BINDING_TABLE_POINTERS_DS:
+ case _3DSTATE_BINDING_TABLE_POINTERS_GS:
+ case _3DSTATE_BINDING_TABLE_POINTERS_PS: {
+ struct gen_group *group =
+ gen_spec_find_struct(spec, "RENDER_SURFACE_STATE");
+ if (!group)
+ break;
+
+ uint32_t bt_offset = p[1] & ~0x1fu;
+ int bt_entries = brw_state_batch_size(brw, bt_offset) / 4;
+ uint32_t *bt_pointers = &data[bt_offset / 4];
+ for (int i = 0; i < bt_entries; i++) {
+ fprintf(stderr, "SURFACE_STATE - BTI = %d\n", i);
+ gen_print_group(stderr, group, gtt_offset + bt_pointers[i],
+ &data[bt_pointers[i] / 4], color);
+ }
+ break;
+ }
+ case _3DSTATE_SAMPLER_STATE_POINTERS_VS:
+ case _3DSTATE_SAMPLER_STATE_POINTERS_HS:
+ case _3DSTATE_SAMPLER_STATE_POINTERS_DS:
+ case _3DSTATE_SAMPLER_STATE_POINTERS_GS:
+ case _3DSTATE_SAMPLER_STATE_POINTERS_PS:
+ decode_structs(brw, spec, "SAMPLER_STATE", data,
+ gtt_offset, p[1] & ~0x1fu, 4 * 4, color);
+ break;
+ case _3DSTATE_VIEWPORT_STATE_POINTERS:
+ decode_structs(brw, spec, "CLIP_VIEWPORT", data,
+ gtt_offset, p[1] & ~0x3fu, 4 * 4, color);
+ decode_structs(brw, spec, "SF_VIEWPORT", data,
+ gtt_offset, p[1] & ~0x3fu, 8 * 4, color);
+ decode_structs(brw, spec, "CC_VIEWPORT", data,
+ gtt_offset, p[3] & ~0x3fu, 2 * 4, color);
+ break;
+ case _3DSTATE_VIEWPORT_STATE_POINTERS_CC:
+ decode_structs(brw, spec, "CC_VIEWPORT", data,
+ gtt_offset, p[1] & ~0x3fu, 2 * 4, color);
+ break;
+ case _3DSTATE_VIEWPORT_STATE_POINTERS_SF_CL:
+ decode_structs(brw, spec, "SF_CLIP_VIEWPORT", data,
+ gtt_offset, p[1] & ~0x3fu, 16 * 4, color);
+ break;
+ case _3DSTATE_SCISSOR_STATE_POINTERS:
+ decode_structs(brw, spec, "SCISSOR_RECT", data,
+ gtt_offset, p[1] & ~0x1fu, 2 * 4, color);
+ break;
+ case _3DSTATE_BLEND_STATE_POINTERS:
+ /* TODO: handle Gen8+ extra dword at the beginning */
+ decode_structs(brw, spec, "BLEND_STATE", data,
+ gtt_offset, p[1] & ~0x3fu, 8 * 4, color);
+ break;
+ case _3DSTATE_CC_STATE_POINTERS:
+ if (brw->gen >= 7) {
+ decode_struct(brw, spec, "COLOR_CALC_STATE", data,
+ gtt_offset, p[1] & ~0x3fu, color);
+ } else if (brw->gen == 6) {
+ decode_structs(brw, spec, "BLEND_STATE", data,
+ gtt_offset, p[1] & ~0x3fu, 2 * 4, color);
+ decode_struct(brw, spec, "DEPTH_STENCIL_STATE", data,
+ gtt_offset, p[2] & ~0x3fu, color);
+ decode_struct(brw, spec, "COLOR_CALC_STATE", data,
+ gtt_offset, p[3] & ~0x3fu, color);
+ }
+ break;
+ case _3DSTATE_DEPTH_STENCIL_STATE_POINTERS:
+ decode_struct(brw, spec, "DEPTH_STENCIL_STATE", data,
+ gtt_offset, p[1] & ~0x3fu, color);
+ break;
+ }