softpipe: fix sp_get_dims() for PIPE_BUFFER
authorBrian Paul <brianp@vmware.com>
Thu, 10 Jul 2014 15:37:39 +0000 (09:37 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 10 Jul 2014 16:59:40 +0000 (10:59 -0600)
Before, we were checking the level against view->u.tex.last_level but
level is not valid for buffers.  Plus, the aliasing of the view->u.tex
view->u.buf members (a union) caused the level checking arithmetic to
be totally wrong.  The net effect is we always returned early for
PIPE_BUFFER size queries.

This fixes the piglit "textureSize 140 fs samplerBuffer" test.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/drivers/softpipe/sp_tex_sample.c

index 8565a01822a31c8e9636b8114e1f673bd9264dc4..2d597664013174a04da3d4595cce06353ac7b365 100644 (file)
@@ -2907,14 +2907,21 @@ sp_get_dims(struct sp_sampler_view *sp_sview, int level,
    const struct pipe_sampler_view *view = &sp_sview->base;
    const struct pipe_resource *texture = view->texture;
 
+   if (texture->target == PIPE_BUFFER) {
+      dims[0] = (view->u.buf.last_element - view->u.buf.first_element) + 1;
+      /* the other values are undefined, but let's avoid potential valgrind
+       * warnings.
+       */
+      dims[1] = dims[2] = dims[3] = 0;
+      return;
+   }
+
    /* undefined according to EXT_gpu_program */
    level += view->u.tex.first_level;
    if (level > view->u.tex.last_level)
       return;
 
-   if (texture->target != PIPE_BUFFER)
-      dims[3] = view->u.tex.last_level - view->u.tex.first_level + 1;
-
+   dims[3] = view->u.tex.last_level - view->u.tex.first_level + 1;
    dims[0] = u_minify(texture->width0, level);
 
    switch(texture->target) {
@@ -2939,9 +2946,6 @@ sp_get_dims(struct sp_sampler_view *sp_sview, int level,
       dims[1] = u_minify(texture->height0, level);
       dims[2] = (view->u.tex.last_layer - view->u.tex.first_layer + 1) / 6;
       break;
-   case PIPE_BUFFER:
-      dims[0] /= util_format_get_blocksize(view->format);
-      return;
    default:
       assert(!"unexpected texture target in sp_get_dims()");
       return;