summaryrefslogtreecommitdiff
path: root/src/mesa/pipe/xlib/xm_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/pipe/xlib/xm_buffer.c')
-rw-r--r--src/mesa/pipe/xlib/xm_buffer.c180
1 files changed, 18 insertions, 162 deletions
diff --git a/src/mesa/pipe/xlib/xm_buffer.c b/src/mesa/pipe/xlib/xm_buffer.c
index 8ac9fb55b6..cd3b498b10 100644
--- a/src/mesa/pipe/xlib/xm_buffer.c
+++ b/src/mesa/pipe/xlib/xm_buffer.c
@@ -262,146 +262,6 @@ finish_surface_init(GLcontext *ctx, struct xmesa_renderbuffer *xrb)
/**
- * Clear the front or back color buffer, if it's implemented with a pixmap.
- */
-static void
-clear_pixmap(GLcontext *ctx, struct xmesa_renderbuffer *xrb, GLuint value)
-{
- const XMesaContext xmesa = XMESA_CONTEXT(ctx);
- XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
-
- assert(xmbuf);
- assert(xrb->pixmap);
- assert(xmesa);
- assert(xmesa->display);
- assert(xrb->pixmap);
- assert(xmbuf->cleargc);
-
- XMesaSetForeground( xmesa->display, xmbuf->cleargc, value );
-
- XMesaFillRectangle( xmesa->display, xrb->pixmap, xmbuf->cleargc,
- 0, 0, xrb->St.Base.Width, xrb->St.Base.Height);
-}
-
-
-static void
-clear_8bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb, GLuint value)
-{
- const XMesaContext xmesa = XMESA_CONTEXT(ctx);
- GLint width = xrb->St.Base.Width;
- GLint height = xrb->St.Base.Height;
- GLint i;
- for (i = 0; i < height; i++) {
- GLubyte *ptr = PIXEL_ADDR1(xrb, 0, i);
- MEMSET( ptr, xmesa->clearpixel, width );
- }
-}
-
-
-static void
-clear_16bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb, GLuint value)
-{
- const XMesaContext xmesa = XMESA_CONTEXT(ctx);
- GLint width = xrb->St.Base.Width;
- GLint height = xrb->St.Base.Height;
- GLint i, j;
-
- if (xmesa->swapbytes) {
- value = ((value >> 8) & 0x00ff) | ((value << 8) & 0xff00);
- }
-
- for (j = 0; j < height; j++) {
- GLushort *ptr2 = PIXEL_ADDR2(xrb, 0, j);
- for (i = 0; i < width; i++) {
- ptr2[i] = value;
- }
- }
-}
-
-
-/* Optimized code provided by Nozomi Ytow <noz@xfree86.org> */
-static void
-clear_24bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
- GLuint value)
-{
- GLint width = xrb->St.Base.Width;
- GLint height = xrb->St.Base.Height;
- const GLubyte r = (value ) & 0xff;
- const GLubyte g = (value >> 8) & 0xff;
- const GLubyte b = (value >> 16) & 0xff;
-
- 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, 0, 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, 0, j);
- for (i = 0; i < width; i++) {
- ptr3->r = r;
- ptr3->g = g;
- ptr3->b = b;
- ptr3++;
- }
- }
- }
-}
-
-
-static void
-clear_32bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
- GLuint value)
-{
- const XMesaContext xmesa = XMESA_CONTEXT(ctx);
- GLint width = xrb->St.Base.Width;
- GLint height = xrb->St.Base.Height;
- const GLuint n = width * height;
- GLuint *ptr4 = (GLuint *) xrb->ximage->data;
-
- if (!xrb->ximage)
- return;
-
- if (xmesa->swapbytes) {
- value = ((value >> 24) & 0x000000ff)
- | ((value >> 8) & 0x0000ff00)
- | ((value << 8) & 0x00ff0000)
- | ((value << 24) & 0xff000000);
- }
-
- if (value == 0) {
- /* common case */
- _mesa_memset(ptr4, value, 4 * n);
- }
- else {
- GLuint i;
- for (i = 0; i < n; i++)
- ptr4[i] = value;
- }
-}
-
-
-static void
-clear_nbit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb, GLuint value)
-{
- XMesaImage *img = xrb->ximage;
- GLint width = xrb->St.Base.Width;
- GLint height = xrb->St.Base.Height;
- GLint i, j;
- for (j = 0; j < height; j++) {
- for (i = 0; i < width; i++) {
- XMesaPutPixel(img, i, j, value);
- }
- }
-}
-
-
-/**
* Reallocate renderbuffer storage for front color buffer.
* Called via gl_renderbuffer::AllocStorage()
*/
@@ -411,6 +271,7 @@ xmesa_alloc_front_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
{
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
struct xmesa_renderbuffer *xrb = xmesa_renderbuffer(rb);
+ struct xmesa_surface *xms = xmesa_surface(xrb->St.surface);
/* just clear these to be sure we don't accidentally use them */
xrb->origin1 = NULL;
@@ -431,10 +292,13 @@ xmesa_alloc_front_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
xmesa_set_renderbuffer_funcs(xrb, xmesa->pixelformat,
xmesa->xm_visual->BitsPerPixel);
- xrb->clearFunc = clear_pixmap;
-
- xrb->St.surface->width = width;
- xrb->St.surface->height = height;
+ /* surface info */
+ xms->surface.width = width;
+ xms->surface.height = height;
+ xms->display = xmesa->display;
+ xms->drawable = xrb->drawable;
+ xms->gc = xrb->Parent->cleargc;
+ xms->ximage = NULL;
return GL_TRUE;
}
@@ -450,6 +314,7 @@ xmesa_alloc_back_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
{
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
struct xmesa_renderbuffer *xrb = xmesa_renderbuffer(rb);
+ struct xmesa_surface *xms = xmesa_surface(xrb->St.surface);
/* reallocate the back buffer XImage or Pixmap */
assert(xrb->Parent);
@@ -489,30 +354,20 @@ xmesa_alloc_back_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
xmesa_set_renderbuffer_funcs(xrb, xmesa->pixelformat,
xmesa->xm_visual->BitsPerPixel);
- switch (xmesa->xm_visual->BitsPerPixel) {
- case 8:
- xrb->clearFunc = clear_8bit_ximage;
- break;
- case 16:
- xrb->clearFunc = clear_16bit_ximage;
- break;
- case 24:
- xrb->clearFunc = clear_24bit_ximage;
- break;
- case 32:
- xrb->clearFunc = clear_32bit_ximage;
- break;
- default:
- xrb->clearFunc = clear_nbit_ximage;
- break;
- }
-
if (!xrb->St.surface || !xrb->St.surface->region)
finish_surface_init(ctx, xrb);
xrb->St.surface->width = width;
xrb->St.surface->height = height;
+ /* surface info */
+ xms->surface.width = width;
+ xms->surface.height = height;
+ xms->display = xmesa->display;
+ xms->drawable = xrb->drawable;
+ xms->gc = xrb->Parent->cleargc;
+ xms->ximage = xrb->ximage;
+
return GL_TRUE;
}
@@ -561,6 +416,7 @@ xmesa_create_renderbuffer(GLcontext *ctx, GLuint name, const GLvisual *visual,
xrb->St.surface = xmesa_new_color_surface(pipe, pipeFormat);
xms = (struct xmesa_surface *) xrb->St.surface;
xms->xrb = xrb;
+
}
return xrb;
}