[Mesa-dev] [PATCH] i965: Implement ABO surface state emission.

Ian Romanick idr at freedesktop.org
Wed Oct 2 15:39:10 PDT 2013


On 10/02/2013 11:46 AM, Adrian M Negreanu wrote:
> 
> On Oct 2, 2013 9:29 PM, "Francisco Jerez" <currojerez at riseup.net
> <mailto:currojerez at riseup.net>> wrote:
>>
>> The maximum number of atomic buffer objects is somewhat arbitrary, we
>> can change it in the future easily if it turns out it's not enough...
>>
>> v2: Add comments with the relevant mesa dirty bits.  Fix usage of
>>     BRW_NEW_UNIFORM_BUFFER in the GS ABO state atom.
>> v3: Update binding table layout diagrams.
>>
>> Reviewed-by: Paul Berry <stereotype441 at gmail.com
> <mailto:stereotype441 at gmail.com>>
> Hi,
> I guess this patch also depends on pending patches, right?
> Aiaiai-mesa fails to built it:
> 
> On Oct 2, 2013 9:39 PM, "Aiaiai" <aiaiai at aiaiai.ku> wrote:
> Hi,
> 
> I have tested your changes:
> 
> [Mesa-dev] [PATCH] i965: Implement ABO surface state emission.
> 
> Project: mesa (Mesa build tests)
> 
> Configurations: android linux
> 
> ================================================================================
> Tested the patch(es) on top of the following commits:
> 4e4c32b r600/llvm: Adds support for MSAA
> 8edbd76 r600g/llvm: Undef z and w component of 2D TXP inst
> 9f183eb r600g/llvm: fix txq for texture buffer
> 848c0e7 i965: compute DDX in a subspan based only on top row
> 72edba1 i965/blorp: Use passed in framebuffer rather than ctx->DrawBuffer
> ef8cc3e ralloc: Remove the rzalloc-based new/delete operator definition
> macro.
> fcbbecb st/mesa: Switch glsl_to_tgsi_instruction to the non-zeroing
> allocator.
> 
> ================================================================================
> Failed to build for "android""
> 
> 4e4c32b r600/llvm: Adds support for MSAA
> 8edbd76 r600g/llvm: Undef z and w component of 2D TXP inst
> 9f183eb r600g/llvm: fix txq for texture buffer
> 848c0e7 i965: compute DDX in a subspan based only on top row
> 72edba1 i965/blorp: Use passed in framebuffer rather than ctx->DrawBuffer
> ef8cc3e ralloc: Remove the rzalloc-based new/delete operator definition
> macro.
> fcbbecb st/mesa: Switch glsl_to_tgsi_instruction to the non-zeroing
> allocator.
> src/mesa/drivers/dri/i965/brw_state_dump.c:423:63: warning: pointer of
> type 'void *' used in arithmetic [-Wpointer-arith]
> src/mesa/drivers/dri/i965/brw_state_dump.c: In function 'dump_vs_constants':
> src/mesa/drivers/dri/i965/brw_state_dump.c:435:47: warning: pointer of
> type 'void *' used in arithmetic [-Wpointer-arith]
> src/mesa/drivers/dri/i965/brw_state_dump.c:436:45: warning: pointer of
> type 'void *' used in arithmetic [-Wpointer-arith]
> src/mesa/drivers/dri/i965/brw_state_dump.c: In function 'dump_wm_constants':
> src/mesa/drivers/dri/i965/brw_state_dump.c:451:47: warning: pointer of
> type 'void *' used in arithmetic [-Wpointer-arith]
> src/mesa/drivers/dri/i965/brw_state_dump.c:452:45: warning: pointer of
> type 'void *' used in arithmetic [-Wpointer-arith]
> src/mesa/drivers/dri/i965/brw_state_dump.c: In function
> 'dump_binding_table':
> src/mesa/drivers/dri/i965/brw_state_dump.c:468:44: warning: pointer of
> type 'void *' used in arithmetic [-Wpointer-arith]
> src/mesa/drivers/dri/i965/brw_state_dump.c: In function 'dump_prog_cache':
> src/mesa/drivers/dri/i965/brw_state_dump.c:495:33: warning: pointer of
> type 'void *' used in arithmetic [-Wpointer-arith]
> src/mesa/drivers/dri/i965/brw_vs_surface_state.c: In function
> 'brw_upload_vec4_pull_constants':
> src/mesa/drivers/dri/i965/brw_vs_surface_state.c:72:45: warning: pointer
> of type 'void *' used in arithmetic [-Wpointer-arith]
> src/mesa/drivers/dri/i965/brw_wm_surface_state.c: In function
> 'brw_upload_abo_surfaces':
> src/mesa/drivers/dri/i965/brw_wm_surface_state.c:842:28: error: 'struct
> gl_shader_program' has no member named 'NumAtomicBuffers'
> src/mesa/drivers/dri/i965/brw_wm_surface_state.c:844:14: error: 'struct
> gl_context' has no member named 'AtomicBufferBindings'
> src/mesa/drivers/dri/i965/brw_wm_surface_state.c:844:41: error: 'struct
> gl_shader_program' has no member named 'AtomicBuffers'
> src/mesa/drivers/dri/i965/brw_wm_surface_state.c:846:37: error:
> dereferencing pointer to incomplete type
> src/mesa/drivers/dri/i965/brw_wm_surface_state.c:850:16: error: 'struct
> <anonymous>' has no member named 'create_raw_surface'
> src/mesa/drivers/dri/i965/brw_wm_surface_state.c:850:52: error:
> dereferencing pointer to incomplete type
> src/mesa/drivers/dri/i965/brw_wm_surface_state.c:851:54: error:
> dereferencing pointer to incomplete type
> src/mesa/drivers/dri/i965/brw_wm_surface_state.c:855:12: error: 'struct
> gl_shader_program' has no member named 'NumAtomicBuffers'
> make: ***
> [out/target/product/samsungxe700t/obj/SHARED_LIBRARIES/i965_dri_intermediates/brw_wm_surface_state.o]
> Error 1
> FAILURE

