
    +j                        S SK r S SKrS SKrS SKrS SKrS SKrS SKJ	r	  S SK
rS SKrS SKrS SKJrJrJr  S SKJr  S SKJr  \R,                  " \5      rS r\R5                  S5        \" 5         SqSqSqS r " S	 S
\	5      rSr Sr!Sr"Sr#Sr$Sr%Sr&S\'S\'4S jr(S\'S\)4S jr*S\'S\)4S jr+S r,S r-S r. " S S5      r/S\'S\)S\)4S jr0S\'S\'S\)4S jr1  S.S \'S!\)S"\)S#\2\2\Rf                        S$\2\4   S%\2\)   S&\2\5   S-  S'\2\Rf                     S-  S\2\2\Rf                        4S( jjr6 " S) S*\Rn                  5      r8 " S+ S,\5      r9S\94S- jr:g)/    N)	TypedDict)ComfyExtensionioui)override) get_missing_requirements_messagec                  J   [         R                  S5        / n [         R                  S5        [        R                  R	                  S5      c  U R                  S5        [         R                  S5        [        R                  R	                  S5      c  U R                  S5        U (       a  [        S[        5        S	35      e[         R                  S
[        R                   35        [        R                  R                  S5      (       Ga  [        R                  R                  S5      =(       d    [        R                  R                  S5      n[         R                  S[        U5       35        U(       d  [         R                  S5        [        R                  R!                  S5      n[         R                  S5        [        R                  R!                  S5      n[         R                  SU(       a  SOS SU(       a  SOS 35        [         R                  S5        g)zMEarly check for OpenGL availability. Raises RuntimeError if unlikely to work.z$_check_opengl_availability: startingz5_check_opengl_availability: checking for glfw packageglfwNz7_check_opengl_availability: checking for OpenGL packageOpenGLPyOpenGLz#OpenGL dependencies not available.

z%_check_opengl_availability: platform=linuxDISPLAYWAYLAND_DISPLAYz(_check_opengl_availability: has_display=z4_check_opengl_availability: checking for EGL libraryEGLz7_check_opengl_availability: checking for OSMesa libraryOSMesazHeadless mode: EGL=yesnoz	, OSMesa=z%_check_opengl_availability: completed)loggerdebug	importlibutil	find_specappendRuntimeErrorr   sysplatform
startswithosenvirongetboolctypesfind_library)missinghas_displayhas_egl
has_osmesas       7/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_glsl.py_check_opengl_availabilityr*      s}   
LL78G LLHI~~'/v
LLJK~~)1z"23S3U2VVXY
 	

 LL8GH
||w''jjnnY/T2::>>BS3T?[@Q?RSTLLOPkk..u5GLLRS11(;J LL.uT.J)]gTYmqSrst
LL89    z=nodes_glsl: running _check_opengl_availability at import timec                      [         c2  [        R                  S5        SSKJn   U q [        R                  S5        [         $ )z6Import OpenGL module. Called after context is created.Nz#_import_opengl: importing OpenGL.GLr   z _import_opengl: import completed)glr   r   	OpenGL.GLGL)_gls    r)   _import_openglr1   H   s0     
z:;78Ir+   c                   4    \ rS rSr% \\S'   \\S'   \\S'   Srg)SizeModeInputS   	size_modewidthheight N)__name__
__module____qualname____firstlineno__str__annotations__int__static_attributes__r8   r+   r)   r3   r3   S   s    NJKr+   r3         
      z#version 330 core
out vec2 v_texCoord;
void main() {
    vec2 verts[3] = vec2[](vec2(-1, -1), vec2(3, -1), vec2(-1, 3));
    v_texCoord = verts[gl_VertexID] * 0.5 + 0.5;
    gl_Position = vec4(verts[gl_VertexID], 0, 1);
}
z#version 300 es
precision highp float;

uniform sampler2D u_image0;
uniform vec2 u_resolution;

in vec2 v_texCoord;
layout(location = 0) out vec4 fragColor0;

void main() {
    fragColor0 = texture(u_image0, v_texCoord);
}
sourcereturnc                     [         R                  " SSU [         R                  S9n [         R                  " SSU 5      n SU -   $ )z?Convert GLSL ES (WebGL) shader source to desktop GLSL 330 core.z#version\s+\d+(\s+es)?\s*\n? )flagsz0precision\s+(lowp|mediump|highp)\s+\w+\s*;\s*\n?z#version 330 core
)resub
IGNORECASE)rE   s    r)   _convert_es_to_desktoprM      s;     VV3Rr}}UFVVGVTF 6))r+   c                     [         R                  " SU 5      nU(       d  g[        S U 5       5      n[        US-   [        5      $ )zsDetect how many fragColor outputs are used in the shader.

Returns the count of outputs needed (1 to MAX_OUTPUTS).
zfragColor(\d+)   c              3   8   #    U  H  n[        U5      v   M     g 7fN)r?   ).0ms     r)   	<genexpr>'_detect_output_count.<locals>.<genexpr>   s     ,GqCFFGs   )rJ   findallmaxminMAX_OUTPUTS)rE   matches	max_indexs      r)   _detect_output_countr\      s<    
 jj*F3G,G,,Iy1}k**r+   c                     [         R                  " SU 5      nU(       a$  [        S[        UR	                  S5      5      5      $ g)zqDetect multi-pass rendering from #pragma passes N directive.

Returns the number of passes (1 if not specified).
z#pragma\s+passes\s+(\d+)rO   )rJ   searchrW   r?   group)rE   matchs     r)   _detect_pass_countra      s5    
 II16:E1c%++a.)**r+   c                     [         R                  S5        [        R                  S:X  a   [         R                  S5        [	        S5      e[         R                  S5        SSKn [         R                  S5        U R                  5       (       d  [	        S	5      e [         R                  S
5        U R                  U R                  U R                  5        U R                  U R                  S5        U R                  U R                  S5        U R                  U R                  U R                  5        [         R                  S5        U R                  SSSSS5      nU(       d  [	        S5      e[         R                  S5        U R                  U5        [         R                  S5        X4$ ! [          a'    [         R                  S5        U R#                  5         e f = f)zOInitialize GLFW. Returns (window, glfw_module). Raises RuntimeError on failure.z_init_glfw: startingdarwinz_init_glfw: skipping on macOSz#GLFW backend not supported on macOSz!_init_glfw: importing glfw moduler   Nz_init_glfw: calling glfw.init()zglfw.init() failedz _init_glfw: setting window hints   z#_init_glfw: calling create_window()@   zComfyUI GLSLzglfw.create_window() failedz*_init_glfw: calling make_context_current()z"_init_glfw: completed successfullyz$_init_glfw: failed, terminating glfw)r   r   r   r   r   r
   initwindow_hintVISIBLEFALSECONTEXT_VERSION_MAJORCONTEXT_VERSION_MINOROPENGL_PROFILEOPENGL_CORE_PROFILEcreate_windowmake_context_current	Exception	terminate)_glfwwindows     r)   
_init_glfwrt      sg   
LL'(
||x45@AA
LL45
LL23::<</0078%--5%55q9%55q9%..0I0IJ:;$$R^T4H<==AB""6*9:} ;<s   DF, ,1Gc                     [         R                  S5        SSKJn   SSKJnJnJnJnJ	nJ
nJnJnJn	Jn
JnJnJnJnJnJnJnJnJnJnJnJnJnJnJn  [         R                  S5        SnSnSn [         R                  S5        U" U5      nUU R<                  :X  a  [?        S5      e[         R                  S	5        U RA                  5       U RA                  5       nnU" UUU5      (       d  Sn[?        S
5      e[         R                  SURB                   SURB                   35        XUUUSUSUSUSUSU/nU RD                  S-  " 5       n U RA                  5       n!U" UUU SU!5      (       a  U!RB                  S:X  a  [?        S5      eU S   n"[         R                  SU!RB                   35        U" U5      (       d  [?        S5      e[         R                  S5        U RF                  SU RH                  SU RJ                  U RL                  U/n#U" UU"UU#5      nUU:X  a  [?        S5      e[         R                  S5        USUSU/n$U" UU"U$5      nUU RN                  :X  a  [?        S5      e[         R                  S5        U" UUUU5      (       d  [?        S5      e[         R                  S5        UUUU 4$ ! [P         a:    [         R                  S5        Ub	  U
" UU5        Ub	  U	" UU5        Ub  U" U5        e f = f)zwInitialize EGL for headless rendering. Returns (display, context, surface, EGL_module). Raises RuntimeError on failure.z_init_egl: startingr   )r   )eglGetDisplayeglInitializeeglChooseConfigeglCreateContexteglMakeCurrenteglCreatePbufferSurface
eglBindAPIeglTerminateeglDestroyContexteglDestroySurfaceEGL_DEFAULT_DISPLAYEGL_NO_CONTEXTEGL_NONEEGL_SURFACE_TYPEEGL_PBUFFER_BITEGL_RENDERABLE_TYPEEGL_OPENGL_BITEGL_RED_SIZEEGL_GREEN_SIZEEGL_BLUE_SIZEEGL_ALPHA_SIZEEGL_DEPTH_SIZE	EGL_WIDTH
EGL_HEIGHTEGL_OPENGL_APIz_init_egl: imports completedNz"_init_egl: calling eglGetDisplay()zeglGetDisplay() failedz"_init_egl: calling eglInitialize()zeglInitialize() failedz_init_egl: EGL version .   rO   zeglChooseConfig() failedz&_init_egl: config chosen, num_configs=zeglBindAPI() failedz%_init_egl: calling eglCreateContext()rd   zeglCreateContext() failedz,_init_egl: calling eglCreatePbufferSurface()re   z eglCreatePbufferSurface() failedz#_init_egl: calling eglMakeCurrent()zeglMakeCurrent() failedz!_init_egl: completed successfullyz_init_egl: failed, cleaning up))r   r   r   r   
OpenGL.EGLrv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   EGL_NO_DISPLAYr   EGLintvalue	EGLConfigEGL_CONTEXT_MAJOR_VERSIONEGL_CONTEXT_MINOR_VERSIONEGL_CONTEXT_OPENGL_PROFILE_MASK#EGL_CONTEXT_OPENGL_CORE_PROFILE_BITEGL_NO_SURFACErp   )%_EGLrv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   displaycontextsurfacemajorminorconfig_attribsconfigsnum_configsconfigcontext_attribspbuffer_attribss%                                        r)   	_init_eglr      s   
LL&'"       LL/0GGG>9: 34d)))7889:{{}dkkmuWeU33G788.u{{m1U[[MJK !^Qq.RSAx	
 >>A%(kkmwKPPT_TeTeijTj9::=k>O>O=PQR.))455<=**A**A00$2Z2Z	
 #7FNOTn$:;;CD$b*b(C)'6?Kd)))ABB:;gwAA89989$.. 	56gw/gw/!	s   .IJ3 3AK7c                     SSK n [        R                  S5        S[        R                  S'   [        R                  S5        SSKJn  SSKJnJ	nJ
nJn  [        R                  S	5        U" US
SSS5      nU(       d  [        S5      eSu  pxU R                  Xx-  S-  -  " 5       n	[        R                  S5        U" XiUR                  Xx5      (       d  U" U5        [        S5      e[        R                  S5        Xi4$ )zdInitialize OSMesa for software rendering. Returns (context, buffer). Raises RuntimeError on failure.r   Nz_init_osmesa: startingosmesaPYOPENGL_PLATFORMz%_init_osmesa: importing OpenGL.osmesa)r/   )OSMesaCreateContextExtOSMesaMakeCurrentOSMesaDestroyContextOSMESA_RGBAz_init_osmesa: imports completed   zOSMesaCreateContextExt() failed)re   re   rD   z)_init_osmesa: calling OSMesaMakeCurrent()zOSMesaMakeCurrent() failedz$_init_osmesa: completed successfully)r#   r   r   r   r    r   r/   OpenGL.osmesar   r   r   r   r   c_ubyteGL_UNSIGNED_BYTE)
r#   r0   r   r   r   r   ctxr6   r7   buffers
             r)   _init_osmesar     s    
LL)*&.BJJ"#
LL89   LL23
 b!Q
=C<==MEnn 236F
LL<=S#*>*>NNS!788
LL78;r+   c                   @   ^  \ rS rSrSrSrSrU 4S jrS rS r	Sr
U =r$ )		GLContexti:  u   Manages OpenGL context and resources for shader execution.

Tries backends in order: GLFW (desktop) → EGL (headless GPU) → OSMesa (software).
NFc                 ^   > U R                   c  [        TU ]	  U 5      U l         U R                   $ rQ   )	_instancesuper__new__)cls	__class__s    r)   r   GLContext.__new__C  s'    == !GOC0CM}}r+   c                 <	   [         R                  (       a  [        R                  S5        g [        R                  S5        SS KnUR                  5       nS U l        S U l        S U l        S U l	        S U l
        S U l        S U l        S U l        / n[        R                  S5         [        5       u  U l        qSU l        [        R                  S5        U R                  cP  [        R                  S	5         [%        5       u  U l        U l	        U l
        qS
U l        [        R                  S5        U R                  cI  [        R                  S5         [)        5       u  U l        U l        SU l        [        R                  S5        U R                  cY  [*        R,                  S:X  a  SnO[*        R,                  S:X  a  SnOSnSR/                  S U 5       5      n[1        SU SU 35      e[        R                  S5        [3        5         [        R                  S5         [4        R7                  S5      n[4        R9                  U5        Xpl        [        R                  S5        UR                  5       U-
  S!-  n[4        R=                  [4        R>                  5      n	[4        R=                  [4        R@                  5      n
[4        R=                  [4        RB                  5      nU	(       a  U	RE                  5       OS"n	U
(       a  U
RE                  5       OS"n
U(       a  URE                  5       OS"nS#[         l        [        RG                  S$US% S&U R                   S'U	 S(U
 S)U 3
5        g ! [          a6  n[        R                  SU 35        UR#                  SU45         S nAGNS nAff = f! [          a6  n[        R                  SU 35        UR#                  SU45         S nAGNS nAff = f! [          a6  n[        R                  SU 35        UR#                  SU45         S nAGNS nAff = f! [          a]  n[        R                  S U 35        W(       a3   [4        R;                  SU/5         S nAGN! [          a      S nAGN&f = f S nAGN0S nAff = f)*Nz1GLContext.__init__: already initialized, skippingz+GLContext.__init__: starting initializationr   z'GLContext.__init__: trying GLFW backendr
   z*GLContext.__init__: GLFW backend succeededz)GLContext.__init__: GLFW backend failed: GLFWz&GLContext.__init__: trying EGL backendeglz)GLContext.__init__: EGL backend succeededz(GLContext.__init__: EGL backend failed: r   z)GLContext.__init__: trying OSMesa backendr   z,GLContext.__init__: OSMesa backend succeededz+GLContext.__init__: OSMesa backend failed: r   win32zWindows: Ensure GPU drivers are installed and display is available.
         CPU-only/headless mode is not supported on Windows.rc   zmacOS: GLFW is not supported.
  Install OSMesa via Homebrew: brew install mesa
  Then: pip install PyOpenGL PyOpenGL-acceleratezLinux: Install one of these backends:
  Desktop:           sudo apt install libgl1-mesa-glx libglfw3
  Headless with GPU: sudo apt install libegl1-mesa libgl1-mesa-dri
  Headless (CPU):    sudo apt install libosmesa6r   c              3   6   #    U  H  u  pS U SU 3v   M     g7f)z  z: Nr8   )rR   nameerrs      r)   rT   %GLContext.__init__.<locals>.<genexpr>  s     %Q&YT4&3%&8&s   z2Failed to create OpenGL context.

Backend errors:
z

z'GLContext.__init__: importing OpenGL.GLz GLContext.__init__: creating VAOrO   z,GLContext.__init__: VAO created successfullyzFGLContext.__init__: VAO creation failed (may be expected for OSMesa):   UnknownTzGLSL context initialized in .1fms (z) - z (z), GL )$r   _initializedr   r   timeperf_counter_backend_window_egl_display_egl_context_egl_surface_osmesa_ctx_osmesa_buffer_vaort   r
   rp   r   r   r   r   r   r   joinr   r1   r-   glGenVertexArraysglBindVertexArrayglDeleteVertexArraysglGetStringGL_RENDERER	GL_VENDOR
GL_VERSIONdecodeinfo)selfr   starterrorseplatform_helperror_detailsvaoelapsedrenderervendorversions               r)   __init__GLContext.__init__H  s   !!LLLMBC 	!!#   "	 >?	'!+DL$"DMLLEF
 == LLAB*OX{L!4#4d6G %HI
 == LLDE-8D5 $"5 (KL
 == ||w&S  )G G  !II%Q&%QQM$$1?$ /#  	>? 	78	&&q)C  %ILLGH $$&.$6 >>"..1-../(08??$i$*	&-'.."9!%	273-tDMM?RVW_V``bcibjjpqxpyz{g  	'LLDQCHIMM61+&&	'  *GsKLuaj))*  -J1#NOxm,,-T  	LLabcadef ++Au55   		s   %.M+ 6:N. 3O1 !AP4 +
N+5+N&&N+.
O.8+O))O.1
P1;+P,,P14
R>RQ;;
RRRRRc                    U R                   S:X  a   [        R                  U R                  5        OU R                   S:X  a:  SSKJn  U" U R                  U R                  U R                  U R                  5        ODU R                   S:X  a4  SSK	J
n  U" U R                  U R                  [        R                  SS5        U R                  b   [        R!                  U R                  5        g g )Nr
   r   r   )rz   r   )r   re   )r   r
   ro   r   r   rz   r   r   r   r   r   r   r   r-   r   r   r   )r   rz   r   s      r)   make_currentGLContext.make_current  s    ==F"%%dll3]]e#14,,d.?.?ARARTXTeTef]]h&7d..0C0CREXEXZ\^`a99   + !r+   )r   r   r   r   r   r   r   r   )r9   r:   r;   r<   __doc__r   r   r   r   r   r@   __classcell__)r   s   @r)   r   r   :  s+    
 IL
p|d, ,r+   r   shader_typec                 |   [         R                  U5      n[         R                  X 5        [         R                  U5        [         R	                  U[         R
                  5      [         R                  :w  aF  [         R                  U5      R                  5       n[         R                  U5        [        SU 35      eU$ )z#Compile a shader and return its ID.zShader compilation failed:
)r-   glCreateShaderglShaderSourceglCompileShaderglGetShaderivGL_COMPILE_STATUSGL_TRUEglGetShaderInfoLogr   glDeleteShaderr   )rE   r   shadererrors       r)   _compile_shaderr     s    {+Ff%v	 4 45C%%f-446
&!9%ABBMr+   vertex_sourcefragment_sourcec                    [        U [        R                  5      n [        U[        R                  5      n[        R                  5       n[        R                  XB5        [        R                  XC5        [        R                  U5        [        R                  U5        [        R                  U5        [        R                  U[        R                  5      [        R                  :w  aF  [        R                  U5      R                  5       n[        R                  U5        [	        SU 35      eU$ ! [         a    [        R                  U5        e f = f)z!Create and link a shader program.zProgram linking failed:
)r   r-   GL_VERTEX_SHADERGL_FRAGMENT_SHADERr   r   glCreateProgramglAttachShaderglLinkProgramglGetProgramivGL_LINK_STATUSr   glGetProgramInfoLogr   glDeleteProgram)r   r   vertex_shaderfragment_shaderprogramr   s         r)   _create_programr    s   #M23F3FGM)/2;P;PQ
   "Gg-g/Wm$o&	""3"34

B&&w/668
7#6ug>??N#  
-(s   D1 1!Efragment_coder6   r7   image_batchesfloatsintsboolscurvesc                 $   SSK nUR                  5       n	U(       d  / $ [        5       n
U
R                  5         [	        U 5      n[        U 5      n[        U 5      nUc  / nUc  / nSnSn/ n/ n/ n/ n/ n[        US   5      n  [        [        U5      n[        R                  U5        [        R                  S5      n[        R!                  [        R"                  U5        / n[%        U5       GH  n[        R'                  S5      nUR)                  U5        [        R+                  [        R,                  U5        [        R/                  [        R,                  S[        R0                  XS[        R2                  [        R4                  S5	        [        R7                  [        R,                  [        R8                  [        R:                  5        [        R7                  [        R,                  [        R<                  [        R:                  5        [        R?                  [        R"                  [        R@                  U-   [        R,                  US5        UR)                  [        R@                  U-   5        GM     [        RC                  UU5        [        RE                  [        R"                  5      [        RF                  :w  a  [        S5      eUS:  Ga  [%        S5       GH  n[        R'                  S5      nUR)                  U5        [        R+                  [        R,                  U5        [        R/                  [        R,                  S[        R0                  XS[        R2                  [        R4                  S5	        [        R7                  [        R,                  [        R8                  [        R:                  5        [        R7                  [        R,                  [        R<                  [        R:                  5        [        R7                  [        R,                  [        RH                  [        RJ                  5        [        R7                  [        R,                  [        RL                  [        RJ                  5        [        R                  S5      nUR)                  U5        [        R!                  [        R"                  U5        [        R?                  [        R"                  [        R@                  [        R,                  US5        [        RC                  S[        R@                  /5        [        RE                  [        R"                  5      [        RF                  :w  d  GM  [        S5      e   [%        U5       GH  n[        R'                  S5      nUR)                  U5        [        RO                  [        RP                  U-   5        [        R+                  [        R,                  U5        [        R7                  [        R,                  [        R8                  [        R:                  5        [        R7                  [        R,                  [        R<                  [        R:                  5        [        R7                  [        R,                  [        RH                  [        RJ                  5        [        R7                  [        R,                  [        RL                  [        RJ                  5        [        RS                  USU 35      nUS:  d  GM  [        RU                  UU5        GM     [        RS                  US	5      nUS:  a)  [        RW                  U[Y        U5      [Y        U5      5        [[        U5       H=  u  nn[        RS                  US
U 35      nUS:  d  M'  [        R]                  UU5        M?     [[        U5       H=  u  nn[        RS                  USU 35      nUS:  d  M'  [        RU                  UU5        M?     [[        U5       HF  u  nn[        RS                  USU 35      nUS:  d  M'  [        RU                  UU(       a  SOS5        MH     [[        U5       GH  u  nn[        R'                  S5      nUR)                  U5        [^        U-   n[        RO                  [        RP                  U-   5        [        R+                  [        R,                  U5        [        R/                  [        R,                  S[        R`                  [        U5      SS[        Rb                  [        R4                  U5	        [        R7                  [        R,                  [        R8                  [        R:                  5        [        R7                  [        R,                  [        R<                  [        R:                  5        [        R7                  [        R,                  [        RH                  [        RJ                  5        [        R7                  [        R,                  [        RL                  [        RJ                  5        [        RS                  USU 35      nUS:  d  GM  [        RU                  UU5        GM     [        RS                  US5      n [        Re                  SSX5        [        Rg                  [        Rh                  5        / n!U GH  n"[[        U"5       GH0  u  nn#[        RO                  [        RP                  U-   5        [        R+                  [        R,                  UU   5        U#Rj                  u  n$n%n&U&S:X  aN  [l        Rn                  " U$U%S4[l        Rp                  S9n'U#SSS2SS2SS24   U'SS2SS2SS24'   SU'SS2SS2S4'   O#[l        Rr                  " U#SSS2SS2SS24   5      n'[        R/                  [        R,                  S[        R0                  U%U$S[        R2                  [        R4                  U'5	        GM3     US:X  a  [        R!                  [        R"                  U5        U S:  a  [        RU                  U S5        [        Ru                  SSSS5        [        Rw                  [        Rx                  5        [        R{                  [        R|                  SS5        GOp[%        U5       GH`  n(U(US-
  :H  n)U S:  a  [        RU                  U U(5        U)(       a%  [        R!                  [        R"                  U5        O,UU(S-     n*[        R!                  [        R"                  U*5        [        RO                  [        RP                  5        U(S:X  a(  [        R+                  [        R,                  US   5        O/UU(S-
  S-     n+[        R+                  [        R,                  U+5        [        Ru                  SSSS5        [        Rw                  [        Rx                  5        [        R{                  [        R|                  SS5        GMc     / n,U H  n[        R+                  [        R,                  U5        [        R                  [        R,                  S[        R2                  [        R4                  5      n-[l        R                  " U-[l        Rp                  S9R                  X!S5      n#U,R)                  U#SSS2SS2SS24   R                  5       5        M     [l        R                  " X!S4[l        Rp                  S9n.[%        U[        5       H  nU,R)                  U.5        M     U!R)                  U,5        GM     UR                  5       U	-
  S-  n/[        U5      n0US:  a  SU S3OSn1[        R                  SU/S SU0 SU0S:w  a  SOS SU SU U1 S35        U![        R!                  [        R"                  S5        [        R                  S5        U H!  n[        R                  [        U5      5        M#     U H!  n[        R                  [        U5      5        M#     U H!  n[        R                  [        U5      5        M#     U H!  n[        R                  [        U5      5        M#     Ub  [        R                  SU/5        U H  n[        R                  SU/5        M     Ub  [        R                  U5        $ $ ! [         a    [        R                  SU 35        e f = f! [        R!                  [        R"                  S5        [        R                  S5        U H!  n[        R                  [        U5      5        M#     U H!  n[        R                  [        U5      5        M#     U H!  n[        R                  [        U5      5        M#     U H!  n[        R                  [        U5      5        M#     Ub  [        R                  SU/5        U H  n[        R                  SU/5        M     Ub  [        R                  U5        f f = f)a  
Render a fragment shader for multiple batches efficiently.

Compiles shader once, reuses framebuffer/textures across batches.
Supports multi-pass rendering via #pragma passes N directive.

Args:
    fragment_code: User's fragment shader code
    width: Output width
    height: Output height
    image_batches: List of batches, each batch is a list of input images (H, W, C) float32 [0,1]
    floats: List of float uniforms
    ints: List of int uniforms
    bools: List of bool uniforms (passed as int 0/1 to GLSL bool uniforms)
    curves: List of 1D LUT arrays (float32) of arbitrary size for u_curve0-N

Returns:
    List of batch outputs, each is a list of output images (H, W, 4) float32 [0,1]
r   NzFragment shader:
rO   zFramebuffer is not complete   z%Ping-pong framebuffer is not completeu_imageu_resolutionu_floatu_intu_boolu_curveu_passrd   rD   )dtypeg      ?r   z, z passesrH   zGLSL shader executed in r   r   z batchesx))Jr   r   r   r   rM   r\   ra   lenr  VERTEX_SHADERr   r   r   r-   glUseProgramglGenFramebuffersglBindFramebufferGL_FRAMEBUFFERrangeglGenTexturesr   glBindTextureGL_TEXTURE_2DglTexImage2D
GL_RGBA32FGL_RGBAGL_FLOATglTexParameteriGL_TEXTURE_MIN_FILTER	GL_LINEARGL_TEXTURE_MAG_FILTERglFramebufferTexture2DGL_COLOR_ATTACHMENT0glDrawBuffersglCheckFramebufferStatusGL_FRAMEBUFFER_COMPLETEGL_TEXTURE_WRAP_SGL_CLAMP_TO_EDGEGL_TEXTURE_WRAP_TglActiveTextureGL_TEXTURE0glGetUniformLocationglUniform1iglUniform2ffloat	enumerateglUniform1f
MAX_IMAGESGL_R32FGL_RED
glViewport	glDisableGL_BLENDshapenpemptyfloat32ascontiguousarrayglClearColorglClearGL_COLOR_BUFFER_BITglDrawArraysGL_TRIANGLESglGetTexImage
frombufferreshapecopyzerosrY   r   glDeleteTexturesr?   glDeleteFramebuffersr
  )2r  r6   r7   r  r  r  r  r  r   
start_timer   r   num_outputs
num_passesr  fbooutput_texturesinput_texturescurve_texturesping_pong_texturesping_pong_fbos
num_inputsdraw_buffersitex_pp_texpp_fbolocvlutunitpass_locall_batch_outputsimagesimghwc
img_uploadpis_last_pass
target_fbo
source_texbatch_outputsdata	black_imgr   num_batches	pass_infos2                                                     r)   _render_shader_batchr    si   : ""$J	
+C -];O '}5K $M2J}~ G
CONNN]1%&JP(	%m_EG
 	  ""1%
R..4{#A""1%C""3'R--s3OOB,,aqRTR\R\^`^i^ikopr//1I1I2<<Xr//1I1I2<<X%%b&7&79P9PST9TVXVfVfhkmno 7 7! ;< $ 	l3&&r'8'89R=W=WW<== >1X))!,"))&1  !1!16: 0 0!R]]ESTVXV`V`bdbmbmost""2#3#3R5M5Mr||\""2#3#3R5M5Mr||\""2#3#3R5I5I2K^K^_""2#3#3R5I5I2K^K^_--a0%%f-$$R%6%6?))"*;*;R=T=TVXVfVfhnpqr  R%<%<$=>..r/@/@ARE_E__&'NOO# ( z"A""1%C!!#&r~~12R--s3r//1I1I2<<Xr//1I1I2<<Xr//1E1ErGZGZ[r//1E1ErGZGZ[))'WQC=ACaxsA& # %%g~>!8NN3eeFm<f%DAq))'WQC=ACaxsA& &
 dODAq))'U1#;?CaxsA& $
 e$DAq))'VA3<@CaxsA2 %  'FAs""1%C!!#&>Dr~~45R--s3OOB,,aSXq!RYYXZXcXcehir//1I1I2<<Xr//1I1I2<<Xr//1E1ErGZGZ[r//1E1ErGZGZ[))'WQC=ACaxsD) (" **7H=
aE*
R[[! #F#F+3""2>>A#56  !1!1>!3DE ))1a6!#1a)2::!FJ+.ttQz?Jq!RaRx(*-Jq!Qw'!#!5!5c$B$1*o!FJ 0 0!R]]Aq!RZZY[YdYdfpq , Q$$R%6%6<q=NN8Q/1a+

2112A6 z*A$%a$7L  1}x3#,,R->->D &4AE%:
,,R->->
K &&r~~6Av(()9)9>!;LM &8Q!%D
(()9)9:FOOAq!Q/JJr556OOBOOQ:7 +> M&  !1!137''(8(8!RZZUmmD

;CCFSTU$$S2q!_%9%9%;<	 ' &!32::FI;4$$Y/ 5 $$]3M $P $$&3t;-(0:QbG,B	.wsm4}F[fjk[kSWqsRttvw|v}}~  @F  G  HQ  GR  RS  T  	U  	R..2
!CC) "!CC) ""CC) #%CC) &?##Au-$F##Ax0 %w' W  	LL-o->?@	x 	R..2
!CC) "!CC) ""CC) #%CC) &?##Au-$F##Ax0 %w' sX   AD
 SAD1 5F-AD1 'BAD1 9AAD1 AAD1 H-AD1 UAD1 D
$AD.D.AD1 D1D*AIc                      \ rS rSr\S\R                  4S j5       r\    SS\S\	S\R                  R                  S\R                  R                  S	\R                  R                  S
\R                  R                  S\R                  R                  S\R                  4S jj5       r\S\\R                      S\R                   S\\\4   4S j5       rSrg)
GLSLShaderi   rF   c                    [         R                  R                  [         R                  R	                  S5      SS[
        S9n[         R                  R                  [         R                  R	                  SSS9SS[        S9n[         R                  R                  [         R                  R	                  S	SS9S
S[        S9n[         R                  R                  [         R                  R	                  SSS9SS[        S9n[         R                  R                  [         R                  R	                  S5      SS[        S9n[         R                  " SSSSSS[         R                  R	                  S[        SSS9[         R                   R	                  S[         R                   R#                  S/ 5      [         R                   R#                  S[         R                  R	                  SSS[$        R&                  S9[         R                  R	                  SSS[$        R&                  S9/5      /SS 9[         R                  R	                  S!US"[
        S-
   S#3S$9[         R                  R	                  S%US&[        S-
   S'3S$9[         R                  R	                  S(US)[        S-
   S'3S$9[         R                  R	                  S*US+[        S-
   S,3S$9[         R                  R	                  S-US.[        S-
   S/3S$9/[         R                  R)                  S0S1S29[         R                  R)                  S3S4S29[         R                  R)                  S5S6S29[         R                  R)                  S7S8S29/S99$ ):NimagerO   )prefixrX   rW   rB          )defaultr  r   r?   r  r"   Fr  curver  r  zGLSL Shaderzimage/shaderzRApply GLSL ES fragment shaders to images. u_resolution (vec2) is always available.Tr  zFGLSL fragment shader source code (GLSL ES 3.00 / WebGL 2.0 compatible))r  	multilinetooltipr5   
from_inputcustomr6   i   )r  rX   rW   r7   zXOutput size: 'from_input' uses first input image dimensions, 'custom' allows manual size)optionsr  rr  z!Images are available as u_image0-z (sampler2D) in the shader code)templater  r  z!Floats are available as u_float0-z in the shader coder  zInts are available as u_int0-r  z"Booleans are available as u_bool0-z (bool) in the shader coder  z!Curves are available as u_curve0-zV (sampler2D, 1D LUT) in the shader code. Sample with texture(u_curve0, vec2(x, 0.5)).rIMAGE0zIAvailable via layout(location = 0) out vec4 fragColor0 in the shader code)display_namer  IMAGE1zIAvailable via layout(location = 1) out vec4 fragColor1 in the shader codeIMAGE2zIAvailable via layout(location = 2) out vec4 fragColor2 in the shader codeIMAGE3zIAvailable via layout(location = 3) out vec4 fragColor3 in the shader code)node_idr  categorydescriptionis_experimentalhas_intermediate_outputinputsoutputs)r   AutogrowTemplatePrefixImageInputrE  FloatMAX_UNIFORMSIntBoolean	MAX_BOOLSCurve
MAX_CURVESSchemaStringDEFAULT_FRAGMENT_SHADERDynamicComboOptionnodesMAX_RESOLUTIONOutput)r   image_templatefloat_templateint_templatebool_templatecurve_templates         r)   define_schemaGLSLShader.define_schema  s   33HHNN7#	 4 
 33HHNN7CN0	 4 
 {{11FFLLL*	 2 
 22JJVU3	 3 
 33HHNN7#	 4 
 yy &#; !$(		%3"d	    %%..|R@..$ "$+,/()(-(<(<	 !- !" !#$,,/()(-(<(<	 !- !"( w- & 0 !!(^Opq{|}q}p~  ^  N_!  `!!(^Opq}~q  qA  AT  NU!  V!!&<Khiuvwiwhx  yL  JM!  N!!'MMopyz{p{o|  }W  LX!  Y!!(^Opq{|}q}p~  U  NV!  WG$L X  @K  LX  @K  LX  @K  LX  @K  L	_5
 5	
r+   Nr  r5   rr  r  r  r  r  c           
         UR                  5        V	s/ s H	  oc  M  U	PM     n
n	U(       a%  UR                  5        V	s/ s H	  ob  U	OSPM     sn	O/ nU(       a%  UR                  5        V	s/ s H	  ob  U	OSPM     sn	O/ nU(       a%  UR                  5        V	s/ s H	  ob  U	OSPM     sn	O/ nU(       aP  UR                  5        V	s/ s H4  oc  M  U	R                  5       R                  [        R                  5      PM6     sn	O/ nU
(       d  [        S5      eUS   S:X  a  US   nUS   nOU
S   R                  S	S
 u  nnU
S   R                  S   n/ n[        U5       Hb  nU
 Vs/ s HA  nUU   R                  5       R                  5       R                  [        R                  5      PMC     nnUR                  U5        Md     [        UUUUUUUU5      n[        [        5       Vs/ s H  n/ PM     nnU H@  n[        U5       H.  u  nnUU   R                  [        R                  " U5      5        M0     MB     [        [        5       Vs/ s H  n[        R                   " UU   SS9PM     nn["        R$                  " USU R'                  U
US   5      06$ s  sn	f s  sn	f s  sn	f s  sn	f s  sn	f s  snf s  snf s  snf )Nr  r   Fz$At least one input image is requiredr5   r  r6   r7   rO   rd   )dimr   )valuesto_lutastyperL  rN  
ValueErrorrK  r)  cpunumpyr   r  rY   rC  torch
from_numpystackr   
NodeOutput_build_ui_output)r   r  r5   rr  r  r  r  r  kwargsrm  
image_list
float_listint_list	bool_list
curve_luts	out_width
out_height
batch_sizer  	batch_idx
img_tensorbatch_imagesrq  ri  all_outputsr|  rg  out_imgoutput_tensorss                                r)   executeGLSLShader.execute^  s    "(BAa
BFL&--/B/Q-QS(/BRT 	 JNt{{}E}!AA-}ESUOTELLNKNq-QU2NKZ\	bhV]]_^_3ahhj''

3_^np
CDD [!X-!'*I"8,J$.qM$7$7!$<!J	]((+
 z*IeopeoWaJy1557==?FFrzzReoLp  . + 1	
 $)#56#5ar#56.M'6
7A%%e&6&6w&?@ 7 / GLKFXYFX%++k!n!<FXY}}
##Jq0AB
 	
[ CBEK^" q 7
 Zs:   JJJ",J'J,J11J1)AJ6+J;"K r  output_batchc                 "   / nU HK  nUR                  [        R                  R                  US[        R
                  R                  SSS95        MM     [        R                  R                  US[        R
                  R                  SSS9nX5S.$ )zNBuild UI output with input and output images for client-side shader execution.GLSLShader_inputNrO   )filename_prefixfolder_typer   compress_levelGLSLShader_output)input_imagesrr  )extendr   ImageSaveHelpersave_imagesr   
FolderTypetemp)r   r  r  input_images_uirs  output_images_uis         r)   r  GLSLShader._build_ui_output  s    
 C""2#5#5#A#A 2MM..  $B $   --99/** : 
 !0LLr+   r8   )NNNN)r9   r:   r;   r<   classmethodr   r  r  r=   r3   r  Typer  r  listr  Tensordictr  r@   r8   r+   r)   r  r     s   Y
bii Y
 Y
v  $(!%"&#'<
<
 !<
   	<

   <
 kk<
 {{<
   <
 
<
 <
| Mell+M;@<<M	c4iM Mr+   r  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)GLSLExtensioni  rF   c                    #    [         /$ 7frQ   )r  )r   s    r)   get_node_listGLSLExtension.get_node_list  s     |s   
r8   N)r9   r:   r;   r<   r   r  typer   	ComfyNoder  r@   r8   r+   r)   r  r    s)    T$r||*<%=  r+   r  c                     #    [        5       $ 7frQ   )r  r8   r+   r)   comfy_entrypointr    s     ?s   )NN);r   r   rJ   loggingctypes.utilr#   importlib.utilr   typingr   r  rL  r  r  comfy_api.latestr   r   r   typing_extensionsr   utils.install_utilr   	getLoggerr9   r   r*   r   r-   r
   r   r1   r3   rE  r  r  r  rY   r$  r  r=   rM   r?   r\   ra   rt   r   r   r   r   r  r  ndarrayrB  r"   r  r  r  r  r  r8   r+   r)   <module>r     s	   	 
 	        3 3 & ?			8	$':V L M   

I  
	
 *3 *3 *	+ 	+ 	+s s "JQh>K, K,\C c c 3   @  $&*O(O(O( O( RZZ()	O(
 KO( s)O( :O( t#O( 
$rzz
O(btM tMnN  r+   