u_prim_restart: handle user buffers in util_translate_prim_restart_ib()
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Thu, 2 Jul 2020 20:08:44 +0000 (16:08 -0400)
committerMarge Bot <eric+marge@anholt.net>
Fri, 10 Jul 2020 10:54:44 +0000 (10:54 +0000)
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5806>

src/gallium/auxiliary/util/u_prim_restart.c

index 10e39e240dbf2b2f1e86954cda84ddff5017b083..188f49e34c453f808b655bf827446bbdc5d1ce49 100644 (file)
@@ -52,9 +52,6 @@ util_translate_prim_restart_ib(struct pipe_context *context,
    dst_index_size = MAX2(2, info->index_size);
    assert(dst_index_size == 2 || dst_index_size == 4);
 
-   /* no user buffers for now */
-   assert(!info->has_user_indices);
-
    /* Create new index buffer */
    *dst_buffer = pipe_buffer_create(screen, PIPE_BIND_INDEX_BUFFER,
                                     PIPE_USAGE_STREAM,
@@ -68,12 +65,15 @@ util_translate_prim_restart_ib(struct pipe_context *context,
    if (!dst_map)
       goto error;
 
-   /* Map original / src index buffer */
-   src_map = pipe_buffer_map_range(context, info->index.resource,
-                                   info->start * src_index_size,
-                                   info->count * src_index_size,
-                                   PIPE_TRANSFER_READ,
-                                   &src_transfer);
+   if (info->has_user_indices)
+      src_map = (unsigned char*)info->index.user + info->start * src_index_size;
+   else
+      /* Map original / src index buffer */
+      src_map = pipe_buffer_map_range(context, info->index.resource,
+                                      info->start * src_index_size,
+                                      info->count * src_index_size,
+                                      PIPE_TRANSFER_READ,
+                                      &src_transfer);
    if (!src_map)
       goto error;
 
@@ -104,7 +104,8 @@ util_translate_prim_restart_ib(struct pipe_context *context,
       }
    }
 
-   pipe_buffer_unmap(context, src_transfer);
+   if (src_transfer)
+      pipe_buffer_unmap(context, src_transfer);
    pipe_buffer_unmap(context, dst_transfer);
 
    return PIPE_OK;