I believe this patch depends on a large (20?) number of patches that
Curro previously posted.

> ================================
> 
>> ---
>>  src/mesa/drivers/dri/i965/brw_context.h          | 27 ++++++++++++--
>>  src/mesa/drivers/dri/i965/brw_gs_surface_state.c | 21 +++++++++++
>>  src/mesa/drivers/dri/i965/brw_state.h            |  3 ++
>>  src/mesa/drivers/dri/i965/brw_state_upload.c     |  4 +++
>>  src/mesa/drivers/dri/i965/brw_vs_surface_state.c | 21 +++++++++++
>>  src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 45
> ++++++++++++++++++++++++
>>  6 files changed, 119 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_context.h
> b/src/mesa/drivers/dri/i965/brw_context.h
>> index 3922705..1407f20 100644
>> --- a/src/mesa/drivers/dri/i965/brw_context.h
>> +++ b/src/mesa/drivers/dri/i965/brw_context.h
>> @@ -158,6 +158,7 @@ enum brw_state_id {
>>     BRW_STATE_RASTERIZER_DISCARD,
>>     BRW_STATE_STATS_WM,
>>     BRW_STATE_UNIFORM_BUFFER,
>> +   BRW_STATE_ATOMIC_BUFFER,
>>     BRW_STATE_META_IN_PROGRESS,
>>     BRW_STATE_INTERPOLATION_MAP,
>>     BRW_STATE_PUSH_CONSTANT_ALLOCATION,
>> @@ -196,6 +197,7 @@ enum brw_state_id {
>>  #define BRW_NEW_RASTERIZER_DISCARD     (1 <<
> BRW_STATE_RASTERIZER_DISCARD)
>>  #define BRW_NEW_STATS_WM               (1 << BRW_STATE_STATS_WM)
>>  #define BRW_NEW_UNIFORM_BUFFER          (1 << BRW_STATE_UNIFORM_BUFFER)
>> +#define BRW_NEW_ATOMIC_BUFFER           (1 << BRW_STATE_ATOMIC_BUFFER)
>>  #define BRW_NEW_META_IN_PROGRESS        (1 << BRW_STATE_META_IN_PROGRESS)
>>  #define BRW_NEW_INTERPOLATION_MAP       (1 <<
> BRW_STATE_INTERPOLATION_MAP)
>>  #define BRW_NEW_PUSH_CONSTANT_ALLOCATION (1 <<
> BRW_STATE_PUSH_CONSTANT_ALLOCATION)
>> @@ -599,6 +601,12 @@ struct brw_gs_prog_data
>>  /** Max number of render targets in a shader */
>>  #define BRW_MAX_DRAW_BUFFERS 8
>>
>> +/** Max number of uniform buffer objects in a shader */
>> +#define BRW_MAX_UBO 12
>> +
>> +/** Max number of atomic counter buffer objects in a shader */
>> +#define BRW_MAX_ABO 4
>> +
>>  /**
>>   * Max number of binding table entries used for stream output.
>>   *
>> @@ -661,6 +669,11 @@ struct brw_gs_prog_data
>>   *    |   : |     :                   |
>>   *    |  36 | UBO 11                  |
>>   *    +-------------------------------+
>> + *    |  37 | ABO 0                   |
>> + *    |   . |     .                   |
>> + *    |   : |     :                   |
>> + *    |  40 | ABO 3                   |
>> + *    +-------------------------------+
>>   *
>>   * Our VS (and Gen7 GS) binding tables are programmed as follows:
>>   *
>> @@ -677,6 +690,11 @@ struct brw_gs_prog_data
>>   *    |   : |     :                   |
>>   *    |  28 | UBO 11                  |
>>   *    +-------------------------------+
>> + *    |  29 | ABO 0                   |
>> + *    |   . |     .                   |
>> + *    |   : |     :                   |
>> + *    |  32 | ABO 3                   |
>> + *    +-------------------------------+
>>   *
>>   * Our (gen6) GS binding tables are programmed as follows:
>>   *
>> @@ -691,14 +709,16 @@ struct brw_gs_prog_data
>>  #define SURF_INDEX_FRAG_CONST_BUFFER (BRW_MAX_DRAW_BUFFERS + 1)
>>  #define SURF_INDEX_TEXTURE(t)        (BRW_MAX_DRAW_BUFFERS + 2 + (t))
>>  #define SURF_INDEX_WM_UBO(u)        
> (SURF_INDEX_TEXTURE(BRW_MAX_TEX_UNIT) + u)
>> -#define SURF_INDEX_WM_SHADER_TIME    (SURF_INDEX_WM_UBO(12))
>> +#define SURF_INDEX_WM_ABO(a)         (SURF_INDEX_WM_UBO(BRW_MAX_UBO) + a)
>> +#define SURF_INDEX_WM_SHADER_TIME    (SURF_INDEX_WM_ABO(BRW_MAX_ABO))
>>  /** Maximum size of the binding table. */
>>  #define BRW_MAX_WM_SURFACES          (SURF_INDEX_WM_SHADER_TIME + 1)
>>
>>  #define SURF_INDEX_VEC4_CONST_BUFFER (0)
>>  #define SURF_INDEX_VEC4_TEXTURE(t)   (SURF_INDEX_VEC4_CONST_BUFFER +
> 1 + (t))
>>  #define SURF_INDEX_VEC4_UBO(u)      
> (SURF_INDEX_VEC4_TEXTURE(BRW_MAX_TEX_UNIT) + u)
>> -#define SURF_INDEX_VEC4_SHADER_TIME  (SURF_INDEX_VEC4_UBO(12))
>> +#define SURF_INDEX_VEC4_ABO(a)      
> (SURF_INDEX_VEC4_UBO(BRW_MAX_UBO) + a)
>> +#define SURF_INDEX_VEC4_SHADER_TIME  (SURF_INDEX_VEC4_ABO(BRW_MAX_ABO))
>>  #define BRW_MAX_VEC4_SURFACES        (SURF_INDEX_VEC4_SHADER_TIME + 1)
>>
>>  #define SURF_INDEX_GEN6_SOL_BINDING(t) (t)
>> @@ -1498,6 +1518,9 @@ brw_update_sol_surface(struct brw_context *brw,
>>  void brw_upload_ubo_surfaces(struct brw_context *brw,
>>                              struct gl_shader *shader,
>>                              uint32_t *surf_offsets);
>> +void brw_upload_abo_surfaces(struct brw_context *brw,
>> +                             struct gl_shader_program *prog,
>> +                             uint32_t *surf_offsets);
>>
>>  /* brw_surface_formats.c */
>>  bool brw_is_hiz_depth_format(struct brw_context *ctx, gl_format format);
>> diff --git a/src/mesa/drivers/dri/i965/brw_gs_surface_state.c
> b/src/mesa/drivers/dri/i965/brw_gs_surface_state.c
>> index d0ce412..05f9efa 100644
>> --- a/src/mesa/drivers/dri/i965/brw_gs_surface_state.c
>> +++ b/src/mesa/drivers/dri/i965/brw_gs_surface_state.c
>> @@ -87,3 +87,24 @@ const struct brw_tracked_state brw_gs_ubo_surfaces = {
>>     },
>>     .emit = brw_upload_gs_ubo_surfaces,
>>  };
>> +
>> +static void
>> +brw_upload_gs_abo_surfaces(struct brw_context *brw)
>> +{
>> +   struct gl_context *ctx = &brw->ctx;
>> +   /* _NEW_PROGRAM */
>> +   struct gl_shader_program *prog = ctx->Shader.CurrentGeometryProgram;
>> +
>> +   if (prog)
>> +      brw_upload_abo_surfaces(
>> +         brw, prog, &brw->gs.base.surf_offset[SURF_INDEX_VEC4_ABO(0)]);
>> +}
>> +
>> +const struct brw_tracked_state brw_gs_abo_surfaces = {
>> +   .dirty = {
>> +      .mesa = _NEW_PROGRAM,
>> +      .brw = BRW_NEW_BATCH | BRW_NEW_ATOMIC_BUFFER,
>> +      .cache = 0,
>> +   },
>> +   .emit = brw_upload_gs_abo_surfaces,
>> +};
>> diff --git a/src/mesa/drivers/dri/i965/brw_state.h
> b/src/mesa/drivers/dri/i965/brw_state.h
>> index ec64328..ed8ce33 100644
>> --- a/src/mesa/drivers/dri/i965/brw_state.h
>> +++ b/src/mesa/drivers/dri/i965/brw_state.h
>> @@ -71,7 +71,9 @@ extern const struct brw_tracked_state brw_vs_prog;
>>  extern const struct brw_tracked_state brw_vs_samplers;
>>  extern const struct brw_tracked_state brw_gs_samplers;
>>  extern const struct brw_tracked_state brw_vs_ubo_surfaces;
>> +extern const struct brw_tracked_state brw_vs_abo_surfaces;
>>  extern const struct brw_tracked_state brw_gs_ubo_surfaces;
>> +extern const struct brw_tracked_state brw_gs_abo_surfaces;
>>  extern const struct brw_tracked_state brw_vs_unit;
>>  extern const struct brw_tracked_state brw_gs_prog;
>>  extern const struct brw_tracked_state brw_wm_prog;
>> @@ -81,6 +83,7 @@ extern const struct brw_tracked_state
> brw_wm_binding_table;
>>  extern const struct brw_tracked_state brw_gs_binding_table;
>>  extern const struct brw_tracked_state brw_vs_binding_table;
>>  extern const struct brw_tracked_state brw_wm_ubo_surfaces;
>> +extern const struct brw_tracked_state brw_wm_abo_surfaces;
>>  extern const struct brw_tracked_state brw_wm_unit;
>>  extern const struct brw_tracked_state brw_interpolation_map;
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c
> b/src/mesa/drivers/dri/i965/brw_state_upload.c
>> index d7fe319..64ffcd0 100644
>> --- a/src/mesa/drivers/dri/i965/brw_state_upload.c
>> +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c
>> @@ -204,10 +204,13 @@ static const struct brw_tracked_state
> *gen7_atoms[] =
>>      */
>>     &brw_vs_pull_constants,
>>     &brw_vs_ubo_surfaces,
>> +   &brw_vs_abo_surfaces,
>>     &brw_gs_pull_constants,
>>     &brw_gs_ubo_surfaces,
>> +   &brw_gs_abo_surfaces,
>>     &brw_wm_pull_constants,
>>     &brw_wm_ubo_surfaces,
>> +   &brw_wm_abo_surfaces,
>>     &gen6_renderbuffer_surfaces,
>>     &brw_texture_surfaces,
>>     &brw_vs_binding_table,
>> @@ -398,6 +401,7 @@ static struct dirty_bit_map brw_bits[] = {
>>     DEFINE_BIT(BRW_NEW_RASTERIZER_DISCARD),
>>     DEFINE_BIT(BRW_NEW_STATS_WM),
>>     DEFINE_BIT(BRW_NEW_UNIFORM_BUFFER),
>> +   DEFINE_BIT(BRW_NEW_ATOMIC_BUFFER),
>>     DEFINE_BIT(BRW_NEW_META_IN_PROGRESS),
>>     DEFINE_BIT(BRW_NEW_INTERPOLATION_MAP),
>>     DEFINE_BIT(BRW_NEW_PUSH_CONSTANT_ALLOCATION),
>> diff --git a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c
> b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c
>> index 2c5d06f..c6461c7 100644
>> --- a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c
>> +++ b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c
>> @@ -148,3 +148,24 @@ const struct brw_tracked_state
> brw_vs_ubo_surfaces = {
>>     },
>>     .emit = brw_upload_vs_ubo_surfaces,
>>  };
>> +
>> +static void
>> +brw_upload_vs_abo_surfaces(struct brw_context *brw)
>> +{
>> +   struct gl_context *ctx = &brw->ctx;
>> +   /* _NEW_PROGRAM */
>> +   struct gl_shader_program *prog = ctx->Shader.CurrentVertexProgram;
>> +
>> +   if (prog)
>> +      brw_upload_abo_surfaces(
>> +         brw, prog, &brw->vs.base.surf_offset[SURF_INDEX_VEC4_ABO(0)]);
>> +}
>> +
>> +const struct brw_tracked_state brw_vs_abo_surfaces = {
>> +   .dirty = {
>> +      .mesa = _NEW_PROGRAM,
>> +      .brw = BRW_NEW_BATCH | BRW_NEW_ATOMIC_BUFFER,
>> +      .cache = 0,
>> +   },
>> +   .emit = brw_upload_vs_abo_surfaces,
>> +};
>> diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
>> index 4c3eb69..70f1391 100644
>> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
>> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
>> @@ -833,6 +833,51 @@ const struct brw_tracked_state
> brw_wm_ubo_surfaces = {
>>  };
>>
>>  void
>> +brw_upload_abo_surfaces(struct brw_context *brw,
>> +                       struct gl_shader_program *prog,
>> +                       uint32_t *surf_offsets)
>> +{
>> +   struct gl_context *ctx = &brw->ctx;
>> +
>> +   for (int i = 0; i < prog->NumAtomicBuffers; i++) {
>> +      struct gl_atomic_buffer_binding *binding =
>> +         &ctx->AtomicBufferBindings[prog->AtomicBuffers[i].Binding];
>> +      struct intel_buffer_object *intel_bo =
>> +         intel_buffer_object(binding->BufferObject);
>> +      drm_intel_bo *bo = intel_bufferobj_buffer(brw, intel_bo,
>> +                                                INTEL_READ |
> INTEL_WRITE_PART);
>> +
>> +      brw->vtbl.create_raw_surface(brw, bo, binding->Offset,
>> +                                   bo->size - binding->Offset,
>> +                                   &surf_offsets[i], true);
>> +   }
>> +
>> +   if (prog->NumAtomicBuffers)
>> +      brw->state.dirty.brw |= BRW_NEW_SURFACES;
>> +}
>> +
>> +static void
>> +brw_upload_wm_abo_surfaces(struct brw_context *brw)
>> +{
>> +   struct gl_context *ctx = &brw->ctx;
>> +   /* _NEW_PROGRAM */
>> +   struct gl_shader_program *prog = ctx->Shader._CurrentFragmentProgram;
>> +
>> +   if (prog)
>> +      brw_upload_abo_surfaces(
>> +         brw, prog, &brw->wm.base.surf_offset[SURF_INDEX_WM_ABO(0)]);
>> +}
>> +
>> +const struct brw_tracked_state brw_wm_abo_surfaces = {
>> +   .dirty = {
>> +      .mesa = _NEW_PROGRAM,
>> +      .brw = BRW_NEW_BATCH | BRW_NEW_ATOMIC_BUFFER,
>> +      .cache = 0,
>> +   },
>> +   .emit = brw_upload_wm_abo_surfaces,
>> +};
>> +
>> +void
>>  gen4_init_vtable_surface_functions(struct brw_context *brw)
>>  {
>>     brw->vtbl.update_texture_surface = brw_update_texture_surface;
>> --
>> 1.8.3.4
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev



More information about the mesa-dev mailing list