i965/gen9: Add workarounds for object preemption.

Gen9 hardware requires some workarounds to disable preemption depending
on the type of primitive being emitted.

We implement this by adding a function that checks the primitive type
and number of instances right before the 3DPRIMITIVE.

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.

v3:
 - Apply missing workarounds for instanced rendering and line loop (Ken)
 - Move workaround code to brw_draw_single_prim()

Signed-off-by: Rafael Antognolli <rafael.antognolli@intel.com>
Cc: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Rafael Antognolli 2018-10-29 10:19:54 -07:00
parent d8b50e152a
commit 5c454661c6
1 changed files with 63 additions and 0 deletions

View File

@ -872,6 +872,66 @@ brw_finish_drawing(struct gl_context *ctx)
}
}
/**
* Implement workarounds for preemption:
* - WaDisableMidObjectPreemptionForGSLineStripAdj
* - WaDisableMidObjectPreemptionForTrifanOrPolygon
* - WaDisableMidObjectPreemptionForLineLoop
* - WA#0798
*/
static void
gen9_emit_preempt_wa(struct brw_context *brw,
const struct _mesa_prim *prim)
{
bool object_preemption = true;
const struct gen_device_info *devinfo = &brw->screen->devinfo;
/* Only apply these workarounds for gen9 */
assert(devinfo->gen == 9);
/* WaDisableMidObjectPreemptionForGSLineStripAdj
*
* WA: Disable mid-draw preemption when draw-call is a linestrip_adj and
* GS is enabled.
*/
if (brw->primitive == _3DPRIM_LINESTRIP_ADJ && brw->gs.enabled)
object_preemption = false;
/* 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.
*/
if (brw->primitive == _3DPRIM_TRIFAN)
object_preemption = false;
/* WaDisableMidObjectPreemptionForLineLoop
*
* VF Stats Counters Missing a vertex when preemption enabled.
*
* WA: Disable mid-draw preemption when the draw uses a lineloop
* topology.
*/
if (brw->primitive == _3DPRIM_LINELOOP)
object_preemption = false;
/* WA#0798
*
* VF is corrupting GAFS data when preempted on an instance boundary and
* replayed with instancing enabled.
*
* WA: Disable preemption when using instanceing.
*/
if (prim->num_instances > 1)
object_preemption = false;
brw_enable_obj_preemption(brw, object_preemption);
}
/* May fail if out of video memory for texture or vbo upload, or on
* fallback conditions.
*/
@ -987,6 +1047,9 @@ retry:
brw_upload_render_state(brw);
}
if (devinfo->gen == 9)
gen9_emit_preempt_wa(brw, prim);
brw_emit_prim(brw, prim, brw->primitive, xfb_obj, stream);
brw->batch.no_wrap = false;