diff options
Diffstat (limited to 'src/mesa/pipe/softpipe')
-rw-r--r-- | src/mesa/pipe/softpipe/sp_region.c | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/src/mesa/pipe/softpipe/sp_region.c b/src/mesa/pipe/softpipe/sp_region.c index 34fbcce8ca..1dbd1609e3 100644 --- a/src/mesa/pipe/softpipe/sp_region.c +++ b/src/mesa/pipe/softpipe/sp_region.c @@ -112,29 +112,66 @@ sp_region_fill(struct pipe_context *pipe, case 1: { GLubyte *row = get_pointer(dst, dstx, dsty); - for (i = 0; i < height; i++) { - memset(row, value, width); - row += dst->pitch; + if ((mask & 0xff) == 0xff) { + /* no masking */ + for (i = 0; i < height; i++) { + memset(row, value, width); + row += dst->pitch; + } + } + else { + value &= mask; + mask = ~mask; + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + row[j] = (row[j] & mask) | value; + } + row += dst->pitch; + } } } break; case 2: { GLushort *row = (GLushort *) get_pointer(dst, dstx, dsty); - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) - row[j] = value; - row += dst->pitch; + if ((mask & 0xffff) == 0xffff) { + /* no masking */ + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) + row[j] = value; + row += dst->pitch; + } + } + else { + value &= mask; + mask = ~mask; + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) + row[j] = (row[j] & mask) | value; + row += dst->pitch; + } } } break; case 4: { GLuint *row = (GLuint *) get_pointer(dst, dstx, dsty); - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) - row[j] = value; - row += dst->pitch; + if (mask == 0xffffffff) { + /* no masking */ + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) + row[j] = value; + row += dst->pitch; + } + } + else { + value &= mask; + mask = ~mask; + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) + row[j] = (row[j] & mask) | value; + row += dst->pitch; + } } } break; |