[Mesa-dev] [PATCH v2 13/25] radeonsi: load the streamout buf descriptors closer to their use

Marek Olšák maraeo at gmail.com
Wed Dec 7 22:05:51 UTC 2016


Other than the comment on patch 2, patches 1-13 are:

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Tue, Dec 6, 2016 at 11:48 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> LLVM can still decide to hoist the loads since they're marked invariant.
> ---
>  src/gallium/drivers/radeonsi/si_shader.c | 25 +++++++++++--------------
>  1 file changed, 11 insertions(+), 14 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index 7e222c0..f1a4946 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -2178,33 +2178,20 @@ static void emit_streamout_output(struct si_shader_context *ctx,
>   * to buffers. */
>  static void si_llvm_emit_streamout(struct si_shader_context *ctx,
>                                    struct si_shader_output_values *outputs,
>                                    unsigned noutput)
>  {
>         struct pipe_stream_output_info *so = &ctx->shader->selector->so;
>         struct gallivm_state *gallivm = &ctx->gallivm;
>         LLVMBuilderRef builder = gallivm->builder;
>         int i;
>         struct lp_build_if_state if_ctx;
> -       LLVMValueRef so_buffers[4];
> -       LLVMValueRef buf_ptr = LLVMGetParam(ctx->main_fn,
> -                                           SI_PARAM_RW_BUFFERS);
> -
> -       /* Load the descriptors. */
> -       for (i = 0; i < 4; ++i) {
> -               if (ctx->shader->selector->so.stride[i]) {
> -                       LLVMValueRef offset = lp_build_const_int32(gallivm,
> -                                                                  SI_VS_STREAMOUT_BUF0 + i);
> -
> -                       so_buffers[i] = build_indexed_load_const(ctx, buf_ptr, offset);
> -               }
> -       }
>
>         /* Get bits [22:16], i.e. (so_param >> 16) & 127; */
>         LLVMValueRef so_vtx_count =
>                 unpack_param(ctx, ctx->param_streamout_config, 16, 7);
>
>         LLVMValueRef tid = get_thread_id(ctx);
>
>         /* can_emit = tid < so_vtx_count; */
>         LLVMValueRef can_emit =
>                 LLVMBuildICmp(builder, LLVMIntULT, tid, so_vtx_count, "");
> @@ -2223,26 +2210,36 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx,
>                  *                attrib_offset
>                   */
>
>                 LLVMValueRef so_write_index =
>                         LLVMGetParam(ctx->main_fn,
>                                      ctx->param_streamout_write_index);
>
>                 /* Compute (streamout_write_index + thread_id). */
>                 so_write_index = LLVMBuildAdd(builder, so_write_index, tid, "");
>
> -               /* Compute the write offset for each enabled buffer. */
> +               /* Load the descriptor and compute the write offset for each
> +                * enabled buffer. */
>                 LLVMValueRef so_write_offset[4] = {};
> +               LLVMValueRef so_buffers[4];
> +               LLVMValueRef buf_ptr = LLVMGetParam(ctx->main_fn,
> +                                                   SI_PARAM_RW_BUFFERS);
> +
>                 for (i = 0; i < 4; i++) {
>                         if (!so->stride[i])
>                                 continue;
>
> +                       LLVMValueRef offset = lp_build_const_int32(gallivm,
> +                                                                  SI_VS_STREAMOUT_BUF0 + i);
> +
> +                       so_buffers[i] = build_indexed_load_const(ctx, buf_ptr, offset);
> +
>                         LLVMValueRef so_offset = LLVMGetParam(ctx->main_fn,
>                                                               ctx->param_streamout_offset[i]);
>                         so_offset = LLVMBuildMul(builder, so_offset, LLVMConstInt(ctx->i32, 4, 0), "");
>
>                         so_write_offset[i] = LLVMBuildMul(builder, so_write_index,
>                                                           LLVMConstInt(ctx->i32, so->stride[i]*4, 0), "");
>                         so_write_offset[i] = LLVMBuildAdd(builder, so_write_offset[i], so_offset, "");
>                 }
>
>                 /* Write streamout data. */
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list