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

Samuel Pitoiset samuel.pitoiset at gmail.com
Sun Feb 7 18:08:22 UTC 2016



On 02/07/2016 07:00 PM, Ilia Mirkin wrote:
> 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.

Yeah, it's only for nouveau.

>
>    -ilia
>


More information about the mesa-dev mailing list