[Mesa-stable] [PATCH] radeonsi/gfx9: fix crash building monolithic merged ES-GS shader
Marek Olšák
maraeo at gmail.com
Wed Jul 12 14:35:03 UTC 2017
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Wed, Jul 12, 2017 at 3:54 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Forwarding from the ES prolog to the ES just barely exceeds the current
> maximum array size when 16 vertex attributes are used. Give it a decent
> bump to account for merged shaders having up to 32 user SGPRs.
>
> Fixes a crash in GL45-CTS.multi_bind.draw_bind_vertex_buffers.
>
> Cc: mesa-stable at lists.freedesktop.org
> ---
> src/gallium/drivers/radeonsi/si_shader.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index 349e57b..4c0cda5 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -5885,23 +5885,25 @@ static void si_build_gs_prolog_function(struct si_shader_context *ctx,
> * runs them in sequence to form a monolithic shader.
> */
> static void si_build_wrapper_function(struct si_shader_context *ctx,
> LLVMValueRef *parts,
> unsigned num_parts,
> unsigned main_part,
> unsigned next_shader_first_part)
> {
> struct gallivm_state *gallivm = &ctx->gallivm;
> LLVMBuilderRef builder = ctx->gallivm.builder;
> - /* PS epilog has one arg per color component */
> - LLVMTypeRef param_types[48];
> - LLVMValueRef initial[48], out[48];
> + /* PS epilog has one arg per color component; gfx9 merged shader
> + * prologs need to forward 32 user SGPRs.
> + */
> + LLVMTypeRef param_types[64];
> + LLVMValueRef initial[64], out[64];
> LLVMTypeRef function_type;
> unsigned num_params;
> unsigned num_out, initial_num_out;
> MAYBE_UNUSED unsigned num_out_sgpr; /* used in debug checks */
> MAYBE_UNUSED unsigned initial_num_out_sgpr; /* used in debug checks */
> unsigned num_sgprs, num_vgprs;
> unsigned last_sgpr_param;
> unsigned gprs;
> struct lp_build_if_state if_state;
>
> @@ -6107,20 +6109,21 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
>
> if (LLVMGetTypeKind(ret_type) != LLVMVoidTypeKind) {
> assert(LLVMGetTypeKind(ret_type) == LLVMStructTypeKind);
>
> unsigned ret_size = LLVMCountStructElementTypes(ret_type);
>
> for (unsigned i = 0; i < ret_size; ++i) {
> LLVMValueRef val =
> LLVMBuildExtractValue(builder, ret, i, "");
>
> + assert(num_out < ARRAY_SIZE(out));
> out[num_out++] = val;
>
> if (LLVMTypeOf(val) == ctx->i32) {
> assert(num_out_sgpr + 1 == num_out);
> num_out_sgpr = num_out;
> }
> }
> }
> }
>
> --
> 2.9.3
>
> _______________________________________________
> mesa-stable mailing list
> mesa-stable at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-stable
More information about the mesa-stable
mailing list