xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/gl/main.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi //    http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #include "harness/compat.h"
17*6467f958SSadaf Ebrahimi 
18*6467f958SSadaf Ebrahimi #include <stdio.h>
19*6467f958SSadaf Ebrahimi #include <string.h>
20*6467f958SSadaf Ebrahimi 
21*6467f958SSadaf Ebrahimi #if !defined(__APPLE__)
22*6467f958SSadaf Ebrahimi #include <CL/cl.h>
23*6467f958SSadaf Ebrahimi #endif
24*6467f958SSadaf Ebrahimi 
25*6467f958SSadaf Ebrahimi #include "procs.h"
26*6467f958SSadaf Ebrahimi #include "gl/setup.h"
27*6467f958SSadaf Ebrahimi #include "harness/testHarness.h"
28*6467f958SSadaf Ebrahimi #include "harness/parseParameters.h"
29*6467f958SSadaf Ebrahimi 
30*6467f958SSadaf Ebrahimi #if !defined(_WIN32)
31*6467f958SSadaf Ebrahimi #include <unistd.h>
32*6467f958SSadaf Ebrahimi #endif
33*6467f958SSadaf Ebrahimi 
34*6467f958SSadaf Ebrahimi static cl_context sCurrentContext = NULL;
35*6467f958SSadaf Ebrahimi 
36*6467f958SSadaf Ebrahimi 
37*6467f958SSadaf Ebrahimi #define TEST_FN_REDIRECT(fn) ADD_TEST(redirect_##fn)
38*6467f958SSadaf Ebrahimi #define TEST_FN_REDIRECTOR(fn)                                                 \
39*6467f958SSadaf Ebrahimi     int test_redirect_##fn(cl_device_id device, cl_context context,            \
40*6467f958SSadaf Ebrahimi                            cl_command_queue queue, int numElements)            \
41*6467f958SSadaf Ebrahimi     {                                                                          \
42*6467f958SSadaf Ebrahimi         int error;                                                             \
43*6467f958SSadaf Ebrahimi         clCommandQueueWrapper realQueue = clCreateCommandQueueWithProperties(  \
44*6467f958SSadaf Ebrahimi             sCurrentContext, device, 0, &error);                               \
45*6467f958SSadaf Ebrahimi         test_error(error, "Unable to create command queue");                   \
46*6467f958SSadaf Ebrahimi         return test_##fn(device, sCurrentContext, realQueue, numElements);     \
47*6467f958SSadaf Ebrahimi     }
48*6467f958SSadaf Ebrahimi 
49*6467f958SSadaf Ebrahimi // buffers:
50*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(buffers)
51*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(buffers_getinfo)
52*6467f958SSadaf Ebrahimi 
53*6467f958SSadaf Ebrahimi // 1D images:
54*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_read_1D)
55*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_write_1D)
56*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_1D_getinfo)
57*6467f958SSadaf Ebrahimi 
58*6467f958SSadaf Ebrahimi // 1D image arrays:
59*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_read_1Darray)
60*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_write_1Darray)
61*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_1Darray_getinfo)
62*6467f958SSadaf Ebrahimi 
63*6467f958SSadaf Ebrahimi // 2D images:
64*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_read_2D)
65*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_read_cube)
66*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_write)
67*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_write_cube)
68*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_2D_getinfo)
69*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_cube_getinfo)
70*6467f958SSadaf Ebrahimi 
71*6467f958SSadaf Ebrahimi // 2D image arrays:
72*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_read_2Darray)
73*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_write_2Darray)
74*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_2Darray_getinfo)
75*6467f958SSadaf Ebrahimi 
76*6467f958SSadaf Ebrahimi // 3D images:
77*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_read_3D)
78*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_write_3D)
79*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_3D_getinfo)
80*6467f958SSadaf Ebrahimi 
81*6467f958SSadaf Ebrahimi #ifdef GL_VERSION_3_2
82*6467f958SSadaf Ebrahimi 
83*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_read_texturebuffer)
84*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_write_texturebuffer)
85*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_texturebuffer_getinfo)
86*6467f958SSadaf Ebrahimi 
87*6467f958SSadaf Ebrahimi // depth textures
88*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_read_2D_depth)
89*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_write_2D_depth)
90*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_read_2Darray_depth)
91*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_write_2Darray_depth)
92*6467f958SSadaf Ebrahimi 
93*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_read_2D_multisample)
94*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(images_read_2Darray_multisample)
95*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(image_methods_depth)
96*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(image_methods_multisample)
97*6467f958SSadaf Ebrahimi #endif
98*6467f958SSadaf Ebrahimi 
99*6467f958SSadaf Ebrahimi // Renderbuffer-backed images:
100*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(renderbuffer_read)
101*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(renderbuffer_write)
102*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(renderbuffer_getinfo)
103*6467f958SSadaf Ebrahimi 
104*6467f958SSadaf Ebrahimi TEST_FN_REDIRECTOR(fence_sync)
105*6467f958SSadaf Ebrahimi 
106*6467f958SSadaf Ebrahimi test_definition test_list[] = { TEST_FN_REDIRECT(buffers),
107*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(buffers_getinfo),
108*6467f958SSadaf Ebrahimi 
109*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_read_1D),
110*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_write_1D),
111*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_1D_getinfo),
112*6467f958SSadaf Ebrahimi 
113*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_read_1Darray),
114*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_write_1Darray),
115*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_1Darray_getinfo),
116*6467f958SSadaf Ebrahimi 
117*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_read_2D),
118*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_write),
119*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_2D_getinfo),
120*6467f958SSadaf Ebrahimi 
121*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_read_cube),
122*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_write_cube),
123*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_cube_getinfo),
124*6467f958SSadaf Ebrahimi 
125*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_read_2Darray),
126*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_write_2Darray),
127*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_2Darray_getinfo),
128*6467f958SSadaf Ebrahimi 
129*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_read_3D),
130*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_write_3D),
131*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(images_3D_getinfo),
132*6467f958SSadaf Ebrahimi 
133*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(renderbuffer_read),
134*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(renderbuffer_write),
135*6467f958SSadaf Ebrahimi                                 TEST_FN_REDIRECT(renderbuffer_getinfo) };
136*6467f958SSadaf Ebrahimi 
137*6467f958SSadaf Ebrahimi test_definition test_list32[] = {
138*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(images_read_texturebuffer),
139*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(images_write_texturebuffer),
140*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(images_texturebuffer_getinfo),
141*6467f958SSadaf Ebrahimi 
142*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(fence_sync),
143*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(images_read_2D_depth),
144*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(images_write_2D_depth),
145*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(images_read_2Darray_depth),
146*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(images_write_2Darray_depth),
147*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(images_read_2D_multisample),
148*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(images_read_2Darray_multisample),
149*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(image_methods_depth),
150*6467f958SSadaf Ebrahimi     TEST_FN_REDIRECT(image_methods_multisample)
151*6467f958SSadaf Ebrahimi };
152*6467f958SSadaf Ebrahimi 
153*6467f958SSadaf Ebrahimi const int test_num = ARRAY_SIZE(test_list);
154*6467f958SSadaf Ebrahimi const int test_num32 = ARRAY_SIZE(test_list32);
155*6467f958SSadaf Ebrahimi 
main(int argc,const char * argv[])156*6467f958SSadaf Ebrahimi int main(int argc, const char *argv[])
157*6467f958SSadaf Ebrahimi {
158*6467f958SSadaf Ebrahimi     gTestRounding = true;
159*6467f958SSadaf Ebrahimi     int error = 0;
160*6467f958SSadaf Ebrahimi     int numErrors = 0;
161*6467f958SSadaf Ebrahimi 
162*6467f958SSadaf Ebrahimi     test_start();
163*6467f958SSadaf Ebrahimi     argc = parseCustomParam(argc, argv);
164*6467f958SSadaf Ebrahimi     if (argc == -1)
165*6467f958SSadaf Ebrahimi     {
166*6467f958SSadaf Ebrahimi         return -1;
167*6467f958SSadaf Ebrahimi     }
168*6467f958SSadaf Ebrahimi 
169*6467f958SSadaf Ebrahimi     cl_device_type requestedDeviceType = CL_DEVICE_TYPE_DEFAULT;
170*6467f958SSadaf Ebrahimi 
171*6467f958SSadaf Ebrahimi     /* Do we have a CPU/GPU specification? */
172*6467f958SSadaf Ebrahimi     if (argc > 1)
173*6467f958SSadaf Ebrahimi     {
174*6467f958SSadaf Ebrahimi         if (strcmp(argv[argc - 1], "gpu") == 0
175*6467f958SSadaf Ebrahimi             || strcmp(argv[argc - 1], "CL_DEVICE_TYPE_GPU") == 0)
176*6467f958SSadaf Ebrahimi         {
177*6467f958SSadaf Ebrahimi             requestedDeviceType = CL_DEVICE_TYPE_GPU;
178*6467f958SSadaf Ebrahimi             argc--;
179*6467f958SSadaf Ebrahimi         }
180*6467f958SSadaf Ebrahimi         else if (strcmp(argv[argc - 1], "cpu") == 0
181*6467f958SSadaf Ebrahimi                  || strcmp(argv[argc - 1], "CL_DEVICE_TYPE_CPU") == 0)
182*6467f958SSadaf Ebrahimi         {
183*6467f958SSadaf Ebrahimi             requestedDeviceType = CL_DEVICE_TYPE_CPU;
184*6467f958SSadaf Ebrahimi             argc--;
185*6467f958SSadaf Ebrahimi         }
186*6467f958SSadaf Ebrahimi         else if (strcmp(argv[argc - 1], "accelerator") == 0
187*6467f958SSadaf Ebrahimi                  || strcmp(argv[argc - 1], "CL_DEVICE_TYPE_ACCELERATOR") == 0)
188*6467f958SSadaf Ebrahimi         {
189*6467f958SSadaf Ebrahimi             requestedDeviceType = CL_DEVICE_TYPE_ACCELERATOR;
190*6467f958SSadaf Ebrahimi             argc--;
191*6467f958SSadaf Ebrahimi         }
192*6467f958SSadaf Ebrahimi         else if (strcmp(argv[argc - 1], "CL_DEVICE_TYPE_DEFAULT") == 0)
193*6467f958SSadaf Ebrahimi         {
194*6467f958SSadaf Ebrahimi             requestedDeviceType = CL_DEVICE_TYPE_DEFAULT;
195*6467f958SSadaf Ebrahimi             argc--;
196*6467f958SSadaf Ebrahimi         }
197*6467f958SSadaf Ebrahimi     }
198*6467f958SSadaf Ebrahimi 
199*6467f958SSadaf Ebrahimi     if (argc > 1 && strcmp(argv[1], "-list") == 0)
200*6467f958SSadaf Ebrahimi     {
201*6467f958SSadaf Ebrahimi         log_info("Available 2.x tests:\n");
202*6467f958SSadaf Ebrahimi         for (int i = 0; i < test_num; i++)
203*6467f958SSadaf Ebrahimi             log_info("\t%s\n", test_list[i].name);
204*6467f958SSadaf Ebrahimi 
205*6467f958SSadaf Ebrahimi         log_info("Available 3.2 tests:\n");
206*6467f958SSadaf Ebrahimi         for (int i = 0; i < test_num32; i++)
207*6467f958SSadaf Ebrahimi             log_info("\t%s\n", test_list32[i].name);
208*6467f958SSadaf Ebrahimi 
209*6467f958SSadaf Ebrahimi         log_info("Note: Any 3.2 test names must follow 2.1 test names on the "
210*6467f958SSadaf Ebrahimi                  "command line.\n");
211*6467f958SSadaf Ebrahimi         log_info("Use environment variables to specify desired device.\n");
212*6467f958SSadaf Ebrahimi 
213*6467f958SSadaf Ebrahimi         return 0;
214*6467f958SSadaf Ebrahimi     }
215*6467f958SSadaf Ebrahimi 
216*6467f958SSadaf Ebrahimi     // Check to see if any 2.x or 3.2 test names were specified on the command
217*6467f958SSadaf Ebrahimi     // line.
218*6467f958SSadaf Ebrahimi     unsigned first_32_testname = 0;
219*6467f958SSadaf Ebrahimi 
220*6467f958SSadaf Ebrahimi     for (int j = 1; (j < argc) && (!first_32_testname); ++j)
221*6467f958SSadaf Ebrahimi         for (int i = 0; i < test_num32; ++i)
222*6467f958SSadaf Ebrahimi             if (strcmp(test_list32[i].name, argv[j]) == 0)
223*6467f958SSadaf Ebrahimi             {
224*6467f958SSadaf Ebrahimi                 first_32_testname = j;
225*6467f958SSadaf Ebrahimi                 break;
226*6467f958SSadaf Ebrahimi             }
227*6467f958SSadaf Ebrahimi 
228*6467f958SSadaf Ebrahimi     // Create the environment for the test.
229*6467f958SSadaf Ebrahimi     GLEnvironment *glEnv = GLEnvironment::Instance();
230*6467f958SSadaf Ebrahimi 
231*6467f958SSadaf Ebrahimi     // Check if any devices of the requested type support CL/GL interop.
232*6467f958SSadaf Ebrahimi     int supported = glEnv->SupportsCLGLInterop(requestedDeviceType);
233*6467f958SSadaf Ebrahimi     if (supported == 0)
234*6467f958SSadaf Ebrahimi     {
235*6467f958SSadaf Ebrahimi         log_info("Test not run because GL-CL interop is not supported for any "
236*6467f958SSadaf Ebrahimi                  "devices of the requested type.\n");
237*6467f958SSadaf Ebrahimi         return 0;
238*6467f958SSadaf Ebrahimi     }
239*6467f958SSadaf Ebrahimi     else if (supported == -1)
240*6467f958SSadaf Ebrahimi     {
241*6467f958SSadaf Ebrahimi         log_error("Unable to setup the test or failed to determine if CL-GL "
242*6467f958SSadaf Ebrahimi                   "interop is supported.\n");
243*6467f958SSadaf Ebrahimi         return -1;
244*6467f958SSadaf Ebrahimi     }
245*6467f958SSadaf Ebrahimi 
246*6467f958SSadaf Ebrahimi     // Initialize function pointers.
247*6467f958SSadaf Ebrahimi     error = init_clgl_ext();
248*6467f958SSadaf Ebrahimi     if (error < 0)
249*6467f958SSadaf Ebrahimi     {
250*6467f958SSadaf Ebrahimi         return error;
251*6467f958SSadaf Ebrahimi     }
252*6467f958SSadaf Ebrahimi 
253*6467f958SSadaf Ebrahimi     // OpenGL tests for non-3.2
254*6467f958SSadaf Ebrahimi     // ////////////////////////////////////////////////////////
255*6467f958SSadaf Ebrahimi     if ((argc == 1) || (first_32_testname != 1))
256*6467f958SSadaf Ebrahimi     {
257*6467f958SSadaf Ebrahimi 
258*6467f958SSadaf Ebrahimi         // At least one device supports CL-GL interop, so init the test.
259*6467f958SSadaf Ebrahimi         if (glEnv->Init(&argc, (char **)argv, CL_FALSE))
260*6467f958SSadaf Ebrahimi         {
261*6467f958SSadaf Ebrahimi             log_error(
262*6467f958SSadaf Ebrahimi                 "Failed to initialize the GL environment for this test.\n");
263*6467f958SSadaf Ebrahimi             return -1;
264*6467f958SSadaf Ebrahimi         }
265*6467f958SSadaf Ebrahimi 
266*6467f958SSadaf Ebrahimi         // Create a context to use and then grab a device (or devices) from it
267*6467f958SSadaf Ebrahimi         sCurrentContext = glEnv->CreateCLContext();
268*6467f958SSadaf Ebrahimi         if (sCurrentContext == NULL)
269*6467f958SSadaf Ebrahimi         {
270*6467f958SSadaf Ebrahimi             log_error("ERROR: Unable to obtain CL context from GL\n");
271*6467f958SSadaf Ebrahimi             return -1;
272*6467f958SSadaf Ebrahimi         }
273*6467f958SSadaf Ebrahimi 
274*6467f958SSadaf Ebrahimi         size_t numDevices = 0;
275*6467f958SSadaf Ebrahimi         cl_device_id *deviceIDs;
276*6467f958SSadaf Ebrahimi 
277*6467f958SSadaf Ebrahimi         error = clGetContextInfo(sCurrentContext, CL_CONTEXT_DEVICES, 0, NULL,
278*6467f958SSadaf Ebrahimi                                  &numDevices);
279*6467f958SSadaf Ebrahimi         if (error != CL_SUCCESS)
280*6467f958SSadaf Ebrahimi         {
281*6467f958SSadaf Ebrahimi             print_error(error, "Unable to get device count from context");
282*6467f958SSadaf Ebrahimi             return -1;
283*6467f958SSadaf Ebrahimi         }
284*6467f958SSadaf Ebrahimi         deviceIDs = (cl_device_id *)malloc(numDevices);
285*6467f958SSadaf Ebrahimi         if (deviceIDs == NULL)
286*6467f958SSadaf Ebrahimi         {
287*6467f958SSadaf Ebrahimi             print_error(error, "malloc failed");
288*6467f958SSadaf Ebrahimi             return -1;
289*6467f958SSadaf Ebrahimi         }
290*6467f958SSadaf Ebrahimi         error = clGetContextInfo(sCurrentContext, CL_CONTEXT_DEVICES,
291*6467f958SSadaf Ebrahimi                                  numDevices, deviceIDs, NULL);
292*6467f958SSadaf Ebrahimi         if (error != CL_SUCCESS)
293*6467f958SSadaf Ebrahimi         {
294*6467f958SSadaf Ebrahimi             print_error(error, "Unable to get device list from context");
295*6467f958SSadaf Ebrahimi             return -1;
296*6467f958SSadaf Ebrahimi         }
297*6467f958SSadaf Ebrahimi 
298*6467f958SSadaf Ebrahimi         numDevices /= sizeof(cl_device_id);
299*6467f958SSadaf Ebrahimi 
300*6467f958SSadaf Ebrahimi         if (numDevices < 1)
301*6467f958SSadaf Ebrahimi         {
302*6467f958SSadaf Ebrahimi             log_error("No devices found.\n");
303*6467f958SSadaf Ebrahimi             return -1;
304*6467f958SSadaf Ebrahimi         }
305*6467f958SSadaf Ebrahimi 
306*6467f958SSadaf Ebrahimi         // Execute tests.
307*6467f958SSadaf Ebrahimi         int argc_ = (first_32_testname) ? first_32_testname : argc;
308*6467f958SSadaf Ebrahimi 
309*6467f958SSadaf Ebrahimi         for (size_t i = 0; i < numDevices; i++)
310*6467f958SSadaf Ebrahimi         {
311*6467f958SSadaf Ebrahimi             log_info("\nTesting OpenGL 2.x\n");
312*6467f958SSadaf Ebrahimi             if (printDeviceHeader(deviceIDs[i]) != CL_SUCCESS)
313*6467f958SSadaf Ebrahimi             {
314*6467f958SSadaf Ebrahimi                 return -1;
315*6467f958SSadaf Ebrahimi             }
316*6467f958SSadaf Ebrahimi 
317*6467f958SSadaf Ebrahimi             // Note: don't use the entire harness, because we have a different
318*6467f958SSadaf Ebrahimi             // way of obtaining the device (via the context)
319*6467f958SSadaf Ebrahimi             test_harness_config config{};
320*6467f958SSadaf Ebrahimi             config.forceNoContextCreation = true;
321*6467f958SSadaf Ebrahimi             config.numElementsToUse = 1024;
322*6467f958SSadaf Ebrahimi             config.queueProps = 0;
323*6467f958SSadaf Ebrahimi             error = parseAndCallCommandLineTests(argc_, argv, deviceIDs[i],
324*6467f958SSadaf Ebrahimi                                                  test_num, test_list, config);
325*6467f958SSadaf Ebrahimi             if (error != 0) break;
326*6467f958SSadaf Ebrahimi         }
327*6467f958SSadaf Ebrahimi 
328*6467f958SSadaf Ebrahimi         numErrors += error;
329*6467f958SSadaf Ebrahimi 
330*6467f958SSadaf Ebrahimi         // Clean-up.
331*6467f958SSadaf Ebrahimi         free(deviceIDs);
332*6467f958SSadaf Ebrahimi         clReleaseContext(sCurrentContext);
333*6467f958SSadaf Ebrahimi         // delete glEnv;
334*6467f958SSadaf Ebrahimi     }
335*6467f958SSadaf Ebrahimi 
336*6467f958SSadaf Ebrahimi     // OpenGL 3.2 tests.
337*6467f958SSadaf Ebrahimi     // ////////////////////////////////////////////////////////
338*6467f958SSadaf Ebrahimi     if ((argc == 1) || first_32_testname)
339*6467f958SSadaf Ebrahimi     {
340*6467f958SSadaf Ebrahimi 
341*6467f958SSadaf Ebrahimi         // At least one device supports CL-GL interop, so init the test.
342*6467f958SSadaf Ebrahimi         if (glEnv->Init(&argc, (char **)argv, CL_TRUE))
343*6467f958SSadaf Ebrahimi         {
344*6467f958SSadaf Ebrahimi             log_error(
345*6467f958SSadaf Ebrahimi                 "Failed to initialize the GL environment for this test.\n");
346*6467f958SSadaf Ebrahimi             return -1;
347*6467f958SSadaf Ebrahimi         }
348*6467f958SSadaf Ebrahimi 
349*6467f958SSadaf Ebrahimi         // Create a context to use and then grab a device (or devices) from it
350*6467f958SSadaf Ebrahimi         sCurrentContext = glEnv->CreateCLContext();
351*6467f958SSadaf Ebrahimi         if (sCurrentContext == NULL)
352*6467f958SSadaf Ebrahimi         {
353*6467f958SSadaf Ebrahimi             log_error("ERROR: Unable to obtain CL context from GL\n");
354*6467f958SSadaf Ebrahimi             return -1;
355*6467f958SSadaf Ebrahimi         }
356*6467f958SSadaf Ebrahimi 
357*6467f958SSadaf Ebrahimi         size_t numDevices = 0;
358*6467f958SSadaf Ebrahimi         cl_device_id *deviceIDs;
359*6467f958SSadaf Ebrahimi 
360*6467f958SSadaf Ebrahimi         error = clGetContextInfo(sCurrentContext, CL_CONTEXT_DEVICES, 0, NULL,
361*6467f958SSadaf Ebrahimi                                  &numDevices);
362*6467f958SSadaf Ebrahimi         if (error != CL_SUCCESS)
363*6467f958SSadaf Ebrahimi         {
364*6467f958SSadaf Ebrahimi             print_error(error, "Unable to get device count from context");
365*6467f958SSadaf Ebrahimi             return -1;
366*6467f958SSadaf Ebrahimi         }
367*6467f958SSadaf Ebrahimi         deviceIDs = (cl_device_id *)malloc(numDevices);
368*6467f958SSadaf Ebrahimi         if (deviceIDs == NULL)
369*6467f958SSadaf Ebrahimi         {
370*6467f958SSadaf Ebrahimi             print_error(error, "malloc failed");
371*6467f958SSadaf Ebrahimi             return -1;
372*6467f958SSadaf Ebrahimi         }
373*6467f958SSadaf Ebrahimi         error = clGetContextInfo(sCurrentContext, CL_CONTEXT_DEVICES,
374*6467f958SSadaf Ebrahimi                                  numDevices, deviceIDs, NULL);
375*6467f958SSadaf Ebrahimi         if (error != CL_SUCCESS)
376*6467f958SSadaf Ebrahimi         {
377*6467f958SSadaf Ebrahimi             print_error(error, "Unable to get device list from context");
378*6467f958SSadaf Ebrahimi             return -1;
379*6467f958SSadaf Ebrahimi         }
380*6467f958SSadaf Ebrahimi 
381*6467f958SSadaf Ebrahimi         numDevices /= sizeof(cl_device_id);
382*6467f958SSadaf Ebrahimi 
383*6467f958SSadaf Ebrahimi         if (numDevices < 1)
384*6467f958SSadaf Ebrahimi         {
385*6467f958SSadaf Ebrahimi             log_error("No devices found.\n");
386*6467f958SSadaf Ebrahimi             return -1;
387*6467f958SSadaf Ebrahimi         }
388*6467f958SSadaf Ebrahimi 
389*6467f958SSadaf Ebrahimi         int argc_ = (first_32_testname) ? 1 + (argc - first_32_testname) : argc;
390*6467f958SSadaf Ebrahimi         const char **argv_ =
391*6467f958SSadaf Ebrahimi             (first_32_testname) ? &argv[first_32_testname - 1] : argv;
392*6467f958SSadaf Ebrahimi 
393*6467f958SSadaf Ebrahimi         // Execute the tests.
394*6467f958SSadaf Ebrahimi         for (size_t i = 0; i < numDevices; i++)
395*6467f958SSadaf Ebrahimi         {
396*6467f958SSadaf Ebrahimi             log_info("\nTesting OpenGL 3.2\n");
397*6467f958SSadaf Ebrahimi             if (printDeviceHeader(deviceIDs[i]) != CL_SUCCESS)
398*6467f958SSadaf Ebrahimi             {
399*6467f958SSadaf Ebrahimi                 return -1;
400*6467f958SSadaf Ebrahimi             }
401*6467f958SSadaf Ebrahimi 
402*6467f958SSadaf Ebrahimi             // Note: don't use the entire harness, because we have a different
403*6467f958SSadaf Ebrahimi             // way of obtaining the device (via the context)
404*6467f958SSadaf Ebrahimi             test_harness_config config{};
405*6467f958SSadaf Ebrahimi             config.forceNoContextCreation = true;
406*6467f958SSadaf Ebrahimi             config.numElementsToUse = 1024;
407*6467f958SSadaf Ebrahimi             config.queueProps = 0;
408*6467f958SSadaf Ebrahimi             error = parseAndCallCommandLineTests(
409*6467f958SSadaf Ebrahimi                 argc_, argv_, deviceIDs[i], test_num32, test_list32, config);
410*6467f958SSadaf Ebrahimi             if (error != 0) break;
411*6467f958SSadaf Ebrahimi         }
412*6467f958SSadaf Ebrahimi 
413*6467f958SSadaf Ebrahimi         numErrors += error;
414*6467f958SSadaf Ebrahimi 
415*6467f958SSadaf Ebrahimi         // Clean-up.
416*6467f958SSadaf Ebrahimi         free(deviceIDs);
417*6467f958SSadaf Ebrahimi         clReleaseContext(sCurrentContext);
418*6467f958SSadaf Ebrahimi         delete glEnv;
419*6467f958SSadaf Ebrahimi     }
420*6467f958SSadaf Ebrahimi 
421*6467f958SSadaf Ebrahimi     // All done.
422*6467f958SSadaf Ebrahimi     return numErrors;
423*6467f958SSadaf Ebrahimi }
424