+
    Kim   c                   s    ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RIH	t	 ^ RI
Ht ^ RIHt ^ RIHt ]P                   ! R4      t. ROt/ tR tR	 tR
 tR t ! R R4      tR# )i    N)DictOptional)system)drivers)LINUX_SYSTEM)logger
vulkaninfoc                 s~    \         P                  ! 4        U u/ uF  q \         P                  ! V 4      bK  	  up # u up i )z8Return the information related to each GPU on the system)r   Zget_gpu_cardsget_gpu_info)cards    =/usr/lib/python3.14/site-packages/lutris/util/graphics/gpu.pyget_gpus_infor
      s3    9@9N9N9PQ9P'&&t,,9PQQQs   :c                s     RVR,           RVR,           RVR,           R2p\         P                  ! V4       R	#   \         d    \         P                  ! RT 4        R	# i ; i)
zLog GPU informationzGPU: PCI_ID PCI_SUBSYS_ID (DRIVERz	 drivers)z'Unable to get GPU information from '%s'N)r   ZinfoZKeyErrorerror)Zgpu_idgpu_infoZ
gpu_strings   && r	   display_gpu_infor       sb    HXh/0(?2K1LBxX`OaNbbkl
J H>GHs   7; "A! A!c                 s
   . pV '       dy   V P                  R 4       Fc  p\        P                  P                  VR4      p\        P                  P	                  V4      '       g   KJ  W!9  g   KR  VP                  V4       Ke  	  V# ):Zvulkan)splitospathjoinZexistsappend)ZpathsZ	icd_pathsr   s   &  r	   add_icd_search_pathr   )   s_    IKK$D77<<h/Dww~~d##(=  & %     c                 s   . p \          F  pV \        V4      ,          p K  	  . pV  FU  p\        P                  P	                  VRR4      p\        \        P                  ! V4      4      pV'       g   KM  W$,          pKW  	  V# )zbReturns available vulkan ICD files in the same search order as vulkan-loader,
but in a single listzicd.dz*.json)VULKAN_DATA_DIRSr   r   r   r   Zsortedglob)Zicd_search_pathsr   Zall_icd_filesZdata_dir	icd_filess        r	   get_vk_icd_filesr   4   ss      /55 !M$ww||Hgx8 499T?+	9&M % r   c                   s   a  ] tR t^Et o R tR tR tV 3R lR ltV 3R lR ltV 3R lR	 lt	V 3R
 lR lt
R tR t]R 4       tRtV tR# )GPUc                s   Wn         V P                  4       V n        V P                  R ,          V n        V P                  R,          P	                  4       V n        V P                  R,          P	                  4       V n        V P                  R,          V n        V P                  4       V n	        \        '       dF    V P                  4       V n        V P                  4       ;'       g    V P                  4       V n        R# V P                  4       V n        R#   \         \"        P$                  \"        P&                  3 d    T P                  4       T n         R# i ; i)r   r   r   PCI_SLOT_NAMEN)r   r   r   driverZlowerpci_idpci_subsys_idpci_slotget_icd_filesr   VULKANINFO_AVAILABLEget_vulkaninfo_device_uuiddevice_uuidget_vulkaninfo_nameget_lspci_namenameZOSError
subprocessZCalledProcessErrorZTimeoutExpired)selfr   s   &&r	   __init__ZGPU.__init__F   s    	))+mmH-mmH-335!]]?;AACo6++-2#'#B#B#D  446OO$:M:M:O	
 ++-DI	 Z::J<U<UV 2 //1	2s   :+D &D ?EEc                s    V P                   '       d7   V P                   R V P                    RV P                   RV P                   R2# V P                   R V P                   R2# )r   r   Z))r"   
short_namer#   r!   r-      &r	   __str__ZGPU.__str__X   s[    ;;;oo&bQt7I7I6J!DKK=XYZZ//""T[[M33r   c                s   / pV P                   R 8X  d   \        P                  ! 4       pV# \        P                  '       d   \        \        P                  R4      '       de   R\        P                  P                  R\        P                  P                  P                  R\        P                  P                  P                  /pV# )ZnvidiaGLX_MESA_query_rendererZvendorversiondevice)
r!   r   Zget_nvidia_driver_infor   ZglxinfoZhasattrZopengl_vendorr3   r4   r5   )r-   Zdriver_infos   & r	   get_driver_infoZGPU.get_driver_info^   s    ;;("!88:K  !!!|++-FGGl22@@|33KKSSl22JJQQ
 r   c                s6   < V ^8  d   QhRS[ S[S[3,          /# i   Zreturnr    strZformat__classdict__   "r	   __annotate__GPU.__annotate__k   s      d38n r   c                sz   RRRRRRRR/p \        RV P                   R2RR	7      ;_uu_ 4       pVP                  4       pR
R
R
4       X F)  pTP                  R^4      w  rVTP                  4       Y&   K+  	  T#   + '       g   i     LA; i  \         d$    \        P
                  ! RT P                  4       h i ; i)zReturn information about a GPUr    r   r   r    z/sys/class/drm/z/device/ueventzutf-8)ZencodingNz-Unable to read driver information for card %sZ=)Zopenr   Z	readlinesZFileNotFoundErrorr   r   r   strip)r-   ZinfosZcard_ueventZcontentlinekeyvalues   &      r	   r   ZGPU.get_gpu_infok   s    2x_b/SUV			{.AGTTXc%//1 U
 DC+JCEJ   UT  	LLH$))T	s(   #B A9 B 9B		B 	B .B:c                sL   < V ^8  d   QhRS[ S[S[ S[S[3,          3,          /# r7   r8   r:   r<   r	   r=   r>   y   s&     " "S$sCx.%8 9 "r   c                s    \        \        P                  4      p\        P                  ! RR.\        P                  RR7      pV'       g:   V P
                  VR&   V P
                  VR&   \        P                  ! RR.VRR7      pV'       d   VP                  R4      M. p/ pR	pV F  pVP                  4       pV'       d   VP                  R
4      '       d   K4  VR8X  d   RpK?  V'       g   KI  VP                  R4      '       d	   Tp/ WG&   Kh  RV9   g   Kq  VP                  R^R7      w  rV	P                  4       VX,          VP                  4       &   K  	  RV9   g   RV9   d   \        P                  ! RV4       / # V# )z$Runs vulkaninfo to find the GPU namez/usr/bin/vulkaninfoz	--summaryN)ZenvZerror_resultZVK_DRIVER_FILESZVK_ICD_FILENAMESr?   
Fz===zDevices:Tr   z= ZmaxsplitzFailed to detect any valid GPUszERROR: [Loader Message]z$Vulkan failed to detect any GPUs: %s)Zdictr   Zenvironr   Zread_process_outputr   r   r@   Z
startswithr   Zwarning)
r-   Zsubprocess_envZvulkaninfo_output_rawZvulkaninfo_outputZresultZdevices_seenrA   Zcurrent_gpurB   rC   s
   &         r	   get_vulkaninfoZGPU.get_vulkaninfoy   sT   bjj) & : :"K0bjjt!
 %04N,-15N-.$*$>$>&4.WY%! BW177=\^%D::<D4??511z!#u%%"&(#!ZZqZ9
38;;={#CIIK0 & -6:SW]:]NNA6JIr   c                0   < V ^8  d   QhRS[ S[,          /# r7   r   r9   r:   r<   r	   r=   r>      s      Xc] r   c                sN   V P                  4       pR pV F  pW,          R,          P                  RR4      : RW,          R,          P                  RR4      : 2pW@P                  8X  g   KX  W,          R,          pV'       d   \        V4      \        V4      8  g   K  TpK  	  V# )NvendorID0xr?   r   deviceIDZ
deviceName)rF   replacer"   len)r-   r   Z	best_name	gpu_indexr"   r+   s   &     r	   r)   ZGPU.get_vulkaninfo_name   s    ((*
	#I%j199$C%j199$CF $!,\: CII$> $I $ r   c                rG   r7   rH   r:   r<   r	   r=   r>      s     	 	HSM 	r   c                s    V P                  4       pV Fw  pW,          R ,          P                  RR4      : RW,          R,          P                  RR4      : 2pW0P                  8X  g   KX  W,          R,          P                  RR4      u # 	  R# )rI   rJ   r?   r   rK   Z
deviceUUIDZ-N)rF   rL   r"   )r-   r   rN   r"   s   &   r	   r'   ZGPU.get_vulkaninfo_device_uuid   s}    ((*
#I%j199$C%j199$CF $!,\:BB3KK $ r   c                s   \         P                  ! R .^R7      P                  R4       Uu. uF  qP                  ^R7      NK  	  ppV Uu. uF'  p\        V4      ^8X  g   K  RV^,          9   g   K%  VNK)  	  ppV UUu. uF  w  rEWEP                  R4      ^,          3NK   	  pppV F)  pRV^ ,           2V P                  8X  g   K   V^,          u # 	  R# u upi u upi u uppi )Zlspci)ZtimeoutrD   rE   z: z0000:zNo GPU)r   Zexecuter   rM   r$   )r-   rA   Zlspci_resultsZpartsr"   Zdevice_descZdevicesr5   s   &       r	   r*   ZGPU.get_lspci_name   s    <BNNG9^_<`<f<fgk<lm<lDQ/<lm,9bM5SZ1_QUY^_`YaQaMbS`aS`<OFF--d3A67S`aFvayk"dmm3ay    nbas   CC"C2C?$C!c                s    V P                   pR RRRRRRRRRR	R/pV P                   V9   d   W P                   ,          p. p\        4        F  pW9   g   K  VP                  V4       K  	  R
P                  V4      # )ZamdgpuZradeonzvc4-drmZbroadcomZv3dz
virtio-pciZlvpZi915ZintelZxer   )r!   r   r   r   )r-   ZloaderZ
loader_mapr   Zicd_files   &    r	   r%   ZGPU.get_icd_files   s    hz:%G'

 ;;*$,F	(*H!  * + xx	""r   c                sF    \         P                  ! RRV P                  4      # )zShorten result to just the friendly name of the GPU
vulkaninfo returns Vendor Friendly Name (Chip Developer Name)
AMD Radeon Pro W6800 (RADV NAVI21) -> AMD Radeon Pro W6800z
\s*\(.*?\)r?   )reZsubr+   r0   r1   r	   r/   ZGPU.short_name   s    
 vvmR33r   )	r   r(   r!   r   r   r+   r"   r$   r#   N)Z__name__Z
__module__Z__qualname__Z__firstlineno__r.   r2   r6   r   rF   r)   r'   r*   r%   Zpropertyr/   Z__static_attributes__Z__classdictcell__)r;   s   @r	   r   r   E   s[     .$4 " "H 	 	#$ 4 4r   r   )z/usr/local/etcz/usr/local/sharez/etcz
/usr/sharez/usr/lib/x86_64-linux-gnu/GLz/usr/lib/i386-linux-gnu/GLz/opt/amdgpu-pro/etc)r   r   rO   Zshutilr,   Ztypingr    r   Zlutris.utilr   Zlutris.util.graphicsr   Zlutris.util.linuxr   Zlutris.util.logr   Zwhichr&   r   ZGPUSr
   r   r   r   r   ) r   r	   <module>rP      sc     	 	   !  ( * "||L1   
R
H"Q4 Q4r   