summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/brw_eu.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_eu.c')
-rw-r--r--src/mesa/drivers/dri/i965/brw_eu.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_eu.c b/src/mesa/drivers/dri/i965/brw_eu.c
index 20a8ec4..02a07ec 100644
--- a/src/mesa/drivers/dri/i965/brw_eu.c
+++ b/src/mesa/drivers/dri/i965/brw_eu.c
@@ -214,6 +214,11 @@ const GLuint *brw_get_program( struct brw_compile *p,
{
GLuint i;
+ brw_compact_instructions(p);
+
+ /* We emit a cacheline (8 instructions) of NOPs at the end of the program to
+ * make sure that instruction prefetch doesn't wander off into some other BO.
+ */
for (i = 0; i < 8; i++)
brw_NOP(p);
@@ -224,19 +229,36 @@ const GLuint *brw_get_program( struct brw_compile *p,
void
brw_dump_compile(struct brw_compile *p, FILE *out, int start, int end)
{
+ struct brw_context *brw = p->brw;
+ struct intel_context *intel = &brw->intel;
void *store = p->store;
+ bool dump_hex = false;
- for (int offset = start; offset < end; offset += 16) {
+ for (int offset = start; offset < end;) {
struct brw_instruction *insn = store + offset;
-
+ struct brw_instruction uncompacted;
printf("0x%08x: ", offset);
- if (0) {
- printf("0x%08x 0x%08x 0x%08x 0x%08x ",
- ((uint32_t *)insn)[3],
- ((uint32_t *)insn)[2],
- ((uint32_t *)insn)[1],
- ((uint32_t *)insn)[0]);
+ if (insn->header.cmpt_control) {
+ struct brw_compact_instruction *compacted = (void *)insn;
+ if (dump_hex) {
+ printf("0x%08x 0x%08x ",
+ ((uint32_t *)insn)[1],
+ ((uint32_t *)insn)[0]);
+ }
+
+ brw_uncompact_instruction(intel, &uncompacted, compacted);
+ insn = &uncompacted;
+ offset += 8;
+ } else {
+ if (dump_hex) {
+ printf("0x%08x 0x%08x 0x%08x 0x%08x ",
+ ((uint32_t *)insn)[3],
+ ((uint32_t *)insn)[2],
+ ((uint32_t *)insn)[1],
+ ((uint32_t *)insn)[0]);
+ }
+ offset += 16;
}
brw_disasm(stdout, insn, p->brw->intel.gen);