
    +j                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
Zd dlZd dlZd dlmZmZmZ d dlmZ d dlmZ  ej        e          Zd Ze                    d            e             dadadad Z G d	 d
e	          ZdZ dZ!dZ"dZ#dZ$dZ%dZ&de'de'fdZ(de'de)fdZ*de'de)fdZ+d Z,d Z-d Z. G d d          Z/de'de)de)fdZ0de'de'de)fdZ1	 	 d.d e'd!e)d"e)d#e2e2ej3                          d$e2e4         d%e2e)         d&e2e5         dz  d'e2ej3                 dz  de2e2ej3                          fd(Z6 G d) d*ej7                  Z8 G d+ d,e          Z9de9fd-Z:dS )/    N)	TypedDict)ComfyExtensionioui)override) get_missing_requirements_messagec                     t                               d           g } t                               d           t          j                            d          |                     d           t                               d           t          j                            d          |                     d           | rt          dt                       d	          t                               d
t          j	                    t          j	        
                    d          rt          j                            d          pt          j                            d          }t                               dt          |                      |st                               d           t          j                            d          }t                               d           t          j                            d          }t                               d|rdnd d|rdnd            t                               d           dS )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88G LLHIII~''/v
LLJKKK~))1z""" 
Y3S3U3UYYY
 
 	

 LLGGGHHH
|w'' ujnnY//T2:>>BS3T3TS[@Q@QSSTTT 	uLLOPPPk..u55GLLRSSS11(;;J LLs/IuuTss]gTqTYTYmqssttt
LL899999    z=nodes_glsl: running _check_opengl_availability at import timec                      t           <t                              d           ddlm}  | a t                              d           t           S )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   sK     
z:;;;7888Ir+   c                   .    e Zd ZU eed<   eed<   eed<   dS )SizeModeInput	size_modewidthheightN)__name__
__module____qualname__str__annotations__int r+   r)   r3   r3   S   s+         NNNJJJKKKKKr+   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                 |    t          j        dd| t           j                  } t          j        dd|           } d| z   S )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)rB   s    r)   _convert_es_to_desktoprJ      s>     V3Rr}UUUFVGVTTF 6))r+   c                     t          j        d|           }|sdS t          d |D                       }t          |dz   t                    S )z{Detect how many fragColor outputs are used in the shader.

    Returns the count of outputs needed (1 to MAX_OUTPUTS).
    zfragColor(\d+)   c              3   4   K   | ]}t          |          V  d S N)r<   ).0ms     r)   	<genexpr>z'_detect_output_count.<locals>.<genexpr>   s(      ,,qCFF,,,,,,r+   )rG   findallmaxminMAX_OUTPUTS)rB   matches	max_indexs      r)   _detect_output_countrX      sS    
 j*F33G q,,G,,,,,Iy1}k***r+   c                     t          j        d|           }|r0t          dt          |                    d                              S dS )zyDetect multi-pass rendering from #pragma passes N directive.

    Returns the number of passes (1 if not specified).
    z#pragma\s+passes\s+(\d+)rL   )rG   searchrS   r<   group)rB   matchs     r)   _detect_pass_countr]      sE    
 I16::E +1c%++a..))***1r+   c                     t                               d           t          j        dk    r)t                               d           t	          d          t                               d           ddl} t                               d           |                                 st	          d	          	 t                               d
           |                     | j        | j	                   |                     | j
        d           |                     | j        d           |                     | j        | j                   t                               d           |                     ddddd          }|st	          d          t                               d           |                     |           t                               d           || fS # t           $ r0 t                               d           |                                   w xY w)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_glfwrp      s   
LL'(((
|x4555@AAA
LL4555
LL2333::<< 1/0007888%-555%5q999%5q999%.0IJJJ:;;;$$R^T4HH 	><===ABBB""6***9:::u}   ;<<<s   0D G :Hc                  `   t                               d           ddlm}  ddlm}m}m}m}m	}m
}m}m}m}	m}
m}m}m}m}m}m}m}m}m}m}m}m}m}m}m} t                               d           d}d}d}	 t                               d            ||          }|| j        k    rt?          d          t                               d	           |                                  |                                  }} ||||          sd}t?          d
          t                               d|j!         d|j!                    |||||d|d|d|d|d|g} | j"        dz              } |                                  }! |||| d|!          r|!j!        dk    rt?          d          | d         }"t                               d|!j!                     ||          st?          d          t                               d           | j#        d| j$        d| j%        | j&        |g}# |||"||#          }||k    rt?          d          t                               d           |d|d|g}$ |||"|$          }|| j'        k    rt?          d          t                               d            |||||          st?          d          t                               d           |||| fS # tP          $ rE t                               d           | |
||           | |	||           | ||            w xY w)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 .   rL   zeglChooseConfig() failedz&_init_egl: config chosen, num_configs=zeglBindAPI() failedz%_init_egl: calling eglCreateContext()r`   zeglCreateContext() failedz,_init_egl: calling eglCreatePbufferSurface()ra   z eglCreatePbufferSurface() failedz#_init_egl: calling eglMakeCurrent()zeglMakeCurrent() failedz!_init_egl: completed successfullyz_init_egl: failed, cleaning up))r   r   r   r   
OpenGL.EGLrr   rs   rt   ru   rv   rw   rx   ry   rz   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_SURFACErl   )%_EGLrr   rs   rt   ru   rv   rw   rx   ry   rz   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00GGG>9:::- 344d)))78889:::{{}}dkkmmu}WeU33 	9G7888Ju{JJU[JJKKK o!^Qq.RSAx	
 &4>A%((kkmmwKPP 	;T_TeijTjTj9:::Qk>OQQRRRz.)) 	64555<===*A*A0$2Z	
 #"7FNOTTn$$:;;;CDDD$b*b(C))'6?KKd)))ABBB:;;;~gwAA 	:89998999$.. 	 	 	5666gw///gw///L!!!	s   8I%K AL-c                  .   ddl } t                              d           dt          j        d<   t                              d           ddlm} ddlm}m	}m
}m} t                              d	            ||d
ddd          }|st          d          d\  }} | j        ||z  dz  z              }	t                              d            |||	|j        ||          s ||           t          d          t                              d           ||	fS )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)ra   ra   rA   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   ctxr5   r6   buffers
             r)   _init_osmesar     sd   MMM
LL)***&.BJ"#
LL8999                  LL2333
 
 b!Q
=
=C ><===ME63fn 2366F
LL<===S&#*>vNN 9S!!!7888
LL7888;r+   c                   6     e Zd ZdZdZdZ fdZd Zd Z xZ	S )	GLContextu   Manages OpenGL context and resources for shader execution.

    Tries backends in order: GLFW (desktop) → EGL (headless GPU) → OSMesa (software).
    NFc                 l    | j         &t                                          |           | _         | j         S rN   )	_instancesuper__new__)cls	__class__s    r)   r   zGLContext.__new__C  s*    = !GGOOC00CM}r+   c                 	   t           j        rt                              d           d S t                              d           dd l}|                                }d | _        d | _        d | _        d | _	        d | _
        d | _        d | _        d | _        g }t                              d           	 t                      \  | _        ad| _        t                              d           nK# t           $ r>}t                              d|            |                    d|f           Y d }~nd }~ww xY w| j        t                              d	           	 t%                      \  | _        | _	        | _
        ad
| _        t                              d           nK# t           $ r>}t                              d|            |                    d|f           Y d }~nd }~ww xY w| j        t                              d           	 t)                      \  | _        | _        d| _        t                              d           nK# t           $ r>}t                              d|            |                    d|f           Y d }~nd }~ww xY w| j        \t*          j        dk    rd}nt*          j        dk    rd}nd}d                    d |D                       }t1          d| d|           t                              d           t3                       t                              d           	 t4                              d          }t4                              |           || _        t                              d           nd# t           $ rW}t                              d |            |r.	 t4                              d|g           n# t           $ r Y nw xY wY d }~nd }~ww xY w|                                |z
  d!z  }t4                              t4          j                  }	t4                              t4          j                   }
t4                              t4          j!                  }|	r|	"                                nd"}	|
r|
"                                nd"}
|r|"                                nd"}d#t           _        t          #                    d$|d%d&| j         d'|	 d(|
 d)| 
           d S )*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.r_   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   ,   K   | ]\  }}d | d| V  dS )z  z: Nr=   )rO   nameerrs      r)   rQ   z%GLContext.__init__.<locals>.<genexpr>  s7      %Q%QYT3&84&8&83&8&8%Q%Q%Q%Q%Q%Qr+   z2Failed to create OpenGL context.

Backend errors:
z

z'GLContext.__init__: importing OpenGL.GLz GLContext.__init__: creating VAOrL   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_vaorp   r
   rl   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__zGLContext.__init__H  s?   ! 	LLLMMMFBCCC 	!!##   "	 >???	'!+DL$"DMLLEFFFF 	' 	' 	'LLHQHHIIIMM61+&&&&&&&&	' = LLABBB*OX{{L!4#4d6G %HIIII * * *KKKLLLuaj))))))))* = LLDEEE-8D5 $"5 (KLLLL - - -N1NNOOOxm,,,,,,,,- = |w&&S  ))G G  !II%Q%Q&%Q%Q%QQQM#$1# # # #   	>??? 	7888	&&q))C  %%%DILLGHHHH 	 	 	LLebceefff  ++Au5555    D	 $$&&.$6 >>".11--..//(0?8??$$$i$*9	&-<'.."""9!%	z7zzzDMzzW_zzcizzqxzz{{{{{s   07C( (
D024D++D0AF 
G!#4GG!<I 
J4JJ4AN
 

O+O&4OO&
OO&OO&&O+c                 |   | j         dk    r t                              | j                   nh| j         dk    r)ddlm}  || j        | j        | j        | j                   n4| j         dk    r)ddl	m
}  || j        | j        t          j        dd           | j        !t                              | j                   d S d S )Nr
   r   r   )rv   r   )r   ra   )r   r
   rk   r   r   rv   r   r   r   r   r   r   r   r-   r   r   r   )r   rv   r   s      r)   make_currentzGLContext.make_current  s    =F""%%dl3333]e##111111N4,d.?ARTXTeffff]h&&777777d.0CREXZ\^`aaa9   +++++ ! r+   )
