Mesa (master): r300g: try harder to create a transfer object

Marek Olšák mareko at kemper.freedesktop.org
Wed Jun 9 12:49:03 PDT 2010


Module: Mesa
Branch: master
Commit: 45fb47d50c08bc4c11e4454883641501713e5710
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=45fb47d50c08bc4c11e4454883641501713e5710

Author: Marek Olšák <maraeo at gmail.com>
Date:   Wed Jun  9 21:29:26 2010 +0200

r300g: try harder to create a transfer object

I was told this wouldn't help to fix the FDO bug #28443, but still,
it's a harmless last resort.

Also, linear textures safely fallback to an unpipelined transfer here.

---

 src/gallium/drivers/r300/r300_transfer.c |   41 ++++++++++++++++++++++++-----
 1 files changed, 34 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_transfer.c b/src/gallium/drivers/r300/r300_transfer.c
index 3eabe23..f0b5e96 100644
--- a/src/gallium/drivers/r300/r300_transfer.c
+++ b/src/gallium/drivers/r300/r300_transfer.c
@@ -162,6 +162,29 @@ r300_texture_get_transfer(struct pipe_context *ctx,
                ctx->screen->resource_create(ctx->screen,
                                             &base));
 
+            if (!trans->detiled_texture) {
+                /* Oh crap, the thing can't create the texture.
+                 * Let's flush and try again. */
+                ctx->flush(ctx, 0, NULL);
+
+                trans->detiled_texture = r300_texture(
+                   ctx->screen->resource_create(ctx->screen,
+                                                &base));
+
+                if (!trans->detiled_texture) {
+                    /* For linear textures, it's safe to fallback to
+                     * an unpipelined transfer. */
+                    if (!tex->microtile && !tex->macrotile) {
+                        goto unpipelined;
+                    }
+
+                    /* Otherwise, go to hell. */
+                    fprintf(stderr,
+                        "r300: Failed to create a transfer object, praise.\n");
+                    return NULL;
+                }
+            }
+
             assert(!trans->detiled_texture->microtile &&
                    !trans->detiled_texture->macrotile);
 
@@ -183,16 +206,20 @@ r300_texture_get_transfer(struct pipe_context *ctx,
                 /* Always referenced in the blit. */
                 ctx->flush(ctx, 0, NULL);
             }
-        } else {
-            trans->transfer.stride =
+            return &trans->transfer;
+        }
+
+    unpipelined:
+        /* Unpipelined transfer. */
+        trans->transfer.stride =
                 r300_texture_get_stride(r300screen, tex, sr.level);
-            trans->offset = r300_texture_get_offset(tex, sr.level, box->z, sr.face);
+        trans->offset = r300_texture_get_offset(tex, sr.level, box->z, sr.face);
 
-            if (referenced_cs && (usage & PIPE_TRANSFER_READ))
-                ctx->flush(ctx, PIPE_FLUSH_RENDER_CACHE, NULL);
-        }
+        if (referenced_cs && (usage & PIPE_TRANSFER_READ))
+            ctx->flush(ctx, PIPE_FLUSH_RENDER_CACHE, NULL);
+        return &trans->transfer;
     }
-    return &trans->transfer;
+    return NULL;
 }
 
 void r300_texture_transfer_destroy(struct pipe_context *ctx,



More information about the mesa-commit mailing list