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

Roland Scheidegger sroland at vmware.com
Thu Jun 11 17:36:43 PDT 2015


Am 12.06.2015 um 02:02 schrieb Rob Clark:
> On Thu, Jun 11, 2015 at 5:47 PM, Brian Paul <brianp at vmware.com> wrote:
>> 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.
> 
> oh, whoops.. I apparently shouldn't be trying to carry on a
> conversation while preparing patches.. I'll fix this up locally but I
> don't think there is any point to resend unless other review
> comments..
> 
> that said, I've been trying to find a good way to test the draw module
> changes (w/ ST_DEBUG=tgsi to verify resulting shader) with llvmpipe
> (since the hw drivers I have access to don't use draw).. not sure if
> ST_DEBUG=tgsi is only dumping out the shader before draw modifies it?
> Or if I'm just not running the right piglit tests..  suggestions
> welcome

ST_DEBUG=tgsi may indeed be printing out unmodified shaders. You can use
GALLIVM_DEBUG=tgsi which should print out what is actually compiled (at
least for llvmpipe). Not sure how you could print them out for softpipe
- it seems the stages which modify the tokens have their own debug code
for calling tgsi_dump but it's ifdefed out...
But there's probably very few tests actually hitting these paths.

Roland


> BR,
> -R
> 
>> -Brian
>>
> _______________________________________________
> 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