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

sroland at vmware.com sroland at vmware.com
Tue May 12 19:36:08 PDT 2015


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
+
          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);
-- 
1.9.1



More information about the mesa-dev mailing list