softpipe: Implement texture blankets.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Fri, 4 Jul 2008 15:55:18 +0000 (00:55 +0900)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Fri, 4 Jul 2008 15:55:18 +0000 (00:55 +0900)
src/gallium/drivers/softpipe/sp_texture.c

index 4db045cdc3de8616dd9b296ee1b745bb66b1c060..20ad336b4fa0ee260721a9815e5e6f46cc75e7c5 100644 (file)
@@ -162,6 +162,39 @@ softpipe_texture_create(struct pipe_screen *screen,
 }
 
 
+static struct pipe_texture *
+softpipe_texture_blanket(struct pipe_screen * screen,
+                         const struct pipe_texture *base,
+                         const unsigned *stride,
+                         struct pipe_buffer *buffer)
+{
+   struct softpipe_texture *spt;
+   assert(screen);
+
+   /* Only supports one type */
+   if (base->target != PIPE_TEXTURE_2D ||
+       base->last_level != 0 ||
+       base->depth[0] != 1) {
+      return NULL;
+   }
+
+   spt = CALLOC_STRUCT(softpipe_texture);
+   if (!spt)
+      return NULL;
+
+   spt->base = *base;
+   spt->base.refcount = 1;
+   spt->base.screen = screen;
+   spt->base.nblocksx[0] = pf_get_nblocksx(&spt->base.block, spt->base.width[0]);  
+   spt->base.nblocksy[0] = pf_get_nblocksy(&spt->base.block, spt->base.height[0]);  
+   spt->stride[0] = stride[0];
+
+   pipe_buffer_reference(screen->winsys, &spt->buffer, buffer);
+
+   return &spt->base;
+}
+
+
 static void
 softpipe_texture_release(struct pipe_screen *screen,
                          struct pipe_texture **pt)
@@ -309,6 +342,7 @@ void
 softpipe_init_screen_texture_funcs(struct pipe_screen *screen)
 {
    screen->texture_create = softpipe_texture_create;
+   screen->texture_blanket = softpipe_texture_blanket;
    screen->texture_release = softpipe_texture_release;
 
    screen->get_tex_surface = softpipe_get_tex_surface;