X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fgen7_urb.c;h=abc922a86a356a400c77d2922d706467c517ee20;hb=bccf2a25a89622c49dcfa488763c245e6584d568;hp=44ce2c6a58e4584a0cd4b8d0c5fcd0c62d99832f;hpb=97e90113c662b73b0b2d37385df516dbaa937d19;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/gen7_urb.c b/src/mesa/drivers/dri/i965/gen7_urb.c index 44ce2c6a58e..abc922a86a3 100644 --- a/src/mesa/drivers/dri/i965/gen7_urb.c +++ b/src/mesa/drivers/dri/i965/gen7_urb.c @@ -65,10 +65,10 @@ gen7_allocate_push_constants(struct brw_context *brw) const struct gen_device_info *devinfo = &brw->screen->devinfo; /* BRW_NEW_GEOMETRY_PROGRAM */ - bool gs_present = brw->geometry_program; + bool gs_present = brw->programs[MESA_SHADER_GEOMETRY]; /* BRW_NEW_TESS_PROGRAMS */ - bool tess_present = brw->tess_eval_program; + bool tess_present = brw->programs[MESA_SHADER_TESS_EVAL]; unsigned avail_size = 16; unsigned multiplier = @@ -118,6 +118,33 @@ gen7_emit_push_constant_state(struct brw_context *brw, unsigned vs_size, const struct gen_device_info *devinfo = &brw->screen->devinfo; unsigned offset = 0; + /* From the SKL PRM, Workarounds section (#878): + * + * Push constant buffer corruption possible. WA: Insert 2 zero-length + * PushConst_PS before every intended PushConst_PS update, issue a + * NULLPRIM after each of the zero len PC update to make sure CS commits + * them. + * + * This workaround is attempting to solve a pixel shader push constant + * synchronization issue. + * + * There's an unpublished WA that involves re-emitting + * 3DSTATE_PUSH_CONSTANT_ALLOC_PS for every 500-ish 3DSTATE_CONSTANT_PS + * packets. Since our counting methods may not be reliable due to + * context-switching and pre-emption, we instead choose to approximate this + * behavior by re-emitting the packet at the top of the batch. + */ + if (brw->ctx.NewDriverState == BRW_NEW_BATCH) { + /* SKL GT2 and GLK 2x6 have reliably demonstrated this issue thus far. + * We've also seen some intermittent failures from SKL GT4 and BXT in + * the past. + */ + if (!devinfo->is_skylake && + !devinfo->is_broxton && + !devinfo->is_geminilake) + return; + } + BEGIN_BATCH(10); OUT_BATCH(_3DSTATE_PUSH_CONSTANT_ALLOC_VS << 16 | (2 - 2)); OUT_BATCH(vs_size | offset << GEN7_PUSH_CONSTANT_BUFFER_OFFSET_SHIFT); @@ -154,6 +181,7 @@ const struct brw_tracked_state gen7_push_constant_space = { .dirty = { .mesa = 0, .brw = BRW_NEW_CONTEXT | + BRW_NEW_BATCH | /* Push constant workaround */ BRW_NEW_GEOMETRY_PROGRAM | BRW_NEW_TESS_PROGRAMS, }, @@ -180,8 +208,6 @@ gen7_upload_urb(struct brw_context *brw, unsigned vs_size, bool gs_present, bool tess_present) { const struct gen_device_info *devinfo = &brw->screen->devinfo; - const int push_size_kB = - (devinfo->gen >= 8 || (devinfo->is_haswell && devinfo->gt == 3)) ? 32 : 16; /* BRW_NEW_{VS,TCS,TES,GS}_PROG_DATA */ struct brw_vue_prog_data *prog_data[4] = { @@ -221,8 +247,9 @@ gen7_upload_urb(struct brw_context *brw, unsigned vs_size, unsigned entries[4]; unsigned start[4]; - gen_get_urb_config(devinfo, 1024 * push_size_kB, 1024 * brw->urb.size, - tess_present, gs_present, entry_size, entries, start); + gen_get_urb_config(devinfo, brw->l3.config, + tess_present, gs_present, entry_size, + entries, start, NULL); if (devinfo->gen == 7 && !devinfo->is_haswell && !devinfo->is_baytrail) gen7_emit_vs_workaround_flush(brw);