summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2009-08-19 18:47:58 +0100
committerJosé Fonseca <jfonseca@vmware.com>2009-08-29 09:21:35 +0100
commitb9f2f01315646c3af92e64152f51a593b65a5ac7 (patch)
tree550276b749241326686cf8d46b7b455e13b11eaf
parent7643da88a31e64d637303d4c57176b6e23137582 (diff)
llvmpipe: Hack to force the line/point rasterization also fit the blend function expectations.
-rw-r--r--src/gallium/drivers/llvmpipe/lp_setup.c58
1 files changed, 42 insertions, 16 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index d45b34f360..84e1963c44 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -167,22 +167,6 @@ 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 )
-{
- quad_clip( setup, quad );
-
- if (quad->inout.mask) {
- struct llvmpipe_context *lp = setup->llvmpipe;
-
- lp->quad.first->run( lp->quad.first, &quad, 1 );
- }
-}
-
-
/**
* Given an X or Y coordinate, return the block/quad coordinate that it
@@ -200,6 +184,48 @@ static INLINE int block_x( int x )
/**
+ * Emit a quad (pass to next stage) with clipping.
+ */
+static INLINE void
+clip_emit_quad( struct setup_context *setup, struct quad_header *quad )
+{
+ quad_clip( setup, quad );
+
+ if (quad->inout.mask) {
+ struct llvmpipe_context *lp = setup->llvmpipe;
+
+#if 1
+ /* XXX: The blender expects 4 quads. This is far from efficient, but
+ * until we codegenerate single-quad variants of the fragment pipeline
+ * we need this hack. */
+ const unsigned nr_quads = TILE_VECTOR_HEIGHT*TILE_VECTOR_WIDTH/QUAD_SIZE;
+ struct quad_header quads[nr_quads];
+ struct quad_header *quad_ptrs[nr_quads];
+ int x0 = block_x(quad->input.x0);
+ unsigned i;
+
+ for(i = 0; i < nr_quads; ++i) {
+ int x = x0 + 2*i;
+ if(x == quad->input.x0)
+ memcpy(&quads[i], quad, sizeof quads[i]);
+ else {
+ memset(&quads[i], 0, sizeof quads[i]);
+ quads[i].input.x0 = x;
+ quads[i].input.y0 = quad->input.y0;
+ quads[i].coef = quad->coef;
+ }
+ quad_ptrs[i] = &quads[i];
+ }
+
+ lp->quad.first->run( lp->quad.first, quad_ptrs, nr_quads );
+#else
+ lp->quad.first->run( lp->quad.first, &quad, 1 );
+#endif
+ }
+}
+
+
+/**
* Render a horizontal span of quads
*/
static void flush_spans( struct setup_context *setup )