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

Rob Clark robdclark at gmail.com
Wed Nov 22 14:43:59 UTC 2017


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