From 0f5cb454e1c06ee642792f29f00112199ece5d59 Mon Sep 17 00:00:00 2001 From: Lepton Wu Date: Wed, 1 Jul 2020 17:20:17 -0700 Subject: [PATCH] shader: Patch shader just after creating it. The plan is to remove the patch step and generate the correct glsl from the beginning. As the first step, just move the patch step to where we create glsl. Signed-off-by: Lepton Wu Reviewed-by: Gert Wollny --- src/vrend_renderer.c | 51 ++++++++++---------------------------------- src/vrend_shader.c | 35 +++++++++++++++++++++++++++++- src/vrend_shader.h | 11 +++------- 3 files changed, 48 insertions(+), 49 deletions(-) diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index e4b8a34..9d46587 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -379,7 +379,7 @@ struct vrend_shader { struct vrend_strarray glsl_strings; GLuint id; - GLuint compiled_fs_id; + uint32_t uid; struct vrend_shader_key key; struct list_head programs; }; @@ -1481,47 +1481,9 @@ static struct vrend_linked_shader_program *add_shader_program(struct vrend_conte GLint lret; int id; int last_shader; - bool do_patch = false; if (!sprog) return NULL; - /* need to rewrite VS code to add interpolation params */ - if (gs && gs->compiled_fs_id != fs->id) - do_patch = true; - if (!gs && tes && tes->compiled_fs_id != fs->id) - do_patch = true; - if (!gs && !tes && vs->compiled_fs_id != fs->id) - do_patch = true; - - if (do_patch) { - bool ret; - - if (gs) - vrend_patch_vertex_shader_interpolants(ctx, &ctx->shader_cfg, &gs->glsl_strings, - &gs->sel->sinfo, - &fs->sel->sinfo, "gso", fs->key.flatshade); - else if (tes) - vrend_patch_vertex_shader_interpolants(ctx, &ctx->shader_cfg, &tes->glsl_strings, - &tes->sel->sinfo, - &fs->sel->sinfo, "teo", fs->key.flatshade); - else - vrend_patch_vertex_shader_interpolants(ctx, &ctx->shader_cfg, &vs->glsl_strings, - &vs->sel->sinfo, - &fs->sel->sinfo, "vso", fs->key.flatshade); - ret = vrend_compile_shader(ctx, gs ? gs : (tes ? tes : vs)); - if (ret == false) { - glDeleteShader(gs ? gs->id : (tes ? tes->id : vs->id)); - free(sprog); - return NULL; - } - if (gs) - gs->compiled_fs_id = fs->id; - else if (tes) - tes->compiled_fs_id = fs->id; - else - vs->compiled_fs_id = fs->id; - } - prog_id = glCreateProgram(); glAttachShader(prog_id, vs->id); if (tcs && tcs->id > 0) @@ -3267,6 +3229,14 @@ static inline void vrend_fill_shader_key(struct vrend_context *ctx, key->num_indirect_patch_outputs = ctx->sub->shaders[next_type]->sinfo.num_indirect_patch_inputs; key->generic_outputs_expected_mask = ctx->sub->shaders[next_type]->sinfo.generic_inputs_emitted_mask; } + + if (type != PIPE_SHADER_FRAGMENT && + ctx->sub->shaders[PIPE_SHADER_FRAGMENT]) { + struct vrend_shader *fs = + ctx->sub->shaders[PIPE_SHADER_FRAGMENT]->current; + key->compiled_fs_uid = fs->uid; + key->fs_info = &fs->sel->sinfo; + } } static inline int conv_shader_type(int type) @@ -3287,9 +3257,10 @@ static int vrend_shader_create(struct vrend_context *ctx, struct vrend_shader *shader, struct vrend_shader_key *key) { + static uint32_t uid; shader->id = glCreateShader(conv_shader_type(shader->sel->type)); - shader->compiled_fs_id = 0; + shader->uid = ++uid; if (shader->sel->tokens) { bool ret = vrend_convert_shader(ctx, &ctx->shader_cfg, shader->sel->tokens, diff --git a/src/vrend_shader.c b/src/vrend_shader.c index ea407d3..c025bb8 100644 --- a/src/vrend_shader.c +++ b/src/vrend_shader.c @@ -6726,6 +6726,14 @@ static void set_strbuffers(MAYBE_UNUSED const struct vrend_context *rctx, struct VREND_DEBUG(dbg_shader_glsl, rctx, "\n"); } +static bool vrend_patch_vertex_shader_interpolants(MAYBE_UNUSED const struct vrend_context *rctx, + const struct vrend_shader_cfg *cfg, + struct vrend_strarray *prog_strings, + const struct vrend_shader_info *vs_info, + const struct vrend_shader_info *fs_info, + const char *oprefix, + bool flatshade); + bool vrend_convert_shader(const struct vrend_context *rctx, const struct vrend_shader_cfg *cfg, const struct tgsi_token *tokens, @@ -6818,6 +6826,31 @@ bool vrend_convert_shader(const struct vrend_context *rctx, fill_sinfo(&ctx, sinfo); set_strbuffers(rctx, &ctx, shader); + if (ctx.prog_type == TGSI_PROCESSOR_GEOMETRY) { + vrend_patch_vertex_shader_interpolants(rctx, + cfg, + shader, + sinfo, + key->fs_info, "gso", + key->flatshade); + } else if (!key->gs_present && + ctx.prog_type == TGSI_PROCESSOR_TESS_EVAL) { + vrend_patch_vertex_shader_interpolants(rctx, + cfg, + shader, + sinfo, + key->fs_info, "teo", + key->flatshade); + } else if (!key->gs_present && !key->tes_present && + ctx.prog_type == TGSI_PROCESSOR_VERTEX) { + vrend_patch_vertex_shader_interpolants(rctx, + cfg, + shader, + sinfo, + key->fs_info, "vso", + key->flatshade); + } + return true; fail: strbuf_free(&ctx.glsl_main); @@ -6866,7 +6899,7 @@ static void require_gpu_shader5_and_msinterp(struct vrend_strarray *program) strbuf_append(&program->strings[SHADER_STRING_VER_EXT], gpu_shader5_and_msinterp_string); } -bool vrend_patch_vertex_shader_interpolants(MAYBE_UNUSED const struct vrend_context *rctx, +static bool vrend_patch_vertex_shader_interpolants(MAYBE_UNUSED const struct vrend_context *rctx, const struct vrend_shader_cfg *cfg, struct vrend_strarray *prog_strings, const struct vrend_shader_info *vs_info, diff --git a/src/vrend_shader.h b/src/vrend_shader.h index 8c94e25..3ec0e84 100644 --- a/src/vrend_shader.h +++ b/src/vrend_shader.h @@ -125,6 +125,9 @@ struct vrend_shader_key { uint32_t generic_outputs_expected_mask; uint8_t fs_swizzle_output_rgb_to_bgr; uint64_t force_invariant_inputs; + + uint32_t compiled_fs_uid; + struct vrend_shader_info *fs_info; }; struct vrend_shader_cfg { @@ -145,14 +148,6 @@ struct vrend_context; #define SHADER_STRING_VER_EXT 0 #define SHADER_STRING_HDR 1 - -bool vrend_patch_vertex_shader_interpolants(const struct vrend_context *rctx, - const struct vrend_shader_cfg *cfg, - struct vrend_strarray *shader, - const struct vrend_shader_info *vs_info, - const struct vrend_shader_info *fs_info, - const char *oprefix, bool flatshade); - bool vrend_convert_shader(const struct vrend_context *rctx, const struct vrend_shader_cfg *cfg, const struct tgsi_token *tokens,