iris: disable preemption for 3DPRIMITIVE during streamout
This is required by Wa_16013994831. Cc: mesa-stable Signed-off-by: Tapani Pälli <tapani.palli@intel.com> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19947>
This commit is contained in:
@@ -1336,10 +1336,8 @@ struct iris_genx_state {
|
||||
bool pma_fix_enabled;
|
||||
#endif
|
||||
|
||||
#if GFX_VER == 9
|
||||
/* Is object level preemption enabled? */
|
||||
bool object_preemption;
|
||||
#endif
|
||||
|
||||
#if GFX_VERx10 == 120
|
||||
enum iris_depth_reg_mode depth_reg_mode;
|
||||
@@ -5920,6 +5918,27 @@ genX(emit_depth_state_workarounds)(struct iris_context *ice,
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
iris_preemption_streamout_wa(struct iris_context *ice,
|
||||
struct iris_batch *batch,
|
||||
bool enable)
|
||||
{
|
||||
#if GFX_VERx10 >= 120
|
||||
iris_emit_reg(batch, GENX(CS_CHICKEN1), reg) {
|
||||
reg.DisablePreemptionandHighPriorityPausingdueto3DPRIMITIVECommand = !enable;
|
||||
reg.DisablePreemptionandHighPriorityPausingdueto3DPRIMITIVECommandMask = true;
|
||||
}
|
||||
|
||||
/* Emit CS_STALL and 250 noops. */
|
||||
iris_emit_pipe_control_flush(batch, "workaround: Wa_16013994831",
|
||||
PIPE_CONTROL_CS_STALL);
|
||||
for (unsigned i = 0; i < 250; i++)
|
||||
iris_emit_cmd(batch, GENX(MI_NOOP), noop);
|
||||
|
||||
ice->state.genx->object_preemption = enable;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
iris_upload_dirty_render_state(struct iris_context *ice,
|
||||
struct iris_batch *batch,
|
||||
@@ -6423,6 +6442,14 @@ iris_upload_dirty_render_state(struct iris_context *ice,
|
||||
if (dirty & IRIS_DIRTY_STREAMOUT) {
|
||||
const struct iris_rasterizer_state *cso_rast = ice->state.cso_rast;
|
||||
|
||||
#if GFX_VERx10 >= 120
|
||||
/* Wa_16013994831 - Disable preemption. */
|
||||
if (batch->screen->devinfo->verx10 == 120 ||
|
||||
intel_device_info_is_dg2(batch->screen->devinfo)) {
|
||||
iris_preemption_streamout_wa(ice, batch, false);
|
||||
}
|
||||
#endif
|
||||
|
||||
uint32_t dynamic_sol[GENX(3DSTATE_STREAMOUT_length)];
|
||||
iris_pack_command(GENX(3DSTATE_STREAMOUT), dynamic_sol, sol) {
|
||||
sol.SOFunctionEnable = true;
|
||||
@@ -6440,6 +6467,13 @@ iris_upload_dirty_render_state(struct iris_context *ice,
|
||||
}
|
||||
} else {
|
||||
if (dirty & IRIS_DIRTY_STREAMOUT) {
|
||||
|
||||
#if GFX_VERx10 >= 120
|
||||
/* Wa_16013994831 - Enable preemption. */
|
||||
if (!ice->state.genx->object_preemption)
|
||||
iris_preemption_streamout_wa(ice, batch, true);
|
||||
#endif
|
||||
|
||||
iris_emit_cmd(batch, GENX(3DSTATE_STREAMOUT), sol);
|
||||
}
|
||||
}
|
||||
@@ -8681,6 +8715,10 @@ genX(init_state)(struct iris_context *ice)
|
||||
ice->state.genx = calloc(1, sizeof(struct iris_genx_state));
|
||||
ice->draw.derived_params.drawid = -1;
|
||||
|
||||
#if GFX_VERx10 >= 120
|
||||
ice->state.genx->object_preemption = true;
|
||||
#endif
|
||||
|
||||
/* Make a 1x1x1 null surface for unbound textures */
|
||||
void *null_surf_map =
|
||||
upload_state(ice->state.surface_uploader, &ice->state.unbound_tex,
|
||||
|
Reference in New Issue
Block a user