summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/llvmpipe
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2020-11-02 17:13:48 +1000
committerMarge Bot <eric+marge@anholt.net>2020-11-03 21:35:08 +0000
commitc3d8a69c3a6511d9c44d862193253c39964f213a (patch)
tree7bf5a2e5a2b246d6f636c5923e50a27f53ab8fb6 /src/gallium/drivers/llvmpipe
parent1e3fbee4b0ad8424df75c5729125d8b5164638e5 (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.c37
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;