llvmpipe: Grab a ref when the fb is set.
[mesa.git] / src / gallium / drivers / llvmpipe / lp_context.c
index 8341cc1bc11cdec356382afecd490c846b554312..202cb8ef439b5727b6fc4d4854df62ba722184b0 100644 (file)
@@ -42,6 +42,7 @@
 #include "lp_state.h"
 #include "lp_surface.h"
 #include "lp_tile_cache.h"
+#include "lp_tex_cache.h"
 #include "lp_texture.h"
 #include "lp_winsys.h"
 #include "lp_query.h"
 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]);
    }
 
-   lp_tile_cache_map_transfers(lp->zsbuf_cache);
+   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);
+
+   }
 }
 
 
@@ -72,14 +84,18 @@ llvmpipe_unmap_transfers(struct llvmpipe_context *lp)
 {
    uint i;
 
-   for (i = 0; i < lp->framebuffer.nr_cbufs; i++)
-      lp_flush_tile_cache(lp->cbuf_cache[i]);
-   lp_flush_tile_cache(lp->zsbuf_cache);
-
    for (i = 0; i < lp->framebuffer.nr_cbufs; i++) {
       lp_tile_cache_unmap_transfers(lp->cbuf_cache[i]);
    }
-   lp_tile_cache_unmap_transfers(lp->zsbuf_cache);
+
+   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;
+      }
+   }
 }
 
 
@@ -91,26 +107,16 @@ static void llvmpipe_destroy( struct pipe_context *pipe )
    if (llvmpipe->draw)
       draw_destroy( llvmpipe->draw );
 
-   for (i = 0; i < LP_NUM_QUAD_THREADS; i++) {
-      llvmpipe->quad[i].polygon_stipple->destroy( llvmpipe->quad[i].polygon_stipple );
-      llvmpipe->quad[i].earlyz->destroy( llvmpipe->quad[i].earlyz );
-      llvmpipe->quad[i].shade->destroy( llvmpipe->quad[i].shade );
-      llvmpipe->quad[i].alpha_test->destroy( llvmpipe->quad[i].alpha_test );
-      llvmpipe->quad[i].depth_test->destroy( llvmpipe->quad[i].depth_test );
-      llvmpipe->quad[i].stencil_test->destroy( llvmpipe->quad[i].stencil_test );
-      llvmpipe->quad[i].occlusion->destroy( llvmpipe->quad[i].occlusion );
-      llvmpipe->quad[i].coverage->destroy( llvmpipe->quad[i].coverage );
-      llvmpipe->quad[i].blend->destroy( llvmpipe->quad[i].blend );
-      llvmpipe->quad[i].colormask->destroy( llvmpipe->quad[i].colormask );
-      llvmpipe->quad[i].output->destroy( llvmpipe->quad[i].output );
-   }
-
-   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]);
-   lp_destroy_tile_cache(llvmpipe->zsbuf_cache);
+      pipe_surface_reference(&llvmpipe->framebuffer.cbufs[i], NULL);
+   }
+   pipe_surface_reference(&llvmpipe->framebuffer.zsbuf, NULL);
 
-   for (i = 0; i < PIPE_MAX_SAMPLERS; i++)
-      lp_destroy_tile_cache(llvmpipe->tex_cache[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) {
@@ -118,7 +124,7 @@ static void llvmpipe_destroy( struct pipe_context *pipe )
       }
    }
 
-   FREE( llvmpipe );
+   align_free( llvmpipe );
 }
 
 static unsigned int
@@ -140,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;
 }
 
@@ -155,18 +159,16 @@ llvmpipe_is_buffer_referenced( struct pipe_context *pipe,
 struct pipe_context *
 llvmpipe_create( struct pipe_screen *screen )
 {
-   struct llvmpipe_context *llvmpipe = CALLOC_STRUCT(llvmpipe_context);
+   struct llvmpipe_context *llvmpipe;
    uint i;
 
-   util_init_math();
+   llvmpipe = align_malloc(sizeof(struct llvmpipe_context), 16);
+   if (!llvmpipe)
+      return NULL;
 
-#ifdef PIPE_ARCH_X86
-   llvmpipe->use_sse = !debug_get_bool_option( "GALLIUM_NOSSE", FALSE );
-#else
-   llvmpipe->use_sse = FALSE;
-#endif
+   util_init_math();
 
-   llvmpipe->dump_fs = debug_get_bool_option( "GALLIUM_DUMP_FS", FALSE );
+   memset(llvmpipe, 0, sizeof *llvmpipe);
 
    llvmpipe->pipe.winsys = screen->winsys;
    llvmpipe->pipe.screen = screen;
@@ -226,41 +228,26 @@ 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 );
-   llvmpipe->zsbuf_cache = lp_create_tile_cache( screen );
 
    for (i = 0; i < PIPE_MAX_SAMPLERS; i++)
-      llvmpipe->tex_cache[i] = lp_create_tile_cache( screen );
-
-
-   /* setup quad rendering stages */
-   for (i = 0; i < LP_NUM_QUAD_THREADS; i++) {
-      llvmpipe->quad[i].polygon_stipple = lp_quad_polygon_stipple_stage(llvmpipe);
-      llvmpipe->quad[i].earlyz = lp_quad_earlyz_stage(llvmpipe);
-      llvmpipe->quad[i].shade = lp_quad_shade_stage(llvmpipe);
-      llvmpipe->quad[i].alpha_test = lp_quad_alpha_test_stage(llvmpipe);
-      llvmpipe->quad[i].depth_test = lp_quad_depth_test_stage(llvmpipe);
-      llvmpipe->quad[i].stencil_test = lp_quad_stencil_test_stage(llvmpipe);
-      llvmpipe->quad[i].occlusion = lp_quad_occlusion_stage(llvmpipe);
-      llvmpipe->quad[i].coverage = lp_quad_coverage_stage(llvmpipe);
-      llvmpipe->quad[i].blend = lp_quad_blend_stage(llvmpipe);
-      llvmpipe->quad[i].colormask = lp_quad_colormask_stage(llvmpipe);
-      llvmpipe->quad[i].output = lp_quad_output_stage(llvmpipe);
-   }
+      llvmpipe->tex_cache[i] = lp_create_tex_tile_cache( screen );
+
 
    /* vertex shader samplers */
    for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
-      llvmpipe->tgsi.vert_samplers[i].base.get_samples = lp_get_samples_vertex;
+      llvmpipe->tgsi.vert_samplers[i].base.get_samples = lp_get_samples;
+      llvmpipe->tgsi.vert_samplers[i].processor = TGSI_PROCESSOR_VERTEX;
       llvmpipe->tgsi.vert_samplers[i].cache = llvmpipe->tex_cache[i];
       llvmpipe->tgsi.vert_samplers_list[i] = &llvmpipe->tgsi.vert_samplers[i];
    }
 
    /* fragment shader samplers */
    for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
-      llvmpipe->tgsi.frag_samplers[i].base.get_samples = lp_get_samples_fragment;
+      llvmpipe->tgsi.frag_samplers[i].base.get_samples = lp_get_samples;
+      llvmpipe->tgsi.frag_samplers[i].processor = TGSI_PROCESSOR_FRAGMENT;
       llvmpipe->tgsi.frag_samplers[i].cache = llvmpipe->tex_cache[i];
       llvmpipe->tgsi.frag_samplers_list[i] = &llvmpipe->tgsi.frag_samplers[i];
    }