#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);
+
+ }
}
{
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;
+ }
+ }
}
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) {
}
}
- FREE( llvmpipe );
+ align_free( llvmpipe );
}
static unsigned int
return PIPE_REFERENCED_FOR_WRITE;
}
- /* FIXME: we also need to do the same for the texture cache */
-
return PIPE_UNREFERENCED;
}
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;
/*
* 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];
}