local utils = require("utils") local core = require("components.core") local gpu = {} -- conky built-in lcc.tpl.nvidia_conky = [[ ${font}${nvidia modelname 0} ${alignr} ${nvidia gpuutil 0}% ${color3}${nvidiagraph gpuutil 0}${color} ${color2}${lua font h2 FAN}${goto $sr{148}}${lua font h2 TEMP}${font}${color}${alignr}${offset $sr{-138}}${nvidia fanlevel 0}% ${voffset $sr{-13}}${alignr}${nvidia gputemp 0}℃ ${color3}${nvidiabar {%= lcc.half_bar_size %} fanlevel 0}${color} ${alignr}${nvidiabar {%= lcc.half_bar_size %} gputemp 0} ${color2}${lua font h2 MEM}${font}${color} ${alignc $sr{-16}}${nvidia memused 0} MB / ${nvidia memmax 0} MB ${alignr}${nvidia membwutil 0}% ${color2}${lua font h2 UT} ${color3}${nvidiabar memutil 0}${color}]] local function _nvidia_conky() return lcc.tpl.nvidia_conky() end -- more powerful, requires pynvml lcc.tpl.nvidia_nvml = [[ {% for i, g in ipairs(gpu_info) do %}{% if i>1 then %}${voffset $sr{8}} {% end %} ${font}${color}{%= g.gpu_util %}%${alignc $sr{-16}}{% if #gpu_info>1 then %}{%= i %}: {% end %}{%= g.model_name %}${alignr}{%= g.gpu_temp %}℃ ${color3}${lua_graph "echo {%= g.gpu_util %}" {%= lcc.half_graph_size %}} ${alignr}${lua_graph "echo {%= g.gpu_temp %}" {%= lcc.half_graph_size %} {%= g.gpu_temp_thres %}}${color} ${color2}${lua font h2 FAN}${goto $sr{148}}${lua font h2 POWER}${font}${color}${alignr}${offset $sr{-138}}{%= g.fan_speed %}% ${voffset $sr{-13}}${alignr}${lua format %.1f {%= g.power_usage %}}W ${color3}${lua_bar {%= lcc.half_bar_size %} echo {%= g.fan_speed %}} ${color}${alignr}${lua_bar {%= lcc.half_bar_size %} ratio_perc {%= g.power_usage %} {%= g.power_limit %}} ${color2}${lua font h2 MEM}${font}${color} ${alignc $sr{-16}}{%= g.mem_used_h %} / {%= g.mem_total_h %} ${alignr}{%= g.mem_util %}% ${color2}${lua font h2 UT} ${color3}${lua_bar ratio_perc {%= g.mem_used %} {%= g.mem_total %}}${color} {% if g.processes then %} ${color2}${lua font h2 {PROCESS ${goto $sr{156}}PID ${goto $sr{194}}MEM%${alignr}GPU%}}${font}${color}# {% for _, p in ipairs(g.processes) do +%} {%= p.name %} ${goto $sr{156}}{%= p.pid %}${alignr}${offset $sr{-44}}${lua ratio_perc {%= p.gpu_mem %} {%= g.mem_total %} 2} ${voffset $sr{-13}}${alignr}${lua format %.1f {%= p.gpu_util %}}{% end %}{% end %} {% end %}]] local function _nvidia_nvml(top_n) local out, rc = utils.sys_call(lcc.root_dir .. "/lib/components/gpu_nvml 2>/dev/null", true) if rc > 0 or not out then return end local ok, gpu_info = pcall(utils.loadstring("return " .. out)) if not ok then return end for _, g in ipairs(gpu_info) do g.mem_used_h = utils.filesize(g.mem_used) g.mem_total_h = utils.filesize(g.mem_total) if top_n > 0 then local p = g.processes while #p > top_n do table.remove(p) end end end return utils.trim(lcc.tpl.nvidia_nvml { gpu_info = gpu_info }) end local _lz = utils.table.lazy { -- check if conky was built with nvidia support built_with_nvidia = function() return (conky_parse("${nvidia modelname}") ~= "${nvidia}") end } function conky_nvidia(interv, top_n) local rendered = core._interval_call( interv, _nvidia_nvml, tonumber(top_n or 0) ) if rendered then return rendered end if _lz.built_with_nvidia then return core._interval_call(interv, _nvidia_conky) end return conky_parse(core.message("error+", "\nFailed to load Nvidia, two options to enable:\n" .. "1. Python + pynvml (recommended)\n" .. "2. Conky built with nvidia support" )) end lcc.tpl.nvidia = [[${lua nvidia {%= interv %} {%= top_n %}}]] function gpu.nvidia(args) local interv = utils.table.get(args, 'interv', 4) local top_n = utils.table.get(args, 'top_n', 5) return core.section("GPU", "") .. "\n" .. lcc.tpl.nvidia { interv = interv, top_n = top_n } end return gpu