[Mesa-dev] [PATCH 1/6] gallium/util: add new helpers for user index buffer uploading

Marek Olšák maraeo at gmail.com
Wed Feb 22 20:00:47 UTC 2017


From: Marek Olšák <marek.olsak at amd.com>

v3: split from the etnaviv patch; fix new_ib.buffer leak
---
 src/gallium/auxiliary/util/u_helpers.c | 30 ++++++++++++++++++++++++++++++
 src/gallium/auxiliary/util/u_helpers.h |  5 +++++
 2 files changed, 35 insertions(+)

diff --git a/src/gallium/auxiliary/util/u_helpers.c b/src/gallium/auxiliary/util/u_helpers.c
index 09020b0..35cca82 100644
--- a/src/gallium/auxiliary/util/u_helpers.c
+++ b/src/gallium/auxiliary/util/u_helpers.c
@@ -20,20 +20,21 @@
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  * IN NO EVENT SHALL THE AUTHORS AND/OR THEIR SUPPLIERS BE LIABLE FOR
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
  **************************************************************************/
 
 #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,
  * while properly referencing the pipe_vertex_buffer::buffer member.
  *
  * enabled_buffers is updated such that the bits corresponding to the indices
  * of disabled buffers are set to 0 and the enabled ones are set to 1.
  *
  * \sa util_copy_framebuffer_state
  */
@@ -102,10 +103,39 @@ util_set_index_buffer(struct pipe_index_buffer *dst,
 {
    if (src) {
       pipe_resource_reference(&dst->buffer, src->buffer);
       memcpy(dst, src, sizeof(*dst));
    }
    else {
       pipe_resource_reference(&dst->buffer, NULL);
       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 a9a53e4..7de960b 100644
--- a/src/gallium/auxiliary/util/u_helpers.h
+++ b/src/gallium/auxiliary/util/u_helpers.h
@@ -40,15 +40,20 @@ void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
                                   unsigned start_slot, unsigned count);
 
 void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
                                    unsigned *dst_count,
                                    const struct pipe_vertex_buffer *src,
                                    unsigned start_slot, unsigned count);
 
 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
 
 #endif
-- 
2.7.4



More information about the mesa-dev mailing list