i965: Use the upload BO for push constants on Gen7.5-Gen8.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 12 May 2017 05:23:14 +0000 (22:23 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Sat, 20 May 2017 07:23:10 +0000 (00:23 -0700)
We can easily use the upload BO for push constants on Gen7.5/Gen8 too,
at the cost of a relocation when emitting 3DSTATE_CONSTANT_XS.  We can
simply switch to using constant buffer pointer 2 instead of pointer 0,
like we do on Gen9+.

Ivybridge and Baytrail can't do this trick because they require the
constant buffers to be enabled in order, starting with 0.  We'd have
to set the INSTPM bit to make the constant buffer pointer not relative
to dynamic state base address, which would need kernel command parser
support.

Improves performance in GLBenchmark 2.7/TRex Offscreen by:
- Broadwell GT2: 0.305608% +/- 0.19877% (n = 68)
- Braswell: No difference proven (n = 742)
- Haswell GT3e: 0.180755% +/- 0.0237505% (n = 30)

Reviewed-by: Chris Forbes <chrisforbes@google.com>
src/mesa/drivers/dri/i965/gen6_constant_state.c
src/mesa/drivers/dri/i965/genX_state_upload.c

index 749e77e958f4acf90250ad71d8cd0d97796f26cc..f3927c5dba280bc72894b14bc3dc41ce793d0eb4 100644 (file)
@@ -64,7 +64,7 @@ gen6_upload_push_constants(struct brw_context *brw,
       int i;
       const int size = prog_data->nr_params * sizeof(gl_constant_value);
       gl_constant_value *param;
-      if (brw->gen >= 9) {
+      if (brw->gen >= 8 || brw->is_haswell) {
          param = intel_upload_space(brw, size, 32, &brw->curbe.curbe_bo,
                                     &stage_state->push_const_offset);
       } else {
index f7128ae8960bfc24bada12320843ec03b644bfb1..5fad3b72e2717d5f23862df054cba13beefbf170 100644 (file)
@@ -2597,7 +2597,7 @@ upload_constant_state(struct brw_context *brw,
    brw_batch_emit(brw, GENX(3DSTATE_CONSTANT_VS), pkt) {
       pkt._3DCommandSubOpcode = push_constant_opcodes[stage];
       if (active) {
-#if GEN_GEN >= 9
+#if GEN_GEN >= 8 || GEN_IS_HASWELL
          pkt.ConstantBody.ConstantBuffer2ReadLength =
             stage_state->push_const_size;
          pkt.ConstantBody.PointerToConstantBuffer2 =