r7   r8   r9   __doc__r   r   r   r   r   __classcell__)r   s   @r)   r   r   :  ss         
 IL    
p| p| p|d, , , , , , ,r+   r   shader_typec                    t                               |          }t                               ||            t                               |           t                               |t           j                  t           j        k    rXt                               |                                          }t           	                    |           t          d|           |S )z#Compile a shader and return its ID.zShader compilation failed:
)r-   glCreateShaderglShaderSourceglCompileShaderglGetShaderivGL_COMPILE_STATUSGL_TRUEglGetShaderInfoLogr   glDeleteShaderr   )rB   r   shadererrors       r)   _compile_shaderr     s    {++Fff%%%v	 455CC%%f--4466
&!!!A%AABBBMr+   vertex_sourcefragment_sourcec                    t          | t          j                  }	 t          |t          j                  }n)# t          $ r t                              |            w xY wt                                          }t                              ||           t                              ||           t                              |           t                              |           t                              |           t          	                    |t          j
                  t          j        k    rXt                              |                                          }t                              |           t	          d|           |S )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    sI   #M23FGGM)/2;PQQ   
-(((   ""Gg}---g///Wm$$$o&&&	""344
BB&&w//6688
7###>u>>???Ns	   7 &Afragment_coder5   r6   image_batchesfloatsintsboolscurvesc                 %   ddl }|                                }	|sg S t                      }
|
                                 t	          |           }t          |           }t          |           }|g }|g }d}d}g }g }g }g }g }t          |d                   }	 	 t          t          |          }n,# t          $ r t                              d|             w xY wt                              |           t                              d          }t                              t          j        |           g }t%          |          D ]v}t                              d          }|                    |           t                              t          j        |           t                              t          j        dt          j        ||dt          j        t          j        d	  	         t                              t          j        t          j        t          j                   t                              t          j        t          j        t          j                   t                              t          j        t          j         |z   t          j        |d           |                    t          j         |z              xt          !                    ||           t          "                    t          j                  t          j#        k    rt          d          |dk    rt%          d          D ]}t                              d          }|                    |           t                              t          j        |           t                              t          j        dt          j        ||dt          j        t          j        d	  	         t                              t          j        t          j        t          j                   t                              t          j        t          j        t          j                   t                              t          j        t          j$        t          j%                   t                              t          j        t          j&        t          j%                   t                              d          }|                    |           t                              t          j        |           t                              t          j        t          j         t          j        |d           t          !                    dt          j         g           t          "                    t          j                  t          j#        k    rt          d          t%          |          D ]}t                              d          }|                    |           t          '                    t          j(        |z              t                              t          j        |           t                              t          j        t          j        t          j                   t                              t          j        t          j        t          j                   t                              t          j        t          j$        t          j%                   t                              t          j        t          j&        t          j%                   t          )                    |d|           }|dk    rt          *                    ||           t          )                    |d	          }|dk    r6t          +                    |tY          |          tY          |                     t[          |          D ]D\  }}t          )                    |d
