summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/llvmpipe/lp_quad_blend.c
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2009-08-18 14:18:54 +0100
committerJosé Fonseca <jfonseca@vmware.com>2009-08-29 09:21:34 +0100
commitbb867b0ae43deb73eca8cd04eda2a7a12620cdcf (patch)
tree3ff53a9acac2c80176cfee800f72e5c1bd946560 /src/gallium/drivers/llvmpipe/lp_quad_blend.c
parent4a414d8f876031ffd299e8e0417da1ea7bf9b96b (diff)
llvmpipe: Blend in place.
Diffstat (limited to 'src/gallium/drivers/llvmpipe/lp_quad_blend.c')
-rw-r--r--src/gallium/drivers/llvmpipe/lp_quad_blend.c75
1 files changed, 33 insertions, 42 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_quad_blend.c b/src/gallium/drivers/llvmpipe/lp_quad_blend.c
index 966ac628a9..47b3cd9787 100644
--- a/src/gallium/drivers/llvmpipe/lp_quad_blend.c
+++ b/src/gallium/drivers/llvmpipe/lp_quad_blend.c
@@ -58,14 +58,15 @@ blend_run(struct quad_stage *qs,
struct llvmpipe_context *llvmpipe = qs->llvmpipe;
struct lp_blend_state *blend = llvmpipe->blend;
unsigned cbuf;
- uint q, i, j, k;
+ uint q, i, j;
for (cbuf = 0; cbuf < llvmpipe->framebuffer.nr_cbufs; cbuf++)
{
unsigned x0 = quads[0]->input.x0;
unsigned y0 = quads[0]->input.y0;
- uint8_t ALIGN16_ATTRIB src[4][16];
- uint8_t ALIGN16_ATTRIB dst[4][16];
+ uint8_t ALIGN16_ATTRIB src[NUM_CHANNELS][TILE_VECTOR_HEIGHT*TILE_VECTOR_WIDTH];
+ uint8_t ALIGN16_ATTRIB mask[16];
+ uint8_t *dst;
struct llvmpipe_cached_tile *tile
= lp_get_cached_tile(llvmpipe->cbuf_cache[cbuf], x0, y0);
@@ -74,51 +75,41 @@ blend_run(struct quad_stage *qs,
assert(x0 % TILE_VECTOR_WIDTH == 0);
assert(y0 % TILE_VECTOR_HEIGHT == 0);
- for (q = 0; q < nr; q += 4) {
- for (k = 0; k < 4 && q + k < nr; ++k) {
- struct quad_header *quad = quads[q + k];
- const int itx = (quad->input.x0 & (TILE_SIZE-1));
- const int ity = (quad->input.y0 & (TILE_SIZE-1));
-
- /* get/swizzle src/dest colors
- */
- for (j = 0; j < QUAD_SIZE; j++) {
- int x = itx + (j & 1);
- int y = ity + (j >> 1);
- for (i = 0; i < 4; i++) {
- src[i][4*k + j] = float_to_ubyte(quad->output.color[cbuf][i][j]);
- dst[i][4*k + j] = TILE_PIXEL(tile->data.color, x, y, i);
- }
- }
- }
+ dst = &TILE_PIXEL(tile->data.color, x0 & (TILE_SIZE-1), y0 & (TILE_SIZE-1), 0);
+
+ for (q = 0; q < nr; ++q) {
+ struct quad_header *quad = quads[q];
+ const int itx = (quad->input.x0 & (TILE_SIZE-1));
+ const int ity = (quad->input.y0 & (TILE_SIZE-1));
- assert(blend->jit_function);
- assert((((uintptr_t)src) & 0xf) == 0);
- assert((((uintptr_t)dst) & 0xf) == 0);
- assert((((uintptr_t)llvmpipe->blend_color) & 0xf) == 0);
- if(blend->jit_function)
- blend->jit_function( src, dst, llvmpipe->blend_color, src );
+ assert(quad->input.x0 == x0 + q*2);
+ assert(quad->input.y0 == y0);
- /* Output color values
+ /* get/swizzle src/dest colors
*/
- for (k = 0; k < 4 && q + k < nr; ++k) {
- struct quad_header *quad = quads[q + k];
- const int itx = (quad->input.x0 & (TILE_SIZE-1));
- const int ity = (quad->input.y0 & (TILE_SIZE-1));
-
- for (j = 0; j < QUAD_SIZE; j++) {
- if (quad->inout.mask & (1 << j)) {
- int x = itx + (j & 1);
- int y = ity + (j >> 1);
- assert(x < TILE_SIZE);
- assert(y < TILE_SIZE);
- for (i = 0; i < 4; i++) { /* loop over color chans */
- TILE_PIXEL(tile->data.color, x, y, i) = src[i][4*k + j];
- }
- }
+ for (j = 0; j < QUAD_SIZE; j++) {
+ int x = itx + (j & 1);
+ int y = ity + (j >> 1);
+
+ assert(x < TILE_SIZE);
+ assert(y < TILE_SIZE);
+
+ for (i = 0; i < 4; i++) {
+ src[i][4*q + j] = float_to_ubyte(quad->output.color[cbuf][i][j]);
}
+ mask[4*q + j] = quad->inout.mask & (1 << j) ? ~0 : 0;
}
}
+
+ assert(blend->jit_function);
+ assert((((uintptr_t)src) & 0xf) == 0);
+ assert((((uintptr_t)dst) & 0xf) == 0);
+ assert((((uintptr_t)llvmpipe->blend_color) & 0xf) == 0);
+ if(blend->jit_function)
+ blend->jit_function( mask,
+ &src[0][0],
+ &llvmpipe->blend_color[0][0],
+ dst );
}
}