From 6ec6c1581c2963423917ee1598ffb07cab3f2ddc Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Sat, 14 Mar 2015 12:55:54 -0700 Subject: [PATCH] i965/cs: Support CS program precompile Signed-off-by: Jordan Justen Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_context.h | 6 ++++++ src/mesa/drivers/dri/i965/brw_cs.cpp | 28 ++++++++++++++++++++++++++++ src/mesa/drivers/dri/i965/brw_shader.cpp | 4 ++++ src/mesa/drivers/dri/i965/brw_shader.h | 3 +++ 4 files changed, 41 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 10e9543..106b237 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1866,6 +1866,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 1b88fd4..e18685a 100644 --- a/src/mesa/drivers/dri/i965/brw_cs.cpp +++ b/src/mesa/drivers/dri/i965/brw_cs.cpp @@ -254,3 +254,31 @@ 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; + + brw_setup_tex_for_precompile(brw, &key.tex, prog); + + uint32_t old_prog_offset = brw->cs.base.prog_offset; + struct brw_cs_prog_data *old_prog_data = brw->cs.prog_data; + + bool success = brw_codegen_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 157bb32..4fbd8d0 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -73,6 +73,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; @@ -83,6 +84,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 ac4e62a..ebce51d 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.h +++ b/src/mesa/drivers/dri/i965/brw_shader.h @@ -287,6 +287,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.7.4