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 b4880378c0..a373d3d0b8 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 e8419c6335..53c750afbe 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 4e8d6b885e..35b2d56f1c 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 71d5bf0071..bea4f662ab 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 d270cae59d..010950e594 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 b6847a908d..c5ecf85c5b 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 aa62d095ed..be873ccc2a 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,