summaryrefslogtreecommitdiff
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorKeith Whitwell <keithw@vmware.com>2009-10-08 12:15:12 +0100
committerKeith Whitwell <keithw@vmware.com>2009-10-08 12:15:12 +0100
commit5e13dfe6181952f0f538a77b8a9f91c1d7601ceb (patch)
tree1a993e6e770641c904abc040230242fe7d87a1f9 /src/gallium/drivers
parente529170c11d3cb5812aabeff0a6ee2d7a2ea66f2 (diff)
llvmpipe: whip out the intra-tile code from lp_setup_tri.c
The "setup" module handles building per-tile display lists. Intra-tile rendering is handled by lp_rast*.c
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/llvmpipe/lp_setup_tri.c326
1 files changed, 33 insertions, 293 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
index d43db7b123..98c87d551f 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
@@ -26,12 +26,10 @@
**************************************************************************/
/*
- * Recursive rasterization for triangles
+ * Binning code for triangles
*/
#include "lp_context.h"
-#include "lp_quad.h"
-#include "lp_quad_pipe.h"
#include "lp_setup.h"
#include "lp_state.h"
#include "draw/draw_context.h"
@@ -42,43 +40,6 @@
#include "util/u_math.h"
#include "util/u_memory.h"
-#define BLOCKSIZE 4
-
-struct triangle {
- /* one-pixel sized trivial accept offsets for each plane */
- float ei1;
- float ei2;
- float ei3;
-
- /* one-pixel sized trivial reject offsets for each plane */
- float eo1;
- float eo2;
- float eo3;
-
- /* y deltas for vertex pairs */
- float dy12;
- float dy23;
- float dy31;
-
- /* x deltas for vertex pairs */
- float dx12;
- float dx23;
- float dx31;
-
- /* Attribute interpolation:
- */
- float oneoverarea;
- float x1;
- float y1;
- struct tgsi_interp_coef coef[PIPE_MAX_SHADER_INPUTS];
- struct tgsi_interp_coef position_coef;
-
- /* A run of pre-initialized quads:
- */
- struct llvmpipe_context *llvmpipe;
- struct quad_header quad[4];
-};
-
/**
* Compute a0 for a constant-valued coefficient (GL_FLAT shading).
@@ -267,163 +228,6 @@ static inline float subpixel_snap( float a )
}
-/* Convert 8x8 block into four runs of quads and render each in turn.
- */
-#if (BLOCKSIZE == 8)
-static void block_full( struct triangle *tri, int x, int y )
-{
- struct quad_header *ptrs[4];
- int i;
-
- tri->quad[0].input.x0 = x + 0;
- tri->quad[1].input.x0 = x + 2;
- tri->quad[2].input.x0 = x + 4;
- tri->quad[3].input.x0 = x + 6;
-
- for (i = 0; i < 4; i++, y += 2) {
- tri->quad[0].inout.mask = 0xf;
- tri->quad[1].inout.mask = 0xf;
- tri->quad[2].inout.mask = 0xf;
- tri->quad[3].inout.mask = 0xf;
-
- tri->quad[0].input.y0 = y;
- tri->quad[1].input.y0 = y;
- tri->quad[2].input.y0 = y;
- tri->quad[3].input.y0 = y;
-
- /* XXX: don't bother with this ptrs business */
- ptrs[0] = &tri->quad[0];
- ptrs[1] = &tri->quad[1];
- ptrs[2] = &tri->quad[2];
- ptrs[3] = &tri->quad[3];
-
- tri->llvmpipe->quad.first->run( tri->llvmpipe->quad.first, ptrs, 4 );
- }
-}
-#elif (BLOCKSIZE == 4)
-static void block_full( struct triangle *tri, int x, int y )
-{
- struct quad_header *ptrs[4];
- int iy;
-
- tri->quad[0].input.x0 = x + 0;
- tri->quad[1].input.x0 = x + 2;
-
- for (iy = 0; iy < 4; iy += 2) {
- tri->quad[0].inout.mask = 0xf;
- tri->quad[1].inout.mask = 0xf;
-
- tri->quad[0].input.y0 = y + iy;
- tri->quad[1].input.y0 = y + iy;
-
- /* XXX: don't bother with this ptrs business */
- ptrs[0] = &tri->quad[0];
- ptrs[1] = &tri->quad[1];
-
- tri->llvmpipe->quad.first->run( tri->llvmpipe->quad.first, ptrs, 2 );
- }
-}
-#else
-static void block_full( struct triangle *tri, int x, int y )
-{
- struct quad_header *ptrs[4];
- int iy;
-
- tri->quad[0].input.x0 = x;
- tri->quad[0].input.y0 = y;
- tri->quad[0].inout.mask = 0xf;
-
- ptrs[0] = &tri->quad[0];
- tri->llvmpipe->quad.first->run( tri->llvmpipe->quad.first, ptrs, 1 );
-}
-#endif
-
-
-static void
-do_quad( struct triangle *tri,
- int x, int y,
- float c1, float c2, float c3 )
-{
- struct quad_header *quad = &tri->quad[0];
-
- float xstep1 = -tri->dy12;
- float xstep2 = -tri->dy23;
- float xstep3 = -tri->dy31;
-
- float ystep1 = tri->dx12;
- float ystep2 = tri->dx23;
- float ystep3 = tri->dx31;
-
- quad->input.x0 = x;
- quad->input.y0 = y;
- quad->inout.mask = 0;
-
- if (c1 > 0 &&
- c2 > 0 &&
- c3 > 0)
- quad->inout.mask |= 1;
-
- if (c1 + xstep1 > 0 &&
- c2 + xstep2 > 0 &&
- c3 + xstep3 > 0)
- quad->inout.mask |= 2;
-
- if (c1 + ystep1 > 0 &&
- c2 + ystep2 > 0 &&
- c3 + ystep3 > 0)
- quad->inout.mask |= 4;
-
- if (c1 + ystep1 + xstep1 > 0 &&
- c2 + ystep2 + xstep2 > 0 &&
- c3 + ystep3 + xstep3 > 0)
- quad->inout.mask |= 8;
-
- if (quad->inout.mask)
- tri->llvmpipe->quad.first->run( tri->llvmpipe->quad.first, &quad, 1 );
-}
-
-/* Evaluate each pixel in a block, generate a mask and possibly render
- * the quad:
- */
-static void
-do_block( struct triangle *tri,
- int x, int y,
- float c1,
- float c2,
- float c3 )
-{
- const int step = 2;
-
- float xstep1 = -step * tri->dy12;
- float xstep2 = -step * tri->dy23;
- float xstep3 = -step * tri->dy31;
-
- float ystep1 = step * tri->dx12;
- float ystep2 = step * tri->dx23;
- float ystep3 = step * tri->dx31;
-
- int ix, iy;
-
- for (iy = 0; iy < BLOCKSIZE; iy += 2) {
- float cx1 = c1;
- float cx2 = c2;
- float cx3 = c3;
-
- for (ix = 0; ix < BLOCKSIZE; ix += 2) {
-
- do_quad(tri, x+ix, y+iy, cx1, cx2, cx3);
-
- cx1 += xstep1;
- cx2 += xstep2;
- cx3 += xstep3;
- }
-
- c1 += ystep1;
- c2 += ystep2;
- c3 += ystep3;
- }
-}
-
@@ -441,14 +245,14 @@ do_block( struct triangle *tri,
#define MAX3(a,b,c) MAX2(MAX2(a,b),c)
static void
-do_triangle_ccw(struct llvmpipe_context *llvmpipe,
+do_triangle_ccw(struct lp_setup *setup,
const float (*v1)[4],
const float (*v2)[4],
const float (*v3)[4],
boolean frontfacing )
{
- const int rt_width = llvmpipe->framebuffer.cbufs[0]->width;
- const int rt_height = llvmpipe->framebuffer.cbufs[0]->height;
+ const int rt_width = setup->framebuffer.cbufs[0]->width;
+ const int rt_height = setup->framebuffer.cbufs[0]->height;
const float y1 = subpixel_snap(v1[0][1]);
const float y2 = subpixel_snap(v2[0][1]);
@@ -458,15 +262,12 @@ do_triangle_ccw(struct llvmpipe_context *llvmpipe,
const float x2 = subpixel_snap(v2[0][0]);
const float x3 = subpixel_snap(v3[0][0]);
- struct triangle tri;
+ struct triangle *tri = allocate_triangle;
float area;
float c1, c2, c3;
int i;
int minx, maxx, miny, maxy;
- tri.llvmpipe = llvmpipe;
-
-
tri.dx12 = x1 - x2;
tri.dx23 = x2 - x3;
tri.dx31 = x3 - x1;
@@ -505,12 +306,7 @@ do_triangle_ccw(struct llvmpipe_context *llvmpipe,
/* Setup parameter interpolants:
*/
- setup_tri_coefficients( llvmpipe, &tri, v1, v2, v3, frontfacing );
-
- for (i = 0; i < Elements(tri.quad); i++) {
- tri.quad[i].coef = tri.coef;
- tri.quad[i].posCoef = &tri.position_coef;
- }
+ setup_tri_coefficients( setup, &tri, v1, v2, v3, frontfacing );
/* half-edge constants, will be interated over the whole
* rendertarget.
@@ -548,73 +344,22 @@ do_triangle_ccw(struct llvmpipe_context *llvmpipe,
tri.ei2 = tri.dx23 - tri.dy23 - tri.eo2;
tri.ei3 = tri.dx31 - tri.dy31 - tri.eo3;
- minx &= ~(BLOCKSIZE-1); /* aligned blocks */
- miny &= ~(BLOCKSIZE-1); /* aligned blocks */
+ minx &= ~(TILESIZE-1); /* aligned blocks */
+ miny &= ~(TILESIZE-1); /* aligned blocks */
c1 += tri.dx12 * miny - tri.dy12 * minx;
c2 += tri.dx23 * miny - tri.dy23 * minx;
c3 += tri.dx31 * miny - tri.dy31 * minx;
- if ((miny & ~15) == (maxy & ~15) &&
- (minx & ~15) == (maxx & ~15))
+ if (miny + TILESIZE > maxy &&
+ minx + TILESIZE > maxx)
{
- const int step = 2;
-
- float xstep1 = -step * tri.dy12;
- float xstep2 = -step * tri.dy23;
- float xstep3 = -step * tri.dy31;
-
- float ystep1 = step * tri.dx12;
- float ystep2 = step * tri.dx23;
- float ystep3 = step * tri.dx31;
-
- float eo1 = tri.eo1 * step;
- float eo2 = tri.eo2 * step;
- float eo3 = tri.eo3 * step;
-
- int x, y;
-
- /* Subdivide space into NxM blocks, where each block is square and
- * power-of-four in dimension.
- *
- * Trivially accept or reject blocks, else jump to per-pixel
- * examination above.
+ /* Triangle is contained in a single tile:
*/
- for (y = miny; y < maxy; y += step)
- {
- float cx1 = c1;
- float cx2 = c2;
- float cx3 = c3;
-
- for (x = minx; x < maxx; x += step)
- {
- if (cx1 + eo1 < 0 ||
- cx2 + eo2 < 0 ||
- cx3 + eo3 < 0)
- {
- }
- else
- {
- do_quad(&tri, x, y, cx1, cx2, cx3);
- }
-
- /* Iterate cx values across the region:
- */
- cx1 += xstep1;
- cx2 += xstep2;
- cx3 += xstep3;
- }
-
- /* Iterate c values down the region:
- */
- c1 += ystep1;
- c2 += ystep2;
- c3 += ystep3;
- }
}
else
{
- const int step = BLOCKSIZE;
+ const int step = TILESIZE;
float ei1 = tri.ei1 * step;
float ei2 = tri.ei2 * step;
@@ -645,7 +390,6 @@ do_triangle_ccw(struct llvmpipe_context *llvmpipe,
float cx1 = c1;
float cx2 = c2;
float cx3 = c3;
- boolean in = false;
for (x = minx; x < maxx; x += step)
{
@@ -654,21 +398,18 @@ do_triangle_ccw(struct llvmpipe_context *llvmpipe,
cx3 + eo3 < 0)
{
/* do nothing */
- if (in)
- break;
}
else if (cx1 + ei1 > 0 &&
cx2 + ei2 > 0 &&
cx3 + ei3 > 0)
{
- in = TRUE;
- block_full(&tri, x, y); /* trivial accept */
+ /* shade whole tile */
+ bin_command(tile[x][y], lp_rast_shade_tile, &tri->inputs );
}
else
{
- in = TRUE;
- // block_full(&tri, x, y); /* trivial accept */
- do_block(&tri, x, y, cx1, cx2, cx3);
+ /* shade partial tile */
+ bin_command(tile[x][y], lp_rast_triangle, &tri );
}
/* Iterate cx values across the region:
@@ -687,23 +428,23 @@ do_triangle_ccw(struct llvmpipe_context *llvmpipe,
}
}
-static void triangle_cw( struct llvmpipe_context *llvmpipe,
+static void triangle_cw( struct setup_context *setup,
const float (*v0)[4],
const float (*v1)[4],
const float (*v2)[4] )
{
- do_triangle_ccw( llvmpipe, v1, v0, v2, !llvmpipe->ccw_is_frontface );
+ do_triangle_ccw( setup, v1, v0, v2, !setup->ccw_is_frontface );
}
-static void triangle_ccw( struct llvmpipe_context *llvmpipe,
+static void triangle_ccw( struct setup_context *setup,
const float (*v0)[4],
const float (*v1)[4],
const float (*v2)[4] )
{
- do_triangle_ccw( llvmpipe, v0, v1, v2, llvmpipe->ccw_is_frontface );
+ do_triangle_ccw( setup, v0, v1, v2, setup->ccw_is_frontface );
}
-static void triangle_both( struct llvmpipe_context *llvmpipe,
+static void triangle_both( struct setup_context *setup,
const float (*v0)[4],
const float (*v1)[4],
const float (*v2)[4] )
@@ -716,38 +457,37 @@ static void triangle_both( struct llvmpipe_context *llvmpipe,
/* det = cross(e,f).z */
if (ex * fy - ey * fx < 0)
- triangle_ccw( llvmpipe, v0, v1, v2 );
+ triangle_ccw( setup, v0, v1, v2 );
else
- triangle_cw( llvmpipe, v0, v1, v2 );
+ triangle_cw( setup, v0, v1, v2 );
}
-static void triangle_nop( struct llvmpipe_context *llvmpipe,
+static void triangle_nop( struct setup_context *setup,
const float (*v0)[4],
const float (*v1)[4],
const float (*v2)[4] )
{
}
-
-
-
-void setup_prepare_tri( struct llvmpipe_context *llvmpipe )
+void setup_prepare_tri( struct setup_context *setup )
{
- llvmpipe->ccw_is_frontface = (llvmpipe->rasterizer->front_winding ==
- PIPE_WINDING_CW);
+ struct llvmpipe_context *llvmpipe = setup->llvmpipe;
+
+ setup->ccw_is_frontface = (llvmpipe->rasterizer->front_winding ==
+ PIPE_WINDING_CW);
switch (llvmpipe->rasterizer->cull_mode) {
case PIPE_WINDING_NONE:
- llvmpipe->triangle = triangle_both;
+ setup->triangle = triangle_both;
break;
case PIPE_WINDING_CCW:
- llvmpipe->triangle = triangle_cw;
+ setup->triangle = triangle_cw;
break;
case PIPE_WINDING_CW:
- llvmpipe->triangle = triangle_ccw;
+ setup->triangle = triangle_ccw;
break;
default:
- llvmpipe->triangle = triangle_nop;
+ setup->triangle = triangle_nop;
break;
}
}