[Mesa-dev] [PATCH 2/4] i965: Pass gl_program pointers into precompile functions.

Kristian Høgsberg krh at bitplanet.net
Mon Nov 24 07:41:11 PST 2014


On Mon, Nov 24, 2014 at 12:28 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> We'd like to do precompiling for ARB vertex and fragment programs,
> which only have gl_program structures - gl_shader_program is NULL.
>
> This patch makes the various precompile functions take a gl_program
> parameter directly, rather than accessing it via gl_shader_program.

Looks good to me,

Reviewed-by: Kristian Høgsberg <krh at bitplanet.net>

> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/brw_fs.cpp     | 12 +++++-------
>  src/mesa/drivers/dri/i965/brw_fs.h       |  4 +++-
>  src/mesa/drivers/dri/i965/brw_gs.c       | 12 +++++-------
>  src/mesa/drivers/dri/i965/brw_gs.h       |  5 ++++-
>  src/mesa/drivers/dri/i965/brw_shader.cpp | 13 ++++++++-----
>  src/mesa/drivers/dri/i965/brw_vs.c       | 12 +++++-------
>  src/mesa/drivers/dri/i965/brw_vs.h       |  4 +++-
>  7 files changed, 33 insertions(+), 29 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 054ff2c..f3f69c4 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -3749,16 +3749,14 @@ brw_wm_fs_emit(struct brw_context *brw,
>  }
>
>  bool
> -brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
> +brw_fs_precompile(struct gl_context *ctx,
> +                  struct gl_shader_program *shader_prog,
> +                  struct gl_program *prog)
>  {
>     struct brw_context *brw = brw_context(ctx);
>     struct brw_wm_prog_key key;
>
> -   if (!prog->_LinkedShaders[MESA_SHADER_FRAGMENT])
> -      return true;
> -
> -   struct gl_fragment_program *fp = (struct gl_fragment_program *)
> -      prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program;
> +   struct gl_fragment_program *fp = (struct gl_fragment_program *) prog;
>     struct brw_fragment_program *bfp = brw_fragment_program(fp);
>     bool program_uses_dfdy = fp->UsesDFdy;
>
> @@ -3816,7 +3814,7 @@ brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
>     uint32_t old_prog_offset = brw->wm.base.prog_offset;
>     struct brw_wm_prog_data *old_prog_data = brw->wm.prog_data;
>
> -   bool success = do_wm_prog(brw, prog, bfp, &key);
> +   bool success = do_wm_prog(brw, shader_prog, bfp, &key);
>
>     brw->wm.base.prog_offset = old_prog_offset;
>     brw->wm.prog_data = old_prog_data;
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
> index d4f663d..f558662 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -797,6 +797,8 @@ private:
>
>  bool brw_do_channel_expressions(struct exec_list *instructions);
>  bool brw_do_vector_splitting(struct exec_list *instructions);
> -bool brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog);
> +bool brw_fs_precompile(struct gl_context *ctx,
> +                       struct gl_shader_program *shader_prog,
> +                       struct gl_program *prog);
>
>  struct brw_reg brw_reg_from_fs_reg(fs_reg *reg);
> diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
> index f44ac26..d51500e 100644
> --- a/src/mesa/drivers/dri/i965/brw_gs.c
> +++ b/src/mesa/drivers/dri/i965/brw_gs.c
> @@ -374,7 +374,9 @@ const struct brw_tracked_state brw_gs_prog = {
>
>
>  bool
> -brw_gs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
> +brw_gs_precompile(struct gl_context *ctx,
> +                  struct gl_shader_program *shader_prog,
> +                  struct gl_program *prog)
>  {
>     struct brw_context *brw = brw_context(ctx);
>     struct brw_gs_prog_key key;
> @@ -382,11 +384,7 @@ brw_gs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
>     struct brw_gs_prog_data *old_prog_data = brw->gs.prog_data;
>     bool success;
>
> -   if (!prog->_LinkedShaders[MESA_SHADER_GEOMETRY])
> -      return true;
> -
> -   struct gl_geometry_program *gp = (struct gl_geometry_program *)
> -      prog->_LinkedShaders[MESA_SHADER_GEOMETRY]->Program;
> +   struct gl_geometry_program *gp = (struct gl_geometry_program *) prog;
>     struct brw_geometry_program *bgp = brw_geometry_program(gp);
>
>     memset(&key, 0, sizeof(key));
> @@ -398,7 +396,7 @@ brw_gs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
>      */
>     key.input_varyings = gp->Base.InputsRead;
>
> -   success = do_gs_prog(brw, prog, bgp, &key);
> +   success = do_gs_prog(brw, shader_prog, bgp, &key);
>
>     brw->gs.base.prog_offset = old_prog_offset;
>     brw->gs.prog_data = old_prog_data;
> diff --git a/src/mesa/drivers/dri/i965/brw_gs.h b/src/mesa/drivers/dri/i965/brw_gs.h
> index 5d4244e..85228eb 100644
> --- a/src/mesa/drivers/dri/i965/brw_gs.h
> +++ b/src/mesa/drivers/dri/i965/brw_gs.h
> @@ -32,8 +32,11 @@ extern "C" {
>
>  struct gl_context;
>  struct gl_shader_program;
> +struct gl_program;
>
> -bool brw_gs_precompile(struct gl_context *ctx, struct gl_shader_program *prog);
> +bool brw_gs_precompile(struct gl_context *ctx,
> +                       struct gl_shader_program *shader_prog,
> +                       struct gl_program *prog);
>  bool brw_gs_prog_data_compare(const void *a, const void *b);
>
>  #ifdef __cplusplus
> diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp
> index 78db484..6a14932 100644
> --- a/src/mesa/drivers/dri/i965/brw_shader.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp
> @@ -55,17 +55,20 @@ brw_new_shader(struct gl_context *ctx, GLuint name, GLuint type)
>   * the eventual NOS used, and thus allows us to produce link failures.
>   */
>  static bool
> -brw_shader_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
> +brw_shader_precompile(struct gl_context *ctx,
> +                      struct gl_shader_program *sh_prog)
>  {
> -   struct brw_context *brw = brw_context(ctx);
> +   struct gl_shader *vs = sh_prog->_LinkedShaders[MESA_SHADER_VERTEX];
> +   struct gl_shader *gs = sh_prog->_LinkedShaders[MESA_SHADER_GEOMETRY];
> +   struct gl_shader *fs = sh_prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
>
> -   if (!brw_fs_precompile(ctx, prog))
> +   if (fs && !brw_fs_precompile(ctx, sh_prog, fs->Program))
>        return false;
>
> -   if (!brw_gs_precompile(ctx, prog))
> +   if (gs && !brw_gs_precompile(ctx, sh_prog, gs->Program))
>        return false;
>
> -   if (!brw_vs_precompile(ctx, prog))
> +   if (vs && !brw_vs_precompile(ctx, sh_prog, vs->Program))
>        return false;
>
>     return true;
> diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
> index edaa82c..bab72cb 100644
> --- a/src/mesa/drivers/dri/i965/brw_vs.c
> +++ b/src/mesa/drivers/dri/i965/brw_vs.c
> @@ -523,7 +523,9 @@ const struct brw_tracked_state brw_vs_prog = {
>  };
>
>  bool
> -brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
> +brw_vs_precompile(struct gl_context *ctx,
> +                  struct gl_shader_program *shader_prog,
> +                  struct gl_program *prog)
>  {
>     struct brw_context *brw = brw_context(ctx);
>     struct brw_vs_prog_key key;
> @@ -531,18 +533,14 @@ brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
>     struct brw_vs_prog_data *old_prog_data = brw->vs.prog_data;
>     bool success;
>
> -   if (!prog->_LinkedShaders[MESA_SHADER_VERTEX])
> -      return true;
> -
> -   struct gl_vertex_program *vp = (struct gl_vertex_program *)
> -      prog->_LinkedShaders[MESA_SHADER_VERTEX]->Program;
> +   struct gl_vertex_program *vp = (struct gl_vertex_program *) prog;
>     struct brw_vertex_program *bvp = brw_vertex_program(vp);
>
>     memset(&key, 0, sizeof(key));
>
>     brw_vec4_setup_prog_key_for_precompile(ctx, &key.base, bvp->id, &vp->Base);
>
> -   success = do_vs_prog(brw, prog, bvp, &key);
> +   success = do_vs_prog(brw, shader_prog, bvp, &key);
>
>     brw->vs.base.prog_offset = old_prog_offset;
>     brw->vs.prog_data = old_prog_data;
> diff --git a/src/mesa/drivers/dri/i965/brw_vs.h b/src/mesa/drivers/dri/i965/brw_vs.h
> index 97308a7..77792d9 100644
> --- a/src/mesa/drivers/dri/i965/brw_vs.h
> +++ b/src/mesa/drivers/dri/i965/brw_vs.h
> @@ -89,7 +89,9 @@ const unsigned *brw_vs_emit(struct brw_context *brw,
>                              struct brw_vs_prog_data *prog_data,
>                              void *mem_ctx,
>                              unsigned *program_size);
> -bool brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *prog);
> +bool brw_vs_precompile(struct gl_context *ctx,
> +                       struct gl_shader_program *shader_prog,
> +                       struct gl_program *prog);
>  void brw_vs_debug_recompile(struct brw_context *brw,
>                              struct gl_shader_program *prog,
>                              const struct brw_vs_prog_key *key);
> --
> 2.1.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list