[Mesa-dev] [PATCH 5/7] util/blitter (and friends): generate appropriate SVIEW decls

Brian Paul brianp at vmware.com
Thu Jun 11 14:47:49 PDT 2015


On 06/11/2015 02:38 PM, Rob Clark wrote:
> From: Rob Clark <robclark at freedesktop.org>
>
> Some hardware needs to know the sampler type.  Update the blit related
> shaders to include SVIEW decl.
>
> Signed-off-by: Rob Clark <robclark at freedesktop.org>
> ---
>   src/gallium/auxiliary/util/u_blit.c           | 35 +++++++++---
>   src/gallium/auxiliary/util/u_blitter.c        | 53 +++++++++++++-----
>   src/gallium/auxiliary/util/u_simple_shaders.c | 78 ++++++++++++++++++++-------
>   src/gallium/auxiliary/util/u_simple_shaders.h | 16 +++---
>   src/gallium/auxiliary/util/u_tests.c          |  3 +-
>   src/gallium/tests/trivial/quad-tex.c          |  2 +-
>   6 files changed, 140 insertions(+), 47 deletions(-)
>
> diff --git a/src/gallium/auxiliary/util/u_blit.c b/src/gallium/auxiliary/util/u_blit.c
> index 3f3b5fe..e3f3055 100644
> --- a/src/gallium/auxiliary/util/u_blit.c
> +++ b/src/gallium/auxiliary/util/u_blit.c
> @@ -65,7 +65,7 @@ struct blit_state
>      struct pipe_vertex_element velem[2];
>
>      void *vs;
> -   void *fs[PIPE_MAX_TEXTURE_TYPES][TGSI_WRITEMASK_XYZW + 1];
> +   void *fs[PIPE_MAX_TEXTURE_TYPES][TGSI_WRITEMASK_XYZW + 1][3];
>
>      struct pipe_resource *vbuf;  /**< quad vertices */
>      unsigned vbuf_slot;
> @@ -135,15 +135,17 @@ void
>   util_destroy_blit(struct blit_state *ctx)
>   {
>      struct pipe_context *pipe = ctx->pipe;
> -   unsigned i, j;
> +   unsigned i, j, k;
>
>      if (ctx->vs)
>         pipe->delete_vs_state(pipe, ctx->vs);
>
>      for (i = 0; i < Elements(ctx->fs); i++) {
>         for (j = 0; j < Elements(ctx->fs[i]); j++) {
> -         if (ctx->fs[i][j])
> -            pipe->delete_fs_state(pipe, ctx->fs[i][j]);
> +         for (k = 0; k < Elements(ctx->fs[i][j]); k++) {
> +            if (ctx->fs[i][j][k])
> +               pipe->delete_fs_state(pipe, ctx->fs[i][j][k]);
> +         }
>         }
>      }
>
> @@ -158,18 +160,34 @@ util_destroy_blit(struct blit_state *ctx)
>    */
>   static INLINE void
>   set_fragment_shader(struct blit_state *ctx, uint writemask,
> +                    enum pipe_format format,
>                       enum pipe_texture_target pipe_tex)
>   {
> -   if (!ctx->fs[pipe_tex][writemask]) {
> +   enum tgsi_return_type stype;
> +   unsigned idx;
> +
> +   if (util_format_is_pure_uint(format)) {
> +      stype = TGSI_RETURN_TYPE_UINT;
> +      idx = 0;
> +   } else if (util_format_is_pure_sint(format)) {
> +      stype = TGSI_RETURN_TYPE_SINT;
> +      idx = 1;
> +   } else {
> +      stype = TGSI_RETURN_TYPE_FLOAT;
> +      idx = 2;
> +   }
> +
> +   if (!ctx->fs[pipe_tex][writemask][idx]) {
>         unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(pipe_tex, 0);
>
> -      ctx->fs[pipe_tex][writemask] =
> +      ctx->fs[pipe_tex][writemask][idx] =
>            util_make_fragment_tex_shader_writemask(ctx->pipe, tgsi_tex,
>                                                    TGSI_INTERPOLATE_LINEAR,
> -                                                 writemask);
> +                                                 writemask,
> +                                                 stype);
>      }
>
> -   cso_set_fragment_shader_handle(ctx->cso, ctx->fs[pipe_tex][writemask]);
> +   cso_set_fragment_shader_handle(ctx->cso, ctx->fs[pipe_tex][writemask][idx]);
>   }
>
>
> @@ -571,6 +589,7 @@ util_blit_pixels_tex(struct blit_state *ctx,
>
>      /* shaders */
>      set_fragment_shader(ctx, TGSI_WRITEMASK_XYZW,
> +                       src_sampler_view->format,
>                          src_sampler_view->texture->target);
>      set_vertex_shader(ctx);
>      cso_set_tessctrl_shader_handle(ctx->cso, NULL);
> diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
> index 16bf90f..5dfe2c7 100644
> --- a/src/gallium/auxiliary/util/u_blitter.c
> +++ b/src/gallium/auxiliary/util/u_blitter.c
> @@ -81,6 +81,8 @@ struct blitter_context_priv
>      /* FS which outputs a color from a texture,
>         where the index is PIPE_TEXTURE_* to be sampled. */
>      void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES];
> +   void *fs_texfetch_col_uint[PIPE_MAX_TEXTURE_TYPES];
> +   void *fs_texfetch_col_sint[PIPE_MAX_TEXTURE_TYPES];
>
>      /* FS which outputs a depth from a texture,
>         where the index is PIPE_TEXTURE_* to be sampled. */
> @@ -90,6 +92,8 @@ struct blitter_context_priv
>
>      /* FS which outputs one sample from a multisample texture. */
>      void *fs_texfetch_col_msaa[PIPE_MAX_TEXTURE_TYPES];
> +   void *fs_texfetch_col_msaa_uint[PIPE_MAX_TEXTURE_TYPES];
> +   void *fs_texfetch_col_msaa_sint[PIPE_MAX_TEXTURE_TYPES];
>      void *fs_texfetch_depth_msaa[PIPE_MAX_TEXTURE_TYPES];
>      void *fs_texfetch_depthstencil_msaa[PIPE_MAX_TEXTURE_TYPES];
>      void *fs_texfetch_stencil_msaa[PIPE_MAX_TEXTURE_TYPES];
> @@ -438,6 +442,10 @@ void util_blitter_destroy(struct blitter_context *blitter)
>      for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) {
>         if (ctx->fs_texfetch_col[i])
>            ctx->delete_fs_state(pipe, ctx->fs_texfetch_col[i]);
> +      if (ctx->fs_texfetch_col_sint[i])
> +         ctx->delete_fs_state(pipe, ctx->fs_texfetch_col_sint[i]);
> +      if (ctx->fs_texfetch_col_uint[i])
> +         ctx->delete_fs_state(pipe, ctx->fs_texfetch_col_uint[i]);
>         if (ctx->fs_texfetch_depth[i])
>            ctx->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
>         if (ctx->fs_texfetch_depthstencil[i])
> @@ -447,6 +455,10 @@ void util_blitter_destroy(struct blitter_context *blitter)
>
>         if (ctx->fs_texfetch_col_msaa[i])
>            ctx->delete_fs_state(pipe, ctx->fs_texfetch_col_msaa[i]);
> +      if (ctx->fs_texfetch_col_msaa_sint[i])
> +         ctx->delete_fs_state(pipe, ctx->fs_texfetch_col_msaa_sint[i]);
> +      if (ctx->fs_texfetch_col_msaa_uint[i])
> +         ctx->delete_fs_state(pipe, ctx->fs_texfetch_col_msaa_uint[i]);
>         if (ctx->fs_texfetch_depth_msaa[i])
>            ctx->delete_fs_state(pipe, ctx->fs_texfetch_depth_msaa[i]);
>         if (ctx->fs_texfetch_depthstencil_msaa[i])
> @@ -844,25 +856,29 @@ static void *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx,
>   {
>      struct pipe_context *pipe = ctx->base.pipe;
>      unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(target, src_nr_samples);
> +   enum tgsi_return_type stype;
>
>      assert(target < PIPE_MAX_TEXTURE_TYPES);
>
> +	if (util_format_is_pure_uint(format))
> +		stype = TGSI_RETURN_TYPE_UINT;
> +	else if (util_format_is_pure_sint(format))
> +		stype = TGSI_RETURN_TYPE_SINT;
> +	else
> +		stype = TGSI_RETURN_TYPE_FLOAT;
> +

Need to indent with spaces, not tabs.

-Brian



More information about the mesa-dev mailing list