summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-02-08 11:23:14 +0100
committerEric Anholt <eric@anholt.net>2010-02-08 11:23:14 +0100
commit1ecee9d26f26a61f2e1210b073ec5a858908bcee (patch)
treebaf69b82b3070374e43c67a44b82852cc4c87566
parentaf5fe384af90eec1caf131f2ddd3522422b510c4 (diff)
glamor: Add fallbacks for Render.
-rw-r--r--glamor/glamor_priv.h4
-rw-r--r--glamor/glamor_render.c39
2 files changed, 33 insertions, 10 deletions
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 2ee16ef56..b470be5a4 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -123,8 +123,8 @@ glamor_fallback(char *format, ...)
va_list ap;
va_start(ap, format);
- LogMessageVerb(X_INFO, 1, "glamor fallback: ");
- LogVMessageVerb(X_INFO, 1, format, ap);
+ LogMessageVerb(X_INFO, 0, "fallback: ");
+ LogVMessageVerb(X_NONE, 0, format, ap);
va_end(ap);
}
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 2ebb4c5c9..b6f6b86cb 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -25,7 +25,6 @@
*
*/
-
/** @file glamor_render.c
*
* Render acceleration implementation
@@ -35,6 +34,7 @@
#ifdef RENDER
#include "mipict.h"
+#include "fbpict.h"
#include "glu3/glu3.h"
@@ -474,11 +474,11 @@ glamor_composite(CARD8 op,
source_pixmap = glamor_get_drawable_pixmap(source->pDrawable);
source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
if (source_pixmap == dest_pixmap) {
- ErrorF("source == dest\n");
+ glamor_fallback("glamor_composite(): source == dest\n");
goto fail;
}
if (!source_pixmap_priv || source_pixmap_priv->tex == 0) {
- ErrorF("no FBO in source\n");
+ glamor_fallback("glamor_composite(): no FBO in source\n");
goto fail;
}
}
@@ -486,18 +486,19 @@ glamor_composite(CARD8 op,
mask_pixmap = glamor_get_drawable_pixmap(mask->pDrawable);
mask_pixmap_priv = glamor_get_pixmap_private(mask_pixmap);
if (mask_pixmap == dest_pixmap) {
- ErrorF("mask == dest\n");
+ glamor_fallback("glamor_composite(): mask == dest\n");
goto fail;
}
if (!mask_pixmap_priv || mask_pixmap_priv->tex == 0) {
- ErrorF("no FBO in mask\n");
+ glamor_fallback("glamor_composite(): no FBO in mask\n");
goto fail;
}
}
shader = glamor_lookup_composite_shader(screen, &key);
if (shader->prog == 0) {
- ErrorF("No program compiled for this render accel mode\n");
+ glamor_fallback("glamor_composite(): "
+ "no shader program for this render acccel mode\n");
goto fail;
}
@@ -570,9 +571,31 @@ glamor_composite(CARD8 op,
return;
fail:
- glamor_set_composite_op(screen, PictOpSrc, dest, mask);
+ glamor_fallback("glamor_composite(): "
+ "from picts %p/%p to pict %p\n", source, mask, dest);
+
glUseProgramObjectARB(0);
- glamor_solid_fail_region(dest_pixmap, x_dest, y_dest, width, height);
+ if (glamor_prepare_access(dest->pDrawable, GLAMOR_ACCESS_RW)) {
+ if (source->pDrawable == NULL ||
+ glamor_prepare_access(source->pDrawable, GLAMOR_ACCESS_RO))
+ {
+ if (!mask || mask->pDrawable == NULL ||
+ glamor_prepare_access(mask->pDrawable, GLAMOR_ACCESS_RO))
+ {
+ fbComposite(op,
+ source, mask, dest,
+ x_source, y_source,
+ x_mask, y_mask,
+ x_dest, y_dest,
+ width, height);
+ if (mask && mask->pDrawable != NULL)
+ glamor_finish_access(mask->pDrawable);
+ }
+ if (source->pDrawable != NULL)
+ glamor_finish_access(source->pDrawable);
+ }
+ glamor_finish_access(dest->pDrawable);
+ }
}