diff options
author | Dave Airlie <airlied@redhat.com> | 2020-11-02 17:13:48 +1000 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-11-03 21:35:08 +0000 |
commit | c3d8a69c3a6511d9c44d862193253c39964f213a (patch) | |
tree | 7bf5a2e5a2b246d6f636c5923e50a27f53ab8fb6 /src/gallium/drivers/llvmpipe | |
parent | 1e3fbee4b0ad8424df75c5729125d8b5164638e5 (diff) |
llvmpipe: add clear_buffer callback. (v2)
This fixes CL CTS thread dimensions test
v2: optimise for 1 and 4. (ajax)
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7416>
Diffstat (limited to 'src/gallium/drivers/llvmpipe')
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_surface.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_surface.c b/src/gallium/drivers/llvmpipe/lp_surface.c index 02b72ae3f3a..9ba2b87b82e 100644 --- a/src/gallium/drivers/llvmpipe/lp_surface.c +++ b/src/gallium/drivers/llvmpipe/lp_surface.c @@ -27,6 +27,7 @@ #include "util/u_rect.h" #include "util/u_surface.h" +#include "util/u_memset.h" #include "lp_context.h" #include "lp_flush.h" #include "lp_limits.h" @@ -442,6 +443,41 @@ llvmpipe_clear_texture(struct pipe_context *pipe, } } +static void +llvmpipe_clear_buffer(struct pipe_context *pipe, + struct pipe_resource *res, + unsigned offset, + unsigned size, + const void *clear_value, + int clear_value_size) +{ + struct pipe_transfer *dst_t; + struct pipe_box box; + char *dst; + u_box_1d(offset, size, &box); + + dst = pipe->transfer_map(pipe, + res, + 0, + PIPE_MAP_WRITE, + &box, + &dst_t); + + switch (clear_value_size) { + case 1: + memset(dst, *(uint8_t *)clear_value, size); + break; + case 4: + util_memset32(dst, *(uint32_t *)clear_value, size / 4); + break; + default: + for (unsigned i = 0; i < size; i += clear_value_size) + memcpy(&dst[i], clear_value, clear_value_size); + break; + } + pipe->transfer_unmap(pipe, dst_t); +} + void llvmpipe_init_surface_functions(struct llvmpipe_context *lp) { @@ -451,6 +487,7 @@ llvmpipe_init_surface_functions(struct llvmpipe_context *lp) lp->pipe.surface_destroy = llvmpipe_surface_destroy; /* These are not actually functions dealing with surfaces */ lp->pipe.clear_texture = llvmpipe_clear_texture; + lp->pipe.clear_buffer = llvmpipe_clear_buffer; lp->pipe.resource_copy_region = lp_resource_copy; lp->pipe.blit = lp_blit; lp->pipe.flush_resource = lp_flush_resource; |