summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/util
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-02-22 20:52:49 +0100
committerMarek Olšák <[email protected]>2017-02-25 00:03:09 +0100
commitf139b6fb4fc2d06a1df9dce3dc37ddf336bc64b3 (patch)
tree44f936ecd31b8f31f70994cf9ebc2181747a47df /src/gallium/auxiliary/util
parentb10197e3a44d25962e517b7b7f16b587bb698a49 (diff)
gallium/util: add new helpers for user index buffer uploading
v3: split from the etnaviv patch; fix new_ib.buffer leak Reviewed-by: Brian Paul <[email protected]> Tested-by: Brian Paul <[email protected]> (VMware driver only)
Diffstat (limited to 'src/gallium/auxiliary/util')
-rw-r--r--src/gallium/auxiliary/util/u_helpers.c30
-rw-r--r--src/gallium/auxiliary/util/u_helpers.h5
2 files changed, 35 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/util/u_helpers.c b/src/gallium/auxiliary/util/u_helpers.c
index 09020b061a3..35cca82c8e0 100644
--- a/src/gallium/auxiliary/util/u_helpers.c
+++ b/src/gallium/auxiliary/util/u_helpers.c
@@ -27,6 +27,7 @@
#include "util/u_helpers.h"
#include "util/u_inlines.h"
+#include "util/u_upload_mgr.h"
/**
* This function is used to copy an array of pipe_vertex_buffer structures,
@@ -109,3 +110,32 @@ util_set_index_buffer(struct pipe_index_buffer *dst,
memset(dst, 0, sizeof(*dst));
}
}
+
+/**
+ * Given a user index buffer, save the structure to "saved", and upload it.
+ */
+bool
+util_save_and_upload_index_buffer(struct pipe_context *pipe,
+ const struct pipe_draw_info *info,
+ const struct pipe_index_buffer *ib,
+ struct pipe_index_buffer *out_saved)
+{
+ struct pipe_index_buffer new_ib = {0};
+ unsigned start_offset = info->start * ib->index_size;
+
+ u_upload_data(pipe->stream_uploader, start_offset,
+ info->count * ib->index_size, 4,
+ (char*)ib->user_buffer + start_offset,
+ &new_ib.offset, &new_ib.buffer);
+ if (!new_ib.buffer)
+ return false;
+ u_upload_unmap(pipe->stream_uploader);
+
+ new_ib.offset -= start_offset;
+ new_ib.index_size = ib->index_size;
+
+ util_set_index_buffer(out_saved, ib);
+ pipe->set_index_buffer(pipe, &new_ib);
+ pipe_resource_reference(&new_ib.buffer, NULL);
+ return true;
+}
diff --git a/src/gallium/auxiliary/util/u_helpers.h b/src/gallium/auxiliary/util/u_helpers.h
index a9a53e4347a..7de960b907d 100644
--- a/src/gallium/auxiliary/util/u_helpers.h
+++ b/src/gallium/auxiliary/util/u_helpers.h
@@ -47,6 +47,11 @@ void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
void util_set_index_buffer(struct pipe_index_buffer *dst,
const struct pipe_index_buffer *src);
+bool util_save_and_upload_index_buffer(struct pipe_context *pipe,
+ const struct pipe_draw_info *info,
+ const struct pipe_index_buffer *ib,
+ struct pipe_index_buffer *out_saved);
+
#ifdef __cplusplus
}
#endif