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

Roland Scheidegger sroland at vmware.com
Wed Nov 22 15:14:02 UTC 2017


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