Mesa (master): r300g: try harder to create a transfer object
Marek Olšák
mareko at kemper.freedesktop.org
Wed Jun 9 19:49:03 UTC 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