xserver: Branch 'master' - 2 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 6 22:47:38 UTC 2021


 glamor/glamor.c                  |    8 ++++++--
 glamor/glamor_composite_glyphs.c |   15 +++++----------
 glamor/glamor_font.c             |    4 ++--
 glamor/glamor_priv.h             |    1 +
 glamor/glamor_program.c          |   15 +++++++++++++--
 glamor/glamor_rects.c            |    6 +++---
 glamor/glamor_spans.c            |    6 +++---
 glamor/glamor_utils.h            |    4 ++++
 8 files changed, 37 insertions(+), 22 deletions(-)

New commits:
commit a9552868697cae02e37e67ae774a072885f202f8
Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Jul 1 06:48:55 2021 +1000

    glamor: add EXT_gpu_shader4 support
    
    This enables a number of the GLSL 1.30 paths on GPUs that have
    EXT_gpu_shader4 but don't have GLSL 1.30 exposed.
    
    (Intel gen4/5 mainly)
    
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index ecd4cf63c..98024e7d9 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -772,6 +772,10 @@ glamor_init(ScreenPtr screen, unsigned int flags)
         goto fail;
     }
 
+    if (!glamor_priv->is_gles && glamor_priv->glsl_version == 120 &&
+        epoxy_has_gl_extension("GL_ARB_instanced_arrays"))
+        glamor_priv->use_gpu_shader4 = epoxy_has_gl_extension("GL_EXT_gpu_shader4");
+
     glamor_priv->has_rw_pbo = FALSE;
     if (!glamor_priv->is_gles)
         glamor_priv->has_rw_pbo = TRUE;
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 6ccc1c04c..d7beb3ee9 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -213,6 +213,7 @@ typedef struct glamor_screen_private {
     Bool has_texture_swizzle;
     Bool is_core_profile;
     Bool can_copyplane;
+    Bool use_gpu_shader4;
     int max_fbo_size;
 
     struct glamor_format formats[33];
diff --git a/glamor/glamor_program.c b/glamor/glamor_program.c
index b0a9d07a4..bd5ee5e5b 100644
--- a/glamor/glamor_program.c
+++ b/glamor/glamor_program.c
@@ -187,6 +187,7 @@ fs_location_vars(glamor_program_location locations)
 
 static const char vs_template[] =
     "%s"                                /* version */
+    "%s"                                /* exts */
     "%s"                                /* defines */
     "%s"                                /* prim vs_vars */
     "%s"                                /* fill vs_vars */
@@ -199,6 +200,7 @@ static const char vs_template[] =
 
 static const char fs_template[] =
     "%s"                                /* version */
+    "%s"                                /* exts */
     GLAMOR_DEFAULT_PRECISION
     "%s"                                /* defines */
     "%s"                                /* prim fs_vars */
@@ -262,6 +264,7 @@ glamor_build_program(ScreenPtr          screen,
     char                        *fs_prog_string;
 
     GLint                       fs_prog, vs_prog;
+    Bool                        gpu_shader4 = FALSE;
 
     if (!fill)
         fill = &facet_null_fill;
@@ -270,8 +273,14 @@ glamor_build_program(ScreenPtr          screen,
     flags |= fill->flags;
     version = MAX(version, fill->version);
 
-    if (version > glamor_priv->glsl_version)
-        goto fail;
+    if (version > glamor_priv->glsl_version) {
+        if (version == 130 && !glamor_priv->use_gpu_shader4)
+            goto fail;
+        else {
+            version = 120;
+            gpu_shader4 = TRUE;
+        }
+    }
 
     vs_vars = vs_location_vars(locations);
     fs_vars = fs_location_vars(locations);
@@ -291,6 +300,7 @@ glamor_build_program(ScreenPtr          screen,
     if (asprintf(&vs_prog_string,
                  vs_template,
                  str(version_string),
+                 gpu_shader4 ? "#extension GL_EXT_gpu_shader4 : require\n" : "",
                  str(defines),
                  str(prim->vs_vars),
                  str(fill->vs_vars),
@@ -302,6 +312,7 @@ glamor_build_program(ScreenPtr          screen,
     if (asprintf(&fs_prog_string,
                  fs_template,
                  str(version_string),
+                 gpu_shader4 ? "#extension GL_EXT_gpu_shader4 : require\n#define texelFetch texelFetch2D\n#define uint unsigned int\n" : "",
                  str(defines),
                  str(prim->fs_vars),
                  str(fill->fs_vars),
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index cf383007e..93a933eed 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -734,7 +734,7 @@ glamor_glDrawArrays_GL_QUADS(glamor_screen_private *glamor_priv, unsigned count)
 
 static inline Bool
 glamor_glsl_has_ints(glamor_screen_private *glamor_priv) {
-    return glamor_priv->glsl_version >= 130;
+    return glamor_priv->glsl_version >= 130 || glamor_priv->use_gpu_shader4;
 }
 
 #endif
commit a2f5b917f511fca1c9b1501495664e2f63c2e1b0
Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Jul 2 04:52:23 2021 +1000

    glamor: add glamor_glsl_has_ints wrapper
    
    This should make adding gpu shader4 support cleaner
    
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 41034485f..ecd4cf63c 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -746,7 +746,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
          * have instanced arrays, but this is not always the case.
          * etnaviv offers GLSL 140 with OpenGL 2.1.
          */
-        if (glamor_priv->glsl_version >= 130 &&
+        if (glamor_glsl_has_ints(glamor_priv) &&
             !epoxy_has_gl_extension("GL_ARB_instanced_arrays"))
                 glamor_priv->glsl_version = 120;
     } else {
@@ -799,7 +799,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
         epoxy_gl_version() >= 30 ||
         epoxy_has_gl_extension("GL_NV_pack_subimage");
     glamor_priv->has_dual_blend =
-        glamor_priv->glsl_version >= 130 &&
+        glamor_glsl_has_ints(glamor_priv) &&
         epoxy_has_gl_extension("GL_ARB_blend_func_extended");
     glamor_priv->has_clear_texture =
         epoxy_gl_version() >= 44 ||
diff --git a/glamor/glamor_composite_glyphs.c b/glamor/glamor_composite_glyphs.c
index b65127477..147e3bb31 100644
--- a/glamor/glamor_composite_glyphs.c
+++ b/glamor/glamor_composite_glyphs.c
@@ -208,11 +208,6 @@ static const glamor_facet glamor_facet_composite_glyphs_120 = {
     .locations = glamor_program_location_atlas,
 };
 
-static inline Bool
-glamor_glyph_use_130(glamor_screen_private *glamor_priv) {
-    return glamor_priv->glsl_version >= 130;
-}
-
 static Bool
 glamor_glyphs_init_facet(ScreenPtr screen)
 {
@@ -274,7 +269,7 @@ glamor_glyphs_flush(CARD8 op, PicturePtr src, PicturePtr dst,
                           box->y2 - box->y1);
                 box++;
 
-                if (glamor_glyph_use_130(glamor_priv))
+                if (glamor_glsl_has_ints(glamor_priv))
                     glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, nglyph);
                 else
                     glamor_glDrawArrays_GL_QUADS(glamor_priv, nglyph);
@@ -287,7 +282,7 @@ glamor_glyphs_flush(CARD8 op, PicturePtr src, PicturePtr dst,
 
     glDisable(GL_SCISSOR_TEST);
 
-    if (glamor_glyph_use_130(glamor_priv)) {
+    if (glamor_glsl_has_ints(glamor_priv)) {
         glVertexAttribDivisor(GLAMOR_VERTEX_SOURCE, 0);
         glVertexAttribDivisor(GLAMOR_VERTEX_POS, 0);
     }
@@ -305,7 +300,7 @@ glamor_glyph_start(ScreenPtr screen, int count)
 
     /* Set up the vertex buffers for the font and destination */
 
-    if (glamor_glyph_use_130(glamor_priv)) {
+    if (glamor_glsl_has_ints(glamor_priv)) {
         v = glamor_get_vbo_space(screen, count * (6 * sizeof (GLshort)), &vbo_offset);
 
         glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
@@ -439,7 +434,7 @@ glamor_composite_glyphs(CARD8 op,
                     /* First glyph in the current atlas?
                      */
                     if (_X_UNLIKELY(glyphs_queued == 0)) {
-                        if (glamor_glyph_use_130(glamor_priv))
+                        if (glamor_glsl_has_ints(glamor_priv))
                             prog = glamor_setup_program_render(op, src, glyph_pict, dst,
                                                                glyphs_program,
                                                                &glamor_facet_composite_glyphs_130,
@@ -458,7 +453,7 @@ glamor_composite_glyphs(CARD8 op,
                      */
 
                     glyphs_queued++;
-                    if (_X_LIKELY(glamor_glyph_use_130(glamor_priv))) {
+                    if (_X_LIKELY(glamor_glsl_has_ints(glamor_priv))) {
                         v[0] = x - glyph->info.x;
                         v[1] = y - glyph->info.y;
                         v[2] = glyph_draw->width;
diff --git a/glamor/glamor_font.c b/glamor/glamor_font.c
index 9199a355b..c60fa787b 100644
--- a/glamor/glamor_font.c
+++ b/glamor/glamor_font.c
@@ -47,7 +47,7 @@ glamor_font_get(ScreenPtr screen, FontPtr font)
     unsigned long       count;
     char                *bits;
 
-    if (glamor_priv->glsl_version < 130)
+    if (!glamor_glsl_has_ints(glamor_priv))
         return NULL;
 
     privates = FontGetPrivate(font, glamor_font_private_index);
@@ -210,7 +210,7 @@ glamor_font_init(ScreenPtr screen)
 {
     glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
 
-    if (glamor_priv->glsl_version < 130)
+    if (!glamor_glsl_has_ints(glamor_priv))
         return TRUE;
 
     if (glamor_font_generation != serverGeneration) {
diff --git a/glamor/glamor_rects.c b/glamor/glamor_rects.c
index ae4fe8bcc..8cdad64e4 100644
--- a/glamor/glamor_rects.c
+++ b/glamor/glamor_rects.c
@@ -69,7 +69,7 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable,
             glamor_bounds_union_rect(&bounds, &prect[i]);
     }
 
-    if (glamor_priv->glsl_version >= 130) {
+    if (glamor_glsl_has_ints(glamor_priv)) {
         prog = glamor_use_program_fill(pixmap, gc,
                                        &glamor_priv->poly_fill_rect_program,
                                        &glamor_facet_polyfillrect_130);
@@ -151,7 +151,7 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable,
                       scissor.y1 + off_y,
                       scissor.x2 - scissor.x1,
                       scissor.y2 - scissor.y1);
-            if (glamor_priv->glsl_version >= 130)
+            if (glamor_glsl_has_ints(glamor_priv))
                 glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, nrect);
             else {
                 glamor_glDrawArrays_GL_QUADS(glamor_priv, nrect);
@@ -163,7 +163,7 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable,
 
 bail:
     glDisable(GL_SCISSOR_TEST);
-    if (glamor_priv->glsl_version >= 130) {
+    if (glamor_glsl_has_ints(glamor_priv)) {
         glVertexAttribDivisor(GLAMOR_VERTEX_SOURCE, 0);
         glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
         glVertexAttribDivisor(GLAMOR_VERTEX_POS, 0);
diff --git a/glamor/glamor_spans.c b/glamor/glamor_spans.c
index b5f297d2f..00a019c7b 100644
--- a/glamor/glamor_spans.c
+++ b/glamor/glamor_spans.c
@@ -64,7 +64,7 @@ glamor_fill_spans_gl(DrawablePtr drawable,
 
     glamor_make_current(glamor_priv);
 
-    if (glamor_priv->glsl_version >= 130) {
+    if (glamor_glsl_has_ints(glamor_priv)) {
         prog = glamor_use_program_fill(pixmap, gc, &glamor_priv->fill_spans_program,
                                        &glamor_facet_fillspans_130);
 
@@ -134,7 +134,7 @@ glamor_fill_spans_gl(DrawablePtr drawable,
                       box->x2 - box->x1,
                       box->y2 - box->y1);
             box++;
-            if (glamor_priv->glsl_version >= 130)
+            if (glamor_glsl_has_ints(glamor_priv))
                 glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, n);
             else {
                 glamor_glDrawArrays_GL_QUADS(glamor_priv, n);
@@ -146,7 +146,7 @@ glamor_fill_spans_gl(DrawablePtr drawable,
 
 bail:
     glDisable(GL_SCISSOR_TEST);
-    if (glamor_priv->glsl_version >= 130)
+    if (glamor_glsl_has_ints(glamor_priv))
         glVertexAttribDivisor(GLAMOR_VERTEX_POS, 0);
     glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
 
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 651faf2fe..cf383007e 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -732,5 +732,9 @@ glamor_glDrawArrays_GL_QUADS(glamor_screen_private *glamor_priv, unsigned count)
     }
 }
 
+static inline Bool
+glamor_glsl_has_ints(glamor_screen_private *glamor_priv) {
+    return glamor_priv->glsl_version >= 130;
+}
 
 #endif


More information about the xorg-commit mailing list