r300g: Fallback on surfaces we can't render to or from.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Tue, 13 Oct 2009 03:47:00 +0000 (20:47 -0700)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Tue, 13 Oct 2009 04:48:07 +0000 (21:48 -0700)
Still not sure why st keeps handing down things we can't render to.

src/gallium/drivers/r300/r300_surface.c

index cc6288cb519da9cbae70963bdefc07202f65c6ea..4d0ccd6b0fee1948cbc240f8defb8b5cc5a21000 100644 (file)
@@ -113,9 +113,10 @@ static void r300_surface_fill(struct pipe_context* pipe,
         dest, x, y, w, h, pixpitch, color);
 
     /* Fallback? */
-    if (FALSE) {
+    if (!pipe->screen->is_format_supported(pipe->screen, dest->format,
+        PIPE_TEXTURE_2D, PIPE_TEXTURE_USAGE_RENDER_TARGET, 0)) {
 fallback:
-        debug_printf("r300: Falling back on surface clear...");
+        debug_printf("r300: Falling back on surface clear...\n");
         util_surface_fill(pipe, dest, x, y, w, h, color);
         return;
     }
@@ -245,10 +246,18 @@ static void r300_surface_copy(struct pipe_context* pipe,
     if ((srctex->buffer == desttex->buffer) &&
             ((destx < srcx + w) || (srcx < destx + w)) &&
             ((desty < srcy + h) || (srcy < desty + h))) {
+        goto fallback;
+    }
+
+    if (!pipe->screen->is_format_supported(pipe->screen, src->format,
+            PIPE_TEXTURE_2D, PIPE_TEXTURE_USAGE_SAMPLER, 0) ||
+            !pipe->screen->is_format_supported(pipe->screen, dest->format,
+            PIPE_TEXTURE_2D, PIPE_TEXTURE_USAGE_RENDER_TARGET, 0)) {
 fallback:
         debug_printf("r300: Falling back on surface_copy\n");
         util_surface_copy(pipe, FALSE, dest, destx, desty, src,
                 srcx, srcy, w, h);
+        return;
     }
 
     /* Add our target BOs to the list. */