[Mesa-dev] [PATCH 03/10] r600g: transfers of MSAA color textures should do the resolve
Marek Olšák
maraeo at gmail.com
Mon Dec 3 16:07:12 PST 2012
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
More information about the mesa-dev
mailing list