llvmpipe: Grab a ref when the fb is set.
[mesa.git] / src / gallium / drivers / llvmpipe / lp_context.c
index b9fd681e73145931cc8c18c188611937b001cb33..202cb8ef439b5727b6fc4d4854df62ba722184b0 100644 (file)
 void
 llvmpipe_map_transfers(struct llvmpipe_context *lp)
 {
+   struct pipe_screen *screen = lp->pipe.screen;
+   struct pipe_surface *zsbuf = lp->framebuffer.zsbuf;
    unsigned i;
 
    for (i = 0; i < lp->framebuffer.nr_cbufs; i++) {
       lp_tile_cache_map_transfers(lp->cbuf_cache[i]);
    }
+
+   if(zsbuf) {
+      if(!lp->zsbuf_transfer)
+         lp->zsbuf_transfer = screen->get_tex_transfer(screen, zsbuf->texture,
+                                                       zsbuf->face, zsbuf->level, zsbuf->zslice,
+                                                       PIPE_TRANSFER_READ_WRITE,
+                                                       0, 0, zsbuf->width, zsbuf->height);
+      if(lp->zsbuf_transfer && !lp->zsbuf_map)
+         lp->zsbuf_map = screen->transfer_map(screen, lp->zsbuf_transfer);
+
+   }
 }
 
 
@@ -74,6 +87,15 @@ llvmpipe_unmap_transfers(struct llvmpipe_context *lp)
    for (i = 0; i < lp->framebuffer.nr_cbufs; i++) {
       lp_tile_cache_unmap_transfers(lp->cbuf_cache[i]);
    }
+
+   if(lp->zsbuf_transfer) {
+      struct pipe_screen *screen = lp->pipe.screen;
+
+      if(lp->zsbuf_map) {
+         screen->transfer_unmap(screen, lp->zsbuf_transfer);
+         lp->zsbuf_map = NULL;
+      }
+   }
 }
 
 
@@ -85,13 +107,16 @@ static void llvmpipe_destroy( struct pipe_context *pipe )
    if (llvmpipe->draw)
       draw_destroy( llvmpipe->draw );
 
-      llvmpipe->quad.shade->destroy( llvmpipe->quad.shade );
-
-   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++)
+   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
       lp_destroy_tile_cache(llvmpipe->cbuf_cache[i]);
+      pipe_surface_reference(&llvmpipe->framebuffer.cbufs[i], NULL);
+   }
+   pipe_surface_reference(&llvmpipe->framebuffer.zsbuf, NULL);
 
-   for (i = 0; i < PIPE_MAX_SAMPLERS; i++)
+   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
       lp_destroy_tex_tile_cache(llvmpipe->tex_cache[i]);
+      pipe_texture_reference(&llvmpipe->texture[i], NULL);
+   }
 
    for (i = 0; i < Elements(llvmpipe->constants); i++) {
       if (llvmpipe->constants[i].buffer) {
@@ -121,8 +146,6 @@ llvmpipe_is_texture_referenced( struct pipe_context *pipe,
          return PIPE_REFERENCED_FOR_WRITE;
    }
    
-   /* FIXME: we also need to do the same for the texture cache */
-   
    return PIPE_UNREFERENCED;
 }
 
@@ -205,7 +228,6 @@ llvmpipe_create( struct pipe_screen *screen )
 
    /*
     * Alloc caches for accessing drawing surfaces and textures.
-    * Must be before quad stage setup!
     */
    for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++)
       llvmpipe->cbuf_cache[i] = lp_create_tile_cache( screen );
@@ -214,9 +236,6 @@ llvmpipe_create( struct pipe_screen *screen )
       llvmpipe->tex_cache[i] = lp_create_tex_tile_cache( screen );
 
 
-   /* setup quad rendering stages */
-      llvmpipe->quad.shade = lp_quad_shade_stage(llvmpipe);
-
    /* vertex shader samplers */
    for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
       llvmpipe->tgsi.vert_samplers[i].base.get_samples = lp_get_samples;