[Mesa-dev] [PATCH 11/25] radeonsi: first bits for non-monolithic shaders

Nicolai Hähnle nhaehnle at gmail.com
Tue Feb 16 16:01:46 UTC 2016


On 15.02.2016 18:59, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
>   src/gallium/drivers/radeonsi/si_pipe.c   |  1 +
>   src/gallium/drivers/radeonsi/si_pipe.h   |  3 ++
>   src/gallium/drivers/radeonsi/si_shader.c | 53 ++++++++++++++++++++++++--------
>   src/gallium/drivers/radeonsi/si_shader.h |  2 +-
>   4 files changed, 45 insertions(+), 14 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
> index fa60732..448fe88 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -600,6 +600,7 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
>
>   	sscreen->b.has_cp_dma = true;
>   	sscreen->b.has_streamout = true;
> +	sscreen->use_monolithic_shaders = true;
>
>   	if (debug_get_bool_option("RADEON_DUMP_SHADERS", FALSE))
>   		sscreen->b.debug_flags |= DBG_FS | DBG_VS | DBG_GS | DBG_PS | DBG_CS;
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
> index b5790d6..2a2455c 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.h
> +++ b/src/gallium/drivers/radeonsi/si_pipe.h
> @@ -84,6 +84,9 @@ struct si_compute;
>   struct si_screen {
>   	struct r600_common_screen	b;
>   	unsigned			gs_table_depth;
> +
> +	/* Whether shaders are monolithic (1-part) or separate (3-part). */
> +	bool				use_monolithic_shaders;
>   };
>
>   struct si_blend_color {
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index b058019..b74ed1e 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -70,6 +70,12 @@ struct si_shader_context
>
>   	unsigned type; /* TGSI_PROCESSOR_* specifies the type of shader. */
>   	bool is_gs_copy_shader;
> +
> +	/* Whether to generate the optimized shader variant compiled as a whole
> +	 * (without a prolog and epilog)
> +	 */
> +	bool is_monolithic;
> +
>   	int param_streamout_config;
>   	int param_streamout_write_index;
>   	int param_streamout_offset[4];
> @@ -3657,8 +3663,10 @@ static void create_function(struct si_shader_context *ctx)
>   	struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
>   	struct gallivm_state *gallivm = bld_base->base.gallivm;
>   	struct si_shader *shader = ctx->shader;
> -	LLVMTypeRef params[SI_NUM_PARAMS], v2i32, v3i32;
> +	LLVMTypeRef params[SI_NUM_PARAMS + SI_NUM_VERTEX_BUFFERS], v2i32, v3i32;
> +	LLVMTypeRef returns[16+32*4];

This is a bit of a magic number, I guess something like max parameters 
plus attributes. Can you replace it by the appropriate defines?

Apart from this, patches 10-11 are

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

>   	unsigned i, last_array_pointer, last_sgpr, num_params;
> +	unsigned num_returns = 0;
>
>   	v2i32 = LLVMVectorType(ctx->i32, 2);
>   	v3i32 = LLVMVectorType(ctx->i32, 3);
> @@ -3785,7 +3793,7 @@ static void create_function(struct si_shader_context *ctx)
>
>   	assert(num_params <= Elements(params));
>
> -	si_create_function(ctx, NULL, 0, params,
> +	si_create_function(ctx, returns, num_returns, params,
>   			   num_params, last_array_pointer, last_sgpr);
>
>   	shader->num_input_sgprs = 0;
> @@ -4492,9 +4500,11 @@ static void si_init_shader_ctx(struct si_shader_context *ctx,
>   	bld_base->op_actions[TGSI_OPCODE_MIN].intr_name = "llvm.minnum.f32";
>   }
>
> -int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
> -		     struct si_shader *shader,
> -		     struct pipe_debug_callback *debug)
> +static int si_compile_tgsi_shader(struct si_screen *sscreen,
> +				  LLVMTargetMachineRef tm,
> +				  struct si_shader *shader,
> +				  bool is_monolithic,
> +				  struct pipe_debug_callback *debug)
>   {
>   	struct si_shader_selector *sel = shader->selector;
>   	struct tgsi_token *tokens = sel->tokens;
> @@ -4524,6 +4534,7 @@ int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
>
>   	si_init_shader_ctx(&ctx, sscreen, shader, tm,
>   			   poly_stipple ? &stipple_shader_info : &sel->info);
> +	ctx.is_monolithic = is_monolithic;
>
>   	shader->uses_instanceid = sel->info.uses_instanceid;
>
> @@ -4604,14 +4615,6 @@ int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
>   		goto out;
>   	}
>
> -	si_shader_dump(sscreen, shader, debug, ctx.type);
> -
> -	r = si_shader_binary_upload(sscreen, shader);
> -	if (r) {
> -		fprintf(stderr, "LLVM failed to upload shader\n");
> -		goto out;
> -	}
> -
>   	radeon_llvm_dispose(&ctx.radeon_bld);
>
>   	/* Calculate the number of fragment input VGPRs. */
> @@ -4675,6 +4678,30 @@ out:
>   	return r;
>   }
>
> +int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
> +		     struct si_shader *shader,
> +		     struct pipe_debug_callback *debug)
> +{
> +	int r;
> +
> +	/* Compile TGSI. */
> +	r = si_compile_tgsi_shader(sscreen, tm, shader,
> +				   sscreen->use_monolithic_shaders, debug);
> +	if (r)
> +		return r;
> +
> +	si_shader_dump(sscreen, shader, debug, shader->selector->info.processor);
> +
> +	/* Upload. */
> +	r = si_shader_binary_upload(sscreen, shader);
> +	if (r) {
> +		fprintf(stderr, "LLVM failed to upload shader\n");
> +		return r;
> +	}
> +
> +	return 0;
> +}
> +
>   void si_shader_destroy(struct si_shader *shader)
>   {
>   	if (shader->gs_copy_shader) {
> diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
> index 4c3c14a..66b3156 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.h
> +++ b/src/gallium/drivers/radeonsi/si_shader.h
> @@ -363,7 +363,7 @@ static inline bool si_vs_exports_prim_id(struct si_shader *shader)
>   		return false;
>   }
>
> -/* radeonsi_shader.c */
> +/* si_shader.c */
>   int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
>   		     struct si_shader *shader,
>   		     struct pipe_debug_callback *debug);
>


More information about the mesa-dev mailing list