Merge branch 'gallium-0.2' into gallium-winsys-private
[mesa.git] / src / gallium / drivers / nv40 / nv40_miptree.c
index b68967c07fdf4017f06dd7e7bd0177d47e92171d..6ed0d39edff6f6c7c3847452bdf3c69fbdef1532 100644 (file)
@@ -57,6 +57,8 @@ nv40_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
 {
        struct pipe_winsys *ws = pscreen->winsys;
        struct nv40_miptree *mt;
+       unsigned buf_usage = PIPE_BUFFER_USAGE_PIXEL |
+                            NOUVEAU_BUFFER_USAGE_TEXTURE;
 
        mt = MALLOC(sizeof(struct nv40_miptree));
        if (!mt)
@@ -75,25 +77,27 @@ nv40_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
        if (pt->tex_usage & (PIPE_TEXTURE_USAGE_PRIMARY |
                             PIPE_TEXTURE_USAGE_DISPLAY_TARGET))
                mt->base.tex_usage |= NOUVEAU_TEXTURE_USAGE_LINEAR;
+       else
+       if (pt->tex_usage & PIPE_TEXTURE_USAGE_DYNAMIC)
+               mt->base.tex_usage |= NOUVEAU_TEXTURE_USAGE_LINEAR;
        else {
                switch (pt->format) {
                /* TODO: Figure out which formats can be swizzled */
                case PIPE_FORMAT_A8R8G8B8_UNORM:
                case PIPE_FORMAT_X8R8G8B8_UNORM:
-               /* XXX: Re-enable when SIFM size limits are fixed */
-               /*case PIPE_FORMAT_R16_SNORM:*/
+               case PIPE_FORMAT_R16_SNORM:
                        break;
                default:
                        mt->base.tex_usage |= NOUVEAU_TEXTURE_USAGE_LINEAR;
                }
        }
 
+       if (pt->tex_usage & PIPE_TEXTURE_USAGE_DYNAMIC)
+               buf_usage |= PIPE_BUFFER_USAGE_CPU_READ_WRITE;
+
        nv40_miptree_layout(mt);
 
-       mt->buffer = ws->buffer_create(ws, 256,
-                                      PIPE_BUFFER_USAGE_PIXEL |
-                                      NOUVEAU_BUFFER_USAGE_TEXTURE,
-                                      mt->total_size);
+       mt->buffer = ws->_buffer_create(ws, 256, buf_usage, mt->total_size);
        if (!mt->buffer) {
                FREE(mt);
                return NULL;
@@ -151,7 +155,6 @@ nv40_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        ps->usage = flags;
        ps->status = PIPE_SURFACE_STATUS_DEFINED;
        ps->refcount = 1;
-       ps->winsys = pscreen->winsys;
        ps->face = face;
        ps->level = level;
        ps->zslice = zslice;