[Mesa-dev] [PATCH] vbo: kill primitive restart lowering in glDrawArrays

Nicolai Hähnle nhaehnle at gmail.com
Tue Feb 21 08:37:32 UTC 2017


On 20.02.2017 19:35, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

>
> ---
>  src/mesa/vbo/vbo_exec_array.c | 56 ++++++-------------------------------------
>  1 file changed, 7 insertions(+), 49 deletions(-)
>
> diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
> index 6a96167..30c52d5 100644
> --- a/src/mesa/vbo/vbo_exec_array.c
> +++ b/src/mesa/vbo/vbo_exec_array.c
> @@ -404,77 +404,35 @@ vbo_bind_arrays(struct gl_context *ctx)
>   */
>  static void
>  vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
>                  GLsizei count, GLuint numInstances, GLuint baseInstance)
>  {
>     struct vbo_context *vbo = vbo_context(ctx);
>     struct _mesa_prim prim[2];
>
>     vbo_bind_arrays(ctx);
>
> -   /* init most fields to zero */
> +   /* OpenGL 4.5 says that primitive restart is ignored with non-indexed
> +    * draws.
> +    */
>     memset(prim, 0, sizeof(prim));
>     prim[0].begin = 1;
>     prim[0].end = 1;
>     prim[0].mode = mode;
>     prim[0].num_instances = numInstances;
>     prim[0].base_instance = baseInstance;
>     prim[0].is_indirect = 0;
> +   prim[0].start = start;
> +   prim[0].count = count;
>
> -   /* Implement the primitive restart index */
> -   if (ctx->Array.PrimitiveRestart &&
> -       !ctx->Array.PrimitiveRestartFixedIndex &&
> -       ctx->Array.RestartIndex < count) {
> -      GLuint primCount = 0;
> -
> -      if (ctx->Array.RestartIndex == start) {
> -         /* special case: RestartIndex at beginning */
> -         if (count > 1) {
> -            prim[0].start = start + 1;
> -            prim[0].count = count - 1;
> -            primCount = 1;
> -         }
> -      }
> -      else if (ctx->Array.RestartIndex == start + count - 1) {
> -         /* special case: RestartIndex at end */
> -         if (count > 1) {
> -            prim[0].start = start;
> -            prim[0].count = count - 1;
> -            primCount = 1;
> -         }
> -      }
> -      else {
> -         /* general case: RestartIndex in middle, split into two prims */
> -         prim[0].start = start;
> -         prim[0].count = ctx->Array.RestartIndex - start;
> -
> -         prim[1] = prim[0];
> -         prim[1].start = ctx->Array.RestartIndex + 1;
> -         prim[1].count = count - prim[1].start;
> -
> -         primCount = 2;
> -      }
> -
> -      if (primCount > 0) {
> -         /* draw one or two prims */
> -         vbo->draw_prims(ctx, prim, primCount, NULL,
> -                         GL_TRUE, start, start + count - 1, NULL, 0, NULL);
> -      }
> -   }
> -   else {
> -      /* no prim restart */
> -      prim[0].start = start;
> -      prim[0].count = count;
> -
> -      vbo->draw_prims(ctx, prim, 1, NULL,
> -                      GL_TRUE, start, start + count - 1, NULL, 0, NULL);
> -   }
> +   vbo->draw_prims(ctx, prim, 1, NULL,
> +                   GL_TRUE, start, start + count - 1, NULL, 0, NULL);
>
>     if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) {
>        _mesa_flush(ctx);
>     }
>  }
>
>
>  /**
>   * Execute a glRectf() function.
>   */
>



More information about the mesa-dev mailing list