[Mesa-dev] [PATCH 14/17] st/mesa: add state validation for compute shaders
Marek Olšák
maraeo at gmail.com
Tue Jan 26 03:34:34 PST 2016
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Sun, Jan 24, 2016 at 10:09 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> This binds atomics, constants, samplers, ssbos, textures and ubos.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
> src/mesa/state_tracker/st_atom.c | 6 ++++
> src/mesa/state_tracker/st_atom.h | 5 ++++
> src/mesa/state_tracker/st_atom_atomicbuf.c | 18 +++++++++++
> src/mesa/state_tracker/st_atom_constbuf.c | 46 ++++++++++++++++++++++++++++-
> src/mesa/state_tracker/st_atom_sampler.c | 8 +++++
> src/mesa/state_tracker/st_atom_storagebuf.c | 21 +++++++++++++
> src/mesa/state_tracker/st_atom_texture.c | 26 ++++++++++++++++
> 7 files changed, 129 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/state_tracker/st_atom.c b/src/mesa/state_tracker/st_atom.c
> index 496128e..6822bdc 100644
> --- a/src/mesa/state_tracker/st_atom.c
> +++ b/src/mesa/state_tracker/st_atom.c
> @@ -99,6 +99,12 @@ static const struct st_tracked_state *render_atoms[] =
> static const struct st_tracked_state *compute_atoms[] =
> {
> &st_update_cp,
> + &st_update_compute_texture,
> + &st_update_sampler, /* depends on update_compute_texture for swizzle */
> + &st_update_cs_constants,
> + &st_bind_cs_ubos,
> + &st_bind_cs_atomics,
> + &st_bind_cs_ssbos,
> };
>
>
> diff --git a/src/mesa/state_tracker/st_atom.h b/src/mesa/state_tracker/st_atom.h
> index 2bbc451..8ecca91 100644
> --- a/src/mesa/state_tracker/st_atom.h
> +++ b/src/mesa/state_tracker/st_atom.h
> @@ -71,26 +71,31 @@ extern const struct st_tracked_state st_update_vertex_texture;
> extern const struct st_tracked_state st_update_geometry_texture;
> extern const struct st_tracked_state st_update_tessctrl_texture;
> extern const struct st_tracked_state st_update_tesseval_texture;
> +extern const struct st_tracked_state st_update_compute_texture;
> extern const struct st_tracked_state st_update_fs_constants;
> extern const struct st_tracked_state st_update_gs_constants;
> extern const struct st_tracked_state st_update_tes_constants;
> extern const struct st_tracked_state st_update_tcs_constants;
> extern const struct st_tracked_state st_update_vs_constants;
> +extern const struct st_tracked_state st_update_cs_constants;
> extern const struct st_tracked_state st_bind_fs_ubos;
> extern const struct st_tracked_state st_bind_vs_ubos;
> extern const struct st_tracked_state st_bind_gs_ubos;
> extern const struct st_tracked_state st_bind_tcs_ubos;
> extern const struct st_tracked_state st_bind_tes_ubos;
> +extern const struct st_tracked_state st_bind_cs_ubos;
> extern const struct st_tracked_state st_bind_fs_atomics;
> extern const struct st_tracked_state st_bind_vs_atomics;
> extern const struct st_tracked_state st_bind_gs_atomics;
> extern const struct st_tracked_state st_bind_tcs_atomics;
> extern const struct st_tracked_state st_bind_tes_atomics;
> +extern const struct st_tracked_state st_bind_cs_atomics;
> extern const struct st_tracked_state st_bind_fs_ssbos;
> extern const struct st_tracked_state st_bind_vs_ssbos;
> extern const struct st_tracked_state st_bind_gs_ssbos;
> extern const struct st_tracked_state st_bind_tcs_ssbos;
> extern const struct st_tracked_state st_bind_tes_ssbos;
> +extern const struct st_tracked_state st_bind_cs_ssbos;
> extern const struct st_tracked_state st_update_pixel_transfer;
> extern const struct st_tracked_state st_update_tess;
>
> diff --git a/src/mesa/state_tracker/st_atom_atomicbuf.c b/src/mesa/state_tracker/st_atom_atomicbuf.c
> index 5b8baf5..03498d2 100644
> --- a/src/mesa/state_tracker/st_atom_atomicbuf.c
> +++ b/src/mesa/state_tracker/st_atom_atomicbuf.c
> @@ -156,3 +156,21 @@ const struct st_tracked_state st_bind_tes_atomics = {
> },
> bind_tes_atomics
> };
> +
> +static void
> +bind_cs_atomics(struct st_context *st)
> +{
> + struct gl_shader_program *prog =
> + st->ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
> +
> + st_bind_atomics(st, prog, PIPE_SHADER_COMPUTE);
> +}
> +
> +const struct st_tracked_state st_bind_cs_atomics = {
> + "st_bind_cs_atomics",
> + {
> + 0,
> + ST_NEW_COMPUTE_PROGRAM | ST_NEW_ATOMIC_BUFFER,
> + },
> + bind_cs_atomics
> +};
> diff --git a/src/mesa/state_tracker/st_atom_constbuf.c b/src/mesa/state_tracker/st_atom_constbuf.c
> index 66811d2..407dfd3 100644
> --- a/src/mesa/state_tracker/st_atom_constbuf.c
> +++ b/src/mesa/state_tracker/st_atom_constbuf.c
> @@ -61,7 +61,8 @@ void st_upload_constants( struct st_context *st,
> shader_type == PIPE_SHADER_FRAGMENT ||
> shader_type == PIPE_SHADER_GEOMETRY ||
> shader_type == PIPE_SHADER_TESS_CTRL ||
> - shader_type == PIPE_SHADER_TESS_EVAL);
> + shader_type == PIPE_SHADER_TESS_EVAL ||
> + shader_type == PIPE_SHADER_COMPUTE);
>
> /* update constants */
> if (params && params->NumParameters) {
> @@ -226,6 +227,28 @@ const struct st_tracked_state st_update_tes_constants = {
> update_tes_constants /* update */
> };
>
> +/* Compute shader:
> + */
> +static void update_cs_constants(struct st_context *st )
> +{
> + struct st_compute_program *cp = st->cp;
> + struct gl_program_parameter_list *params;
> +
> + if (cp) {
> + params = cp->Base.Base.Parameters;
> + st_upload_constants( st, params, PIPE_SHADER_COMPUTE );
> + }
> +}
> +
> +const struct st_tracked_state st_update_cs_constants = {
> + "st_update_cs_constants", /* name */
> + { /* dirty */
> + _NEW_PROGRAM_CONSTANTS, /* mesa */
> + ST_NEW_COMPUTE_PROGRAM, /* st */
> + },
> + update_cs_constants /* update */
> +};
> +
> static void st_bind_ubos(struct st_context *st,
> struct gl_shader *shader,
> unsigned shader_type)
> @@ -363,3 +386,24 @@ const struct st_tracked_state st_bind_tes_ubos = {
> },
> bind_tes_ubos
> };
> +
> +static void bind_cs_ubos(struct st_context *st)
> +{
> + struct gl_shader_program *prog =
> + st->ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
> +
> + if (!prog)
> + return;
> +
> + st_bind_ubos(st, prog->_LinkedShaders[MESA_SHADER_COMPUTE],
> + PIPE_SHADER_COMPUTE);
> +}
> +
> +const struct st_tracked_state st_bind_cs_ubos = {
> + "st_bind_cs_ubos",
> + {
> + 0,
> + ST_NEW_COMPUTE_PROGRAM | ST_NEW_UNIFORM_BUFFER,
> + },
> + bind_cs_ubos
> +};
> diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
> index 94231cf..82dcf5e 100644
> --- a/src/mesa/state_tracker/st_atom_sampler.c
> +++ b/src/mesa/state_tracker/st_atom_sampler.c
> @@ -321,6 +321,14 @@ update_samplers(struct st_context *st)
> st->state.samplers[PIPE_SHADER_TESS_EVAL],
> &st->state.num_samplers[PIPE_SHADER_TESS_EVAL]);
> }
> + if (ctx->ComputeProgram._Current) {
> + update_shader_samplers(st,
> + PIPE_SHADER_COMPUTE,
> + &ctx->ComputeProgram._Current->Base,
> + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits,
> + st->state.samplers[PIPE_SHADER_COMPUTE],
> + &st->state.num_samplers[PIPE_SHADER_COMPUTE]);
> + }
> }
>
>
> diff --git a/src/mesa/state_tracker/st_atom_storagebuf.c b/src/mesa/state_tracker/st_atom_storagebuf.c
> index 9f3565c..2d61724 100644
> --- a/src/mesa/state_tracker/st_atom_storagebuf.c
> +++ b/src/mesa/state_tracker/st_atom_storagebuf.c
> @@ -192,3 +192,24 @@ const struct st_tracked_state st_bind_tes_ssbos = {
> },
> bind_tes_ssbos
> };
> +
> +static void bind_cs_ssbos(struct st_context *st)
> +{
> + struct gl_shader_program *prog =
> + st->ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
> +
> + if (!prog)
> + return;
> +
> + st_bind_ssbos(st, prog->_LinkedShaders[MESA_SHADER_COMPUTE],
> + PIPE_SHADER_COMPUTE);
> +}
> +
> +const struct st_tracked_state st_bind_cs_ssbos = {
> + "st_bind_cs_ssbos",
> + {
> + 0,
> + ST_NEW_COMPUTE_PROGRAM | ST_NEW_STORAGE_BUFFER,
> + },
> + bind_cs_ssbos
> +};
> diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
> index 3e37752..b4e6f9b 100644
> --- a/src/mesa/state_tracker/st_atom_texture.c
> +++ b/src/mesa/state_tracker/st_atom_texture.c
> @@ -534,6 +534,22 @@ update_tesseval_textures(struct st_context *st)
> }
>
>
> +static void
> +update_compute_textures(struct st_context *st)
> +{
> + const struct gl_context *ctx = st->ctx;
> +
> + if (ctx->ComputeProgram._Current) {
> + update_textures(st,
> + MESA_SHADER_COMPUTE,
> + &ctx->ComputeProgram._Current->Base,
> + ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits,
> + st->state.sampler_views[PIPE_SHADER_COMPUTE],
> + &st->state.num_sampler_views[PIPE_SHADER_COMPUTE]);
> + }
> +}
> +
> +
> const struct st_tracked_state st_update_fragment_texture = {
> "st_update_texture", /* name */
> { /* dirty */
> @@ -582,3 +598,13 @@ const struct st_tracked_state st_update_tesseval_texture = {
> },
> update_tesseval_textures /* update */
> };
> +
> +
> +const struct st_tracked_state st_update_compute_texture = {
> + "st_update_compute_texture", /* name */
> + { /* dirty */
> + _NEW_TEXTURE, /* mesa */
> + ST_NEW_COMPUTE_PROGRAM | ST_NEW_SAMPLER_VIEWS, /* st */
> + },
> + update_compute_textures /* update */
> +};
> --
> 2.6.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