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
