llvmpipe: Hack to force the line/point rasterization also fit the blend function...
authorJosé Fonseca <jfonseca@vmware.com>
Wed, 19 Aug 2009 17:47:58 +0000 (18:47 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 29 Aug 2009 08:21:35 +0000 (09:21 +0100)
src/gallium/drivers/llvmpipe/lp_setup.c

index d45b34f3603f2499fd0f9acd3582204d90a04461..84e1963c445469261eb846dd031940462dc1afb9 100644 (file)
@@ -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
@@ -199,6 +183,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
  */