mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-20 01:30:34 +01:00
Update implementations of Driver.Clear().
This commit is contained in:
parent
5c1e7fa6ee
commit
d98fdad3bf
2 changed files with 156 additions and 159 deletions
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: osmesa.c,v 1.42 2001/01/29 20:47:39 keithw Exp $ */
|
||||
/* $Id: osmesa.c,v 1.43 2001/01/29 20:56:32 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
|
@ -644,164 +644,163 @@ static void set_read_buffer( GLcontext *ctx, GLframebuffer *buffer, GLenum mode
|
|||
}
|
||||
|
||||
|
||||
static GLbitfield clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
|
||||
GLint x, GLint y, GLint width, GLint height )
|
||||
static void clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
|
||||
GLint x, GLint y, GLint width, GLint height )
|
||||
{
|
||||
OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
|
||||
const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask;
|
||||
|
||||
/* we can't handle color or index masking */
|
||||
if (*colorMask != 0xffffffff || ctx->Color.IndexMask != 0xffffffff)
|
||||
return mask;
|
||||
|
||||
/* sanity check - we only have a front-left buffer */
|
||||
ASSERT((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_LEFT_BIT | DD_BACK_RIGHT_BIT)) == 0);
|
||||
|
||||
if (mask & DD_FRONT_LEFT_BIT) {
|
||||
if (osmesa->format == OSMESA_COLOR_INDEX) {
|
||||
if (all) {
|
||||
/* Clear whole CI buffer */
|
||||
if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) {
|
||||
if (mask & DD_FRONT_LEFT_BIT) {
|
||||
if (osmesa->format == OSMESA_COLOR_INDEX) {
|
||||
if (all) {
|
||||
/* Clear whole CI buffer */
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
MEMSET(osmesa->buffer, ctx->Color.ClearIndex,
|
||||
osmesa->rowlength * osmesa->height);
|
||||
MEMSET(osmesa->buffer, ctx->Color.ClearIndex,
|
||||
osmesa->rowlength * osmesa->height);
|
||||
#else
|
||||
const GLint n = osmesa->rowlength * osmesa->height;
|
||||
GLchan *buffer = (GLchan *) osmesa->buffer;
|
||||
GLint i;
|
||||
for (i = 0; i < n; i ++) {
|
||||
buffer[i] = ctx->Color.ClearIndex;
|
||||
}
|
||||
const GLint n = osmesa->rowlength * osmesa->height;
|
||||
GLchan *buffer = (GLchan *) osmesa->buffer;
|
||||
GLint i;
|
||||
for (i = 0; i < n; i ++) {
|
||||
buffer[i] = ctx->Color.ClearIndex;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
/* Clear part of CI buffer */
|
||||
const GLchan clearIndex = (GLchan) ctx->Color.ClearIndex;
|
||||
GLint i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
GLchan *ptr1 = PIXELADDR1(x, (y + i));
|
||||
for (j = 0; j < width; j++) {
|
||||
*ptr1++ = clearIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (osmesa->format == OSMESA_RGB) {
|
||||
const GLchan r = ctx->Color.ClearColor[0];
|
||||
const GLchan g = ctx->Color.ClearColor[1];
|
||||
const GLchan b = ctx->Color.ClearColor[2];
|
||||
if (all) {
|
||||
/* Clear whole RGB buffer */
|
||||
GLuint n = osmesa->rowlength * osmesa->height;
|
||||
GLchan *ptr3 = (GLchan *) osmesa->buffer;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
PACK_RGB(ptr3, r, g, b);
|
||||
ptr3 += 3;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Clear part of RGB buffer */
|
||||
GLint i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
GLchan *ptr3 = PIXELADDR3(x, (y + i));
|
||||
for (j = 0; j < width; j++) {
|
||||
PACK_RGB(ptr3, r, g, b);
|
||||
ptr3 += 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (osmesa->format == OSMESA_BGR) {
|
||||
const GLchan r = ctx->Color.ClearColor[0];
|
||||
const GLchan g = ctx->Color.ClearColor[1];
|
||||
const GLchan b = ctx->Color.ClearColor[2];
|
||||
if (all) {
|
||||
/* Clear whole RGB buffer */
|
||||
const GLint n = osmesa->rowlength * osmesa->height;
|
||||
GLchan *ptr3 = (GLchan *) osmesa->buffer;
|
||||
GLint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
PACK_BGR(ptr3, r, g, b);
|
||||
ptr3 += 3;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Clear part of RGB buffer */
|
||||
GLint i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
GLchan *ptr3 = PIXELADDR3(x, (y + i));
|
||||
for (j = 0; j < width; j++) {
|
||||
PACK_BGR(ptr3, r, g, b);
|
||||
ptr3 += 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
}
|
||||
else {
|
||||
/* Clear part of CI buffer */
|
||||
const GLchan clearIndex = (GLchan) ctx->Color.ClearIndex;
|
||||
GLint i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
GLchan *ptr1 = PIXELADDR1(x, (y + i));
|
||||
for (j = 0; j < width; j++) {
|
||||
*ptr1++ = clearIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (osmesa->format == OSMESA_RGB) {
|
||||
const GLchan r = ctx->Color.ClearColor[0];
|
||||
const GLchan g = ctx->Color.ClearColor[1];
|
||||
const GLchan b = ctx->Color.ClearColor[2];
|
||||
if (all) {
|
||||
/* Clear whole RGB buffer */
|
||||
GLuint n = osmesa->rowlength * osmesa->height;
|
||||
GLchan *ptr3 = (GLchan *) osmesa->buffer;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
PACK_RGB(ptr3, r, g, b);
|
||||
ptr3 += 3;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Clear part of RGB buffer */
|
||||
GLint i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
GLchan *ptr3 = PIXELADDR3(x, (y + i));
|
||||
for (j = 0; j < width; j++) {
|
||||
PACK_RGB(ptr3, r, g, b);
|
||||
ptr3 += 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (osmesa->format == OSMESA_BGR) {
|
||||
const GLchan r = ctx->Color.ClearColor[0];
|
||||
const GLchan g = ctx->Color.ClearColor[1];
|
||||
const GLchan b = ctx->Color.ClearColor[2];
|
||||
if (all) {
|
||||
/* Clear whole RGB buffer */
|
||||
const GLint n = osmesa->rowlength * osmesa->height;
|
||||
GLchan *ptr3 = (GLchan *) osmesa->buffer;
|
||||
GLint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
PACK_BGR(ptr3, r, g, b);
|
||||
ptr3 += 3;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Clear part of RGB buffer */
|
||||
GLint i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
GLchan *ptr3 = PIXELADDR3(x, (y + i));
|
||||
for (j = 0; j < width; j++) {
|
||||
PACK_BGR(ptr3, r, g, b);
|
||||
ptr3 += 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
/* 4-byte pixel value */
|
||||
GLuint clearPixel;
|
||||
GLchan *clr = (GLchan *) &clearPixel;
|
||||
clr[osmesa->rInd] = ctx->Color.ClearColor[0];
|
||||
clr[osmesa->gInd] = ctx->Color.ClearColor[1];
|
||||
clr[osmesa->bInd] = ctx->Color.ClearColor[2];
|
||||
clr[osmesa->aInd] = ctx->Color.ClearColor[3];
|
||||
if (all) {
|
||||
/* Clear whole RGBA buffer */
|
||||
const GLuint n = osmesa->rowlength * osmesa->height;
|
||||
GLuint *ptr4 = (GLuint *) osmesa->buffer;
|
||||
GLuint i;
|
||||
if (clearPixel) {
|
||||
for (i = 0; i < n; i++) {
|
||||
*ptr4++ = clearPixel;
|
||||
}
|
||||
}
|
||||
else {
|
||||
BZERO(ptr4, n * sizeof(GLuint));
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Clear part of RGBA buffer */
|
||||
GLint i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
GLuint *ptr4 = (GLuint *) PIXELADDR4(x, (y + i));
|
||||
for (j = 0; j < width; j++) {
|
||||
*ptr4++ = clearPixel;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* 4-byte pixel value */
|
||||
GLuint clearPixel;
|
||||
GLchan *clr = (GLchan *) &clearPixel;
|
||||
clr[osmesa->rInd] = ctx->Color.ClearColor[0];
|
||||
clr[osmesa->gInd] = ctx->Color.ClearColor[1];
|
||||
clr[osmesa->bInd] = ctx->Color.ClearColor[2];
|
||||
clr[osmesa->aInd] = ctx->Color.ClearColor[3];
|
||||
if (all) {
|
||||
/* Clear whole RGBA buffer */
|
||||
const GLuint n = osmesa->rowlength * osmesa->height;
|
||||
GLuint *ptr4 = (GLuint *) osmesa->buffer;
|
||||
GLuint i;
|
||||
if (clearPixel) {
|
||||
for (i = 0; i < n; i++) {
|
||||
*ptr4++ = clearPixel;
|
||||
}
|
||||
}
|
||||
else {
|
||||
BZERO(ptr4, n * sizeof(GLuint));
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Clear part of RGBA buffer */
|
||||
GLint i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
GLuint *ptr4 = (GLuint *) PIXELADDR4(x, (y + i));
|
||||
for (j = 0; j < width; j++) {
|
||||
*ptr4++ = clearPixel;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
const GLchan r = ctx->Color.ClearColor[0];
|
||||
const GLchan g = ctx->Color.ClearColor[1];
|
||||
const GLchan b = ctx->Color.ClearColor[2];
|
||||
const GLchan a = ctx->Color.ClearColor[3];
|
||||
if (all) {
|
||||
/* Clear whole RGBA buffer */
|
||||
const GLuint n = osmesa->rowlength * osmesa->height;
|
||||
GLchan *p = (GLchan *) osmesa->buffer;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
PACK_RGBA(p, r, g, b, a);
|
||||
p += 4;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Clear part of RGBA buffer */
|
||||
GLint i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
GLchan *p = PIXELADDR4(x, (y + i));
|
||||
for (j = 0; j < width; j++) {
|
||||
PACK_RGBA(p, r, g, b, a);
|
||||
p += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
const GLchan r = ctx->Color.ClearColor[0];
|
||||
const GLchan g = ctx->Color.ClearColor[1];
|
||||
const GLchan b = ctx->Color.ClearColor[2];
|
||||
const GLchan a = ctx->Color.ClearColor[3];
|
||||
if (all) {
|
||||
/* Clear whole RGBA buffer */
|
||||
const GLuint n = osmesa->rowlength * osmesa->height;
|
||||
GLchan *p = (GLchan *) osmesa->buffer;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
PACK_RGBA(p, r, g, b, a);
|
||||
p += 4;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Clear part of RGBA buffer */
|
||||
GLint i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
GLchan *p = PIXELADDR4(x, (y + i));
|
||||
for (j = 0; j < width; j++) {
|
||||
PACK_RGBA(p, r, g, b, a);
|
||||
p += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
mask &= ~DD_FRONT_LEFT_BIT;
|
||||
}
|
||||
}
|
||||
/* have Mesa clear all other buffers */
|
||||
return mask & (~DD_FRONT_LEFT_BIT);
|
||||
|
||||
if (mask)
|
||||
_swrast_Clear( ctx, mask, all, x, y, width, height );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: xm_dd.c,v 1.12 2001/01/29 20:47:39 keithw Exp $ */
|
||||
/* $Id: xm_dd.c,v 1.13 2001/01/29 20:56:32 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
|
@ -739,7 +739,7 @@ clear_nbit_ximage( GLcontext *ctx, GLboolean all,
|
|||
|
||||
|
||||
|
||||
static GLbitfield
|
||||
static void
|
||||
clear_buffers( GLcontext *ctx, GLbitfield mask,
|
||||
GLboolean all, GLint x, GLint y, GLint width, GLint height )
|
||||
{
|
||||
|
|
@ -747,21 +747,19 @@ clear_buffers( GLcontext *ctx, GLbitfield mask,
|
|||
const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask;
|
||||
|
||||
/* we can't handle color or index masking */
|
||||
if (mask & (DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT)) {
|
||||
if (*colorMask != 0xffffffff || ctx->Color.IndexMask != 0xffffffff)
|
||||
return mask;
|
||||
if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) {
|
||||
if (mask & DD_FRONT_LEFT_BIT) {
|
||||
ASSERT(xmesa->xm_buffer->front_clear_func);
|
||||
(*xmesa->xm_buffer->front_clear_func)( ctx, all, x, y, width, height );
|
||||
mask &= ~DD_FRONT_LEFT_BIT;
|
||||
}
|
||||
if (mask & DD_BACK_LEFT_BIT) {
|
||||
ASSERT(xmesa->xm_buffer->back_clear_func);
|
||||
(*xmesa->xm_buffer->back_clear_func)( ctx, all, x, y, width, height );
|
||||
mask &= ~DD_BACK_LEFT_BIT;
|
||||
}
|
||||
}
|
||||
|
||||
if (mask & DD_FRONT_LEFT_BIT) {
|
||||
ASSERT(xmesa->xm_buffer->front_clear_func);
|
||||
(*xmesa->xm_buffer->front_clear_func)( ctx, all, x, y, width, height );
|
||||
mask &= ~DD_FRONT_LEFT_BIT;
|
||||
}
|
||||
if (mask & DD_BACK_LEFT_BIT) {
|
||||
ASSERT(xmesa->xm_buffer->back_clear_func);
|
||||
(*xmesa->xm_buffer->back_clear_func)( ctx, all, x, y, width, height );
|
||||
mask &= ~DD_BACK_LEFT_BIT;
|
||||
}
|
||||
if (mask)
|
||||
_swrast_Clear( ctx, mask, all, x, y, width, height );
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue