[Mesa-dev] [PATCH v4 3/6] i965: Enable hardware-generated binding tables on render path.

Abdiel Janulgue abdiel.janulgue at linux.intel.com
Mon Jul 6 02:26:59 PDT 2015



On 07/03/2015 12:20 PM, Chris Wilson wrote:
> On Fri, Jul 03, 2015 at 10:00:31AM +0300, Abdiel Janulgue wrote:
>> +void
>> +gen7_enable_hw_binding_tables(struct brw_context *brw)
>> +{
>> +   if (!brw->use_resource_streamer)
>> +      return;
>> +
>> +   if (!brw->hw_bt_pool.bo) {
>> +      /* We use a single re-usable buffer object for the lifetime of the
>> +       * context and size it to maximum allowed binding tables that can be
>> +       * programmed per batch:
>> +       *
>> +       * From the Haswell PRM, Volume 7: 3D Media GPGPU,
>> +       * 3DSTATE_BINDING_TABLE_POOL_ALLOC > Programming Note:
>> +       * "A maximum of 16,383 Binding tables are allowed in any batch buffer"
>> +       */
>> +      static const int max_size = 16383 * 4;
>> +      brw->hw_bt_pool.bo = drm_intel_bo_alloc(brw->bufmgr, "hw_bt",
>> +                                              max_size, 64);
>> +      brw->hw_bt_pool.next_offset = 0;
>> +   }
>> +
>> +   int pkt_len = brw->gen >= 8 ? 4 : 3;
>> +   uint32_t dw1 = BRW_HW_BINDING_TABLE_ENABLE;
>> +   if (brw->is_haswell)
>> +      dw1 |= SET_FIELD(GEN7_MOCS_L3, GEN7_HW_BT_POOL_MOCS) |
>> +         HSW_BT_POOL_ALLOC_MUST_BE_ONE;
>> +   else if (brw->gen >= 8)
>> +      dw1 |= BDW_MOCS_WB;
>> +
>> +   BEGIN_BATCH(pkt_len);
>> +   OUT_BATCH(_3DSTATE_BINDING_TABLE_POOL_ALLOC << 16 | (pkt_len - 2));
>> +   if (brw->gen >= 8) {
>> +      OUT_RELOC64(brw->hw_bt_pool.bo, I915_GEM_DOMAIN_SAMPLER, 0, dw1);
>> +      OUT_BATCH(brw->hw_bt_pool.bo->size);
>> +   } else {
>> +      OUT_RELOC(brw->hw_bt_pool.bo, I915_GEM_DOMAIN_SAMPLER, 0, dw1);
>> +      OUT_RELOC(brw->hw_bt_pool.bo, I915_GEM_DOMAIN_SAMPLER, 0,
>> +             brw->hw_bt_pool.bo->size);
>> +   }
>> +   ADVANCE_BATCH();
>> +
>> +   /* From the Haswell PRM, Volume 7: 3D Media GPGPU,
>> +    * 3DSTATE_BINDING_TABLE_POOL_ALLOC > Programming Note:
>> +    *
>> +    * "When switching between HW and SW binding table generation, SW must
>> +    * issue a state cache invalidate."
>> +    */
>> +   brw_emit_pipe_control_flush(brw, PIPE_CONTROL_STATE_CACHE_INVALIDATE);
> 
> Should this flush not be before the enable? It's a top-of-pipe sync,
> which means that the enable 3DSTATE will be parsed and changing the GPU
> state as the previous commands are still running. Since the flush is
> mandatory, that implies to me that the state it changing is not latched
> and so still being used by those earlier commands.

I made a test-run with the flush first before the enable hw-bt and
didn't see any problems. Re-ordering this to the top does actually makes
sense. Thanks for pointing this out!

-Abdiel



More information about the mesa-dev mailing list