[Mesa-dev] [RFC] gallium/u_blitter: support blitting PIPE_BUFFERs

Rob Clark robdclark at gmail.com
Wed Nov 22 15:56:51 UTC 2017


So, I could potentially do this for a5xx, which actually has a sort of
blit engine.  But for earlier gen's, everything is a glDraw(), and I
don't want to duplicate the functionality of u_blitter.

I suppose I could bypass util_blitter_blit() and use
util_blitter_blit_generic() directly..

BR,
-R

On Wed, Nov 22, 2017 at 10:14 AM, Roland Scheidegger <sroland at vmware.com> wrote:
> I don't think this is a good idea.
> 1D and buffer resources are fundamentally incompatible, it is highly
> illegal to use targets in views which are incompatible, so I'd rather
> not see such atrocities in shared code.
> I think you really want to fix up your resource_copy_region
> implementation one way or another so it can do gpu copies for buffers.
>
> Roland
>
> Am 22.11.2017 um 15:43 schrieb Rob Clark:
>> It is useful for staging/shadow transfers for drivers to be able to blit
>> BUFFERs.  Treat them as R8 1D textures for this purpose.
>>
>> Signed-off-by: Rob Clark <robdclark at gmail.com>
>> ---
>> This works at least if 1D textures are linear, so I suppose might not
>> work for all drivers.  Although I'm not entirely sure what the point
>> of a tiled 1D texture is.  And I guess drivers for which this wouldn't
>> work could continue to just not use u_blitter for BUFFERs.
>>
>>  src/gallium/auxiliary/util/u_blitter.c | 12 ++++++++++--
>>  1 file changed, 10 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
>> index 476ef08737e..7ba7b5aa57d 100644
>> --- a/src/gallium/auxiliary/util/u_blitter.c
>> +++ b/src/gallium/auxiliary/util/u_blitter.c
>> @@ -1445,7 +1445,10 @@ void util_blitter_default_dst_texture(struct pipe_surface *dst_templ,
>>                                        unsigned dstz)
>>  {
>>     memset(dst_templ, 0, sizeof(*dst_templ));
>> -   dst_templ->format = util_format_linear(dst->format);
>> +   if (dst->target == PIPE_BUFFER)
>> +      dst_templ->format = PIPE_FORMAT_R8_UINT;
>> +   else
>> +      dst_templ->format = util_format_linear(dst->format);
>>     dst_templ->u.tex.level = dstlevel;
>>     dst_templ->u.tex.first_layer = dstz;
>>     dst_templ->u.tex.last_layer = dstz;
>> @@ -1482,7 +1485,12 @@ void util_blitter_default_src_texture(struct blitter_context *blitter,
>>     else
>>        src_templ->target = src->target;
>>
>> -   src_templ->format = util_format_linear(src->format);
>> +   if (src->target  == PIPE_BUFFER) {
>> +      src_templ->target = PIPE_TEXTURE_1D;
>> +      src_templ->format = PIPE_FORMAT_R8_UINT;
>> +   } else {
>> +      src_templ->format = util_format_linear(src->format);
>> +   }
>>     src_templ->u.tex.first_level = srclevel;
>>     src_templ->u.tex.last_level = srclevel;
>>     src_templ->u.tex.first_layer = 0;
>>
>


More information about the mesa-dev mailing list