[Mesa-dev] [PATCH 2/3] llvmpipe: enable ARB_texture_view

Brian Paul brianp at vmware.com
Wed May 13 07:32:54 PDT 2015


On 05/12/2015 08:36 PM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> All the functionality was pretty much there, just not tested.
> Trivially fix up the missing pieces (take target info from view not
> resource), and add some missing bits for cubes.
> Also add some minimal debug validation to detect uninitialized target values
> in the view...
>
> 49 new piglits, 47 pass, 2 fail (both related to fake multisampling,
> not texture_view itself). No other piglit changes.
> ---
>   src/gallium/auxiliary/gallivm/lp_bld_sample.c   |  2 +-
>   src/gallium/drivers/llvmpipe/lp_screen.c        |  3 ++-
>   src/gallium/drivers/llvmpipe/lp_setup.c         | 36 ++++++++++++++++++++++---
>   src/gallium/drivers/llvmpipe/lp_state_sampler.c | 36 ++++++++++++++++++++++---
>   4 files changed, 67 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.c b/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> index 5b22045..4befb3a 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> @@ -113,7 +113,7 @@ lp_sampler_static_texture_state(struct lp_static_texture_state *state,
>      state->swizzle_b         = view->swizzle_b;
>      state->swizzle_a         = view->swizzle_a;
>
> -   state->target            = texture->target;
> +   state->target            = view->target;
>      state->pot_width         = util_is_power_of_two(texture->width0);
>      state->pot_height        = util_is_power_of_two(texture->height0);
>      state->pot_depth         = util_is_power_of_two(texture->depth0);
> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
> index f4ba596..e001e53 100644
> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
> @@ -258,8 +258,9 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>      case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
>         return 1;
>      case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
> -   case PIPE_CAP_SAMPLER_VIEW_TARGET:
>         return 0;
> +   case PIPE_CAP_SAMPLER_VIEW_TARGET:
> +      return 1;
>      case PIPE_CAP_FAKE_SW_MSAA:
>         return 1;
>      case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
> index 96cc77c..4c57fab 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup.c
> @@ -811,6 +811,32 @@ lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
>             */
>            pipe_resource_reference(&setup->fs.current_tex[i], res);
>
> +#ifdef DEBUG
> +            /* this is possibly too lenient */
> +         if (view->target != res->target) {
> +            if (view->target == PIPE_TEXTURE_1D)
> +               assert(res->target == PIPE_TEXTURE_1D_ARRAY);
> +            else if (view->target == PIPE_TEXTURE_1D_ARRAY)
> +               assert(res->target == PIPE_TEXTURE_1D);
> +            else if (view->target == PIPE_TEXTURE_2D)
> +               assert(res->target == PIPE_TEXTURE_2D_ARRAY ||
> +                      res->target == PIPE_TEXTURE_CUBE ||
> +                      res->target == PIPE_TEXTURE_CUBE_ARRAY);
> +            else if (view->target == PIPE_TEXTURE_2D_ARRAY)
> +               assert(res->target == PIPE_TEXTURE_2D ||
> +                      res->target == PIPE_TEXTURE_CUBE ||
> +                      res->target == PIPE_TEXTURE_CUBE_ARRAY);
> +            else if (view->target == PIPE_TEXTURE_CUBE)
> +               assert(res->target == PIPE_TEXTURE_CUBE_ARRAY ||
> +                      res->target == PIPE_TEXTURE_2D_ARRAY);
> +            else if (view->target == PIPE_TEXTURE_CUBE_ARRAY)
> +               assert(res->target == PIPE_TEXTURE_CUBE ||
> +                      res->target == PIPE_TEXTURE_2D_ARRAY);
> +            else
> +               assert(0);
> +         }
> +#endif
> +
>            if (!lp_tex->dt) {
>               /* regular texture - setup array of mipmap level offsets */
>               int j;
> @@ -854,9 +880,10 @@ lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
>                        jit_tex->img_stride[j] = lp_tex->img_stride[j];
>                     }
>
> -                  if (res->target == PIPE_TEXTURE_1D_ARRAY ||
> -                      res->target == PIPE_TEXTURE_2D_ARRAY ||
> -                      res->target == PIPE_TEXTURE_CUBE_ARRAY) {
> +                  if (view->target == PIPE_TEXTURE_1D_ARRAY ||
> +                      view->target == PIPE_TEXTURE_2D_ARRAY ||
> +                      view->target == PIPE_TEXTURE_CUBE ||
> +                      view->target == PIPE_TEXTURE_CUBE_ARRAY) {
>                        /*
>                         * For array textures, we don't have first_layer, instead
>                         * adjust last_layer (stored as depth) plus the mip level offsets
> @@ -868,7 +895,8 @@ lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
>                           jit_tex->mip_offsets[j] += view->u.tex.first_layer *
>                                                      lp_tex->img_stride[j];
>                        }
> -                     if (res->target == PIPE_TEXTURE_CUBE_ARRAY) {
> +                     if (view->target == PIPE_TEXTURE_CUBE ||
> +                         view->target == PIPE_TEXTURE_CUBE_ARRAY) {
>                           assert(jit_tex->depth % 6 == 0);
>                        }
>                        assert(view->u.tex.first_layer <= view->u.tex.last_layer);
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_sampler.c b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> index 21da629..a9d0cd1 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> @@ -228,6 +228,32 @@ prepare_shader_sampling(
>             */
>            pipe_resource_reference(&mapped_tex[i], tex);
>
> +#ifdef DEBUG
> +            /* this is possibly too lenient */
> +         if (view->target != tex->target) {
> +            if (view->target == PIPE_TEXTURE_1D)
> +               assert(tex->target == PIPE_TEXTURE_1D_ARRAY);
> +            else if (view->target == PIPE_TEXTURE_1D_ARRAY)
> +               assert(tex->target == PIPE_TEXTURE_1D);
> +            else if (view->target == PIPE_TEXTURE_2D)
> +               assert(tex->target == PIPE_TEXTURE_2D_ARRAY ||
> +                      tex->target == PIPE_TEXTURE_CUBE ||
> +                      tex->target == PIPE_TEXTURE_CUBE_ARRAY);
> +            else if (view->target == PIPE_TEXTURE_2D_ARRAY)
> +               assert(tex->target == PIPE_TEXTURE_2D ||
> +                      tex->target == PIPE_TEXTURE_CUBE ||
> +                      tex->target == PIPE_TEXTURE_CUBE_ARRAY);
> +            else if (view->target == PIPE_TEXTURE_CUBE)
> +               assert(tex->target == PIPE_TEXTURE_CUBE_ARRAY ||
> +                      tex->target == PIPE_TEXTURE_2D_ARRAY);
> +            else if (view->target == PIPE_TEXTURE_CUBE_ARRAY)
> +               assert(tex->target == PIPE_TEXTURE_CUBE ||
> +                      tex->target == PIPE_TEXTURE_2D_ARRAY);
> +            else
> +               assert(0);
> +         }
> +#endif

How about putting these assertions into a function to avoid duplication 
with the other ones earlier?  Are they also useful for softpipe?

Otherwise,

Reviewed-by: Brian Paul <brianp at vmware.com>


> +
>            if (!lp_tex->dt) {
>               /* regular texture - setup array of mipmap level offsets */
>               struct pipe_resource *res = view->texture;
> @@ -245,15 +271,17 @@ prepare_shader_sampling(
>                     row_stride[j] = lp_tex->row_stride[j];
>                     img_stride[j] = lp_tex->img_stride[j];
>                  }
> -               if (res->target == PIPE_TEXTURE_1D_ARRAY ||
> -                   res->target == PIPE_TEXTURE_2D_ARRAY ||
> -                   res->target == PIPE_TEXTURE_CUBE_ARRAY) {
> +               if (view->target == PIPE_TEXTURE_1D_ARRAY ||
> +                   view->target == PIPE_TEXTURE_2D_ARRAY ||
> +                   view->target == PIPE_TEXTURE_CUBE ||
> +                   view->target == PIPE_TEXTURE_CUBE_ARRAY) {
>                     num_layers = view->u.tex.last_layer - view->u.tex.first_layer + 1;
>                     for (j = first_level; j <= last_level; j++) {
>                        mip_offsets[j] += view->u.tex.first_layer *
>                                          lp_tex->img_stride[j];
>                     }
> -                  if (res->target == PIPE_TEXTURE_CUBE_ARRAY) {
> +                  if (view->target == PIPE_TEXTURE_CUBE ||
> +                      view->target == PIPE_TEXTURE_CUBE_ARRAY) {
>                        assert(num_layers % 6 == 0);
>                     }
>                     assert(view->u.tex.first_layer <= view->u.tex.last_layer);
>



More information about the mesa-dev mailing list