add library override for windows, forcing EGL/GLESv2 -> libEGL/libGELSv2
Some checks are pending
Python Linting / Run Ruff (push) Waiting to run
Python Linting / Run Pylint (push) Waiting to run

This commit is contained in:
pythongosssss 2026-03-23 06:50:29 -07:00
parent 27b6f8a927
commit c821d8ee2a

View File

@ -35,10 +35,33 @@ def _preload_angle():
_preload_angle()
os.environ.setdefault("PYOPENGL_PLATFORM", "egl")
import OpenGL
OpenGL.USE_ACCELERATE = False
def _patch_find_library():
"""On Windows, PyOpenGL's EGL platform looks for 'EGL' and 'GLESv2' by
name via ctypes.util.find_library, but ANGLE ships as 'libEGL' and
'libGLESv2'. Patch find_library to return the full ANGLE paths so
PyOpenGL loads the same DLLs we pre-loaded (same handle, no duplicates)."""
if sys.platform != "win32":
return
import ctypes.util
_orig = ctypes.util.find_library
def _patched(name):
if name == 'EGL':
return comfy_angle.get_egl_path()
if name == 'GLESv2':
return comfy_angle.get_glesv2_path()
return _orig(name)
ctypes.util.find_library = _patched
_patch_find_library()
from OpenGL import EGL
from OpenGL import GLES3 as gl
class SizeModeInput(TypedDict):
size_mode: str
width: int
@ -93,7 +116,7 @@ def _egl_attribs(*values):
def _gl_str(name):
"""Get an OpenGL string parameter."""
v = gl.glGetString(name)
if v is None:
if not v:
return "Unknown"
if isinstance(v, bytes):
return v.decode(errors="replace")
@ -136,11 +159,8 @@ class GLContext:
def __init__(self):
if GLContext._initialized:
logger.debug("GLContext.__init__: already initialized, skipping")
return
logger.debug("GLContext.__init__: starting initialization")
import time
start = time.perf_counter()
@ -251,8 +271,10 @@ def _compile_shader(source: str, shader_type: int) -> int:
gl.glShaderSource(shader, source)
gl.glCompileShader(shader)
if gl.glGetShaderiv(shader, gl.GL_COMPILE_STATUS) != gl.GL_TRUE:
error = gl.glGetShaderInfoLog(shader).decode()
if not gl.glGetShaderiv(shader, gl.GL_COMPILE_STATUS):
error = gl.glGetShaderInfoLog(shader)
if isinstance(error, bytes):
error = error.decode(errors="replace")
gl.glDeleteShader(shader)
raise RuntimeError(f"Shader compilation failed:\n{error}")
@ -276,8 +298,10 @@ def _create_program(vertex_source: str, fragment_source: str) -> int:
gl.glDeleteShader(vertex_shader)
gl.glDeleteShader(fragment_shader)
if gl.glGetProgramiv(program, gl.GL_LINK_STATUS) != gl.GL_TRUE:
error = gl.glGetProgramInfoLog(program).decode()
if not gl.glGetProgramiv(program, gl.GL_LINK_STATUS):
error = gl.glGetProgramInfoLog(program)
if isinstance(error, bytes):
error = error.decode(errors="replace")
gl.glDeleteProgram(program)
raise RuntimeError(f"Program linking failed:\n{error}")