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

Marek Olšák maraeo at gmail.com
Wed Nov 22 17:34:45 UTC 2017


I don't have anything against driver-specific hacks in u_blitter,
because it already contains a lot of that, although separated in
special functions.

For buffer blitting, I recommend using DMA. Your hw should have it,
because it's roughly based on radeon, which has had CP DMA since r200.

If not, I recommend using a compute shader for the copy. Pixel shaders
are also possible (with buffer stores), but your maximum width is 16K
at best, and the 3D engine also adds overhead.

The preferred method of hacking blits is to use
util_blitter_blit_generic. You start by inlining util_blitter_blit in
your driver and then you modify that. That's why
util_blitter_blit_generic exists.

Marek

On Wed, Nov 22, 2017 at 3:43 PM, Rob Clark <robdclark at gmail.com> wrote:
> 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;
> --
> 2.13.6
>


More information about the mesa-dev mailing list