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

Roland Scheidegger sroland at vmware.com
Wed May 13 11:10:40 PDT 2015


Am 13.05.2015 um 16:32 schrieb Brian Paul:
> 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?
I can put it into some util helper and use it in softpipe too.
(The whole reason I put it there is to catch errors like in the 1/3
patch of the series - this caused very weird failures from crashes to
misrenderings in about 50 tests but without seemingly any connection to
texture_view just spread out all over piglit...). Though actually now
that I think about it is in the wrong place, it should be in sampler
view creation. I'll redo that.

Roland


> 
> 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