u_blitter: add a msaa parameter to util_blitter_clear
[mesa.git] / src / gallium / auxiliary / util / u_index_modify.c
index 65b079ed5372ec6a3e0571e72adee2650461c2bb..4e9349a7db66efb5af9f2274a94087567c9f9ade 100644 (file)
 #include "util/u_index_modify.h"
 #include "util/u_inlines.h"
 
-void util_shorten_ubyte_elts(struct pipe_context *context,
-                            struct pipe_resource **elts,
-                            int index_bias,
-                            unsigned start,
-                            unsigned count)
+/* Ubyte indices. */
+
+void util_shorten_ubyte_elts_to_userptr(struct pipe_context *context,
+                                       const struct pipe_draw_info *info,
+                                        unsigned add_transfer_flags,
+                                       int index_bias,
+                                       unsigned start,
+                                       unsigned count,
+                                       void *out)
 {
-    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;
+    struct pipe_transfer *src_transfer = NULL;
+    const unsigned char *in_map;
+    unsigned short *out_map = out;
     unsigned i;
 
-    new_elts = pipe_buffer_create(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);
-
+    if (info->has_user_indices) {
+       in_map = info->index.user;
+    } else {
+       in_map = pipe_buffer_map(context, info->index.resource,
+                                PIPE_TRANSFER_READ |
+                                add_transfer_flags,
+                                &src_transfer);
+    }
     in_map += start;
 
     for (i = 0; i < count; i++) {
@@ -52,76 +55,74 @@ void util_shorten_ubyte_elts(struct pipe_context *context,
         out_map++;
     }
 
-    pipe_buffer_unmap(context, *elts, src_transfer);
-    pipe_buffer_unmap(context, new_elts, dst_transfer);
-
-    *elts = new_elts;
+    if (src_transfer)
+       pipe_buffer_unmap(context, src_transfer);
 }
 
-void util_rebuild_ushort_elts(struct pipe_context *context,
-                             struct pipe_resource **elts,
-                             int index_bias,
-                             unsigned start, unsigned count)
+/* Ushort indices. */
+
+void util_rebuild_ushort_elts_to_userptr(struct pipe_context *context,
+                                        const struct pipe_draw_info *info,
+                                         unsigned add_transfer_flags,
+                                        int index_bias,
+                                        unsigned start, unsigned count,
+                                        void *out)
 {
     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;
+    const unsigned short *in_map;
+    unsigned short *out_map = out;
     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);
-
+    if (info->has_user_indices) {
+       in_map = info->index.user;
+    } else {
+       in_map = pipe_buffer_map(context, info->index.resource,
+                                PIPE_TRANSFER_READ |
+                                add_transfer_flags,
+                                &in_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, *elts, in_transfer);
-    pipe_buffer_unmap(context, new_elts, out_transfer);
-
-    *elts = new_elts;
+    if (in_transfer)
+       pipe_buffer_unmap(context, in_transfer);
 }
 
-void util_rebuild_uint_elts(struct pipe_context *context,
-                           struct pipe_resource **elts,
-                           int index_bias,
-                           unsigned start, unsigned count)
+/* Uint indices. */
+
+void util_rebuild_uint_elts_to_userptr(struct pipe_context *context,
+                                      const struct pipe_draw_info *info,
+                                       unsigned add_transfer_flags,
+                                      int index_bias,
+                                      unsigned start, unsigned count,
+                                      void *out)
 {
     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;
+    const unsigned int *in_map;
+    unsigned int *out_map = out;
     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);
-
+    if (info->has_user_indices) {
+       in_map = info->index.user;
+    } else {
+       in_map = pipe_buffer_map(context, info->index.resource,
+                                PIPE_TRANSFER_READ |
+                                add_transfer_flags,
+                                &in_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, *elts, in_transfer);
-    pipe_buffer_unmap(context, new_elts, out_transfer);
-
-    *elts = new_elts;
+    if (in_transfer)
+       pipe_buffer_unmap(context, in_transfer);
 }