Mesa (master): util: add a way to store translated indices to a user memory in u_index_modify

Marek Olšák mareko at kemper.freedesktop.org
Wed Dec 29 17:42:29 UTC 2010


Module: Mesa
Branch: master
Commit: 76db330e2ca2a3eef9e0428edcdccf0c8215c57d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=76db330e2ca2a3eef9e0428edcdccf0c8215c57d

Author: Marek Olšák <maraeo at gmail.com>
Date:   Wed Dec 29 04:52:55 2010 +0100

util: add a way to store translated indices to a user memory in u_index_modify

I am about to use the upload buffer in r300g instead.

---

 src/gallium/auxiliary/util/u_index_modify.c |  111 ++++++++++++++++++--------
 src/gallium/auxiliary/util/u_index_modify.h |   24 ++++++
 2 files changed, 101 insertions(+), 34 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_index_modify.c b/src/gallium/auxiliary/util/u_index_modify.c
index 3822f60..f2c9db3 100644
--- a/src/gallium/auxiliary/util/u_index_modify.c
+++ b/src/gallium/auxiliary/util/u_index_modify.c
@@ -24,26 +24,70 @@
 #include "util/u_index_modify.h"
 #include "util/u_inlines.h"
 
+/* Ubyte indices. */
+
+void util_shorten_ubyte_elts_to_userptr(struct pipe_context *context,
+					struct pipe_resource *elts,
+					int index_bias,
+					unsigned start,
+					unsigned count,
+					void *out)
+{
+    struct pipe_transfer *src_transfer;
+    unsigned char *in_map;
+    unsigned short *out_map = out;
+    unsigned i;
+
+    in_map = pipe_buffer_map(context, elts, PIPE_TRANSFER_READ, &src_transfer);
+    in_map += start;
+
+    for (i = 0; i < count; i++) {
+        *out_map = (unsigned short)(*in_map + index_bias);
+        in_map++;
+        out_map++;
+    }
+
+    pipe_buffer_unmap(context, src_transfer);
+}
+
 void util_shorten_ubyte_elts(struct pipe_context *context,
 			     struct pipe_resource **elts,
 			     int index_bias,
 			     unsigned start,
 			     unsigned count)
 {
-    struct pipe_screen* screen = context->screen;
     struct pipe_resource* new_elts;
-    unsigned char *in_map;
     unsigned short *out_map;
-    struct pipe_transfer *src_transfer, *dst_transfer;
-    unsigned i;
+    struct pipe_transfer *dst_transfer;
 
-    new_elts = pipe_buffer_create(screen,
+    new_elts = pipe_buffer_create(context->screen,
                                   PIPE_BIND_INDEX_BUFFER,
                                   2 * count);
 
-    in_map = pipe_buffer_map(context, *elts, PIPE_TRANSFER_READ, &src_transfer);
-    out_map = pipe_buffer_map(context, new_elts, PIPE_TRANSFER_WRITE, &dst_transfer);
+    out_map = pipe_buffer_map(context, new_elts, PIPE_TRANSFER_WRITE,
+                              &dst_transfer);
+    util_shorten_ubyte_elts_to_userptr(context, *elts, index_bias,
+                                       start, count, out_map);
+    pipe_buffer_unmap(context, dst_transfer);
+
+    *elts = new_elts;
+}
+
+
+/* Ushort indices. */
+
+void util_rebuild_ushort_elts_to_userptr(struct pipe_context *context,
+					 struct pipe_resource *elts,
+					 int index_bias,
+					 unsigned start, unsigned count,
+					 void *out)
+{
+    struct pipe_transfer *in_transfer = NULL;
+    unsigned short *in_map;
+    unsigned short *out_map = out;
+    unsigned i;
 
+    in_map = pipe_buffer_map(context, elts, PIPE_TRANSFER_READ, &in_transfer);
     in_map += start;
 
     for (i = 0; i < count; i++) {
@@ -52,10 +96,7 @@ void util_shorten_ubyte_elts(struct pipe_context *context,
         out_map++;
     }
 
-    pipe_buffer_unmap(context, src_transfer);
-    pipe_buffer_unmap(context, dst_transfer);
-
-    *elts = new_elts;
+    pipe_buffer_unmap(context, in_transfer);
 }
 
 void util_rebuild_ushort_elts(struct pipe_context *context,
@@ -63,33 +104,47 @@ void util_rebuild_ushort_elts(struct pipe_context *context,
 			      int index_bias,
 			      unsigned start, unsigned count)
 {
-    struct pipe_transfer *in_transfer = NULL;
     struct pipe_transfer *out_transfer = NULL;
     struct pipe_resource *new_elts;
-    unsigned short *in_map;
     unsigned short *out_map;
-    unsigned i;
 
     new_elts = pipe_buffer_create(context->screen,
                                   PIPE_BIND_INDEX_BUFFER,
                                   2 * count);
 
-    in_map = pipe_buffer_map(context, *elts,
-                             PIPE_TRANSFER_READ, &in_transfer);
     out_map = pipe_buffer_map(context, new_elts,
                               PIPE_TRANSFER_WRITE, &out_transfer);
+    util_rebuild_ushort_elts_to_userptr(context, *elts, index_bias,
+                                        start, count, out_map);
+    pipe_buffer_unmap(context, out_transfer);
+
+    *elts = new_elts;
+}
+
 
+/* Uint indices. */
+
+void util_rebuild_uint_elts_to_userptr(struct pipe_context *context,
+				       struct pipe_resource *elts,
+				       int index_bias,
+				       unsigned start, unsigned count,
+				       void *out)
+{
+    struct pipe_transfer *in_transfer = NULL;
+    unsigned int *in_map;
+    unsigned int *out_map = out;
+    unsigned i;
+
+    in_map = pipe_buffer_map(context, elts, PIPE_TRANSFER_READ, &in_transfer);
     in_map += start;
+
     for (i = 0; i < count; i++) {
-        *out_map = (unsigned short)(*in_map + index_bias);
+        *out_map = (unsigned int)(*in_map + index_bias);
         in_map++;
         out_map++;
     }
 
     pipe_buffer_unmap(context, in_transfer);
-    pipe_buffer_unmap(context, out_transfer);
-
-    *elts = new_elts;
 }
 
 void util_rebuild_uint_elts(struct pipe_context *context,
@@ -97,30 +152,18 @@ void util_rebuild_uint_elts(struct pipe_context *context,
 			    int index_bias,
 			    unsigned start, unsigned count)
 {
-    struct pipe_transfer *in_transfer = NULL;
     struct pipe_transfer *out_transfer = NULL;
     struct pipe_resource *new_elts;
-    unsigned int *in_map;
     unsigned int *out_map;
-    unsigned i;
 
     new_elts = pipe_buffer_create(context->screen,
                                   PIPE_BIND_INDEX_BUFFER,
                                   2 * count);
 
-    in_map = pipe_buffer_map(context, *elts,
-                             PIPE_TRANSFER_READ, &in_transfer);
     out_map = pipe_buffer_map(context, new_elts,
                               PIPE_TRANSFER_WRITE, &out_transfer);
-
-    in_map += start;
-    for (i = 0; i < count; i++) {
-        *out_map = (unsigned int)(*in_map + index_bias);
-        in_map++;
-        out_map++;
-    }
-
-    pipe_buffer_unmap(context, in_transfer);
+    util_rebuild_uint_elts_to_userptr(context, *elts, index_bias,
+                                      start, count, out_map);
     pipe_buffer_unmap(context, out_transfer);
 
     *elts = new_elts;
diff --git a/src/gallium/auxiliary/util/u_index_modify.h b/src/gallium/auxiliary/util/u_index_modify.h
index 01a6cae..dc28fe0 100644
--- a/src/gallium/auxiliary/util/u_index_modify.h
+++ b/src/gallium/auxiliary/util/u_index_modify.h
@@ -23,19 +23,43 @@
 #ifndef UTIL_INDEX_MODIFY_H
 #define UTIL_INDEX_MODIFY_H
 
+void util_shorten_ubyte_elts_to_userptr(struct pipe_context *context,
+					struct pipe_resource *elts,
+					int index_bias,
+					unsigned start,
+					unsigned count,
+					void *out);
+
 void util_shorten_ubyte_elts(struct pipe_context *context,
 			     struct pipe_resource **elts,
 			     int index_bias,
 			     unsigned start,
 			     unsigned count);
 
+
+
+void util_rebuild_ushort_elts_to_userptr(struct pipe_context *context,
+					 struct pipe_resource *elts,
+					 int index_bias,
+					 unsigned start, unsigned count,
+					 void *out);
+
 void util_rebuild_ushort_elts(struct pipe_context *context,
 			      struct pipe_resource **elts,
 			      int index_bias,
 			      unsigned start, unsigned count);
 
+
+
+void util_rebuild_uint_elts_to_userptr(struct pipe_context *context,
+				       struct pipe_resource *elts,
+				       int index_bias,
+				       unsigned start, unsigned count,
+				       void *out);
+
 void util_rebuild_uint_elts(struct pipe_context *context,
 			    struct pipe_resource **elts,
 			    int index_bias,
 			    unsigned start, unsigned count);
+
 #endif




More information about the mesa-commit mailing list