xref: /aosp_15_r20/external/OpenCL-ICD-Loader/loader/cllayerinfo.c (revision 1cddb830dba8aa7c1cc1039338e56b3b9fa24952)
1*1cddb830SAndroid Build Coastguard Worker /*
2*1cddb830SAndroid Build Coastguard Worker  * Copyright (c) 2022 The Khronos Group Inc.
3*1cddb830SAndroid Build Coastguard Worker  *
4*1cddb830SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*1cddb830SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*1cddb830SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*1cddb830SAndroid Build Coastguard Worker  *
8*1cddb830SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*1cddb830SAndroid Build Coastguard Worker  *
10*1cddb830SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*1cddb830SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*1cddb830SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*1cddb830SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*1cddb830SAndroid Build Coastguard Worker  * limitations under the License.
15*1cddb830SAndroid Build Coastguard Worker  *
16*1cddb830SAndroid Build Coastguard Worker  * OpenCL is a trademark of Apple Inc. used under license by Khronos.
17*1cddb830SAndroid Build Coastguard Worker  */
18*1cddb830SAndroid Build Coastguard Worker 
19*1cddb830SAndroid Build Coastguard Worker #include "icd.h"
20*1cddb830SAndroid Build Coastguard Worker #include <stdio.h>
21*1cddb830SAndroid Build Coastguard Worker #include <stdlib.h>
22*1cddb830SAndroid Build Coastguard Worker #include <CL/cl_layer.h>
23*1cddb830SAndroid Build Coastguard Worker #if defined(_WIN32)
24*1cddb830SAndroid Build Coastguard Worker #include <io.h>
25*1cddb830SAndroid Build Coastguard Worker #include <share.h>
26*1cddb830SAndroid Build Coastguard Worker #include <sys/stat.h>
27*1cddb830SAndroid Build Coastguard Worker #else
28*1cddb830SAndroid Build Coastguard Worker #include <unistd.h>
29*1cddb830SAndroid Build Coastguard Worker #endif
30*1cddb830SAndroid Build Coastguard Worker #include <fcntl.h>
31*1cddb830SAndroid Build Coastguard Worker 
32*1cddb830SAndroid Build Coastguard Worker int stdout_bak, stderr_bak;
33*1cddb830SAndroid Build Coastguard Worker 
34*1cddb830SAndroid Build Coastguard Worker // Temporarily deactivate stdout:
35*1cddb830SAndroid Build Coastguard Worker // https://stackoverflow.com/a/4832902
36*1cddb830SAndroid Build Coastguard Worker 
37*1cddb830SAndroid Build Coastguard Worker #if defined(_WIN32)
38*1cddb830SAndroid Build Coastguard Worker #define SECURE 1
39*1cddb830SAndroid Build Coastguard Worker #define OPEN _open
40*1cddb830SAndroid Build Coastguard Worker #define OPEN_FLAGS _O_WRONLY
41*1cddb830SAndroid Build Coastguard Worker #define CLOSE _close
42*1cddb830SAndroid Build Coastguard Worker #define DUP _dup
43*1cddb830SAndroid Build Coastguard Worker #define DUP2 _dup2
44*1cddb830SAndroid Build Coastguard Worker #define NULL_STREAM "nul"
45*1cddb830SAndroid Build Coastguard Worker #else
46*1cddb830SAndroid Build Coastguard Worker #define OPEN open
47*1cddb830SAndroid Build Coastguard Worker #define OPEN_FLAGS O_WRONLY
48*1cddb830SAndroid Build Coastguard Worker #define CLOSE close
49*1cddb830SAndroid Build Coastguard Worker #define DUP dup
50*1cddb830SAndroid Build Coastguard Worker #define DUP2 dup2
51*1cddb830SAndroid Build Coastguard Worker #define NULL_STREAM "/dev/null"
52*1cddb830SAndroid Build Coastguard Worker #endif
53*1cddb830SAndroid Build Coastguard Worker 
54*1cddb830SAndroid Build Coastguard Worker static inline int
silence_stream(FILE * file,int fd)55*1cddb830SAndroid Build Coastguard Worker silence_stream(FILE *file, int fd)
56*1cddb830SAndroid Build Coastguard Worker {
57*1cddb830SAndroid Build Coastguard Worker     int new_fd, fd_bak;
58*1cddb830SAndroid Build Coastguard Worker     fflush(file);
59*1cddb830SAndroid Build Coastguard Worker     fd_bak = DUP(fd);
60*1cddb830SAndroid Build Coastguard Worker #if defined(_WIN32) && SECURE
61*1cddb830SAndroid Build Coastguard Worker     _sopen_s(&new_fd, NULL_STREAM, OPEN_FLAGS, _SH_DENYNO, _S_IWRITE);
62*1cddb830SAndroid Build Coastguard Worker #else
63*1cddb830SAndroid Build Coastguard Worker     new_fd = OPEN(NULL_STREAM, OPEN_FLAGS);
64*1cddb830SAndroid Build Coastguard Worker #endif
65*1cddb830SAndroid Build Coastguard Worker     DUP2(new_fd, fd);
66*1cddb830SAndroid Build Coastguard Worker     CLOSE(new_fd);
67*1cddb830SAndroid Build Coastguard Worker     return fd_bak;
68*1cddb830SAndroid Build Coastguard Worker }
69*1cddb830SAndroid Build Coastguard Worker 
silence_layers(void)70*1cddb830SAndroid Build Coastguard Worker static void silence_layers(void)
71*1cddb830SAndroid Build Coastguard Worker {
72*1cddb830SAndroid Build Coastguard Worker     stdout_bak = silence_stream(stdout, 1);
73*1cddb830SAndroid Build Coastguard Worker     stderr_bak = silence_stream(stderr, 2);
74*1cddb830SAndroid Build Coastguard Worker }
75*1cddb830SAndroid Build Coastguard Worker 
76*1cddb830SAndroid Build Coastguard Worker static inline void
restore_stream(FILE * file,int fd,int fd_bak)77*1cddb830SAndroid Build Coastguard Worker restore_stream(FILE *file, int fd, int fd_bak)
78*1cddb830SAndroid Build Coastguard Worker {
79*1cddb830SAndroid Build Coastguard Worker     fflush(file);
80*1cddb830SAndroid Build Coastguard Worker     DUP2(fd_bak, fd);
81*1cddb830SAndroid Build Coastguard Worker     CLOSE(fd_bak);
82*1cddb830SAndroid Build Coastguard Worker }
83*1cddb830SAndroid Build Coastguard Worker 
restore_outputs(void)84*1cddb830SAndroid Build Coastguard Worker static void restore_outputs(void)
85*1cddb830SAndroid Build Coastguard Worker {
86*1cddb830SAndroid Build Coastguard Worker     restore_stream(stdout, 1, stdout_bak);
87*1cddb830SAndroid Build Coastguard Worker     restore_stream(stderr, 2, stderr_bak);
88*1cddb830SAndroid Build Coastguard Worker }
89*1cddb830SAndroid Build Coastguard Worker 
printLayerInfo(const struct KHRLayer * layer)90*1cddb830SAndroid Build Coastguard Worker void printLayerInfo(const struct KHRLayer *layer)
91*1cddb830SAndroid Build Coastguard Worker {
92*1cddb830SAndroid Build Coastguard Worker     cl_layer_api_version api_version = 0;
93*1cddb830SAndroid Build Coastguard Worker     pfn_clGetLayerInfo p_clGetLayerInfo = (pfn_clGetLayerInfo)(size_t)layer->p_clGetLayerInfo;
94*1cddb830SAndroid Build Coastguard Worker     cl_int result = CL_SUCCESS;
95*1cddb830SAndroid Build Coastguard Worker     size_t sz;
96*1cddb830SAndroid Build Coastguard Worker 
97*1cddb830SAndroid Build Coastguard Worker     printf("%s:\n", layer->libraryName);
98*1cddb830SAndroid Build Coastguard Worker     result = p_clGetLayerInfo(CL_LAYER_API_VERSION, sizeof(api_version), &api_version, NULL);
99*1cddb830SAndroid Build Coastguard Worker     if (CL_SUCCESS == result)
100*1cddb830SAndroid Build Coastguard Worker         printf("\tCL_LAYER_API_VERSION: %d\n", (int)api_version);
101*1cddb830SAndroid Build Coastguard Worker 
102*1cddb830SAndroid Build Coastguard Worker     result = p_clGetLayerInfo(CL_LAYER_NAME, 0, NULL, &sz);
103*1cddb830SAndroid Build Coastguard Worker     if (CL_SUCCESS == result)
104*1cddb830SAndroid Build Coastguard Worker     {
105*1cddb830SAndroid Build Coastguard Worker         char *name = (char *)malloc(sz);
106*1cddb830SAndroid Build Coastguard Worker         if (name)
107*1cddb830SAndroid Build Coastguard Worker         {
108*1cddb830SAndroid Build Coastguard Worker             result = p_clGetLayerInfo(CL_LAYER_NAME, sz, name, NULL);
109*1cddb830SAndroid Build Coastguard Worker             if (CL_SUCCESS == result)
110*1cddb830SAndroid Build Coastguard Worker                  printf("\tCL_LAYER_NAME: %s\n", name);
111*1cddb830SAndroid Build Coastguard Worker             free(name);
112*1cddb830SAndroid Build Coastguard Worker         }
113*1cddb830SAndroid Build Coastguard Worker     }
114*1cddb830SAndroid Build Coastguard Worker }
115*1cddb830SAndroid Build Coastguard Worker 
main(int argc,char * argv[])116*1cddb830SAndroid Build Coastguard Worker int main (int argc, char *argv[])
117*1cddb830SAndroid Build Coastguard Worker {
118*1cddb830SAndroid Build Coastguard Worker     (void)argc;
119*1cddb830SAndroid Build Coastguard Worker     (void)argv;
120*1cddb830SAndroid Build Coastguard Worker     silence_layers();
121*1cddb830SAndroid Build Coastguard Worker     atexit(restore_outputs);
122*1cddb830SAndroid Build Coastguard Worker     khrIcdInitialize();
123*1cddb830SAndroid Build Coastguard Worker     restore_outputs();
124*1cddb830SAndroid Build Coastguard Worker     atexit(silence_layers);
125*1cddb830SAndroid Build Coastguard Worker     const struct KHRLayer *layer = khrFirstLayer;
126*1cddb830SAndroid Build Coastguard Worker     while (layer)
127*1cddb830SAndroid Build Coastguard Worker     {
128*1cddb830SAndroid Build Coastguard Worker         printLayerInfo(layer);
129*1cddb830SAndroid Build Coastguard Worker         layer = layer->next;
130*1cddb830SAndroid Build Coastguard Worker     }
131*1cddb830SAndroid Build Coastguard Worker     return 0;
132*1cddb830SAndroid Build Coastguard Worker }
133