diff options
-rw-r--r-- | src/mesa/pipe/softpipe/sp_clear.c | 26 | ||||
-rw-r--r-- | src/mesa/pipe/softpipe/sp_surface.h | 13 | ||||
-rw-r--r-- | src/mesa/pipe/softpipe/sp_tile_output.c | 2 |
3 files changed, 39 insertions, 2 deletions
diff --git a/src/mesa/pipe/softpipe/sp_clear.c b/src/mesa/pipe/softpipe/sp_clear.c index c7fbca42290..536f0d39243 100644 --- a/src/mesa/pipe/softpipe/sp_clear.c +++ b/src/mesa/pipe/softpipe/sp_clear.c @@ -31,16 +31,40 @@ #include "sp_clear.h" +#include "sp_context.h" +#include "sp_surface.h" +#include "colormac.h" void softpipe_clear(struct pipe_context *pipe, GLboolean color, GLboolean depth, GLboolean stencil, GLboolean accum) { - /* validate state (scissor)? */ + struct softpipe_context *softpipe = softpipe_context(pipe); if (color) { + GLuint i; + const GLint x = softpipe->scissor.minx; + const GLint y = softpipe->scissor.miny; + const GLint w = softpipe->scissor.maxx - x; + const GLint h = softpipe->scissor.maxy - y; + GLubyte clr[4]; + + UNCLAMPED_FLOAT_TO_UBYTE(clr[0], softpipe->clear_color.color[0]); + UNCLAMPED_FLOAT_TO_UBYTE(clr[1], softpipe->clear_color.color[1]); + UNCLAMPED_FLOAT_TO_UBYTE(clr[2], softpipe->clear_color.color[2]); + UNCLAMPED_FLOAT_TO_UBYTE(clr[3], softpipe->clear_color.color[3]); + + for (i = 0; i < softpipe->framebuffer.num_cbufs; i++) { + struct pipe_surface *ps = softpipe->framebuffer.cbufs[i]; + struct softpipe_surface *sps = softpipe_surface(ps); + GLint j; + for (j = 0; j < h; j++) { + sps->write_mono_row_ub(sps, w, x, y + j, clr); + } + } } + if (depth) { } diff --git a/src/mesa/pipe/softpipe/sp_surface.h b/src/mesa/pipe/softpipe/sp_surface.h index dde6b90448e..fc9557dee3a 100644 --- a/src/mesa/pipe/softpipe/sp_surface.h +++ b/src/mesa/pipe/softpipe/sp_surface.h @@ -73,6 +73,19 @@ struct softpipe_surface { void (*write_quad_ub)( struct softpipe_surface *, GLint x, GLint y, GLubyte (*rgba)[NUM_CHANNELS] ); + + void (*write_mono_row_ub)( struct softpipe_surface *, + GLuint count, GLint x, GLint y, + GLubyte rgba[NUM_CHANNELS] ); }; + +/** Cast wrapper */ +static INLINE struct softpipe_surface * +softpipe_surface(struct pipe_surface *ps) +{ + return (struct softpipe_surface *) ps; +} + + #endif diff --git a/src/mesa/pipe/softpipe/sp_tile_output.c b/src/mesa/pipe/softpipe/sp_tile_output.c index d4add4b162b..23086b70208 100644 --- a/src/mesa/pipe/softpipe/sp_tile_output.c +++ b/src/mesa/pipe/softpipe/sp_tile_output.c @@ -67,7 +67,7 @@ void quad_output( struct softpipe_context *softpipe, for (i = 0; i < softpipe->framebuffer.num_cbufs; i++) { struct softpipe_surface *sps - = (struct softpipe_surface *) softpipe->framebuffer.cbufs[i]; + = softpipe_surface(softpipe->framebuffer.cbufs[i]); if (quad->mask != MASK_ALL) { GLfloat tmp[4][QUAD_SIZE]; |