1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2022 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
17*6467f958SSadaf Ebrahimi #include <stdio.h>
18*6467f958SSadaf Ebrahimi #include <stdlib.h>
19*6467f958SSadaf Ebrahimi
20*6467f958SSadaf Ebrahimi #if !defined(_WIN32)
21*6467f958SSadaf Ebrahimi #include <stdbool.h>
22*6467f958SSadaf Ebrahimi #endif
23*6467f958SSadaf Ebrahimi
24*6467f958SSadaf Ebrahimi #include <math.h>
25*6467f958SSadaf Ebrahimi #include <string.h>
26*6467f958SSadaf Ebrahimi
27*6467f958SSadaf Ebrahimi #if !defined(__APPLE__)
28*6467f958SSadaf Ebrahimi #include <CL/cl.h>
29*6467f958SSadaf Ebrahimi #else
30*6467f958SSadaf Ebrahimi #include <OpenCL/cl.h>
31*6467f958SSadaf Ebrahimi #endif
32*6467f958SSadaf Ebrahimi
33*6467f958SSadaf Ebrahimi
34*6467f958SSadaf Ebrahimi #include "procs.h"
35*6467f958SSadaf Ebrahimi #include "harness/testHarness.h"
36*6467f958SSadaf Ebrahimi #include "harness/parseParameters.h"
37*6467f958SSadaf Ebrahimi #include "harness/deviceInfo.h"
38*6467f958SSadaf Ebrahimi
39*6467f958SSadaf Ebrahimi #if !defined(_WIN32)
40*6467f958SSadaf Ebrahimi #include <unistd.h>
41*6467f958SSadaf Ebrahimi #endif
42*6467f958SSadaf Ebrahimi #include <vulkan_interop_common.hpp>
43*6467f958SSadaf Ebrahimi #include <vulkan_wrapper.hpp>
44*6467f958SSadaf Ebrahimi
45*6467f958SSadaf Ebrahimi #define BUFFERSIZE 3000
46*6467f958SSadaf Ebrahimi
params_reset()47*6467f958SSadaf Ebrahimi static void params_reset()
48*6467f958SSadaf Ebrahimi {
49*6467f958SSadaf Ebrahimi numCQ = 1;
50*6467f958SSadaf Ebrahimi multiImport = false;
51*6467f958SSadaf Ebrahimi multiCtx = false;
52*6467f958SSadaf Ebrahimi }
53*6467f958SSadaf Ebrahimi
54*6467f958SSadaf Ebrahimi extern int test_buffer_common(cl_device_id device_, cl_context context_,
55*6467f958SSadaf Ebrahimi cl_command_queue queue_, int numElements_,
56*6467f958SSadaf Ebrahimi float use_fence);
57*6467f958SSadaf Ebrahimi extern int test_image_common(cl_device_id device_, cl_context context_,
58*6467f958SSadaf Ebrahimi cl_command_queue queue_, int numElements_);
59*6467f958SSadaf Ebrahimi
test_buffer_single_queue(cl_device_id device_,cl_context context_,cl_command_queue queue_,int numElements_)60*6467f958SSadaf Ebrahimi int test_buffer_single_queue(cl_device_id device_, cl_context context_,
61*6467f958SSadaf Ebrahimi cl_command_queue queue_, int numElements_)
62*6467f958SSadaf Ebrahimi {
63*6467f958SSadaf Ebrahimi params_reset();
64*6467f958SSadaf Ebrahimi log_info("RUNNING TEST WITH ONE QUEUE...... \n\n");
65*6467f958SSadaf Ebrahimi return test_buffer_common(device_, context_, queue_, numElements_, false);
66*6467f958SSadaf Ebrahimi }
test_buffer_multiple_queue(cl_device_id device_,cl_context context_,cl_command_queue queue_,int numElements_)67*6467f958SSadaf Ebrahimi int test_buffer_multiple_queue(cl_device_id device_, cl_context context_,
68*6467f958SSadaf Ebrahimi cl_command_queue queue_, int numElements_)
69*6467f958SSadaf Ebrahimi {
70*6467f958SSadaf Ebrahimi params_reset();
71*6467f958SSadaf Ebrahimi numCQ = 2;
72*6467f958SSadaf Ebrahimi log_info("RUNNING TEST WITH TWO QUEUE...... \n\n");
73*6467f958SSadaf Ebrahimi return test_buffer_common(device_, context_, queue_, numElements_, false);
74*6467f958SSadaf Ebrahimi }
test_buffer_multiImport_sameCtx(cl_device_id device_,cl_context context_,cl_command_queue queue_,int numElements_)75*6467f958SSadaf Ebrahimi int test_buffer_multiImport_sameCtx(cl_device_id device_, cl_context context_,
76*6467f958SSadaf Ebrahimi cl_command_queue queue_, int numElements_)
77*6467f958SSadaf Ebrahimi {
78*6467f958SSadaf Ebrahimi params_reset();
79*6467f958SSadaf Ebrahimi multiImport = true;
80*6467f958SSadaf Ebrahimi log_info("RUNNING TEST WITH MULTIPLE DEVICE MEMORY IMPORT "
81*6467f958SSadaf Ebrahimi "IN SAME CONTEXT...... \n\n");
82*6467f958SSadaf Ebrahimi return test_buffer_common(device_, context_, queue_, numElements_, false);
83*6467f958SSadaf Ebrahimi }
test_buffer_multiImport_diffCtx(cl_device_id device_,cl_context context_,cl_command_queue queue_,int numElements_)84*6467f958SSadaf Ebrahimi int test_buffer_multiImport_diffCtx(cl_device_id device_, cl_context context_,
85*6467f958SSadaf Ebrahimi cl_command_queue queue_, int numElements_)
86*6467f958SSadaf Ebrahimi {
87*6467f958SSadaf Ebrahimi params_reset();
88*6467f958SSadaf Ebrahimi multiImport = true;
89*6467f958SSadaf Ebrahimi multiCtx = true;
90*6467f958SSadaf Ebrahimi log_info("RUNNING TEST WITH MULTIPLE DEVICE MEMORY IMPORT "
91*6467f958SSadaf Ebrahimi "IN DIFFERENT CONTEXT...... \n\n");
92*6467f958SSadaf Ebrahimi return test_buffer_common(device_, context_, queue_, numElements_, false);
93*6467f958SSadaf Ebrahimi }
test_buffer_single_queue_fence(cl_device_id device_,cl_context context_,cl_command_queue queue_,int numElements_)94*6467f958SSadaf Ebrahimi int test_buffer_single_queue_fence(cl_device_id device_, cl_context context_,
95*6467f958SSadaf Ebrahimi cl_command_queue queue_, int numElements_)
96*6467f958SSadaf Ebrahimi {
97*6467f958SSadaf Ebrahimi params_reset();
98*6467f958SSadaf Ebrahimi log_info("RUNNING TEST WITH ONE QUEUE...... \n\n");
99*6467f958SSadaf Ebrahimi return test_buffer_common(device_, context_, queue_, numElements_, true);
100*6467f958SSadaf Ebrahimi }
test_buffer_multiple_queue_fence(cl_device_id device_,cl_context context_,cl_command_queue queue_,int numElements_)101*6467f958SSadaf Ebrahimi int test_buffer_multiple_queue_fence(cl_device_id device_, cl_context context_,
102*6467f958SSadaf Ebrahimi cl_command_queue queue_, int numElements_)
103*6467f958SSadaf Ebrahimi {
104*6467f958SSadaf Ebrahimi params_reset();
105*6467f958SSadaf Ebrahimi numCQ = 2;
106*6467f958SSadaf Ebrahimi log_info("RUNNING TEST WITH TWO QUEUE...... \n\n");
107*6467f958SSadaf Ebrahimi return test_buffer_common(device_, context_, queue_, numElements_, true);
108*6467f958SSadaf Ebrahimi }
test_buffer_multiImport_sameCtx_fence(cl_device_id device_,cl_context context_,cl_command_queue queue_,int numElements_)109*6467f958SSadaf Ebrahimi int test_buffer_multiImport_sameCtx_fence(cl_device_id device_,
110*6467f958SSadaf Ebrahimi cl_context context_,
111*6467f958SSadaf Ebrahimi cl_command_queue queue_,
112*6467f958SSadaf Ebrahimi int numElements_)
113*6467f958SSadaf Ebrahimi {
114*6467f958SSadaf Ebrahimi params_reset();
115*6467f958SSadaf Ebrahimi multiImport = true;
116*6467f958SSadaf Ebrahimi log_info("RUNNING TEST WITH MULTIPLE DEVICE MEMORY IMPORT "
117*6467f958SSadaf Ebrahimi "IN SAME CONTEXT...... \n\n");
118*6467f958SSadaf Ebrahimi return test_buffer_common(device_, context_, queue_, numElements_, true);
119*6467f958SSadaf Ebrahimi }
test_buffer_multiImport_diffCtx_fence(cl_device_id device_,cl_context context_,cl_command_queue queue_,int numElements_)120*6467f958SSadaf Ebrahimi int test_buffer_multiImport_diffCtx_fence(cl_device_id device_,
121*6467f958SSadaf Ebrahimi cl_context context_,
122*6467f958SSadaf Ebrahimi cl_command_queue queue_,
123*6467f958SSadaf Ebrahimi int numElements_)
124*6467f958SSadaf Ebrahimi {
125*6467f958SSadaf Ebrahimi params_reset();
126*6467f958SSadaf Ebrahimi multiImport = true;
127*6467f958SSadaf Ebrahimi multiCtx = true;
128*6467f958SSadaf Ebrahimi log_info("RUNNING TEST WITH MULTIPLE DEVICE MEMORY IMPORT "
129*6467f958SSadaf Ebrahimi "IN DIFFERENT CONTEXT...... \n\n");
130*6467f958SSadaf Ebrahimi return test_buffer_common(device_, context_, queue_, numElements_, true);
131*6467f958SSadaf Ebrahimi }
test_image_single_queue(cl_device_id device_,cl_context context_,cl_command_queue queue_,int numElements_)132*6467f958SSadaf Ebrahimi int test_image_single_queue(cl_device_id device_, cl_context context_,
133*6467f958SSadaf Ebrahimi cl_command_queue queue_, int numElements_)
134*6467f958SSadaf Ebrahimi {
135*6467f958SSadaf Ebrahimi params_reset();
136*6467f958SSadaf Ebrahimi log_info("RUNNING TEST WITH ONE QUEUE...... \n\n");
137*6467f958SSadaf Ebrahimi return test_image_common(device_, context_, queue_, numElements_);
138*6467f958SSadaf Ebrahimi }
test_image_multiple_queue(cl_device_id device_,cl_context context_,cl_command_queue queue_,int numElements_)139*6467f958SSadaf Ebrahimi int test_image_multiple_queue(cl_device_id device_, cl_context context_,
140*6467f958SSadaf Ebrahimi cl_command_queue queue_, int numElements_)
141*6467f958SSadaf Ebrahimi {
142*6467f958SSadaf Ebrahimi params_reset();
143*6467f958SSadaf Ebrahimi numCQ = 2;
144*6467f958SSadaf Ebrahimi log_info("RUNNING TEST WITH TWO QUEUE...... \n\n");
145*6467f958SSadaf Ebrahimi return test_image_common(device_, context_, queue_, numElements_);
146*6467f958SSadaf Ebrahimi }
147*6467f958SSadaf Ebrahimi
148*6467f958SSadaf Ebrahimi test_definition test_list[] = { ADD_TEST(buffer_single_queue),
149*6467f958SSadaf Ebrahimi ADD_TEST(buffer_multiple_queue),
150*6467f958SSadaf Ebrahimi ADD_TEST(buffer_multiImport_sameCtx),
151*6467f958SSadaf Ebrahimi ADD_TEST(buffer_multiImport_diffCtx),
152*6467f958SSadaf Ebrahimi ADD_TEST(buffer_single_queue_fence),
153*6467f958SSadaf Ebrahimi ADD_TEST(buffer_multiple_queue_fence),
154*6467f958SSadaf Ebrahimi ADD_TEST(buffer_multiImport_sameCtx_fence),
155*6467f958SSadaf Ebrahimi ADD_TEST(buffer_multiImport_diffCtx_fence),
156*6467f958SSadaf Ebrahimi ADD_TEST(image_single_queue),
157*6467f958SSadaf Ebrahimi ADD_TEST(image_multiple_queue),
158*6467f958SSadaf Ebrahimi ADD_TEST(consistency_external_buffer),
159*6467f958SSadaf Ebrahimi ADD_TEST(consistency_external_image),
160*6467f958SSadaf Ebrahimi ADD_TEST(consistency_external_semaphore),
161*6467f958SSadaf Ebrahimi ADD_TEST(platform_info),
162*6467f958SSadaf Ebrahimi ADD_TEST(device_info) };
163*6467f958SSadaf Ebrahimi
164*6467f958SSadaf Ebrahimi const int test_num = ARRAY_SIZE(test_list);
165*6467f958SSadaf Ebrahimi
166*6467f958SSadaf Ebrahimi cl_device_type gDeviceType = CL_DEVICE_TYPE_DEFAULT;
167*6467f958SSadaf Ebrahimi char *choosen_platform_name = NULL;
168*6467f958SSadaf Ebrahimi cl_platform_id platform = NULL;
169*6467f958SSadaf Ebrahimi cl_int choosen_platform_index = -1;
170*6467f958SSadaf Ebrahimi char platform_name[1024] = "";
171*6467f958SSadaf Ebrahimi cl_platform_id select_platform = NULL;
172*6467f958SSadaf Ebrahimi char *extensions = NULL;
173*6467f958SSadaf Ebrahimi size_t extensionSize = 0;
174*6467f958SSadaf Ebrahimi cl_uint num_devices = 0;
175*6467f958SSadaf Ebrahimi cl_uint device_no = 0;
176*6467f958SSadaf Ebrahimi cl_device_id *devices;
177*6467f958SSadaf Ebrahimi const size_t bufsize = BUFFERSIZE;
178*6467f958SSadaf Ebrahimi char buf[BUFFERSIZE];
179*6467f958SSadaf Ebrahimi cl_uchar uuid[CL_UUID_SIZE_KHR];
180*6467f958SSadaf Ebrahimi unsigned int numCQ;
181*6467f958SSadaf Ebrahimi bool multiImport;
182*6467f958SSadaf Ebrahimi bool multiCtx;
183*6467f958SSadaf Ebrahimi bool debug_trace = false;
184*6467f958SSadaf Ebrahimi bool useSingleImageKernel = false;
185*6467f958SSadaf Ebrahimi bool useDeviceLocal = false;
186*6467f958SSadaf Ebrahimi bool disableNTHandleType = false;
187*6467f958SSadaf Ebrahimi bool enableOffset = false;
188*6467f958SSadaf Ebrahimi
printUsage(const char * execName)189*6467f958SSadaf Ebrahimi static void printUsage(const char *execName)
190*6467f958SSadaf Ebrahimi {
191*6467f958SSadaf Ebrahimi const char *p = strrchr(execName, '/');
192*6467f958SSadaf Ebrahimi if (p != NULL) execName = p + 1;
193*6467f958SSadaf Ebrahimi
194*6467f958SSadaf Ebrahimi log_info("Usage: %s [test_names] [options]\n", execName);
195*6467f958SSadaf Ebrahimi log_info("Test names:\n");
196*6467f958SSadaf Ebrahimi for (int i = 0; i < test_num; i++)
197*6467f958SSadaf Ebrahimi {
198*6467f958SSadaf Ebrahimi log_info("\t%s\n", test_list[i].name);
199*6467f958SSadaf Ebrahimi }
200*6467f958SSadaf Ebrahimi log_info("\n");
201*6467f958SSadaf Ebrahimi log_info("Options:\n");
202*6467f958SSadaf Ebrahimi log_info("\t--debug_trace - Enables additional debug info logging\n");
203*6467f958SSadaf Ebrahimi log_info("\t--non_dedicated - Choose dedicated Vs. non_dedicated \n");
204*6467f958SSadaf Ebrahimi }
205*6467f958SSadaf Ebrahimi
parseParams(int argc,const char * argv[],const char ** argList)206*6467f958SSadaf Ebrahimi size_t parseParams(int argc, const char *argv[], const char **argList)
207*6467f958SSadaf Ebrahimi {
208*6467f958SSadaf Ebrahimi size_t argCount = 1;
209*6467f958SSadaf Ebrahimi for (int i = 1; i < argc; i++)
210*6467f958SSadaf Ebrahimi {
211*6467f958SSadaf Ebrahimi if (argv[i] == NULL) break;
212*6467f958SSadaf Ebrahimi if (argv[i][0] == '-')
213*6467f958SSadaf Ebrahimi {
214*6467f958SSadaf Ebrahimi if (!strcmp(argv[i], "--debug_trace"))
215*6467f958SSadaf Ebrahimi {
216*6467f958SSadaf Ebrahimi debug_trace = true;
217*6467f958SSadaf Ebrahimi }
218*6467f958SSadaf Ebrahimi if (!strcmp(argv[i], "--useSingleImageKernel"))
219*6467f958SSadaf Ebrahimi {
220*6467f958SSadaf Ebrahimi useSingleImageKernel = true;
221*6467f958SSadaf Ebrahimi }
222*6467f958SSadaf Ebrahimi if (!strcmp(argv[i], "--useDeviceLocal"))
223*6467f958SSadaf Ebrahimi {
224*6467f958SSadaf Ebrahimi useDeviceLocal = true;
225*6467f958SSadaf Ebrahimi }
226*6467f958SSadaf Ebrahimi if (!strcmp(argv[i], "--disableNTHandleType"))
227*6467f958SSadaf Ebrahimi {
228*6467f958SSadaf Ebrahimi disableNTHandleType = true;
229*6467f958SSadaf Ebrahimi }
230*6467f958SSadaf Ebrahimi if (!strcmp(argv[i], "--enableOffset"))
231*6467f958SSadaf Ebrahimi {
232*6467f958SSadaf Ebrahimi enableOffset = true;
233*6467f958SSadaf Ebrahimi }
234*6467f958SSadaf Ebrahimi if (strcmp(argv[i], "-h") == 0)
235*6467f958SSadaf Ebrahimi {
236*6467f958SSadaf Ebrahimi printUsage(argv[0]);
237*6467f958SSadaf Ebrahimi argCount = 0; // Returning argCount=0 to assert error in main()
238*6467f958SSadaf Ebrahimi break;
239*6467f958SSadaf Ebrahimi }
240*6467f958SSadaf Ebrahimi }
241*6467f958SSadaf Ebrahimi else
242*6467f958SSadaf Ebrahimi {
243*6467f958SSadaf Ebrahimi argList[argCount] = argv[i];
244*6467f958SSadaf Ebrahimi argCount++;
245*6467f958SSadaf Ebrahimi }
246*6467f958SSadaf Ebrahimi }
247*6467f958SSadaf Ebrahimi return argCount;
248*6467f958SSadaf Ebrahimi }
249*6467f958SSadaf Ebrahimi
main(int argc,const char * argv[])250*6467f958SSadaf Ebrahimi int main(int argc, const char *argv[])
251*6467f958SSadaf Ebrahimi {
252*6467f958SSadaf Ebrahimi int errNum = 0;
253*6467f958SSadaf Ebrahimi
254*6467f958SSadaf Ebrahimi test_start();
255*6467f958SSadaf Ebrahimi params_reset();
256*6467f958SSadaf Ebrahimi
257*6467f958SSadaf Ebrahimi if (!checkVkSupport())
258*6467f958SSadaf Ebrahimi {
259*6467f958SSadaf Ebrahimi log_info("Vulkan supported GPU not found \n");
260*6467f958SSadaf Ebrahimi log_info("TEST SKIPPED \n");
261*6467f958SSadaf Ebrahimi return 0;
262*6467f958SSadaf Ebrahimi }
263*6467f958SSadaf Ebrahimi
264*6467f958SSadaf Ebrahimi VulkanDevice vkDevice;
265*6467f958SSadaf Ebrahimi
266*6467f958SSadaf Ebrahimi cl_device_type requestedDeviceType = CL_DEVICE_TYPE_GPU;
267*6467f958SSadaf Ebrahimi char *force_cpu = getenv("CL_DEVICE_TYPE");
268*6467f958SSadaf Ebrahimi if (force_cpu != NULL)
269*6467f958SSadaf Ebrahimi {
270*6467f958SSadaf Ebrahimi if (strcmp(force_cpu, "gpu") == 0
271*6467f958SSadaf Ebrahimi || strcmp(force_cpu, "CL_DEVICE_TYPE_GPU") == 0)
272*6467f958SSadaf Ebrahimi requestedDeviceType = CL_DEVICE_TYPE_GPU;
273*6467f958SSadaf Ebrahimi else if (strcmp(force_cpu, "cpu") == 0
274*6467f958SSadaf Ebrahimi || strcmp(force_cpu, "CL_DEVICE_TYPE_CPU") == 0)
275*6467f958SSadaf Ebrahimi requestedDeviceType = CL_DEVICE_TYPE_CPU;
276*6467f958SSadaf Ebrahimi else if (strcmp(force_cpu, "accelerator") == 0
277*6467f958SSadaf Ebrahimi || strcmp(force_cpu, "CL_DEVICE_TYPE_ACCELERATOR") == 0)
278*6467f958SSadaf Ebrahimi requestedDeviceType = CL_DEVICE_TYPE_ACCELERATOR;
279*6467f958SSadaf Ebrahimi else if (strcmp(force_cpu, "CL_DEVICE_TYPE_DEFAULT") == 0)
280*6467f958SSadaf Ebrahimi requestedDeviceType = CL_DEVICE_TYPE_DEFAULT;
281*6467f958SSadaf Ebrahimi }
282*6467f958SSadaf Ebrahimi
283*6467f958SSadaf Ebrahimi if (requestedDeviceType != CL_DEVICE_TYPE_GPU)
284*6467f958SSadaf Ebrahimi {
285*6467f958SSadaf Ebrahimi log_info("Vulkan tests can only run on a GPU device.\n");
286*6467f958SSadaf Ebrahimi return 0;
287*6467f958SSadaf Ebrahimi }
288*6467f958SSadaf Ebrahimi gDeviceType = CL_DEVICE_TYPE_GPU;
289*6467f958SSadaf Ebrahimi
290*6467f958SSadaf Ebrahimi const char **argList = (const char **)calloc(argc, sizeof(char *));
291*6467f958SSadaf Ebrahimi size_t argCount = parseParams(argc, argv, argList);
292*6467f958SSadaf Ebrahimi if (argCount == 0) return 0;
293*6467f958SSadaf Ebrahimi // get the platform ID
294*6467f958SSadaf Ebrahimi errNum = clGetPlatformIDs(1, &platform, NULL);
295*6467f958SSadaf Ebrahimi if (errNum != CL_SUCCESS)
296*6467f958SSadaf Ebrahimi {
297*6467f958SSadaf Ebrahimi print_error(errNum, "Error: Failed to get platform\n");
298*6467f958SSadaf Ebrahimi return errNum;
299*6467f958SSadaf Ebrahimi }
300*6467f958SSadaf Ebrahimi
301*6467f958SSadaf Ebrahimi errNum =
302*6467f958SSadaf Ebrahimi clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 0, NULL, &num_devices);
303*6467f958SSadaf Ebrahimi if (CL_SUCCESS != errNum)
304*6467f958SSadaf Ebrahimi {
305*6467f958SSadaf Ebrahimi print_error(errNum, "clGetDeviceIDs failed in returning of devices\n");
306*6467f958SSadaf Ebrahimi return errNum;
307*6467f958SSadaf Ebrahimi }
308*6467f958SSadaf Ebrahimi devices = (cl_device_id *)malloc(num_devices * sizeof(cl_device_id));
309*6467f958SSadaf Ebrahimi if (NULL == devices)
310*6467f958SSadaf Ebrahimi {
311*6467f958SSadaf Ebrahimi print_error(errNum, "Unable to allocate memory for devices\n");
312*6467f958SSadaf Ebrahimi return CL_OUT_OF_HOST_MEMORY;
313*6467f958SSadaf Ebrahimi }
314*6467f958SSadaf Ebrahimi errNum = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, num_devices, devices,
315*6467f958SSadaf Ebrahimi NULL);
316*6467f958SSadaf Ebrahimi if (CL_SUCCESS != errNum)
317*6467f958SSadaf Ebrahimi {
318*6467f958SSadaf Ebrahimi print_error(errNum, "Failed to get deviceID.\n");
319*6467f958SSadaf Ebrahimi return errNum;
320*6467f958SSadaf Ebrahimi }
321*6467f958SSadaf Ebrahimi for (device_no = 0; device_no < num_devices; device_no++)
322*6467f958SSadaf Ebrahimi {
323*6467f958SSadaf Ebrahimi errNum = clGetDeviceInfo(devices[device_no], CL_DEVICE_EXTENSIONS, 0,
324*6467f958SSadaf Ebrahimi NULL, &extensionSize);
325*6467f958SSadaf Ebrahimi if (CL_SUCCESS != errNum)
326*6467f958SSadaf Ebrahimi {
327*6467f958SSadaf Ebrahimi log_error("Error in clGetDeviceInfo for getting "
328*6467f958SSadaf Ebrahimi "device_extension size....\n");
329*6467f958SSadaf Ebrahimi return errNum;
330*6467f958SSadaf Ebrahimi }
331*6467f958SSadaf Ebrahimi extensions = (char *)malloc(extensionSize);
332*6467f958SSadaf Ebrahimi if (NULL == extensions)
333*6467f958SSadaf Ebrahimi {
334*6467f958SSadaf Ebrahimi log_error("Unable to allocate memory for extensions\n");
335*6467f958SSadaf Ebrahimi return CL_OUT_OF_HOST_MEMORY;
336*6467f958SSadaf Ebrahimi }
337*6467f958SSadaf Ebrahimi errNum =
338*6467f958SSadaf Ebrahimi clGetDeviceInfo(devices[device_no], CL_DEVICE_EXTENSIONS,
339*6467f958SSadaf Ebrahimi extensionSize, extensions, NULL /*&extensionSize*/);
340*6467f958SSadaf Ebrahimi if (CL_SUCCESS != errNum)
341*6467f958SSadaf Ebrahimi {
342*6467f958SSadaf Ebrahimi print_error(errNum,
343*6467f958SSadaf Ebrahimi "Error in clGetDeviceInfo for getting "
344*6467f958SSadaf Ebrahimi "device_extension\n");
345*6467f958SSadaf Ebrahimi return errNum;
346*6467f958SSadaf Ebrahimi }
347*6467f958SSadaf Ebrahimi errNum = clGetDeviceInfo(devices[device_no], CL_DEVICE_UUID_KHR,
348*6467f958SSadaf Ebrahimi CL_UUID_SIZE_KHR, uuid, &extensionSize);
349*6467f958SSadaf Ebrahimi if (CL_SUCCESS != errNum)
350*6467f958SSadaf Ebrahimi {
351*6467f958SSadaf Ebrahimi print_error(errNum, "clGetDeviceInfo failed with error\n ");
352*6467f958SSadaf Ebrahimi return errNum;
353*6467f958SSadaf Ebrahimi }
354*6467f958SSadaf Ebrahimi errNum =
355*6467f958SSadaf Ebrahimi memcmp(uuid, vkDevice.getPhysicalDevice().getUUID(), VK_UUID_SIZE);
356*6467f958SSadaf Ebrahimi if (errNum == 0)
357*6467f958SSadaf Ebrahimi {
358*6467f958SSadaf Ebrahimi break;
359*6467f958SSadaf Ebrahimi }
360*6467f958SSadaf Ebrahimi }
361*6467f958SSadaf Ebrahimi if (device_no >= num_devices)
362*6467f958SSadaf Ebrahimi {
363*6467f958SSadaf Ebrahimi fprintf(stderr,
364*6467f958SSadaf Ebrahimi "OpenCL error: "
365*6467f958SSadaf Ebrahimi "No Vulkan-OpenCL Interop capable GPU found.\n");
366*6467f958SSadaf Ebrahimi }
367*6467f958SSadaf Ebrahimi if (!(is_extension_available(devices[device_no], "cl_khr_external_memory")
368*6467f958SSadaf Ebrahimi && is_extension_available(devices[device_no],
369*6467f958SSadaf Ebrahimi "cl_khr_external_semaphore")))
370*6467f958SSadaf Ebrahimi {
371*6467f958SSadaf Ebrahimi log_info("Device does not support cl_khr_external_memory "
372*6467f958SSadaf Ebrahimi "or cl_khr_external_semaphore\n");
373*6467f958SSadaf Ebrahimi log_info(" TEST SKIPPED\n");
374*6467f958SSadaf Ebrahimi return CL_SUCCESS;
375*6467f958SSadaf Ebrahimi }
376*6467f958SSadaf Ebrahimi init_cl_vk_ext(platform);
377*6467f958SSadaf Ebrahimi
378*6467f958SSadaf Ebrahimi // Execute tests.
379*6467f958SSadaf Ebrahimi // Note: don't use the entire harness, because we have a different way of
380*6467f958SSadaf Ebrahimi // obtaining the device (via the context)
381*6467f958SSadaf Ebrahimi test_harness_config config{};
382*6467f958SSadaf Ebrahimi config.forceNoContextCreation = true;
383*6467f958SSadaf Ebrahimi config.numElementsToUse = 1024;
384*6467f958SSadaf Ebrahimi config.queueProps = 0;
385*6467f958SSadaf Ebrahimi errNum = parseAndCallCommandLineTests(argCount, argList, devices[device_no],
386*6467f958SSadaf Ebrahimi test_num, test_list, config);
387*6467f958SSadaf Ebrahimi return errNum;
388*6467f958SSadaf Ebrahimi }
389