On 04.12.2012 01:07, Marek Olšák wrote:
> so that ReadPixels and various fallbacks work.

Err, shouldn't the state tracker do the resolve ? What if someone wants
to read back the individual samples ?

Yes, I know this adds a few complications, like how they are stored for
the transfer (maybe read them with separate transfers ? - yes, slow),
and that you get an extra copy because you won't be able to directly
write to a staging resource, but I really dislike this implicit resolve ...

> ---
>  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);

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

Reply via email to