gallium/util: factor out primitive-restart rewriting logic
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Wed, 17 Jun 2020 13:52:05 +0000 (15:52 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 18 Aug 2020 12:12:27 +0000 (12:12 +0000)
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5976>

src/gallium/auxiliary/util/u_prim_restart.c
src/gallium/auxiliary/util/u_prim_restart.h

index a6bfa16dc57587326e598797cd365662135e8ad5..844c52287752b517ea0b88e5a5245847102481a1 100644 (file)
@@ -57,6 +57,38 @@ read_indirect_elements(struct pipe_context *context, struct pipe_draw_indirect_i
    return ret;
 }
 
+void
+util_translate_prim_restart_data(unsigned index_size,
+                                 void *src_map, void *dst_map,
+                                 unsigned count, unsigned restart_index)
+{
+   if (index_size == 1) {
+      uint8_t *src = (uint8_t *) src_map;
+      uint16_t *dst = (uint16_t *) dst_map;
+      unsigned i;
+      for (i = 0; i < count; i++) {
+         dst[i] = (src[i] == restart_index) ? 0xffff : src[i];
+      }
+   }
+   else if (index_size == 2) {
+      uint16_t *src = (uint16_t *) src_map;
+      uint16_t *dst = (uint16_t *) dst_map;
+      unsigned i;
+      for (i = 0; i < count; i++) {
+         dst[i] = (src[i] == restart_index) ? 0xffff : src[i];
+      }
+   }
+   else {
+      uint32_t *src = (uint32_t *) src_map;
+      uint32_t *dst = (uint32_t *) dst_map;
+      unsigned i;
+      assert(index_size == 4);
+      for (i = 0; i < count; i++) {
+         dst[i] = (src[i] == restart_index) ? 0xffffffff : src[i];
+      }
+   }
+}
+
 /**
  * Translate an index buffer for primitive restart.
  * Create a new index buffer which is a copy of the original index buffer
@@ -113,32 +145,8 @@ util_translate_prim_restart_ib(struct pipe_context *context,
    if (!src_map)
       goto error;
 
-   if (src_index_size == 1 && dst_index_size == 2) {
-      uint8_t *src = (uint8_t *) src_map;
-      uint16_t *dst = (uint16_t *) dst_map;
-      unsigned i;
-      for (i = 0; i < count; i++) {
-         dst[i] = (src[i] == info->restart_index) ? 0xffff : src[i];
-      }
-   }
-   else if (src_index_size == 2 && dst_index_size == 2) {
-      uint16_t *src = (uint16_t *) src_map;
-      uint16_t *dst = (uint16_t *) dst_map;
-      unsigned i;
-      for (i = 0; i < count; i++) {
-         dst[i] = (src[i] == info->restart_index) ? 0xffff : src[i];
-      }
-   }
-   else {
-      uint32_t *src = (uint32_t *) src_map;
-      uint32_t *dst = (uint32_t *) dst_map;
-      unsigned i;
-      assert(src_index_size == 4);
-      assert(dst_index_size == 4);
-      for (i = 0; i < count; i++) {
-         dst[i] = (src[i] == info->restart_index) ? 0xffffffff : src[i];
-      }
-   }
+   util_translate_prim_restart_data(src_index_size, src_map, dst_map,
+                                    info->count, info->restart_index);
 
    if (src_transfer)
       pipe_buffer_unmap(context, src_transfer);
index de4fcca497cb6d969b7d3caf09083057a4a5519a..82f0409a8351785311ccce8a1cf6c139f440aadb 100644 (file)
@@ -41,6 +41,10 @@ struct pipe_draw_info;
 union pipe_index_binding;
 struct pipe_resource;
 
+void
+util_translate_prim_restart_data(unsigned index_size,
+                                 void *src_map, void *dst_map,
+                                 unsigned count, unsigned restart_index);
 
 enum pipe_error
 util_translate_prim_restart_ib(struct pipe_context *context,