diff --git a/glamor/glamor_copyarea.c b/glamor/glamor_copyarea.c index c89dffcba..077c44ffd 100644 --- a/glamor/glamor_copyarea.c +++ b/glamor/glamor_copyarea.c @@ -80,27 +80,22 @@ glamor_copy_area(DrawablePtr src, DrawablePtr dst, GCPtr gc, RegionPtr region; if (!GLEW_EXT_framebuffer_blit) { - ErrorF("EXT_framebuffer_blit unsupported\n"); + glamor_fallback("glamor_copy_area(): " + "EXT_framebuffer_blit unsupported\n"); goto fail; } - if (!glamor_set_destination_pixmap(dst_pixmap)) { - /* - return miDoCopy(pSrcDrawable, pDstDrawable, pGC, - srcx, srcy, width, height, - dstx, dsty, fbCopyNtoN, 0, NULL); - */ - return NULL; - } + if (!glamor_set_destination_pixmap(dst_pixmap)) + goto fail; if (src_priv == NULL) { - ErrorF("glamor_copy_area: no src pixmap priv?"); + glamor_fallback("glamor_copy_area(): no src pixmap priv"); goto fail; } if (src_priv->fb == 0 && src_pixmap != screen_pixmap) { - ErrorF("glamor_copy_area: No src FBO\n"); - return NULL; + glamor_fallback("glamor_copy_area(): no src fbo"); + goto fail; } glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, src_priv->fb); @@ -112,5 +107,17 @@ glamor_copy_area(DrawablePtr src, DrawablePtr dst, GCPtr gc, return region; fail: - return NULL; + glamor_fallback("glamor_copy_area from %p to %p (%c,%c)\n", src, dst, + glamor_get_drawable_location(src), + glamor_get_drawable_location(dst)); + region = NULL; + if (glamor_prepare_access(dst, GLAMOR_ACCESS_RW)) { + if (glamor_prepare_access(src, GLAMOR_ACCESS_RO)) { + region = fbCopyArea(src, dst, gc, srcx, srcy, width, height, + dstx, dsty); + glamor_finish_access(src); + } + glamor_finish_access(dst); + } + return region; } diff --git a/glamor/glamor_core.c b/glamor/glamor_core.c index 4ae0d6c78..32a09b625 100644 --- a/glamor/glamor_core.c +++ b/glamor/glamor_core.c @@ -39,13 +39,26 @@ #include "glamor_priv.h" +const Bool +glamor_get_drawable_location(const DrawablePtr drawable) +{ + PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable); + glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); + if (pixmap_priv == NULL) + return 'm'; + if (pixmap_priv->fb == 0) + return 's'; + else + return 'f'; +} + Bool glamor_set_destination_pixmap(PixmapPtr pixmap) { glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); if (pixmap_priv == NULL) { - ErrorF("no pixmap priv?"); + glamor_fallback("glamor_set_destination_pixmap(): no pixmap priv"); return FALSE; } @@ -54,7 +67,7 @@ glamor_set_destination_pixmap(PixmapPtr pixmap) PixmapPtr screen_pixmap = screen->GetScreenPixmap(screen); if (pixmap != screen_pixmap) { - ErrorF("No FBO\n"); + glamor_fallback("glamor_set_destination_pixmap(): no fbo"); return FALSE; } } diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h index ad68c12f1..2ee16ef56 100644 --- a/glamor/glamor_priv.h +++ b/glamor/glamor_priv.h @@ -117,6 +117,17 @@ glamor_pm_is_solid(DrawablePtr drawable, unsigned long planemask) FbFullMask(drawable->depth); } +static inline void +glamor_fallback(char *format, ...) +{ + va_list ap; + + va_start(ap, format); + LogMessageVerb(X_INFO, 1, "glamor fallback: "); + LogVMessageVerb(X_INFO, 1, format, ap); + va_end(ap); +} + /* glamor.c */ PixmapPtr glamor_get_drawable_pixmap(DrawablePtr drawable); @@ -129,6 +140,7 @@ Bool glamor_prepare_access(DrawablePtr drawable, glamor_access_t access); void glamor_finish_access(DrawablePtr drawable); Bool glamor_prepare_access_window(WindowPtr window); void glamor_finish_access_window(WindowPtr window); +const Bool glamor_get_drawable_location(const DrawablePtr drawable); Bool glamor_create_gc(GCPtr gc); void glamor_stipple(PixmapPtr pixmap, PixmapPtr stipple, int x, int y, int width, int height,