[Mesa-dev] [PATCH 1/4] i965: Refactor Gen7+ SURFACE_STATE setup for buffer surfaces.

Kenneth Graunke kenneth at whitecape.org
Mon Sep 16 10:58:42 PDT 2013


On 09/16/2013 09:38 AM, Eric Anholt wrote:
> Kenneth Graunke <kenneth at whitecape.org> writes:
> 
>> This was an embarassingly large amount of copy and pasted code,
>> and it wasn't particularly simple code either.  By factoring it out
>> into a helper function, we consolidate the complexity.
>>
>> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
>> ---
>>  src/mesa/drivers/dri/i965/gen7_wm_surface_state.c | 144 +++++++++-------------
>>  1 file changed, 58 insertions(+), 86 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
>> index 37e3174..8413308 100644
>> --- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
>> +++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
>> @@ -224,6 +224,37 @@ gen7_check_surface_setup(uint32_t *surf, bool is_render_target)
>>     }
>>  }
>>  
>> +static void
>> +gen7_emit_buffer_surface_state(struct brw_context *brw,
>> +                               uint32_t *out_offset,
>> +                               drm_intel_bo *bo,
>> +                               unsigned buffer_offset,
>> +                               unsigned surface_format,
>> +                               unsigned buffer_size,
>> +                               unsigned pitch,
>> +                               unsigned mocs)
>> +{
>> +   uint32_t *surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
>> +                                    8 * 4, 32, out_offset);
>> +   memset(surf, 0, 8 * 4);
>> +
>> +   surf[0] = BRW_SURFACE_BUFFER << BRW_SURFACE_TYPE_SHIFT |
>> +             surface_format << BRW_SURFACE_FORMAT_SHIFT |
>> +             BRW_SURFACE_RC_READ_WRITE;
>> +   surf[1] = bo->offset + buffer_offset; /* reloc */
>> +   surf[2] = SET_FIELD(buffer_size & 0x7f, GEN7_SURFACE_WIDTH) |
>> +             SET_FIELD((buffer_size >> 7) & 0x3fff, GEN7_SURFACE_HEIGHT);
>> +   surf[3] = SET_FIELD((buffer_size >> 21) & 0x3f, BRW_SURFACE_DEPTH) |
>> +             (pitch - 1);
>> +   surf[4] = 0;
>> +   surf[5] = SET_FIELD(mocs, GEN7_SURFACE_MOCS);
>> +
>> +   /* Emit relocation to surface contents */
>> +   drm_intel_bo_emit_reloc(brw->batch.bo, *out_offset + 4,
>> +                           bo, buffer_offset, I915_GEM_DOMAIN_SAMPLER, 0);
> 
> I think this will segfault if BO is NULL

Clearly.  I don't know how I missed that...thanks for catching it.

[snip]

> But here you might pass in a NULL bo.  Same for patch 4.  I'm confused
> that this didn't produce a piglit regression.

Fixed in both patches.  I'm not sure why it didn't cause regressions.

>>  }
> 
> I think the savings is well worth it in patches 1, 3, and 4, but I'm not
> a fan of patch 2.  I've got a lot of branches outstanding where I'm
> trying to finally finish off mt->first_level and the tile offset usage,
> and sharing code between renderbuffers and textures is just going to
> make that harder to do.  (I'm already really tempted to split gen4/5
> From gen6 RB setup, since I think I could land gen4/5 without
> regressing, while gen6 is the unstable hw)
> 

Hmm.  I'd really like to try and share some code, but I don't want to
get in the way of the work that you're doing to kill off tile offsets.
I think I'll drop patch 2 for now, and maybe try again once the code
isn't in as much flux.

--Ken


More information about the mesa-dev mailing list