[Mesa-dev] [PATCH 03/10] r600g: transfers of MSAA color textures should do the resolve

Marek Olšák maraeo at gmail.com
Tue Dec 4 04:44:25 PST 2012


It's the easiest approach and it's pretty much what Intel does.
There's a lot of fallbacks which map textures and this makes them
trivially work. Note that this is mainly for the window-system
multi-sample framebuffer, which must implemented the same features as
a single-sample one has. That means ReadPixels, CopyTex*Image and
CopyPixels are allowed, unlike a multisample FBO which generates
INVALID_OPERATION in those functions.

Also radeons cannot map MSAA textures directly. r300 cannot map them
at all, r600 can map only one sample at a time (or it would have to
copy each sample to a separate layer).

Marek

On Tue, Dec 4, 2012 at 12:35 PM, Christoph Bumiller
<e0425955 at student.tuwien.ac.at> wrote:
> 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);
>


More information about the mesa-dev mailing list