mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 18:18:06 +02:00
softpipe: rip out old mulithread support
This commit is contained in:
parent
93a026d4ba
commit
6153a1c28f
4 changed files with 57 additions and 305 deletions
|
|
@ -88,19 +88,17 @@ static void softpipe_destroy( struct pipe_context *pipe )
|
|||
if (softpipe->draw)
|
||||
draw_destroy( softpipe->draw );
|
||||
|
||||
for (i = 0; i < SP_NUM_QUAD_THREADS; i++) {
|
||||
softpipe->quad[i].polygon_stipple->destroy( softpipe->quad[i].polygon_stipple );
|
||||
softpipe->quad[i].earlyz->destroy( softpipe->quad[i].earlyz );
|
||||
softpipe->quad[i].shade->destroy( softpipe->quad[i].shade );
|
||||
softpipe->quad[i].alpha_test->destroy( softpipe->quad[i].alpha_test );
|
||||
softpipe->quad[i].depth_test->destroy( softpipe->quad[i].depth_test );
|
||||
softpipe->quad[i].stencil_test->destroy( softpipe->quad[i].stencil_test );
|
||||
softpipe->quad[i].occlusion->destroy( softpipe->quad[i].occlusion );
|
||||
softpipe->quad[i].coverage->destroy( softpipe->quad[i].coverage );
|
||||
softpipe->quad[i].blend->destroy( softpipe->quad[i].blend );
|
||||
softpipe->quad[i].colormask->destroy( softpipe->quad[i].colormask );
|
||||
softpipe->quad[i].output->destroy( softpipe->quad[i].output );
|
||||
}
|
||||
softpipe->quad.polygon_stipple->destroy( softpipe->quad.polygon_stipple );
|
||||
softpipe->quad.earlyz->destroy( softpipe->quad.earlyz );
|
||||
softpipe->quad.shade->destroy( softpipe->quad.shade );
|
||||
softpipe->quad.alpha_test->destroy( softpipe->quad.alpha_test );
|
||||
softpipe->quad.depth_test->destroy( softpipe->quad.depth_test );
|
||||
softpipe->quad.stencil_test->destroy( softpipe->quad.stencil_test );
|
||||
softpipe->quad.occlusion->destroy( softpipe->quad.occlusion );
|
||||
softpipe->quad.coverage->destroy( softpipe->quad.coverage );
|
||||
softpipe->quad.blend->destroy( softpipe->quad.blend );
|
||||
softpipe->quad.colormask->destroy( softpipe->quad.colormask );
|
||||
softpipe->quad.output->destroy( softpipe->quad.output );
|
||||
|
||||
for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++)
|
||||
sp_destroy_tile_cache(softpipe->cbuf_cache[i]);
|
||||
|
|
@ -234,19 +232,17 @@ softpipe_create( struct pipe_screen *screen )
|
|||
|
||||
|
||||
/* setup quad rendering stages */
|
||||
for (i = 0; i < SP_NUM_QUAD_THREADS; i++) {
|
||||
softpipe->quad[i].polygon_stipple = sp_quad_polygon_stipple_stage(softpipe);
|
||||
softpipe->quad[i].earlyz = sp_quad_earlyz_stage(softpipe);
|
||||
softpipe->quad[i].shade = sp_quad_shade_stage(softpipe);
|
||||
softpipe->quad[i].alpha_test = sp_quad_alpha_test_stage(softpipe);
|
||||
softpipe->quad[i].depth_test = sp_quad_depth_test_stage(softpipe);
|
||||
softpipe->quad[i].stencil_test = sp_quad_stencil_test_stage(softpipe);
|
||||
softpipe->quad[i].occlusion = sp_quad_occlusion_stage(softpipe);
|
||||
softpipe->quad[i].coverage = sp_quad_coverage_stage(softpipe);
|
||||
softpipe->quad[i].blend = sp_quad_blend_stage(softpipe);
|
||||
softpipe->quad[i].colormask = sp_quad_colormask_stage(softpipe);
|
||||
softpipe->quad[i].output = sp_quad_output_stage(softpipe);
|
||||
}
|
||||
softpipe->quad.polygon_stipple = sp_quad_polygon_stipple_stage(softpipe);
|
||||
softpipe->quad.earlyz = sp_quad_earlyz_stage(softpipe);
|
||||
softpipe->quad.shade = sp_quad_shade_stage(softpipe);
|
||||
softpipe->quad.alpha_test = sp_quad_alpha_test_stage(softpipe);
|
||||
softpipe->quad.depth_test = sp_quad_depth_test_stage(softpipe);
|
||||
softpipe->quad.stencil_test = sp_quad_stencil_test_stage(softpipe);
|
||||
softpipe->quad.occlusion = sp_quad_occlusion_stage(softpipe);
|
||||
softpipe->quad.coverage = sp_quad_coverage_stage(softpipe);
|
||||
softpipe->quad.blend = sp_quad_blend_stage(softpipe);
|
||||
softpipe->quad.colormask = sp_quad_colormask_stage(softpipe);
|
||||
softpipe->quad.output = sp_quad_output_stage(softpipe);
|
||||
|
||||
/* vertex shader samplers */
|
||||
for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
|
||||
|
|
|
|||
|
|
@ -39,17 +39,6 @@
|
|||
#include "sp_tex_sample.h"
|
||||
|
||||
|
||||
/**
|
||||
* This is a temporary variable for testing draw-stage polygon stipple.
|
||||
* If zero, do stipple in sp_quad_stipple.c
|
||||
*/
|
||||
#define USE_DRAW_STAGE_PSTIPPLE 1
|
||||
|
||||
/* Number of threads working on individual quads.
|
||||
* Setting to 1 disables this feature.
|
||||
*/
|
||||
#define SP_NUM_QUAD_THREADS 1
|
||||
|
||||
struct softpipe_vbuf_render;
|
||||
struct draw_context;
|
||||
struct draw_stage;
|
||||
|
|
@ -129,7 +118,7 @@ struct softpipe_context {
|
|||
struct quad_stage *output;
|
||||
|
||||
struct quad_stage *first; /**< points to one of the above stages */
|
||||
} quad[SP_NUM_QUAD_THREADS];
|
||||
} quad;
|
||||
|
||||
/** TGSI exec things */
|
||||
struct {
|
||||
|
|
|
|||
|
|
@ -31,35 +31,29 @@
|
|||
#include "pipe/p_shader_tokens.h"
|
||||
|
||||
static void
|
||||
sp_push_quad_first(
|
||||
struct softpipe_context *sp,
|
||||
struct quad_stage *quad,
|
||||
uint i )
|
||||
sp_push_quad_first( struct softpipe_context *sp,
|
||||
struct quad_stage *quad )
|
||||
{
|
||||
quad->next = sp->quad[i].first;
|
||||
sp->quad[i].first = quad;
|
||||
quad->next = sp->quad.first;
|
||||
sp->quad.first = quad;
|
||||
}
|
||||
|
||||
static void
|
||||
sp_build_depth_stencil(
|
||||
struct softpipe_context *sp,
|
||||
uint i )
|
||||
sp_build_depth_stencil( struct softpipe_context *sp )
|
||||
{
|
||||
if (sp->depth_stencil->stencil[0].enabled ||
|
||||
sp->depth_stencil->stencil[1].enabled) {
|
||||
sp_push_quad_first( sp, sp->quad[i].stencil_test, i );
|
||||
sp_push_quad_first( sp, sp->quad.stencil_test );
|
||||
}
|
||||
else if (sp->depth_stencil->depth.enabled &&
|
||||
sp->framebuffer.zsbuf) {
|
||||
sp_push_quad_first( sp, sp->quad[i].depth_test, i );
|
||||
sp_push_quad_first( sp, sp->quad.depth_test );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
sp_build_quad_pipeline(struct softpipe_context *sp)
|
||||
{
|
||||
uint i;
|
||||
|
||||
boolean early_depth_test =
|
||||
sp->depth_stencil->depth.enabled &&
|
||||
sp->framebuffer.zsbuf &&
|
||||
|
|
@ -68,51 +62,43 @@ sp_build_quad_pipeline(struct softpipe_context *sp)
|
|||
!sp->fs->info.writes_z;
|
||||
|
||||
/* build up the pipeline in reverse order... */
|
||||
for (i = 0; i < SP_NUM_QUAD_THREADS; i++) {
|
||||
sp->quad[i].first = sp->quad[i].output;
|
||||
sp->quad.first = sp->quad.output;
|
||||
|
||||
if (sp->blend->colormask != 0xf) {
|
||||
sp_push_quad_first( sp, sp->quad[i].colormask, i );
|
||||
sp_push_quad_first( sp, sp->quad.colormask );
|
||||
}
|
||||
|
||||
if (sp->blend->blend_enable ||
|
||||
sp->blend->logicop_enable) {
|
||||
sp_push_quad_first( sp, sp->quad[i].blend, i );
|
||||
sp_push_quad_first( sp, sp->quad.blend );
|
||||
}
|
||||
|
||||
if (sp->active_query_count) {
|
||||
sp_push_quad_first( sp, sp->quad[i].occlusion, i );
|
||||
sp_push_quad_first( sp, sp->quad.occlusion );
|
||||
}
|
||||
|
||||
if (sp->rasterizer->poly_smooth ||
|
||||
sp->rasterizer->line_smooth ||
|
||||
sp->rasterizer->point_smooth) {
|
||||
sp_push_quad_first( sp, sp->quad[i].coverage, i );
|
||||
sp_push_quad_first( sp, sp->quad.coverage );
|
||||
}
|
||||
|
||||
if (!early_depth_test) {
|
||||
sp_build_depth_stencil( sp, i );
|
||||
sp_build_depth_stencil( sp );
|
||||
}
|
||||
|
||||
if (sp->depth_stencil->alpha.enabled) {
|
||||
sp_push_quad_first( sp, sp->quad[i].alpha_test, i );
|
||||
sp_push_quad_first( sp, sp->quad.alpha_test );
|
||||
}
|
||||
|
||||
/* XXX always enable shader? */
|
||||
if (1) {
|
||||
sp_push_quad_first( sp, sp->quad[i].shade, i );
|
||||
sp_push_quad_first( sp, sp->quad.shade );
|
||||
}
|
||||
|
||||
if (early_depth_test) {
|
||||
sp_build_depth_stencil( sp, i );
|
||||
sp_push_quad_first( sp, sp->quad[i].earlyz, i );
|
||||
sp_build_depth_stencil( sp );
|
||||
sp_push_quad_first( sp, sp->quad.earlyz );
|
||||
}
|
||||
|
||||
#if !USE_DRAW_STAGE_PSTIPPLE
|
||||
if (sp->rasterizer->poly_stipple_enable) {
|
||||
sp_push_quad_first( sp, sp->quad[i].polygon_stipple, i );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,87 +61,7 @@ struct edge {
|
|||
int lines; /**< number of lines on this edge */
|
||||
};
|
||||
|
||||
#if SP_NUM_QUAD_THREADS > 1
|
||||
|
||||
/* Set to 1 if you want other threads to be instantly
|
||||
* notified of pending jobs.
|
||||
*/
|
||||
#define INSTANT_NOTEMPTY_NOTIFY 0
|
||||
|
||||
struct thread_info
|
||||
{
|
||||
struct setup_context *setup;
|
||||
uint id;
|
||||
pipe_thread handle;
|
||||
};
|
||||
|
||||
struct quad_job;
|
||||
|
||||
typedef void (* quad_job_routine)( struct setup_context *setup, uint thread, struct quad_job *job );
|
||||
|
||||
struct quad_job
|
||||
{
|
||||
struct quad_header_input input;
|
||||
struct quad_header_inout inout;
|
||||
quad_job_routine routine;
|
||||
};
|
||||
|
||||
#define NUM_QUAD_JOBS 64
|
||||
|
||||
struct quad_job_que
|
||||
{
|
||||
struct quad_job jobs[NUM_QUAD_JOBS];
|
||||
uint first;
|
||||
uint last;
|
||||
pipe_mutex que_mutex;
|
||||
pipe_condvar que_notfull_condvar;
|
||||
pipe_condvar que_notempty_condvar;
|
||||
uint jobs_added;
|
||||
uint jobs_done;
|
||||
pipe_condvar que_done_condvar;
|
||||
};
|
||||
|
||||
static void
|
||||
add_quad_job( struct quad_job_que *que, struct quad_header *quad, quad_job_routine routine )
|
||||
{
|
||||
#if INSTANT_NOTEMPTY_NOTIFY
|
||||
boolean empty;
|
||||
#endif
|
||||
|
||||
/* Wait for empty slot, see if the que is empty.
|
||||
*/
|
||||
pipe_mutex_lock( que->que_mutex );
|
||||
while ((que->last + 1) % NUM_QUAD_JOBS == que->first) {
|
||||
#if !INSTANT_NOTEMPTY_NOTIFY
|
||||
pipe_condvar_broadcast( que->que_notempty_condvar );
|
||||
#endif
|
||||
pipe_condvar_wait( que->que_notfull_condvar, que->que_mutex );
|
||||
}
|
||||
#if INSTANT_NOTEMPTY_NOTIFY
|
||||
empty = que->last == que->first;
|
||||
#endif
|
||||
que->jobs_added++;
|
||||
pipe_mutex_unlock( que->que_mutex );
|
||||
|
||||
/* Submit new job.
|
||||
*/
|
||||
que->jobs[que->last].input = quad->input;
|
||||
que->jobs[que->last].inout = quad->inout;
|
||||
que->jobs[que->last].routine = routine;
|
||||
que->last = (que->last + 1) % NUM_QUAD_JOBS;
|
||||
|
||||
#if INSTANT_NOTEMPTY_NOTIFY
|
||||
/* If the que was empty, notify consumers there's a job to be done.
|
||||
*/
|
||||
if (empty) {
|
||||
pipe_mutex_lock( que->que_mutex );
|
||||
pipe_condvar_broadcast( que->que_notempty_condvar );
|
||||
pipe_mutex_unlock( que->que_mutex );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Triangle setup info (derived from draw_stage).
|
||||
|
|
@ -169,11 +89,6 @@ struct setup_context {
|
|||
struct tgsi_interp_coef posCoef; /* For Z, W */
|
||||
struct quad_header quad;
|
||||
|
||||
#if SP_NUM_QUAD_THREADS > 1
|
||||
struct quad_job_que que;
|
||||
struct thread_info threads[SP_NUM_QUAD_THREADS];
|
||||
#endif
|
||||
|
||||
struct {
|
||||
int left[2]; /**< [0] = row0, [1] = row1 */
|
||||
int right[2];
|
||||
|
|
@ -188,67 +103,6 @@ struct setup_context {
|
|||
unsigned winding; /* which winding to cull */
|
||||
};
|
||||
|
||||
#if SP_NUM_QUAD_THREADS > 1
|
||||
|
||||
static PIPE_THREAD_ROUTINE( quad_thread, param )
|
||||
{
|
||||
struct thread_info *info = (struct thread_info *) param;
|
||||
struct quad_job_que *que = &info->setup->que;
|
||||
|
||||
for (;;) {
|
||||
struct quad_job job;
|
||||
boolean full;
|
||||
|
||||
/* Wait for an available job.
|
||||
*/
|
||||
pipe_mutex_lock( que->que_mutex );
|
||||
while (que->last == que->first)
|
||||
pipe_condvar_wait( que->que_notempty_condvar, que->que_mutex );
|
||||
|
||||
/* See if the que is full.
|
||||
*/
|
||||
full = (que->last + 1) % NUM_QUAD_JOBS == que->first;
|
||||
|
||||
/* Take a job and remove it from que.
|
||||
*/
|
||||
job = que->jobs[que->first];
|
||||
que->first = (que->first + 1) % NUM_QUAD_JOBS;
|
||||
|
||||
/* Notify the producer if the que is not full.
|
||||
*/
|
||||
if (full)
|
||||
pipe_condvar_signal( que->que_notfull_condvar );
|
||||
pipe_mutex_unlock( que->que_mutex );
|
||||
|
||||
job.routine( info->setup, info->id, &job );
|
||||
|
||||
/* Notify the producer if that's the last finished job.
|
||||
*/
|
||||
pipe_mutex_lock( que->que_mutex );
|
||||
que->jobs_done++;
|
||||
if (que->jobs_added == que->jobs_done)
|
||||
pipe_condvar_signal( que->que_done_condvar );
|
||||
pipe_mutex_unlock( que->que_mutex );
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define WAIT_FOR_COMPLETION(setup) \
|
||||
do {\
|
||||
pipe_mutex_lock( setup->que.que_mutex );\
|
||||
if (!INSTANT_NOTEMPTY_NOTIFY)\
|
||||
pipe_condvar_broadcast( setup->que.que_notempty_condvar );\
|
||||
while (setup->que.jobs_added != setup->que.jobs_done)\
|
||||
pipe_condvar_wait( setup->que.que_done_condvar, setup->que.que_mutex );\
|
||||
pipe_mutex_unlock( setup->que.que_mutex );\
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
|
||||
#define WAIT_FOR_COMPLETION(setup) ((void) 0)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
|
@ -311,39 +165,17 @@ quad_clip( struct setup_context *setup, struct quad_header *quad )
|
|||
* Emit a quad (pass to next stage) with clipping.
|
||||
*/
|
||||
static INLINE void
|
||||
clip_emit_quad( struct setup_context *setup, struct quad_header *quad, uint thread )
|
||||
clip_emit_quad( struct setup_context *setup, struct quad_header *quad )
|
||||
{
|
||||
quad_clip( setup, quad );
|
||||
|
||||
if (quad->inout.mask) {
|
||||
struct softpipe_context *sp = setup->softpipe;
|
||||
|
||||
sp->quad[thread].first->run( sp->quad[thread].first, quad );
|
||||
sp->quad.first->run( sp->quad.first, quad );
|
||||
}
|
||||
}
|
||||
|
||||
#if SP_NUM_QUAD_THREADS > 1
|
||||
|
||||
static void
|
||||
clip_emit_quad_job( struct setup_context *setup, uint thread, struct quad_job *job )
|
||||
{
|
||||
struct quad_header quad;
|
||||
|
||||
quad.input = job->input;
|
||||
quad.inout = job->inout;
|
||||
quad.coef = setup->quad.coef;
|
||||
quad.posCoef = setup->quad.posCoef;
|
||||
quad.nr_attrs = setup->quad.nr_attrs;
|
||||
clip_emit_quad( setup, &quad, thread );
|
||||
}
|
||||
|
||||
#define CLIP_EMIT_QUAD(setup) add_quad_job( &setup->que, &setup->quad, clip_emit_quad_job )
|
||||
|
||||
#else
|
||||
|
||||
#define CLIP_EMIT_QUAD(setup) clip_emit_quad( setup, &setup->quad, 0 )
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Emit a quad (pass to next stage). No clipping is done.
|
||||
*/
|
||||
|
|
@ -361,7 +193,7 @@ emit_quad( struct setup_context *setup, struct quad_header *quad, uint thread )
|
|||
if (mask & 4) setup->numFragsEmitted++;
|
||||
if (mask & 8) setup->numFragsEmitted++;
|
||||
#endif
|
||||
sp->quad[thread].first->run( sp->quad[thread].first, quad );
|
||||
sp->quad.first->run( sp->quad.first, quad );
|
||||
#if DEBUG_FRAGS
|
||||
mask = quad->inout.mask;
|
||||
if (mask & 1) setup->numFragsWritten++;
|
||||
|
|
@ -371,38 +203,15 @@ emit_quad( struct setup_context *setup, struct quad_header *quad, uint thread )
|
|||
#endif
|
||||
}
|
||||
|
||||
#if SP_NUM_QUAD_THREADS > 1
|
||||
|
||||
static void
|
||||
emit_quad_job( struct setup_context *setup, uint thread, struct quad_job *job )
|
||||
{
|
||||
struct quad_header quad;
|
||||
#define EMIT_QUAD(setup,x,y,qmask) \
|
||||
do { \
|
||||
setup->quad.input.x0 = x; \
|
||||
setup->quad.input.y0 = y; \
|
||||
setup->quad.inout.mask = qmask; \
|
||||
emit_quad( setup, &setup->quad, 0 ); \
|
||||
} while (0)
|
||||
|
||||
quad.input = job->input;
|
||||
quad.inout = job->inout;
|
||||
quad.coef = setup->quad.coef;
|
||||
quad.posCoef = setup->quad.posCoef;
|
||||
quad.nr_attrs = setup->quad.nr_attrs;
|
||||
emit_quad( setup, &quad, thread );
|
||||
}
|
||||
|
||||
#define EMIT_QUAD(setup,x,y,qmask) do {\
|
||||
setup->quad.input.x0 = x;\
|
||||
setup->quad.input.y0 = y;\
|
||||
setup->quad.inout.mask = qmask;\
|
||||
add_quad_job( &setup->que, &setup->quad, emit_quad_job );\
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
|
||||
#define EMIT_QUAD(setup,x,y,qmask) do {\
|
||||
setup->quad.input.x0 = x;\
|
||||
setup->quad.input.y0 = y;\
|
||||
setup->quad.inout.mask = qmask;\
|
||||
emit_quad( setup, &setup->quad, 0 );\
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Given an X or Y coordinate, return the block/quad coordinate that it
|
||||
|
|
@ -956,8 +765,6 @@ void setup_tri( struct setup_context *setup,
|
|||
|
||||
flush_spans( setup );
|
||||
|
||||
WAIT_FOR_COMPLETION(setup);
|
||||
|
||||
#if DEBUG_FRAGS
|
||||
printf("Tri: %u frags emitted, %u written\n",
|
||||
setup->numFragsEmitted,
|
||||
|
|
@ -1101,7 +908,7 @@ plot(struct setup_context *setup, int x, int y)
|
|||
/* flush prev quad, start new quad */
|
||||
|
||||
if (setup->quad.input.x0 != -1)
|
||||
CLIP_EMIT_QUAD(setup);
|
||||
clip_emit_quad( setup, &setup->quad );
|
||||
|
||||
setup->quad.input.x0 = quadX;
|
||||
setup->quad.input.y0 = quadY;
|
||||
|
|
@ -1223,10 +1030,8 @@ setup_line(struct setup_context *setup,
|
|||
|
||||
/* draw final quad */
|
||||
if (setup->quad.inout.mask) {
|
||||
CLIP_EMIT_QUAD(setup);
|
||||
clip_emit_quad( setup, &setup->quad );
|
||||
}
|
||||
|
||||
WAIT_FOR_COMPLETION(setup);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1334,7 +1139,7 @@ setup_point( struct setup_context *setup,
|
|||
setup->quad.input.x0 = (int) x - ix;
|
||||
setup->quad.input.y0 = (int) y - iy;
|
||||
setup->quad.inout.mask = (1 << ix) << (2 * iy);
|
||||
CLIP_EMIT_QUAD(setup);
|
||||
clip_emit_quad( setup, &setup->quad );
|
||||
}
|
||||
else {
|
||||
if (round) {
|
||||
|
|
@ -1395,7 +1200,7 @@ setup_point( struct setup_context *setup,
|
|||
if (setup->quad.inout.mask) {
|
||||
setup->quad.input.x0 = ix;
|
||||
setup->quad.input.y0 = iy;
|
||||
CLIP_EMIT_QUAD(setup);
|
||||
clip_emit_quad( setup, &setup->quad );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1442,19 +1247,16 @@ setup_point( struct setup_context *setup,
|
|||
setup->quad.inout.mask = mask;
|
||||
setup->quad.input.x0 = ix;
|
||||
setup->quad.input.y0 = iy;
|
||||
CLIP_EMIT_QUAD(setup);
|
||||
clip_emit_quad( setup, &setup->quad );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WAIT_FOR_COMPLETION(setup);
|
||||
}
|
||||
|
||||
void setup_prepare( struct setup_context *setup )
|
||||
{
|
||||
struct softpipe_context *sp = setup->softpipe;
|
||||
unsigned i;
|
||||
|
||||
if (sp->dirty) {
|
||||
softpipe_update_derived(sp);
|
||||
|
|
@ -1463,9 +1265,7 @@ void setup_prepare( struct setup_context *setup )
|
|||
/* Note: nr_attrs is only used for debugging (vertex printing) */
|
||||
setup->quad.nr_attrs = draw_num_vs_outputs(sp->draw);
|
||||
|
||||
for (i = 0; i < SP_NUM_QUAD_THREADS; i++) {
|
||||
sp->quad[i].first->begin( sp->quad[i].first );
|
||||
}
|
||||
sp->quad.first->begin( sp->quad.first );
|
||||
|
||||
if (sp->reduced_api_prim == PIPE_PRIM_TRIANGLES &&
|
||||
sp->rasterizer->fill_cw == PIPE_POLYGON_MODE_FILL &&
|
||||
|
|
@ -1493,9 +1293,6 @@ void setup_destroy_context( struct setup_context *setup )
|
|||
struct setup_context *setup_create_context( struct softpipe_context *softpipe )
|
||||
{
|
||||
struct setup_context *setup = CALLOC_STRUCT(setup_context);
|
||||
#if SP_NUM_QUAD_THREADS > 1
|
||||
uint i;
|
||||
#endif
|
||||
|
||||
setup->softpipe = softpipe;
|
||||
|
||||
|
|
@ -1505,22 +1302,6 @@ struct setup_context *setup_create_context( struct softpipe_context *softpipe )
|
|||
setup->span.left[0] = 1000000; /* greater than right[0] */
|
||||
setup->span.left[1] = 1000000; /* greater than right[1] */
|
||||
|
||||
#if SP_NUM_QUAD_THREADS > 1
|
||||
setup->que.first = 0;
|
||||
setup->que.last = 0;
|
||||
pipe_mutex_init( setup->que.que_mutex );
|
||||
pipe_condvar_init( setup->que.que_notfull_condvar );
|
||||
pipe_condvar_init( setup->que.que_notempty_condvar );
|
||||
setup->que.jobs_added = 0;
|
||||
setup->que.jobs_done = 0;
|
||||
pipe_condvar_init( setup->que.que_done_condvar );
|
||||
for (i = 0; i < SP_NUM_QUAD_THREADS; i++) {
|
||||
setup->threads[i].setup = setup;
|
||||
setup->threads[i].id = i;
|
||||
setup->threads[i].handle = pipe_thread_create( quad_thread, &setup->threads[i] );
|
||||
}
|
||||
#endif
|
||||
|
||||
return setup;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue