[Mesa-dev] [PATCH 3/5] radeonsi/compute: Use relocs for scratch pointer rather than user sgprs v2

Marek Olšák maraeo at gmail.com
Fri Jan 16 04:30:26 PST 2015


Just general suggestions.

If you don't want to map the buffer and synchronize with the CPU, you
can use the WRITE_DATA packet to write the data.

I wouldn't use buffer_unmap for buffers that can be mapped/unmapped
often. Even though buffer_unmap is a no-op right now, it might change
in the future.

Marek

On Fri, Jan 16, 2015 at 1:48 AM, Tom Stellard <thomas.stellard at amd.com> wrote:
> Instead of passing a pointer to the scratch buffer via user sgprs, we
> now patch the shader with the buffer address using reloc information
> from the LLVM generated ELF.
>
> v2:
>   - Make sure not to break older LLVM.
> ---
>  src/gallium/drivers/radeonsi/si_compute.c | 42 +++++++++++++++++++++++++++++++
>  1 file changed, 42 insertions(+)
>
> diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c
> index f911e1f..9571a3e 100644
> --- a/src/gallium/drivers/radeonsi/si_compute.c
> +++ b/src/gallium/drivers/radeonsi/si_compute.c
> @@ -36,9 +36,18 @@
>  #if HAVE_LLVM < 0x0305
>  #define NUM_USER_SGPRS 2
>  #else
> +/* XXX: Even though we don't pass the scratch buffer via user sgprs any more
> + * LLVM still expects that we specify 4 USER_SGPRS so it can remain compatible
> + * with older mesa. */
>  #define NUM_USER_SGPRS 4
>  #endif
>
> +static const char *scratch_rsrc_dword0_symbol =
> +       "SCRATCH_RSRC_DWORD0";
> +
> +static const char *scratch_rsrc_dword1_symbol =
> +       "SCRATCH_RSRC_DWORD1";
> +
>  struct si_compute {
>         struct si_context *ctx;
>
> @@ -174,6 +183,35 @@ static unsigned compute_num_waves_for_scratch(
>         return scratch_waves;
>  }
>
> +static void apply_scratch_relocs(const struct si_screen *sscreen,
> +                       const struct radeon_shader_binary *binary,
> +                       struct si_shader *shader, uint64_t scratch_va) {
> +       unsigned i;
> +       char *ptr;
> +       uint32_t scratch_rsrc_dword0 = scratch_va & 0xffffffff;
> +       uint32_t scratch_rsrc_dword1 =
> +               S_008F04_BASE_ADDRESS_HI(scratch_va >> 32)
> +               |  S_008F04_STRIDE(shader->scratch_bytes_per_wave / 64);
> +
> +       if (!binary->reloc_count) {
> +               return;
> +       }
> +
> +       ptr = sscreen->b.ws->buffer_map(shader->bo->cs_buf, NULL,
> +                                       PIPE_TRANSFER_READ_WRITE);
> +       for (i = 0 ; i < binary->reloc_count; i++) {
> +               const struct radeon_shader_reloc *reloc = &binary->relocs[i];
> +               if (!strcmp(scratch_rsrc_dword0_symbol, reloc->name)) {
> +                       util_memcpy_cpu_to_le32(ptr + reloc->offset,
> +                               &scratch_rsrc_dword0, 4);
> +               } else if (!strcmp(scratch_rsrc_dword1_symbol, reloc->name)) {
> +                       util_memcpy_cpu_to_le32(ptr + reloc->offset,
> +                               &scratch_rsrc_dword1, 4);
> +               }
> +       }
> +       sscreen->b.ws->buffer_unmap(shader->bo->cs_buf);
> +}
> +
>  static void si_launch_grid(
>                 struct pipe_context *ctx,
>                 const uint *block_layout, const uint *grid_layout,
> @@ -256,6 +294,10 @@ static void si_launch_grid(
>                                 RADEON_USAGE_READWRITE,
>                                 RADEON_PRIO_SHADER_RESOURCE_RW);
>
> +               /* Patch the shader with the scratch buffer address. */
> +               apply_scratch_relocs(sctx->screen,
> +                       &program->binary, shader, scratch_buffer_va);
> +
>         }
>
>         for (i = 0; i < (kernel_args_size / 4); i++) {
> --
> 1.8.5.5
>
> _______________________________________________
> 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