diff --git a/glamor/glamor_core.c b/glamor/glamor_core.c index 14031d276..a517045a5 100644 --- a/glamor/glamor_core.c +++ b/glamor/glamor_core.c @@ -621,15 +621,17 @@ glamor_finish_access_gc(GCPtr gc) glamor_finish_access(&gc->stipple->drawable); } -void +Bool glamor_stipple(PixmapPtr pixmap, PixmapPtr stipple, int x, int y, int width, int height, unsigned char alu, unsigned long planemask, unsigned long fg_pixel, unsigned long bg_pixel, int stipple_x, int stipple_y) { - ErrorF("stubbed out stipple depth %d\n", pixmap->drawable.depth); - glamor_solid_fail_region(pixmap, x, y, width, height); + glamor_fallback("stubbed out stipple depth %d\n", pixmap->drawable.depth); + return FALSE; +// ErrorF("stubbed out stipple depth %d\n", pixmap->drawable.depth); +// glamor_solid_fail_region(pixmap, x, y, width, height); } GCOps glamor_gc_ops = { diff --git a/glamor/glamor_fill.c b/glamor/glamor_fill.c index 8ea70d0cf..2b94934b6 100644 --- a/glamor/glamor_fill.c +++ b/glamor/glamor_fill.c @@ -42,23 +42,23 @@ glamor_fill(DrawablePtr drawable, { PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(drawable); int x_off, y_off; - glamor_get_drawable_deltas(drawable, dst_pixmap, &x_off, &y_off); switch (gc->fillStyle) { case FillSolid: - glamor_solid(dst_pixmap, - x + x_off, - y + y_off, - width, - height, - gc->alu, - gc->planemask, - gc->fgPixel); + if (!glamor_solid(dst_pixmap, + x + x_off, + y + y_off, + width, + height, + gc->alu, + gc->planemask, + gc->fgPixel)) + goto fail; break; case FillStippled: case FillOpaqueStippled: - glamor_stipple(dst_pixmap, + if (!glamor_stipple(dst_pixmap, gc->stipple, x+ x_off, y + y_off, @@ -69,10 +69,12 @@ glamor_fill(DrawablePtr drawable, gc->fgPixel, gc->bgPixel, gc->patOrg.x + x_off, - gc->patOrg.y + y_off); + gc->patOrg.y + y_off)) + goto fail; + return; break; case FillTiled: - glamor_tile(dst_pixmap, + if (!glamor_tile(dst_pixmap, gc->tile.pixmap, x + x_off, y + y_off, @@ -81,12 +83,12 @@ glamor_fill(DrawablePtr drawable, gc->alu, gc->planemask, drawable->x + x - gc->patOrg.x, - drawable->y + y - gc->patOrg.y); + drawable->y + y - gc->patOrg.y)) + goto fail; break; } return; -#if 0 - fail: +fail: glamor_fallback("glamor_fill()"); if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) { if (glamor_prepare_access_gc(gc)) { @@ -95,7 +97,6 @@ glamor_fill(DrawablePtr drawable, } glamor_finish_access(drawable); } -#endif return; } @@ -140,7 +141,7 @@ glamor_init_solid_shader(ScreenPtr screen) glGetUniformLocationARB(glamor_priv->solid_prog, "color"); } -void +Bool glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, unsigned char alu, unsigned long planemask, unsigned long fg_pixel) { @@ -154,12 +155,12 @@ glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, float vertices[4][2]; if (!glamor_set_destination_pixmap(pixmap)) - return; + goto fail; glamor_set_alu(alu); if (!glamor_set_planemask(pixmap, planemask)) { - ErrorF("Failedto set planemask in glamor_solid.\n"); - goto fail; - } + ErrorF("Failedto set planemask in glamor_solid.\n"); + goto fail; + } glUseProgramObjectARB(glamor_priv->solid_prog); glamor_get_color_4f_from_pixel(pixmap, fg_pixel, color); @@ -188,9 +189,11 @@ glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, glDisableClientState(GL_VERTEX_ARRAY); glUseProgramObjectARB(0); + return TRUE; fail: glamor_set_alu(GXcopy); glamor_set_planemask(pixmap, ~0); + return FALSE; } /* Highlight places where we're doing it wrong. */ diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h index 9f1679269..1dc2c42c5 100644 --- a/glamor/glamor_priv.h +++ b/glamor/glamor_priv.h @@ -350,7 +350,7 @@ const Bool glamor_get_drawable_location(const DrawablePtr drawable); void glamor_get_drawable_deltas(DrawablePtr drawable, PixmapPtr pixmap, int *x, int *y); Bool glamor_create_gc(GCPtr gc); -void glamor_stipple(PixmapPtr pixmap, PixmapPtr stipple, +Bool glamor_stipple(PixmapPtr pixmap, PixmapPtr stipple, int x, int y, int width, int height, unsigned char alu, unsigned long planemask, unsigned long fg_pixel, unsigned long bg_pixel, @@ -376,7 +376,7 @@ void glamor_fill(DrawablePtr drawable, int y, int width, int height); -void glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, +Bool glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height, unsigned char alu, unsigned long planemask, unsigned long fg_pixel); void glamor_solid_fail_region(PixmapPtr pixmap, @@ -456,7 +456,7 @@ void glamor_composite_rects(CARD8 op, int nrect, glamor_composite_rect_t *rects); /* glamor_tile.c */ -void glamor_tile(PixmapPtr pixmap, PixmapPtr tile, +Bool glamor_tile(PixmapPtr pixmap, PixmapPtr tile, int x, int y, int width, int height, unsigned char alu, unsigned long planemask, int tile_x, int tile_y); diff --git a/glamor/glamor_tile.c b/glamor/glamor_tile.c index 58923701e..5b1e73d5a 100644 --- a/glamor/glamor_tile.c +++ b/glamor/glamor_tile.c @@ -72,7 +72,7 @@ glamor_init_tile_shader(ScreenPtr screen) glUseProgramObjectARB(0); } -void +Bool glamor_tile(PixmapPtr pixmap, PixmapPtr tile, int x, int y, int width, int height, unsigned char alu, unsigned long planemask, @@ -93,7 +93,7 @@ glamor_tile(PixmapPtr pixmap, PixmapPtr tile, float source_texcoords[4][2]; if (glamor_priv->tile_prog == 0) { - ErrorF("Tiling unsupported\n"); + glamor_fallback("Tiling unsupported\n"); goto fail; } @@ -101,7 +101,7 @@ glamor_tile(PixmapPtr pixmap, PixmapPtr tile, goto fail; if (tile_priv->tex == 0) { - ErrorF("Non-texture tile pixmap\n"); + glamor_fallback("Non-texture tile pixmap\n"); goto fail; } @@ -167,9 +167,8 @@ glamor_tile(PixmapPtr pixmap, PixmapPtr tile, glDisable(GL_TEXTURE_2D); glamor_set_alu(GXcopy); glamor_set_planemask(pixmap, ~0); - return; + return TRUE; fail: - glamor_solid_fail_region(pixmap, x, y, width, height); - return; + return FALSE; }