[Mesa-dev] [PATCH 16/18] i965/cs: Support CS program precompile
Kristian Høgsberg
krh at bitplanet.net
Mon Mar 16 23:20:25 PDT 2015
On Sat, Mar 14, 2015 at 9:54 PM, Jordan Justen
<jordan.l.justen at intel.com> wrote:
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> ---
> src/mesa/drivers/dri/i965/brw_context.h | 6 ++++++
> src/mesa/drivers/dri/i965/brw_cs.cpp | 26 ++++++++++++++++++++++++++
> src/mesa/drivers/dri/i965/brw_shader.cpp | 4 ++++
> src/mesa/drivers/dri/i965/brw_shader.h | 3 +++
> 4 files changed, 39 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 170c0c6..27a4ff4 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1844,6 +1844,12 @@ brw_fragment_program_const(const struct gl_fragment_program *p)
> return (const struct brw_fragment_program *) p;
> }
>
> +static inline struct brw_compute_program *
> +brw_compute_program(struct gl_compute_program *p)
> +{
> + return (struct brw_compute_program *) p;
> +}
> +
> /**
> * Pre-gen6, the register file of the EUs was shared between threads,
> * and each thread used some subset allocated on a 16-register block
> diff --git a/src/mesa/drivers/dri/i965/brw_cs.cpp b/src/mesa/drivers/dri/i965/brw_cs.cpp
> index 5be740c..61c35ae 100644
> --- a/src/mesa/drivers/dri/i965/brw_cs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_cs.cpp
> @@ -262,3 +262,29 @@ brw_upload_cs_prog(struct brw_context *brw)
> }
> brw->cs.base.prog_data = &brw->cs.prog_data->base;
> }
> +
> +
> +extern "C" bool
> +brw_cs_precompile(struct gl_context *ctx,
> + struct gl_shader_program *shader_prog,
> + struct gl_program *prog)
> +{
> + struct brw_context *brw = brw_context(ctx);
> + struct brw_cs_prog_key key;
> +
> + struct gl_compute_program *cp = (struct gl_compute_program *) prog;
> + struct brw_compute_program *bcp = brw_compute_program(cp);
> +
> + memset(&key, 0, sizeof(key));
> + key.program_string_id = bcp->id;
This should initialize key.tex.swizzles similar to how brw_fs_comp
> + uint32_t old_prog_offset = brw->cs.base.prog_offset;
> + struct brw_cs_prog_data *old_prog_data = brw->cs.prog_data;
> +
> + bool success = do_cs_prog(brw, shader_prog, bcp, &key);
> +
> + brw->cs.base.prog_offset = old_prog_offset;
> + brw->cs.prog_data = old_prog_data;
> +
> + return success;
> +}
> diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp
> index 499bd94..4392fbc 100644
> --- a/src/mesa/drivers/dri/i965/brw_shader.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp
> @@ -59,6 +59,7 @@ brw_shader_precompile(struct gl_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];
> + struct gl_shader *cs = sh_prog->_LinkedShaders[MESA_SHADER_COMPUTE];
>
> if (fs && !brw_fs_precompile(ctx, sh_prog, fs->Program))
> return false;
> @@ -69,6 +70,9 @@ brw_shader_precompile(struct gl_context *ctx,
> if (vs && !brw_vs_precompile(ctx, sh_prog, vs->Program))
> return false;
>
> + if (cs && !brw_cs_precompile(ctx, sh_prog, cs->Program))
> + return false;
> +
> return true;
> }
>
> diff --git a/src/mesa/drivers/dri/i965/brw_shader.h b/src/mesa/drivers/dri/i965/brw_shader.h
> index 5c95355..53aa727 100644
> --- a/src/mesa/drivers/dri/i965/brw_shader.h
> +++ b/src/mesa/drivers/dri/i965/brw_shader.h
> @@ -230,6 +230,9 @@ bool brw_gs_precompile(struct gl_context *ctx,
> bool brw_fs_precompile(struct gl_context *ctx,
> struct gl_shader_program *shader_prog,
> struct gl_program *prog);
> +bool brw_cs_precompile(struct gl_context *ctx,
> + struct gl_shader_program *shader_prog,
> + struct gl_program *prog);
>
> #ifdef __cplusplus
> }
> --
> 2.1.4
>
> _______________________________________________
> 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