[PATCH 7/7] glamor: Avoid using GL_QUADS on VC4.

Eric Anholt eric at anholt.net
Fri Jun 19 19:09:41 PDT 2015


Improves text rendering from about 284k glyphs per second to 320k
glyphs per second.  There's no GL extension for probing this, because
of the philosophy of "Don't expose whether things are really in
hardware or not."

Signed-off-by: Eric Anholt <eric at anholt.net>
---
 glamor/glamor.c       | 9 +++++++++
 glamor/glamor_priv.h  | 1 +
 glamor/glamor_utils.h | 2 +-
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/glamor/glamor.c b/glamor/glamor.c
index fbb1d85..525249c 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -531,6 +531,15 @@ glamor_init(ScreenPtr screen, unsigned int flags)
         epoxy_gl_version() >= 30 ||
         epoxy_has_gl_extension("GL_NV_pack_subimage");
 
+    glamor_priv->use_quads = (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP);
+    /* Driver-specific hack: Avoid using GL_QUADS on VC4, where
+     * they'll be emulated more expensively than we can with our
+     * cached IB.
+     */
+    if (strstr((char *)glGetString(GL_VENDOR), "Broadcom") &&
+        strstr((char *)glGetString(GL_RENDERER), "VC4"))
+        glamor_priv->use_quads = FALSE;
+
     glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &glamor_priv->max_fbo_size);
     glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glamor_priv->max_fbo_size);
     glGetIntegerv(GL_MAX_VIEWPORT_DIMS, max_viewport_size);
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 681895f..3e666b4 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -203,6 +203,7 @@ typedef struct glamor_screen_private {
     Bool has_pack_subimage;
     Bool has_unpack_subimage;
     Bool has_rw_pbo;
+    Bool use_quads;
     int max_fbo_size;
 
     struct xorg_list
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 73cda9c..66c3492 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -1400,7 +1400,7 @@ glamor_make_current(glamor_screen_private *glamor_priv)
 static inline void
 glamor_glDrawArrays_GL_QUADS(glamor_screen_private *glamor_priv, unsigned count)
 {
-    if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
+    if (glamor_priv->use_quads) {
         glDrawArrays(GL_QUADS, 0, count * 4);
     } else {
         glamor_gldrawarrays_quads_using_indices(glamor_priv, count);
-- 
2.1.4



More information about the xorg-devel mailing list