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