[Glamor] [PATCH 1/3] Use glDrawRangeElements instead of glDrawElements

Alex Deucher alexdeucher at gmail.com
Wed Oct 2 06:37:07 PDT 2013


On Tue, Oct 1, 2013 at 6:37 PM, Grigori Goronzy <greg at chown.ath.cx> wrote:
> This lets us explicitly specify the range of vertices that are used,
> which the OpenGL driver can use for optimization. Particularly,
> it results in lower CPU overhead with Mesa-based drivers.

For the series:

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  src/glamor_fill.c        | 9 +++++++++
>  src/glamor_gl_dispatch.c | 1 +
>  src/glamor_gl_dispatch.h | 1 +
>  src/glamor_render.c      | 6 ++++++
>  src/glamor_trapezoid.c   | 6 ++++++
>  5 files changed, 23 insertions(+)
>
> diff --git a/src/glamor_fill.c b/src/glamor_fill.c
> index 2f08d72..fbc8739 100644
> --- a/src/glamor_fill.c
> +++ b/src/glamor_fill.c
> @@ -244,10 +244,19 @@ _glamor_solid_boxes(PixmapPtr pixmap, BoxPtr box, int nbox, float *color)
>                 if (box_cnt == 1)
>                         dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, box_cnt * 4);
>                 else
> +#ifndef GLAMOR_GLES2
> +                       dispatch->glDrawRangeElements(GL_TRIANGLES,
> +                                                     0,
> +                                                     box_cnt * 4,
> +                                                     box_cnt * 6,
> +                                                     GL_UNSIGNED_SHORT,
> +                                                     NULL);
> +#else
>                         dispatch->glDrawElements(GL_TRIANGLES,
>                                                  box_cnt * 6,
>                                                  GL_UNSIGNED_SHORT,
>                                                  NULL);
> +#endif
>                 nbox -= box_cnt;
>                 box += box_cnt;
>         }
> diff --git a/src/glamor_gl_dispatch.c b/src/glamor_gl_dispatch.c
> index f996504..da99e26 100644
> --- a/src/glamor_gl_dispatch.c
> +++ b/src/glamor_gl_dispatch.c
> @@ -54,6 +54,7 @@ glamor_gl_dispatch_init_impl(struct glamor_gl_dispatch *dispatch,
>         INIT_FUNC(dispatch, glMapBufferRange, get_proc_address);
>         INIT_FUNC(dispatch, glUnmapBuffer, get_proc_address);
>         INIT_FUNC(dispatch, glBlitFramebuffer, get_proc_address);
> +       INIT_FUNC(dispatch, glDrawRangeElements, get_proc_address);
>  #endif
>         INIT_FUNC(dispatch, glViewport, get_proc_address);
>         INIT_FUNC(dispatch, glDrawArrays, get_proc_address);
> diff --git a/src/glamor_gl_dispatch.h b/src/glamor_gl_dispatch.h
> index b3fc3a6..76dadd4 100644
> --- a/src/glamor_gl_dispatch.h
> +++ b/src/glamor_gl_dispatch.h
> @@ -12,6 +12,7 @@ typedef struct glamor_gl_dispatch {
>
>         /* Elements Array*/
>         void (*glDrawElements) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);
> +       void (*glDrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
>
>         /* Raster functions */
>         void (*glReadPixels) (GLint x, GLint y,
> diff --git a/src/glamor_render.c b/src/glamor_render.c
> index 27d5dc5..d2ac381 100644
> --- a/src/glamor_render.c
> +++ b/src/glamor_render.c
> @@ -841,8 +841,14 @@ glamor_flush_composite_rects(ScreenPtr screen)
>         if (!glamor_priv->render_nr_verts)
>                 return;
>
> +#ifndef GLAMOR_GLES2
> +       dispatch->glDrawRangeElements(GL_TRIANGLES, 0, glamor_priv->render_nr_verts,
> +                                     (glamor_priv->render_nr_verts * 3) / 2,
> +                                     GL_UNSIGNED_SHORT, NULL);
> +#else
>         dispatch->glDrawElements(GL_TRIANGLES, (glamor_priv->render_nr_verts * 3) / 2,
>                                  GL_UNSIGNED_SHORT, NULL);
> +#endif
>         glamor_put_dispatch(glamor_priv);
>  }
>
> diff --git a/src/glamor_trapezoid.c b/src/glamor_trapezoid.c
> index 7c934e3..76b3729 100644
> --- a/src/glamor_trapezoid.c
> +++ b/src/glamor_trapezoid.c
> @@ -1543,8 +1543,14 @@ _glamor_generate_trapezoid_with_shader(ScreenPtr screen, PicturePtr picture,
>                                 glamor_priv->vb, GL_DYNAMIC_DRAW);
>                 }
>
> +#ifndef GLAMOR_GLES2
> +               dispatch->glDrawRangeElements(GL_TRIANGLES, 0, glamor_priv->render_nr_verts,
> +                       (glamor_priv->render_nr_verts * 3) / 2,
> +                       GL_UNSIGNED_SHORT, NULL);
> +#else
>                 dispatch->glDrawElements(GL_TRIANGLES, (glamor_priv->render_nr_verts * 3) / 2,
>                         GL_UNSIGNED_SHORT, NULL);
> +#endif
>         }
>
>         dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
> --
> 1.8.1.2
>
> _______________________________________________
> Glamor mailing list
> Glamor at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/glamor


More information about the Glamor mailing list