This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch span-gl-clean
in repository efl.

View the commit online.

commit e269abbf3268ac8cf2396f798c002be7347a4aae
Author: [email protected] <[email protected]>
AuthorDate: Mon Aug 10 20:25:16 2026 -0600

    fix(evas_ector_gl): record span shader init failure instead of retrying it
    
    span_shader_init() aborted at the first failing variant and its return value
    was discarded at the eng_ector_end call site, with nothing recording that it
    had failed.  On a device that cannot compile the span shaders that meant a
    full 12-program compile attempt plus an unbounded ERR log flood on every VG
    object on every frame.
    
    Add a tri-state memo so the outcome is decided once.  Also fix the
    pipe-flush guard, which tested variant [0][0][0] and then bound a different
    variant: when the first variant links and a later one does not, that reached
    glUseProgram(0) and GL_INVALID_OPERATION.  It now checks the program it is
    about to bind.
---
 .../evas/engines/gl_generic/evas_ector_gl_span.h   |  3 ++
 .../engines/gl_generic/evas_ector_gl_span_shader.c | 38 ++++++++++++++++++----
 src/modules/evas/engines/gl_generic/evas_engine.c  |  2 +-
 3 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/src/modules/evas/engines/gl_generic/evas_ector_gl_span.h b/src/modules/evas/engines/gl_generic/evas_ector_gl_span.h
index d3b5288816..41ab1c9833 100644
--- a/src/modules/evas/engines/gl_generic/evas_ector_gl_span.h
+++ b/src/modules/evas/engines/gl_generic/evas_ector_gl_span.h
@@ -377,6 +377,9 @@ void span_collector_delete_textures(Span_Collector *sc);
  */
 Eina_Bool span_shader_init(void);
 
+/* EINA_TRUE only when span_shader_init() has run and every variant linked. */
+Eina_Bool span_shader_available(void);
+
 /**
  * Delete the GL programs and reset internal shader state.
  * Must be called from the GL thread.
diff --git a/src/modules/evas/engines/gl_generic/evas_ector_gl_span_shader.c b/src/modules/evas/engines/gl_generic/evas_ector_gl_span_shader.c
index 26cc3fd823..da12eb5df6 100644
--- a/src/modules/evas/engines/gl_generic/evas_ector_gl_span_shader.c
+++ b/src/modules/evas/engines/gl_generic/evas_ector_gl_span_shader.c
@@ -606,6 +606,18 @@ _span_shader_pick(int kind, Span_Bind_Set bind, int mask)
    return &_span_shaders[kind][(int)bind][mask ? 1 : 0];
 }
 
+/* Shader init memo.  A failed compile must never be retried: without this
+ * the whole 12-program build is re-attempted on every eng_ector_end, which
+ * on a device that cannot compile them costs a full compile plus an
+ * unbounded ERR log flood every frame. */
+typedef enum {
+   SPAN_SHADER_UNTRIED = 0,
+   SPAN_SHADER_OK      = 1,
+   SPAN_SHADER_FAILED  = 2
+} Span_Shader_State;
+
+static Span_Shader_State _span_shader_state = SPAN_SHADER_UNTRIED;
+
 /* 1x1 white texture — kept for potential fallback use; not bound during
  * normal rendering (non-mask shaders have no mask sampler at all). */
 static GLuint _white_mask_tex = 0;
@@ -780,6 +792,9 @@ span_shader_init(void)
    };
    int kind, b, mask;
 
+   if (_span_shader_state == SPAN_SHADER_OK)     return EINA_TRUE;
+   if (_span_shader_state == SPAN_SHADER_FAILED) return EINA_FALSE;
+
    for (kind = 0; kind < 2; kind++)
      {
         for (b = 0; b < (int)SPAN_BIND_COUNT; b++)
@@ -798,6 +813,7 @@ span_shader_init(void)
                        free(vs_parts);
                        ERR("span shader parts alloc failed (%s %s %s)",
                            kind_name[kind], bind_name[b], mask ? "mask" : "no-mask");
+                       _span_shader_state = SPAN_SHADER_FAILED;
                        return EINA_FALSE;
                     }
                   if (!_link_program(ss, vs_parts, vn, fs_parts, fn))
@@ -806,6 +822,7 @@ span_shader_init(void)
                        free(vs_parts);
                        ERR("span shader link failed (%s %s %s)",
                            kind_name[kind], bind_name[b], mask ? "mask" : "no-mask");
+                       _span_shader_state = SPAN_SHADER_FAILED;
                        return EINA_FALSE;
                     }
                   free(fs_parts);
@@ -827,14 +844,23 @@ span_shader_init(void)
         glBindTexture(GL_TEXTURE_2D, 0);
      }
 
+   _span_shader_state = SPAN_SHADER_OK;
    return EINA_TRUE;
 }
 
+Eina_Bool
+span_shader_available(void)
+{
+   return _span_shader_state == SPAN_SHADER_OK;
+}
+
 void
 span_shader_shutdown(void)
 {
    int kind, b, mask;
 
+   _span_shader_state = SPAN_SHADER_UNTRIED;
+
    for (kind = 0; kind < 2; kind++)
      for (b = 0; b < (int)SPAN_BIND_COUNT; b++)
        for (mask = 0; mask < 2; mask++)
@@ -1068,12 +1094,12 @@ span_shader_pipe_flush(Evas_Engine_GL_Context *gc, int pipe_idx)
 
    if (!vdata || nverts == 0) return;
 
-   /* Ensure all 12 shader programs are compiled. */
-   if (!_span_shaders[0][0][0].program)
-     {
-        if (!span_shader_init())
-          return;
-     }
+   /* Ensure all 12 shader programs are compiled.  Checking the specific
+    * variant matters: span_shader_init() aborts at the first failing
+    * variant, so [0][0][0] linking says nothing about the one we are about
+    * to bind, and glUseProgram(0) yields GL_INVALID_OPERATION. */
+   if (!span_shader_init()) return;
+   if (!ss->program) return;
 
    glUseProgram(ss->program);
 
diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c
index 404232ba64..bf85e6c68e 100644
--- a/src/modules/evas/engines/gl_generic/evas_engine.c
+++ b/src/modules/evas/engines/gl_generic/evas_engine.c
@@ -3087,7 +3087,7 @@ eng_ector_end(void *engine,
                 eng_image_size_get(engine, glim, &w, &h);
                 gc = gl_generic_context_find(engine, EINA_TRUE);
 
-                span_shader_init();
+                if (!span_shader_init()) goto span_done;
 
                 /* Upload textures for all collectors. */
                 for (ci = 0; ci < fill_count; ci++)

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to