master ohmu/fastfetch-openbsd / src / modules / opencl / opencl.c
ohmu  ·  2026-10-15
  1#include "common/printing.h"
  2#include "common/jsonconfig.h"
  3#include "common/strutil.h"
  4#include "detection/opencl/opencl.h"
  5#include "detection/gpu/gpu.h"
  6#include "modules/opencl/opencl.h"
  7
  8bool ffPrintOpenCL(FFOpenCLOptions* options) {
  9    FFOpenCLResult* result = ffDetectOpenCL();
 10
 11    if (result->error != nullptr) {
 12        ffPrintError(FF_MODULE_GET_DISPLAY_NAME(OpenCL), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", result->error);
 13        return false;
 14    }
 15
 16    if (options->moduleArgs.outputFormat.length == 0) {
 17        ffPrintLogoAndKey(FF_MODULE_GET_DISPLAY_NAME(OpenCL), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
 18        ffStrbufPutTo(&result->version, stdout);
 19    } else {
 20        FF_PRINT_FORMAT_CHECKED(FF_MODULE_GET_DISPLAY_NAME(OpenCL), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, ((FFformatarg[]) {
 21                                                                                                           FF_ARG(result->version, "version"),
 22                                                                                                           FF_ARG(result->name, "name"),
 23                                                                                                           FF_ARG(result->vendor, "vendor"),
 24                                                                                                       }));
 25    }
 26
 27    return true;
 28}
 29
 30void ffParseOpenCLJsonObject(FFOpenCLOptions* options, yyjson_val* module) {
 31    yyjson_val *key, *val;
 32    size_t idx, max;
 33    yyjson_obj_foreach (module, idx, max, key, val) {
 34        if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) {
 35            continue;
 36        }
 37
 38        ffPrintError(FF_MODULE_GET_DISPLAY_NAME(OpenCL), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key));
 39    }
 40}
 41
 42[[gnu::cold]]
 43void ffGenerateOpenCLJsonConfig(FFOpenCLOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
 44    ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs);
 45}
 46
 47bool ffGenerateOpenCLJsonResult([[maybe_unused]] FFOpenCLOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
 48    FFOpenCLResult* result = ffDetectOpenCL();
 49
 50    if (result->error != nullptr) {
 51        yyjson_mut_obj_add_str(doc, module, "error", result->error);
 52        return false;
 53    }
 54
 55    yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result");
 56    yyjson_mut_obj_add_strbuf(doc, obj, "version", &result->version);
 57    yyjson_mut_obj_add_strbuf(doc, obj, "name", &result->name);
 58    yyjson_mut_obj_add_strbuf(doc, obj, "vendor", &result->vendor);
 59
 60    yyjson_mut_val* gpus = yyjson_mut_obj_add_arr(doc, obj, "gpus");
 61    FF_LIST_FOR_EACH (FFGPUResult, gpu, result->gpus) {
 62        yyjson_mut_val* gpuObj = yyjson_mut_arr_add_obj(doc, gpus);
 63        yyjson_mut_obj_add_str(doc, gpuObj, "type", gpu->type == FF_GPU_TYPE_UNKNOWN ? "Unknown" : gpu->type == FF_GPU_TYPE_INTEGRATED ? "Integrated"
 64                                                                                                                                       : "Discrete");
 65        yyjson_mut_obj_add_strbuf(doc, gpuObj, "vendor", &gpu->vendor);
 66        yyjson_mut_obj_add_strbuf(doc, gpuObj, "name", &gpu->name);
 67        yyjson_mut_obj_add_strbuf(doc, gpuObj, "driver", &gpu->driver);
 68        yyjson_mut_obj_add_strbuf(doc, gpuObj, "platformApi", &gpu->platformApi);
 69        if (gpu->coreCount != FF_GPU_CORE_COUNT_UNSET) {
 70            yyjson_mut_obj_add_int(doc, gpuObj, "coreCount", gpu->coreCount);
 71        } else {
 72            yyjson_mut_obj_add_null(doc, gpuObj, "coreCount");
 73        }
 74
 75        yyjson_mut_obj_add_uint(doc, gpuObj, "frequency", gpu->frequency);
 76
 77        yyjson_mut_val* memoryObj = yyjson_mut_obj_add_obj(doc, gpuObj, "memory");
 78
 79        {
 80            yyjson_mut_val* dedicatedMemory = yyjson_mut_obj_add_obj(doc, memoryObj, "dedicated");
 81            if (gpu->dedicated.total != FF_GPU_VMEM_SIZE_UNSET) {
 82                yyjson_mut_obj_add_uint(doc, dedicatedMemory, "total", gpu->dedicated.total);
 83            } else {
 84                yyjson_mut_obj_add_null(doc, dedicatedMemory, "total");
 85            }
 86
 87            if (gpu->dedicated.used != FF_GPU_VMEM_SIZE_UNSET) {
 88                yyjson_mut_obj_add_uint(doc, dedicatedMemory, "used", gpu->dedicated.used);
 89            } else {
 90                yyjson_mut_obj_add_null(doc, dedicatedMemory, "used");
 91            }
 92        }
 93
 94        {
 95            yyjson_mut_val* sharedMemory = yyjson_mut_obj_add_obj(doc, memoryObj, "shared");
 96            if (gpu->shared.total != FF_GPU_VMEM_SIZE_UNSET) {
 97                yyjson_mut_obj_add_uint(doc, sharedMemory, "total", gpu->shared.total);
 98            } else {
 99                yyjson_mut_obj_add_null(doc, sharedMemory, "total");
100            }
101
102            if (gpu->shared.used != FF_GPU_VMEM_SIZE_UNSET) {
103                yyjson_mut_obj_add_uint(doc, sharedMemory, "used", gpu->shared.used);
104            } else {
105                yyjson_mut_obj_add_null(doc, sharedMemory, "used");
106            }
107        }
108
109        yyjson_mut_obj_add_uint(doc, gpuObj, "deviceId", gpu->deviceId);
110    }
111
112    return true;
113}
114
115void ffInitOpenCLOptions(FFOpenCLOptions* options) {
116    ffOptionInitModuleArg(&options->moduleArgs, "");
117}
118
119void ffDestroyOpenCLOptions(FFOpenCLOptions* options) {
120    ffOptionDestroyModuleArg(&options->moduleArgs);
121}
122
123FFModuleBaseInfo ffOpenCLModuleInfo = {
124    .name = "OpenCL",
125    .description = "Print the highest OpenCL version supported by the GPU",
126    .displayName = {
127        .en = "OpenCL",
128        .ar = "OpenCL",
129        .cs = "OpenCL",
130        .de = "OpenCL",
131        .es = "OpenCL",
132        .fi = "OpenCL",
133        .fr = "OpenCL",
134        .gl = "OpenCL",
135        .he = "OpenCL",
136        .id = "OpenCL",
137        .it = "OpenCL",
138        .ja = "OpenCL",
139        .ko = "OpenCL",
140        .pl = "OpenCL",
141        .pt = "OpenCL",
142        .ru = "OpenCL",
143        .tr = "OpenCL",
144        .uk = "OpenCL",
145        .vi = "OpenCL",
146        .zh_CN = "OpenCL",
147        .zh_TW = "OpenCL",
148    },
149    .initOptions = (void*) ffInitOpenCLOptions,
150    .destroyOptions = (void*) ffDestroyOpenCLOptions,
151    .parseJsonObject = (void*) ffParseOpenCLJsonObject,
152    .printModule = (void*) ffPrintOpenCL,
153    .generateJsonResult = (void*) ffGenerateOpenCLJsonResult,
154    .generateJsonConfig = (void*) ffGenerateOpenCLJsonConfig,
155    .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) {
156        { "Platform version", "version" },
157        { "Platform name", "name" },
158        { "Platform vendor", "vendor" },
159    })),
160    .defaultOrder = 57,
161};