| @@ -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 | |||
| */ | |||