<html>
<head>
<base href="https://bugs.freedesktop.org/" />
</head>
<body>
<p>
<div>
<b><a class="bz_bug_link
bz_status_NEEDINFO "
title="NEEDINFO --- - [bisected ivb] Small black box corruption in firefox"
href="https://bugs.freedesktop.org/show_bug.cgi?id=68410#c48">Comment # 48</a>
on <a class="bz_bug_link
bz_status_NEEDINFO "
title="NEEDINFO --- - [bisected ivb] Small black box corruption in firefox"
href="https://bugs.freedesktop.org/show_bug.cgi?id=68410">bug 68410</a>
from <span class="vcard"><a class="email" href="mailto:chris@chris-wilson.co.uk" title="Chris Wilson <chris@chris-wilson.co.uk>"> <span class="fn">Chris Wilson</span></a>
</span></b>
<pre>Different arrangement to put the flush/stall/invalidate first before changing
the pipeline:
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 4b60f53..9c52e38 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1097,36 +1097,48 @@ gen7_emit_state(struct sna *sna,
const struct sna_composite_op *op,
uint16_t wm_binding_table)
{
+ bool need_invalidate;
+ bool need_flush;
bool need_stall;
assert(op->dst.bo->exec);
- gen7_emit_cc(sna, GEN7_BLEND(op->u.gen7.flags));
- gen7_emit_sampler(sna, GEN7_SAMPLER(op->u.gen7.flags));
- gen7_emit_sf(sna, GEN7_VERTEX(op->u.gen7.flags) >> 2);
- gen7_emit_wm(sna, GEN7_KERNEL(op->u.gen7.flags));
- gen7_emit_vertex_elements(sna, op);
+ need_invalidate = kgem_bo_is_dirty(op->src.bo) ||
kgem_bo_is_dirty(op->mask.bo);
+ if (ALWAYS_INVALIDATE)
+ need_invalidate = true;
+
+ need_flush = sna->render_state.gen7.emit_flush;
+ if (ALWAYS_FLUSH)
+ need_flush = true;
- need_stall = gen7_emit_binding_table(sna, wm_binding_table);
+ need_stall = sna->render_state.gen7.surface_table != wm_binding_table;
need_stall &= gen7_emit_drawing_rectangle(sna, op);
if (ALWAYS_STALL)
need_stall = true;
- if (ALWAYS_INVALIDATE || kgem_bo_is_dirty(op->src.bo) ||
kgem_bo_is_dirty(op->mask.bo)) {
+ if (need_invalidate) {
gen7_emit_pipe_invalidate(sna);
kgem_clear_dirty(&sna->kgem);
assert(op->dst.bo->exec);
kgem_bo_mark_dirty(op->dst.bo);
- sna->render_state.gen7.emit_flush = false;
+
+ need_flush = false;
need_stall = false;
}
- if (ALWAYS_FLUSH || (sna->render_state.gen7.emit_flush &&
GEN7_READS_DST(op->u.gen7.flags))) {
+ if (need_flush) {
gen7_emit_pipe_flush(sna, need_stall);
need_stall = false;
}
if (need_stall)
gen7_emit_pipe_stall(sna);
+ gen7_emit_cc(sna, GEN7_BLEND(op->u.gen7.flags));
+ gen7_emit_sampler(sna, GEN7_SAMPLER(op->u.gen7.flags));
+ gen7_emit_sf(sna, GEN7_VERTEX(op->u.gen7.flags) >> 2);
+ gen7_emit_wm(sna, GEN7_KERNEL(op->u.gen7.flags));
+ gen7_emit_vertex_elements(sna, op);
+ gen7_emit_binding_table(sna, wm_binding_table);
+
sna->render_state.gen7.emit_flush = GEN7_READS_DST(op->u.gen7.flags);
}</pre>
</div>
</p>
<hr>
<span>You are receiving this mail because:</span>
<ul>
<li>You are the QA Contact for the bug.</li>
<li>You are the assignee for the bug.</li>
</ul>
</body>
</html>