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};