summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Antognolli <rafael.antognolli@intel.com>2018-03-14 15:57:54 -0700
committerRafael Antognolli <rafael.antognolli@intel.com>2018-03-15 11:37:03 -0700
commitcae6a0616d4374d0d4f960817036e4dcc23a15e1 (patch)
tree421874bea28877d495a211da5740fc6c7580ee79
parent5cd923c6e621ed0aa4aacb5d5dbe644b3c0cc052 (diff)
i965/gen9: Enable object level preemption.cnl/preemption_atom
Gen9 hardware requires some workarounds to disable preemption depending on the type of primitive being emitted. We implement this by adding a new atom that tracks BRW_NEW_PRIMITIVE. Whenever it happens, we check the current type of primitive and enable/disable object preemption. For now, we just ignore blorp. The only primitive it emits is 3DPRIM_RECTLIST, and since it's not listed in the workarounds, we can safely leave preemption enabled when it happens. Or it will be disabled by a previous 3DPRIMITIVE, which should be fine too. Signed-off-by: Rafael Antognolli <rafael.antognolli@intel.com>
-rw-r--r--src/mesa/drivers/dri/i965/genX_state_upload.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c
index a69a496f1d..3938ef986d 100644
--- a/src/mesa/drivers/dri/i965/genX_state_upload.c
+++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
@@ -5405,6 +5405,50 @@ static const struct brw_tracked_state genX(blend_constant_color) = {
/* ---------------------------------------------------------------------- */
+#if GEN_GEN == 9
+
+/**
+ * Implement workarounds for preemption:
+ * - WaDisableMidObjectPreemptionForGSLineStripAdj
+ * - WaDisableMidObjectPreemptionForTrifanOrPolygon
+ */
+static void
+gen9_emit_preempt_wa(struct brw_context *brw)
+{
+ /* WaDisableMidObjectPreemptionForGSLineStripAdj
+ *
+ * WA: Disable mid-draw preemption when draw-call is a linestrip_adj and
+ * GS is enabled.
+ */
+ bool object_preemption =
+ !(brw->primitive == _3DPRIM_LINESTRIP_ADJ && brw->gs.enabled);
+
+ /* WaDisableMidObjectPreemptionForTrifanOrPolygon
+ *
+ * TriFan miscompare in Execlist Preemption test. Cut index that is on a
+ * previous context. End the previous, the resume another context with a
+ * tri-fan or polygon, and the vertex count is corrupted. If we prempt
+ * again we will cause corruption.
+ *
+ * WA: Disable mid-draw preemption when draw-call has a tri-fan.
+ */
+ object_preemption =
+ object_preemption && !(brw->primitive == _3DPRIM_TRIFAN);
+
+ brw_enable_obj_preemption(brw, object_preemption);
+}
+
+static const struct brw_tracked_state gen9_preempt_wa = {
+ .dirty = {
+ .mesa = 0,
+ .brw = BRW_NEW_PRIMITIVE | BRW_NEW_GEOMETRY_PROGRAM,
+ },
+ .emit = gen9_emit_preempt_wa,
+};
+#endif
+
+/* ---------------------------------------------------------------------- */
+
void
genX(init_atoms)(struct brw_context *brw)
{
@@ -5709,6 +5753,9 @@ genX(init_atoms)(struct brw_context *brw)
&genX(cut_index),
&gen8_pma_fix,
+#if GEN_GEN == 9
+ &gen9_preempt_wa,
+#endif
};
#endif