[Mesa-dev] [PATCH v2 06/20] gallium: add a new interface for pipe_context::launch_grid()

Ilia Mirkin imirkin at alum.mit.edu
Sun Feb 7 18:00:57 UTC 2016


On Sun, Feb 7, 2016 at 5:59 AM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
>
>
> On 02/06/2016 11:04 PM, Samuel Pitoiset wrote:
>>
>> This introduces pipe_grid_info which contains all information to
>> describe a launch_grid call. This will be used to implement indirect
>> compute in the same fashion as indirect draw.
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> Reviewed-by: Marek Olšák <marek.olsak at amd.com>
>> Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
>> ---
>>   src/gallium/drivers/ilo/ilo_gpgpu.c                |  8 ++----
>>   src/gallium/drivers/nouveau/nv50/nv50_compute.c    | 16 +++++------
>>   src/gallium/drivers/nouveau/nv50/nv50_context.h    |  3 +-
>>   .../drivers/nouveau/nv50/nv50_query_hw_sm.c        | 12 ++++++--
>>   src/gallium/drivers/nouveau/nvc0/nvc0_compute.c    | 19 ++++++-------
>>   src/gallium/drivers/nouveau/nvc0/nvc0_context.h    |  6 ++--
>>   .../drivers/nouveau/nvc0/nvc0_query_hw_sm.c        | 12 ++++++--
>>   src/gallium/drivers/nouveau/nvc0/nve4_compute.c    | 10 +++----
>>   src/gallium/drivers/r600/evergreen_compute.c       | 19 ++++++-------
>>   src/gallium/drivers/radeonsi/si_compute.c          | 33
>> +++++++++++-----------
>>   src/gallium/include/pipe/p_context.h               | 17 ++---------
>>   src/gallium/include/pipe/p_state.h                 | 27
>> ++++++++++++++++++
>>   src/gallium/state_trackers/clover/core/kernel.cpp  | 13 +++++----
>>   src/gallium/tests/trivial/compute.c                | 11 +++++++-
>>   14 files changed, 117 insertions(+), 89 deletions(-)
>>
>> diff --git a/src/gallium/drivers/ilo/ilo_gpgpu.c
>> b/src/gallium/drivers/ilo/ilo_gpgpu.c
>> index b741590..ab165b6 100644
>> --- a/src/gallium/drivers/ilo/ilo_gpgpu.c
>> +++ b/src/gallium/drivers/ilo/ilo_gpgpu.c
>> @@ -79,9 +79,7 @@ launch_grid(struct ilo_context *ilo,
>>   }
>>
>>   static void
>> -ilo_launch_grid(struct pipe_context *pipe,
>> -                const uint *block_layout, const uint *grid_layout,
>> -                uint32_t pc, const void *input)
>> +ilo_launch_grid(struct pipe_context *pipe, const struct pipe_grid_info
>> *info)
>>   {
>>      struct ilo_context *ilo = ilo_context(pipe);
>>      struct ilo_shader_state *cs = ilo->state_vector.cs;
>> @@ -92,13 +90,13 @@ ilo_launch_grid(struct pipe_context *pipe,
>>      input_buf.buffer_size =
>>         ilo_shader_get_kernel_param(cs, ILO_KERNEL_CS_INPUT_SIZE);
>>      if (input_buf.buffer_size) {
>> -      u_upload_data(ilo->uploader, 0, input_buf.buffer_size, 16, input,
>> +      u_upload_data(ilo->uploader, 0, input_buf.buffer_size, 16,
>> info->input,
>>               &input_buf.buffer_offset, &input_buf.buffer);
>>      }
>>
>>      ilo_shader_cache_upload(ilo->shader_cache, &ilo->cp->builder);
>>
>> -   launch_grid(ilo, block_layout, grid_layout, &input_buf, pc);
>> +   launch_grid(ilo, info->block, info->grid, &input_buf, info->pc);
>>
>>      ilo_render_invalidate_hw(ilo->render);
>>
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_compute.c
>> b/src/gallium/drivers/nouveau/nv50/nv50_compute.c
>> index 6d23fd6..04488d6 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_compute.c
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_compute.c
>> @@ -270,13 +270,11 @@ nv50_compute_find_symbol(struct nv50_context *nv50,
>> uint32_t label)
>>   }
>>
>>   void
>> -nv50_launch_grid(struct pipe_context *pipe,
>> -                 const uint *block_layout, const uint *grid_layout,
>> -                 uint32_t label, const void *input)
>> +nv50_launch_grid(struct pipe_context *pipe, const struct pipe_grid_info
>> *info)
>>   {
>>      struct nv50_context *nv50 = nv50_context(pipe);
>>      struct nouveau_pushbuf *push = nv50->base.pushbuf;
>> -   unsigned block_size = block_layout[0] * block_layout[1] *
>> block_layout[2];
>> +   unsigned block_size = info->block[0] * info->block[1] *
>> info->block[2];
>>      struct nv50_program *cp = nv50->compprog;
>>      bool ret;
>>
>> @@ -286,10 +284,10 @@ nv50_launch_grid(struct pipe_context *pipe,
>>         return;
>>      }
>>
>> -   nv50_compute_upload_input(nv50, input);
>> +   nv50_compute_upload_input(nv50, info->input);
>>
>>      BEGIN_NV04(push, NV50_COMPUTE(CP_START_ID), 1);
>> -   PUSH_DATA (push, nv50_compute_find_symbol(nv50, label));
>> +   PUSH_DATA (push, nv50_compute_find_symbol(nv50, info->pc));
>>
>>      BEGIN_NV04(push, NV50_COMPUTE(SHARED_SIZE), 1);
>>      PUSH_DATA (push, align(cp->cp.smem_size + cp->parm_size + 0x10,
>> 0x40));
>> @@ -298,14 +296,14 @@ nv50_launch_grid(struct pipe_context *pipe,
>>
>>      /* grid/block setup */
>>      BEGIN_NV04(push, NV50_COMPUTE(BLOCKDIM_XY), 2);
>> -   PUSH_DATA (push, block_layout[1] << 16 | block_layout[0]);
>> -   PUSH_DATA (push, block_layout[2]);
>> +   PUSH_DATA (push, info->block[1] << 16 | info->block[0]);
>> +   PUSH_DATA (push, info->block[2]);
>>      BEGIN_NV04(push, NV50_COMPUTE(BLOCK_ALLOC), 1);
>>      PUSH_DATA (push, 1 << 16 | block_size);
>>      BEGIN_NV04(push, NV50_COMPUTE(BLOCKDIM_LATCH), 1);
>>      PUSH_DATA (push, 1);
>>      BEGIN_NV04(push, NV50_COMPUTE(GRIDDIM), 1);
>> -   PUSH_DATA (push, grid_layout[1] << 16 | grid_layout[0]);
>> +   PUSH_DATA (push, info->grid[1] << 16 | info->grid[0]);
>>      BEGIN_NV04(push, NV50_COMPUTE(GRIDID), 1);
>>      PUSH_DATA (push, 1);
>>
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_context.h
>> b/src/gallium/drivers/nouveau/nv50/nv50_context.h
>> index 712d00e..cb18df3 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_context.h
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_context.h
>> @@ -324,7 +324,6 @@ nv98_video_buffer_create(struct pipe_context *pipe,
>>
>>   /* nv50_compute.c */
>>   void
>> -nv50_launch_grid(struct pipe_context *, const uint *, const uint *,
>> -                 uint32_t, const void *);
>> +nv50_launch_grid(struct pipe_context *, const struct pipe_grid_info *);
>>
>>   #endif
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c
>> b/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c
>> index 79c7023..da3970e 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c
>> @@ -218,11 +218,12 @@ nv50_hw_sm_end_query(struct nv50_context *nv50,
>> struct nv50_hw_query *hq)
>>      struct pipe_context *pipe = &nv50->base.pipe;
>>      struct nouveau_pushbuf *push = nv50->base.pushbuf;
>>      struct nv50_hw_sm_query *hsq = nv50_hw_sm_query(hq);
>> +   struct pipe_grid_info info;
>
>
> This should be:
> struct pipe_grid_info info = {};
>
> to correctly initialize the indirect compute things to 0.
> (same for nvc0).
>
> I did these changes locally and I'll add them for the v3.

This is fine in nouveau, but make sure you don't do this in common
code which might be compiled by backwards compilers.

  -ilia


More information about the mesa-dev mailing list