[Mesa-dev] [PATCH 16/18] i965/cs: Support CS program precompile

Kristian Høgsberg krh at bitplanet.net
Mon Mar 16 23:25:22 PDT 2015


On Mon, Mar 16, 2015 at 11:20 PM, Kristian Høgsberg <krh at bitplanet.net> wrote:
> 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

Oops, pressed send too fast: similiar to how brw_fs_precompile does
it.  Or perhaps rename brw_vue_setup_prog_key_for_precompile(), make
it take a struct brw_sampler_prog_key_data and share it across VS, GS,
FS and CS.

>
>> +   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