mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 18:18:06 +02:00
Don't use x/y/w/h params given to Clear().
This commit is contained in:
parent
446972bc27
commit
ec99e716a2
2 changed files with 59 additions and 160 deletions
|
|
@ -211,7 +211,7 @@ color_mask(GLcontext *ctx,
|
|||
* Clear the front or back color buffer, if it's implemented with a pixmap.
|
||||
*/
|
||||
static void
|
||||
clear_pixmap(GLcontext *ctx, struct xmesa_renderbuffer *xrb, GLboolean all,
|
||||
clear_pixmap(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
||||
GLint x, GLint y, GLint width, GLint height)
|
||||
{
|
||||
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
|
||||
|
|
@ -224,92 +224,41 @@ clear_pixmap(GLcontext *ctx, struct xmesa_renderbuffer *xrb, GLboolean all,
|
|||
assert(xrb->pixmap);
|
||||
assert(xmbuf->cleargc);
|
||||
|
||||
if (all) {
|
||||
XMesaFillRectangle( xmesa->display, xrb->pixmap, xmbuf->cleargc,
|
||||
0, 0, xrb->Base.Width + 1, xrb->Base.Height + 1 );
|
||||
}
|
||||
else {
|
||||
XMesaFillRectangle( xmesa->display, xrb->pixmap, xmbuf->cleargc,
|
||||
x, xrb->Base.Height - y - height,
|
||||
width, height );
|
||||
}
|
||||
XMesaFillRectangle( xmesa->display, xrb->pixmap, xmbuf->cleargc,
|
||||
x, xrb->Base.Height - y - height,
|
||||
width, height );
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
clear_8bit_ximage( GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
||||
GLboolean all, GLint x, GLint y, GLint width, GLint height )
|
||||
GLint x, GLint y, GLint width, GLint height )
|
||||
{
|
||||
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
|
||||
|
||||
if (all) {
|
||||
const size_t n = xrb->ximage->bytes_per_line * xrb->Base.Height;
|
||||
MEMSET( xrb->ximage->data, xmesa->clearpixel, n );
|
||||
}
|
||||
else {
|
||||
GLint i;
|
||||
for (i=0;i<height;i++) {
|
||||
GLubyte *ptr = PIXEL_ADDR1(xrb, x, y + i);
|
||||
MEMSET( ptr, xmesa->clearpixel, width );
|
||||
}
|
||||
GLint i;
|
||||
for (i = 0; i < height; i++) {
|
||||
GLubyte *ptr = PIXEL_ADDR1(xrb, x, y + i);
|
||||
MEMSET( ptr, xmesa->clearpixel, width );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
clear_HPCR_ximage( GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
||||
GLboolean all, GLint x, GLint y, GLint width, GLint height )
|
||||
GLint x, GLint y, GLint width, GLint height )
|
||||
{
|
||||
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
|
||||
|
||||
if (all) {
|
||||
const GLuint c16 = xrb->ximage->bytes_per_line & ~0xf;
|
||||
GLuint i;
|
||||
GLubyte *ptr = (GLubyte *) xrb->ximage->data;
|
||||
for (i = 0; i < xrb->Base.Height; i++) {
|
||||
GLuint j;
|
||||
const GLubyte *sptr = xmesa->xm_visual->hpcr_clear_ximage_pattern[0];
|
||||
if (i&1) {
|
||||
sptr += 16;
|
||||
}
|
||||
for (j=0; j<c16; j+=16) {
|
||||
ptr[0] = sptr[0];
|
||||
ptr[1] = sptr[1];
|
||||
ptr[2] = sptr[2];
|
||||
ptr[3] = sptr[3];
|
||||
ptr[4] = sptr[4];
|
||||
ptr[5] = sptr[5];
|
||||
ptr[6] = sptr[6];
|
||||
ptr[7] = sptr[7];
|
||||
ptr[8] = sptr[8];
|
||||
ptr[9] = sptr[9];
|
||||
ptr[10] = sptr[10];
|
||||
ptr[11] = sptr[11];
|
||||
ptr[12] = sptr[12];
|
||||
ptr[13] = sptr[13];
|
||||
ptr[14] = sptr[14];
|
||||
ptr[15] = sptr[15];
|
||||
ptr += 16;
|
||||
}
|
||||
for (; j < (GLuint) xrb->ximage->bytes_per_line; j++) {
|
||||
*ptr = sptr[j&15];
|
||||
ptr++;
|
||||
}
|
||||
GLint i;
|
||||
for (i = y; i < y + height; i++) {
|
||||
GLubyte *ptr = PIXEL_ADDR1( xrb, x, i );
|
||||
int j;
|
||||
const GLubyte *sptr = xmesa->xm_visual->hpcr_clear_ximage_pattern[0];
|
||||
if (i & 1) {
|
||||
sptr += 16;
|
||||
}
|
||||
}
|
||||
else {
|
||||
GLint i;
|
||||
for (i=y; i<y+height; i++) {
|
||||
GLubyte *ptr = PIXEL_ADDR1( xrb, x, i );
|
||||
int j;
|
||||
const GLubyte *sptr = xmesa->xm_visual->hpcr_clear_ximage_pattern[0];
|
||||
if (i&1) {
|
||||
sptr += 16;
|
||||
}
|
||||
for (j=x; j<x+width; j++) {
|
||||
*ptr = sptr[j&15];
|
||||
ptr++;
|
||||
}
|
||||
for (j = x; j < x + width; j++) {
|
||||
*ptr = sptr[j&15];
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -317,42 +266,20 @@ clear_HPCR_ximage( GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
|||
|
||||
static void
|
||||
clear_16bit_ximage( GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
||||
GLboolean all, GLint x, GLint y, GLint width, GLint height)
|
||||
GLint x, GLint y, GLint width, GLint height)
|
||||
{
|
||||
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
|
||||
register GLuint pixel = (GLuint) xmesa->clearpixel;
|
||||
GLuint pixel = (GLuint) xmesa->clearpixel;
|
||||
GLint i, j;
|
||||
|
||||
if (xmesa->swapbytes) {
|
||||
pixel = ((pixel >> 8) & 0x00ff) | ((pixel << 8) & 0xff00);
|
||||
}
|
||||
|
||||
if (all) {
|
||||
GLuint *ptr4 = (GLuint *) xrb->ximage->data;
|
||||
if ((pixel & 0xff) == ((pixel >> 8) & 0xff)) {
|
||||
/* low and high bytes are equal so use memset() */
|
||||
const GLuint n = xrb->ximage->bytes_per_line * xrb->Base.Height;
|
||||
MEMSET( ptr4, pixel & 0xff, n );
|
||||
}
|
||||
else {
|
||||
const GLuint n = xrb->ximage->bytes_per_line * xrb->Base.Height / 4;
|
||||
GLuint i;
|
||||
pixel = pixel | (pixel<<16);
|
||||
for (i = 0; i < n; i++) {
|
||||
ptr4[i] = pixel;
|
||||
}
|
||||
ptr4 += n;
|
||||
/* might be one last GLushort to set */
|
||||
if ((xrb->ximage->bytes_per_line * xrb->Base.Height) & 0x2)
|
||||
*(GLushort *)ptr4 = pixel & 0xffff;
|
||||
}
|
||||
}
|
||||
else {
|
||||
GLint i, j;
|
||||
for (j=0;j<height;j++) {
|
||||
GLushort *ptr2 = PIXEL_ADDR2(xrb, x, y + j);
|
||||
for (i=0;i<width;i++) {
|
||||
*ptr2++ = pixel;
|
||||
}
|
||||
for (j = 0; j < height; j++) {
|
||||
GLushort *ptr2 = PIXEL_ADDR2(xrb, x, y + j);
|
||||
for (i = 0; i < width; i++) {
|
||||
ptr2[i] = pixel;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -361,61 +288,31 @@ clear_16bit_ximage( GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
|||
/* Optimized code provided by Nozomi Ytow <noz@xfree86.org> */
|
||||
static void
|
||||
clear_24bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
||||
GLboolean all, GLint x, GLint y, GLint width, GLint height)
|
||||
GLint x, GLint y, GLint width, GLint height)
|
||||
{
|
||||
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
|
||||
const GLubyte r = xmesa->clearcolor[0];
|
||||
const GLubyte g = xmesa->clearcolor[1];
|
||||
const GLubyte b = xmesa->clearcolor[2];
|
||||
|
||||
if (all) {
|
||||
if (r == g && g == b) {
|
||||
/* same value for all three components (gray) */
|
||||
const GLint w3 = xrb->Base.Width * 3;
|
||||
const GLint h = xrb->Base.Height;
|
||||
GLint i;
|
||||
for (i = 0; i < h; i++) {
|
||||
bgr_t *ptr3 = PIXEL_ADDR3(xrb, 0, i);
|
||||
MEMSET(ptr3, r, w3);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* the usual case */
|
||||
const GLint w = xrb->Base.Width;
|
||||
const GLint h = xrb->Base.Height;
|
||||
GLint i, j;
|
||||
for (i = 0; i < h; i++) {
|
||||
bgr_t *ptr3 = PIXEL_ADDR3(xrb, 0, i);
|
||||
for (j = 0; j < w; j++) {
|
||||
ptr3->r = r;
|
||||
ptr3->g = g;
|
||||
ptr3->b = b;
|
||||
ptr3++;
|
||||
}
|
||||
}
|
||||
if (r == g && g == b) {
|
||||
/* same value for all three components (gray) */
|
||||
GLint j;
|
||||
for (j = 0; j < height; j++) {
|
||||
bgr_t *ptr3 = PIXEL_ADDR3(xrb, x, y + j);
|
||||
MEMSET(ptr3, r, 3 * width);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* only clear subrect of color buffer */
|
||||
if (r == g && g == b) {
|
||||
/* same value for all three components (gray) */
|
||||
GLint j;
|
||||
for (j=0;j<height;j++) {
|
||||
bgr_t *ptr3 = PIXEL_ADDR3(xrb, x, y + j);
|
||||
MEMSET(ptr3, r, 3 * width);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* non-gray clear color */
|
||||
GLint i, j;
|
||||
for (j = 0; j < height; j++) {
|
||||
bgr_t *ptr3 = PIXEL_ADDR3(xrb, x, y + j);
|
||||
for (i = 0; i < width; i++) {
|
||||
ptr3->r = r;
|
||||
ptr3->g = g;
|
||||
ptr3->b = b;
|
||||
ptr3++;
|
||||
}
|
||||
/* non-gray clear color */
|
||||
GLint i, j;
|
||||
for (j = 0; j < height; j++) {
|
||||
bgr_t *ptr3 = PIXEL_ADDR3(xrb, x, y + j);
|
||||
for (i = 0; i < width; i++) {
|
||||
ptr3->r = r;
|
||||
ptr3->g = g;
|
||||
ptr3->b = b;
|
||||
ptr3++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -424,7 +321,7 @@ clear_24bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
|||
|
||||
static void
|
||||
clear_32bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
||||
GLboolean all, GLint x, GLint y, GLint width, GLint height)
|
||||
GLint x, GLint y, GLint width, GLint height)
|
||||
{
|
||||
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
|
||||
register GLuint pixel = (GLuint) xmesa->clearpixel;
|
||||
|
|
@ -439,10 +336,12 @@ clear_32bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
|||
| ((pixel << 24) & 0xff000000);
|
||||
}
|
||||
|
||||
if (all) {
|
||||
if (width == xrb->Base.Width && height == xrb->Base.Height) {
|
||||
/* clearing whole buffer */
|
||||
const GLuint n = xrb->Base.Width * xrb->Base.Height;
|
||||
GLuint *ptr4 = (GLuint *) xrb->ximage->data;
|
||||
if (pixel == 0) {
|
||||
/* common case */
|
||||
_mesa_memset(ptr4, pixel, 4 * n);
|
||||
}
|
||||
else {
|
||||
|
|
@ -452,6 +351,7 @@ clear_32bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
|||
}
|
||||
}
|
||||
else {
|
||||
/* clearing scissored region */
|
||||
GLint i, j;
|
||||
for (j = 0; j < height; j++) {
|
||||
GLuint *ptr4 = PIXEL_ADDR4(xrb, x, y + j);
|
||||
|
|
@ -465,15 +365,12 @@ clear_32bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
|||
|
||||
static void
|
||||
clear_nbit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
||||
GLboolean all, GLint x, GLint y, GLint width, GLint height)
|
||||
GLint x, GLint y, GLint width, GLint height)
|
||||
{
|
||||
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
|
||||
XMesaImage *img = xrb->ximage;
|
||||
GLint i, j;
|
||||
|
||||
/* We can ignore 'all' here - x, y, width, height are always right */
|
||||
(void) all;
|
||||
|
||||
/* TODO: optimize this */
|
||||
y = YFLIP(xrb, y);
|
||||
for (j = 0; j < height; j++) {
|
||||
|
|
@ -487,12 +384,17 @@ clear_nbit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
|||
|
||||
static void
|
||||
clear_buffers( GLcontext *ctx, GLbitfield mask,
|
||||
GLboolean all, GLint x, GLint y, GLint width, GLint height )
|
||||
GLboolean all, GLint xFoo, GLint yFoo,
|
||||
GLint widthFoo, GLint heightFoo )
|
||||
{
|
||||
if (ctx->DrawBuffer->Name == 0) {
|
||||
/* this is a window system framebuffer */
|
||||
const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask;
|
||||
XMesaBuffer b = XMESA_BUFFER(ctx->DrawBuffer);
|
||||
const GLint x = ctx->DrawBuffer->_Xmin;
|
||||
const GLint y = ctx->DrawBuffer->_Ymin;
|
||||
const GLint width = ctx->DrawBuffer->_Xmax - x;
|
||||
const GLint height = ctx->DrawBuffer->_Ymax - y;
|
||||
|
||||
/* we can't handle color or index masking */
|
||||
if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) {
|
||||
|
|
@ -502,8 +404,7 @@ clear_buffers( GLcontext *ctx, GLbitfield mask,
|
|||
= ctx->DrawBuffer->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
|
||||
if (b->frontxrb == xmesa_renderbuffer(frontRb)) {
|
||||
/* renderbuffer is not wrapped - great! */
|
||||
b->frontxrb->clearFunc(ctx, b->frontxrb, all, x, y,
|
||||
width, height);
|
||||
b->frontxrb->clearFunc(ctx, b->frontxrb, x, y, width, height);
|
||||
mask &= ~BUFFER_BIT_FRONT_LEFT;
|
||||
}
|
||||
else {
|
||||
|
|
@ -516,15 +417,14 @@ clear_buffers( GLcontext *ctx, GLbitfield mask,
|
|||
= ctx->DrawBuffer->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
|
||||
if (b->backxrb == xmesa_renderbuffer(backRb)) {
|
||||
/* renderbuffer is not wrapped - great! */
|
||||
b->backxrb->clearFunc(ctx, b->backxrb, all, x, y,
|
||||
width, height);
|
||||
b->backxrb->clearFunc(ctx, b->backxrb, x, y, width, height);
|
||||
mask &= ~BUFFER_BIT_BACK_LEFT;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mask)
|
||||
_swrast_Clear( ctx, mask, all, x, y, width, height );
|
||||
_swrast_Clear( ctx, mask, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -56,8 +56,7 @@ struct xmesa_renderbuffer;
|
|||
|
||||
/* Function pointer for clearing color buffers */
|
||||
typedef void (*ClearFunc)( GLcontext *ctx, struct xmesa_renderbuffer *xrb,
|
||||
GLboolean all, GLint x, GLint y,
|
||||
GLint width, GLint height );
|
||||
GLint x, GLint y, GLint width, GLint height );
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue