Merge commit 'origin/gallium-context-transfers-2'
[mesa.git] / src / gallium / drivers / nv50 / nv50_miptree.c
index 9e083b662dd3d08e4dccb52136e4a87f5ae0aec3..e091cae602423023ac2f960805b8336aeedf0db5 100644 (file)
@@ -22,7 +22,8 @@
 
 #include "pipe/p_state.h"
 #include "pipe/p_defines.h"
-#include "pipe/p_inlines.h"
+#include "util/u_inlines.h"
+#include "util/u_format.h"
 
 #include "nv50_context.h"
 
@@ -88,15 +89,26 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
        case PIPE_FORMAT_Z32_FLOAT:
                tile_flags = 0x4800;
                break;
-       case PIPE_FORMAT_Z24S8_UNORM:
+       case PIPE_FORMAT_S8Z24_UNORM:
                tile_flags = 0x1800;
                break;
-       case PIPE_FORMAT_X8Z24_UNORM:
-       case PIPE_FORMAT_S8Z24_UNORM:
+       case PIPE_FORMAT_Z16_UNORM:
+               tile_flags = 0x6c00;
+               break;
+       case PIPE_FORMAT_Z24X8_UNORM:
+       case PIPE_FORMAT_Z24S8_UNORM:
                tile_flags = 0x2800;
                break;
+       case PIPE_FORMAT_R32G32B32A32_FLOAT:
+       case PIPE_FORMAT_R32G32B32_FLOAT:
+               tile_flags = 0x7400;
+               break;
        default:
-               tile_flags = 0x7000;
+               if ((pt->tex_usage & PIPE_TEXTURE_USAGE_SCANOUT) &&
+                   util_format_get_blocksizebits(pt->format) == 32)
+                       tile_flags = 0x7a00;
+               else
+                       tile_flags = 0x7000;
                break;
        }
 
@@ -105,10 +117,10 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
 
        for (l = 0; l <= pt->last_level; l++) {
                struct nv50_miptree_level *lvl = &mt->level[l];
-               unsigned nblocksy = pf_get_nblocksy(pt->format, height);
+               unsigned nblocksy = util_format_get_nblocksy(pt->format, height);
 
                lvl->image_offset = CALLOC(mt->image_nr, sizeof(int));
-               lvl->pitch = align(pf_get_stride(pt->format, width), 64);
+               lvl->pitch = align(util_format_get_stride(pt->format, width), 64);
                lvl->tile_mode = get_tile_mode(nblocksy, depth);
 
                width = u_minify(width, 1);
@@ -130,7 +142,7 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
                        unsigned tile_d = get_tile_depth(lvl->tile_mode);
 
                        size  = lvl->pitch;
-                       size *= align(pf_get_nblocksy(pt->format, u_minify(pt->height0, l)), tile_h);
+                       size *= align(util_format_get_nblocksy(pt->format, u_minify(pt->height0, l)), tile_h);
                        size *= align(u_minify(pt->depth0, l), tile_d);
 
                        lvl->image_offset[i] = mt->total_size;
@@ -144,7 +156,7 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
                                  mt->level[0].tile_mode, tile_flags,
                                  &mt->base.bo);
        if (ret) {
-               for (l = 0; l < pt->last_level; ++l)
+               for (l = 0; l <= pt->last_level; ++l)
                        FREE(mt->level[l].image_offset);
                FREE(mt);
                return NULL;
@@ -187,7 +199,7 @@ nv50_miptree_destroy(struct pipe_texture *pt)
        struct nv50_miptree *mt = nv50_miptree(pt);
        unsigned l;
 
-       for (l = 0; l < pt->last_level; ++l)
+       for (l = 0; l <= pt->last_level; ++l)
                FREE(mt->level[l].image_offset);
 
        nouveau_bo_ref(NULL, &mt->base.bo);
@@ -222,7 +234,7 @@ nv50_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        ps->offset = lvl->image_offset[img];
 
        if (pt->target == PIPE_TEXTURE_3D) {
-               unsigned nb_h = pf_get_nblocksy(pt->format, ps->height);
+               unsigned nb_h = util_format_get_nblocksy(pt->format, ps->height);
                ps->offset += get_zslice_offset(lvl->tile_mode, zslice,
                                                lvl->pitch, nb_h);
        }
@@ -243,9 +255,10 @@ void
 nv50_screen_init_miptree_functions(struct pipe_screen *pscreen)
 {
        pscreen->texture_create = nv50_miptree_create;
-       pscreen->texture_blanket = nv50_miptree_blanket;
        pscreen->texture_destroy = nv50_miptree_destroy;
        pscreen->get_tex_surface = nv50_miptree_surface_new;
        pscreen->tex_surface_destroy = nv50_miptree_surface_del;
+
+       nouveau_screen(pscreen)->texture_blanket = nv50_miptree_blanket;
 }