svga: fix min/max lod clamping
authorBrian Paul <brianp@vmware.com>
Wed, 18 Jan 2012 17:06:42 +0000 (10:06 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 18 Jan 2012 17:44:05 +0000 (10:44 -0700)
The interaction between the mipmap lod min/max limits and the texture
base/max level limits is kind of tricky.  Changing the base level
didn't work as expected before.

NOTE: This is a candidate for the 8.0 branch.

Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/drivers/svga/svga_state_tss.c

index 3015a446fe299fbbd75e5c1882d79bf9fe5b5bd4..8eb0dbf47088115f5050aa7b4886e813a6629112 100644 (file)
@@ -82,12 +82,14 @@ update_tss_binding(struct svga_context *svga,
       const struct svga_sampler_state *s = svga->curr.sampler[i];
       struct svga_hw_view_state *view = &svga->state.hw_draw.views[i];
       struct pipe_resource *texture = NULL;
+      struct pipe_sampler_view *sv = svga->curr.sampler_views[i];
 
       /* get min max lod */
-      if (svga->curr.sampler_views[i]) {
-         min_lod = MAX2(s->view_min_lod, 0);
-         max_lod = MIN2(s->view_max_lod, svga->curr.sampler_views[i]->texture->last_level);
-         texture = svga->curr.sampler_views[i]->texture;
+      if (sv) {
+         min_lod = MAX2(0, (s->view_min_lod + sv->u.tex.first_level));
+         max_lod = MIN2(s->view_max_lod, sv->texture->last_level);
+         max_lod += sv->u.tex.first_level;
+         texture = sv->texture;
       } else {
          min_lod = 0;
          max_lod = 0;