nouveau: Map correct mip level when using the shadow (nv30, nv40).
[mesa.git] / src / gallium / drivers / nv40 / nv40_screen.c
index 25c786829614e46b99c30798dccfad7f67cf8950..ab128fecda7bedda6ff919508b6c8055febf2a97 100644 (file)
@@ -59,6 +59,8 @@ nv40_screen_get_param(struct pipe_screen *pscreen, int param)
        case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
        case PIPE_CAP_TEXTURE_MIRROR_REPEAT:
                return 1;
+       case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
+               return 0; /* We have 4 - but unsupported currently */
        case NOUVEAU_CAP_HW_VTXBUF:
                return 1;
        case NOUVEAU_CAP_HW_IDXBUF:
@@ -146,19 +148,21 @@ nv40_surface_map(struct pipe_screen *screen, struct pipe_surface *surface,
 
                if (!mt->shadow_tex) {
                        unsigned old_tex_usage = surface->texture->tex_usage;
-                       surface->texture->tex_usage = NOUVEAU_TEXTURE_USAGE_LINEAR;
+                       surface->texture->tex_usage = NOUVEAU_TEXTURE_USAGE_LINEAR |
+                                                     PIPE_TEXTURE_USAGE_DYNAMIC;
                        mt->shadow_tex = screen->texture_create(screen, surface->texture);
                        surface->texture->tex_usage = old_tex_usage;
 
                        assert(mt->shadow_tex->tex_usage & NOUVEAU_TEXTURE_USAGE_LINEAR);
-                       mt->shadow_surface = screen->get_tex_surface
-                       (
-                               screen, mt->shadow_tex,
-                               surface->face, surface->level, surface->zslice,
-                               surface->usage
-                       );
                }
 
+               mt->shadow_surface = screen->get_tex_surface
+               (
+                       screen, mt->shadow_tex,
+                       surface->face, surface->level, surface->zslice,
+                       surface->usage
+               );
+
                surface_to_map = mt->shadow_surface;
        }
        else