|           }|dk    rt          .                    ||           Et[          |          D ]D\  }}t          )                    |d|           }|dk    rt          *                    ||           Et[          |          D ]H\  }}t          )                    |d|           }|dk    rt          *                    ||rdnd           It[          |          D ]	\  }}t                              d          }|                    |           t^          |z   }t          '                    t          j(        |z              t                              t          j        |           t                              t          j        dt          j0        t          |          ddt          j1        t          j        |	  	         t                              t          j        t          j        t          j                   t                              t          j        t          j        t          j                   t                              t          j        t          j$        t          j%                   t                              t          j        t          j&        t          j%                   t          )                    |d|           }|dk    rt          *                    ||           t          )                    |d          } t          2                    dd||           t          3                    t          j4                   g }!|D ]}"t[          |"          D ]%\  }}#t          '                    t          j(        |z              t                              t          j        ||                    |#j5        \  }$}%}&|&dk    rNtm          j7        |$|%dftl          j8                  }'|#dddddddf         |'ddddddf<   d|'dddddf<   n$tm          j9        |#dddddddf                   }'t                              t          j        dt          j        |%|$dt          j        t          j        |'	  	         '|dk    rt                              t          j        |           | dk    rt          *                    | d           t          :                    dddd           t          ;                    t          j<                   t          =                    t          j>        dd           nt%          |          D ]u}(|(|dz
  k    })| dk    rt          *                    | |(           |)r&t                              t          j        |           n0||(dz           }*t                              t          j        |*           t          '                    t          j(                   |(dk    r,t                              t          j        |d                    n3||(dz
  dz           }+t                              t          j        |+           t          :                    dddd           t          ;                    t          j<                   t          =                    t          j>        dd           wg },|D ]}t                              t          j        |           t          ?                    t          j        dt          j        t          j                  }-tm          j@        |-tl          j8                  A                    ||d          }#|,                    |#dddddddf         B                                           tm          jC        ||dftl          j8                  }.t%          |t                    D ]}|,                    |.           |!                    |,           |                                |	z
  dz  }/t          |          }0|dk    rd| dnd}1t          E                    d|/dd|0 d|0dk    rdnd d| d| |1 d           |!t                              t          j        d           t                              d           |D ])}t          F                    t          |                     *|D ])}t          F                    t          |                     *|D ])}t          F                    t          |                     *|D ])}t          F                    t          |                     *|t          H                    d|g           |D ]}t          H                    d|g           |t          I                    |           S S # t                              t          j        d           t                              d           |D ])}t          F                    t          |                     *|D ])}t          F                    t          |                     *|D ])}t          F                    t          |                     *|D ])}t          F                    t          |                     *|t          H                    d|g           |D ]}t          H                    d|g           |t          I                    |           w w xY w)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:
