[Mesa-dev] [PATCH 4/7] gallium/u_suballoc: use clear_buffer if available
Marek Olšák
maraeo at gmail.com
Thu Feb 16 12:52:33 UTC 2017
From: Marek Olšák <marek.olsak at amd.com>
---
src/gallium/auxiliary/util/u_suballoc.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/src/gallium/auxiliary/util/u_suballoc.c b/src/gallium/auxiliary/util/u_suballoc.c
index 5aaddbc..8c463c9 100644
--- a/src/gallium/auxiliary/util/u_suballoc.c
+++ b/src/gallium/auxiliary/util/u_suballoc.c
@@ -98,27 +98,34 @@ u_suballocator_alloc(struct u_suballocator *allocator, unsigned size,
pipe_resource_reference(&allocator->buffer, NULL);
allocator->offset = 0;
allocator->buffer =
pipe_buffer_create(allocator->pipe->screen, allocator->bind,
allocator->usage, allocator->size);
if (!allocator->buffer)
goto fail;
/* Clear the memory if needed. */
if (allocator->zero_buffer_memory) {
- struct pipe_transfer *transfer = NULL;
- void *ptr;
-
- ptr = pipe_buffer_map(allocator->pipe, allocator->buffer,
- PIPE_TRANSFER_WRITE, &transfer);
- memset(ptr, 0, allocator->size);
- pipe_buffer_unmap(allocator->pipe, transfer);
+ struct pipe_context *pipe = allocator->pipe;
+
+ if (pipe->clear_buffer) {
+ unsigned clear_value = 0;
+
+ pipe->clear_buffer(pipe, allocator->buffer, 0, allocator->size,
+ &clear_value, 4);
+ } else {
+ struct pipe_transfer *transfer = NULL;
+ void *ptr = pipe_buffer_map(pipe, allocator->buffer,
+ PIPE_TRANSFER_WRITE, &transfer);
+ memset(ptr, 0, allocator->size);
+ pipe_buffer_unmap(pipe, transfer);
+ }
}
}
assert(allocator->offset % alignment == 0);
assert(allocator->offset < allocator->buffer->width0);
assert(allocator->offset + size <= allocator->buffer->width0);
/* Return the buffer. */
*out_offset = allocator->offset;
pipe_resource_reference(outbuf, allocator->buffer);
--
2.7.4
More information about the mesa-dev
mailing list