diff options
Diffstat (limited to 'src/mesa/pipe/cell/spu/tri.c')
-rw-r--r-- | src/mesa/pipe/cell/spu/tri.c | 72 |
1 files changed, 36 insertions, 36 deletions
diff --git a/src/mesa/pipe/cell/spu/tri.c b/src/mesa/pipe/cell/spu/tri.c index 58fca2e34a4..5d4790fe6c7 100644 --- a/src/mesa/pipe/cell/spu/tri.c +++ b/src/mesa/pipe/cell/spu/tri.c @@ -72,8 +72,6 @@ #define PIPE_MAX_SHADER_INPUTS 8 /* XXX temp */ -static int cliprect_minx, cliprect_maxx, cliprect_miny, cliprect_maxy; - #endif @@ -124,6 +122,8 @@ struct setup_stage { float oneoverarea; + int cliprect_minx, cliprect_maxx, cliprect_miny, cliprect_maxy; + #if 0 struct tgsi_interp_coef coef[PIPE_MAX_SHADER_INPUTS]; #else @@ -276,8 +276,8 @@ emit_quad( struct setup_stage *setup, int x, int y, unsigned mask ) sp->quad.first->run(sp->quad.first, &setup->quad); #else /* Cell: "write" quad fragments to the tile by setting prim color */ - int ix = x - cliprect_minx; - int iy = y - cliprect_miny; + int ix = x - setup->cliprect_minx; + int iy = y - setup->cliprect_miny; float colors[4][4]; uint z; @@ -497,6 +497,20 @@ static boolean setup_sort_vertices( struct setup_stage *setup, } } + /* Check if triangle is completely outside the tile bounds */ + if (setup->vmin->data[0][1] > setup->cliprect_maxy) + return FALSE; + if (setup->vmax->data[0][1] < setup->cliprect_miny) + return FALSE; + if (setup->vmin->data[0][0] < setup->cliprect_minx && + setup->vmid->data[0][0] < setup->cliprect_minx && + setup->vmax->data[0][0] < setup->cliprect_minx) + return FALSE; + if (setup->vmin->data[0][0] > setup->cliprect_maxx && + setup->vmid->data[0][0] > setup->cliprect_maxx && + setup->vmax->data[0][0] > setup->cliprect_maxx) + return FALSE; + setup->ebot.dx = setup->vmid->data[0][0] - setup->vmin->data[0][0]; setup->ebot.dy = setup->vmid->data[0][1] - setup->vmin->data[0][1]; setup->emaj.dx = setup->vmax->data[0][0] - setup->vmin->data[0][0]; @@ -733,18 +747,10 @@ static void subtriangle( struct setup_stage *setup, struct edge *eright, unsigned lines ) { -#if 0 - const struct pipe_scissor_state *cliprect = &setup->softpipe->cliprect; - const int minx = (int) cliprect->minx; - const int maxx = (int) cliprect->maxx; - const int miny = (int) cliprect->miny; - const int maxy = (int) cliprect->maxy; -#else - const int minx = cliprect_minx; - const int maxx = cliprect_maxx; - const int miny = cliprect_miny; - const int maxy = cliprect_maxy; -#endif + const int minx = setup->cliprect_minx; + const int maxx = setup->cliprect_maxx; + const int miny = setup->cliprect_miny; + const int maxy = setup->cliprect_maxy; int y, start_y, finish_y; int sy = (int)eleft->sy; @@ -810,25 +816,19 @@ static void subtriangle( struct setup_stage *setup, /** * Do setup for triangle rasterization, then render the triangle. */ -static void setup_tri( -#if 0 - struct draw_stage *stage, -#endif - struct prim_header *prim ) +static void +setup_tri(struct setup_stage *setup, struct prim_header *prim) { -#if 0 - struct setup_stage *setup = setup_stage( stage ); -#else - struct setup_stage ss; - struct setup_stage *setup = &ss; - ss.color = prim->color; -#endif + setup->color = prim->color; /* XXX temporary */ /* _mesa_printf("%s\n", __FUNCTION__ ); */ - setup_sort_vertices( setup, prim ); + if (!setup_sort_vertices( setup, prim )) { + return; /* totally clipped */ + } + setup_tri_coefficients( setup ); setup_tri_edges( setup ); @@ -930,13 +930,13 @@ struct draw_stage *sp_draw_render_stage( struct softpipe_context *softpipe ) void tri_draw(struct prim_header *tri, uint tx, uint ty) { + struct setup_stage setup; + /* set clipping bounds to tile bounds */ - cliprect_minx = tx * TILE_SIZE; - cliprect_miny = ty * TILE_SIZE; - cliprect_maxx = (tx + 1) * TILE_SIZE; - cliprect_maxy = (ty + 1) * TILE_SIZE; + setup.cliprect_minx = tx * TILE_SIZE; + setup.cliprect_miny = ty * TILE_SIZE; + setup.cliprect_maxx = (tx + 1) * TILE_SIZE; + setup.cliprect_maxy = (ty + 1) * TILE_SIZE; - setup_tri(tri); + setup_tri(&setup, tri); } - - |