rL   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_passr`   rA   )dtypeg      ?r   z, z passesrE   zGLSL shader executed in r   r   z batchesx))Jr   r   r   r   rJ   rX   r]   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zerosrU   r   glDeleteTexturesr<   glDeleteFramebuffersr  )2r  r5   r6   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_batchry    sL   : KKK""$$J 	
++C -];;O '}55K $M22J}~ G
CONNN]1%&&JP(	%m_EEGG 	 	 	LL?o??@@@	 	    ""1%%
R.444{## 	= 	=A""1%%C""3'''R-s333OOB,avqRTR\^`^ikopppr/1I2<XXXr/1I2<XXX%%b&79PST9TVXVfhkmnooo 7! ;<<<<
l333&&r'899R=WWW<=== >>1XX P P))!,,"))&111  !16::: 0!R]E6STVXV`bdbmosttt""2#3R5Mr|\\\""2#3R5Mr|\\\""2#3R5I2K^___""2#3R5I2K^___--a00%%f---$$R%6???))"*;R=TVXVfhnpqrrr  R%<$=>>>..r/@AARE___&'NOOO ` z"" 	' 	'A""1%%C!!#&&&r~1222R-s333r/1I2<XXXr/1I2<XXXr/1ErGZ[[[r/1ErGZ[[[))'=Q==AACaxxsA&&& %%g~>>!88NN3eeFmm<<<f%% 	' 	'DAq))'=Q==AACaxxsA&&&dOO 	' 	'DAq))';1;;??CaxxsA&&&e$$ 	3 	3DAq))'<A<<@@CaxxsMAA222  '' 	* 	*FAs""1%%C!!#&&&>Dr~4555R-s333OOB,aSXXq!RYXZXcehiiir/1I2<XXXr/1I2<XXXr/1ErGZ[[[r/1ErGZ[[[))'=Q==AACaxxsD))) **7H==
aE6***
R[!!! # F	4 F	4F#F++ r r3""2>A#5666  !1>!3DEEE )1a66!#1a)2:!F!F!FJ+.tttQQQz?Jqqq!!!RaRx(*-Jqqq!!!Qw''!#!5c$$B$111*o!F!FJ 0!R]Aq!RZY[YdfpqqqqQ$$R%6<<<q==NN8Q///1a+++

21222A6666 z** ; ;A$%a$7L  1}}x333# L,,R->DDDD &4AE%:
,,R->
KKK &&r~666Avv(()9>!;LMMMM &8Q!%D
(()9:FFFOOAq!Q///JJr5666OOBOQ:::: M& = =  !13777''(8!RZUUmD
;;;CCFESTUU$$S2qqq!!!_%9%9%;%;<<<< &%!32:FFFI;44 0 0$$Y////$$]3333$$&&3t;-((0:Q,,,,,B	  Tw  T  T  T  T  T[fjk[k[kSWSWqs  T  Tw|  T  T  @F  T  HQ  T  T  T  	U  	U  	U  	R.222
! 	* 	*CC))))! 	* 	*CC))))" 	* 	*CC))))% 	* 	*CC))))?##Au---$ 	1 	1F##Ax0000w''''  	R.222
! 	* 	*CC))))! 	* 	*CC))))" 	* 	*CC))))% 	* 	*CC))))?##Au---$ 	1 	1F##Ax0000w'''' s$   B/ .AF /)C};AF FEAK,c                   8   e Zd Zedej        fd            Ze	 	 	 	 ddededej	        j
        dej	        j
        dej	        j
        d	ej	        j
        d
ej	        j
        dej        fd            Zedeej                 dej        deeef         fd            ZdS )
GLSLShaderrC   c                 v   t           j                            t           j                            d          ddt
                    }t           j                            t           j                            dd          ddt                    }t           j                            t           j                            d	d          d
dt                    }t           j                            t           j	                            dd          ddt                    }t           j                            t           j                            d          ddt                    }t          j        ddddddt           j                            dt          dd          t           j                            dt           j                            dg           t           j                            dt           j                            dddt$          j                  t           j                            dddt$          j                  g          gd           t           j                            d!|d"t
          dz
   d#$          t           j                            d%|d&t          dz
   d'$          t           j                            d(|d)t          dz
   d'$          t           j                            d*|d+t          dz
   d,$          t           j                            d-|d.t          dz
   d/$          gt           j                            d0d12          t           j                            d3d42          t           j                            d5d62          t           j                            d7d82          g9          S ):NimagerL   )prefixrT   rS   r:          )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tooltipr4   
from_inputcustomr5   i   )r  rT   rS   r6   zXOutput size: 'from_input' uses first input image dimensions, 'custom' allows manual size)optionsr  rj  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Inputr=  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_schemazGLSLShader.define_schema  s   33HNN7##	 4 
 
 33HNN7CN00	 4 
 
 {11FLLL**	 2 
 
 22JVU33	 3 
 
 33HNN7##	 4 
 
 y &#; !$(	%3"d	     %%..|R@@..$ "$+,/()(-(<	 !- !" !" !#$,,/()(-(<	 !- !" !" ( w- &  0 !!(^  N_q{|}q}  N_  N_  N_!  `  `!!(^  NUq}~q  NU  NU  NU!  V  V!!&<  JMiuvwiw  JM  JM  JM!  N  N!!'M  LXpyz{p{  LX  LX  LX!  Y  Y!!(^  NVq{|}q}  NV  NV  NV!  W  WG$L X  @K  L  LX  @K  L  LX  @K  L  LX  @K  L  L	_5
 5
 5
 5	
r+   Nr  r4   rj  r	  r
  r  r  c           
         d |                                 D             }	|rd |                                 D             ng }
|rd |                                 D             ng }|rd |                                 D             ng }|rd |                                 D             ng }|	st          d          |d         dk    r|d	         }|d
         }n|	d         j        dd         \  }}|	d         j        d         }g }t          |          D ]%fd|	D             }|                    |           &t          |||||
|||          }d t          t                    D             |D ]D}t          |          D ]2\  }}|                             t          j	        |                     3Efdt          t                    D             }t          j        |d|                     |	|d                   iS )Nc                     g | ]}||S rN   r=   rO   re  s     r)   
<listcomp>z&GLSLShader.execute.<locals>.<listcomp>k  s    BBBAAMaMMMr+   c                     g | ]}||nd	S )Nr  r=   r  s     r)   r  z&GLSLShader.execute.<locals>.<listcomp>m  s     BBBQ!-QQSBBBr+   c                     g | ]}||nd	S )Nr   r=   r  s     r)   r  z&GLSLShader.execute.<locals>.<listcomp>o  s     EEE!AAAEEEr+   c                     g | ]}||nd	S )NFr=   r  s     r)   r  z&GLSLShader.execute.<locals>.<listcomp>p  s     KKKq!-QQUKKKr+   c                 t    g | ]5}||                                                     t          j                  6S rN   )to_lutastyperD  rF  r  s     r)   r  z&GLSLShader.execute.<locals>.<listcomp>r  s6    ^^^PQP]ahhjj''
33P]P]P]r+   z$At least one input image is requiredr4   r  r5   r6   r   rL   r`   c                     g | ]K}|                                                                                              t          j                  LS r=   )cpunumpyr  rD  rF  )rO   
img_tensor	batch_idxs     r)   r  z&GLSLShader.execute.<locals>.<listcomp>  sG    pppWaJy15577==??FFrzRRpppr+   c                     g | ]}g S r=   r=   )rO   ra  s     r)   r  z&GLSLShader.execute.<locals>.<listcomp>  s    666ar666r+   c                 H    g | ]}t          j        |         d           S )r   )dim)torchstack)rO   r_  all_outputss     r)   r  z&GLSLShader.execute.<locals>.<listcomp>  s,    YYY%+k!n!<<<YYYr+   r   )values
ValueErrorrC  r!  r   ry  rU   r;  r  
from_numpyr   
NodeOutput_build_ui_output)r   r  r4   rj  r	  r
  r  r  kwargs
