From: Brian Date: Wed, 1 Aug 2007 22:15:30 +0000 (-0600) Subject: implement masking in sp_region_fill() X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1b0e92b91a66c0188a870fb3ed6c20a8466b6ae9;p=mesa.git implement masking in sp_region_fill() --- diff --git a/src/mesa/pipe/softpipe/sp_region.c b/src/mesa/pipe/softpipe/sp_region.c index 34fbcce8ca2..1dbd1609e37 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;