#include "util/u_math.h"
#include "util/u_cpu_detect.h"
+#include "lp_bin_queue.h"
#include "lp_debug.h"
#include "lp_state.h"
#include "lp_rast.h"
-struct lp_rasterizer *lp_rast_create( struct pipe_screen *screen )
+/**
+ * Create new lp_rasterizer.
+ * \param empty the queue to put empty bins on after we've finished
+ * processing them.
+ */
+struct lp_rasterizer *
+lp_rast_create( struct pipe_screen *screen, struct lp_bins_queue *empty )
{
struct lp_rasterizer *rast;
unsigned i;
rast->screen = screen;
+ rast->empty_bins = empty;
+ rast->full_bins = lp_bins_queue_create();
+
for (i = 0; i < Elements(rast->tasks); i++) {
rast->tasks[i].tile.color = align_malloc( TILE_SIZE*TILE_SIZE*4, 16 );
rast->tasks[i].tile.depth = align_malloc( TILE_SIZE*TILE_SIZE*4, 16 );
#include "util/u_math.h"
#include "util/u_memory.h"
#include "util/u_pack_color.h"
+#include "lp_bin.h"
+#include "lp_bin_queue.h"
#include "lp_debug.h"
#include "lp_state.h"
#include "lp_buffer.h"
#include "lp_setup_context.h"
+/** XXX temporary value, temporary here */
+#define MAX_BINS 2
+
+
static void set_state( struct setup_context *, unsigned );
lp_bins_destroy(setup->bins);
+ /* free the bins in the 'empty' queue */
+ while (lp_bins_queue_size(setup->empty_bins) > 0) {
+ struct lp_bins *bins = lp_bins_dequeue(setup->empty_bins);
+ if (!bins)
+ break;
+ lp_bins_destroy(bins);
+ }
+
lp_rast_destroy( setup->rast );
FREE( setup );
struct setup_context *
lp_setup_create( struct pipe_screen *screen )
{
+ unsigned i;
struct setup_context *setup = CALLOC_STRUCT(setup_context);
- setup->rast = lp_rast_create( screen );
+ if (!setup)
+ return NULL;
+
+ setup->empty_bins = lp_bins_queue_create();
+ if (!setup->empty_bins)
+ goto fail;
+
+ setup->rast = lp_rast_create( screen, setup->empty_bins );
if (!setup->rast)
goto fail;
setup->bins = lp_bins_create();
+ /* create some empty bins */
+ for (i = 0; i < MAX_BINS; i++) {
+ struct lp_bins *bins = lp_bins_create();
+ lp_bins_enqueue(setup->empty_bins, bins);
+ }
+
setup->triangle = first_triangle;
setup->line = first_line;
setup->point = first_point;
return setup;
fail:
+ if (setup->empty_bins)
+ lp_bins_queue_destroy(setup->empty_bins);
+
FREE(setup);
return NULL;
}
#define LP_SETUP_NEW_BLEND_COLOR 0x04
+struct lp_bins_queue;
+
+
/**
* Point/line/triangle setup context.
* Note: "stored" below indicates data which is stored in the bins,
struct lp_rasterizer *rast;
- struct lp_bins *bins;
+
+ struct lp_bins *bins; /**< current bins */
+ struct lp_bins_queue *empty_bins; /**< queue of empty bins */
boolean ccw_is_frontface;
unsigned cullmode;