mesa: replace some index_size multiplications and divisions with shifts
authorMarek Olšák <marek.olsak@amd.com>
Thu, 13 Feb 2020 20:29:22 +0000 (15:29 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 5 Mar 2020 00:54:42 +0000 (19:54 -0500)
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4052>

src/mesa/main/draw.c
src/mesa/state_tracker/st_draw.c
src/mesa/state_tracker/st_draw_feedback.c
src/mesa/vbo/vbo_minmax_index.c

index bcf4384a3a98b03bc71f7825cf61c1ab7b9e371e..dc8fe1e5da8a1eeb81b8c691d7ea341e0e9f5a06 100644 (file)
@@ -1208,7 +1208,7 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
    for (i = 0; i < primcount; i++) {
       min_index_ptr = MIN2(min_index_ptr, (uintptr_t) indices[i]);
       max_index_ptr = MAX2(max_index_ptr, (uintptr_t) indices[i] +
-                           ib.index_size * count[i]);
+                           (count[i] << ib.index_size_shift));
    }
 
    /* Check if we can handle this thing as a bunch of index offsets from the
@@ -1217,10 +1217,10 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
     * Check that the difference between each prim's indexes is a multiple of
     * the index/element size.
     */
-   if (ib.index_size != 1) {
+   if (ib.index_size_shift) {
       for (i = 0; i < primcount; i++) {
-         if ((((uintptr_t) indices[i] - min_index_ptr) % ib.index_size) !=
-             0) {
+         if ((((uintptr_t) indices[i] - min_index_ptr) &
+              ((1 << ib.index_size_shift) - 1)) != 0) {
             fallback = GL_TRUE;
             break;
          }
@@ -1239,7 +1239,7 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
 
       ALLOC_PRIMS(prim, primcount, "glMultiDrawElements");
 
-      ib.count = (max_index_ptr - min_index_ptr) / ib.index_size;
+      ib.count = (max_index_ptr - min_index_ptr) >> ib.index_size_shift;
       ib.obj = ctx->Array.VAO->IndexBufferObj;
       ib.ptr = (void *) min_index_ptr;
 
@@ -1248,7 +1248,7 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
          prim[i].end = 1;
          prim[i].mode = mode;
          prim[i].start =
-            ((uintptr_t) indices[i] - min_index_ptr) / ib.index_size;
+            ((uintptr_t) indices[i] - min_index_ptr) >> ib.index_size_shift;
          prim[i].count = count[i];
          prim[i].draw_id = i;
          if (basevertex != NULL)
index b370e552e791acbbedf5dd9556957c0ccc3c77db..6459b2553c2828d8ff1fca8f6b924fe52a2bd98a 100644 (file)
@@ -217,7 +217,7 @@ st_draw_vbo(struct gl_context *ctx,
          if (!info.index.resource)
             return;
 
-         start = pointer_to_offset(ib->ptr) / info.index_size;
+         start = pointer_to_offset(ib->ptr) >> ib->index_size_shift;
       } else {
          /* indices are in user space memory */
          info.has_user_indices = true;
@@ -299,7 +299,7 @@ st_indirect_draw_vbo(struct gl_context *ctx,
 
       info.index_size = ib->index_size;
       info.index.resource = st_buffer_object(bufobj)->buffer;
-      info.start = pointer_to_offset(ib->ptr) / info.index_size;
+      info.start = pointer_to_offset(ib->ptr) >> ib->index_size_shift;
 
       /* Primitive restart is not handled by the VBO module in this case. */
       setup_primitive_restart(ctx, &info);
index 14c809c8a09c7deedbc45df8539be70ee6b54e9b..4e6b67992f32a67f3a487f25111decb467cea042 100644 (file)
@@ -196,7 +196,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
       if (bufobj && bufobj->Name) {
          struct st_buffer_object *stobj = st_buffer_object(bufobj);
 
-         start = pointer_to_offset(ib->ptr) / index_size;
+         start = pointer_to_offset(ib->ptr) >> ib->index_size_shift;
          mapped_indices = pipe_buffer_map(pipe, stobj->buffer,
                                           PIPE_TRANSFER_READ, &ib_transfer);
       }
@@ -204,7 +204,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
          mapped_indices = ib->ptr;
       }
 
-      info.index_size = ib->index_size;
+      info.index_size = index_size;
       info.min_index = min_index;
       info.max_index = max_index;
       info.has_user_indices = true;
index d1298dcdc3a03b5b086701e87a7c0611319bf1fb..8cb5f3c0aeba35ad29fb6f3de7218d2c5a84fea5 100644 (file)
@@ -247,9 +247,9 @@ vbo_get_minmax_index(struct gl_context *ctx,
    GLuint i;
    GLintptr offset = 0;
 
-   indices = (char *) ib->ptr + prim->start * ib->index_size;
+   indices = (char *) ib->ptr + (prim->start << ib->index_size_shift);
    if (_mesa_is_bufferobj(ib->obj)) {
-      GLsizeiptr size = MIN2(count * ib->index_size, ib->obj->Size);
+      GLsizeiptr size = MIN2(count << ib->index_size_shift, ib->obj->Size);
 
       if (vbo_get_minmax_cached(ib->obj, ib->index_size, (GLintptr) indices,
                                 count, min_index, max_index))