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 <[email protected]> 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 <[email protected]>
> ---
> 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
>
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to