[Mesa-dev] [PATCH v2 05/20] gallium/cso: add support for compute shaders

Ilia Mirkin imirkin at alum.mit.edu
Sat Feb 6 23:28:51 UTC 2016


I believe that the previous suggestion was that cso didn't need to
know anything about compute shaders... just call the functions
directly.

On Sat, Feb 6, 2016 at 5:04 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> Changes from v2:
>  - removed cso_{save,restore}_compute_shader() functions and the
>    compute_shader_saved variable because disabling compute shaders for
>    meta ops is not currently needed
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu> (v1)
> ---
>  src/gallium/auxiliary/cso_cache/cso_context.c | 30 +++++++++++++++++++++++++++
>  src/gallium/auxiliary/cso_cache/cso_context.h |  4 ++++
>  2 files changed, 34 insertions(+)
>
> diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c
> index 6b29b20..79ae753 100644
> --- a/src/gallium/auxiliary/cso_cache/cso_context.c
> +++ b/src/gallium/auxiliary/cso_cache/cso_context.c
> @@ -69,6 +69,7 @@ struct cso_context {
>
>     boolean has_geometry_shader;
>     boolean has_tessellation;
> +   boolean has_compute_shader;
>     boolean has_streamout;
>
>     struct pipe_sampler_view *fragment_views[PIPE_MAX_SHADER_SAMPLER_VIEWS];
> @@ -106,6 +107,7 @@ struct cso_context {
>     void *geometry_shader, *geometry_shader_saved;
>     void *tessctrl_shader, *tessctrl_shader_saved;
>     void *tesseval_shader, *tesseval_shader_saved;
> +   void *compute_shader;
>     void *velements, *velements_saved;
>     struct pipe_query *render_condition, *render_condition_saved;
>     uint render_condition_mode, render_condition_mode_saved;
> @@ -272,6 +274,10 @@ struct cso_context *cso_create_context( struct pipe_context *pipe )
>                                  PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) {
>        ctx->has_tessellation = TRUE;
>     }
> +   if (pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_COMPUTE,
> +                                      PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) {
> +      ctx->has_compute_shader = TRUE;
> +   }
>     if (pipe->screen->get_param(pipe->screen,
>                                 PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) != 0) {
>        ctx->has_streamout = TRUE;
> @@ -333,6 +339,10 @@ void cso_destroy_context( struct cso_context *ctx )
>           ctx->pipe->bind_tes_state(ctx->pipe, NULL);
>           ctx->pipe->set_constant_buffer(ctx->pipe, PIPE_SHADER_TESS_EVAL, 0, NULL);
>        }
> +      if (ctx->has_compute_shader) {
> +         ctx->pipe->bind_compute_state(ctx->pipe, NULL);
> +         ctx->pipe->set_constant_buffer(ctx->pipe, PIPE_SHADER_COMPUTE, 0, NULL);
> +      }
>        ctx->pipe->bind_vertex_elements_state( ctx->pipe, NULL );
>
>        if (ctx->has_streamout)
> @@ -907,6 +917,26 @@ void cso_restore_tesseval_shader(struct cso_context *ctx)
>     ctx->tesseval_shader_saved = NULL;
>  }
>
> +void cso_set_compute_shader_handle(struct cso_context *ctx, void *handle)
> +{
> +   assert(ctx->has_compute_shader || !handle);
> +
> +   if (ctx->has_compute_shader && ctx->compute_shader != handle) {
> +      ctx->compute_shader = handle;
> +      ctx->pipe->bind_compute_state(ctx->pipe, handle);
> +   }
> +}
> +
> +void cso_delete_compute_shader(struct cso_context *ctx, void *handle)
> +{
> +    if (handle == ctx->compute_shader) {
> +      /* unbind before deleting */
> +      ctx->pipe->bind_compute_state(ctx->pipe, NULL);
> +      ctx->compute_shader = NULL;
> +   }
> +   ctx->pipe->delete_compute_state(ctx->pipe, handle);
> +}
> +
>  enum pipe_error
>  cso_set_vertex_elements(struct cso_context *ctx,
>                          unsigned count,
> diff --git a/src/gallium/auxiliary/cso_cache/cso_context.h b/src/gallium/auxiliary/cso_cache/cso_context.h
> index f0a2739..ec9112b 100644
> --- a/src/gallium/auxiliary/cso_cache/cso_context.h
> +++ b/src/gallium/auxiliary/cso_cache/cso_context.h
> @@ -151,6 +151,10 @@ void cso_save_tesseval_shader(struct cso_context *cso);
>  void cso_restore_tesseval_shader(struct cso_context *cso);
>
>
> +void cso_set_compute_shader_handle(struct cso_context *ctx, void *handle);
> +void cso_delete_compute_shader(struct cso_context *ctx, void *handle);
> +
> +
>  void cso_set_framebuffer(struct cso_context *cso,
>                           const struct pipe_framebuffer_state *fb);
>  void cso_save_framebuffer(struct cso_context *cso);
> --
> 2.6.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list