[Mesa-dev] [PATCH 03/20] radeonsi: add shared memory

Marek Olšák maraeo at gmail.com
Mon Apr 4 13:31:04 UTC 2016


On Sat, Apr 2, 2016 at 3:10 PM, Bas Nieuwenhuizen
<bas at basnieuwenhuizen.nl> wrote:
> Declares the shared memory as a global variable so that
> LLVM is aware of it and it does not conflict with passes
> like AMDGPUPromoteAlloca.
>
> Signed-off-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
> ---
>  src/gallium/drivers/radeon/radeon_llvm.h           |  3 ++
>  .../drivers/radeon/radeon_setup_tgsi_llvm.c        |  4 +++
>  src/gallium/drivers/radeonsi/si_shader.c           | 35 ++++++++++++++++++++++
>  src/gallium/drivers/radeonsi/si_shader.h           |  3 ++
>  4 files changed, 45 insertions(+)
>
> diff --git a/src/gallium/drivers/radeon/radeon_llvm.h b/src/gallium/drivers/radeon/radeon_llvm.h
> index 0a164bb..3e11b36 100644
> --- a/src/gallium/drivers/radeon/radeon_llvm.h
> +++ b/src/gallium/drivers/radeon/radeon_llvm.h
> @@ -68,6 +68,9 @@ struct radeon_llvm_context {
>                         unsigned index,
>                         const struct tgsi_full_declaration *decl);
>
> +       void (*declare_memory_region)(struct radeon_llvm_context *,
> +                       const struct tgsi_full_declaration *decl);
> +
>         /** This array contains the input values for the shader.  Typically these
>           * values will be in the form of a target intrinsic that will inform the
>           * backend how to load the actual inputs to the shader.
> diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
> index fb883cb..5a3b586 100644
> --- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
> +++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
> @@ -366,6 +366,10 @@ static void emit_declaration(
>                 break;
>         }
>
> +       case TGSI_FILE_MEMORY:
> +               if (ctx->declare_memory_region)
> +                       ctx->declare_memory_region(ctx, decl);
> +
>         default:
>                 break;
>         }
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index 2c44b14..2ce37ca 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -121,6 +121,9 @@ struct si_shader_context
>         LLVMTypeRef v4i32;
>         LLVMTypeRef v4f32;
>         LLVMTypeRef v8i32;
> +
> +       unsigned memory_region_count;
> +       LLVMValueRef *memory_regions;
>  };
>
>  static struct si_shader_context *si_shader_context(
> @@ -1320,6 +1323,37 @@ static void declare_system_value(
>         radeon_bld->system_values[index] = value;
>  }
>
> +static void declare_compute_memory(struct radeon_llvm_context *radeon_bld,
> +                                   const struct tgsi_full_declaration *decl)
> +{
> +       struct si_shader_context *ctx =
> +               si_shader_context(&radeon_bld->soa.bld_base);
> +       struct si_shader_selector *sel = ctx->shader->selector;
> +       struct gallivm_state *gallivm = &radeon_bld->gallivm;
> +
> +       LLVMTypeRef i8 = LLVMInt8TypeInContext(gallivm->context);
> +       LLVMTypeRef i8p = LLVMPointerType(i8, LOCAL_ADDR_SPACE);

You can use ctx->i8 here.

Marek


More information about the mesa-dev mailing list