diff --git a/glamor/glamor.c b/glamor/glamor.c index fbb1d851a..525249c9e 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 681895ff3..3e666b482 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 73cda9c2b..66c3492b6 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);