From 3e9c35bdcbdb96a67c9f2a1ea76c382aaacca7e9 Mon Sep 17 00:00:00 2001 From: Zhigang Gong Date: Fri, 6 Apr 2012 11:02:36 +0800 Subject: [PATCH] glamor_set_alu: Fallback for non GXcopy ops with GLES2. As GLES2 doesn't support LogiOps, we have to fallback here. GLES2 programing guide's statement is as below: "In addition, LogicOp is removed as it is very infrequently used by applications and the OpenGL ES working group did not get requests from independent software vendors (ISVs) to support this feature in OpenGL ES 2.0." So, I think, fallback here may not a big deal ;). Signed-off-by: Zhigang Gong --- glamor/glamor_copyarea.c | 6 +++++- glamor/glamor_fill.c | 5 ++++- glamor/glamor_pixmap.c | 16 +++++++++------- glamor/glamor_priv.h | 2 +- glamor/glamor_putimage.c | 6 +++++- glamor/glamor_setspans.c | 6 +++++- glamor/glamor_tile.c | 5 ++++- 7 files changed, 33 insertions(+), 13 deletions(-) diff --git a/glamor/glamor_copyarea.c b/glamor/glamor_copyarea.c index b4880378c..a373d3d0b 100644 --- a/glamor/glamor_copyarea.c +++ b/glamor/glamor_copyarea.c @@ -194,7 +194,11 @@ glamor_copy_n_to_n_textured(DrawablePtr src, dispatch = glamor_get_dispatch(glamor_priv); - glamor_set_alu(dispatch, alu); + if (!glamor_set_alu(dispatch, alu)) { + glamor_put_dispatch(glamor_priv); + return FALSE; + } + if (alu != GXcopy) { glamor_set_destination_pixmap_priv_nc (src_pixmap_priv); glamor_validate_pixmap(src_pixmap); diff --git a/glamor/glamor_fill.c b/glamor/glamor_fill.c index e8419c633..53c750afb 100644 --- a/glamor/glamor_fill.c +++ b/glamor/glamor_fill.c @@ -189,7 +189,10 @@ glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, glamor_validate_pixmap(pixmap); dispatch = glamor_get_dispatch(glamor_priv); - glamor_set_alu(dispatch, alu); + if (!glamor_set_alu(dispatch, alu)) { + glamor_put_dispatch(glamor_priv); + return FALSE; + } dispatch->glUseProgram(glamor_priv->solid_prog); dispatch->glUniform4fv(glamor_priv->solid_color_uniform_location, diff --git a/glamor/glamor_pixmap.c b/glamor/glamor_pixmap.c index 4e8d6b885..35b2d56f1 100644 --- a/glamor/glamor_pixmap.c +++ b/glamor/glamor_pixmap.c @@ -144,15 +144,13 @@ glamor_set_planemask(PixmapPtr pixmap, unsigned long planemask) return GL_FALSE; } - - -void +Bool glamor_set_alu(struct glamor_gl_dispatch *dispatch, unsigned char alu) { #ifndef GLAMOR_GLES2 if (alu == GXcopy) { dispatch->glDisable(GL_COLOR_LOGIC_OP); - return; + return TRUE; } dispatch->glEnable(GL_COLOR_LOGIC_OP); switch (alu) { @@ -202,12 +200,16 @@ glamor_set_alu(struct glamor_gl_dispatch *dispatch, unsigned char alu) dispatch->glLogicOp(GL_SET); break; default: - FatalError("unknown logic op\n"); + glamor_fallback("unsupported alu %x\n", alu); + return FALSE; } #else - if (alu != GXcopy) - ErrorF("unsupported alu %x \n", alu); + if (alu != GXcopy) { + glamor_fallback("unsupported alu %x\n", alu); + return FALSE; + } #endif + return TRUE; } void * diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h index 71d5bf007..bea4f662a 100644 --- a/glamor/glamor_priv.h +++ b/glamor/glamor_priv.h @@ -468,7 +468,7 @@ glamor_pixmap_fbo * glamor_es2_pixmap_read_prepare(PixmapPtr source, GLenum format, GLenum type, int no_alpha, int revert, int swap_rb); -void glamor_set_alu(struct glamor_gl_dispatch *dispatch, +Bool glamor_set_alu(struct glamor_gl_dispatch *dispatch, unsigned char alu); Bool glamor_set_planemask(PixmapPtr pixmap, unsigned long planemask); Bool glamor_change_window_attributes(WindowPtr pWin, unsigned long mask); diff --git a/glamor/glamor_putimage.c b/glamor/glamor_putimage.c index d270cae59..010950e59 100644 --- a/glamor/glamor_putimage.c +++ b/glamor/glamor_putimage.c @@ -321,7 +321,11 @@ _glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, dispatch = glamor_get_dispatch(glamor_priv); - glamor_set_alu(dispatch, gc->alu); + if (!glamor_set_alu(dispatch, gc->alu)) { + glamor_put_dispatch(glamor_priv); + goto fail; + } + glamor_set_destination_pixmap_priv_nc(pixmap_priv); glamor_validate_pixmap(pixmap); dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT, diff --git a/glamor/glamor_setspans.c b/glamor/glamor_setspans.c index b6847a908..c5ecf85c5 100644 --- a/glamor/glamor_setspans.c +++ b/glamor/glamor_setspans.c @@ -75,7 +75,11 @@ _glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src, glamor_get_drawable_deltas(drawable, dest_pixmap, &x_off, &y_off); dispatch = glamor_get_dispatch(glamor_priv); - glamor_set_alu(dispatch, gc->alu); + if (!glamor_set_alu(dispatch, gc->alu)) { + glamor_put_dispatch(glamor_priv); + goto fail; + } + for (i = 0; i < n; i++) { n = REGION_NUM_RECTS(clip); diff --git a/glamor/glamor_tile.c b/glamor/glamor_tile.c index aa62d095e..be873ccc2 100644 --- a/glamor/glamor_tile.c +++ b/glamor/glamor_tile.c @@ -162,7 +162,10 @@ glamor_tile(PixmapPtr pixmap, PixmapPtr tile, pixmap_priv_get_scale(dst_pixmap_priv, &dst_xscale, &dst_yscale); dispatch = glamor_get_dispatch(glamor_priv); - glamor_set_alu(dispatch, alu); + if (!glamor_set_alu(dispatch, alu)) { + glamor_put_dispatch(glamor_priv); + goto fail; + } if (GLAMOR_PIXMAP_PRIV_NO_PENDING(src_pixmap_priv)) { pixmap_priv_get_scale(src_pixmap_priv, &src_xscale,