so that ReadPixels and various fallbacks work.
---
 src/gallium/drivers/r600/r600_texture.c |   37 ++++++++++++++++++++++++++-----
 1 file changed, 32 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_texture.c 
b/src/gallium/drivers/r600/r600_texture.c
index 0054c5b..d6d1b3d 100644
--- a/src/gallium/drivers/r600/r600_texture.c
+++ b/src/gallium/drivers/r600/r600_texture.c
@@ -31,18 +31,38 @@
 #include "util/u_format_s3tc.h"
 #include "util/u_memory.h"
 
+
 /* Copy from a full GPU texture to a transfer's staging one. */
 static void r600_copy_to_staging_texture(struct pipe_context *ctx, struct 
r600_transfer *rtransfer)
 {
        struct pipe_transfer *transfer = (struct pipe_transfer*)rtransfer;
-       struct pipe_resource *texture = transfer->resource;
+       struct pipe_resource *dst = &rtransfer->staging->b.b;
+       struct pipe_resource *src = transfer->resource;
 
-       ctx->resource_copy_region(ctx, &rtransfer->staging->b.b,
-                               0, 0, 0, 0, texture, transfer->level,
-                               &transfer->box);
+       if (src->nr_samples <= 1) {
+               ctx->resource_copy_region(ctx, dst, 0, 0, 0, 0,
+                                         src, transfer->level, &transfer->box);
+       } else {
+               /* Resolve the resource. */
+               struct pipe_blit_info blit;
+
+               memset(&blit, 0, sizeof(blit));
+               blit.src.resource = src;
+               blit.src.format = src->format;
+               blit.src.level = transfer->level;
+               blit.src.box = transfer->box;
+               blit.dst.resource = dst;
+               blit.dst.format = dst->format;
+               blit.dst.box.width = transfer->box.width;
+               blit.dst.box.height = transfer->box.height;
+               blit.dst.box.depth = transfer->box.depth;
+               blit.mask = PIPE_MASK_RGBA;
+               blit.filter = PIPE_TEX_FILTER_NEAREST;
+
+               ctx->blit(ctx, &blit);
+       }
 }
 
-
 /* Copy from a transfer's staging texture to a full GPU one. */
 static void r600_copy_from_staging_texture(struct pipe_context *ctx, struct 
r600_transfer *rtransfer)
 {
@@ -715,6 +735,13 @@ static void *r600_texture_transfer_map(struct pipe_context 
*ctx,
                */
                struct r600_texture *staging_depth;
 
+               assert(rtex->resource.b.b.nr_samples <= 1);
+               if (rtex->resource.b.b.nr_samples > 1) {
+                       R600_ERR("mapping MSAA zbuffer unimplemented\n");
+                       FREE(trans);
+                       return NULL;
+               }
+
                if (!r600_init_flushed_depth_texture(ctx, texture, 
&staging_depth)) {
                        R600_ERR("failed to create temporary texture to hold 
untiled copy\n");
                        FREE(trans);
-- 
1.7.10.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to