Use glDrawRangeElements instead of glDrawElements
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. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
This commit is contained in:
parent
229601e080
commit
8afa008ec4
|
@ -244,10 +244,19 @@ _glamor_solid_boxes(PixmapPtr pixmap, BoxPtr box, int nbox, float *color)
|
||||||
if (box_cnt == 1)
|
if (box_cnt == 1)
|
||||||
dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, box_cnt * 4);
|
dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, box_cnt * 4);
|
||||||
else
|
else
|
||||||
|
#ifndef GLAMOR_GLES2
|
||||||
|
dispatch->glDrawRangeElements(GL_TRIANGLES,
|
||||||
|
0,
|
||||||
|
box_cnt * 4,
|
||||||
|
box_cnt * 6,
|
||||||
|
GL_UNSIGNED_SHORT,
|
||||||
|
NULL);
|
||||||
|
#else
|
||||||
dispatch->glDrawElements(GL_TRIANGLES,
|
dispatch->glDrawElements(GL_TRIANGLES,
|
||||||
box_cnt * 6,
|
box_cnt * 6,
|
||||||
GL_UNSIGNED_SHORT,
|
GL_UNSIGNED_SHORT,
|
||||||
NULL);
|
NULL);
|
||||||
|
#endif
|
||||||
nbox -= box_cnt;
|
nbox -= box_cnt;
|
||||||
box += box_cnt;
|
box += box_cnt;
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,7 @@ glamor_gl_dispatch_init_impl(struct glamor_gl_dispatch *dispatch,
|
||||||
INIT_FUNC(dispatch, glMapBufferRange, get_proc_address);
|
INIT_FUNC(dispatch, glMapBufferRange, get_proc_address);
|
||||||
INIT_FUNC(dispatch, glUnmapBuffer, get_proc_address);
|
INIT_FUNC(dispatch, glUnmapBuffer, get_proc_address);
|
||||||
INIT_FUNC(dispatch, glBlitFramebuffer, get_proc_address);
|
INIT_FUNC(dispatch, glBlitFramebuffer, get_proc_address);
|
||||||
|
INIT_FUNC(dispatch, glDrawRangeElements, get_proc_address);
|
||||||
#endif
|
#endif
|
||||||
INIT_FUNC(dispatch, glViewport, get_proc_address);
|
INIT_FUNC(dispatch, glViewport, get_proc_address);
|
||||||
INIT_FUNC(dispatch, glDrawArrays, get_proc_address);
|
INIT_FUNC(dispatch, glDrawArrays, get_proc_address);
|
||||||
|
|
|
@ -12,6 +12,7 @@ typedef struct glamor_gl_dispatch {
|
||||||
|
|
||||||
/* Elements Array*/
|
/* Elements Array*/
|
||||||
void (*glDrawElements) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);
|
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 */
|
/* Raster functions */
|
||||||
void (*glReadPixels) (GLint x, GLint y,
|
void (*glReadPixels) (GLint x, GLint y,
|
||||||
|
|
|
@ -841,8 +841,14 @@ glamor_flush_composite_rects(ScreenPtr screen)
|
||||||
if (!glamor_priv->render_nr_verts)
|
if (!glamor_priv->render_nr_verts)
|
||||||
return;
|
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,
|
dispatch->glDrawElements(GL_TRIANGLES, (glamor_priv->render_nr_verts * 3) / 2,
|
||||||
GL_UNSIGNED_SHORT, NULL);
|
GL_UNSIGNED_SHORT, NULL);
|
||||||
|
#endif
|
||||||
glamor_put_dispatch(glamor_priv);
|
glamor_put_dispatch(glamor_priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1543,8 +1543,14 @@ _glamor_generate_trapezoid_with_shader(ScreenPtr screen, PicturePtr picture,
|
||||||
glamor_priv->vb, GL_DYNAMIC_DRAW);
|
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,
|
dispatch->glDrawElements(GL_TRIANGLES, (glamor_priv->render_nr_verts * 3) / 2,
|
||||||
GL_UNSIGNED_SHORT, NULL);
|
GL_UNSIGNED_SHORT, NULL);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
|
dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user