From e3c02c09c125bb5def1a70a1264ef34b18182afa Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 24 Aug 2009 07:00:32 -0700 Subject: [PATCH] glamor: Add ALU support to solid, tile, and putimage. --- glamor/glamor_core.c | 61 ++++++++++++++++++++++++++++++++++++++++ glamor/glamor_fill.c | 2 ++ glamor/glamor_priv.h | 1 + glamor/glamor_putimage.c | 15 +++++----- glamor/glamor_tile.c | 6 ++-- 5 files changed, 73 insertions(+), 12 deletions(-) diff --git a/glamor/glamor_core.c b/glamor/glamor_core.c index ba73c0bd2..055df399a 100644 --- a/glamor/glamor_core.c +++ b/glamor/glamor_core.c @@ -68,6 +68,67 @@ glamor_set_destination_pixmap(PixmapPtr pixmap) return TRUE; } +void +glamor_set_alu(unsigned char alu) +{ + if (alu == GXcopy) { + glDisable(GL_LOGIC_OP); + return; + } + + glEnable(GL_LOGIC_OP); + + switch (alu) { + case GXclear: + glLogicOp(GL_CLEAR); + break; + case GXand: + glLogicOp(GL_AND); + break; + case GXandReverse: + glLogicOp(GL_AND_REVERSE); + break; + case GXandInverted: + glLogicOp(GL_AND_INVERTED); + break; + case GXnoop: + glLogicOp(GL_NOOP); + break; + case GXxor: + glLogicOp(GL_XOR); + break; + case GXor: + glLogicOp(GL_OR); + break; + case GXnor: + glLogicOp(GL_NOR); + break; + case GXequiv: + glLogicOp(GL_EQUIV); + break; + case GXinvert: + glLogicOp(GL_INVERT); + break; + case GXorReverse: + glLogicOp(GL_OR_REVERSE); + break; + case GXcopyInverted: + glLogicOp(GL_COPY_INVERTED); + break; + case GXorInverted: + glLogicOp(GL_OR_INVERTED); + break; + case GXnand: + glLogicOp(GL_NAND); + break; + case GXset: + glLogicOp(GL_SET); + break; + default: + FatalError("unknown logic op\n"); + } +} + void glamor_get_transform_uniform_locations(GLint prog, glamor_transform_uniforms *uniform_locations) diff --git a/glamor/glamor_fill.c b/glamor/glamor_fill.c index 11d5f9841..f387dab62 100644 --- a/glamor/glamor_fill.c +++ b/glamor/glamor_fill.c @@ -153,6 +153,7 @@ glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, if (!glamor_set_destination_pixmap(pixmap)) return; + glamor_set_alu(alu); glUseProgramObjectARB(glamor_priv->solid_prog); glamor_get_color_4f_from_pixel(pixmap, fg_pixel, color); @@ -167,6 +168,7 @@ glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, glEnd(); glUseProgramObjectARB(0); + glamor_set_alu(GXcopy); } /* Highlight places where we're doing it wrong. */ diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h index 74c1aea68..6484c9495 100644 --- a/glamor/glamor_priv.h +++ b/glamor/glamor_priv.h @@ -100,6 +100,7 @@ void glamor_link_glsl_prog(GLint prog); void glamor_get_color_4f_from_pixel(PixmapPtr pixmap, unsigned long fg_pixel, GLfloat *color); Bool glamor_set_destination_pixmap(PixmapPtr pixmap); +void glamor_set_alu(unsigned char alu); void glamor_get_transform_uniform_locations(GLint prog, glamor_transform_uniforms *uniform_locations); void glamor_set_transform_for_pixmap(PixmapPtr pixmap, diff --git a/glamor/glamor_putimage.c b/glamor/glamor_putimage.c index 2795d837e..f1a4e947a 100644 --- a/glamor/glamor_putimage.c +++ b/glamor/glamor_putimage.c @@ -44,10 +44,12 @@ glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, int bpp = drawable->bitsPerPixel; int src_stride = PixmapBytePad(w, drawable->depth); - if (gc->alu != GXcopy) { - ErrorF("putimage: non-copy alu\n"); - goto fail; + if (!glamor_set_destination_pixmap(pixmap)) { + fbPutImage(drawable, gc, depth, x, y, w, h, left_pad, + image_format, bits); + return; } + if (!glamor_pm_is_solid(drawable, gc->planemask)) { ErrorF("putimage: non-solid planemask\n"); goto fail; @@ -80,11 +82,7 @@ glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, break; } - if (!glamor_set_destination_pixmap(pixmap)) { - fbPutImage(drawable, gc, depth, x, y, w, h, left_pad, - image_format, bits); - goto fail; - } + glamor_set_alu(gc->alu); x += drawable->x; y += drawable->y; @@ -122,6 +120,7 @@ glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, src); } glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glamor_set_alu(GXcopy); return; fail: diff --git a/glamor/glamor_tile.c b/glamor/glamor_tile.c index d47644297..c33b3c1a6 100644 --- a/glamor/glamor_tile.c +++ b/glamor/glamor_tile.c @@ -109,15 +109,12 @@ glamor_tile(PixmapPtr pixmap, PixmapPtr tile, ErrorF("Non-FBO tile pixmap\n"); goto fail; } - if (alu != GXcopy) { - ErrorF("tile alu\n"); - goto fail; - } if (!glamor_pm_is_solid(&pixmap->drawable, planemask)) { ErrorF("tile pm\n"); goto fail; } + glamor_set_alu(alu); glUseProgramObjectARB(glamor_priv->tile_prog); glamor_set_transform_for_pixmap(pixmap, &glamor_priv->tile_transform); @@ -143,6 +140,7 @@ glamor_tile(PixmapPtr pixmap, PixmapPtr tile, glUseProgramObjectARB(0); glDisable(GL_TEXTURE_2D); + glamor_set_alu(GXcopy); return; fail: