From: Marek Olšák <marek.ol...@amd.com> cleanup --- src/gallium/drivers/radeonsi/si_shader.c | 12 +++++------- src/gallium/drivers/radeonsi/si_shader.h | 1 + src/gallium/drivers/radeonsi/si_state_shaders.c | 4 ++++ 3 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 0bda187..6242ec1 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -7512,21 +7512,21 @@ int si_compile_tgsi_shader(struct si_screen *sscreen, if (!si_compile_tgsi_main(&ctx, shader)) { si_llvm_dispose(&ctx); return -1; } if (is_monolithic && ctx.type == PIPE_SHADER_VERTEX) { LLVMValueRef parts[3]; bool need_prolog; bool need_epilog; - need_prolog = sel->info.num_inputs; + need_prolog = sel->vs_needs_prolog; need_epilog = !shader->key.as_es && !shader->key.as_ls; parts[need_prolog ? 1 : 0] = ctx.main_fn; if (need_prolog) { union si_shader_part_key prolog_key; si_get_vs_prolog_key(shader, &prolog_key); si_build_vs_prolog_function(&ctx, &prolog_key); parts[0] = ctx.main_fn; } @@ -7965,28 +7965,26 @@ static bool si_get_vs_epilog(struct si_screen *sscreen, } /** * Select and compile (or reuse) vertex shader parts (prolog & epilog). */ static bool si_shader_select_vs_parts(struct si_screen *sscreen, LLVMTargetMachineRef tm, struct si_shader *shader, struct pipe_debug_callback *debug) { - struct tgsi_shader_info *info = &shader->selector->info; - union si_shader_part_key prolog_key; + if (shader->selector->vs_needs_prolog) { + union si_shader_part_key prolog_key; - /* Get the prolog. */ - si_get_vs_prolog_key(shader, &prolog_key); + /* Get the prolog. */ + si_get_vs_prolog_key(shader, &prolog_key); - /* The prolog is a no-op if there are no inputs. */ - if (info->num_inputs) { shader->prolog = si_get_shader_part(sscreen, &sscreen->vs_prologs, PIPE_SHADER_VERTEX, true, &prolog_key, tm, debug, si_build_vs_prolog_function, "Vertex Shader Prolog"); if (!shader->prolog) return false; } diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index f145eab..cfa691b 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -291,20 +291,21 @@ struct si_shader_selector { struct si_shader *main_shader_part_es; /* as_es is set in the key */ struct si_shader *gs_copy_shader; struct tgsi_token *tokens; struct pipe_stream_output_info so; struct tgsi_shader_info info; /* PIPE_SHADER_[VERTEX|FRAGMENT|...] */ unsigned type; + bool vs_needs_prolog; /* GS parameters. */ unsigned esgs_itemsize; unsigned gs_input_verts_per_prim; unsigned gs_output_prim; unsigned gs_max_out_vertices; unsigned gs_num_invocations; unsigned max_gs_stream; /* count - 1 */ unsigned gsvs_vertex_size; unsigned max_gsvs_emit_size; diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index b856fc9..075c9c5 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -1602,20 +1602,24 @@ static void *si_create_shader_selector(struct pipe_context *ctx, if (!sel->tokens) { FREE(sel); return NULL; } sel->so = state->stream_output; tgsi_scan_shader(state->tokens, &sel->info); sel->type = sel->info.processor; p_atomic_inc(&sscreen->b.num_shaders_created); + /* The prolog is a no-op if there are no inputs. */ + sel->vs_needs_prolog = sel->type == PIPE_SHADER_VERTEX && + sel->info.num_inputs; + /* Set which opcode uses which (i,j) pair. */ if (sel->info.uses_persp_opcode_interp_centroid) sel->info.uses_persp_centroid = true; if (sel->info.uses_linear_opcode_interp_centroid) sel->info.uses_linear_centroid = true; if (sel->info.uses_persp_opcode_interp_offset || sel->info.uses_persp_opcode_interp_sample) sel->info.uses_persp_center = true; -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev