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