image_list
float_listint_list	bool_list
curve_luts	out_width
out_height
batch_sizer  batch_imagesri  rt  r_  out_imgoutput_tensorsr  r  s                           @@r)   executezGLSLShader.execute^  sv    CBBBB
FLTBB&--//BBBBRT 	 JNUEEt{{}}EEEESUOT\KKELLNNKKKKZ\	bhp^^V]]__^^^^np
 	ECDDD [!X--!'*I"8,JJ$.qM$7!$<!J	](+
 z** 	/ 	/IppppeopppL  ....0	
 	
 765#5#5666. 	A 	AM'66 A A
7A%%e&6w&?&?@@@@A ZYYYeKFXFXYYY}
##Jq0ABB
 
 	
r+   r  output_batchc           
         g }|D ]H}|                     t          j                            |dt          j        j        dd                     It          j                            |dt          j        j        dd          }||dS )zNBuild UI output with input and output images for client-side shader execution.GLSLShader_inputNrL   )filename_prefixfolder_typer   compress_levelGLSLShader_output)input_imagesrj  )extendr   ImageSaveHelpersave_imagesr   
FolderTypetemp)r   r  r  input_images_uirk  output_images_uis         r)   r  zGLSLShader._build_ui_output  s    
  	 	C""2#5#A#A 2M.  $B $ $     -99/* : 
 
 !0;KLLLr+   )NNNN)r7   r8   r9   classmethodr   r  r  r:   r3   r  Typer  r  listr  Tensordictr  r=   r+   r)   r{  r{     s0       Y
bi Y
 Y
 Y
 [Y
v  $(!%"&#'<
 <
<
 !<
  	<

  <
 k<
 {<
  <
 
<
 <
 <
 [<
| Mel+M;@<M	c4iM M M [M M Mr+   r{  c                   L    e Zd Zedeeej                          fd            ZdS )GLSLExtensionrC   c                    K   t           gS rN   )r{  )r   s    r)   get_node_listzGLSLExtension.get_node_list  s      |r+   N)	r7   r8   r9   r   r  typer   	ComfyNoder  r=   r+   r)   r  r    sE        T$r|*<%=    X  r+   r  c                  "   K   t                      S rN   )r  r=   r+   r)   comfy_entrypointr    s      ??r+   )NN);r   r   rG   loggingctypes.utilr#   importlib.utilr   typingr   r  rD  r  r  comfy_api.latestr   r   r   typing_extensionsr   utils.install_utilr   	getLoggerr7   r   r*   r   r-   r
   r   r1   r3   r=  r  r  r  rU   r  r  r:   rJ   r<   rX   r]   rp   r   r   r   r   r  r  ndarrayr:  r"   ry  r  r{  r  r  r=   r+   r)   <module>r     s   				 



 				                      3 3 3 3 3 3 3 3 3 3 & & & & & & ? ? ? ? ? ?		8	$	$': ': ':V L M M M      

      I    
	
 *3 *3 * * * *	+ 	+ 	+ 	+ 	+ 	+s s    " " "JQ Q Qh  >K, K, K, K, K, K, K, K,\C c c    3      @  $&*O( O(O(O( O( RZ()	O(
 KO( s)O( :O( t#O( 
$rz
O( O( O( O(btM tM tM tM tM tM tM tMn    N         r+   