xref: /aosp_15_r20/external/OpenCL-CLHPP/tests/test_openclhpp.cpp (revision 6fee86a4f833e4f32f25770a262884407554133d)
1*6fee86a4SJeremy Kemp #define CL_HPP_UNIT_TEST_ENABLE
2*6fee86a4SJeremy Kemp 
3*6fee86a4SJeremy Kemp // We want to support all versions
4*6fee86a4SJeremy Kemp #define CL_HPP_MINIMUM_OPENCL_VERSION 100
5*6fee86a4SJeremy Kemp # include <CL/opencl.hpp>
6*6fee86a4SJeremy Kemp # define TEST_RVALUE_REFERENCES
7*6fee86a4SJeremy Kemp # define VECTOR_CLASS cl::vector
8*6fee86a4SJeremy Kemp # define STRING_CLASS cl::string
9*6fee86a4SJeremy Kemp 
10*6fee86a4SJeremy Kemp extern "C"
11*6fee86a4SJeremy Kemp {
12*6fee86a4SJeremy Kemp #include <unity.h>
13*6fee86a4SJeremy Kemp #include <cmock.h>
14*6fee86a4SJeremy Kemp #include "Mockcl.h"
15*6fee86a4SJeremy Kemp #include "Mockcl_ext.h"
16*6fee86a4SJeremy Kemp #include "Mockcl_gl.h"
17*6fee86a4SJeremy Kemp #include <string.h>
18*6fee86a4SJeremy Kemp 
19*6fee86a4SJeremy Kemp #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
20*6fee86a4SJeremy Kemp 
21*6fee86a4SJeremy Kemp /// Creates fake IDs that are easy to identify
22*6fee86a4SJeremy Kemp 
make_platform_id(int index)23*6fee86a4SJeremy Kemp static inline cl_platform_id make_platform_id(int index)
24*6fee86a4SJeremy Kemp {
25*6fee86a4SJeremy Kemp     return (cl_platform_id) (size_t) (0x1a1a1a1a + index);
26*6fee86a4SJeremy Kemp }
27*6fee86a4SJeremy Kemp 
make_context(int index)28*6fee86a4SJeremy Kemp static inline cl_context make_context(int index)
29*6fee86a4SJeremy Kemp {
30*6fee86a4SJeremy Kemp     return (cl_context) (size_t) (0xcccccccc + index);
31*6fee86a4SJeremy Kemp }
32*6fee86a4SJeremy Kemp 
make_device_id(int index)33*6fee86a4SJeremy Kemp static inline cl_device_id make_device_id(int index)
34*6fee86a4SJeremy Kemp {
35*6fee86a4SJeremy Kemp     return (cl_device_id) (size_t) (0xdededede + index);
36*6fee86a4SJeremy Kemp }
37*6fee86a4SJeremy Kemp 
make_mem(int index)38*6fee86a4SJeremy Kemp static inline cl_mem make_mem(int index)
39*6fee86a4SJeremy Kemp {
40*6fee86a4SJeremy Kemp     return (cl_mem) (size_t) (0x33333333 + index);
41*6fee86a4SJeremy Kemp }
42*6fee86a4SJeremy Kemp 
make_command_queue(int index)43*6fee86a4SJeremy Kemp static inline cl_command_queue make_command_queue(int index)
44*6fee86a4SJeremy Kemp {
45*6fee86a4SJeremy Kemp     return (cl_command_queue) (size_t) (0xc0c0c0c0 + index);
46*6fee86a4SJeremy Kemp }
47*6fee86a4SJeremy Kemp 
make_kernel(int index)48*6fee86a4SJeremy Kemp static inline cl_kernel make_kernel(int index)
49*6fee86a4SJeremy Kemp {
50*6fee86a4SJeremy Kemp     return (cl_kernel) (size_t) (0xcececece + index);
51*6fee86a4SJeremy Kemp }
52*6fee86a4SJeremy Kemp 
make_program(int index)53*6fee86a4SJeremy Kemp static inline cl_program make_program(int index)
54*6fee86a4SJeremy Kemp {
55*6fee86a4SJeremy Kemp     return (cl_program)(size_t)(0xcfcfcfcf + index);
56*6fee86a4SJeremy Kemp }
57*6fee86a4SJeremy Kemp 
make_command_buffer_khr(int index)58*6fee86a4SJeremy Kemp static inline cl_command_buffer_khr make_command_buffer_khr(int index)
59*6fee86a4SJeremy Kemp {
60*6fee86a4SJeremy Kemp     return (cl_command_buffer_khr)(size_t)(0x8f8f8f8f + index);
61*6fee86a4SJeremy Kemp }
62*6fee86a4SJeremy Kemp 
make_event(int index)63*6fee86a4SJeremy Kemp static inline cl_event make_event(int index)
64*6fee86a4SJeremy Kemp {
65*6fee86a4SJeremy Kemp     return (cl_event)(size_t)(0xd0d0d0d0 + index);
66*6fee86a4SJeremy Kemp }
67*6fee86a4SJeremy Kemp 
68*6fee86a4SJeremy Kemp #if defined(cl_khr_semaphore)
make_semaphore_khr(int index)69*6fee86a4SJeremy Kemp static inline cl_semaphore_khr make_semaphore_khr(int index)
70*6fee86a4SJeremy Kemp {
71*6fee86a4SJeremy Kemp     return (cl_semaphore_khr)(size_t)(0xa0b0c0e0 + index);
72*6fee86a4SJeremy Kemp }
73*6fee86a4SJeremy Kemp #endif
74*6fee86a4SJeremy Kemp 
75*6fee86a4SJeremy Kemp /* Pools of pre-allocated wrapped objects for tests.
76*6fee86a4SJeremy Kemp  */
77*6fee86a4SJeremy Kemp static const int POOL_MAX = 5;
78*6fee86a4SJeremy Kemp static cl::Platform platformPool[POOL_MAX];
79*6fee86a4SJeremy Kemp static cl::Context contextPool[POOL_MAX];
80*6fee86a4SJeremy Kemp static cl::CommandQueue commandQueuePool[POOL_MAX];
81*6fee86a4SJeremy Kemp static cl::Buffer bufferPool[POOL_MAX];
82*6fee86a4SJeremy Kemp static cl::Image2D image2DPool[POOL_MAX];
83*6fee86a4SJeremy Kemp static cl::Image3D image3DPool[POOL_MAX];
84*6fee86a4SJeremy Kemp static cl::Kernel kernelPool[POOL_MAX];
85*6fee86a4SJeremy Kemp static cl::Program programPool[POOL_MAX];
86*6fee86a4SJeremy Kemp #if defined(cl_khr_command_buffer)
87*6fee86a4SJeremy Kemp static cl::CommandBufferKhr commandBufferKhrPool[POOL_MAX];
88*6fee86a4SJeremy Kemp #endif
89*6fee86a4SJeremy Kemp #if defined(cl_khr_semaphore)
90*6fee86a4SJeremy Kemp static cl::Semaphore semaphorePool[POOL_MAX];
91*6fee86a4SJeremy Kemp #endif
92*6fee86a4SJeremy Kemp static cl::Device devicePool[POOL_MAX];
93*6fee86a4SJeremy Kemp 
94*6fee86a4SJeremy Kemp /****************************************************************************
95*6fee86a4SJeremy Kemp  * Stub functions shared by multiple tests
96*6fee86a4SJeremy Kemp  ****************************************************************************/
97*6fee86a4SJeremy Kemp /**
98*6fee86a4SJeremy Kemp  * Stub implementation of clGetCommandQueueInfo that returns the first context.
99*6fee86a4SJeremy Kemp  */
clGetCommandQueueInfo_context(cl_command_queue id,cl_command_queue_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)100*6fee86a4SJeremy Kemp static cl_int clGetCommandQueueInfo_context(
101*6fee86a4SJeremy Kemp     cl_command_queue id,
102*6fee86a4SJeremy Kemp     cl_command_queue_info param_name,
103*6fee86a4SJeremy Kemp     size_t param_value_size,
104*6fee86a4SJeremy Kemp     void *param_value,
105*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
106*6fee86a4SJeremy Kemp     int num_calls)
107*6fee86a4SJeremy Kemp {
108*6fee86a4SJeremy Kemp     (void) id;
109*6fee86a4SJeremy Kemp     (void) num_calls;
110*6fee86a4SJeremy Kemp 
111*6fee86a4SJeremy Kemp 
112*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_QUEUE_CONTEXT, param_name);
113*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_context));
114*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
115*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_context);
116*6fee86a4SJeremy Kemp     if (param_value != nullptr)
117*6fee86a4SJeremy Kemp         *(cl_context *)param_value = make_context(0);
118*6fee86a4SJeremy Kemp 
119*6fee86a4SJeremy Kemp     return CL_SUCCESS;
120*6fee86a4SJeremy Kemp }
121*6fee86a4SJeremy Kemp 
122*6fee86a4SJeremy Kemp /**
123*6fee86a4SJeremy Kemp  * Stub implementation of clGetDeviceInfo that just returns the first platform.
124*6fee86a4SJeremy Kemp  */
clGetDeviceInfo_platform(cl_device_id id,cl_device_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)125*6fee86a4SJeremy Kemp static cl_int clGetDeviceInfo_platform(
126*6fee86a4SJeremy Kemp     cl_device_id id,
127*6fee86a4SJeremy Kemp     cl_device_info param_name,
128*6fee86a4SJeremy Kemp     size_t param_value_size,
129*6fee86a4SJeremy Kemp     void *param_value,
130*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
131*6fee86a4SJeremy Kemp     int num_calls)
132*6fee86a4SJeremy Kemp {
133*6fee86a4SJeremy Kemp     (void) id;
134*6fee86a4SJeremy Kemp     (void) num_calls;
135*6fee86a4SJeremy Kemp 
136*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_DEVICE_PLATFORM, param_name);
137*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_platform_id));
138*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
139*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_platform_id);
140*6fee86a4SJeremy Kemp     if (param_value != nullptr)
141*6fee86a4SJeremy Kemp         *(cl_platform_id *) param_value = make_platform_id(0);
142*6fee86a4SJeremy Kemp     return CL_SUCCESS;
143*6fee86a4SJeremy Kemp }
144*6fee86a4SJeremy Kemp 
145*6fee86a4SJeremy Kemp /**
146*6fee86a4SJeremy Kemp  * Stub implementation of clGetContextInfo that just returns the first device.
147*6fee86a4SJeremy Kemp  */
clGetContextInfo_device(cl_context id,cl_context_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)148*6fee86a4SJeremy Kemp static cl_int clGetContextInfo_device(
149*6fee86a4SJeremy Kemp     cl_context id,
150*6fee86a4SJeremy Kemp     cl_context_info param_name,
151*6fee86a4SJeremy Kemp     size_t param_value_size,
152*6fee86a4SJeremy Kemp     void *param_value,
153*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
154*6fee86a4SJeremy Kemp     int num_calls)
155*6fee86a4SJeremy Kemp {
156*6fee86a4SJeremy Kemp     (void) id;
157*6fee86a4SJeremy Kemp     (void) num_calls;
158*6fee86a4SJeremy Kemp 
159*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_CONTEXT_DEVICES, param_name);
160*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_device_id));
161*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
162*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_device_id);
163*6fee86a4SJeremy Kemp     if (param_value != nullptr)
164*6fee86a4SJeremy Kemp         *(cl_device_id *) param_value = make_device_id(0);
165*6fee86a4SJeremy Kemp     return CL_SUCCESS;
166*6fee86a4SJeremy Kemp }
167*6fee86a4SJeremy Kemp 
168*6fee86a4SJeremy Kemp 
169*6fee86a4SJeremy Kemp /**
170*6fee86a4SJeremy Kemp  * Stub implementation of clGetPlatformInfo that returns a specific version.
171*6fee86a4SJeremy Kemp  * It also checks that the id is the zeroth platform.
172*6fee86a4SJeremy Kemp  */
clGetPlatformInfo_version(cl_platform_id id,cl_platform_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,const char * version)173*6fee86a4SJeremy Kemp static cl_int clGetPlatformInfo_version(
174*6fee86a4SJeremy Kemp     cl_platform_id id,
175*6fee86a4SJeremy Kemp     cl_platform_info param_name,
176*6fee86a4SJeremy Kemp     size_t param_value_size,
177*6fee86a4SJeremy Kemp     void *param_value,
178*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
179*6fee86a4SJeremy Kemp     const char *version)
180*6fee86a4SJeremy Kemp {
181*6fee86a4SJeremy Kemp     size_t bytes = strlen(version) + 1;
182*6fee86a4SJeremy Kemp 
183*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(id);
184*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_platform_id(0), id);
185*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_PLATFORM_VERSION, param_name);
186*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= bytes);
187*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
188*6fee86a4SJeremy Kemp         *param_value_size_ret = bytes;
189*6fee86a4SJeremy Kemp     if (param_value != nullptr)
190*6fee86a4SJeremy Kemp         strcpy((char *) param_value, version);
191*6fee86a4SJeremy Kemp     return CL_SUCCESS;
192*6fee86a4SJeremy Kemp }
193*6fee86a4SJeremy Kemp 
194*6fee86a4SJeremy Kemp /**
195*6fee86a4SJeremy Kemp  * A stub for clGetPlatformInfo that will only support querying
196*6fee86a4SJeremy Kemp  * CL_PLATFORM_VERSION, and will return version 1.1.
197*6fee86a4SJeremy Kemp  */
clGetPlatformInfo_version_1_1(cl_platform_id id,cl_platform_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)198*6fee86a4SJeremy Kemp static cl_int clGetPlatformInfo_version_1_1(
199*6fee86a4SJeremy Kemp     cl_platform_id id,
200*6fee86a4SJeremy Kemp     cl_platform_info param_name,
201*6fee86a4SJeremy Kemp     size_t param_value_size,
202*6fee86a4SJeremy Kemp     void *param_value,
203*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
204*6fee86a4SJeremy Kemp     int num_calls)
205*6fee86a4SJeremy Kemp {
206*6fee86a4SJeremy Kemp     (void) num_calls;
207*6fee86a4SJeremy Kemp     return clGetPlatformInfo_version(
208*6fee86a4SJeremy Kemp         id, param_name, param_value_size, param_value,
209*6fee86a4SJeremy Kemp         param_value_size_ret, "OpenCL 1.1 Mock");
210*6fee86a4SJeremy Kemp }
211*6fee86a4SJeremy Kemp 
212*6fee86a4SJeremy Kemp /**
213*6fee86a4SJeremy Kemp  * A stub for clGetPlatformInfo that will only support querying
214*6fee86a4SJeremy Kemp  * CL_PLATFORM_VERSION, and will return version 1.2.
215*6fee86a4SJeremy Kemp  */
clGetPlatformInfo_version_1_2(cl_platform_id id,cl_platform_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)216*6fee86a4SJeremy Kemp static cl_int clGetPlatformInfo_version_1_2(
217*6fee86a4SJeremy Kemp     cl_platform_id id,
218*6fee86a4SJeremy Kemp     cl_platform_info param_name,
219*6fee86a4SJeremy Kemp     size_t param_value_size,
220*6fee86a4SJeremy Kemp     void *param_value,
221*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
222*6fee86a4SJeremy Kemp     int num_calls)
223*6fee86a4SJeremy Kemp {
224*6fee86a4SJeremy Kemp     (void) num_calls;
225*6fee86a4SJeremy Kemp     return clGetPlatformInfo_version(
226*6fee86a4SJeremy Kemp         id, param_name, param_value_size, param_value,
227*6fee86a4SJeremy Kemp         param_value_size_ret, "OpenCL 1.2 Mock");
228*6fee86a4SJeremy Kemp }
229*6fee86a4SJeremy Kemp 
230*6fee86a4SJeremy Kemp /**
231*6fee86a4SJeremy Kemp  * A stub for clGetPlatformInfo that will only support querying
232*6fee86a4SJeremy Kemp  * CL_PLATFORM_VERSION, and will return version 2.0.
233*6fee86a4SJeremy Kemp  */
clGetPlatformInfo_version_2_0(cl_platform_id id,cl_platform_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)234*6fee86a4SJeremy Kemp static cl_int clGetPlatformInfo_version_2_0(
235*6fee86a4SJeremy Kemp     cl_platform_id id,
236*6fee86a4SJeremy Kemp     cl_platform_info param_name,
237*6fee86a4SJeremy Kemp     size_t param_value_size,
238*6fee86a4SJeremy Kemp     void *param_value,
239*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
240*6fee86a4SJeremy Kemp     int num_calls)
241*6fee86a4SJeremy Kemp {
242*6fee86a4SJeremy Kemp     (void) num_calls;
243*6fee86a4SJeremy Kemp     return clGetPlatformInfo_version(
244*6fee86a4SJeremy Kemp         id, param_name, param_value_size, param_value,
245*6fee86a4SJeremy Kemp         param_value_size_ret, "OpenCL 2.0 Mock");
246*6fee86a4SJeremy Kemp }
247*6fee86a4SJeremy Kemp 
248*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 300
249*6fee86a4SJeremy Kemp /**
250*6fee86a4SJeremy Kemp  * A stub for clGetPlatformInfo that will only support querying
251*6fee86a4SJeremy Kemp  * CL_PLATFORM_VERSION, and will return version 3.0.
252*6fee86a4SJeremy Kemp  */
clGetPlatformInfo_version_3_0(cl_platform_id id,cl_platform_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)253*6fee86a4SJeremy Kemp static cl_int clGetPlatformInfo_version_3_0(
254*6fee86a4SJeremy Kemp     cl_platform_id id,
255*6fee86a4SJeremy Kemp     cl_platform_info param_name,
256*6fee86a4SJeremy Kemp     size_t param_value_size,
257*6fee86a4SJeremy Kemp     void *param_value,
258*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
259*6fee86a4SJeremy Kemp     int num_calls)
260*6fee86a4SJeremy Kemp {
261*6fee86a4SJeremy Kemp     (void) num_calls;
262*6fee86a4SJeremy Kemp     return clGetPlatformInfo_version(
263*6fee86a4SJeremy Kemp         id, param_name, param_value_size, param_value,
264*6fee86a4SJeremy Kemp         param_value_size_ret, "OpenCL 3.0 Mock");
265*6fee86a4SJeremy Kemp }
266*6fee86a4SJeremy Kemp #endif
267*6fee86a4SJeremy Kemp 
268*6fee86a4SJeremy Kemp /* Simulated reference counts. The table points to memory held by the caller.
269*6fee86a4SJeremy Kemp  * This makes things simpler in the common case of only one object to be
270*6fee86a4SJeremy Kemp  * reference counted.
271*6fee86a4SJeremy Kemp  */
272*6fee86a4SJeremy Kemp class RefcountTable
273*6fee86a4SJeremy Kemp {
274*6fee86a4SJeremy Kemp private:
275*6fee86a4SJeremy Kemp     size_t n; // number of objects
276*6fee86a4SJeremy Kemp     void * const *objects; // object IDs
277*6fee86a4SJeremy Kemp     int *refcounts;        // current refcounts
278*6fee86a4SJeremy Kemp 
find(void * object)279*6fee86a4SJeremy Kemp     size_t find(void *object)
280*6fee86a4SJeremy Kemp     {
281*6fee86a4SJeremy Kemp         size_t idx = 0;
282*6fee86a4SJeremy Kemp         while (idx < n && objects[idx] != object)
283*6fee86a4SJeremy Kemp             idx++;
284*6fee86a4SJeremy Kemp         TEST_ASSERT(idx < n);
285*6fee86a4SJeremy Kemp         TEST_ASSERT(refcounts[idx] > 0); // otherwise object has been destroyed
286*6fee86a4SJeremy Kemp         return idx;
287*6fee86a4SJeremy Kemp     }
288*6fee86a4SJeremy Kemp 
289*6fee86a4SJeremy Kemp public:
RefcountTable()290*6fee86a4SJeremy Kemp     RefcountTable() : n(0), objects(nullptr), refcounts(nullptr) {}
291*6fee86a4SJeremy Kemp 
init(size_t n,void * const * objects,int * refcounts)292*6fee86a4SJeremy Kemp     void init(size_t n, void * const *objects, int *refcounts)
293*6fee86a4SJeremy Kemp     {
294*6fee86a4SJeremy Kemp         this->n = n;
295*6fee86a4SJeremy Kemp         this->objects = objects;
296*6fee86a4SJeremy Kemp         this->refcounts = refcounts;
297*6fee86a4SJeremy Kemp     }
298*6fee86a4SJeremy Kemp 
reset()299*6fee86a4SJeremy Kemp     void reset()
300*6fee86a4SJeremy Kemp     {
301*6fee86a4SJeremy Kemp         init(0, nullptr, nullptr);
302*6fee86a4SJeremy Kemp     }
303*6fee86a4SJeremy Kemp 
retain(void * object)304*6fee86a4SJeremy Kemp     cl_int retain(void *object)
305*6fee86a4SJeremy Kemp     {
306*6fee86a4SJeremy Kemp         size_t idx = find(object);
307*6fee86a4SJeremy Kemp         ++refcounts[idx];
308*6fee86a4SJeremy Kemp         return CL_SUCCESS;
309*6fee86a4SJeremy Kemp     }
310*6fee86a4SJeremy Kemp 
release(void * object)311*6fee86a4SJeremy Kemp     cl_int release(void *object)
312*6fee86a4SJeremy Kemp     {
313*6fee86a4SJeremy Kemp         size_t idx = find(object);
314*6fee86a4SJeremy Kemp         --refcounts[idx];
315*6fee86a4SJeremy Kemp         return CL_SUCCESS;
316*6fee86a4SJeremy Kemp     }
317*6fee86a4SJeremy Kemp };
318*6fee86a4SJeremy Kemp 
319*6fee86a4SJeremy Kemp /* Stubs for retain/release calls that track reference counts. The stubs
320*6fee86a4SJeremy Kemp  * check that the reference count never becomes negative and that a zero
321*6fee86a4SJeremy Kemp  * reference count is never incremented.
322*6fee86a4SJeremy Kemp  *
323*6fee86a4SJeremy Kemp  * Use the prepareRefcount* calls to set up the global variables first.
324*6fee86a4SJeremy Kemp  */
325*6fee86a4SJeremy Kemp 
326*6fee86a4SJeremy Kemp #define MAKE_REFCOUNT_STUBS(cl_type, retainfunc, releasefunc, table) \
327*6fee86a4SJeremy Kemp     static RefcountTable table; \
328*6fee86a4SJeremy Kemp     static cl_int retainfunc ## _refcount(cl_type object, int num_calls) \
329*6fee86a4SJeremy Kemp     { \
330*6fee86a4SJeremy Kemp         (void) num_calls; \
331*6fee86a4SJeremy Kemp         return table.retain(object); \
332*6fee86a4SJeremy Kemp     } \
333*6fee86a4SJeremy Kemp     static cl_int releasefunc ## _refcount(cl_type object, int num_calls) \
334*6fee86a4SJeremy Kemp     { \
335*6fee86a4SJeremy Kemp         (void) num_calls; \
336*6fee86a4SJeremy Kemp         return table.release(object); \
337*6fee86a4SJeremy Kemp     } \
338*6fee86a4SJeremy Kemp     static void prepare_ ## table(size_t n, cl_type const *objects, int *refcounts) \
339*6fee86a4SJeremy Kemp     { \
340*6fee86a4SJeremy Kemp         table.init(n, (void * const *) objects, refcounts); \
341*6fee86a4SJeremy Kemp         retainfunc ## _StubWithCallback(retainfunc ## _refcount); \
342*6fee86a4SJeremy Kemp         releasefunc ## _StubWithCallback(releasefunc ## _refcount); \
343*6fee86a4SJeremy Kemp     }
344*6fee86a4SJeremy Kemp 
MAKE_REFCOUNT_STUBS(cl_program,clRetainProgram,clReleaseProgram,programRefcounts)345*6fee86a4SJeremy Kemp MAKE_REFCOUNT_STUBS(cl_program, clRetainProgram, clReleaseProgram, programRefcounts)
346*6fee86a4SJeremy Kemp MAKE_REFCOUNT_STUBS(cl_command_queue, clRetainCommandQueue, clReleaseCommandQueue, commandQueueRefcounts)
347*6fee86a4SJeremy Kemp MAKE_REFCOUNT_STUBS(cl_device_id, clRetainDevice, clReleaseDevice, deviceRefcounts)
348*6fee86a4SJeremy Kemp MAKE_REFCOUNT_STUBS(cl_context, clRetainContext, clReleaseContext, contextRefcounts)
349*6fee86a4SJeremy Kemp MAKE_REFCOUNT_STUBS(cl_mem, clRetainMemObject, clReleaseMemObject, memRefcounts)
350*6fee86a4SJeremy Kemp // Deactivated because unused for now.
351*6fee86a4SJeremy Kemp #if defined(cl_khr_command_buffer) && 0
352*6fee86a4SJeremy Kemp MAKE_REFCOUNT_STUBS(cl_command_buffer_khr, clRetainCommandBufferKHR, clReleaseCommandBufferKHR, commandBufferKhrRefcounts)
353*6fee86a4SJeremy Kemp #endif
354*6fee86a4SJeremy Kemp 
355*6fee86a4SJeremy Kemp /* The indirection through MAKE_MOVE_TESTS2 with a prefix parameter is to
356*6fee86a4SJeremy Kemp  * prevent the simple-minded parser from Unity from identifying tests from the
357*6fee86a4SJeremy Kemp  * macro value.
358*6fee86a4SJeremy Kemp  */
359*6fee86a4SJeremy Kemp #ifdef TEST_RVALUE_REFERENCES
360*6fee86a4SJeremy Kemp #define MAKE_MOVE_TESTS2(prefix, type, makeFunc, releaseFunc, pool) \
361*6fee86a4SJeremy Kemp     void prefix ## MoveAssign ## type ## NonNull(void) \
362*6fee86a4SJeremy Kemp     { \
363*6fee86a4SJeremy Kemp         releaseFunc ## _ExpectAndReturn(makeFunc(0), CL_SUCCESS); \
364*6fee86a4SJeremy Kemp         pool[0] = std::move(pool[1]); \
365*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_PTR(makeFunc(1), pool[0]()); \
366*6fee86a4SJeremy Kemp         TEST_ASSERT_NULL(pool[1]()); \
367*6fee86a4SJeremy Kemp     } \
368*6fee86a4SJeremy Kemp     \
369*6fee86a4SJeremy Kemp     void prefix ## MoveAssign ## type ## Null(void) \
370*6fee86a4SJeremy Kemp     { \
371*6fee86a4SJeremy Kemp         pool[0]() = nullptr; \
372*6fee86a4SJeremy Kemp         pool[0] = std::move(pool[1]); \
373*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_PTR(makeFunc(1), pool[0]()); \
374*6fee86a4SJeremy Kemp         TEST_ASSERT_NULL(pool[1]()); \
375*6fee86a4SJeremy Kemp     } \
376*6fee86a4SJeremy Kemp     \
377*6fee86a4SJeremy Kemp     void prefix ## MoveConstruct ## type ## NonNull(void) \
378*6fee86a4SJeremy Kemp     { \
379*6fee86a4SJeremy Kemp         cl::type tmp(std::move(pool[0])); \
380*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_PTR(makeFunc(0), tmp()); \
381*6fee86a4SJeremy Kemp         TEST_ASSERT_NULL(pool[0]()); \
382*6fee86a4SJeremy Kemp         tmp() = nullptr; \
383*6fee86a4SJeremy Kemp     } \
384*6fee86a4SJeremy Kemp     \
385*6fee86a4SJeremy Kemp     void prefix ## MoveConstruct ## type ## Null(void) \
386*6fee86a4SJeremy Kemp     { \
387*6fee86a4SJeremy Kemp         cl::type empty; \
388*6fee86a4SJeremy Kemp         cl::type tmp(std::move(empty)); \
389*6fee86a4SJeremy Kemp         TEST_ASSERT_NULL(tmp()); \
390*6fee86a4SJeremy Kemp         TEST_ASSERT_NULL(empty()); \
391*6fee86a4SJeremy Kemp     }
392*6fee86a4SJeremy Kemp #else
393*6fee86a4SJeremy Kemp #define MAKE_MOVE_TESTS2(prefix, type, makeFunc, releaseFunc, pool) \
394*6fee86a4SJeremy Kemp     void prefix ## MoveAssign ## type ## NonNull(void) {} \
395*6fee86a4SJeremy Kemp     void prefix ## MoveAssign ## type ## Null(void) {} \
396*6fee86a4SJeremy Kemp     void prefix ## MoveConstruct ## type ## NonNull(void) {} \
397*6fee86a4SJeremy Kemp     void prefix ## MoveConstruct ## type ## Null(void) {}
398*6fee86a4SJeremy Kemp #endif // !TEST_RVALUE_REFERENCES
399*6fee86a4SJeremy Kemp #define MAKE_MOVE_TESTS(type, makeFunc, releaseFunc, pool) \
400*6fee86a4SJeremy Kemp     MAKE_MOVE_TESTS2(test, type, makeFunc, releaseFunc, pool)
401*6fee86a4SJeremy Kemp 
402*6fee86a4SJeremy Kemp void setUp(void)
403*6fee86a4SJeremy Kemp {
404*6fee86a4SJeremy Kemp     /* init extensions addresses with mocked functions */
405*6fee86a4SJeremy Kemp #if defined(cl_khr_command_buffer)
406*6fee86a4SJeremy Kemp     cl::pfn_clCreateCommandBufferKHR = ::clCreateCommandBufferKHR;
407*6fee86a4SJeremy Kemp     cl::pfn_clFinalizeCommandBufferKHR = ::clFinalizeCommandBufferKHR;
408*6fee86a4SJeremy Kemp     cl::pfn_clRetainCommandBufferKHR = ::clRetainCommandBufferKHR;
409*6fee86a4SJeremy Kemp     cl::pfn_clReleaseCommandBufferKHR = ::clReleaseCommandBufferKHR;
410*6fee86a4SJeremy Kemp     cl::pfn_clGetCommandBufferInfoKHR = ::clGetCommandBufferInfoKHR;
411*6fee86a4SJeremy Kemp #endif
412*6fee86a4SJeremy Kemp #if defined(cl_khr_semaphore)
413*6fee86a4SJeremy Kemp     cl::pfn_clCreateSemaphoreWithPropertiesKHR = ::clCreateSemaphoreWithPropertiesKHR;
414*6fee86a4SJeremy Kemp     cl::pfn_clReleaseSemaphoreKHR = ::clReleaseSemaphoreKHR;
415*6fee86a4SJeremy Kemp     cl::pfn_clRetainSemaphoreKHR = ::clRetainSemaphoreKHR;
416*6fee86a4SJeremy Kemp     cl::pfn_clEnqueueWaitSemaphoresKHR = ::clEnqueueWaitSemaphoresKHR;
417*6fee86a4SJeremy Kemp     cl::pfn_clEnqueueSignalSemaphoresKHR = ::clEnqueueSignalSemaphoresKHR;
418*6fee86a4SJeremy Kemp     cl::pfn_clGetSemaphoreInfoKHR = ::clGetSemaphoreInfoKHR;
419*6fee86a4SJeremy Kemp #endif
420*6fee86a4SJeremy Kemp #if defined(cl_khr_external_semaphore)
421*6fee86a4SJeremy Kemp     cl::pfn_clGetSemaphoreHandleForTypeKHR = ::clGetSemaphoreHandleForTypeKHR;
422*6fee86a4SJeremy Kemp #endif
423*6fee86a4SJeremy Kemp #ifdef cl_khr_external_memory
424*6fee86a4SJeremy Kemp     cl::pfn_clEnqueueAcquireExternalMemObjectsKHR = ::clEnqueueAcquireExternalMemObjectsKHR;
425*6fee86a4SJeremy Kemp     cl::pfn_clEnqueueReleaseExternalMemObjectsKHR = ::clEnqueueReleaseExternalMemObjectsKHR;
426*6fee86a4SJeremy Kemp #endif
427*6fee86a4SJeremy Kemp 
428*6fee86a4SJeremy Kemp #if defined(cl_ext_image_requirements_info)
429*6fee86a4SJeremy Kemp     cl::pfn_clGetImageRequirementsInfoEXT = ::clGetImageRequirementsInfoEXT;
430*6fee86a4SJeremy Kemp #endif
431*6fee86a4SJeremy Kemp 
432*6fee86a4SJeremy Kemp #if defined(cl_ext_device_fission)
433*6fee86a4SJeremy Kemp     cl::pfn_clCreateSubDevicesEXT = ::clCreateSubDevicesEXT;
434*6fee86a4SJeremy Kemp #endif
435*6fee86a4SJeremy Kemp 
436*6fee86a4SJeremy Kemp     /* We reach directly into the objects rather than using assignment to
437*6fee86a4SJeremy Kemp      * avoid the reference counting functions from being called.
438*6fee86a4SJeremy Kemp      */
439*6fee86a4SJeremy Kemp     for (int i = 0; i < POOL_MAX; i++)
440*6fee86a4SJeremy Kemp     {
441*6fee86a4SJeremy Kemp         platformPool[i]() = make_platform_id(i);
442*6fee86a4SJeremy Kemp         contextPool[i]() = make_context(i);
443*6fee86a4SJeremy Kemp         commandQueuePool[i]() = make_command_queue(i);
444*6fee86a4SJeremy Kemp         bufferPool[i]() = make_mem(i);
445*6fee86a4SJeremy Kemp         image2DPool[i]() = make_mem(i);
446*6fee86a4SJeremy Kemp         image3DPool[i]() = make_mem(i);
447*6fee86a4SJeremy Kemp         kernelPool[i]() = make_kernel(i);
448*6fee86a4SJeremy Kemp         programPool[i]() = make_program(i);
449*6fee86a4SJeremy Kemp #if defined(cl_khr_command_buffer)
450*6fee86a4SJeremy Kemp         commandBufferKhrPool[i]() = make_command_buffer_khr(i);
451*6fee86a4SJeremy Kemp #endif
452*6fee86a4SJeremy Kemp #if defined(cl_khr_semaphore)
453*6fee86a4SJeremy Kemp         semaphorePool[i]() = make_semaphore_khr(i);
454*6fee86a4SJeremy Kemp #endif
455*6fee86a4SJeremy Kemp         devicePool[i]() = make_device_id(i);
456*6fee86a4SJeremy Kemp     }
457*6fee86a4SJeremy Kemp 
458*6fee86a4SJeremy Kemp     programRefcounts.reset();
459*6fee86a4SJeremy Kemp     deviceRefcounts.reset();
460*6fee86a4SJeremy Kemp     contextRefcounts.reset();
461*6fee86a4SJeremy Kemp     memRefcounts.reset();
462*6fee86a4SJeremy Kemp }
463*6fee86a4SJeremy Kemp 
tearDown(void)464*6fee86a4SJeremy Kemp void tearDown(void)
465*6fee86a4SJeremy Kemp {
466*6fee86a4SJeremy Kemp     /* Wipe out the internal state to avoid a release call being made */
467*6fee86a4SJeremy Kemp     for (int i = 0; i < POOL_MAX; i++)
468*6fee86a4SJeremy Kemp     {
469*6fee86a4SJeremy Kemp         platformPool[i]() = nullptr;
470*6fee86a4SJeremy Kemp         contextPool[i]() = nullptr;
471*6fee86a4SJeremy Kemp         commandQueuePool[i]() = nullptr;
472*6fee86a4SJeremy Kemp         bufferPool[i]() = nullptr;
473*6fee86a4SJeremy Kemp         image2DPool[i]() = nullptr;
474*6fee86a4SJeremy Kemp         image3DPool[i]() = nullptr;
475*6fee86a4SJeremy Kemp         kernelPool[i]() = nullptr;
476*6fee86a4SJeremy Kemp         programPool[i]() = nullptr;
477*6fee86a4SJeremy Kemp         devicePool[i]() = nullptr;
478*6fee86a4SJeremy Kemp #if defined(cl_khr_command_buffer)
479*6fee86a4SJeremy Kemp         commandBufferKhrPool[i]() = nullptr;
480*6fee86a4SJeremy Kemp #endif
481*6fee86a4SJeremy Kemp #if defined(cl_khr_semaphore)
482*6fee86a4SJeremy Kemp         semaphorePool[i]() = nullptr;
483*6fee86a4SJeremy Kemp #endif
484*6fee86a4SJeremy Kemp     }
485*6fee86a4SJeremy Kemp 
486*6fee86a4SJeremy Kemp #if defined(cl_khr_command_buffer)
487*6fee86a4SJeremy Kemp     cl::pfn_clCreateCommandBufferKHR = nullptr;
488*6fee86a4SJeremy Kemp     cl::pfn_clFinalizeCommandBufferKHR = nullptr;
489*6fee86a4SJeremy Kemp     cl::pfn_clRetainCommandBufferKHR = nullptr;
490*6fee86a4SJeremy Kemp     cl::pfn_clReleaseCommandBufferKHR = nullptr;
491*6fee86a4SJeremy Kemp     cl::pfn_clGetCommandBufferInfoKHR = nullptr;
492*6fee86a4SJeremy Kemp #endif
493*6fee86a4SJeremy Kemp #if defined(cl_khr_semaphore)
494*6fee86a4SJeremy Kemp     cl::pfn_clCreateSemaphoreWithPropertiesKHR = nullptr;
495*6fee86a4SJeremy Kemp     cl::pfn_clReleaseSemaphoreKHR = nullptr;
496*6fee86a4SJeremy Kemp     cl::pfn_clRetainSemaphoreKHR = nullptr;
497*6fee86a4SJeremy Kemp     cl::pfn_clEnqueueWaitSemaphoresKHR = nullptr;
498*6fee86a4SJeremy Kemp     cl::pfn_clEnqueueSignalSemaphoresKHR = nullptr;
499*6fee86a4SJeremy Kemp     cl::pfn_clGetSemaphoreInfoKHR = nullptr;
500*6fee86a4SJeremy Kemp #endif
501*6fee86a4SJeremy Kemp #ifdef cl_khr_external_memory
502*6fee86a4SJeremy Kemp     cl::pfn_clEnqueueAcquireExternalMemObjectsKHR = nullptr;
503*6fee86a4SJeremy Kemp     cl::pfn_clEnqueueReleaseExternalMemObjectsKHR = nullptr;
504*6fee86a4SJeremy Kemp #endif
505*6fee86a4SJeremy Kemp }
506*6fee86a4SJeremy Kemp 
507*6fee86a4SJeremy Kemp /****************************************************************************
508*6fee86a4SJeremy Kemp  * Tests for cl::Context
509*6fee86a4SJeremy Kemp  ****************************************************************************/
510*6fee86a4SJeremy Kemp 
testCopyContextNonNull(void)511*6fee86a4SJeremy Kemp void testCopyContextNonNull(void)
512*6fee86a4SJeremy Kemp {
513*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
514*6fee86a4SJeremy Kemp     clRetainContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
515*6fee86a4SJeremy Kemp 
516*6fee86a4SJeremy Kemp     contextPool[0] = contextPool[1];
517*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(1), contextPool[0]());
518*6fee86a4SJeremy Kemp }
519*6fee86a4SJeremy Kemp 
520*6fee86a4SJeremy Kemp void testMoveAssignContextNonNull(void);
521*6fee86a4SJeremy Kemp void testMoveAssignContextNull(void);
522*6fee86a4SJeremy Kemp void testMoveConstructContextNonNull(void);
523*6fee86a4SJeremy Kemp void testMoveConstructContextNull(void);
MAKE_MOVE_TESTS(Context,make_context,clReleaseContext,contextPool)524*6fee86a4SJeremy Kemp MAKE_MOVE_TESTS(Context, make_context, clReleaseContext, contextPool)
525*6fee86a4SJeremy Kemp 
526*6fee86a4SJeremy Kemp /// Stub for querying CL_CONTEXT_DEVICES that returns two devices
527*6fee86a4SJeremy Kemp static cl_int clGetContextInfo_testContextGetDevices(
528*6fee86a4SJeremy Kemp     cl_context context,
529*6fee86a4SJeremy Kemp     cl_context_info param_name,
530*6fee86a4SJeremy Kemp     size_t param_value_size,
531*6fee86a4SJeremy Kemp     void *param_value,
532*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
533*6fee86a4SJeremy Kemp     int num_calls)
534*6fee86a4SJeremy Kemp {
535*6fee86a4SJeremy Kemp     (void) num_calls;
536*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context);
537*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_CONTEXT_DEVICES, param_name);
538*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= 2 * sizeof(cl_device_id));
539*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
540*6fee86a4SJeremy Kemp         *param_value_size_ret = 2 * sizeof(cl_device_id);
541*6fee86a4SJeremy Kemp     if (param_value != nullptr)
542*6fee86a4SJeremy Kemp     {
543*6fee86a4SJeremy Kemp         cl_device_id *devices = (cl_device_id *) param_value;
544*6fee86a4SJeremy Kemp         devices[0] = make_device_id(0);
545*6fee86a4SJeremy Kemp         devices[1] = make_device_id(1);
546*6fee86a4SJeremy Kemp     }
547*6fee86a4SJeremy Kemp     return CL_SUCCESS;
548*6fee86a4SJeremy Kemp }
549*6fee86a4SJeremy Kemp 
550*6fee86a4SJeremy Kemp /// Test that queried devices are not refcounted
testContextGetDevices1_1(void)551*6fee86a4SJeremy Kemp void testContextGetDevices1_1(void)
552*6fee86a4SJeremy Kemp {
553*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_testContextGetDevices);
554*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
555*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
556*6fee86a4SJeremy Kemp 
557*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl::Device> devices = contextPool[0].getInfo<CL_CONTEXT_DEVICES>();
558*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(2, devices.size());
559*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(0), devices[0]());
560*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(1), devices[1]());
561*6fee86a4SJeremy Kemp }
562*6fee86a4SJeremy Kemp 
563*6fee86a4SJeremy Kemp /// Test that queried devices are correctly refcounted
testContextGetDevices1_2(void)564*6fee86a4SJeremy Kemp void testContextGetDevices1_2(void)
565*6fee86a4SJeremy Kemp {
566*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_testContextGetDevices);
567*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
568*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
569*6fee86a4SJeremy Kemp 
570*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
571*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
572*6fee86a4SJeremy Kemp 
573*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl::Device> devices = contextPool[0].getInfo<CL_CONTEXT_DEVICES>();
574*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(2, devices.size());
575*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(0), devices[0]());
576*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(1), devices[1]());
577*6fee86a4SJeremy Kemp 
578*6fee86a4SJeremy Kemp     // Prevent release in the destructor
579*6fee86a4SJeremy Kemp     devices[0]() = nullptr;
580*6fee86a4SJeremy Kemp     devices[1]() = nullptr;
581*6fee86a4SJeremy Kemp }
582*6fee86a4SJeremy Kemp 
583*6fee86a4SJeremy Kemp #if !defined(__APPLE__) && !defined(__MACOS)
584*6fee86a4SJeremy Kemp // This is used to get a list of all platforms, so expect two calls
585*6fee86a4SJeremy Kemp // First, return to say we have two platforms
586*6fee86a4SJeremy Kemp // Then return the two platform id_s
clGetPlatformIDs_testContextFromType(cl_uint num_entries,cl_platform_id * platforms,cl_uint * num_platforms,int num_calls)587*6fee86a4SJeremy Kemp static cl_int clGetPlatformIDs_testContextFromType(
588*6fee86a4SJeremy Kemp     cl_uint num_entries,
589*6fee86a4SJeremy Kemp     cl_platform_id *platforms,
590*6fee86a4SJeremy Kemp     cl_uint *num_platforms,
591*6fee86a4SJeremy Kemp     int num_calls)
592*6fee86a4SJeremy Kemp {
593*6fee86a4SJeremy Kemp     if (num_calls == 0)
594*6fee86a4SJeremy Kemp     {
595*6fee86a4SJeremy Kemp         TEST_ASSERT_NULL(platforms);
596*6fee86a4SJeremy Kemp         TEST_ASSERT_NOT_NULL(num_platforms);
597*6fee86a4SJeremy Kemp         *num_platforms = 2;
598*6fee86a4SJeremy Kemp         return CL_SUCCESS;
599*6fee86a4SJeremy Kemp     }
600*6fee86a4SJeremy Kemp     else if (num_calls == 1)
601*6fee86a4SJeremy Kemp     {
602*6fee86a4SJeremy Kemp         TEST_ASSERT_NOT_NULL(platforms);
603*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(2, num_entries);
604*6fee86a4SJeremy Kemp         platforms[0] = make_platform_id(0);
605*6fee86a4SJeremy Kemp         platforms[1] = make_platform_id(1);
606*6fee86a4SJeremy Kemp         return CL_SUCCESS;
607*6fee86a4SJeremy Kemp     }
608*6fee86a4SJeremy Kemp     else
609*6fee86a4SJeremy Kemp     {
610*6fee86a4SJeremy Kemp         TEST_FAIL_MESSAGE("clGetPlatformIDs called too many times");
611*6fee86a4SJeremy Kemp         return CL_INVALID_VALUE;
612*6fee86a4SJeremy Kemp     }
613*6fee86a4SJeremy Kemp }
614*6fee86a4SJeremy Kemp #endif
615*6fee86a4SJeremy Kemp 
616*6fee86a4SJeremy Kemp #if !defined(__APPLE__) && !defined(__MACOS)
617*6fee86a4SJeremy Kemp // Expect three calls to this
618*6fee86a4SJeremy Kemp // 1. Platform 1, we have no GPUs
619*6fee86a4SJeremy Kemp // 2. Platform 2, we have two GPUs
620*6fee86a4SJeremy Kemp // 3. Here are the two cl_device_id's
clGetDeviceIDs_testContextFromType(cl_platform_id platform,cl_device_type device_type,cl_uint num_entries,cl_device_id * devices,cl_uint * num_devices,int num_calls)621*6fee86a4SJeremy Kemp static cl_int clGetDeviceIDs_testContextFromType(
622*6fee86a4SJeremy Kemp     cl_platform_id  platform,
623*6fee86a4SJeremy Kemp     cl_device_type  device_type,
624*6fee86a4SJeremy Kemp     cl_uint  num_entries,
625*6fee86a4SJeremy Kemp     cl_device_id  *devices,
626*6fee86a4SJeremy Kemp     cl_uint  *num_devices,
627*6fee86a4SJeremy Kemp     int num_calls)
628*6fee86a4SJeremy Kemp {
629*6fee86a4SJeremy Kemp     if (num_calls == 0)
630*6fee86a4SJeremy Kemp     {
631*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_PTR(make_platform_id(0), platform);
632*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(CL_DEVICE_TYPE_GPU, device_type);
633*6fee86a4SJeremy Kemp         TEST_ASSERT_NOT_NULL(num_devices);
634*6fee86a4SJeremy Kemp         return CL_DEVICE_NOT_FOUND;
635*6fee86a4SJeremy Kemp     }
636*6fee86a4SJeremy Kemp     else if (num_calls == 1)
637*6fee86a4SJeremy Kemp     {
638*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_PTR(make_platform_id(1), platform);
639*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(CL_DEVICE_TYPE_GPU, device_type);
640*6fee86a4SJeremy Kemp         TEST_ASSERT_NOT_NULL(num_devices);
641*6fee86a4SJeremy Kemp         *num_devices = 2;
642*6fee86a4SJeremy Kemp         return CL_SUCCESS;
643*6fee86a4SJeremy Kemp     }
644*6fee86a4SJeremy Kemp     else if (num_calls == 2)
645*6fee86a4SJeremy Kemp     {
646*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_PTR(make_platform_id(1), platform);
647*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(CL_DEVICE_TYPE_GPU, device_type);
648*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(2, num_entries);
649*6fee86a4SJeremy Kemp         TEST_ASSERT_NOT_NULL(devices);
650*6fee86a4SJeremy Kemp         devices[0] = make_device_id(0);
651*6fee86a4SJeremy Kemp         devices[1] = make_device_id(1);
652*6fee86a4SJeremy Kemp         return CL_SUCCESS;
653*6fee86a4SJeremy Kemp     }
654*6fee86a4SJeremy Kemp     else
655*6fee86a4SJeremy Kemp     {
656*6fee86a4SJeremy Kemp         TEST_FAIL_MESSAGE("clGetDeviceIDs called too many times");
657*6fee86a4SJeremy Kemp         return CL_INVALID_VALUE;
658*6fee86a4SJeremy Kemp     }
659*6fee86a4SJeremy Kemp }
660*6fee86a4SJeremy Kemp #endif
661*6fee86a4SJeremy Kemp 
662*6fee86a4SJeremy Kemp // Stub for clCreateContextFromType
663*6fee86a4SJeremy Kemp // - expect platform 1 with GPUs and non-null properties
clCreateContextFromType_testContextFromType(const cl_context_properties * properties,cl_device_type device_type,void (CL_CALLBACK * pfn_notify)(const char * errinfo,const void * private_info,size_t cb,void * user_data),void * user_data,cl_int * errcode_ret,int num_calls)664*6fee86a4SJeremy Kemp static cl_context clCreateContextFromType_testContextFromType(
665*6fee86a4SJeremy Kemp     const cl_context_properties  *properties,
666*6fee86a4SJeremy Kemp     cl_device_type  device_type,
667*6fee86a4SJeremy Kemp     void  (CL_CALLBACK *pfn_notify) (const char *errinfo,
668*6fee86a4SJeremy Kemp     const void  *private_info,
669*6fee86a4SJeremy Kemp     size_t  cb,
670*6fee86a4SJeremy Kemp     void  *user_data),
671*6fee86a4SJeremy Kemp     void  *user_data,
672*6fee86a4SJeremy Kemp     cl_int  *errcode_ret,
673*6fee86a4SJeremy Kemp     int num_calls)
674*6fee86a4SJeremy Kemp {
675*6fee86a4SJeremy Kemp     (void) pfn_notify;
676*6fee86a4SJeremy Kemp     (void) user_data;
677*6fee86a4SJeremy Kemp     (void) num_calls;
678*6fee86a4SJeremy Kemp 
679*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_DEVICE_TYPE_GPU, device_type);
680*6fee86a4SJeremy Kemp #if !defined(__APPLE__) && !defined(__MACOS)
681*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(properties);
682*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_CONTEXT_PLATFORM, properties[0]);
683*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(make_platform_id(1), properties[1]);
684*6fee86a4SJeremy Kemp #else
685*6fee86a4SJeremy Kemp     (void) properties;
686*6fee86a4SJeremy Kemp #endif
687*6fee86a4SJeremy Kemp     if (errcode_ret)
688*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
689*6fee86a4SJeremy Kemp     return make_context(0);
690*6fee86a4SJeremy Kemp }
691*6fee86a4SJeremy Kemp 
testContextFromType(void)692*6fee86a4SJeremy Kemp void testContextFromType(void)
693*6fee86a4SJeremy Kemp {
694*6fee86a4SJeremy Kemp #if !defined(__APPLE__) && !defined(__MACOS)
695*6fee86a4SJeremy Kemp     clGetPlatformIDs_StubWithCallback(clGetPlatformIDs_testContextFromType);
696*6fee86a4SJeremy Kemp     clGetDeviceIDs_StubWithCallback(clGetDeviceIDs_testContextFromType);
697*6fee86a4SJeremy Kemp 
698*6fee86a4SJeremy Kemp     // The opencl.hpp header will perform an extra retain here to be consistent
699*6fee86a4SJeremy Kemp     // with other APIs retaining runtime-owned objects before releasing them
700*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
701*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
702*6fee86a4SJeremy Kemp 
703*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
704*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
705*6fee86a4SJeremy Kemp 
706*6fee86a4SJeremy Kemp     // End of scope of vector of devices within constructor
707*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
708*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
709*6fee86a4SJeremy Kemp #endif
710*6fee86a4SJeremy Kemp 
711*6fee86a4SJeremy Kemp     clCreateContextFromType_StubWithCallback(clCreateContextFromType_testContextFromType);
712*6fee86a4SJeremy Kemp 
713*6fee86a4SJeremy Kemp     cl::Context context(CL_DEVICE_TYPE_GPU);
714*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context());
715*6fee86a4SJeremy Kemp 
716*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
717*6fee86a4SJeremy Kemp }
718*6fee86a4SJeremy Kemp 
testContextFromTypeNonNullProperties(void)719*6fee86a4SJeremy Kemp void testContextFromTypeNonNullProperties(void)
720*6fee86a4SJeremy Kemp {
721*6fee86a4SJeremy Kemp     clCreateContextFromType_StubWithCallback(clCreateContextFromType_testContextFromType);
722*6fee86a4SJeremy Kemp 
723*6fee86a4SJeremy Kemp     const cl_context_properties props[] = {
724*6fee86a4SJeremy Kemp         CL_CONTEXT_PLATFORM, (cl_context_properties)make_platform_id(1), 0 };
725*6fee86a4SJeremy Kemp     cl::Context context(CL_DEVICE_TYPE_GPU, props);
726*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context());
727*6fee86a4SJeremy Kemp 
728*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
729*6fee86a4SJeremy Kemp }
730*6fee86a4SJeremy Kemp 
clCreateContext_testContextNonNullProperties(const cl_context_properties * properties,cl_uint num_devices,const cl_device_id * devices,void (CL_CALLBACK * pfn_notify)(const char * errinfo,const void * private_info,size_t cb,void * user_data),void * user_data,cl_int * errcode_ret,int num_calls)731*6fee86a4SJeremy Kemp static cl_context clCreateContext_testContextNonNullProperties(
732*6fee86a4SJeremy Kemp     const cl_context_properties* properties,
733*6fee86a4SJeremy Kemp     cl_uint num_devices,
734*6fee86a4SJeremy Kemp     const cl_device_id* devices,
735*6fee86a4SJeremy Kemp     void  (CL_CALLBACK *pfn_notify) (const char *errinfo, const void  *private_info, size_t  cb, void  *user_data),
736*6fee86a4SJeremy Kemp     void  *user_data,
737*6fee86a4SJeremy Kemp     cl_int  *errcode_ret,
738*6fee86a4SJeremy Kemp     int num_calls)
739*6fee86a4SJeremy Kemp {
740*6fee86a4SJeremy Kemp     (void) pfn_notify;
741*6fee86a4SJeremy Kemp     (void) user_data;
742*6fee86a4SJeremy Kemp     (void) num_calls;
743*6fee86a4SJeremy Kemp 
744*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(properties);
745*6fee86a4SJeremy Kemp     TEST_ASSERT_GREATER_THAN(0, num_devices);
746*6fee86a4SJeremy Kemp     for (int i = 0; i < (int)num_devices; i++) {
747*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(make_device_id(i), devices[i]);
748*6fee86a4SJeremy Kemp     }
749*6fee86a4SJeremy Kemp     if (errcode_ret != nullptr)
750*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
751*6fee86a4SJeremy Kemp     return make_context(0);
752*6fee86a4SJeremy Kemp }
753*6fee86a4SJeremy Kemp 
testContextWithDeviceNonNullProperties(void)754*6fee86a4SJeremy Kemp void testContextWithDeviceNonNullProperties(void)
755*6fee86a4SJeremy Kemp {
756*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
757*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
758*6fee86a4SJeremy Kemp     clCreateContext_StubWithCallback(clCreateContext_testContextNonNullProperties);
759*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
760*6fee86a4SJeremy Kemp 
761*6fee86a4SJeremy Kemp     const cl_context_properties props[] = {
762*6fee86a4SJeremy Kemp         CL_CONTEXT_PLATFORM, (cl_context_properties)make_platform_id(0), 0 };
763*6fee86a4SJeremy Kemp     cl::Device device = cl::Device(make_device_id(0));
764*6fee86a4SJeremy Kemp 
765*6fee86a4SJeremy Kemp     cl::Context context(device, props);
766*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context());
767*6fee86a4SJeremy Kemp }
768*6fee86a4SJeremy Kemp 
testContextWithDevicesNonNullProperties(void)769*6fee86a4SJeremy Kemp void testContextWithDevicesNonNullProperties(void)
770*6fee86a4SJeremy Kemp {
771*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
772*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
773*6fee86a4SJeremy Kemp     clCreateContext_StubWithCallback(clCreateContext_testContextNonNullProperties);
774*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
775*6fee86a4SJeremy Kemp 
776*6fee86a4SJeremy Kemp     const cl_context_properties props[] = {
777*6fee86a4SJeremy Kemp         CL_CONTEXT_PLATFORM, (cl_context_properties)make_platform_id(0), 0 };
778*6fee86a4SJeremy Kemp     cl::Device device0 = cl::Device(make_device_id(0));
779*6fee86a4SJeremy Kemp     cl::Device device1 = cl::Device(make_device_id(1));
780*6fee86a4SJeremy Kemp 
781*6fee86a4SJeremy Kemp     cl::Context context({device0, device1}, props);
782*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context());
783*6fee86a4SJeremy Kemp }
784*6fee86a4SJeremy Kemp 
785*6fee86a4SJeremy Kemp /****************************************************************************
786*6fee86a4SJeremy Kemp  * Tests for cl::CommandQueue
787*6fee86a4SJeremy Kemp  ****************************************************************************/
788*6fee86a4SJeremy Kemp 
789*6fee86a4SJeremy Kemp void testMoveAssignCommandQueueNonNull(void);
790*6fee86a4SJeremy Kemp void testMoveAssignCommandQueueNull(void);
791*6fee86a4SJeremy Kemp void testMoveConstructCommandQueueNonNull(void);
792*6fee86a4SJeremy Kemp void testMoveConstructCommandQueueNull(void);
MAKE_MOVE_TESTS(CommandQueue,make_command_queue,clReleaseCommandQueue,commandQueuePool)793*6fee86a4SJeremy Kemp MAKE_MOVE_TESTS(CommandQueue, make_command_queue, clReleaseCommandQueue, commandQueuePool)
794*6fee86a4SJeremy Kemp 
795*6fee86a4SJeremy Kemp // Stub for clGetCommandQueueInfo that returns context 0
796*6fee86a4SJeremy Kemp static cl_int clGetCommandQueueInfo_testCommandQueueGetContext(
797*6fee86a4SJeremy Kemp     cl_command_queue command_queue,
798*6fee86a4SJeremy Kemp     cl_command_queue_info param_name,
799*6fee86a4SJeremy Kemp     size_t param_value_size,
800*6fee86a4SJeremy Kemp     void *param_value,
801*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
802*6fee86a4SJeremy Kemp     int num_calls)
803*6fee86a4SJeremy Kemp {
804*6fee86a4SJeremy Kemp     (void) num_calls;
805*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_command_queue(0), command_queue);
806*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_QUEUE_CONTEXT, param_name);
807*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_context));
808*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
809*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_context);
810*6fee86a4SJeremy Kemp     if (param_value != nullptr)
811*6fee86a4SJeremy Kemp         *(cl_context *) param_value = make_context(0);
812*6fee86a4SJeremy Kemp     return CL_SUCCESS;
813*6fee86a4SJeremy Kemp }
814*6fee86a4SJeremy Kemp 
testCommandQueueGetContext(void)815*6fee86a4SJeremy Kemp void testCommandQueueGetContext(void)
816*6fee86a4SJeremy Kemp {
817*6fee86a4SJeremy Kemp     cl_context expected = make_context(0);
818*6fee86a4SJeremy Kemp     int refcount = 1;
819*6fee86a4SJeremy Kemp 
820*6fee86a4SJeremy Kemp     clGetCommandQueueInfo_StubWithCallback(clGetCommandQueueInfo_testCommandQueueGetContext);
821*6fee86a4SJeremy Kemp     prepare_contextRefcounts(1, &expected, &refcount);
822*6fee86a4SJeremy Kemp 
823*6fee86a4SJeremy Kemp     cl::Context ctx = commandQueuePool[0].getInfo<CL_QUEUE_CONTEXT>();
824*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(expected, ctx());
825*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(2, refcount);
826*6fee86a4SJeremy Kemp 
827*6fee86a4SJeremy Kemp     ctx() = nullptr;
828*6fee86a4SJeremy Kemp }
829*6fee86a4SJeremy Kemp 
830*6fee86a4SJeremy Kemp // Stub for clGetCommandQueueInfo that returns device 0
clGetCommandQueueInfo_testCommandQueueGetDevice(cl_command_queue command_queue,cl_command_queue_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)831*6fee86a4SJeremy Kemp static cl_int clGetCommandQueueInfo_testCommandQueueGetDevice(
832*6fee86a4SJeremy Kemp     cl_command_queue command_queue,
833*6fee86a4SJeremy Kemp     cl_command_queue_info param_name,
834*6fee86a4SJeremy Kemp     size_t param_value_size,
835*6fee86a4SJeremy Kemp     void *param_value,
836*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
837*6fee86a4SJeremy Kemp     int num_calls)
838*6fee86a4SJeremy Kemp {
839*6fee86a4SJeremy Kemp     (void) num_calls;
840*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_command_queue(0), command_queue);
841*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_QUEUE_DEVICE, param_name);
842*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_device_id));
843*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
844*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_device_id);
845*6fee86a4SJeremy Kemp     if (param_value != nullptr)
846*6fee86a4SJeremy Kemp         *(cl_device_id *) param_value = make_device_id(0);
847*6fee86a4SJeremy Kemp     return CL_SUCCESS;
848*6fee86a4SJeremy Kemp }
849*6fee86a4SJeremy Kemp 
testCommandQueueGetDevice1_1(void)850*6fee86a4SJeremy Kemp void testCommandQueueGetDevice1_1(void)
851*6fee86a4SJeremy Kemp {
852*6fee86a4SJeremy Kemp     cl_device_id expected = make_device_id(0);
853*6fee86a4SJeremy Kemp 
854*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
855*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
856*6fee86a4SJeremy Kemp     clGetCommandQueueInfo_StubWithCallback(clGetCommandQueueInfo_testCommandQueueGetDevice);
857*6fee86a4SJeremy Kemp 
858*6fee86a4SJeremy Kemp     cl::Device device = commandQueuePool[0].getInfo<CL_QUEUE_DEVICE>();
859*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(expected, device());
860*6fee86a4SJeremy Kemp 
861*6fee86a4SJeremy Kemp     device() = nullptr;
862*6fee86a4SJeremy Kemp }
863*6fee86a4SJeremy Kemp 
testCommandQueueGetDevice1_2(void)864*6fee86a4SJeremy Kemp void testCommandQueueGetDevice1_2(void)
865*6fee86a4SJeremy Kemp {
866*6fee86a4SJeremy Kemp     cl_device_id expected = make_device_id(0);
867*6fee86a4SJeremy Kemp     int refcount = 1;
868*6fee86a4SJeremy Kemp 
869*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
870*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
871*6fee86a4SJeremy Kemp     clGetCommandQueueInfo_StubWithCallback(clGetCommandQueueInfo_testCommandQueueGetDevice);
872*6fee86a4SJeremy Kemp     prepare_deviceRefcounts(1, &expected, &refcount);
873*6fee86a4SJeremy Kemp 
874*6fee86a4SJeremy Kemp     cl::Device device = commandQueuePool[0].getInfo<CL_QUEUE_DEVICE>();
875*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(expected, device());
876*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(2, refcount);
877*6fee86a4SJeremy Kemp 
878*6fee86a4SJeremy Kemp     device() = nullptr;
879*6fee86a4SJeremy Kemp }
880*6fee86a4SJeremy Kemp 
881*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION < 200
882*6fee86a4SJeremy Kemp // stub for clCreateCommandQueue - returns queue zero
clCreateCommandQueue_testCommandQueueFromSpecifiedContext(cl_context context,cl_device_id device,cl_command_queue_properties properties,cl_int * errcode_ret,int num_calls)883*6fee86a4SJeremy Kemp static cl_command_queue clCreateCommandQueue_testCommandQueueFromSpecifiedContext(
884*6fee86a4SJeremy Kemp     cl_context context,
885*6fee86a4SJeremy Kemp     cl_device_id device,
886*6fee86a4SJeremy Kemp     cl_command_queue_properties properties,
887*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
888*6fee86a4SJeremy Kemp     int num_calls)
889*6fee86a4SJeremy Kemp {
890*6fee86a4SJeremy Kemp     (void) num_calls;
891*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context);
892*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(0), device);
893*6fee86a4SJeremy Kemp     TEST_ASSERT(properties == 0);
894*6fee86a4SJeremy Kemp     if (errcode_ret != nullptr)
895*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
896*6fee86a4SJeremy Kemp     return make_command_queue(0);
897*6fee86a4SJeremy Kemp }
898*6fee86a4SJeremy Kemp #else
899*6fee86a4SJeremy Kemp // stub for clCreateCommandQueueWithProperties - returns queue zero
clCreateCommandQueueWithProperties_testCommandQueueFromSpecifiedContext(cl_context context,cl_device_id device,const cl_queue_properties * properties,cl_int * errcode_ret,int num_calls)900*6fee86a4SJeremy Kemp static cl_command_queue clCreateCommandQueueWithProperties_testCommandQueueFromSpecifiedContext(
901*6fee86a4SJeremy Kemp     cl_context context,
902*6fee86a4SJeremy Kemp     cl_device_id device,
903*6fee86a4SJeremy Kemp     const cl_queue_properties *properties,
904*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
905*6fee86a4SJeremy Kemp     int num_calls)
906*6fee86a4SJeremy Kemp {
907*6fee86a4SJeremy Kemp     (void)num_calls;
908*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context);
909*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(0), device);
910*6fee86a4SJeremy Kemp     TEST_ASSERT(properties[0] == CL_QUEUE_PROPERTIES);
911*6fee86a4SJeremy Kemp     TEST_ASSERT(properties[1] == 0);
912*6fee86a4SJeremy Kemp     if (errcode_ret != nullptr)
913*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
914*6fee86a4SJeremy Kemp     return make_command_queue(0);
915*6fee86a4SJeremy Kemp }
916*6fee86a4SJeremy Kemp #endif // #if CL_HPP_TARGET_OPENCL_VERSION < 200
917*6fee86a4SJeremy Kemp 
testCommandQueueFromSpecifiedContext(void)918*6fee86a4SJeremy Kemp void testCommandQueueFromSpecifiedContext(void)
919*6fee86a4SJeremy Kemp {
920*6fee86a4SJeremy Kemp     cl_command_queue expected = make_command_queue(0);
921*6fee86a4SJeremy Kemp     cl_context expected_context =  make_context(0);
922*6fee86a4SJeremy Kemp     cl_device_id expected_device = make_device_id(0);
923*6fee86a4SJeremy Kemp 
924*6fee86a4SJeremy Kemp     int context_refcount = 1;
925*6fee86a4SJeremy Kemp     int device_refcount = 1;
926*6fee86a4SJeremy Kemp     prepare_contextRefcounts(1, &expected_context, &context_refcount);
927*6fee86a4SJeremy Kemp     prepare_deviceRefcounts(1, &expected_device, &device_refcount);
928*6fee86a4SJeremy Kemp 
929*6fee86a4SJeremy Kemp     // This is the context we will pass in to test
930*6fee86a4SJeremy Kemp     cl::Context context = contextPool[0];
931*6fee86a4SJeremy Kemp 
932*6fee86a4SJeremy Kemp     // Assumes the context contains the fi rst device
933*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_device);
934*6fee86a4SJeremy Kemp 
935*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
936*6fee86a4SJeremy Kemp     clCreateCommandQueueWithProperties_StubWithCallback(clCreateCommandQueueWithProperties_testCommandQueueFromSpecifiedContext);
937*6fee86a4SJeremy Kemp #else // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
938*6fee86a4SJeremy Kemp     clCreateCommandQueue_StubWithCallback(clCreateCommandQueue_testCommandQueueFromSpecifiedContext);
939*6fee86a4SJeremy Kemp #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
940*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
941*6fee86a4SJeremy Kemp 
942*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
943*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
944*6fee86a4SJeremy Kemp #else // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
945*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
946*6fee86a4SJeremy Kemp #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
947*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(expected, CL_SUCCESS);
948*6fee86a4SJeremy Kemp 
949*6fee86a4SJeremy Kemp     cl::CommandQueue queue(context);
950*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(expected, queue());
951*6fee86a4SJeremy Kemp 
952*6fee86a4SJeremy Kemp     // Context not destroyed yet
953*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(2, context_refcount);
954*6fee86a4SJeremy Kemp     // Device object destroyed at end of scope
955*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(1, device_refcount);
956*6fee86a4SJeremy Kemp 
957*6fee86a4SJeremy Kemp }
958*6fee86a4SJeremy Kemp 
959*6fee86a4SJeremy Kemp /****************************************************************************
960*6fee86a4SJeremy Kemp  * Tests for cl::Device
961*6fee86a4SJeremy Kemp  ****************************************************************************/
962*6fee86a4SJeremy Kemp 
testCopyDeviceNonNull1_1(void)963*6fee86a4SJeremy Kemp void testCopyDeviceNonNull1_1(void)
964*6fee86a4SJeremy Kemp {
965*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
966*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
967*6fee86a4SJeremy Kemp 
968*6fee86a4SJeremy Kemp     cl::Device d0(make_device_id(0));
969*6fee86a4SJeremy Kemp     cl::Device d1(make_device_id(1));
970*6fee86a4SJeremy Kemp     d0 = d1;
971*6fee86a4SJeremy Kemp }
972*6fee86a4SJeremy Kemp 
testCopyDeviceNonNull1_2(void)973*6fee86a4SJeremy Kemp void testCopyDeviceNonNull1_2(void)
974*6fee86a4SJeremy Kemp {
975*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
976*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
977*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
978*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
979*6fee86a4SJeremy Kemp 
980*6fee86a4SJeremy Kemp     cl::Device d0(make_device_id(0));
981*6fee86a4SJeremy Kemp     cl::Device d1(make_device_id(1));
982*6fee86a4SJeremy Kemp     d0 = d1;
983*6fee86a4SJeremy Kemp 
984*6fee86a4SJeremy Kemp     // Prevent destructor from interfering with the test
985*6fee86a4SJeremy Kemp     d0() = nullptr;
986*6fee86a4SJeremy Kemp     d1() = nullptr;
987*6fee86a4SJeremy Kemp }
988*6fee86a4SJeremy Kemp 
testCopyDeviceFromNull1_1(void)989*6fee86a4SJeremy Kemp void testCopyDeviceFromNull1_1(void)
990*6fee86a4SJeremy Kemp {
991*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
992*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
993*6fee86a4SJeremy Kemp     // No other calls expected
994*6fee86a4SJeremy Kemp 
995*6fee86a4SJeremy Kemp     cl::Device d(make_device_id(0));
996*6fee86a4SJeremy Kemp     d = cl::Device();
997*6fee86a4SJeremy Kemp }
998*6fee86a4SJeremy Kemp 
testCopyDeviceFromNull1_2(void)999*6fee86a4SJeremy Kemp void testCopyDeviceFromNull1_2(void)
1000*6fee86a4SJeremy Kemp {
1001*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1002*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1003*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
1004*6fee86a4SJeremy Kemp 
1005*6fee86a4SJeremy Kemp     cl::Device d(make_device_id(0));
1006*6fee86a4SJeremy Kemp     d = cl::Device();
1007*6fee86a4SJeremy Kemp }
1008*6fee86a4SJeremy Kemp 
testCopyDeviceToNull1_1(void)1009*6fee86a4SJeremy Kemp void testCopyDeviceToNull1_1(void)
1010*6fee86a4SJeremy Kemp {
1011*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1012*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
1013*6fee86a4SJeremy Kemp     // No other calls expected
1014*6fee86a4SJeremy Kemp 
1015*6fee86a4SJeremy Kemp     cl::Device d0;
1016*6fee86a4SJeremy Kemp     cl::Device d1(make_device_id(0));
1017*6fee86a4SJeremy Kemp     d0 = d1;
1018*6fee86a4SJeremy Kemp }
1019*6fee86a4SJeremy Kemp 
testCopyDeviceToNull1_2(void)1020*6fee86a4SJeremy Kemp void testCopyDeviceToNull1_2(void)
1021*6fee86a4SJeremy Kemp {
1022*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1023*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1024*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
1025*6fee86a4SJeremy Kemp 
1026*6fee86a4SJeremy Kemp     cl::Device d0;
1027*6fee86a4SJeremy Kemp     cl::Device d1(make_device_id(0));
1028*6fee86a4SJeremy Kemp     d0 = d1;
1029*6fee86a4SJeremy Kemp 
1030*6fee86a4SJeremy Kemp     // Prevent destructor from interfering with the test
1031*6fee86a4SJeremy Kemp     d0() = nullptr;
1032*6fee86a4SJeremy Kemp     d1() = nullptr;
1033*6fee86a4SJeremy Kemp }
1034*6fee86a4SJeremy Kemp 
testCopyDeviceSelf(void)1035*6fee86a4SJeremy Kemp void testCopyDeviceSelf(void)
1036*6fee86a4SJeremy Kemp {
1037*6fee86a4SJeremy Kemp     // Use 1.2 to check the retain/release calls
1038*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1039*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1040*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
1041*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
1042*6fee86a4SJeremy Kemp 
1043*6fee86a4SJeremy Kemp     cl::Device d0(make_device_id(0));
1044*6fee86a4SJeremy Kemp     cl::Device d1(make_device_id(1));
1045*6fee86a4SJeremy Kemp     d0 = d1;
1046*6fee86a4SJeremy Kemp 
1047*6fee86a4SJeremy Kemp     // Prevent destructor from interfering with the test
1048*6fee86a4SJeremy Kemp     d0() = nullptr;
1049*6fee86a4SJeremy Kemp     d1() = nullptr;
1050*6fee86a4SJeremy Kemp }
1051*6fee86a4SJeremy Kemp 
testAssignDeviceNull(void)1052*6fee86a4SJeremy Kemp void testAssignDeviceNull(void)
1053*6fee86a4SJeremy Kemp {
1054*6fee86a4SJeremy Kemp     // Any version will do here
1055*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1056*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1057*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
1058*6fee86a4SJeremy Kemp 
1059*6fee86a4SJeremy Kemp     cl::Device d(make_device_id(0));
1060*6fee86a4SJeremy Kemp     d = (cl_device_id) nullptr;
1061*6fee86a4SJeremy Kemp }
1062*6fee86a4SJeremy Kemp 
1063*6fee86a4SJeremy Kemp // These tests do not use the MAKE_MOVE_TESTS helper because they need to
1064*6fee86a4SJeremy Kemp // check whether the device is reference-countable, and to check that
1065*6fee86a4SJeremy Kemp // the reference-countable flag is correctly moved.
testMoveAssignDeviceNonNull(void)1066*6fee86a4SJeremy Kemp void testMoveAssignDeviceNonNull(void)
1067*6fee86a4SJeremy Kemp {
1068*6fee86a4SJeremy Kemp #ifdef TEST_RVALUE_REFERENCES
1069*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1070*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1071*6fee86a4SJeremy Kemp 
1072*6fee86a4SJeremy Kemp     // Release called when trg overwritten
1073*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
1074*6fee86a4SJeremy Kemp 
1075*6fee86a4SJeremy Kemp     cl::Device src(make_device_id(0));
1076*6fee86a4SJeremy Kemp     cl::Device trg(make_device_id(1));
1077*6fee86a4SJeremy Kemp     trg = std::move(src);
1078*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(0), trg());
1079*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(src());
1080*6fee86a4SJeremy Kemp 
1081*6fee86a4SJeremy Kemp     // Prevent destructor from interfering with the test
1082*6fee86a4SJeremy Kemp     trg() = nullptr;
1083*6fee86a4SJeremy Kemp #endif
1084*6fee86a4SJeremy Kemp }
1085*6fee86a4SJeremy Kemp 
testMoveAssignDeviceNull(void)1086*6fee86a4SJeremy Kemp void testMoveAssignDeviceNull(void)
1087*6fee86a4SJeremy Kemp {
1088*6fee86a4SJeremy Kemp #ifdef TEST_RVALUE_REFERENCES
1089*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1090*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1091*6fee86a4SJeremy Kemp 
1092*6fee86a4SJeremy Kemp     cl::Device trg;
1093*6fee86a4SJeremy Kemp     cl::Device src(make_device_id(1));
1094*6fee86a4SJeremy Kemp     trg = std::move(src);
1095*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(1), trg());
1096*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(src());
1097*6fee86a4SJeremy Kemp 
1098*6fee86a4SJeremy Kemp     // Prevent destructor from interfering with the test
1099*6fee86a4SJeremy Kemp     trg() = nullptr;
1100*6fee86a4SJeremy Kemp #endif
1101*6fee86a4SJeremy Kemp }
1102*6fee86a4SJeremy Kemp 
testMoveConstructDeviceNonNull(void)1103*6fee86a4SJeremy Kemp void testMoveConstructDeviceNonNull(void)
1104*6fee86a4SJeremy Kemp {
1105*6fee86a4SJeremy Kemp #ifdef TEST_RVALUE_REFERENCES
1106*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1107*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1108*6fee86a4SJeremy Kemp 
1109*6fee86a4SJeremy Kemp     cl::Device src(make_device_id(0));
1110*6fee86a4SJeremy Kemp     cl::Device trg(std::move(src));
1111*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(0), trg());
1112*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(src());
1113*6fee86a4SJeremy Kemp 
1114*6fee86a4SJeremy Kemp     // Prevent destructor from interfering with the test
1115*6fee86a4SJeremy Kemp     trg() = nullptr;
1116*6fee86a4SJeremy Kemp #endif
1117*6fee86a4SJeremy Kemp }
1118*6fee86a4SJeremy Kemp 
testMoveConstructDeviceNull(void)1119*6fee86a4SJeremy Kemp void testMoveConstructDeviceNull(void)
1120*6fee86a4SJeremy Kemp {
1121*6fee86a4SJeremy Kemp #ifdef TEST_RVALUE_REFERENCES
1122*6fee86a4SJeremy Kemp     cl::Device empty;
1123*6fee86a4SJeremy Kemp     cl::Device trg(std::move(empty));
1124*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(trg());
1125*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(empty());
1126*6fee86a4SJeremy Kemp #endif
1127*6fee86a4SJeremy Kemp }
1128*6fee86a4SJeremy Kemp 
testDestroyDevice1_1(void)1129*6fee86a4SJeremy Kemp void testDestroyDevice1_1(void)
1130*6fee86a4SJeremy Kemp {
1131*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1132*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
1133*6fee86a4SJeremy Kemp     // No other calls expected
1134*6fee86a4SJeremy Kemp 
1135*6fee86a4SJeremy Kemp     cl::Device d(make_device_id(0));
1136*6fee86a4SJeremy Kemp }
1137*6fee86a4SJeremy Kemp 
testDestroyDevice1_2(void)1138*6fee86a4SJeremy Kemp void testDestroyDevice1_2(void)
1139*6fee86a4SJeremy Kemp {
1140*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1141*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1142*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
1143*6fee86a4SJeremy Kemp 
1144*6fee86a4SJeremy Kemp     cl::Device d(make_device_id(0));
1145*6fee86a4SJeremy Kemp }
1146*6fee86a4SJeremy Kemp 
clGetDeviceIDs_PlatformWithZeroDevices(cl_platform_id platform,cl_device_type device_type,cl_uint num_entries,cl_device_id * devices,cl_uint * num_devices,int num_calls)1147*6fee86a4SJeremy Kemp static cl_int clGetDeviceIDs_PlatformWithZeroDevices(
1148*6fee86a4SJeremy Kemp     cl_platform_id  platform,
1149*6fee86a4SJeremy Kemp     cl_device_type  device_type,
1150*6fee86a4SJeremy Kemp     cl_uint  num_entries,
1151*6fee86a4SJeremy Kemp     cl_device_id  *devices,
1152*6fee86a4SJeremy Kemp     cl_uint  *num_devices,
1153*6fee86a4SJeremy Kemp     int num_calls)
1154*6fee86a4SJeremy Kemp {
1155*6fee86a4SJeremy Kemp     (void) num_entries;
1156*6fee86a4SJeremy Kemp     (void) devices;
1157*6fee86a4SJeremy Kemp 
1158*6fee86a4SJeremy Kemp     if (num_calls == 0)
1159*6fee86a4SJeremy Kemp     {
1160*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_PTR(make_platform_id(0), platform);
1161*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(CL_DEVICE_TYPE_ALL, device_type);
1162*6fee86a4SJeremy Kemp         TEST_ASSERT_NOT_NULL(num_devices);
1163*6fee86a4SJeremy Kemp         return CL_DEVICE_NOT_FOUND;
1164*6fee86a4SJeremy Kemp     }
1165*6fee86a4SJeremy Kemp     else
1166*6fee86a4SJeremy Kemp     {
1167*6fee86a4SJeremy Kemp         TEST_FAIL_MESSAGE("clGetDeviceIDs called too many times");
1168*6fee86a4SJeremy Kemp         return CL_INVALID_VALUE;
1169*6fee86a4SJeremy Kemp     }
1170*6fee86a4SJeremy Kemp }
1171*6fee86a4SJeremy Kemp 
testPlatformWithZeroDevices(void)1172*6fee86a4SJeremy Kemp void testPlatformWithZeroDevices(void)
1173*6fee86a4SJeremy Kemp {
1174*6fee86a4SJeremy Kemp     clGetDeviceIDs_StubWithCallback(clGetDeviceIDs_PlatformWithZeroDevices);
1175*6fee86a4SJeremy Kemp 
1176*6fee86a4SJeremy Kemp     cl::Platform p(make_platform_id(0));
1177*6fee86a4SJeremy Kemp     std::vector<cl::Device> devices;
1178*6fee86a4SJeremy Kemp 
1179*6fee86a4SJeremy Kemp     cl_int errCode = p.getDevices(CL_DEVICE_TYPE_ALL, &devices);
1180*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, errCode);
1181*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, devices.size());
1182*6fee86a4SJeremy Kemp }
1183*6fee86a4SJeremy Kemp 
1184*6fee86a4SJeremy Kemp /****************************************************************************
1185*6fee86a4SJeremy Kemp  * Tests for cl::Buffer
1186*6fee86a4SJeremy Kemp  ****************************************************************************/
1187*6fee86a4SJeremy Kemp 
1188*6fee86a4SJeremy Kemp void testMoveAssignBufferNonNull(void);
1189*6fee86a4SJeremy Kemp void testMoveAssignBufferNull(void);
1190*6fee86a4SJeremy Kemp void testMoveConstructBufferNonNull(void);
1191*6fee86a4SJeremy Kemp void testMoveConstructBufferNull(void);
MAKE_MOVE_TESTS(Buffer,make_mem,clReleaseMemObject,bufferPool)1192*6fee86a4SJeremy Kemp MAKE_MOVE_TESTS(Buffer, make_mem, clReleaseMemObject, bufferPool)
1193*6fee86a4SJeremy Kemp 
1194*6fee86a4SJeremy Kemp // Stub of clCreateBuffer for testBufferConstructorContextInterator
1195*6fee86a4SJeremy Kemp // - return the first memory location
1196*6fee86a4SJeremy Kemp 
1197*6fee86a4SJeremy Kemp static cl_mem clCreateBuffer_testBufferConstructorContextIterator(
1198*6fee86a4SJeremy Kemp     cl_context context,
1199*6fee86a4SJeremy Kemp     cl_mem_flags flags,
1200*6fee86a4SJeremy Kemp     size_t size,
1201*6fee86a4SJeremy Kemp     void *host_ptr,
1202*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
1203*6fee86a4SJeremy Kemp     int num_calls)
1204*6fee86a4SJeremy Kemp {
1205*6fee86a4SJeremy Kemp     (void) num_calls;
1206*6fee86a4SJeremy Kemp 
1207*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context);
1208*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(flags, CL_MEM_READ_ONLY);
1209*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(sizeof(int)*1024, size);
1210*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(host_ptr);
1211*6fee86a4SJeremy Kemp     if (errcode_ret)
1212*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
1213*6fee86a4SJeremy Kemp     return make_mem(0);
1214*6fee86a4SJeremy Kemp }
1215*6fee86a4SJeremy Kemp 
1216*6fee86a4SJeremy Kemp // Declare forward these functions
1217*6fee86a4SJeremy Kemp static void * clEnqueueMapBuffer_testCopyHostToBuffer(
1218*6fee86a4SJeremy Kemp     cl_command_queue command_queue,
1219*6fee86a4SJeremy Kemp     cl_mem buffer,
1220*6fee86a4SJeremy Kemp     cl_bool blocking_map,
1221*6fee86a4SJeremy Kemp     cl_map_flags map_flags,
1222*6fee86a4SJeremy Kemp     size_t offset,
1223*6fee86a4SJeremy Kemp     size_t size,
1224*6fee86a4SJeremy Kemp     cl_uint num_events_in_wait_list,
1225*6fee86a4SJeremy Kemp     const cl_event *event_wait_list,
1226*6fee86a4SJeremy Kemp     cl_event *event,
1227*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
1228*6fee86a4SJeremy Kemp     int num_calls);
1229*6fee86a4SJeremy Kemp 
1230*6fee86a4SJeremy Kemp static cl_int clEnqueueUnmapMemObject_testCopyHostToBuffer(
1231*6fee86a4SJeremy Kemp     cl_command_queue  command_queue ,
1232*6fee86a4SJeremy Kemp     cl_mem  memobj,
1233*6fee86a4SJeremy Kemp     void  *mapped_ptr,
1234*6fee86a4SJeremy Kemp     cl_uint  num_events_in_wait_list ,
1235*6fee86a4SJeremy Kemp     const cl_event  *event_wait_list ,
1236*6fee86a4SJeremy Kemp     cl_event  *event,
1237*6fee86a4SJeremy Kemp     int num_calls);
1238*6fee86a4SJeremy Kemp 
1239*6fee86a4SJeremy Kemp static cl_int clWaitForEvents_testCopyHostToBuffer(
1240*6fee86a4SJeremy Kemp     cl_uint num_events,
1241*6fee86a4SJeremy Kemp     const cl_event *event_list,
1242*6fee86a4SJeremy Kemp     int num_calls);
1243*6fee86a4SJeremy Kemp 
1244*6fee86a4SJeremy Kemp static cl_int clReleaseEvent_testCopyHostToBuffer(
1245*6fee86a4SJeremy Kemp     cl_event event,
1246*6fee86a4SJeremy Kemp     int num_calls);
1247*6fee86a4SJeremy Kemp 
testBufferConstructorContextIterator(void)1248*6fee86a4SJeremy Kemp void testBufferConstructorContextIterator(void)
1249*6fee86a4SJeremy Kemp {
1250*6fee86a4SJeremy Kemp     cl_mem expected = make_mem(0);
1251*6fee86a4SJeremy Kemp 
1252*6fee86a4SJeremy Kemp     // Assume this context includes make_device_id(0) for stub clGetContextInfo_device
1253*6fee86a4SJeremy Kemp     cl::Context context(make_context(0));
1254*6fee86a4SJeremy Kemp 
1255*6fee86a4SJeremy Kemp     clCreateBuffer_StubWithCallback(clCreateBuffer_testBufferConstructorContextIterator);
1256*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_device);
1257*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1258*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1259*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
1260*6fee86a4SJeremy Kemp #else // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1261*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1262*6fee86a4SJeremy Kemp #endif //#if CL_HPP_TARGET_OPENCL_VERSION >= 200
1263*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
1264*6fee86a4SJeremy Kemp 
1265*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1266*6fee86a4SJeremy Kemp     clCreateCommandQueueWithProperties_StubWithCallback(clCreateCommandQueueWithProperties_testCommandQueueFromSpecifiedContext);
1267*6fee86a4SJeremy Kemp #else // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1268*6fee86a4SJeremy Kemp     clCreateCommandQueue_StubWithCallback(clCreateCommandQueue_testCommandQueueFromSpecifiedContext);
1269*6fee86a4SJeremy Kemp #endif //#if CL_HPP_TARGET_OPENCL_VERSION >= 200
1270*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
1271*6fee86a4SJeremy Kemp     clEnqueueMapBuffer_StubWithCallback(clEnqueueMapBuffer_testCopyHostToBuffer);
1272*6fee86a4SJeremy Kemp     clEnqueueUnmapMemObject_StubWithCallback(clEnqueueUnmapMemObject_testCopyHostToBuffer);
1273*6fee86a4SJeremy Kemp     clWaitForEvents_StubWithCallback(clWaitForEvents_testCopyHostToBuffer);
1274*6fee86a4SJeremy Kemp     clReleaseEvent_StubWithCallback(clReleaseEvent_testCopyHostToBuffer);
1275*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(make_command_queue(0), CL_SUCCESS);
1276*6fee86a4SJeremy Kemp 
1277*6fee86a4SJeremy Kemp     std::vector<int> host(1024);
1278*6fee86a4SJeremy Kemp 
1279*6fee86a4SJeremy Kemp     cl::Buffer buffer(context, host.begin(), host.end(), true);
1280*6fee86a4SJeremy Kemp 
1281*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(expected, buffer());
1282*6fee86a4SJeremy Kemp 
1283*6fee86a4SJeremy Kemp     // Tidy up at end of test
1284*6fee86a4SJeremy Kemp     clReleaseMemObject_ExpectAndReturn(expected, CL_SUCCESS);
1285*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
1286*6fee86a4SJeremy Kemp }
1287*6fee86a4SJeremy Kemp 
testBufferConstructorQueueIterator(void)1288*6fee86a4SJeremy Kemp void testBufferConstructorQueueIterator(void)
1289*6fee86a4SJeremy Kemp {
1290*6fee86a4SJeremy Kemp     cl_context expected_context = make_context(0);
1291*6fee86a4SJeremy Kemp     int context_refcount = 1;
1292*6fee86a4SJeremy Kemp     cl_mem expected = make_mem(0);
1293*6fee86a4SJeremy Kemp 
1294*6fee86a4SJeremy Kemp     cl::CommandQueue queue(make_command_queue(0));
1295*6fee86a4SJeremy Kemp 
1296*6fee86a4SJeremy Kemp     prepare_contextRefcounts(1, &expected_context, &context_refcount);
1297*6fee86a4SJeremy Kemp     clGetCommandQueueInfo_StubWithCallback(clGetCommandQueueInfo_context);
1298*6fee86a4SJeremy Kemp     clCreateBuffer_StubWithCallback(clCreateBuffer_testBufferConstructorContextIterator);
1299*6fee86a4SJeremy Kemp 
1300*6fee86a4SJeremy Kemp     clEnqueueMapBuffer_StubWithCallback(clEnqueueMapBuffer_testCopyHostToBuffer);
1301*6fee86a4SJeremy Kemp     clEnqueueUnmapMemObject_StubWithCallback(clEnqueueUnmapMemObject_testCopyHostToBuffer);
1302*6fee86a4SJeremy Kemp     clWaitForEvents_StubWithCallback(clWaitForEvents_testCopyHostToBuffer);
1303*6fee86a4SJeremy Kemp     clReleaseEvent_StubWithCallback(clReleaseEvent_testCopyHostToBuffer);
1304*6fee86a4SJeremy Kemp 
1305*6fee86a4SJeremy Kemp     std::vector<int> host(1024);
1306*6fee86a4SJeremy Kemp 
1307*6fee86a4SJeremy Kemp     cl::Buffer buffer(queue, host.begin(), host.end(), true);
1308*6fee86a4SJeremy Kemp 
1309*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(expected, buffer());
1310*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(1, context_refcount);
1311*6fee86a4SJeremy Kemp 
1312*6fee86a4SJeremy Kemp     // Tidy up at end of test
1313*6fee86a4SJeremy Kemp     clReleaseMemObject_ExpectAndReturn(expected, CL_SUCCESS);
1314*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(make_command_queue(0), CL_SUCCESS);
1315*6fee86a4SJeremy Kemp }
1316*6fee86a4SJeremy Kemp 
1317*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 300
clCreateBufferWithProperties_testBufferWithProperties(cl_context context,const cl_mem_properties * properties,cl_mem_flags flags,size_t size,void * host_ptr,cl_int * errcode_ret,int num_calls)1318*6fee86a4SJeremy Kemp static cl_mem clCreateBufferWithProperties_testBufferWithProperties(
1319*6fee86a4SJeremy Kemp     cl_context context,
1320*6fee86a4SJeremy Kemp     const cl_mem_properties *properties,
1321*6fee86a4SJeremy Kemp     cl_mem_flags flags,
1322*6fee86a4SJeremy Kemp     size_t size,
1323*6fee86a4SJeremy Kemp     void *host_ptr,
1324*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
1325*6fee86a4SJeremy Kemp     int num_calls)
1326*6fee86a4SJeremy Kemp {
1327*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
1328*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(contextPool[0](), context);
1329*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(properties);
1330*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(11, *properties);
1331*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, flags);
1332*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, size);
1333*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(host_ptr);
1334*6fee86a4SJeremy Kemp     if (errcode_ret)
1335*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
1336*6fee86a4SJeremy Kemp 
1337*6fee86a4SJeremy Kemp     return make_mem(0);
1338*6fee86a4SJeremy Kemp }
1339*6fee86a4SJeremy Kemp #endif //CL_HPP_TARGET_OPENCL_VERSION >= 300
1340*6fee86a4SJeremy Kemp 
testBufferWithProperties(void)1341*6fee86a4SJeremy Kemp void testBufferWithProperties(void)
1342*6fee86a4SJeremy Kemp {
1343*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 300
1344*6fee86a4SJeremy Kemp     clCreateBufferWithProperties_StubWithCallback(clCreateBufferWithProperties_testBufferWithProperties);
1345*6fee86a4SJeremy Kemp 
1346*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl_mem_properties> props{11};
1347*6fee86a4SJeremy Kemp     cl_int err;
1348*6fee86a4SJeremy Kemp     cl::Buffer buffer(contextPool[0], props, 0, 0, nullptr, &err);
1349*6fee86a4SJeremy Kemp 
1350*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(0), buffer());
1351*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
1352*6fee86a4SJeremy Kemp 
1353*6fee86a4SJeremy Kemp     // prevent destructor from interfering with the test
1354*6fee86a4SJeremy Kemp     buffer() = nullptr;
1355*6fee86a4SJeremy Kemp #endif //CL_HPP_TARGET_OPENCL_VERSION >= 300
1356*6fee86a4SJeremy Kemp }
1357*6fee86a4SJeremy Kemp 
1358*6fee86a4SJeremy Kemp /****************************************************************************
1359*6fee86a4SJeremy Kemp  * Tests for cl::Image1DBuffer
1360*6fee86a4SJeremy Kemp  ****************************************************************************/
1361*6fee86a4SJeremy Kemp 
1362*6fee86a4SJeremy Kemp /**
1363*6fee86a4SJeremy Kemp  * Stub for querying CL_IMAGE_BUFFER and returning make_mem(1).
1364*6fee86a4SJeremy Kemp  */
clGetImageInfo_testGetImageInfoBuffer(cl_mem image,cl_image_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)1365*6fee86a4SJeremy Kemp cl_int clGetImageInfo_testGetImageInfoBuffer(
1366*6fee86a4SJeremy Kemp     cl_mem image, cl_image_info param_name,
1367*6fee86a4SJeremy Kemp     size_t param_value_size, void *param_value,
1368*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
1369*6fee86a4SJeremy Kemp     int num_calls)
1370*6fee86a4SJeremy Kemp {
1371*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
1372*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(0), image);
1373*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_IMAGE_BUFFER, param_name);
1374*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(sizeof(cl_mem), param_value_size);
1375*6fee86a4SJeremy Kemp 
1376*6fee86a4SJeremy Kemp     if (param_value != nullptr)
1377*6fee86a4SJeremy Kemp     {
1378*6fee86a4SJeremy Kemp         *(cl_mem *) param_value = make_mem(1);
1379*6fee86a4SJeremy Kemp     }
1380*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
1381*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_mem);
1382*6fee86a4SJeremy Kemp     return CL_SUCCESS;
1383*6fee86a4SJeremy Kemp }
1384*6fee86a4SJeremy Kemp 
testGetImageInfoBuffer(void)1385*6fee86a4SJeremy Kemp void testGetImageInfoBuffer(void)
1386*6fee86a4SJeremy Kemp {
1387*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1388*6fee86a4SJeremy Kemp     cl_mem expected = make_mem(1);
1389*6fee86a4SJeremy Kemp     int refcount = 1;
1390*6fee86a4SJeremy Kemp 
1391*6fee86a4SJeremy Kemp     clGetImageInfo_StubWithCallback(clGetImageInfo_testGetImageInfoBuffer);
1392*6fee86a4SJeremy Kemp     prepare_memRefcounts(1, &expected, &refcount);
1393*6fee86a4SJeremy Kemp 
1394*6fee86a4SJeremy Kemp     cl::Image1DBuffer image(make_mem(0));
1395*6fee86a4SJeremy Kemp     const cl::Buffer &buffer = image.getImageInfo<CL_IMAGE_BUFFER>();
1396*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(1), buffer());
1397*6fee86a4SJeremy Kemp     // Ref count should be 2 here because buffer has not been destroyed yet
1398*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(2, refcount);
1399*6fee86a4SJeremy Kemp 
1400*6fee86a4SJeremy Kemp     // prevent destructor from interfering with the test
1401*6fee86a4SJeremy Kemp     image() = nullptr;
1402*6fee86a4SJeremy Kemp #endif
1403*6fee86a4SJeremy Kemp }
1404*6fee86a4SJeremy Kemp 
1405*6fee86a4SJeremy Kemp /**
1406*6fee86a4SJeremy Kemp  * Stub for querying CL_IMAGE_BUFFER and returning nullptr.
1407*6fee86a4SJeremy Kemp  */
clGetImageInfo_testGetImageInfoBufferNull(cl_mem image,cl_image_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)1408*6fee86a4SJeremy Kemp cl_int clGetImageInfo_testGetImageInfoBufferNull(
1409*6fee86a4SJeremy Kemp     cl_mem image, cl_image_info param_name,
1410*6fee86a4SJeremy Kemp     size_t param_value_size, void *param_value,
1411*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
1412*6fee86a4SJeremy Kemp     int num_calls)
1413*6fee86a4SJeremy Kemp {
1414*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
1415*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(0), image);
1416*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_IMAGE_BUFFER, param_name);
1417*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(sizeof(cl_mem), param_value_size);
1418*6fee86a4SJeremy Kemp 
1419*6fee86a4SJeremy Kemp     if (param_value != nullptr)
1420*6fee86a4SJeremy Kemp     {
1421*6fee86a4SJeremy Kemp         *(cl_mem *) param_value = nullptr;
1422*6fee86a4SJeremy Kemp     }
1423*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
1424*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_mem);
1425*6fee86a4SJeremy Kemp     return CL_SUCCESS;
1426*6fee86a4SJeremy Kemp }
1427*6fee86a4SJeremy Kemp 
testGetImageInfoBufferNull(void)1428*6fee86a4SJeremy Kemp void testGetImageInfoBufferNull(void)
1429*6fee86a4SJeremy Kemp {
1430*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1431*6fee86a4SJeremy Kemp     clGetImageInfo_StubWithCallback(clGetImageInfo_testGetImageInfoBufferNull);
1432*6fee86a4SJeremy Kemp 
1433*6fee86a4SJeremy Kemp     cl::Image2D image(make_mem(0));
1434*6fee86a4SJeremy Kemp     cl::Buffer buffer = image.getImageInfo<CL_IMAGE_BUFFER>();
1435*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(buffer());
1436*6fee86a4SJeremy Kemp 
1437*6fee86a4SJeremy Kemp     // prevent destructor from interfering with the test
1438*6fee86a4SJeremy Kemp     image() = nullptr;
1439*6fee86a4SJeremy Kemp #endif
1440*6fee86a4SJeremy Kemp }
1441*6fee86a4SJeremy Kemp 
testGetImageInfoBufferOverwrite(void)1442*6fee86a4SJeremy Kemp void testGetImageInfoBufferOverwrite(void)
1443*6fee86a4SJeremy Kemp {
1444*6fee86a4SJeremy Kemp     clGetImageInfo_StubWithCallback(clGetImageInfo_testGetImageInfoBuffer);
1445*6fee86a4SJeremy Kemp     clReleaseMemObject_ExpectAndReturn(make_mem(2), CL_SUCCESS);
1446*6fee86a4SJeremy Kemp     clRetainMemObject_ExpectAndReturn(make_mem(1), CL_SUCCESS);
1447*6fee86a4SJeremy Kemp 
1448*6fee86a4SJeremy Kemp     cl::Image2D image(make_mem(0));
1449*6fee86a4SJeremy Kemp     cl::Buffer buffer(make_mem(2));
1450*6fee86a4SJeremy Kemp     cl_int status = image.getImageInfo(CL_IMAGE_BUFFER, &buffer);
1451*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, status);
1452*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(1), buffer());
1453*6fee86a4SJeremy Kemp 
1454*6fee86a4SJeremy Kemp     // prevent destructor from interfering with the test
1455*6fee86a4SJeremy Kemp     image() = nullptr;
1456*6fee86a4SJeremy Kemp     buffer() = nullptr;
1457*6fee86a4SJeremy Kemp }
1458*6fee86a4SJeremy Kemp 
1459*6fee86a4SJeremy Kemp /**
1460*6fee86a4SJeremy Kemp  * A stub for clCreateImage that creates an image from a buffer
1461*6fee86a4SJeremy Kemp  * passing the buffer's cl_mem straight through.
1462*6fee86a4SJeremy Kemp  */
clCreateImage_image1dbuffer(cl_context context,cl_mem_flags flags,const cl_image_format * image_format,const cl_image_desc * image_desc,void * host_ptr,cl_int * errcode_ret,int num_calls)1463*6fee86a4SJeremy Kemp cl_mem clCreateImage_image1dbuffer(
1464*6fee86a4SJeremy Kemp     cl_context context,
1465*6fee86a4SJeremy Kemp     cl_mem_flags flags,
1466*6fee86a4SJeremy Kemp     const cl_image_format *image_format,
1467*6fee86a4SJeremy Kemp     const cl_image_desc *image_desc,
1468*6fee86a4SJeremy Kemp     void *host_ptr,
1469*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
1470*6fee86a4SJeremy Kemp     int num_calls)
1471*6fee86a4SJeremy Kemp {
1472*6fee86a4SJeremy Kemp     (void) context;
1473*6fee86a4SJeremy Kemp     (void) flags;
1474*6fee86a4SJeremy Kemp     (void) host_ptr;
1475*6fee86a4SJeremy Kemp     (void) num_calls;
1476*6fee86a4SJeremy Kemp 
1477*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_format);
1478*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_desc);
1479*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_MEM_OBJECT_IMAGE1D_BUFFER, image_desc->image_type);
1480*6fee86a4SJeremy Kemp 
1481*6fee86a4SJeremy Kemp     if (errcode_ret != nullptr)
1482*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
1483*6fee86a4SJeremy Kemp 
1484*6fee86a4SJeremy Kemp     // Return the passed buffer as the cl_mem
1485*6fee86a4SJeremy Kemp     return image_desc->buffer;
1486*6fee86a4SJeremy Kemp }
1487*6fee86a4SJeremy Kemp 
testConstructImageFromBuffer(void)1488*6fee86a4SJeremy Kemp void testConstructImageFromBuffer(void)
1489*6fee86a4SJeremy Kemp {
1490*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 120
1491*6fee86a4SJeremy Kemp     const size_t width = 64;
1492*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1493*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1494*6fee86a4SJeremy Kemp     clCreateImage_StubWithCallback(clCreateImage_image1dbuffer);
1495*6fee86a4SJeremy Kemp     clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
1496*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
1497*6fee86a4SJeremy Kemp 
1498*6fee86a4SJeremy Kemp     cl::Context context(make_context(0));
1499*6fee86a4SJeremy Kemp     cl::Buffer buffer(make_mem(0));
1500*6fee86a4SJeremy Kemp     cl::Image1DBuffer image(
1501*6fee86a4SJeremy Kemp         context,
1502*6fee86a4SJeremy Kemp         CL_MEM_READ_ONLY,
1503*6fee86a4SJeremy Kemp         cl::ImageFormat(CL_R, CL_SIGNED_INT32),
1504*6fee86a4SJeremy Kemp         width,
1505*6fee86a4SJeremy Kemp         buffer);
1506*6fee86a4SJeremy Kemp 
1507*6fee86a4SJeremy Kemp     // Check that returned buffer matches the original
1508*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(buffer(), image());
1509*6fee86a4SJeremy Kemp 
1510*6fee86a4SJeremy Kemp     buffer() = nullptr;
1511*6fee86a4SJeremy Kemp #endif
1512*6fee86a4SJeremy Kemp }
1513*6fee86a4SJeremy Kemp 
1514*6fee86a4SJeremy Kemp /****************************************************************************
1515*6fee86a4SJeremy Kemp  * Tests for cl::Image2D
1516*6fee86a4SJeremy Kemp  ****************************************************************************/
1517*6fee86a4SJeremy Kemp 
1518*6fee86a4SJeremy Kemp void testMoveAssignImage2DNonNull(void);
1519*6fee86a4SJeremy Kemp void testMoveAssignImage2DNull(void);
1520*6fee86a4SJeremy Kemp void testMoveConstructImage2DNonNull(void);
1521*6fee86a4SJeremy Kemp void testMoveConstructImage2DNull(void);
MAKE_MOVE_TESTS(Image2D,make_mem,clReleaseMemObject,image2DPool)1522*6fee86a4SJeremy Kemp MAKE_MOVE_TESTS(Image2D, make_mem, clReleaseMemObject, image2DPool)
1523*6fee86a4SJeremy Kemp 
1524*6fee86a4SJeremy Kemp #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS
1525*6fee86a4SJeremy Kemp static cl_mem clCreateImage2D_testCreateImage2D_1_1(
1526*6fee86a4SJeremy Kemp     cl_context context,
1527*6fee86a4SJeremy Kemp     cl_mem_flags flags,
1528*6fee86a4SJeremy Kemp     const cl_image_format *image_format,
1529*6fee86a4SJeremy Kemp     size_t image_width,
1530*6fee86a4SJeremy Kemp     size_t image_height,
1531*6fee86a4SJeremy Kemp     size_t image_row_pitch,
1532*6fee86a4SJeremy Kemp     void *host_ptr,
1533*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
1534*6fee86a4SJeremy Kemp     int num_calls)
1535*6fee86a4SJeremy Kemp {
1536*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
1537*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context);
1538*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_MEM_READ_WRITE, flags);
1539*6fee86a4SJeremy Kemp 
1540*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_format);
1541*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_R, image_format->image_channel_order);
1542*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_FLOAT, image_format->image_channel_data_type);
1543*6fee86a4SJeremy Kemp 
1544*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(64, image_width);
1545*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(32, image_height);
1546*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(256, image_row_pitch);
1547*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(host_ptr);
1548*6fee86a4SJeremy Kemp 
1549*6fee86a4SJeremy Kemp     if (errcode_ret != nullptr)
1550*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
1551*6fee86a4SJeremy Kemp     return make_mem(0);
1552*6fee86a4SJeremy Kemp }
1553*6fee86a4SJeremy Kemp #endif
1554*6fee86a4SJeremy Kemp 
testCreateImage2D_1_1(void)1555*6fee86a4SJeremy Kemp void testCreateImage2D_1_1(void)
1556*6fee86a4SJeremy Kemp {
1557*6fee86a4SJeremy Kemp #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS
1558*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_device);
1559*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1560*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
1561*6fee86a4SJeremy Kemp     clCreateImage2D_StubWithCallback(clCreateImage2D_testCreateImage2D_1_1);
1562*6fee86a4SJeremy Kemp 
1563*6fee86a4SJeremy Kemp     cl_int err;
1564*6fee86a4SJeremy Kemp     cl::Context context;
1565*6fee86a4SJeremy Kemp     context() = make_context(0);
1566*6fee86a4SJeremy Kemp     cl::Image2D image(
1567*6fee86a4SJeremy Kemp         context, CL_MEM_READ_WRITE,
1568*6fee86a4SJeremy Kemp         cl::ImageFormat(CL_R, CL_FLOAT), 64, 32, 256, nullptr, &err);
1569*6fee86a4SJeremy Kemp 
1570*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
1571*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(0), image());
1572*6fee86a4SJeremy Kemp 
1573*6fee86a4SJeremy Kemp     context() = nullptr;
1574*6fee86a4SJeremy Kemp     image() = nullptr;
1575*6fee86a4SJeremy Kemp #endif
1576*6fee86a4SJeremy Kemp }
1577*6fee86a4SJeremy Kemp 
clCreateImage_testCreateImage2D_1_2(cl_context context,cl_mem_flags flags,const cl_image_format * image_format,const cl_image_desc * image_desc,void * host_ptr,cl_int * errcode_ret,int num_calls)1578*6fee86a4SJeremy Kemp static cl_mem clCreateImage_testCreateImage2D_1_2(
1579*6fee86a4SJeremy Kemp     cl_context context,
1580*6fee86a4SJeremy Kemp     cl_mem_flags flags,
1581*6fee86a4SJeremy Kemp     const cl_image_format *image_format,
1582*6fee86a4SJeremy Kemp     const cl_image_desc *image_desc,
1583*6fee86a4SJeremy Kemp     void *host_ptr,
1584*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
1585*6fee86a4SJeremy Kemp     int num_calls)
1586*6fee86a4SJeremy Kemp {
1587*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
1588*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context);
1589*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_MEM_READ_WRITE, flags);
1590*6fee86a4SJeremy Kemp 
1591*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_format);
1592*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_R, image_format->image_channel_order);
1593*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_FLOAT, image_format->image_channel_data_type);
1594*6fee86a4SJeremy Kemp 
1595*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_desc);
1596*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_MEM_OBJECT_IMAGE2D, image_desc->image_type);
1597*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(64, image_desc->image_width);
1598*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(32, image_desc->image_height);
1599*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(256, image_desc->image_row_pitch);
1600*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, image_desc->num_mip_levels);
1601*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, image_desc->num_samples);
1602*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(image_desc->buffer);
1603*6fee86a4SJeremy Kemp 
1604*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(host_ptr);
1605*6fee86a4SJeremy Kemp 
1606*6fee86a4SJeremy Kemp     if (errcode_ret != nullptr)
1607*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
1608*6fee86a4SJeremy Kemp     return make_mem(0);
1609*6fee86a4SJeremy Kemp }
1610*6fee86a4SJeremy Kemp 
testCreateImage2D_1_2(void)1611*6fee86a4SJeremy Kemp void testCreateImage2D_1_2(void)
1612*6fee86a4SJeremy Kemp {
1613*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_device);
1614*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1615*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1616*6fee86a4SJeremy Kemp     clCreateImage_StubWithCallback(clCreateImage_testCreateImage2D_1_2);
1617*6fee86a4SJeremy Kemp 
1618*6fee86a4SJeremy Kemp     cl_int err;
1619*6fee86a4SJeremy Kemp     cl::Context context;
1620*6fee86a4SJeremy Kemp     context() = make_context(0);
1621*6fee86a4SJeremy Kemp     cl::Image2D image(
1622*6fee86a4SJeremy Kemp         context, CL_MEM_READ_WRITE,
1623*6fee86a4SJeremy Kemp         cl::ImageFormat(CL_R, CL_FLOAT), 64, 32, 256, nullptr, &err);
1624*6fee86a4SJeremy Kemp 
1625*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
1626*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(0), image());
1627*6fee86a4SJeremy Kemp 
1628*6fee86a4SJeremy Kemp     context() = nullptr;
1629*6fee86a4SJeremy Kemp     image() = nullptr;
1630*6fee86a4SJeremy Kemp }
1631*6fee86a4SJeremy Kemp 
1632*6fee86a4SJeremy Kemp /****************************************************************************
1633*6fee86a4SJeremy Kemp  * Tests for cl::Image3D
1634*6fee86a4SJeremy Kemp  ****************************************************************************/
1635*6fee86a4SJeremy Kemp 
1636*6fee86a4SJeremy Kemp void testMoveAssignImage3DNonNull(void);
1637*6fee86a4SJeremy Kemp void testMoveAssignImage3DNull(void);
1638*6fee86a4SJeremy Kemp void testMoveConstructImage3DNonNull(void);
1639*6fee86a4SJeremy Kemp void testMoveConstructImage3DNull(void);
MAKE_MOVE_TESTS(Image3D,make_mem,clReleaseMemObject,image3DPool)1640*6fee86a4SJeremy Kemp MAKE_MOVE_TESTS(Image3D, make_mem, clReleaseMemObject, image3DPool)
1641*6fee86a4SJeremy Kemp 
1642*6fee86a4SJeremy Kemp #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS
1643*6fee86a4SJeremy Kemp static cl_mem clCreateImage3D_testCreateImage3D_1_1(
1644*6fee86a4SJeremy Kemp     cl_context context,
1645*6fee86a4SJeremy Kemp     cl_mem_flags flags,
1646*6fee86a4SJeremy Kemp     const cl_image_format *image_format,
1647*6fee86a4SJeremy Kemp     size_t image_width,
1648*6fee86a4SJeremy Kemp     size_t image_height,
1649*6fee86a4SJeremy Kemp     size_t image_depth,
1650*6fee86a4SJeremy Kemp     size_t image_row_pitch,
1651*6fee86a4SJeremy Kemp     size_t image_slice_pitch,
1652*6fee86a4SJeremy Kemp     void *host_ptr,
1653*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
1654*6fee86a4SJeremy Kemp     int num_calls)
1655*6fee86a4SJeremy Kemp {
1656*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
1657*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context);
1658*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, flags);
1659*6fee86a4SJeremy Kemp 
1660*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_format);
1661*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_R, image_format->image_channel_order);
1662*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_FLOAT, image_format->image_channel_data_type);
1663*6fee86a4SJeremy Kemp 
1664*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(64, image_width);
1665*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(32, image_height);
1666*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(16, image_depth);
1667*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(256, image_row_pitch);
1668*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(65536, image_slice_pitch);
1669*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR((void *)(size_t)0xdeadbeef, host_ptr);
1670*6fee86a4SJeremy Kemp 
1671*6fee86a4SJeremy Kemp     if (errcode_ret != nullptr)
1672*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
1673*6fee86a4SJeremy Kemp     return make_mem(0);
1674*6fee86a4SJeremy Kemp }
1675*6fee86a4SJeremy Kemp #endif
1676*6fee86a4SJeremy Kemp 
testCreateImage3D_1_1(void)1677*6fee86a4SJeremy Kemp void testCreateImage3D_1_1(void)
1678*6fee86a4SJeremy Kemp {
1679*6fee86a4SJeremy Kemp #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS
1680*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_device);
1681*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1682*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
1683*6fee86a4SJeremy Kemp     clCreateImage3D_StubWithCallback(clCreateImage3D_testCreateImage3D_1_1);
1684*6fee86a4SJeremy Kemp 
1685*6fee86a4SJeremy Kemp     cl_int err;
1686*6fee86a4SJeremy Kemp     cl::Context context;
1687*6fee86a4SJeremy Kemp     context() = make_context(0);
1688*6fee86a4SJeremy Kemp     cl::Image3D image(
1689*6fee86a4SJeremy Kemp         context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
1690*6fee86a4SJeremy Kemp         cl::ImageFormat(CL_R, CL_FLOAT), 64, 32, 16, 256, 65536, (void *)(size_t)0xdeadbeef, &err);
1691*6fee86a4SJeremy Kemp 
1692*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
1693*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(0), image());
1694*6fee86a4SJeremy Kemp 
1695*6fee86a4SJeremy Kemp     context() = nullptr;
1696*6fee86a4SJeremy Kemp     image() = nullptr;
1697*6fee86a4SJeremy Kemp #endif
1698*6fee86a4SJeremy Kemp }
1699*6fee86a4SJeremy Kemp 
clCreateImage_testCreateImage3D_1_2(cl_context context,cl_mem_flags flags,const cl_image_format * image_format,const cl_image_desc * image_desc,void * host_ptr,cl_int * errcode_ret,int num_calls)1700*6fee86a4SJeremy Kemp static cl_mem clCreateImage_testCreateImage3D_1_2(
1701*6fee86a4SJeremy Kemp     cl_context context,
1702*6fee86a4SJeremy Kemp     cl_mem_flags flags,
1703*6fee86a4SJeremy Kemp     const cl_image_format *image_format,
1704*6fee86a4SJeremy Kemp     const cl_image_desc *image_desc,
1705*6fee86a4SJeremy Kemp     void *host_ptr,
1706*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
1707*6fee86a4SJeremy Kemp     int num_calls)
1708*6fee86a4SJeremy Kemp {
1709*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
1710*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context);
1711*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, flags);
1712*6fee86a4SJeremy Kemp 
1713*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_format);
1714*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_R, image_format->image_channel_order);
1715*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_FLOAT, image_format->image_channel_data_type);
1716*6fee86a4SJeremy Kemp 
1717*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_desc);
1718*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_MEM_OBJECT_IMAGE3D, image_desc->image_type);
1719*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(64, image_desc->image_width);
1720*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(32, image_desc->image_height);
1721*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(16, image_desc->image_depth);
1722*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(256, image_desc->image_row_pitch);
1723*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(65536, image_desc->image_slice_pitch);
1724*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, image_desc->num_mip_levels);
1725*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, image_desc->num_samples);
1726*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(image_desc->buffer);
1727*6fee86a4SJeremy Kemp 
1728*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR((void *)(size_t)0xdeadbeef, host_ptr);
1729*6fee86a4SJeremy Kemp 
1730*6fee86a4SJeremy Kemp     if (errcode_ret != nullptr)
1731*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
1732*6fee86a4SJeremy Kemp     return make_mem(0);
1733*6fee86a4SJeremy Kemp }
1734*6fee86a4SJeremy Kemp 
testCreateImage3D_1_2(void)1735*6fee86a4SJeremy Kemp void testCreateImage3D_1_2(void)
1736*6fee86a4SJeremy Kemp {
1737*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_device);
1738*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
1739*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
1740*6fee86a4SJeremy Kemp     clCreateImage_StubWithCallback(clCreateImage_testCreateImage3D_1_2);
1741*6fee86a4SJeremy Kemp 
1742*6fee86a4SJeremy Kemp     cl_int err;
1743*6fee86a4SJeremy Kemp     cl::Context context;
1744*6fee86a4SJeremy Kemp     context() = make_context(0);
1745*6fee86a4SJeremy Kemp     cl::Image3D image(
1746*6fee86a4SJeremy Kemp         context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
1747*6fee86a4SJeremy Kemp         cl::ImageFormat(CL_R, CL_FLOAT), 64, 32, 16, 256, 65536, (void *)(size_t)0xdeadbeef, &err);
1748*6fee86a4SJeremy Kemp 
1749*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
1750*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(0), image());
1751*6fee86a4SJeremy Kemp 
1752*6fee86a4SJeremy Kemp     context() = nullptr;
1753*6fee86a4SJeremy Kemp     image() = nullptr;
1754*6fee86a4SJeremy Kemp }
1755*6fee86a4SJeremy Kemp 
1756*6fee86a4SJeremy Kemp /****************************************************************************
1757*6fee86a4SJeremy Kemp  * Tests for cl::Kernel
1758*6fee86a4SJeremy Kemp  ****************************************************************************/
1759*6fee86a4SJeremy Kemp void testMoveAssignKernelNonNull(void);
1760*6fee86a4SJeremy Kemp void testMoveAssignKernelNull(void);
1761*6fee86a4SJeremy Kemp void testMoveConstructKernelNonNull(void);
1762*6fee86a4SJeremy Kemp void testMoveConstructKernelNull(void);
1763*6fee86a4SJeremy Kemp MAKE_MOVE_TESTS(Kernel, make_kernel, clReleaseKernel, kernelPool)
1764*6fee86a4SJeremy Kemp 
1765*6fee86a4SJeremy Kemp static cl_int scalarArg;
1766*6fee86a4SJeremy Kemp static cl_int3 vectorArg;
1767*6fee86a4SJeremy Kemp 
testKernelSetArgScalar(void)1768*6fee86a4SJeremy Kemp void testKernelSetArgScalar(void)
1769*6fee86a4SJeremy Kemp {
1770*6fee86a4SJeremy Kemp     scalarArg = 0xcafebabe;
1771*6fee86a4SJeremy Kemp     clSetKernelArg_ExpectAndReturn(make_kernel(0), 3, 4, &scalarArg, CL_SUCCESS);
1772*6fee86a4SJeremy Kemp     kernelPool[0].setArg(3, scalarArg);
1773*6fee86a4SJeremy Kemp }
1774*6fee86a4SJeremy Kemp 
testKernelSetArgVector(void)1775*6fee86a4SJeremy Kemp void testKernelSetArgVector(void)
1776*6fee86a4SJeremy Kemp {
1777*6fee86a4SJeremy Kemp     vectorArg.s[0] = 0x12345678;
1778*6fee86a4SJeremy Kemp     vectorArg.s[1] = 0x23456789;
1779*6fee86a4SJeremy Kemp     vectorArg.s[2] = 0x87654321;
1780*6fee86a4SJeremy Kemp     clSetKernelArg_ExpectAndReturn(make_kernel(0), 2, 16, &vectorArg, CL_SUCCESS);
1781*6fee86a4SJeremy Kemp     kernelPool[0].setArg(2, vectorArg);
1782*6fee86a4SJeremy Kemp }
1783*6fee86a4SJeremy Kemp 
testKernelSetArgMem(void)1784*6fee86a4SJeremy Kemp void testKernelSetArgMem(void)
1785*6fee86a4SJeremy Kemp {
1786*6fee86a4SJeremy Kemp     clSetKernelArg_ExpectAndReturn(make_kernel(0), 1, sizeof(cl_mem), &bufferPool[1](), CL_SUCCESS);
1787*6fee86a4SJeremy Kemp     kernelPool[0].setArg(1, bufferPool[1]);
1788*6fee86a4SJeremy Kemp }
1789*6fee86a4SJeremy Kemp 
testKernelSetArgLocal(void)1790*6fee86a4SJeremy Kemp void testKernelSetArgLocal(void)
1791*6fee86a4SJeremy Kemp {
1792*6fee86a4SJeremy Kemp     clSetKernelArg_ExpectAndReturn(make_kernel(0), 2, 123, nullptr, CL_SUCCESS);
1793*6fee86a4SJeremy Kemp     kernelPool[0].setArg(2, cl::Local(123));
1794*6fee86a4SJeremy Kemp }
1795*6fee86a4SJeremy Kemp 
testKernelSetArgBySetKernelArgSVMPointerWithUniquePtrType(void)1796*6fee86a4SJeremy Kemp void testKernelSetArgBySetKernelArgSVMPointerWithUniquePtrType(void)
1797*6fee86a4SJeremy Kemp {
1798*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1799*6fee86a4SJeremy Kemp     std::unique_ptr<int> buffer(new int(1000));
1800*6fee86a4SJeremy Kemp     clSetKernelArgSVMPointer_ExpectAndReturn(make_kernel(0), 1, buffer.get(), CL_SUCCESS);
1801*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(kernelPool[0].setArg(1, buffer), CL_SUCCESS);
1802*6fee86a4SJeremy Kemp #endif
1803*6fee86a4SJeremy Kemp }
1804*6fee86a4SJeremy Kemp 
testKernelSetArgBySetKernelArgSVMPointerWithVectorType(void)1805*6fee86a4SJeremy Kemp void testKernelSetArgBySetKernelArgSVMPointerWithVectorType(void)
1806*6fee86a4SJeremy Kemp {
1807*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1808*6fee86a4SJeremy Kemp     VECTOR_CLASS<int> vec(1000);
1809*6fee86a4SJeremy Kemp     clSetKernelArgSVMPointer_ExpectAndReturn(make_kernel(1), 2, vec.data(), CL_SUCCESS);
1810*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(kernelPool[1].setArg(2, vec), CL_SUCCESS);
1811*6fee86a4SJeremy Kemp #endif
1812*6fee86a4SJeremy Kemp }
1813*6fee86a4SJeremy Kemp 
testKernelSetArgBySetKernelArgSVMPointerWithPointerType(void)1814*6fee86a4SJeremy Kemp void testKernelSetArgBySetKernelArgSVMPointerWithPointerType(void)
1815*6fee86a4SJeremy Kemp {
1816*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1817*6fee86a4SJeremy Kemp     cl_mem *memory = &bufferPool[1]();
1818*6fee86a4SJeremy Kemp     clSetKernelArgSVMPointer_ExpectAndReturn(make_kernel(2), 3, &bufferPool[1](), CL_SUCCESS);
1819*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(kernelPool[2].setArg(3, memory), CL_SUCCESS);
1820*6fee86a4SJeremy Kemp #endif
1821*6fee86a4SJeremy Kemp }
1822*6fee86a4SJeremy Kemp 
testKernelSetExecInfo(void)1823*6fee86a4SJeremy Kemp void testKernelSetExecInfo(void)
1824*6fee86a4SJeremy Kemp {
1825*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1826*6fee86a4SJeremy Kemp     cl_bool val = CL_TRUE;
1827*6fee86a4SJeremy Kemp     // Using CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM in the tests since it's
1828*6fee86a4SJeremy Kemp     // defined by the core spec but this function is particularly useful for
1829*6fee86a4SJeremy Kemp     // vendor extensions.
1830*6fee86a4SJeremy Kemp     clSetKernelExecInfo_ExpectAndReturn(make_kernel(0),
1831*6fee86a4SJeremy Kemp                                         CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM,
1832*6fee86a4SJeremy Kemp                                         sizeof(cl_bool), &val, CL_SUCCESS);
1833*6fee86a4SJeremy Kemp     kernelPool[0].setExecInfo(CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM, val);
1834*6fee86a4SJeremy Kemp     // Also test the typesafe version
1835*6fee86a4SJeremy Kemp     clSetKernelExecInfo_ExpectAndReturn(make_kernel(0),
1836*6fee86a4SJeremy Kemp                                         CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM,
1837*6fee86a4SJeremy Kemp                                         sizeof(cl_bool), &val, CL_SUCCESS);
1838*6fee86a4SJeremy Kemp     kernelPool[0].setExecInfo<CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM>(val);
1839*6fee86a4SJeremy Kemp #endif
1840*6fee86a4SJeremy Kemp }
1841*6fee86a4SJeremy Kemp 
1842*6fee86a4SJeremy Kemp 
clSetKernelExecInfo_setSVMPointers(cl_kernel kernel,cl_kernel_exec_info param_name,size_t param_value_size,const void * param_value,int cmock_num_calls)1843*6fee86a4SJeremy Kemp cl_int clSetKernelExecInfo_setSVMPointers(cl_kernel kernel,
1844*6fee86a4SJeremy Kemp                                 cl_kernel_exec_info param_name,
1845*6fee86a4SJeremy Kemp                                 size_t param_value_size,
1846*6fee86a4SJeremy Kemp                                 const void *param_value, int cmock_num_calls)
1847*6fee86a4SJeremy Kemp {
1848*6fee86a4SJeremy Kemp     (void) cmock_num_calls;
1849*6fee86a4SJeremy Kemp 
1850*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_kernel(0), kernel);
1851*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_KERNEL_EXEC_INFO_SVM_PTRS, param_name);
1852*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value_size == 2 * sizeof(void *));
1853*6fee86a4SJeremy Kemp 
1854*6fee86a4SJeremy Kemp     int** arr = (int **)param_value;
1855*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(arr[0], 0xaabbccdd);
1856*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(arr[1], 0xddccbbaa);
1857*6fee86a4SJeremy Kemp 
1858*6fee86a4SJeremy Kemp     return CL_SUCCESS;
1859*6fee86a4SJeremy Kemp }
1860*6fee86a4SJeremy Kemp 
testKernelSetSVMPointers(void)1861*6fee86a4SJeremy Kemp void testKernelSetSVMPointers(void)
1862*6fee86a4SJeremy Kemp {
1863*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1864*6fee86a4SJeremy Kemp     clSetKernelExecInfo_StubWithCallback(clSetKernelExecInfo_setSVMPointers);
1865*6fee86a4SJeremy Kemp 
1866*6fee86a4SJeremy Kemp     cl::vector<void *> vec = { (void *)(size_t)0xaabbccdd, (void *)(size_t)0xddccbbaa };
1867*6fee86a4SJeremy Kemp     cl_int ret = kernelPool[0].setSVMPointers(vec);
1868*6fee86a4SJeremy Kemp 
1869*6fee86a4SJeremy Kemp     cl_int expected = CL_SUCCESS;
1870*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(expected, ret);
1871*6fee86a4SJeremy Kemp #endif
1872*6fee86a4SJeremy Kemp }
clSetKernelExecInfo_EnableFineGrainedSystemSVM(cl_kernel kernel,cl_kernel_exec_info param_name,size_t param_value_size,const void * param_value,int cmock_num_calls)1873*6fee86a4SJeremy Kemp cl_int clSetKernelExecInfo_EnableFineGrainedSystemSVM(cl_kernel kernel,
1874*6fee86a4SJeremy Kemp                                  cl_kernel_exec_info param_name,
1875*6fee86a4SJeremy Kemp                                  size_t param_value_size,
1876*6fee86a4SJeremy Kemp                                  const void *param_value, int cmock_num_calls)
1877*6fee86a4SJeremy Kemp {
1878*6fee86a4SJeremy Kemp     (void) cmock_num_calls;
1879*6fee86a4SJeremy Kemp 
1880*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_kernel(0), kernel);
1881*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(*(cl_bool*)param_value, CL_FALSE);
1882*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM,param_name);
1883*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value_size == sizeof(cl_bool));
1884*6fee86a4SJeremy Kemp 
1885*6fee86a4SJeremy Kemp     return CL_SUCCESS;
1886*6fee86a4SJeremy Kemp }
testKernelEnableFineGrainedSystemSVM(void)1887*6fee86a4SJeremy Kemp void testKernelEnableFineGrainedSystemSVM(void)
1888*6fee86a4SJeremy Kemp {
1889*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1890*6fee86a4SJeremy Kemp     clSetKernelExecInfo_StubWithCallback(clSetKernelExecInfo_EnableFineGrainedSystemSVM);
1891*6fee86a4SJeremy Kemp     bool svmEnabled = false;
1892*6fee86a4SJeremy Kemp     cl_int ret = kernelPool[0].enableFineGrainedSystemSVM(svmEnabled);
1893*6fee86a4SJeremy Kemp     cl_int expected = CL_SUCCESS;
1894*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(expected, ret);
1895*6fee86a4SJeremy Kemp #endif
1896*6fee86a4SJeremy Kemp }
1897*6fee86a4SJeremy Kemp 
1898*6fee86a4SJeremy Kemp /****************************************************************************
1899*6fee86a4SJeremy Kemp  * Tests for cl::copy
1900*6fee86a4SJeremy Kemp  ****************************************************************************/
1901*6fee86a4SJeremy Kemp 
1902*6fee86a4SJeremy Kemp // This method should allocate some host accesible memory
1903*6fee86a4SJeremy Kemp // so we must do this ourselves
1904*6fee86a4SJeremy Kemp void *some_host_memory;
1905*6fee86a4SJeremy Kemp 
clEnqueueMapBuffer_testCopyHostToBuffer(cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_map,cl_map_flags map_flags,size_t offset,size_t size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event,cl_int * errcode_ret,int num_calls)1906*6fee86a4SJeremy Kemp static void * clEnqueueMapBuffer_testCopyHostToBuffer(
1907*6fee86a4SJeremy Kemp     cl_command_queue command_queue,
1908*6fee86a4SJeremy Kemp     cl_mem buffer,
1909*6fee86a4SJeremy Kemp     cl_bool blocking_map,
1910*6fee86a4SJeremy Kemp     cl_map_flags map_flags,
1911*6fee86a4SJeremy Kemp     size_t offset,
1912*6fee86a4SJeremy Kemp     size_t size,
1913*6fee86a4SJeremy Kemp     cl_uint num_events_in_wait_list,
1914*6fee86a4SJeremy Kemp     const cl_event *event_wait_list,
1915*6fee86a4SJeremy Kemp     cl_event *event,
1916*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
1917*6fee86a4SJeremy Kemp     int num_calls)
1918*6fee86a4SJeremy Kemp {
1919*6fee86a4SJeremy Kemp     (void) offset;
1920*6fee86a4SJeremy Kemp     (void) num_events_in_wait_list;
1921*6fee86a4SJeremy Kemp     (void) event_wait_list;
1922*6fee86a4SJeremy Kemp     (void) num_calls;
1923*6fee86a4SJeremy Kemp 
1924*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_command_queue(0), command_queue);
1925*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(0), buffer);
1926*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_TRUE, blocking_map);
1927*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_MAP_WRITE, map_flags);
1928*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(sizeof(int)*1024, size);
1929*6fee86a4SJeremy Kemp 
1930*6fee86a4SJeremy Kemp     some_host_memory = malloc(sizeof(int) * 1024);
1931*6fee86a4SJeremy Kemp 
1932*6fee86a4SJeremy Kemp     // Set the return event
1933*6fee86a4SJeremy Kemp     if (event)
1934*6fee86a4SJeremy Kemp         *event = nullptr;
1935*6fee86a4SJeremy Kemp 
1936*6fee86a4SJeremy Kemp     // Set the return error code
1937*6fee86a4SJeremy Kemp     if (errcode_ret)
1938*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
1939*6fee86a4SJeremy Kemp 
1940*6fee86a4SJeremy Kemp     return some_host_memory;
1941*6fee86a4SJeremy Kemp }
1942*6fee86a4SJeremy Kemp 
clEnqueueUnmapMemObject_testCopyHostToBuffer(cl_command_queue command_queue,cl_mem memobj,void * mapped_ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event,int num_calls)1943*6fee86a4SJeremy Kemp static cl_int clEnqueueUnmapMemObject_testCopyHostToBuffer(
1944*6fee86a4SJeremy Kemp     cl_command_queue  command_queue ,
1945*6fee86a4SJeremy Kemp     cl_mem  memobj,
1946*6fee86a4SJeremy Kemp     void  *mapped_ptr,
1947*6fee86a4SJeremy Kemp     cl_uint  num_events_in_wait_list ,
1948*6fee86a4SJeremy Kemp     const cl_event  *event_wait_list ,
1949*6fee86a4SJeremy Kemp     cl_event  *event,
1950*6fee86a4SJeremy Kemp     int num_calls)
1951*6fee86a4SJeremy Kemp {
1952*6fee86a4SJeremy Kemp     (void) num_events_in_wait_list;
1953*6fee86a4SJeremy Kemp     (void) event_wait_list;
1954*6fee86a4SJeremy Kemp     (void) num_calls;
1955*6fee86a4SJeremy Kemp 
1956*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_command_queue(0), command_queue);
1957*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(0), memobj);
1958*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(some_host_memory, mapped_ptr);
1959*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(event);
1960*6fee86a4SJeremy Kemp     return CL_SUCCESS;
1961*6fee86a4SJeremy Kemp }
1962*6fee86a4SJeremy Kemp 
clWaitForEvents_testCopyHostToBuffer(cl_uint num_events,const cl_event * event_list,int num_calls)1963*6fee86a4SJeremy Kemp static cl_int clWaitForEvents_testCopyHostToBuffer(
1964*6fee86a4SJeremy Kemp     cl_uint num_events,
1965*6fee86a4SJeremy Kemp     const cl_event *event_list,
1966*6fee86a4SJeremy Kemp     int num_calls)
1967*6fee86a4SJeremy Kemp {
1968*6fee86a4SJeremy Kemp     (void) num_calls;
1969*6fee86a4SJeremy Kemp 
1970*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(event_list);
1971*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(1, num_events);
1972*6fee86a4SJeremy Kemp     return CL_SUCCESS;
1973*6fee86a4SJeremy Kemp }
1974*6fee86a4SJeremy Kemp 
clReleaseEvent_testCopyHostToBuffer(cl_event event,int num_calls)1975*6fee86a4SJeremy Kemp static cl_int clReleaseEvent_testCopyHostToBuffer(
1976*6fee86a4SJeremy Kemp     cl_event event,
1977*6fee86a4SJeremy Kemp     int num_calls)
1978*6fee86a4SJeremy Kemp {
1979*6fee86a4SJeremy Kemp     (void) num_calls;
1980*6fee86a4SJeremy Kemp 
1981*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(event);
1982*6fee86a4SJeremy Kemp     return CL_SUCCESS;
1983*6fee86a4SJeremy Kemp }
1984*6fee86a4SJeremy Kemp 
testCopyHostToBuffer(void)1985*6fee86a4SJeremy Kemp void testCopyHostToBuffer(void)
1986*6fee86a4SJeremy Kemp {
1987*6fee86a4SJeremy Kemp     cl_context context_expect = make_context(0);
1988*6fee86a4SJeremy Kemp     int context_refcount = 1;
1989*6fee86a4SJeremy Kemp     prepare_contextRefcounts(1, &context_expect, &context_refcount);
1990*6fee86a4SJeremy Kemp     cl::Context context = contextPool[0];
1991*6fee86a4SJeremy Kemp 
1992*6fee86a4SJeremy Kemp     cl_mem mem_expect = make_mem(0);
1993*6fee86a4SJeremy Kemp     int mem_refcount = 1;
1994*6fee86a4SJeremy Kemp     prepare_memRefcounts(1, &mem_expect, &mem_refcount);
1995*6fee86a4SJeremy Kemp     cl::Buffer buffer(make_mem(0));
1996*6fee86a4SJeremy Kemp 
1997*6fee86a4SJeremy Kemp     cl_command_queue queue_expect = make_command_queue(0);
1998*6fee86a4SJeremy Kemp     cl::CommandQueue queue(queue_expect);
1999*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(queue_expect, CL_SUCCESS);
2000*6fee86a4SJeremy Kemp 
2001*6fee86a4SJeremy Kemp     // Returns the pointer to host memory
2002*6fee86a4SJeremy Kemp     clEnqueueMapBuffer_StubWithCallback(clEnqueueMapBuffer_testCopyHostToBuffer);
2003*6fee86a4SJeremy Kemp     clEnqueueUnmapMemObject_StubWithCallback(clEnqueueUnmapMemObject_testCopyHostToBuffer);
2004*6fee86a4SJeremy Kemp 
2005*6fee86a4SJeremy Kemp     clWaitForEvents_StubWithCallback(clWaitForEvents_testCopyHostToBuffer);
2006*6fee86a4SJeremy Kemp     clReleaseEvent_StubWithCallback(clReleaseEvent_testCopyHostToBuffer);
2007*6fee86a4SJeremy Kemp 
2008*6fee86a4SJeremy Kemp     std::vector<int> host(1024);
2009*6fee86a4SJeremy Kemp     for (int i = 0; i < 1024; i++)
2010*6fee86a4SJeremy Kemp         host[i] = i;
2011*6fee86a4SJeremy Kemp 
2012*6fee86a4SJeremy Kemp     cl::copy(queue, host.begin(), host.end(), buffer);
2013*6fee86a4SJeremy Kemp 
2014*6fee86a4SJeremy Kemp     // Check that the memory was copied to some_host_memory
2015*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_MEMORY(&host[0], some_host_memory, sizeof(int) * 1024);
2016*6fee86a4SJeremy Kemp 
2017*6fee86a4SJeremy Kemp     free(some_host_memory);
2018*6fee86a4SJeremy Kemp 
2019*6fee86a4SJeremy Kemp }
2020*6fee86a4SJeremy Kemp 
2021*6fee86a4SJeremy Kemp /****************************************************************************
2022*6fee86a4SJeremy Kemp * Tests for building Programs
2023*6fee86a4SJeremy Kemp ****************************************************************************/
2024*6fee86a4SJeremy Kemp 
clGetDeviceInfo_testGetBuildInfo(cl_device_id device,cl_device_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)2025*6fee86a4SJeremy Kemp static cl_int clGetDeviceInfo_testGetBuildInfo(
2026*6fee86a4SJeremy Kemp     cl_device_id device,
2027*6fee86a4SJeremy Kemp     cl_device_info param_name,
2028*6fee86a4SJeremy Kemp     size_t param_value_size,
2029*6fee86a4SJeremy Kemp     void *param_value,
2030*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
2031*6fee86a4SJeremy Kemp     int num_calls)
2032*6fee86a4SJeremy Kemp {
2033*6fee86a4SJeremy Kemp     (void) device;
2034*6fee86a4SJeremy Kemp     (void) num_calls;
2035*6fee86a4SJeremy Kemp 
2036*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(param_name, CL_DEVICE_PLATFORM);
2037*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(param_value_size, sizeof(cl_platform_id));
2038*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_EQUAL(param_value, nullptr);
2039*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(param_value_size_ret, nullptr);
2040*6fee86a4SJeremy Kemp     cl_platform_id temp = make_platform_id(0);
2041*6fee86a4SJeremy Kemp     memcpy(param_value, &temp, sizeof(cl_platform_id));
2042*6fee86a4SJeremy Kemp     return CL_SUCCESS;
2043*6fee86a4SJeremy Kemp }
2044*6fee86a4SJeremy Kemp 
2045*6fee86a4SJeremy Kemp 
clGetProgramBuildInfo_testGetBuildInfo(cl_program program,cl_device_id device,cl_program_build_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)2046*6fee86a4SJeremy Kemp static  cl_int clGetProgramBuildInfo_testGetBuildInfo(
2047*6fee86a4SJeremy Kemp     cl_program program,
2048*6fee86a4SJeremy Kemp     cl_device_id device,
2049*6fee86a4SJeremy Kemp     cl_program_build_info param_name,
2050*6fee86a4SJeremy Kemp     size_t param_value_size,
2051*6fee86a4SJeremy Kemp     void *param_value,
2052*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
2053*6fee86a4SJeremy Kemp     int num_calls)
2054*6fee86a4SJeremy Kemp {
2055*6fee86a4SJeremy Kemp     (void) program;
2056*6fee86a4SJeremy Kemp     (void) device;
2057*6fee86a4SJeremy Kemp     (void) num_calls;
2058*6fee86a4SJeremy Kemp 
2059*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(param_name, CL_PROGRAM_BUILD_LOG);
2060*6fee86a4SJeremy Kemp 
2061*6fee86a4SJeremy Kemp     const char returnString[] =
2062*6fee86a4SJeremy Kemp         "This is the string returned by the build info function.";
2063*6fee86a4SJeremy Kemp     if (param_value) {
2064*6fee86a4SJeremy Kemp         ::size_t returnSize = param_value_size;
2065*6fee86a4SJeremy Kemp         if (sizeof(returnString) < returnSize) {
2066*6fee86a4SJeremy Kemp             returnSize = sizeof(returnString);
2067*6fee86a4SJeremy Kemp         }
2068*6fee86a4SJeremy Kemp         memcpy(param_value, returnString, returnSize);
2069*6fee86a4SJeremy Kemp     }
2070*6fee86a4SJeremy Kemp     else {
2071*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
2072*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(returnString);
2073*6fee86a4SJeremy Kemp         }
2074*6fee86a4SJeremy Kemp     }
2075*6fee86a4SJeremy Kemp 
2076*6fee86a4SJeremy Kemp     return CL_SUCCESS;
2077*6fee86a4SJeremy Kemp }
2078*6fee86a4SJeremy Kemp 
testGetBuildInfo(void)2079*6fee86a4SJeremy Kemp void testGetBuildInfo(void)
2080*6fee86a4SJeremy Kemp {
2081*6fee86a4SJeremy Kemp     cl_device_id fakeDevice = make_device_id(0);
2082*6fee86a4SJeremy Kemp     clGetDeviceInfo_ExpectAndReturn(fakeDevice, CL_DEVICE_PLATFORM, sizeof(cl_platform_id), nullptr, nullptr, CL_SUCCESS);
2083*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_testGetBuildInfo);
2084*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
2085*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
2086*6fee86a4SJeremy Kemp     clGetProgramBuildInfo_StubWithCallback(clGetProgramBuildInfo_testGetBuildInfo);
2087*6fee86a4SJeremy Kemp     clGetProgramBuildInfo_StubWithCallback(clGetProgramBuildInfo_testGetBuildInfo);
2088*6fee86a4SJeremy Kemp 
2089*6fee86a4SJeremy Kemp     cl::Program prog(make_program(0));
2090*6fee86a4SJeremy Kemp     cl::Device dev(fakeDevice);
2091*6fee86a4SJeremy Kemp 
2092*6fee86a4SJeremy Kemp     cl_int err;
2093*6fee86a4SJeremy Kemp     std::string log = prog.getBuildInfo<CL_PROGRAM_BUILD_LOG>(dev, &err);
2094*6fee86a4SJeremy Kemp 
2095*6fee86a4SJeremy Kemp     prog() = nullptr;
2096*6fee86a4SJeremy Kemp     dev() = nullptr;
2097*6fee86a4SJeremy Kemp }
2098*6fee86a4SJeremy Kemp 
clBuildProgram_testBuildProgram(cl_program program,cl_uint num_devices,const cl_device_id * device_list,const char * options,void (CL_CALLBACK * pfn_notify)(cl_program program,void * user_data),void * user_data,int num_calls)2099*6fee86a4SJeremy Kemp static cl_int clBuildProgram_testBuildProgram(
2100*6fee86a4SJeremy Kemp     cl_program           program,
2101*6fee86a4SJeremy Kemp     cl_uint              num_devices,
2102*6fee86a4SJeremy Kemp     const cl_device_id * device_list,
2103*6fee86a4SJeremy Kemp     const char *         options,
2104*6fee86a4SJeremy Kemp     void (CL_CALLBACK *  pfn_notify)(cl_program program, void * user_data),
2105*6fee86a4SJeremy Kemp     void *               user_data,
2106*6fee86a4SJeremy Kemp     int num_calls)
2107*6fee86a4SJeremy Kemp {
2108*6fee86a4SJeremy Kemp     (void) num_calls;
2109*6fee86a4SJeremy Kemp 
2110*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(program, make_program(0));
2111*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_EQUAL(num_devices, 0);
2112*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_EQUAL(device_list, nullptr);
2113*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(options, nullptr);
2114*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(pfn_notify, nullptr);
2115*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(user_data, nullptr);
2116*6fee86a4SJeremy Kemp 
2117*6fee86a4SJeremy Kemp     for (cl_uint i = 0; i < num_devices; i++) {
2118*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(device_list[i], make_device_id(i));
2119*6fee86a4SJeremy Kemp     }
2120*6fee86a4SJeremy Kemp 
2121*6fee86a4SJeremy Kemp     return CL_SUCCESS;
2122*6fee86a4SJeremy Kemp }
2123*6fee86a4SJeremy Kemp 
testBuildProgramSingleDevice(void)2124*6fee86a4SJeremy Kemp void testBuildProgramSingleDevice(void)
2125*6fee86a4SJeremy Kemp {
2126*6fee86a4SJeremy Kemp     cl_program program = make_program(0);
2127*6fee86a4SJeremy Kemp     cl_device_id device_id = make_device_id(0);
2128*6fee86a4SJeremy Kemp 
2129*6fee86a4SJeremy Kemp     // Creating a device queries the platform version:
2130*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
2131*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
2132*6fee86a4SJeremy Kemp 
2133*6fee86a4SJeremy Kemp     clBuildProgram_StubWithCallback(clBuildProgram_testBuildProgram);
2134*6fee86a4SJeremy Kemp 
2135*6fee86a4SJeremy Kemp     // Building the program queries the program build log:
2136*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
2137*6fee86a4SJeremy Kemp     clGetProgramBuildInfo_StubWithCallback(clGetProgramBuildInfo_testGetBuildInfo);
2138*6fee86a4SJeremy Kemp     clGetProgramBuildInfo_StubWithCallback(clGetProgramBuildInfo_testGetBuildInfo);
2139*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
2140*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
2141*6fee86a4SJeremy Kemp 
2142*6fee86a4SJeremy Kemp     clReleaseProgram_ExpectAndReturn(program, CL_SUCCESS);
2143*6fee86a4SJeremy Kemp 
2144*6fee86a4SJeremy Kemp     cl::Program prog(program);
2145*6fee86a4SJeremy Kemp     cl::Device dev(device_id);
2146*6fee86a4SJeremy Kemp 
2147*6fee86a4SJeremy Kemp     cl_int errcode = prog.build(dev);
2148*6fee86a4SJeremy Kemp 
2149*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(errcode, CL_SUCCESS);
2150*6fee86a4SJeremy Kemp }
2151*6fee86a4SJeremy Kemp 
2152*6fee86a4SJeremy Kemp /**
2153*6fee86a4SJeremy Kemp * Stub implementation of clGetCommandQueueInfo that returns first one image then none
2154*6fee86a4SJeremy Kemp */
clGetSupportedImageFormats_testGetSupportedImageFormats(cl_context context,cl_mem_flags flags,cl_mem_object_type image_type,cl_uint num_entries,cl_image_format * image_formats,cl_uint * num_image_formats,int num_calls)2155*6fee86a4SJeremy Kemp static cl_int clGetSupportedImageFormats_testGetSupportedImageFormats(
2156*6fee86a4SJeremy Kemp     cl_context context,
2157*6fee86a4SJeremy Kemp     cl_mem_flags flags,
2158*6fee86a4SJeremy Kemp     cl_mem_object_type image_type,
2159*6fee86a4SJeremy Kemp     cl_uint num_entries,
2160*6fee86a4SJeremy Kemp     cl_image_format *image_formats,
2161*6fee86a4SJeremy Kemp     cl_uint *num_image_formats,
2162*6fee86a4SJeremy Kemp     int num_calls)
2163*6fee86a4SJeremy Kemp {
2164*6fee86a4SJeremy Kemp     (void) context;
2165*6fee86a4SJeremy Kemp     (void) flags;
2166*6fee86a4SJeremy Kemp     (void) image_type;
2167*6fee86a4SJeremy Kemp 
2168*6fee86a4SJeremy Kemp     // Catch failure case that causes error in bugzilla 13355:
2169*6fee86a4SJeremy Kemp     // returns CL_INVALID_VALUE if flags or image_type are not valid,
2170*6fee86a4SJeremy Kemp     // or if num_entries is 0 and image_formats is not nullptr.
2171*6fee86a4SJeremy Kemp     if (num_entries == 0 && image_formats != nullptr) {
2172*6fee86a4SJeremy Kemp         return CL_INVALID_VALUE;
2173*6fee86a4SJeremy Kemp     }
2174*6fee86a4SJeremy Kemp     if (num_entries == 0)  {
2175*6fee86a4SJeremy Kemp         // If num_entries was 0 this is the query for number
2176*6fee86a4SJeremy Kemp         if (num_image_formats) {
2177*6fee86a4SJeremy Kemp             if (num_calls == 0) {
2178*6fee86a4SJeremy Kemp                 *num_image_formats = 1;
2179*6fee86a4SJeremy Kemp             }
2180*6fee86a4SJeremy Kemp             else {
2181*6fee86a4SJeremy Kemp                 *num_image_formats = 0;
2182*6fee86a4SJeremy Kemp             }
2183*6fee86a4SJeremy Kemp         }
2184*6fee86a4SJeremy Kemp     }
2185*6fee86a4SJeremy Kemp     else {
2186*6fee86a4SJeremy Kemp         // Should return something
2187*6fee86a4SJeremy Kemp         TEST_ASSERT_NOT_NULL(image_formats);
2188*6fee86a4SJeremy Kemp 
2189*6fee86a4SJeremy Kemp         // For first call we should return one format here
2190*6fee86a4SJeremy Kemp         if (num_calls == 1) {
2191*6fee86a4SJeremy Kemp             TEST_ASSERT_EQUAL(num_entries, 1);
2192*6fee86a4SJeremy Kemp             image_formats[0] = cl::ImageFormat(CL_RGB, CL_FLOAT);
2193*6fee86a4SJeremy Kemp         }
2194*6fee86a4SJeremy Kemp     }
2195*6fee86a4SJeremy Kemp 
2196*6fee86a4SJeremy Kemp     return CL_SUCCESS;
2197*6fee86a4SJeremy Kemp }
2198*6fee86a4SJeremy Kemp 
testGetSupportedImageFormats(void)2199*6fee86a4SJeremy Kemp void testGetSupportedImageFormats(void)
2200*6fee86a4SJeremy Kemp {
2201*6fee86a4SJeremy Kemp     cl_context ctx_cl = make_context(0);
2202*6fee86a4SJeremy Kemp 
2203*6fee86a4SJeremy Kemp     clGetSupportedImageFormats_StubWithCallback(clGetSupportedImageFormats_testGetSupportedImageFormats);
2204*6fee86a4SJeremy Kemp     clGetSupportedImageFormats_StubWithCallback(clGetSupportedImageFormats_testGetSupportedImageFormats);
2205*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
2206*6fee86a4SJeremy Kemp 
2207*6fee86a4SJeremy Kemp     cl::Context ctx(ctx_cl);
2208*6fee86a4SJeremy Kemp     std::vector<cl::ImageFormat> formats;
2209*6fee86a4SJeremy Kemp     cl_int ret = CL_SUCCESS;
2210*6fee86a4SJeremy Kemp 
2211*6fee86a4SJeremy Kemp     ret = ctx.getSupportedImageFormats(
2212*6fee86a4SJeremy Kemp         CL_MEM_READ_WRITE,
2213*6fee86a4SJeremy Kemp         CL_MEM_OBJECT_IMAGE2D,
2214*6fee86a4SJeremy Kemp         &formats);
2215*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(ret, CL_SUCCESS);
2216*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(formats.size(), 1);
2217*6fee86a4SJeremy Kemp     ret = ctx.getSupportedImageFormats(
2218*6fee86a4SJeremy Kemp         CL_MEM_READ_WRITE,
2219*6fee86a4SJeremy Kemp         CL_MEM_OBJECT_IMAGE2D,
2220*6fee86a4SJeremy Kemp         &formats);
2221*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(formats.size(), 0);
2222*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(ret, CL_SUCCESS);
2223*6fee86a4SJeremy Kemp }
2224*6fee86a4SJeremy Kemp 
testCreateSubDevice(void)2225*6fee86a4SJeremy Kemp void testCreateSubDevice(void)
2226*6fee86a4SJeremy Kemp {
2227*6fee86a4SJeremy Kemp     // TODO
2228*6fee86a4SJeremy Kemp 
2229*6fee86a4SJeremy Kemp }
2230*6fee86a4SJeremy Kemp 
testGetContextInfoDevices(void)2231*6fee86a4SJeremy Kemp void testGetContextInfoDevices(void)
2232*6fee86a4SJeremy Kemp {
2233*6fee86a4SJeremy Kemp     // TODO
2234*6fee86a4SJeremy Kemp }
2235*6fee86a4SJeremy Kemp 
2236*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
clCreateImage_testCreateImage2DFromBuffer_2_0(cl_context context,cl_mem_flags flags,const cl_image_format * image_format,const cl_image_desc * image_desc,void * host_ptr,cl_int * errcode_ret,int num_calls)2237*6fee86a4SJeremy Kemp static cl_mem clCreateImage_testCreateImage2DFromBuffer_2_0(
2238*6fee86a4SJeremy Kemp     cl_context context,
2239*6fee86a4SJeremy Kemp     cl_mem_flags flags,
2240*6fee86a4SJeremy Kemp     const cl_image_format *image_format,
2241*6fee86a4SJeremy Kemp     const cl_image_desc *image_desc,
2242*6fee86a4SJeremy Kemp     void *host_ptr,
2243*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
2244*6fee86a4SJeremy Kemp     int num_calls)
2245*6fee86a4SJeremy Kemp {
2246*6fee86a4SJeremy Kemp     (void) context;
2247*6fee86a4SJeremy Kemp     (void) flags;
2248*6fee86a4SJeremy Kemp     (void) num_calls;
2249*6fee86a4SJeremy Kemp 
2250*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_format);
2251*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_desc);
2252*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(host_ptr);
2253*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_MEM_OBJECT_IMAGE2D, image_desc->image_type);
2254*6fee86a4SJeremy Kemp 
2255*6fee86a4SJeremy Kemp     // Return the passed buffer as the cl_mem and success for the error code
2256*6fee86a4SJeremy Kemp     if (errcode_ret) {
2257*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
2258*6fee86a4SJeremy Kemp     }
2259*6fee86a4SJeremy Kemp     return image_desc->buffer;
2260*6fee86a4SJeremy Kemp }
2261*6fee86a4SJeremy Kemp #endif
2262*6fee86a4SJeremy Kemp 
testCreateImage2DFromBuffer_2_0(void)2263*6fee86a4SJeremy Kemp void testCreateImage2DFromBuffer_2_0(void)
2264*6fee86a4SJeremy Kemp {
2265*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
2266*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_device);
2267*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
2268*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
2269*6fee86a4SJeremy Kemp     clCreateImage_StubWithCallback(clCreateImage_testCreateImage2DFromBuffer_2_0);
2270*6fee86a4SJeremy Kemp     clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
2271*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
2272*6fee86a4SJeremy Kemp 
2273*6fee86a4SJeremy Kemp     cl_int err;
2274*6fee86a4SJeremy Kemp     cl::Context context(make_context(0));
2275*6fee86a4SJeremy Kemp 
2276*6fee86a4SJeremy Kemp     // Create buffer
2277*6fee86a4SJeremy Kemp     // Create image from buffer
2278*6fee86a4SJeremy Kemp     cl::Buffer buffer(make_mem(0));
2279*6fee86a4SJeremy Kemp     cl::Image2D imageFromBuffer(
2280*6fee86a4SJeremy Kemp         context,
2281*6fee86a4SJeremy Kemp         cl::ImageFormat(CL_R, CL_FLOAT), buffer, 64, 32, 256, &err);
2282*6fee86a4SJeremy Kemp 
2283*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(buffer(), imageFromBuffer());
2284*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
2285*6fee86a4SJeremy Kemp 
2286*6fee86a4SJeremy Kemp     buffer() = nullptr;
2287*6fee86a4SJeremy Kemp #endif
2288*6fee86a4SJeremy Kemp }
2289*6fee86a4SJeremy Kemp 
2290*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
clCreateImage_testCreateImage2D_2_0(cl_context context,cl_mem_flags flags,const cl_image_format * image_format,const cl_image_desc * image_desc,void * host_ptr,cl_int * errcode_ret,int num_calls)2291*6fee86a4SJeremy Kemp static cl_mem clCreateImage_testCreateImage2D_2_0(
2292*6fee86a4SJeremy Kemp     cl_context context,
2293*6fee86a4SJeremy Kemp     cl_mem_flags flags,
2294*6fee86a4SJeremy Kemp     const cl_image_format *image_format,
2295*6fee86a4SJeremy Kemp     const cl_image_desc *image_desc,
2296*6fee86a4SJeremy Kemp     void *host_ptr,
2297*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
2298*6fee86a4SJeremy Kemp     int num_calls)
2299*6fee86a4SJeremy Kemp {
2300*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
2301*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context);
2302*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_MEM_READ_WRITE, flags);
2303*6fee86a4SJeremy Kemp 
2304*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_format);
2305*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_RGBA, image_format->image_channel_order);
2306*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_FLOAT, image_format->image_channel_data_type);
2307*6fee86a4SJeremy Kemp 
2308*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_desc);
2309*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_MEM_OBJECT_IMAGE2D, image_desc->image_type);
2310*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(64, image_desc->image_width);
2311*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(32, image_desc->image_height);
2312*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(256, image_desc->image_row_pitch);
2313*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, image_desc->num_mip_levels);
2314*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, image_desc->num_samples);
2315*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(image_desc->buffer);
2316*6fee86a4SJeremy Kemp 
2317*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(host_ptr);
2318*6fee86a4SJeremy Kemp 
2319*6fee86a4SJeremy Kemp     if (errcode_ret != nullptr)
2320*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
2321*6fee86a4SJeremy Kemp     return make_mem(0);
2322*6fee86a4SJeremy Kemp }
2323*6fee86a4SJeremy Kemp #endif
2324*6fee86a4SJeremy Kemp 
2325*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
clCreateImage_testCreateImage2DFromImage_2_0(cl_context context,cl_mem_flags flags,const cl_image_format * image_format,const cl_image_desc * image_desc,void * host_ptr,cl_int * errcode_ret,int num_calls)2326*6fee86a4SJeremy Kemp static cl_mem clCreateImage_testCreateImage2DFromImage_2_0(
2327*6fee86a4SJeremy Kemp     cl_context context,
2328*6fee86a4SJeremy Kemp     cl_mem_flags flags,
2329*6fee86a4SJeremy Kemp     const cl_image_format *image_format,
2330*6fee86a4SJeremy Kemp     const cl_image_desc *image_desc,
2331*6fee86a4SJeremy Kemp     void *host_ptr,
2332*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
2333*6fee86a4SJeremy Kemp     int num_calls)
2334*6fee86a4SJeremy Kemp {
2335*6fee86a4SJeremy Kemp     (void) context;
2336*6fee86a4SJeremy Kemp     (void) flags;
2337*6fee86a4SJeremy Kemp     (void) num_calls;
2338*6fee86a4SJeremy Kemp 
2339*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_format);
2340*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(image_desc);
2341*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(host_ptr);
2342*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_MEM_OBJECT_IMAGE2D, image_desc->image_type);
2343*6fee86a4SJeremy Kemp 
2344*6fee86a4SJeremy Kemp     // Return the passed buffer as the cl_mem and success for the error code
2345*6fee86a4SJeremy Kemp     if (errcode_ret) {
2346*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
2347*6fee86a4SJeremy Kemp     }
2348*6fee86a4SJeremy Kemp     return image_desc->buffer;
2349*6fee86a4SJeremy Kemp }
2350*6fee86a4SJeremy Kemp #endif
2351*6fee86a4SJeremy Kemp 
2352*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
clGetImageInfo_testCreateImage2DFromImage_2_0(cl_mem image,cl_image_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)2353*6fee86a4SJeremy Kemp static cl_int clGetImageInfo_testCreateImage2DFromImage_2_0(
2354*6fee86a4SJeremy Kemp     cl_mem image,
2355*6fee86a4SJeremy Kemp     cl_image_info param_name,
2356*6fee86a4SJeremy Kemp     size_t param_value_size,
2357*6fee86a4SJeremy Kemp     void *param_value,
2358*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
2359*6fee86a4SJeremy Kemp     int num_calls)
2360*6fee86a4SJeremy Kemp {
2361*6fee86a4SJeremy Kemp     (void) image;
2362*6fee86a4SJeremy Kemp     (void) param_name;
2363*6fee86a4SJeremy Kemp     (void) param_value_size;
2364*6fee86a4SJeremy Kemp     (void) param_value;
2365*6fee86a4SJeremy Kemp     (void) param_value_size_ret;
2366*6fee86a4SJeremy Kemp 
2367*6fee86a4SJeremy Kemp     TEST_ASSERT_INT_WITHIN(6, 0, num_calls);
2368*6fee86a4SJeremy Kemp     return CL_SUCCESS;
2369*6fee86a4SJeremy Kemp }
2370*6fee86a4SJeremy Kemp #endif
2371*6fee86a4SJeremy Kemp 
testCreateImage2DFromImage_2_0(void)2372*6fee86a4SJeremy Kemp void testCreateImage2DFromImage_2_0(void)
2373*6fee86a4SJeremy Kemp {
2374*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
2375*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_device);
2376*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
2377*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
2378*6fee86a4SJeremy Kemp     clCreateImage_StubWithCallback(clCreateImage_testCreateImage2D_2_0);
2379*6fee86a4SJeremy Kemp 
2380*6fee86a4SJeremy Kemp 
2381*6fee86a4SJeremy Kemp     cl_int err;
2382*6fee86a4SJeremy Kemp     cl::Context context(make_context(0));
2383*6fee86a4SJeremy Kemp 
2384*6fee86a4SJeremy Kemp     // As in 1.2 2D image test, needed as source for image-from-image
2385*6fee86a4SJeremy Kemp     cl::Image2D image(
2386*6fee86a4SJeremy Kemp         context, CL_MEM_READ_WRITE,
2387*6fee86a4SJeremy Kemp         cl::ImageFormat(CL_RGBA, CL_FLOAT), 64, 32, 256, nullptr, &err);
2388*6fee86a4SJeremy Kemp 
2389*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
2390*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(0), image());
2391*6fee86a4SJeremy Kemp 
2392*6fee86a4SJeremy Kemp     // Continue state for next phase
2393*6fee86a4SJeremy Kemp     clGetImageInfo_StubWithCallback(clGetImageInfo_testCreateImage2DFromImage_2_0);
2394*6fee86a4SJeremy Kemp     clCreateImage_StubWithCallback(clCreateImage_testCreateImage2DFromImage_2_0);
2395*6fee86a4SJeremy Kemp     clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
2396*6fee86a4SJeremy Kemp     clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
2397*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
2398*6fee86a4SJeremy Kemp 
2399*6fee86a4SJeremy Kemp     // Create 2D image from 2D Image with a new channel order
2400*6fee86a4SJeremy Kemp     cl::Image2D imageFromImage(
2401*6fee86a4SJeremy Kemp         context,
2402*6fee86a4SJeremy Kemp         CL_sRGB,
2403*6fee86a4SJeremy Kemp         image,
2404*6fee86a4SJeremy Kemp         &err
2405*6fee86a4SJeremy Kemp         );
2406*6fee86a4SJeremy Kemp 
2407*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
2408*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(image(), imageFromImage());
2409*6fee86a4SJeremy Kemp 
2410*6fee86a4SJeremy Kemp     //imageFromImage() = nullptr;
2411*6fee86a4SJeremy Kemp     //image() = nullptr;
2412*6fee86a4SJeremy Kemp     //context() = nullptr;
2413*6fee86a4SJeremy Kemp #endif
2414*6fee86a4SJeremy Kemp }
2415*6fee86a4SJeremy Kemp 
2416*6fee86a4SJeremy Kemp // Note that default tests maintain state when run from the same
2417*6fee86a4SJeremy Kemp // unit process.
2418*6fee86a4SJeremy Kemp // One default setting test will maintain the defaults until the end.
testSetDefaultPlatform(void)2419*6fee86a4SJeremy Kemp void testSetDefaultPlatform(void)
2420*6fee86a4SJeremy Kemp {
2421*6fee86a4SJeremy Kemp     cl::Platform p(make_platform_id(1));
2422*6fee86a4SJeremy Kemp     cl::Platform p2 = cl::Platform::setDefault(p);
2423*6fee86a4SJeremy Kemp     cl::Platform p3 = cl::Platform::getDefault();
2424*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(p(), p2());
2425*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(p(), p3());
2426*6fee86a4SJeremy Kemp }
2427*6fee86a4SJeremy Kemp 
2428*6fee86a4SJeremy Kemp // Note that default tests maintain state when run from the same
2429*6fee86a4SJeremy Kemp // unit process.
2430*6fee86a4SJeremy Kemp // One default setting test will maintain the defaults until the end.
testSetDefaultPlatformTwice(void)2431*6fee86a4SJeremy Kemp void testSetDefaultPlatformTwice(void)
2432*6fee86a4SJeremy Kemp {
2433*6fee86a4SJeremy Kemp     cl::Platform p(make_platform_id(2));
2434*6fee86a4SJeremy Kemp     cl::Platform p2 = cl::Platform::getDefault();
2435*6fee86a4SJeremy Kemp     cl::Platform p3 = cl::Platform::setDefault(p);
2436*6fee86a4SJeremy Kemp     // Set default should have failed
2437*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(p2(), p3());
2438*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_EQUAL(p(), p3());
2439*6fee86a4SJeremy Kemp }
2440*6fee86a4SJeremy Kemp 
2441*6fee86a4SJeremy Kemp // Note that default tests maintain state when run from the same
2442*6fee86a4SJeremy Kemp // unit process.
2443*6fee86a4SJeremy Kemp // One default setting test will maintain the defaults until the end.
testSetDefaultContext(void)2444*6fee86a4SJeremy Kemp void testSetDefaultContext(void)
2445*6fee86a4SJeremy Kemp {
2446*6fee86a4SJeremy Kemp 
2447*6fee86a4SJeremy Kemp     clRetainContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2448*6fee86a4SJeremy Kemp     clRetainContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2449*6fee86a4SJeremy Kemp     clRetainContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2450*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2451*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2452*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2453*6fee86a4SJeremy Kemp 
2454*6fee86a4SJeremy Kemp     cl::Context c(make_context(1));
2455*6fee86a4SJeremy Kemp     cl::Context c2 = cl::Context::setDefault(c);
2456*6fee86a4SJeremy Kemp     cl::Context c3 = cl::Context::getDefault();
2457*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(c(), c2());
2458*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(c(), c3());
2459*6fee86a4SJeremy Kemp }
2460*6fee86a4SJeremy Kemp 
2461*6fee86a4SJeremy Kemp // Note that default tests maintain state when run from the same
2462*6fee86a4SJeremy Kemp // unit process.
2463*6fee86a4SJeremy Kemp // One default setting test will maintain the defaults until the end.
testSetDefaultCommandQueue(void)2464*6fee86a4SJeremy Kemp void testSetDefaultCommandQueue(void)
2465*6fee86a4SJeremy Kemp {
2466*6fee86a4SJeremy Kemp     clRetainCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
2467*6fee86a4SJeremy Kemp     clRetainCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
2468*6fee86a4SJeremy Kemp     clRetainCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
2469*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
2470*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
2471*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
2472*6fee86a4SJeremy Kemp 
2473*6fee86a4SJeremy Kemp     cl::CommandQueue c(make_command_queue(1));
2474*6fee86a4SJeremy Kemp     cl::CommandQueue c2 = cl::CommandQueue::setDefault(c);
2475*6fee86a4SJeremy Kemp     cl::CommandQueue c3 = cl::CommandQueue::getDefault();
2476*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(c(), c2());
2477*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(c(), c3());
2478*6fee86a4SJeremy Kemp }
2479*6fee86a4SJeremy Kemp 
2480*6fee86a4SJeremy Kemp // Note that default tests maintain state when run from the same
2481*6fee86a4SJeremy Kemp // unit process.
2482*6fee86a4SJeremy Kemp // One default setting test will maintain the defaults until the end.
testSetDefaultDevice(void)2483*6fee86a4SJeremy Kemp void testSetDefaultDevice(void)
2484*6fee86a4SJeremy Kemp {
2485*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
2486*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
2487*6fee86a4SJeremy Kemp 
2488*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
2489*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
2490*6fee86a4SJeremy Kemp     clRetainDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
2491*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
2492*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
2493*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
2494*6fee86a4SJeremy Kemp 
2495*6fee86a4SJeremy Kemp     cl::Device d(make_device_id(1));
2496*6fee86a4SJeremy Kemp     cl::Device  d2 = cl::Device::setDefault(d);
2497*6fee86a4SJeremy Kemp     cl::Device  d3 = cl::Device::getDefault();
2498*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(d(), d2());
2499*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(d(), d3());
2500*6fee86a4SJeremy Kemp }
2501*6fee86a4SJeremy Kemp 
2502*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
clCreateCommandQueueWithProperties_testCommandQueueDevice(cl_context context,cl_device_id device,const cl_queue_properties * properties,cl_int * errcode_ret,int num_calls)2503*6fee86a4SJeremy Kemp static cl_command_queue clCreateCommandQueueWithProperties_testCommandQueueDevice(
2504*6fee86a4SJeremy Kemp     cl_context context,
2505*6fee86a4SJeremy Kemp     cl_device_id device,
2506*6fee86a4SJeremy Kemp     const cl_queue_properties *properties,
2507*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
2508*6fee86a4SJeremy Kemp     int num_calls)
2509*6fee86a4SJeremy Kemp {
2510*6fee86a4SJeremy Kemp     (void)num_calls;
2511*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(1), context);
2512*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(1), device);
2513*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(properties[0], CL_QUEUE_PROPERTIES);
2514*6fee86a4SJeremy Kemp     static cl_command_queue default_ = 0;
2515*6fee86a4SJeremy Kemp 
2516*6fee86a4SJeremy Kemp     if (errcode_ret != nullptr)
2517*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
2518*6fee86a4SJeremy Kemp 
2519*6fee86a4SJeremy Kemp     if ((properties[1] & CL_QUEUE_ON_DEVICE_DEFAULT) == 0) {
2520*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(properties[1], (CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE));
2521*6fee86a4SJeremy Kemp         if (properties[2] == CL_QUEUE_SIZE) {
2522*6fee86a4SJeremy Kemp             TEST_ASSERT_EQUAL(properties[3], 256);
2523*6fee86a4SJeremy Kemp             TEST_ASSERT_EQUAL(properties[4], 0);
2524*6fee86a4SJeremy Kemp             return make_command_queue(2);
2525*6fee86a4SJeremy Kemp         }
2526*6fee86a4SJeremy Kemp         else {
2527*6fee86a4SJeremy Kemp             TEST_ASSERT_EQUAL(properties[2], 0);
2528*6fee86a4SJeremy Kemp             return make_command_queue(3);
2529*6fee86a4SJeremy Kemp         }
2530*6fee86a4SJeremy Kemp     }
2531*6fee86a4SJeremy Kemp     else {
2532*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(properties[1], (CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT));
2533*6fee86a4SJeremy Kemp         if (default_ == 0) {
2534*6fee86a4SJeremy Kemp             default_ = make_command_queue(4);
2535*6fee86a4SJeremy Kemp         }
2536*6fee86a4SJeremy Kemp         return default_;
2537*6fee86a4SJeremy Kemp     }
2538*6fee86a4SJeremy Kemp }
2539*6fee86a4SJeremy Kemp #endif
2540*6fee86a4SJeremy Kemp 
testCreateDeviceCommandQueue(void)2541*6fee86a4SJeremy Kemp void testCreateDeviceCommandQueue(void)
2542*6fee86a4SJeremy Kemp {
2543*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
2544*6fee86a4SJeremy Kemp     clRetainContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2545*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
2546*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
2547*6fee86a4SJeremy Kemp     clCreateCommandQueueWithProperties_StubWithCallback(clCreateCommandQueueWithProperties_testCommandQueueDevice);
2548*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(make_command_queue(4), CL_SUCCESS);
2549*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(make_command_queue(4), CL_SUCCESS);
2550*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(make_command_queue(2), CL_SUCCESS);
2551*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(make_command_queue(3), CL_SUCCESS);
2552*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
2553*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2554*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2555*6fee86a4SJeremy Kemp 
2556*6fee86a4SJeremy Kemp     cl::Context c(make_context(1));
2557*6fee86a4SJeremy Kemp     cl::Context c2 = cl::Context::setDefault(c);
2558*6fee86a4SJeremy Kemp     cl::Device d(make_device_id(1));
2559*6fee86a4SJeremy Kemp 
2560*6fee86a4SJeremy Kemp     cl::DeviceCommandQueue dq(c, d);
2561*6fee86a4SJeremy Kemp     cl::DeviceCommandQueue dq2(c, d, 256);
2562*6fee86a4SJeremy Kemp 
2563*6fee86a4SJeremy Kemp     cl::DeviceCommandQueue dqd = cl::DeviceCommandQueue::makeDefault(c, d);
2564*6fee86a4SJeremy Kemp     cl::DeviceCommandQueue dqd2 = cl::DeviceCommandQueue::makeDefault(c, d);
2565*6fee86a4SJeremy Kemp 
2566*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(dqd(), dqd2());
2567*6fee86a4SJeremy Kemp #endif
2568*6fee86a4SJeremy Kemp }
2569*6fee86a4SJeremy Kemp 
2570*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
clCreatePipe_testCreatePipe(cl_context context,cl_mem_flags flags,cl_uint packet_size,cl_uint num_packets,const cl_pipe_properties * props,cl_int * errcode_ret,int num_calls)2571*6fee86a4SJeremy Kemp static cl_mem clCreatePipe_testCreatePipe(
2572*6fee86a4SJeremy Kemp     cl_context context,
2573*6fee86a4SJeremy Kemp     cl_mem_flags flags,
2574*6fee86a4SJeremy Kemp     cl_uint packet_size,
2575*6fee86a4SJeremy Kemp     cl_uint num_packets,
2576*6fee86a4SJeremy Kemp     const cl_pipe_properties *props,
2577*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
2578*6fee86a4SJeremy Kemp     int num_calls)
2579*6fee86a4SJeremy Kemp {
2580*6fee86a4SJeremy Kemp     (void) context;
2581*6fee86a4SJeremy Kemp     (void) packet_size;
2582*6fee86a4SJeremy Kemp     (void) num_packets;
2583*6fee86a4SJeremy Kemp     (void) num_calls;
2584*6fee86a4SJeremy Kemp 
2585*6fee86a4SJeremy Kemp     if (flags == 0) {
2586*6fee86a4SJeremy Kemp         flags = CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS;
2587*6fee86a4SJeremy Kemp     }
2588*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(flags, CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS);
2589*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(props);
2590*6fee86a4SJeremy Kemp 
2591*6fee86a4SJeremy Kemp     if (errcode_ret)
2592*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
2593*6fee86a4SJeremy Kemp     return make_mem(0);
2594*6fee86a4SJeremy Kemp }
2595*6fee86a4SJeremy Kemp #endif
2596*6fee86a4SJeremy Kemp 
2597*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
clGetPipeInfo_testCreatePipe(cl_mem pipe,cl_pipe_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)2598*6fee86a4SJeremy Kemp static cl_int clGetPipeInfo_testCreatePipe(
2599*6fee86a4SJeremy Kemp     cl_mem pipe,
2600*6fee86a4SJeremy Kemp     cl_pipe_info param_name,
2601*6fee86a4SJeremy Kemp     size_t param_value_size,
2602*6fee86a4SJeremy Kemp     void *param_value,
2603*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
2604*6fee86a4SJeremy Kemp     int num_calls)
2605*6fee86a4SJeremy Kemp {
2606*6fee86a4SJeremy Kemp     (void) pipe;
2607*6fee86a4SJeremy Kemp     (void) num_calls;
2608*6fee86a4SJeremy Kemp 
2609*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(param_value);
2610*6fee86a4SJeremy Kemp     if (param_name == CL_PIPE_PACKET_SIZE) {
2611*6fee86a4SJeremy Kemp         *static_cast<cl_uint*>(param_value) = 16;
2612*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
2613*6fee86a4SJeremy Kemp             *param_value_size_ret = param_value_size;
2614*6fee86a4SJeremy Kemp         }
2615*6fee86a4SJeremy Kemp         return CL_SUCCESS;
2616*6fee86a4SJeremy Kemp     }
2617*6fee86a4SJeremy Kemp     else if (param_name == CL_PIPE_MAX_PACKETS) {
2618*6fee86a4SJeremy Kemp         *static_cast<cl_uint*>(param_value) = 32;
2619*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
2620*6fee86a4SJeremy Kemp             *param_value_size_ret = param_value_size;
2621*6fee86a4SJeremy Kemp         }
2622*6fee86a4SJeremy Kemp         return CL_SUCCESS;
2623*6fee86a4SJeremy Kemp     }
2624*6fee86a4SJeremy Kemp     else {
2625*6fee86a4SJeremy Kemp         TEST_FAIL();
2626*6fee86a4SJeremy Kemp         return CL_INVALID_VALUE;
2627*6fee86a4SJeremy Kemp     }
2628*6fee86a4SJeremy Kemp }
2629*6fee86a4SJeremy Kemp #endif
2630*6fee86a4SJeremy Kemp 
testCreatePipe(void)2631*6fee86a4SJeremy Kemp void testCreatePipe(void)
2632*6fee86a4SJeremy Kemp {
2633*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
2634*6fee86a4SJeremy Kemp     clCreatePipe_StubWithCallback(clCreatePipe_testCreatePipe);
2635*6fee86a4SJeremy Kemp     clGetPipeInfo_StubWithCallback(clGetPipeInfo_testCreatePipe);
2636*6fee86a4SJeremy Kemp     clRetainContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2637*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2638*6fee86a4SJeremy Kemp     clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
2639*6fee86a4SJeremy Kemp     clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
2640*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2641*6fee86a4SJeremy Kemp 
2642*6fee86a4SJeremy Kemp     cl::Context c(make_context(1));
2643*6fee86a4SJeremy Kemp     cl::Pipe p(c, 16, 32);
2644*6fee86a4SJeremy Kemp     cl::Pipe p2(16, 32);
2645*6fee86a4SJeremy Kemp 
2646*6fee86a4SJeremy Kemp     cl_uint size = p2.getInfo<CL_PIPE_PACKET_SIZE>();
2647*6fee86a4SJeremy Kemp     cl_uint packets;
2648*6fee86a4SJeremy Kemp     p2.getInfo(CL_PIPE_MAX_PACKETS, &packets);
2649*6fee86a4SJeremy Kemp 
2650*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(size, 16);
2651*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(packets, 32);
2652*6fee86a4SJeremy Kemp #endif
2653*6fee86a4SJeremy Kemp }
2654*6fee86a4SJeremy Kemp 
2655*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 210
clGetKernelSubGroupInfo_testSubGroups(cl_kernel kernel,cl_device_id device,cl_kernel_sub_group_info param_name,size_t input_value_size,const void * input_value,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)2656*6fee86a4SJeremy Kemp static cl_int clGetKernelSubGroupInfo_testSubGroups(cl_kernel kernel,
2657*6fee86a4SJeremy Kemp     cl_device_id device,
2658*6fee86a4SJeremy Kemp     cl_kernel_sub_group_info param_name,
2659*6fee86a4SJeremy Kemp     size_t input_value_size,
2660*6fee86a4SJeremy Kemp     const void *input_value,
2661*6fee86a4SJeremy Kemp     size_t param_value_size,
2662*6fee86a4SJeremy Kemp     void *param_value,
2663*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
2664*6fee86a4SJeremy Kemp     int num_calls)
2665*6fee86a4SJeremy Kemp {
2666*6fee86a4SJeremy Kemp     (void) kernel;
2667*6fee86a4SJeremy Kemp     (void) device;
2668*6fee86a4SJeremy Kemp     (void) input_value_size;
2669*6fee86a4SJeremy Kemp     (void) param_value_size;
2670*6fee86a4SJeremy Kemp     (void) num_calls;
2671*6fee86a4SJeremy Kemp 
2672*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(input_value);
2673*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(param_value);
2674*6fee86a4SJeremy Kemp 
2675*6fee86a4SJeremy Kemp     if (param_name == CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE_KHR) {
2676*6fee86a4SJeremy Kemp         *static_cast<size_t*>(param_value) = 32;
2677*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
2678*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(size_t);
2679*6fee86a4SJeremy Kemp         }
2680*6fee86a4SJeremy Kemp         return CL_SUCCESS;
2681*6fee86a4SJeremy Kemp     }
2682*6fee86a4SJeremy Kemp     else if (param_name == CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE_KHR) {
2683*6fee86a4SJeremy Kemp         *static_cast<size_t*>(param_value) = 2;
2684*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
2685*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(size_t);
2686*6fee86a4SJeremy Kemp         }
2687*6fee86a4SJeremy Kemp         return CL_SUCCESS;
2688*6fee86a4SJeremy Kemp     }
2689*6fee86a4SJeremy Kemp     else {
2690*6fee86a4SJeremy Kemp         TEST_ABORT();
2691*6fee86a4SJeremy Kemp         return CL_INVALID_OPERATION;
2692*6fee86a4SJeremy Kemp     }
2693*6fee86a4SJeremy Kemp }
2694*6fee86a4SJeremy Kemp #endif
2695*6fee86a4SJeremy Kemp 
testSubGroups(void)2696*6fee86a4SJeremy Kemp void testSubGroups(void)
2697*6fee86a4SJeremy Kemp {
2698*6fee86a4SJeremy Kemp // TODO support testing cl_khr_subgroups on 2.0
2699*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 210
2700*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
2701*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
2702*6fee86a4SJeremy Kemp     clGetKernelSubGroupInfo_StubWithCallback(clGetKernelSubGroupInfo_testSubGroups);
2703*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
2704*6fee86a4SJeremy Kemp     clReleaseKernel_ExpectAndReturn(make_kernel(0), CL_SUCCESS);
2705*6fee86a4SJeremy Kemp 
2706*6fee86a4SJeremy Kemp     cl::Kernel k(make_kernel(0));
2707*6fee86a4SJeremy Kemp     cl::Device d(make_device_id(0));
2708*6fee86a4SJeremy Kemp     cl_int err;
2709*6fee86a4SJeremy Kemp     cl::NDRange ndrange(8, 8);
2710*6fee86a4SJeremy Kemp     size_t res1 = k.getSubGroupInfo<CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE_KHR>(
2711*6fee86a4SJeremy Kemp         d, ndrange, &err);
2712*6fee86a4SJeremy Kemp     size_t res2 = 0;
2713*6fee86a4SJeremy Kemp     err = k.getSubGroupInfo(
2714*6fee86a4SJeremy Kemp         d, CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE_KHR, ndrange, &res2);
2715*6fee86a4SJeremy Kemp 
2716*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(res1, 32);
2717*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(res2, 2);
2718*6fee86a4SJeremy Kemp #endif
2719*6fee86a4SJeremy Kemp }
2720*6fee86a4SJeremy Kemp 
2721*6fee86a4SJeremy Kemp /**
2722*6fee86a4SJeremy Kemp * Stub implementation of clGetDeviceInfo that returns an absense of builtin kernels
2723*6fee86a4SJeremy Kemp */
clGetDeviceInfo_builtin(cl_device_id id,cl_device_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)2724*6fee86a4SJeremy Kemp static cl_int clGetDeviceInfo_builtin(
2725*6fee86a4SJeremy Kemp     cl_device_id id,
2726*6fee86a4SJeremy Kemp     cl_device_info param_name,
2727*6fee86a4SJeremy Kemp     size_t param_value_size,
2728*6fee86a4SJeremy Kemp     void *param_value,
2729*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
2730*6fee86a4SJeremy Kemp     int num_calls)
2731*6fee86a4SJeremy Kemp {
2732*6fee86a4SJeremy Kemp     (void) id;
2733*6fee86a4SJeremy Kemp     (void) param_value_size;
2734*6fee86a4SJeremy Kemp 
2735*6fee86a4SJeremy Kemp     // Test to verify case where empty string is returned - so size is 0
2736*6fee86a4SJeremy Kemp     (void)num_calls;
2737*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_DEVICE_BUILT_IN_KERNELS, param_name);
2738*6fee86a4SJeremy Kemp     if (param_value == nullptr) {
2739*6fee86a4SJeremy Kemp         if (param_value_size_ret != nullptr) {
2740*6fee86a4SJeremy Kemp             *param_value_size_ret = 0;
2741*6fee86a4SJeremy Kemp         }
2742*6fee86a4SJeremy Kemp     }
2743*6fee86a4SJeremy Kemp     return CL_SUCCESS;
2744*6fee86a4SJeremy Kemp }
2745*6fee86a4SJeremy Kemp 
testBuiltInKernels(void)2746*6fee86a4SJeremy Kemp void testBuiltInKernels(void)
2747*6fee86a4SJeremy Kemp {
2748*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 120
2749*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
2750*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
2751*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
2752*6fee86a4SJeremy Kemp 
2753*6fee86a4SJeremy Kemp     cl::Device d0(make_device_id(0));
2754*6fee86a4SJeremy Kemp 
2755*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_builtin);
2756*6fee86a4SJeremy Kemp     cl::string s = d0.getInfo<CL_DEVICE_BUILT_IN_KERNELS>();
2757*6fee86a4SJeremy Kemp #endif
2758*6fee86a4SJeremy Kemp }
2759*6fee86a4SJeremy Kemp 
2760*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 210
2761*6fee86a4SJeremy Kemp /**
2762*6fee86a4SJeremy Kemp  * Stub implementation of clCloneKernel that returns a new kernel object
2763*6fee86a4SJeremy Kemp  */
clCloneKernel_simplecopy(cl_kernel k,cl_int * errcode_ret,int num_calls)2764*6fee86a4SJeremy Kemp static cl_kernel clCloneKernel_simplecopy(
2765*6fee86a4SJeremy Kemp     cl_kernel k,
2766*6fee86a4SJeremy Kemp     cl_int *errcode_ret,
2767*6fee86a4SJeremy Kemp     int num_calls)
2768*6fee86a4SJeremy Kemp {
2769*6fee86a4SJeremy Kemp     (void) k;
2770*6fee86a4SJeremy Kemp     (void) num_calls;
2771*6fee86a4SJeremy Kemp 
2772*6fee86a4SJeremy Kemp     // Test to verify case where empty string is returned - so size is 0
2773*6fee86a4SJeremy Kemp     if (errcode_ret != nullptr)
2774*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
2775*6fee86a4SJeremy Kemp     return make_kernel(POOL_MAX);
2776*6fee86a4SJeremy Kemp }
2777*6fee86a4SJeremy Kemp #endif
2778*6fee86a4SJeremy Kemp 
testCloneKernel(void)2779*6fee86a4SJeremy Kemp void testCloneKernel(void)
2780*6fee86a4SJeremy Kemp {
2781*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 210
2782*6fee86a4SJeremy Kemp     clCloneKernel_StubWithCallback(clCloneKernel_simplecopy);
2783*6fee86a4SJeremy Kemp     clReleaseKernel_ExpectAndReturn(make_kernel(POOL_MAX), CL_SUCCESS);
2784*6fee86a4SJeremy Kemp     cl::Kernel clone = kernelPool[0].clone();
2785*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(clone(), make_kernel(POOL_MAX));
2786*6fee86a4SJeremy Kemp #endif
2787*6fee86a4SJeremy Kemp }
2788*6fee86a4SJeremy Kemp 
testEnqueueMapSVM(void)2789*6fee86a4SJeremy Kemp void testEnqueueMapSVM(void)
2790*6fee86a4SJeremy Kemp {
2791*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
2792*6fee86a4SJeremy Kemp     std::vector<int> vec(7);
2793*6fee86a4SJeremy Kemp     clEnqueueSVMMap_ExpectAndReturn(commandQueuePool[0].get(), CL_TRUE, CL_MAP_READ|CL_MAP_WRITE, static_cast<void*>(vec.data()), vec.size()*sizeof(int), 0, nullptr, nullptr, CL_SUCCESS);
2794*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(commandQueuePool[0].enqueueMapSVM(vec, CL_TRUE, CL_MAP_READ|CL_MAP_WRITE), CL_SUCCESS);
2795*6fee86a4SJeremy Kemp #endif
2796*6fee86a4SJeremy Kemp }
2797*6fee86a4SJeremy Kemp 
testMapSVM(void)2798*6fee86a4SJeremy Kemp void testMapSVM(void)
2799*6fee86a4SJeremy Kemp {
2800*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
2801*6fee86a4SJeremy Kemp     std::vector<int> vec(1);
2802*6fee86a4SJeremy Kemp     clRetainCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
2803*6fee86a4SJeremy Kemp     clEnqueueSVMMap_ExpectAndReturn(make_command_queue(1), CL_TRUE, CL_MAP_READ|CL_MAP_WRITE, static_cast<void*>(vec.data()), vec.size()*sizeof(int), 0, nullptr, nullptr, CL_SUCCESS);
2804*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
2805*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(cl::mapSVM(vec), CL_SUCCESS);
2806*6fee86a4SJeremy Kemp #endif
2807*6fee86a4SJeremy Kemp }
2808*6fee86a4SJeremy Kemp 
2809*6fee86a4SJeremy Kemp // Run after other tests to clear the default state in the header
2810*6fee86a4SJeremy Kemp // using special unit test bypasses.
2811*6fee86a4SJeremy Kemp // We cannot remove the once_flag, so this is a hard fix
2812*6fee86a4SJeremy Kemp // but it means we won't hit cmock release callbacks at the end.
2813*6fee86a4SJeremy Kemp // This is a lot like tearDown but for the header default
2814*6fee86a4SJeremy Kemp // so we do not want to run it for every test.
2815*6fee86a4SJeremy Kemp // The alternative would be to manually modify the test runner
2816*6fee86a4SJeremy Kemp // but we avoid that for now.
testCleanupHeaderState(void)2817*6fee86a4SJeremy Kemp void testCleanupHeaderState(void)
2818*6fee86a4SJeremy Kemp {
2819*6fee86a4SJeremy Kemp     clReleaseCommandQueue_ExpectAndReturn(make_command_queue(1), CL_SUCCESS);
2820*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(1), CL_SUCCESS);
2821*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(1), CL_SUCCESS);
2822*6fee86a4SJeremy Kemp 
2823*6fee86a4SJeremy Kemp     cl::CommandQueue::unitTestClearDefault();
2824*6fee86a4SJeremy Kemp     cl::Context::unitTestClearDefault();
2825*6fee86a4SJeremy Kemp     cl::Device::unitTestClearDefault();
2826*6fee86a4SJeremy Kemp     cl::Platform::unitTestClearDefault();
2827*6fee86a4SJeremy Kemp }
2828*6fee86a4SJeremy Kemp 
2829*6fee86a4SJeremy Kemp // OpenCL 2.2 APIs:
2830*6fee86a4SJeremy Kemp 
2831*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 220
test_program_release_callback(cl_program,void *)2832*6fee86a4SJeremy Kemp static void CL_CALLBACK test_program_release_callback(
2833*6fee86a4SJeremy Kemp     cl_program,
2834*6fee86a4SJeremy Kemp     void*)
2835*6fee86a4SJeremy Kemp {
2836*6fee86a4SJeremy Kemp }
2837*6fee86a4SJeremy Kemp #endif
2838*6fee86a4SJeremy Kemp 
2839*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 220
clSetProgramReleaseCallback_set(cl_program program,void (CL_CALLBACK * pfn_notify)(cl_program program,void * user_data),void * user_data,int num_calls)2840*6fee86a4SJeremy Kemp static cl_int clSetProgramReleaseCallback_set(
2841*6fee86a4SJeremy Kemp     cl_program program,
2842*6fee86a4SJeremy Kemp     void (CL_CALLBACK * pfn_notify)(cl_program program, void * user_data),
2843*6fee86a4SJeremy Kemp     void *user_data,
2844*6fee86a4SJeremy Kemp     int num_calls)
2845*6fee86a4SJeremy Kemp {
2846*6fee86a4SJeremy Kemp     (void) user_data;
2847*6fee86a4SJeremy Kemp     (void) num_calls;
2848*6fee86a4SJeremy Kemp 
2849*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_program(0), program);
2850*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(pfn_notify, test_program_release_callback);
2851*6fee86a4SJeremy Kemp 
2852*6fee86a4SJeremy Kemp     return CL_SUCCESS;
2853*6fee86a4SJeremy Kemp }
2854*6fee86a4SJeremy Kemp #endif
2855*6fee86a4SJeremy Kemp 
testSetProgramReleaseCallback(void)2856*6fee86a4SJeremy Kemp void testSetProgramReleaseCallback(void)
2857*6fee86a4SJeremy Kemp {
2858*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 220
2859*6fee86a4SJeremy Kemp     cl_program program = make_program(0);
2860*6fee86a4SJeremy Kemp     int user_data = 0;
2861*6fee86a4SJeremy Kemp 
2862*6fee86a4SJeremy Kemp     clSetProgramReleaseCallback_StubWithCallback(clSetProgramReleaseCallback_set);
2863*6fee86a4SJeremy Kemp     clReleaseProgram_ExpectAndReturn(program, CL_SUCCESS);
2864*6fee86a4SJeremy Kemp 
2865*6fee86a4SJeremy Kemp     cl::Program prog(program);
2866*6fee86a4SJeremy Kemp 
2867*6fee86a4SJeremy Kemp     prog.setReleaseCallback(test_program_release_callback, &user_data);
2868*6fee86a4SJeremy Kemp #endif
2869*6fee86a4SJeremy Kemp }
2870*6fee86a4SJeremy Kemp 
testSetProgramSpecializationConstantScalar(void)2871*6fee86a4SJeremy Kemp void testSetProgramSpecializationConstantScalar(void)
2872*6fee86a4SJeremy Kemp {
2873*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 220
2874*6fee86a4SJeremy Kemp     cl_program program = make_program(0);
2875*6fee86a4SJeremy Kemp     int sc = 0;
2876*6fee86a4SJeremy Kemp 
2877*6fee86a4SJeremy Kemp     clSetProgramSpecializationConstant_ExpectAndReturn(program, 0, sizeof(sc), &sc, CL_SUCCESS);
2878*6fee86a4SJeremy Kemp     clReleaseProgram_ExpectAndReturn(program, CL_SUCCESS);
2879*6fee86a4SJeremy Kemp 
2880*6fee86a4SJeremy Kemp     cl::Program prog(program);
2881*6fee86a4SJeremy Kemp 
2882*6fee86a4SJeremy Kemp     prog.setSpecializationConstant(0, sc);
2883*6fee86a4SJeremy Kemp #endif
2884*6fee86a4SJeremy Kemp }
2885*6fee86a4SJeremy Kemp 
2886*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 220
2887*6fee86a4SJeremy Kemp /// Stub for testing boolean specialization constants
clSetProgramSpecializationConstant_testBool(cl_program program,cl_uint spec_id,size_t spec_size,const void * spec_value,int num_calls)2888*6fee86a4SJeremy Kemp static cl_int clSetProgramSpecializationConstant_testBool(
2889*6fee86a4SJeremy Kemp     cl_program program,
2890*6fee86a4SJeremy Kemp     cl_uint spec_id,
2891*6fee86a4SJeremy Kemp     size_t spec_size,
2892*6fee86a4SJeremy Kemp     const void* spec_value,
2893*6fee86a4SJeremy Kemp     int num_calls)
2894*6fee86a4SJeremy Kemp {
2895*6fee86a4SJeremy Kemp     (void) num_calls;
2896*6fee86a4SJeremy Kemp 
2897*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_program(0), program);
2898*6fee86a4SJeremy Kemp     TEST_ASSERT(spec_id == 0 || spec_id == 1);
2899*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(spec_size, 1);
2900*6fee86a4SJeremy Kemp     if (spec_id == 0)
2901*6fee86a4SJeremy Kemp     {
2902*6fee86a4SJeremy Kemp         const cl_uchar *uc_value = (const cl_uchar*)spec_value;
2903*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_HEX(uc_value[0], 0);
2904*6fee86a4SJeremy Kemp     }
2905*6fee86a4SJeremy Kemp     if (spec_id == 1)
2906*6fee86a4SJeremy Kemp     {
2907*6fee86a4SJeremy Kemp         const cl_uchar *uc_value = (const cl_uchar*)spec_value;
2908*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_HEX(uc_value[0], CL_UCHAR_MAX);
2909*6fee86a4SJeremy Kemp     }
2910*6fee86a4SJeremy Kemp     return CL_SUCCESS;
2911*6fee86a4SJeremy Kemp }
2912*6fee86a4SJeremy Kemp #endif
2913*6fee86a4SJeremy Kemp 
testSetProgramSpecializationConstantBool(void)2914*6fee86a4SJeremy Kemp void testSetProgramSpecializationConstantBool(void)
2915*6fee86a4SJeremy Kemp {
2916*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 220
2917*6fee86a4SJeremy Kemp     // Spec constant "false" should turn into a call with size one and no bits set.
2918*6fee86a4SJeremy Kemp     // Spec constant "true" should turn into a call with size one and all bits set.
2919*6fee86a4SJeremy Kemp     cl_program program = make_program(0);
2920*6fee86a4SJeremy Kemp     bool scFalse = false;
2921*6fee86a4SJeremy Kemp     bool scTrue = true;
2922*6fee86a4SJeremy Kemp 
2923*6fee86a4SJeremy Kemp     clSetProgramSpecializationConstant_StubWithCallback(clSetProgramSpecializationConstant_testBool);
2924*6fee86a4SJeremy Kemp 
2925*6fee86a4SJeremy Kemp     clReleaseProgram_ExpectAndReturn(program, CL_SUCCESS);
2926*6fee86a4SJeremy Kemp 
2927*6fee86a4SJeremy Kemp     cl::Program prog(program);
2928*6fee86a4SJeremy Kemp 
2929*6fee86a4SJeremy Kemp     prog.setSpecializationConstant(0, scFalse);
2930*6fee86a4SJeremy Kemp     prog.setSpecializationConstant(1, scTrue);
2931*6fee86a4SJeremy Kemp #endif
2932*6fee86a4SJeremy Kemp }
2933*6fee86a4SJeremy Kemp 
testSetProgramSpecializationConstantPointer(void)2934*6fee86a4SJeremy Kemp void testSetProgramSpecializationConstantPointer(void)
2935*6fee86a4SJeremy Kemp {
2936*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 220
2937*6fee86a4SJeremy Kemp     cl_program program = make_program(0);
2938*6fee86a4SJeremy Kemp     int scArray[5] = {};
2939*6fee86a4SJeremy Kemp 
2940*6fee86a4SJeremy Kemp     clSetProgramSpecializationConstant_ExpectAndReturn(program, 0, sizeof(scArray), &scArray, CL_SUCCESS);
2941*6fee86a4SJeremy Kemp     clReleaseProgram_ExpectAndReturn(program, CL_SUCCESS);
2942*6fee86a4SJeremy Kemp 
2943*6fee86a4SJeremy Kemp     cl::Program prog(program);
2944*6fee86a4SJeremy Kemp 
2945*6fee86a4SJeremy Kemp     prog.setSpecializationConstant(0, sizeof(scArray), scArray);
2946*6fee86a4SJeremy Kemp #endif
2947*6fee86a4SJeremy Kemp }
2948*6fee86a4SJeremy Kemp 
2949*6fee86a4SJeremy Kemp // OpenCL 3.0 and cl_khr_extended_versioning Queries
2950*6fee86a4SJeremy Kemp 
2951*6fee86a4SJeremy Kemp // Assumes the core enums, structures, and macros exactly match
2952*6fee86a4SJeremy Kemp // the extension enums, structures, and macros:
2953*6fee86a4SJeremy Kemp 
2954*6fee86a4SJeremy Kemp static_assert(CL_PLATFORM_NUMERIC_VERSION == CL_PLATFORM_NUMERIC_VERSION_KHR,
2955*6fee86a4SJeremy Kemp     "CL_PLATFORM_NUMERIC_VERSION mismatch");
2956*6fee86a4SJeremy Kemp static_assert(CL_PLATFORM_EXTENSIONS_WITH_VERSION == CL_PLATFORM_EXTENSIONS_WITH_VERSION_KHR,
2957*6fee86a4SJeremy Kemp     "CL_PLATFORM_EXTENSIONS_WITH_VERSION mismatch");
2958*6fee86a4SJeremy Kemp 
2959*6fee86a4SJeremy Kemp static_assert(CL_DEVICE_NUMERIC_VERSION == CL_DEVICE_NUMERIC_VERSION_KHR,
2960*6fee86a4SJeremy Kemp     "CL_DEVICE_NUMERIC_VERSION mismatch");
2961*6fee86a4SJeremy Kemp static_assert(CL_DEVICE_EXTENSIONS_WITH_VERSION == CL_DEVICE_EXTENSIONS_WITH_VERSION_KHR,
2962*6fee86a4SJeremy Kemp     "CL_DEVICE_EXTENSIONS_WITH_VERSION mismatch");
2963*6fee86a4SJeremy Kemp static_assert(CL_DEVICE_ILS_WITH_VERSION == CL_DEVICE_ILS_WITH_VERSION_KHR,
2964*6fee86a4SJeremy Kemp     "CL_DEVICE_ILS_WITH_VERSION mismatch");
2965*6fee86a4SJeremy Kemp static_assert(CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION == CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION_KHR,
2966*6fee86a4SJeremy Kemp     "CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION mismatch");
2967*6fee86a4SJeremy Kemp 
2968*6fee86a4SJeremy Kemp static_assert(sizeof(cl_name_version) == sizeof(cl_name_version_khr),
2969*6fee86a4SJeremy Kemp     "cl_name_version mismatch");
2970*6fee86a4SJeremy Kemp 
2971*6fee86a4SJeremy Kemp static_assert(CL_MAKE_VERSION(1, 2, 3) == CL_MAKE_VERSION_KHR(1, 2, 3),
2972*6fee86a4SJeremy Kemp     "CL_MAKE_VERSION mismatch");
2973*6fee86a4SJeremy Kemp 
clGetPlatformInfo_extended_versioning(cl_platform_id id,cl_platform_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)2974*6fee86a4SJeremy Kemp static cl_int clGetPlatformInfo_extended_versioning(
2975*6fee86a4SJeremy Kemp     cl_platform_id id,
2976*6fee86a4SJeremy Kemp     cl_platform_info param_name,
2977*6fee86a4SJeremy Kemp     size_t param_value_size,
2978*6fee86a4SJeremy Kemp     void *param_value,
2979*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
2980*6fee86a4SJeremy Kemp     int num_calls)
2981*6fee86a4SJeremy Kemp {
2982*6fee86a4SJeremy Kemp     (void) id;
2983*6fee86a4SJeremy Kemp     (void) num_calls;
2984*6fee86a4SJeremy Kemp 
2985*6fee86a4SJeremy Kemp     switch (param_name) {
2986*6fee86a4SJeremy Kemp     case CL_PLATFORM_NUMERIC_VERSION:
2987*6fee86a4SJeremy Kemp     {
2988*6fee86a4SJeremy Kemp         if (param_value_size == sizeof(cl_version) && param_value) {
2989*6fee86a4SJeremy Kemp             *static_cast<cl_version*>(param_value) = CL_MAKE_VERSION(1, 2, 3);
2990*6fee86a4SJeremy Kemp         }
2991*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
2992*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(cl_version);
2993*6fee86a4SJeremy Kemp         }
2994*6fee86a4SJeremy Kemp         return CL_SUCCESS;
2995*6fee86a4SJeremy Kemp     }
2996*6fee86a4SJeremy Kemp     case CL_PLATFORM_EXTENSIONS_WITH_VERSION:
2997*6fee86a4SJeremy Kemp     {
2998*6fee86a4SJeremy Kemp         static cl_name_version extension = {
2999*6fee86a4SJeremy Kemp             CL_MAKE_VERSION(10, 11, 12),
3000*6fee86a4SJeremy Kemp             "cl_dummy_extension",
3001*6fee86a4SJeremy Kemp         };
3002*6fee86a4SJeremy Kemp         if (param_value_size == sizeof(cl_name_version) && param_value) {
3003*6fee86a4SJeremy Kemp             *static_cast<cl_name_version*>(param_value) = extension;
3004*6fee86a4SJeremy Kemp         }
3005*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3006*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(extension);
3007*6fee86a4SJeremy Kemp         }
3008*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3009*6fee86a4SJeremy Kemp     }
3010*6fee86a4SJeremy Kemp     default: break;
3011*6fee86a4SJeremy Kemp     }
3012*6fee86a4SJeremy Kemp     TEST_FAIL();
3013*6fee86a4SJeremy Kemp     return CL_INVALID_OPERATION;
3014*6fee86a4SJeremy Kemp }
3015*6fee86a4SJeremy Kemp 
testPlatformExtendedVersioning_3_0(void)3016*6fee86a4SJeremy Kemp void testPlatformExtendedVersioning_3_0(void)
3017*6fee86a4SJeremy Kemp {
3018*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 300
3019*6fee86a4SJeremy Kemp     cl::Platform p(make_platform_id(1));
3020*6fee86a4SJeremy Kemp 
3021*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_extended_versioning);
3022*6fee86a4SJeremy Kemp 
3023*6fee86a4SJeremy Kemp     cl_version platformVersion = p.getInfo<CL_PLATFORM_NUMERIC_VERSION>();
3024*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(platformVersion, CL_MAKE_VERSION(1, 2, 3));
3025*6fee86a4SJeremy Kemp 
3026*6fee86a4SJeremy Kemp     std::vector<cl_name_version> extensions = p.getInfo<CL_PLATFORM_EXTENSIONS_WITH_VERSION>();
3027*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(extensions.size(), 1);
3028*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(extensions[0].version, CL_MAKE_VERSION(10, 11, 12));
3029*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_STRING(extensions[0].name, "cl_dummy_extension");
3030*6fee86a4SJeremy Kemp #endif // CL_HPP_TARGET_OPENCL_VERSION >= 300
3031*6fee86a4SJeremy Kemp }
3032*6fee86a4SJeremy Kemp 
testPlatformExtendedVersioning_KHR(void)3033*6fee86a4SJeremy Kemp void testPlatformExtendedVersioning_KHR(void)
3034*6fee86a4SJeremy Kemp {
3035*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION < 300
3036*6fee86a4SJeremy Kemp     cl::Platform p(make_platform_id(1));
3037*6fee86a4SJeremy Kemp 
3038*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_extended_versioning);
3039*6fee86a4SJeremy Kemp 
3040*6fee86a4SJeremy Kemp     cl_version_khr platformVersion = p.getInfo<CL_PLATFORM_NUMERIC_VERSION_KHR>();
3041*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(platformVersion, CL_MAKE_VERSION_KHR(1, 2, 3));
3042*6fee86a4SJeremy Kemp 
3043*6fee86a4SJeremy Kemp     std::vector<cl_name_version_khr> extensions = p.getInfo<CL_PLATFORM_EXTENSIONS_WITH_VERSION_KHR>();
3044*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(extensions.size(), 1);
3045*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(extensions[0].version, CL_MAKE_VERSION_KHR(10, 11, 12));
3046*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_STRING(extensions[0].name, "cl_dummy_extension");
3047*6fee86a4SJeremy Kemp #endif // CL_HPP_TARGET_OPENCL_VERSION < 300
3048*6fee86a4SJeremy Kemp }
3049*6fee86a4SJeremy Kemp 
3050*6fee86a4SJeremy Kemp 
3051*6fee86a4SJeremy Kemp // Note: This assumes the core enums, structures, and macros exactly match
3052*6fee86a4SJeremy Kemp // the extension enums, structures, and macros.
3053*6fee86a4SJeremy Kemp 
clGetDeviceInfo_extended_versioning(cl_device_id id,cl_device_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)3054*6fee86a4SJeremy Kemp static cl_int clGetDeviceInfo_extended_versioning(
3055*6fee86a4SJeremy Kemp     cl_device_id id,
3056*6fee86a4SJeremy Kemp     cl_device_info param_name,
3057*6fee86a4SJeremy Kemp     size_t param_value_size,
3058*6fee86a4SJeremy Kemp     void *param_value,
3059*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
3060*6fee86a4SJeremy Kemp     int num_calls)
3061*6fee86a4SJeremy Kemp {
3062*6fee86a4SJeremy Kemp     (void) id;
3063*6fee86a4SJeremy Kemp     (void) num_calls;
3064*6fee86a4SJeremy Kemp 
3065*6fee86a4SJeremy Kemp     switch (param_name) {
3066*6fee86a4SJeremy Kemp     case CL_DEVICE_NUMERIC_VERSION:
3067*6fee86a4SJeremy Kemp     {
3068*6fee86a4SJeremy Kemp         if (param_value_size == sizeof(cl_version) && param_value) {
3069*6fee86a4SJeremy Kemp             *static_cast<cl_version*>(param_value) = CL_MAKE_VERSION(1, 2, 3);
3070*6fee86a4SJeremy Kemp         }
3071*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3072*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(cl_version);
3073*6fee86a4SJeremy Kemp         }
3074*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3075*6fee86a4SJeremy Kemp     }
3076*6fee86a4SJeremy Kemp     case CL_DEVICE_OPENCL_C_NUMERIC_VERSION_KHR:
3077*6fee86a4SJeremy Kemp     {
3078*6fee86a4SJeremy Kemp         if (param_value_size == sizeof(cl_version_khr) && param_value) {
3079*6fee86a4SJeremy Kemp             *static_cast<cl_version_khr*>(param_value) = CL_MAKE_VERSION_KHR(4, 5, 6);
3080*6fee86a4SJeremy Kemp         }
3081*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3082*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(cl_version_khr);
3083*6fee86a4SJeremy Kemp         }
3084*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3085*6fee86a4SJeremy Kemp     }
3086*6fee86a4SJeremy Kemp     case CL_DEVICE_EXTENSIONS_WITH_VERSION:
3087*6fee86a4SJeremy Kemp     {
3088*6fee86a4SJeremy Kemp         static cl_name_version extension = {
3089*6fee86a4SJeremy Kemp             CL_MAKE_VERSION(10, 11, 12),
3090*6fee86a4SJeremy Kemp             "cl_dummy_extension",
3091*6fee86a4SJeremy Kemp         };
3092*6fee86a4SJeremy Kemp         if (param_value_size == sizeof(cl_name_version) && param_value) {
3093*6fee86a4SJeremy Kemp             *static_cast<cl_name_version*>(param_value) = extension;
3094*6fee86a4SJeremy Kemp         }
3095*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3096*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(extension);
3097*6fee86a4SJeremy Kemp         }
3098*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3099*6fee86a4SJeremy Kemp     }
3100*6fee86a4SJeremy Kemp     case CL_DEVICE_ILS_WITH_VERSION:
3101*6fee86a4SJeremy Kemp     {
3102*6fee86a4SJeremy Kemp         static cl_name_version il = {
3103*6fee86a4SJeremy Kemp             CL_MAKE_VERSION(20, 21, 22),
3104*6fee86a4SJeremy Kemp             "DUMMY_IR",
3105*6fee86a4SJeremy Kemp         };
3106*6fee86a4SJeremy Kemp         if (param_value_size == sizeof(cl_name_version) && param_value) {
3107*6fee86a4SJeremy Kemp             *static_cast<cl_name_version*>(param_value) = il;
3108*6fee86a4SJeremy Kemp         }
3109*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3110*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(il);
3111*6fee86a4SJeremy Kemp         }
3112*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3113*6fee86a4SJeremy Kemp     }
3114*6fee86a4SJeremy Kemp     case CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION:
3115*6fee86a4SJeremy Kemp     {
3116*6fee86a4SJeremy Kemp         // Test no built-in kernels:
3117*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3118*6fee86a4SJeremy Kemp             *param_value_size_ret = 0;
3119*6fee86a4SJeremy Kemp         }
3120*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3121*6fee86a4SJeremy Kemp     }
3122*6fee86a4SJeremy Kemp     case CL_DEVICE_OPENCL_C_ALL_VERSIONS:
3123*6fee86a4SJeremy Kemp     {
3124*6fee86a4SJeremy Kemp         static cl_name_version opencl_c = {
3125*6fee86a4SJeremy Kemp             CL_MAKE_VERSION(30, 31, 32),
3126*6fee86a4SJeremy Kemp             "OpenCL C",
3127*6fee86a4SJeremy Kemp         };
3128*6fee86a4SJeremy Kemp         if (param_value_size == sizeof(cl_name_version) && param_value) {
3129*6fee86a4SJeremy Kemp             *static_cast<cl_name_version*>(param_value) = opencl_c;
3130*6fee86a4SJeremy Kemp         }
3131*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3132*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(opencl_c);
3133*6fee86a4SJeremy Kemp         }
3134*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3135*6fee86a4SJeremy Kemp     }
3136*6fee86a4SJeremy Kemp     case CL_DEVICE_OPENCL_C_FEATURES:
3137*6fee86a4SJeremy Kemp     {
3138*6fee86a4SJeremy Kemp         static cl_name_version opencl_c_features[] = {
3139*6fee86a4SJeremy Kemp             {
3140*6fee86a4SJeremy Kemp                 CL_MAKE_VERSION(40, 41, 42),
3141*6fee86a4SJeremy Kemp                 "__opencl_c_feature",
3142*6fee86a4SJeremy Kemp             },
3143*6fee86a4SJeremy Kemp             {
3144*6fee86a4SJeremy Kemp                 CL_MAKE_VERSION(40, 43, 44),
3145*6fee86a4SJeremy Kemp                 "__opencl_c_fancy_feature",
3146*6fee86a4SJeremy Kemp             },
3147*6fee86a4SJeremy Kemp         };
3148*6fee86a4SJeremy Kemp         if (param_value_size == sizeof(opencl_c_features) && param_value) {
3149*6fee86a4SJeremy Kemp             cl_name_version* feature = static_cast<cl_name_version*>(param_value);
3150*6fee86a4SJeremy Kemp             const int numFeatures = ARRAY_SIZE(opencl_c_features);
3151*6fee86a4SJeremy Kemp             for (int i = 0; i < numFeatures; i++) {
3152*6fee86a4SJeremy Kemp                 feature[i] = opencl_c_features[i];
3153*6fee86a4SJeremy Kemp             }
3154*6fee86a4SJeremy Kemp         }
3155*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3156*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(opencl_c_features);
3157*6fee86a4SJeremy Kemp         }
3158*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3159*6fee86a4SJeremy Kemp     }
3160*6fee86a4SJeremy Kemp     default: break;
3161*6fee86a4SJeremy Kemp     }
3162*6fee86a4SJeremy Kemp     TEST_FAIL();
3163*6fee86a4SJeremy Kemp     return CL_INVALID_OPERATION;
3164*6fee86a4SJeremy Kemp }
3165*6fee86a4SJeremy Kemp 
testDeviceExtendedVersioning_3_0(void)3166*6fee86a4SJeremy Kemp void testDeviceExtendedVersioning_3_0(void)
3167*6fee86a4SJeremy Kemp {
3168*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 300
3169*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
3170*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_3_0);
3171*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
3172*6fee86a4SJeremy Kemp 
3173*6fee86a4SJeremy Kemp     cl::Device d0(make_device_id(0));
3174*6fee86a4SJeremy Kemp 
3175*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_extended_versioning);
3176*6fee86a4SJeremy Kemp 
3177*6fee86a4SJeremy Kemp     cl_version deviceVersion = d0.getInfo<CL_DEVICE_NUMERIC_VERSION>();
3178*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(deviceVersion, CL_MAKE_VERSION(1, 2, 3));
3179*6fee86a4SJeremy Kemp 
3180*6fee86a4SJeremy Kemp     std::vector<cl_name_version> extensions = d0.getInfo<CL_DEVICE_EXTENSIONS_WITH_VERSION>();
3181*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(extensions.size(), 1);
3182*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(extensions[0].version, CL_MAKE_VERSION(10, 11, 12));
3183*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_STRING(extensions[0].name, "cl_dummy_extension");
3184*6fee86a4SJeremy Kemp 
3185*6fee86a4SJeremy Kemp     std::vector<cl_name_version> ils = d0.getInfo<CL_DEVICE_ILS_WITH_VERSION>();
3186*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(ils.size(), 1);
3187*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(ils[0].version, CL_MAKE_VERSION(20, 21, 22));
3188*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_STRING(ils[0].name, "DUMMY_IR");
3189*6fee86a4SJeremy Kemp 
3190*6fee86a4SJeremy Kemp     std::vector<cl_name_version> opencl_c = d0.getInfo<CL_DEVICE_OPENCL_C_ALL_VERSIONS>();
3191*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(opencl_c.size(), 1);
3192*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(opencl_c[0].version, CL_MAKE_VERSION(30, 31, 32));
3193*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_STRING(opencl_c[0].name, "OpenCL C");
3194*6fee86a4SJeremy Kemp 
3195*6fee86a4SJeremy Kemp     std::vector<cl_name_version> opencl_c_features = d0.getInfo<CL_DEVICE_OPENCL_C_FEATURES>();
3196*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(opencl_c_features.size(), 2);
3197*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(opencl_c_features[0].version, CL_MAKE_VERSION(40, 41, 42));
3198*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_STRING(opencl_c_features[0].name, "__opencl_c_feature");
3199*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(opencl_c_features[1].version, CL_MAKE_VERSION(40, 43, 44));
3200*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_STRING(opencl_c_features[1].name, "__opencl_c_fancy_feature");
3201*6fee86a4SJeremy Kemp 
3202*6fee86a4SJeremy Kemp     std::vector<cl_name_version> builtInKernels = d0.getInfo<CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION>();
3203*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(builtInKernels.size(), 0);
3204*6fee86a4SJeremy Kemp #endif // CL_HPP_TARGET_OPENCL_VERSION >= 300
3205*6fee86a4SJeremy Kemp }
3206*6fee86a4SJeremy Kemp 
testDeviceExtendedVersioning_KHR(void)3207*6fee86a4SJeremy Kemp void testDeviceExtendedVersioning_KHR(void)
3208*6fee86a4SJeremy Kemp {
3209*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION < 300
3210*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
3211*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
3212*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
3213*6fee86a4SJeremy Kemp 
3214*6fee86a4SJeremy Kemp     cl::Device d0(make_device_id(0));
3215*6fee86a4SJeremy Kemp 
3216*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_extended_versioning);
3217*6fee86a4SJeremy Kemp 
3218*6fee86a4SJeremy Kemp     cl_version_khr deviceVersion = d0.getInfo<CL_DEVICE_NUMERIC_VERSION_KHR>();
3219*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(deviceVersion, CL_MAKE_VERSION_KHR(1, 2, 3));
3220*6fee86a4SJeremy Kemp 
3221*6fee86a4SJeremy Kemp     cl_version_khr cVersion = d0.getInfo<CL_DEVICE_OPENCL_C_NUMERIC_VERSION_KHR>();
3222*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(cVersion, CL_MAKE_VERSION_KHR(4, 5, 6));
3223*6fee86a4SJeremy Kemp 
3224*6fee86a4SJeremy Kemp     std::vector<cl_name_version_khr> extensions = d0.getInfo<CL_DEVICE_EXTENSIONS_WITH_VERSION_KHR>();
3225*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(extensions.size(), 1);
3226*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(extensions[0].version, CL_MAKE_VERSION_KHR(10, 11, 12));
3227*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_STRING(extensions[0].name, "cl_dummy_extension");
3228*6fee86a4SJeremy Kemp 
3229*6fee86a4SJeremy Kemp     std::vector<cl_name_version_khr> ils = d0.getInfo<CL_DEVICE_ILS_WITH_VERSION_KHR>();
3230*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(ils.size(), 1);
3231*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(ils[0].version, CL_MAKE_VERSION_KHR(20, 21, 22));
3232*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_STRING(ils[0].name, "DUMMY_IR");
3233*6fee86a4SJeremy Kemp 
3234*6fee86a4SJeremy Kemp     std::vector<cl_name_version_khr> builtInKernels = d0.getInfo<CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION_KHR>();
3235*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(builtInKernels.size(), 0);
3236*6fee86a4SJeremy Kemp #endif // CL_HPP_TARGET_OPENCL_VERSION < 300
3237*6fee86a4SJeremy Kemp }
3238*6fee86a4SJeremy Kemp 
clGetDeviceInfo_uuid_pci_bus_info(cl_device_id id,cl_device_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)3239*6fee86a4SJeremy Kemp static cl_int clGetDeviceInfo_uuid_pci_bus_info(
3240*6fee86a4SJeremy Kemp     cl_device_id id,
3241*6fee86a4SJeremy Kemp     cl_device_info param_name,
3242*6fee86a4SJeremy Kemp     size_t param_value_size,
3243*6fee86a4SJeremy Kemp     void *param_value,
3244*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
3245*6fee86a4SJeremy Kemp     int num_calls)
3246*6fee86a4SJeremy Kemp {
3247*6fee86a4SJeremy Kemp     (void) id;
3248*6fee86a4SJeremy Kemp     (void) num_calls;
3249*6fee86a4SJeremy Kemp 
3250*6fee86a4SJeremy Kemp     switch (param_name) {
3251*6fee86a4SJeremy Kemp #if defined(cl_khr_device_uuid)
3252*6fee86a4SJeremy Kemp     case CL_DEVICE_UUID_KHR:
3253*6fee86a4SJeremy Kemp     case CL_DRIVER_UUID_KHR:
3254*6fee86a4SJeremy Kemp     {
3255*6fee86a4SJeremy Kemp         if (param_value_size == CL_UUID_SIZE_KHR && param_value) {
3256*6fee86a4SJeremy Kemp             cl_uchar* pUUID = static_cast<cl_uchar*>(param_value);
3257*6fee86a4SJeremy Kemp             cl_uchar start =
3258*6fee86a4SJeremy Kemp                 (param_name == CL_DEVICE_UUID_KHR) ? 1 :
3259*6fee86a4SJeremy Kemp                 (param_name == CL_DRIVER_UUID_KHR) ? 2 :
3260*6fee86a4SJeremy Kemp                 0;
3261*6fee86a4SJeremy Kemp             for (int i = 0; i < CL_UUID_SIZE_KHR; i++) {
3262*6fee86a4SJeremy Kemp                 pUUID[i] = i + start;
3263*6fee86a4SJeremy Kemp             }
3264*6fee86a4SJeremy Kemp         }
3265*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3266*6fee86a4SJeremy Kemp             *param_value_size_ret = CL_UUID_SIZE_KHR;
3267*6fee86a4SJeremy Kemp         }
3268*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3269*6fee86a4SJeremy Kemp     }
3270*6fee86a4SJeremy Kemp     case CL_DEVICE_LUID_VALID_KHR:
3271*6fee86a4SJeremy Kemp     {
3272*6fee86a4SJeremy Kemp         if (param_value_size == sizeof(cl_bool) && param_value) {
3273*6fee86a4SJeremy Kemp             *static_cast<cl_bool*>(param_value) = CL_TRUE;
3274*6fee86a4SJeremy Kemp         }
3275*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3276*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(cl_bool);
3277*6fee86a4SJeremy Kemp         }
3278*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3279*6fee86a4SJeremy Kemp     }
3280*6fee86a4SJeremy Kemp     case CL_DEVICE_LUID_KHR:
3281*6fee86a4SJeremy Kemp     {
3282*6fee86a4SJeremy Kemp         if (param_value_size == CL_LUID_SIZE_KHR && param_value) {
3283*6fee86a4SJeremy Kemp             cl_uchar* pLUID = static_cast<cl_uchar*>(param_value);
3284*6fee86a4SJeremy Kemp             cl_uchar start = 3;
3285*6fee86a4SJeremy Kemp             for (int i = 0; i < CL_LUID_SIZE_KHR; i++) {
3286*6fee86a4SJeremy Kemp                 pLUID[i] = i + start;
3287*6fee86a4SJeremy Kemp             }
3288*6fee86a4SJeremy Kemp         }
3289*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3290*6fee86a4SJeremy Kemp             *param_value_size_ret = CL_LUID_SIZE_KHR;
3291*6fee86a4SJeremy Kemp         }
3292*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3293*6fee86a4SJeremy Kemp     }
3294*6fee86a4SJeremy Kemp     case CL_DEVICE_NODE_MASK_KHR:
3295*6fee86a4SJeremy Kemp     {
3296*6fee86a4SJeremy Kemp         if (param_value_size == sizeof(cl_uint) && param_value) {
3297*6fee86a4SJeremy Kemp             *static_cast<cl_uint*>(param_value) = 0xA5A5;
3298*6fee86a4SJeremy Kemp         }
3299*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3300*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(cl_uint);
3301*6fee86a4SJeremy Kemp         }
3302*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3303*6fee86a4SJeremy Kemp     }
3304*6fee86a4SJeremy Kemp #endif
3305*6fee86a4SJeremy Kemp #if defined(cl_khr_pci_bus_info)
3306*6fee86a4SJeremy Kemp     case CL_DEVICE_PCI_BUS_INFO_KHR:
3307*6fee86a4SJeremy Kemp     {
3308*6fee86a4SJeremy Kemp         if (param_value_size == sizeof(cl_device_pci_bus_info_khr) && param_value) {
3309*6fee86a4SJeremy Kemp             cl_device_pci_bus_info_khr* pInfo = static_cast<cl_device_pci_bus_info_khr*>(param_value);
3310*6fee86a4SJeremy Kemp             pInfo->pci_domain = 0x11;
3311*6fee86a4SJeremy Kemp             pInfo->pci_bus = 0x22;
3312*6fee86a4SJeremy Kemp             pInfo->pci_device = 0x33;
3313*6fee86a4SJeremy Kemp             pInfo->pci_function = 0x44;
3314*6fee86a4SJeremy Kemp         }
3315*6fee86a4SJeremy Kemp         if (param_value_size_ret) {
3316*6fee86a4SJeremy Kemp             *param_value_size_ret = sizeof(cl_device_pci_bus_info_khr);
3317*6fee86a4SJeremy Kemp         }
3318*6fee86a4SJeremy Kemp         return CL_SUCCESS;
3319*6fee86a4SJeremy Kemp     }
3320*6fee86a4SJeremy Kemp #endif
3321*6fee86a4SJeremy Kemp     default: break;
3322*6fee86a4SJeremy Kemp     }
3323*6fee86a4SJeremy Kemp     TEST_FAIL();
3324*6fee86a4SJeremy Kemp     return CL_INVALID_OPERATION;
3325*6fee86a4SJeremy Kemp }
3326*6fee86a4SJeremy Kemp 
testDeviceUUID_KHR(void)3327*6fee86a4SJeremy Kemp void testDeviceUUID_KHR(void)
3328*6fee86a4SJeremy Kemp {
3329*6fee86a4SJeremy Kemp #if defined(cl_khr_device_uuid)
3330*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
3331*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
3332*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
3333*6fee86a4SJeremy Kemp 
3334*6fee86a4SJeremy Kemp     cl::Device d0(make_device_id(0));
3335*6fee86a4SJeremy Kemp 
3336*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_uuid_pci_bus_info);
3337*6fee86a4SJeremy Kemp 
3338*6fee86a4SJeremy Kemp     std::array<cl_uchar, CL_UUID_SIZE_KHR> dev_uuid = d0.getInfo<CL_DEVICE_UUID_KHR>();
3339*6fee86a4SJeremy Kemp     for (int i = 0; i < CL_UUID_SIZE_KHR; i++) {
3340*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_UINT8(i + 1, dev_uuid[i]);
3341*6fee86a4SJeremy Kemp     }
3342*6fee86a4SJeremy Kemp     std::array<cl_uchar, CL_UUID_SIZE_KHR> drv_uuid = d0.getInfo<CL_DRIVER_UUID_KHR>();
3343*6fee86a4SJeremy Kemp     for (int i = 0; i < CL_UUID_SIZE_KHR; i++) {
3344*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_UINT8(i + 2, drv_uuid[i]);
3345*6fee86a4SJeremy Kemp     }
3346*6fee86a4SJeremy Kemp 
3347*6fee86a4SJeremy Kemp     cl_bool valid = d0.getInfo<CL_DEVICE_LUID_VALID_KHR>();
3348*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_TRUE, valid);
3349*6fee86a4SJeremy Kemp     std::array<cl_uchar, CL_LUID_SIZE_KHR> luid = d0.getInfo<CL_DEVICE_LUID_KHR>();
3350*6fee86a4SJeremy Kemp     for (int i = 0; i < CL_LUID_SIZE_KHR; i++) {
3351*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_UINT8(i + 3, luid[i]);
3352*6fee86a4SJeremy Kemp     }
3353*6fee86a4SJeremy Kemp 
3354*6fee86a4SJeremy Kemp     cl_uint nodeMask = d0.getInfo<CL_DEVICE_NODE_MASK_KHR>();
3355*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0xA5A5, nodeMask);
3356*6fee86a4SJeremy Kemp #endif
3357*6fee86a4SJeremy Kemp }
3358*6fee86a4SJeremy Kemp 
testDevicePCIBusInfo_KHR(void)3359*6fee86a4SJeremy Kemp void testDevicePCIBusInfo_KHR(void)
3360*6fee86a4SJeremy Kemp {
3361*6fee86a4SJeremy Kemp #if defined(cl_khr_pci_bus_info)
3362*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
3363*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
3364*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
3365*6fee86a4SJeremy Kemp 
3366*6fee86a4SJeremy Kemp     cl::Device d0(make_device_id(0));
3367*6fee86a4SJeremy Kemp 
3368*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_uuid_pci_bus_info);
3369*6fee86a4SJeremy Kemp 
3370*6fee86a4SJeremy Kemp     cl_device_pci_bus_info_khr info = d0.getInfo<CL_DEVICE_PCI_BUS_INFO_KHR>();
3371*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(0x11, info.pci_domain);
3372*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(0x22, info.pci_bus);
3373*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(0x33, info.pci_device);
3374*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(0x44, info.pci_function);
3375*6fee86a4SJeremy Kemp #endif
3376*6fee86a4SJeremy Kemp }
3377*6fee86a4SJeremy Kemp 
clGetProgramInfo_testProgramGetContext(cl_program program,cl_program_build_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int)3378*6fee86a4SJeremy Kemp static  cl_int clGetProgramInfo_testProgramGetContext(cl_program program,
3379*6fee86a4SJeremy Kemp     cl_program_build_info param_name,
3380*6fee86a4SJeremy Kemp     size_t param_value_size,
3381*6fee86a4SJeremy Kemp     void *param_value,
3382*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
3383*6fee86a4SJeremy Kemp     int /*num_calls*/)
3384*6fee86a4SJeremy Kemp {
3385*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_program(0), program);
3386*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_PROGRAM_CONTEXT, param_name);
3387*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_context));
3388*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
3389*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_context);
3390*6fee86a4SJeremy Kemp     if (param_value != nullptr)
3391*6fee86a4SJeremy Kemp         *static_cast<cl_context *>(param_value) = make_context(0);
3392*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3393*6fee86a4SJeremy Kemp }
3394*6fee86a4SJeremy Kemp 
clLinkProgram_testLinkProgram(cl_context context,cl_uint num_devices,const cl_device_id * device_list,const char * options,cl_uint num_input_programs,const cl_program * input_programs,void (CL_CALLBACK * pfn_notify)(cl_program program,void * user_data),void * user_data,cl_int * errcode_ret,int)3395*6fee86a4SJeremy Kemp static cl_program clLinkProgram_testLinkProgram(cl_context context,
3396*6fee86a4SJeremy Kemp     cl_uint              num_devices,
3397*6fee86a4SJeremy Kemp     const cl_device_id * device_list,
3398*6fee86a4SJeremy Kemp     const char *         options,
3399*6fee86a4SJeremy Kemp     cl_uint              num_input_programs,
3400*6fee86a4SJeremy Kemp     const cl_program *   input_programs,
3401*6fee86a4SJeremy Kemp     void (CL_CALLBACK *  pfn_notify)(cl_program program, void * user_data),
3402*6fee86a4SJeremy Kemp     void *               user_data,
3403*6fee86a4SJeremy Kemp     cl_int *             errcode_ret,
3404*6fee86a4SJeremy Kemp     int                 /*num_calls*/)
3405*6fee86a4SJeremy Kemp {
3406*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(context, make_context(0));
3407*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(num_devices, 0);
3408*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(device_list, nullptr);
3409*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(options, nullptr);
3410*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_EQUAL(num_input_programs, 0);
3411*6fee86a4SJeremy Kemp     for (int i=0; i<(int)num_input_programs; i++)
3412*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL_PTR(input_programs[i], make_program(i));
3413*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(pfn_notify, nullptr);
3414*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(user_data, nullptr);
3415*6fee86a4SJeremy Kemp 
3416*6fee86a4SJeremy Kemp     *errcode_ret = CL_SUCCESS;
3417*6fee86a4SJeremy Kemp     return make_program(0);
3418*6fee86a4SJeremy Kemp }
3419*6fee86a4SJeremy Kemp 
testLinkProgram(void)3420*6fee86a4SJeremy Kemp void testLinkProgram(void)
3421*6fee86a4SJeremy Kemp {
3422*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 120
3423*6fee86a4SJeremy Kemp     cl_int errcode;
3424*6fee86a4SJeremy Kemp     int refcount[] = {1,1};
3425*6fee86a4SJeremy Kemp 
3426*6fee86a4SJeremy Kemp     // verify if class cl::Program was not modified
3427*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(sizeof(cl_program), sizeof(cl::Program));
3428*6fee86a4SJeremy Kemp 
3429*6fee86a4SJeremy Kemp     clGetProgramInfo_StubWithCallback(clGetProgramInfo_testProgramGetContext);
3430*6fee86a4SJeremy Kemp     clLinkProgram_StubWithCallback(clLinkProgram_testLinkProgram);
3431*6fee86a4SJeremy Kemp 
3432*6fee86a4SJeremy Kemp     clRetainContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
3433*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
3434*6fee86a4SJeremy Kemp     prepare_programRefcounts(2, reinterpret_cast<cl_program *>(programPool), refcount);
3435*6fee86a4SJeremy Kemp 
3436*6fee86a4SJeremy Kemp     cl::Program prog = cl::linkProgram(cl::Program(make_program(0)), cl::Program(make_program(1)),
3437*6fee86a4SJeremy Kemp         nullptr, nullptr, nullptr, &errcode);
3438*6fee86a4SJeremy Kemp 
3439*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(prog(), make_program(0));
3440*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(errcode, CL_SUCCESS);
3441*6fee86a4SJeremy Kemp 
3442*6fee86a4SJeremy Kemp     prog() = nullptr;
3443*6fee86a4SJeremy Kemp #endif
3444*6fee86a4SJeremy Kemp }
3445*6fee86a4SJeremy Kemp 
testLinkProgramWithVectorProgramInput(void)3446*6fee86a4SJeremy Kemp void testLinkProgramWithVectorProgramInput(void)
3447*6fee86a4SJeremy Kemp {
3448*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 120
3449*6fee86a4SJeremy Kemp     cl_int errcode;
3450*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl::Program> prog_vec;
3451*6fee86a4SJeremy Kemp     std::array<int, ARRAY_SIZE(programPool)> refcount;
3452*6fee86a4SJeremy Kemp     for (int i=0;i<(int)ARRAY_SIZE(programPool);i++) {
3453*6fee86a4SJeremy Kemp         prog_vec.push_back(cl::Program(programPool[i]()));
3454*6fee86a4SJeremy Kemp         refcount[i] = 1;
3455*6fee86a4SJeremy Kemp     }
3456*6fee86a4SJeremy Kemp 
3457*6fee86a4SJeremy Kemp     // verify if class cl::Program was not modified
3458*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(sizeof(cl_program), sizeof(cl::Program));
3459*6fee86a4SJeremy Kemp 
3460*6fee86a4SJeremy Kemp     clGetProgramInfo_StubWithCallback(clGetProgramInfo_testProgramGetContext);
3461*6fee86a4SJeremy Kemp     clLinkProgram_StubWithCallback(clLinkProgram_testLinkProgram);
3462*6fee86a4SJeremy Kemp     prepare_programRefcounts(prog_vec.size(), reinterpret_cast<cl_program *>(prog_vec.data()), refcount.data());
3463*6fee86a4SJeremy Kemp 
3464*6fee86a4SJeremy Kemp     clRetainContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
3465*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
3466*6fee86a4SJeremy Kemp 
3467*6fee86a4SJeremy Kemp     cl::Program prog = linkProgram(prog_vec, nullptr, nullptr, nullptr, &errcode);
3468*6fee86a4SJeremy Kemp 
3469*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(prog(), make_program(0));
3470*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(errcode, CL_SUCCESS);
3471*6fee86a4SJeremy Kemp 
3472*6fee86a4SJeremy Kemp     prog() = nullptr;
3473*6fee86a4SJeremy Kemp #endif
3474*6fee86a4SJeremy Kemp }
3475*6fee86a4SJeremy Kemp 
testGetPlatformVersion_1_1(void)3476*6fee86a4SJeremy Kemp void testGetPlatformVersion_1_1(void)
3477*6fee86a4SJeremy Kemp {
3478*6fee86a4SJeremy Kemp     cl_platform_id platform = make_platform_id(0);
3479*6fee86a4SJeremy Kemp 
3480*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
3481*6fee86a4SJeremy Kemp 
3482*6fee86a4SJeremy Kemp     cl_uint version = cl::detail::getPlatformVersion(platform);
3483*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_UINT32(0x10001, version);
3484*6fee86a4SJeremy Kemp }
3485*6fee86a4SJeremy Kemp 
testGetPlatformVersion_1_2(void)3486*6fee86a4SJeremy Kemp void testGetPlatformVersion_1_2(void)
3487*6fee86a4SJeremy Kemp {
3488*6fee86a4SJeremy Kemp     cl_platform_id platform = make_platform_id(0);
3489*6fee86a4SJeremy Kemp 
3490*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_2);
3491*6fee86a4SJeremy Kemp 
3492*6fee86a4SJeremy Kemp     cl_uint version = cl::detail::getPlatformVersion(platform);
3493*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_UINT32(0x10002, version);
3494*6fee86a4SJeremy Kemp }
3495*6fee86a4SJeremy Kemp 
testGetPlatformVersion_2_0(void)3496*6fee86a4SJeremy Kemp void testGetPlatformVersion_2_0(void)
3497*6fee86a4SJeremy Kemp {
3498*6fee86a4SJeremy Kemp     cl_platform_id platform = make_platform_id(0);
3499*6fee86a4SJeremy Kemp 
3500*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
3501*6fee86a4SJeremy Kemp 
3502*6fee86a4SJeremy Kemp     cl_uint version = cl::detail::getPlatformVersion(platform);
3503*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_UINT32(0x20000, version);
3504*6fee86a4SJeremy Kemp }
3505*6fee86a4SJeremy Kemp 
3506*6fee86a4SJeremy Kemp 
testGetPlatformVersion_3_0(void)3507*6fee86a4SJeremy Kemp void testGetPlatformVersion_3_0(void)
3508*6fee86a4SJeremy Kemp {
3509*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 300
3510*6fee86a4SJeremy Kemp     cl_platform_id platform = make_platform_id(0);
3511*6fee86a4SJeremy Kemp 
3512*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_3_0);
3513*6fee86a4SJeremy Kemp 
3514*6fee86a4SJeremy Kemp     cl_uint version = cl::detail::getPlatformVersion(platform);
3515*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_UINT32(0x30000, version);
3516*6fee86a4SJeremy Kemp #endif // CL_HPP_TARGET_OPENCL_VERSION >= 300
3517*6fee86a4SJeremy Kemp }
3518*6fee86a4SJeremy Kemp 
3519*6fee86a4SJeremy Kemp /****************************************************************************
3520*6fee86a4SJeremy Kemp  * Tests for cl::CommandBufferKhr
3521*6fee86a4SJeremy Kemp  ****************************************************************************/
3522*6fee86a4SJeremy Kemp #if defined(cl_khr_command_buffer)
3523*6fee86a4SJeremy Kemp void testMoveAssignCommandBufferKhrNonNull(void);
3524*6fee86a4SJeremy Kemp void testMoveAssignCommandBufferKhrNull(void);
3525*6fee86a4SJeremy Kemp void testMoveConstructCommandBufferKhrNonNull(void);
3526*6fee86a4SJeremy Kemp void testMoveConstructCommandBufferKhrNull(void);
MAKE_MOVE_TESTS(CommandBufferKhr,make_command_buffer_khr,clReleaseCommandBufferKHR,commandBufferKhrPool)3527*6fee86a4SJeremy Kemp MAKE_MOVE_TESTS(CommandBufferKhr, make_command_buffer_khr, clReleaseCommandBufferKHR, commandBufferKhrPool)
3528*6fee86a4SJeremy Kemp #else
3529*6fee86a4SJeremy Kemp void testMoveAssignCommandBufferKhrNonNull(void) {}
3530*6fee86a4SJeremy Kemp void testMoveAssignCommandBufferKhrNull(void) {}
3531*6fee86a4SJeremy Kemp void testMoveConstructCommandBufferKhrNonNull(void) {}
3532*6fee86a4SJeremy Kemp void testMoveConstructCommandBufferKhrNull(void) {}
3533*6fee86a4SJeremy Kemp #endif
3534*6fee86a4SJeremy Kemp 
3535*6fee86a4SJeremy Kemp // Stub for clGetCommandBufferInfoKHR that returns 1
3536*6fee86a4SJeremy Kemp static cl_int clGetCommandBufferInfoKHR_testCommandBufferKhrGetNumQueues(
3537*6fee86a4SJeremy Kemp     cl_command_buffer_khr command_buffer,
3538*6fee86a4SJeremy Kemp     cl_command_buffer_info_khr param_name,
3539*6fee86a4SJeremy Kemp     size_t param_value_size,
3540*6fee86a4SJeremy Kemp     void *param_value,
3541*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
3542*6fee86a4SJeremy Kemp     int /*num_calls*/)
3543*6fee86a4SJeremy Kemp {
3544*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_command_buffer_khr(0), command_buffer);
3545*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_COMMAND_BUFFER_NUM_QUEUES_KHR, param_name);
3546*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_uint));
3547*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
3548*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_uint);
3549*6fee86a4SJeremy Kemp     if (param_value != nullptr)
3550*6fee86a4SJeremy Kemp         *static_cast<cl_uint *> (param_value) = 1;
3551*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3552*6fee86a4SJeremy Kemp }
3553*6fee86a4SJeremy Kemp 
testCommandBufferInfoKHRNumQueues(void)3554*6fee86a4SJeremy Kemp void testCommandBufferInfoKHRNumQueues(void)
3555*6fee86a4SJeremy Kemp {
3556*6fee86a4SJeremy Kemp #if defined(cl_khr_command_buffer)
3557*6fee86a4SJeremy Kemp     cl_uint expected = 1;
3558*6fee86a4SJeremy Kemp 
3559*6fee86a4SJeremy Kemp     clGetCommandBufferInfoKHR_StubWithCallback(clGetCommandBufferInfoKHR_testCommandBufferKhrGetNumQueues);
3560*6fee86a4SJeremy Kemp 
3561*6fee86a4SJeremy Kemp     cl_uint num = commandBufferKhrPool[0].getInfo<CL_COMMAND_BUFFER_NUM_QUEUES_KHR>();
3562*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(expected, num);
3563*6fee86a4SJeremy Kemp #endif
3564*6fee86a4SJeremy Kemp }
3565*6fee86a4SJeremy Kemp 
3566*6fee86a4SJeremy Kemp // Stub for clGetCommandBufferInfoKHR that returns command queues array
clGetCommandBufferInfoKHR_testCommandBufferKhrGetCommandQueues(cl_command_buffer_khr command_buffer,cl_command_buffer_info_khr param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int)3567*6fee86a4SJeremy Kemp static cl_int clGetCommandBufferInfoKHR_testCommandBufferKhrGetCommandQueues(
3568*6fee86a4SJeremy Kemp     cl_command_buffer_khr command_buffer,
3569*6fee86a4SJeremy Kemp     cl_command_buffer_info_khr param_name,
3570*6fee86a4SJeremy Kemp     size_t param_value_size,
3571*6fee86a4SJeremy Kemp     void *param_value,
3572*6fee86a4SJeremy Kemp     size_t *param_value_size_ret,
3573*6fee86a4SJeremy Kemp     int /*num_calls*/)
3574*6fee86a4SJeremy Kemp {
3575*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_command_buffer_khr(0), command_buffer);
3576*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_COMMAND_BUFFER_QUEUES_KHR, param_name);
3577*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= 3 * sizeof(cl_command_queue));
3578*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
3579*6fee86a4SJeremy Kemp         *param_value_size_ret = 3 * sizeof(cl_command_queue);
3580*6fee86a4SJeremy Kemp     if (param_value != nullptr)
3581*6fee86a4SJeremy Kemp     {
3582*6fee86a4SJeremy Kemp         cl_command_queue *command_queues = static_cast<cl_command_queue *> (param_value);
3583*6fee86a4SJeremy Kemp         command_queues[0] = make_command_queue(0);
3584*6fee86a4SJeremy Kemp         command_queues[1] = make_command_queue(1);
3585*6fee86a4SJeremy Kemp         command_queues[2] = make_command_queue(2);
3586*6fee86a4SJeremy Kemp     }
3587*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3588*6fee86a4SJeremy Kemp }
3589*6fee86a4SJeremy Kemp 
testCommandBufferInfoKHRCommandQueues(void)3590*6fee86a4SJeremy Kemp void testCommandBufferInfoKHRCommandQueues(void)
3591*6fee86a4SJeremy Kemp {
3592*6fee86a4SJeremy Kemp #if defined(cl_khr_command_buffer)
3593*6fee86a4SJeremy Kemp     // creat expected values for refcounter
3594*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl_command_queue> expected_queue_vec;
3595*6fee86a4SJeremy Kemp     std::array<int, 3> refcount;
3596*6fee86a4SJeremy Kemp     for (int i=0;i<3;i++) {
3597*6fee86a4SJeremy Kemp         expected_queue_vec.push_back(commandQueuePool[i]());
3598*6fee86a4SJeremy Kemp         refcount[i] = 1;
3599*6fee86a4SJeremy Kemp     }
3600*6fee86a4SJeremy Kemp 
3601*6fee86a4SJeremy Kemp     clGetCommandBufferInfoKHR_StubWithCallback(clGetCommandBufferInfoKHR_testCommandBufferKhrGetCommandQueues);
3602*6fee86a4SJeremy Kemp     prepare_commandQueueRefcounts(expected_queue_vec.size(), expected_queue_vec.data(), refcount.data());
3603*6fee86a4SJeremy Kemp 
3604*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl::CommandQueue> command_queues = commandBufferKhrPool[0].getInfo<CL_COMMAND_BUFFER_QUEUES_KHR>();
3605*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(3, command_queues.size());
3606*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_command_queue(0), command_queues[0]());
3607*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_command_queue(1), command_queues[1]());
3608*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_command_queue(2), command_queues[2]());
3609*6fee86a4SJeremy Kemp #endif
3610*6fee86a4SJeremy Kemp }
3611*6fee86a4SJeremy Kemp // Tests for Device::GetInfo
clGetInfo_testDeviceGetInfoCLDeviceVendorId(cl_device_id device,cl_device_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int cmock_num_calls)3612*6fee86a4SJeremy Kemp static cl_int clGetInfo_testDeviceGetInfoCLDeviceVendorId(
3613*6fee86a4SJeremy Kemp     cl_device_id device, cl_device_info param_name, size_t param_value_size,
3614*6fee86a4SJeremy Kemp     void *param_value, size_t *param_value_size_ret, int cmock_num_calls)
3615*6fee86a4SJeremy Kemp {
3616*6fee86a4SJeremy Kemp     (void) cmock_num_calls;
3617*6fee86a4SJeremy Kemp 
3618*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(0), device);
3619*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_DEVICE_VENDOR_ID, param_name);
3620*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_uint));
3621*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
3622*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_uint);
3623*6fee86a4SJeremy Kemp     if (param_value != nullptr)
3624*6fee86a4SJeremy Kemp     {
3625*6fee86a4SJeremy Kemp         *static_cast<cl_uint *>(param_value) = 0xABCD;
3626*6fee86a4SJeremy Kemp     }
3627*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3628*6fee86a4SJeremy Kemp }
testDevice_GetInfo_CLDeviceVendorID(void)3629*6fee86a4SJeremy Kemp void testDevice_GetInfo_CLDeviceVendorID(void)
3630*6fee86a4SJeremy Kemp {
3631*6fee86a4SJeremy Kemp     cl_uint expected = 0xABCD;
3632*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(
3633*6fee86a4SJeremy Kemp         clGetInfo_testDeviceGetInfoCLDeviceVendorId);
3634*6fee86a4SJeremy Kemp     cl_uint vendorID = devicePool[0].getInfo<CL_DEVICE_VENDOR_ID>();
3635*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(expected, vendorID);
3636*6fee86a4SJeremy Kemp }
clGetInfo_testDeviceGetInfoCLDeviceImageSupport(cl_device_id device,cl_device_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int cmock_num_calls)3637*6fee86a4SJeremy Kemp static cl_int clGetInfo_testDeviceGetInfoCLDeviceImageSupport(
3638*6fee86a4SJeremy Kemp     cl_device_id device, cl_device_info param_name, size_t param_value_size,
3639*6fee86a4SJeremy Kemp     void *param_value, size_t *param_value_size_ret, int cmock_num_calls)
3640*6fee86a4SJeremy Kemp {
3641*6fee86a4SJeremy Kemp     (void) cmock_num_calls;
3642*6fee86a4SJeremy Kemp 
3643*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(0), device);
3644*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_DEVICE_IMAGE_SUPPORT, param_name);
3645*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_bool));
3646*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
3647*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_bool);
3648*6fee86a4SJeremy Kemp     if (param_value != nullptr)
3649*6fee86a4SJeremy Kemp     {
3650*6fee86a4SJeremy Kemp         *static_cast<cl_bool *>(param_value) = true;
3651*6fee86a4SJeremy Kemp     }
3652*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3653*6fee86a4SJeremy Kemp }
testDevice_GetInfo_CLDeviceImageSupport(void)3654*6fee86a4SJeremy Kemp void testDevice_GetInfo_CLDeviceImageSupport(void)
3655*6fee86a4SJeremy Kemp {
3656*6fee86a4SJeremy Kemp     cl_bool expected = true;
3657*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(
3658*6fee86a4SJeremy Kemp         clGetInfo_testDeviceGetInfoCLDeviceImageSupport);
3659*6fee86a4SJeremy Kemp     cl_bool deviceImageSupport =
3660*6fee86a4SJeremy Kemp         devicePool[0].getInfo<CL_DEVICE_IMAGE_SUPPORT>();
3661*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(expected, deviceImageSupport);
3662*6fee86a4SJeremy Kemp }
clGetInfo_testDeviceGetInfoCLDeviceName(cl_device_id device,cl_device_info param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int cmock_num_calls)3663*6fee86a4SJeremy Kemp static cl_int clGetInfo_testDeviceGetInfoCLDeviceName(
3664*6fee86a4SJeremy Kemp     cl_device_id device, cl_device_info param_name, size_t param_value_size,
3665*6fee86a4SJeremy Kemp     void *param_value, size_t *param_value_size_ret, int cmock_num_calls)
3666*6fee86a4SJeremy Kemp {
3667*6fee86a4SJeremy Kemp     (void) cmock_num_calls;
3668*6fee86a4SJeremy Kemp 
3669*6fee86a4SJeremy Kemp     static char testDeviceName[] = "testDeviceName";
3670*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_device_id(0), device);
3671*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_DEVICE_NAME, param_name);
3672*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(testDeviceName));
3673*6fee86a4SJeremy Kemp 
3674*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
3675*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(testDeviceName);
3676*6fee86a4SJeremy Kemp     if (param_value != nullptr)
3677*6fee86a4SJeremy Kemp     {
3678*6fee86a4SJeremy Kemp         strcpy((char*)param_value, testDeviceName);
3679*6fee86a4SJeremy Kemp     }
3680*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3681*6fee86a4SJeremy Kemp }
testDevice_GetInfo_CLDeviceName(void)3682*6fee86a4SJeremy Kemp void testDevice_GetInfo_CLDeviceName(void)
3683*6fee86a4SJeremy Kemp {
3684*6fee86a4SJeremy Kemp     cl::string expected = "testDeviceName";
3685*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetInfo_testDeviceGetInfoCLDeviceName);
3686*6fee86a4SJeremy Kemp     cl::string deviceName = devicePool[0].getInfo<CL_DEVICE_NAME>();
3687*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_STRING(expected.c_str(), deviceName.c_str());
3688*6fee86a4SJeremy Kemp }
3689*6fee86a4SJeremy Kemp 
3690*6fee86a4SJeremy Kemp #if defined(cl_ext_device_fission)
clCreateSubDevicesEXT_testDevice_createSubDevices(cl_device_id device_in,const cl_device_partition_property_ext * properties,cl_uint n,cl_device_id * out_devices,cl_uint * num,int num_calls)3691*6fee86a4SJeremy Kemp static cl_int clCreateSubDevicesEXT_testDevice_createSubDevices(
3692*6fee86a4SJeremy Kemp     cl_device_id device_in, const cl_device_partition_property_ext *properties,
3693*6fee86a4SJeremy Kemp     cl_uint n, cl_device_id *out_devices, cl_uint *num, int num_calls) {
3694*6fee86a4SJeremy Kemp   cl_int ret = CL_SUCCESS;
3695*6fee86a4SJeremy Kemp 
3696*6fee86a4SJeremy Kemp   TEST_ASSERT_EQUAL(CL_DEVICE_PARTITION_EQUALLY_EXT, *properties);
3697*6fee86a4SJeremy Kemp   if(nullptr != out_devices){
3698*6fee86a4SJeremy Kemp     out_devices[0] = make_device_id(0);
3699*6fee86a4SJeremy Kemp   }
3700*6fee86a4SJeremy Kemp   if (nullptr != num)
3701*6fee86a4SJeremy Kemp   {
3702*6fee86a4SJeremy Kemp       *num = 1;
3703*6fee86a4SJeremy Kemp   }
3704*6fee86a4SJeremy Kemp   if (device_in == make_device_id(0)) {
3705*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3706*6fee86a4SJeremy Kemp   } else if (device_in == make_device_id(1)) {
3707*6fee86a4SJeremy Kemp     return CL_INVALID_DEVICE;
3708*6fee86a4SJeremy Kemp   } else {
3709*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3710*6fee86a4SJeremy Kemp   }
3711*6fee86a4SJeremy Kemp }
3712*6fee86a4SJeremy Kemp 
testDevice_createSubDevices()3713*6fee86a4SJeremy Kemp void testDevice_createSubDevices() {
3714*6fee86a4SJeremy Kemp #ifndef CL_HPP_ENABLE_EXCEPTIONS
3715*6fee86a4SJeremy Kemp   const cl_device_partition_property_ext properties =
3716*6fee86a4SJeremy Kemp       CL_DEVICE_PARTITION_EQUALLY_EXT;
3717*6fee86a4SJeremy Kemp   std::vector<cl::Device> devices(1);
3718*6fee86a4SJeremy Kemp 
3719*6fee86a4SJeremy Kemp   clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
3720*6fee86a4SJeremy Kemp   clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
3721*6fee86a4SJeremy Kemp 
3722*6fee86a4SJeremy Kemp   clCreateSubDevicesEXT_StubWithCallback(
3723*6fee86a4SJeremy Kemp       clCreateSubDevicesEXT_testDevice_createSubDevices);
3724*6fee86a4SJeremy Kemp 
3725*6fee86a4SJeremy Kemp   cl_int ret = devicePool[0].createSubDevices(&properties, &devices);
3726*6fee86a4SJeremy Kemp   TEST_ASSERT_EQUAL(CL_SUCCESS, ret);
3727*6fee86a4SJeremy Kemp   ret = devicePool[1].createSubDevices(&properties, &devices);
3728*6fee86a4SJeremy Kemp   TEST_ASSERT_EQUAL(CL_INVALID_DEVICE , ret);
3729*6fee86a4SJeremy Kemp   ret = devicePool[2].createSubDevices(&properties, &devices);
3730*6fee86a4SJeremy Kemp   TEST_ASSERT_EQUAL(CL_SUCCESS, ret);
3731*6fee86a4SJeremy Kemp   TEST_ASSERT_EQUAL(devices[0].get(), make_device_id(0));
3732*6fee86a4SJeremy Kemp #endif /*CL_HPP_ENABLE_EXCEPTIONS*/
3733*6fee86a4SJeremy Kemp }
3734*6fee86a4SJeremy Kemp #endif /*cl_ext_device_fission*/
3735*6fee86a4SJeremy Kemp 
3736*6fee86a4SJeremy Kemp /****************************************************************************
3737*6fee86a4SJeremy Kemp  * Tests for cl::Semaphore
3738*6fee86a4SJeremy Kemp  ****************************************************************************/
3739*6fee86a4SJeremy Kemp #if defined(cl_khr_semaphore)
3740*6fee86a4SJeremy Kemp void testMoveAssignSemaphoreNonNull(void);
3741*6fee86a4SJeremy Kemp void testMoveAssignSemaphoreNull(void);
3742*6fee86a4SJeremy Kemp void testMoveConstructSemaphoreNonNull(void);
3743*6fee86a4SJeremy Kemp void testMoveConstructSemaphoreNull(void);
3744*6fee86a4SJeremy Kemp MAKE_MOVE_TESTS(Semaphore, make_semaphore_khr, clReleaseSemaphoreKHR, semaphorePool);
3745*6fee86a4SJeremy Kemp #else
testMoveAssignSemaphoreNonNull(void)3746*6fee86a4SJeremy Kemp void testMoveAssignSemaphoreNonNull(void) {}
testMoveAssignSemaphoreNull(void)3747*6fee86a4SJeremy Kemp void testMoveAssignSemaphoreNull(void) {}
testMoveConstructSemaphoreNonNull(void)3748*6fee86a4SJeremy Kemp void testMoveConstructSemaphoreNonNull(void) {}
testMoveConstructSemaphoreNull(void)3749*6fee86a4SJeremy Kemp void testMoveConstructSemaphoreNull(void) {}
3750*6fee86a4SJeremy Kemp #endif
3751*6fee86a4SJeremy Kemp 
3752*6fee86a4SJeremy Kemp #if defined(cl_khr_semaphore)
clEnqueueWaitSemaphoresKHR_testEnqueueWaitSemaphores(cl_command_queue command_queue,cl_uint num_sema_objects,const cl_semaphore_khr * sema_objects,const cl_semaphore_payload_khr * sema_payload_list,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event,int num_calls)3753*6fee86a4SJeremy Kemp static cl_int clEnqueueWaitSemaphoresKHR_testEnqueueWaitSemaphores(
3754*6fee86a4SJeremy Kemp     cl_command_queue command_queue,
3755*6fee86a4SJeremy Kemp     cl_uint num_sema_objects,
3756*6fee86a4SJeremy Kemp     const cl_semaphore_khr* sema_objects,
3757*6fee86a4SJeremy Kemp     const cl_semaphore_payload_khr* sema_payload_list,
3758*6fee86a4SJeremy Kemp     cl_uint num_events_in_wait_list,
3759*6fee86a4SJeremy Kemp     const cl_event* event_wait_list,
3760*6fee86a4SJeremy Kemp     cl_event* event,
3761*6fee86a4SJeremy Kemp     int num_calls)
3762*6fee86a4SJeremy Kemp {
3763*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
3764*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(commandQueuePool[1](), command_queue);
3765*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(1, num_sema_objects);
3766*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(sema_objects);
3767*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(make_semaphore_khr(1), *sema_objects);
3768*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(sema_payload_list);
3769*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_events_in_wait_list);
3770*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(event_wait_list);
3771*6fee86a4SJeremy Kemp 
3772*6fee86a4SJeremy Kemp     if (event != nullptr)
3773*6fee86a4SJeremy Kemp     {
3774*6fee86a4SJeremy Kemp         *event = make_event(1);
3775*6fee86a4SJeremy Kemp     }
3776*6fee86a4SJeremy Kemp 
3777*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3778*6fee86a4SJeremy Kemp }
3779*6fee86a4SJeremy Kemp 
testEnqueueWaitSemaphores(void)3780*6fee86a4SJeremy Kemp void testEnqueueWaitSemaphores(void)
3781*6fee86a4SJeremy Kemp {
3782*6fee86a4SJeremy Kemp     clEnqueueWaitSemaphoresKHR_StubWithCallback(clEnqueueWaitSemaphoresKHR_testEnqueueWaitSemaphores);
3783*6fee86a4SJeremy Kemp 
3784*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl::Semaphore> sema_objects;
3785*6fee86a4SJeremy Kemp     sema_objects.emplace_back(make_semaphore_khr(1));
3786*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl_semaphore_payload_khr> sema_payloads(1);
3787*6fee86a4SJeremy Kemp     cl::Event event;
3788*6fee86a4SJeremy Kemp 
3789*6fee86a4SJeremy Kemp     cl_int status = commandQueuePool[1].enqueueWaitSemaphores(sema_objects, sema_payloads, nullptr, &event);
3790*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, status);
3791*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_event(1), event());
3792*6fee86a4SJeremy Kemp 
3793*6fee86a4SJeremy Kemp     // prevent destructor from interfering with the test
3794*6fee86a4SJeremy Kemp     event() = nullptr;
3795*6fee86a4SJeremy Kemp     sema_objects[0]() = nullptr;
3796*6fee86a4SJeremy Kemp }
3797*6fee86a4SJeremy Kemp 
clEnqueueSignalSemaphoresKHR_testEnqueueSignalSemaphores(cl_command_queue command_queue,cl_uint num_sema_objects,const cl_semaphore_khr * sema_objects,const cl_semaphore_payload_khr * sema_payload_list,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event,int num_calls)3798*6fee86a4SJeremy Kemp static cl_int clEnqueueSignalSemaphoresKHR_testEnqueueSignalSemaphores(
3799*6fee86a4SJeremy Kemp     cl_command_queue command_queue,
3800*6fee86a4SJeremy Kemp     cl_uint num_sema_objects,
3801*6fee86a4SJeremy Kemp     const cl_semaphore_khr* sema_objects,
3802*6fee86a4SJeremy Kemp     const cl_semaphore_payload_khr* sema_payload_list,
3803*6fee86a4SJeremy Kemp     cl_uint num_events_in_wait_list,
3804*6fee86a4SJeremy Kemp     const cl_event* event_wait_list,
3805*6fee86a4SJeremy Kemp     cl_event* event,
3806*6fee86a4SJeremy Kemp     int num_calls)
3807*6fee86a4SJeremy Kemp {
3808*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
3809*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(commandQueuePool[1](), command_queue);
3810*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(1, num_sema_objects);
3811*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(sema_objects);
3812*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(make_semaphore_khr(2), *sema_objects);
3813*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(sema_payload_list);
3814*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_events_in_wait_list);
3815*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(event_wait_list);
3816*6fee86a4SJeremy Kemp 
3817*6fee86a4SJeremy Kemp     if (event != nullptr)
3818*6fee86a4SJeremy Kemp     {
3819*6fee86a4SJeremy Kemp         *event = make_event(2);
3820*6fee86a4SJeremy Kemp     }
3821*6fee86a4SJeremy Kemp 
3822*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3823*6fee86a4SJeremy Kemp }
3824*6fee86a4SJeremy Kemp 
testEnqueueSignalSemaphores(void)3825*6fee86a4SJeremy Kemp void testEnqueueSignalSemaphores(void)
3826*6fee86a4SJeremy Kemp {
3827*6fee86a4SJeremy Kemp     clEnqueueSignalSemaphoresKHR_StubWithCallback(clEnqueueSignalSemaphoresKHR_testEnqueueSignalSemaphores);
3828*6fee86a4SJeremy Kemp 
3829*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl::Semaphore> sema_objects;
3830*6fee86a4SJeremy Kemp     sema_objects.emplace_back(make_semaphore_khr(2));
3831*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl_semaphore_payload_khr> sema_payloads(1);
3832*6fee86a4SJeremy Kemp     cl::Event event;
3833*6fee86a4SJeremy Kemp 
3834*6fee86a4SJeremy Kemp     cl_int status = commandQueuePool[1].enqueueSignalSemaphores(sema_objects, sema_payloads, nullptr, &event);
3835*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, status);
3836*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_event(2), event());
3837*6fee86a4SJeremy Kemp 
3838*6fee86a4SJeremy Kemp     // prevent destructor from interfering with the test
3839*6fee86a4SJeremy Kemp     event() = nullptr;
3840*6fee86a4SJeremy Kemp     sema_objects[0]() = nullptr;
3841*6fee86a4SJeremy Kemp }
3842*6fee86a4SJeremy Kemp 
clCreateSemaphoreWithProperties_testSemaphoreWithProperties(cl_context context,const cl_semaphore_properties_khr * sema_props,cl_int * errcode_ret,int num_calls)3843*6fee86a4SJeremy Kemp cl_semaphore_khr clCreateSemaphoreWithProperties_testSemaphoreWithProperties(
3844*6fee86a4SJeremy Kemp     cl_context context,
3845*6fee86a4SJeremy Kemp     const cl_semaphore_properties_khr* sema_props,
3846*6fee86a4SJeremy Kemp     cl_int* errcode_ret,
3847*6fee86a4SJeremy Kemp     int num_calls)
3848*6fee86a4SJeremy Kemp {
3849*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
3850*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(context, contextPool[0]());
3851*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(sema_props);
3852*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SEMAPHORE_TYPE_KHR, *sema_props);
3853*6fee86a4SJeremy Kemp     TEST_ASSERT_NOT_NULL(errcode_ret);
3854*6fee86a4SJeremy Kemp     *errcode_ret = CL_SUCCESS;
3855*6fee86a4SJeremy Kemp     return make_semaphore_khr(1);
3856*6fee86a4SJeremy Kemp }
3857*6fee86a4SJeremy Kemp 
testSemaphoreWithProperties(void)3858*6fee86a4SJeremy Kemp void testSemaphoreWithProperties(void)
3859*6fee86a4SJeremy Kemp {
3860*6fee86a4SJeremy Kemp     cl_device_id expected_device = make_device_id(0);
3861*6fee86a4SJeremy Kemp     int device_refcount = 1;
3862*6fee86a4SJeremy Kemp 
3863*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_device);
3864*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
3865*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
3866*6fee86a4SJeremy Kemp     prepare_deviceRefcounts(1, &expected_device, &device_refcount);
3867*6fee86a4SJeremy Kemp 
3868*6fee86a4SJeremy Kemp     clCreateSemaphoreWithPropertiesKHR_StubWithCallback(clCreateSemaphoreWithProperties_testSemaphoreWithProperties);
3869*6fee86a4SJeremy Kemp 
3870*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl_semaphore_properties_khr> sema_props{CL_SEMAPHORE_TYPE_KHR};
3871*6fee86a4SJeremy Kemp     cl_int err = CL_INVALID_OPERATION;
3872*6fee86a4SJeremy Kemp     cl::Semaphore sem(contextPool[0], sema_props, &err);
3873*6fee86a4SJeremy Kemp 
3874*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
3875*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_semaphore_khr(1), sem());
3876*6fee86a4SJeremy Kemp 
3877*6fee86a4SJeremy Kemp     // prevent destructor from interfering with the test
3878*6fee86a4SJeremy Kemp     sem() = nullptr;
3879*6fee86a4SJeremy Kemp }
3880*6fee86a4SJeremy Kemp 
clGetSemaphoreInfoKHR_testSemaphoreGetContext(cl_semaphore_khr sema_object,cl_semaphore_info_khr param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)3881*6fee86a4SJeremy Kemp static cl_int clGetSemaphoreInfoKHR_testSemaphoreGetContext(
3882*6fee86a4SJeremy Kemp     cl_semaphore_khr sema_object,
3883*6fee86a4SJeremy Kemp     cl_semaphore_info_khr param_name,
3884*6fee86a4SJeremy Kemp     size_t param_value_size,
3885*6fee86a4SJeremy Kemp     void* param_value,
3886*6fee86a4SJeremy Kemp     size_t* param_value_size_ret,
3887*6fee86a4SJeremy Kemp     int num_calls)
3888*6fee86a4SJeremy Kemp {
3889*6fee86a4SJeremy Kemp     (void) num_calls;
3890*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(semaphorePool[0](), sema_object);
3891*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_SEMAPHORE_CONTEXT_KHR, param_name);
3892*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_context));
3893*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
3894*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_context);
3895*6fee86a4SJeremy Kemp     if (param_value != nullptr)
3896*6fee86a4SJeremy Kemp         *static_cast<cl_context *>(param_value) = make_context(0);
3897*6fee86a4SJeremy Kemp 
3898*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3899*6fee86a4SJeremy Kemp }
3900*6fee86a4SJeremy Kemp 
testSemaphoreGetInfoContext(void)3901*6fee86a4SJeremy Kemp void testSemaphoreGetInfoContext(void)
3902*6fee86a4SJeremy Kemp {
3903*6fee86a4SJeremy Kemp     cl_context expected_context = make_context(0);
3904*6fee86a4SJeremy Kemp     int context_refcount = 1;
3905*6fee86a4SJeremy Kemp     clGetSemaphoreInfoKHR_StubWithCallback(clGetSemaphoreInfoKHR_testSemaphoreGetContext);
3906*6fee86a4SJeremy Kemp     prepare_contextRefcounts(1, &expected_context, &context_refcount);
3907*6fee86a4SJeremy Kemp 
3908*6fee86a4SJeremy Kemp     cl_int err = CL_INVALID_OPERATION;
3909*6fee86a4SJeremy Kemp 
3910*6fee86a4SJeremy Kemp     cl::Context ctx = semaphorePool[0].getInfo<CL_SEMAPHORE_CONTEXT_KHR>(&err);
3911*6fee86a4SJeremy Kemp 
3912*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
3913*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), ctx());
3914*6fee86a4SJeremy Kemp }
3915*6fee86a4SJeremy Kemp 
clGetSemaphoreInfoKHR_testSemaphoreGetReferenceCount(cl_semaphore_khr sema_object,cl_semaphore_info_khr param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)3916*6fee86a4SJeremy Kemp static cl_int clGetSemaphoreInfoKHR_testSemaphoreGetReferenceCount(
3917*6fee86a4SJeremy Kemp     cl_semaphore_khr sema_object,
3918*6fee86a4SJeremy Kemp     cl_semaphore_info_khr param_name,
3919*6fee86a4SJeremy Kemp     size_t param_value_size,
3920*6fee86a4SJeremy Kemp     void* param_value,
3921*6fee86a4SJeremy Kemp     size_t* param_value_size_ret,
3922*6fee86a4SJeremy Kemp     int num_calls)
3923*6fee86a4SJeremy Kemp {
3924*6fee86a4SJeremy Kemp     (void) num_calls;
3925*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(semaphorePool[0](), sema_object);
3926*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_SEMAPHORE_REFERENCE_COUNT_KHR, param_name);
3927*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_uint));
3928*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
3929*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_uint);
3930*6fee86a4SJeremy Kemp     if (param_value != nullptr)
3931*6fee86a4SJeremy Kemp         *static_cast<cl_uint *>(param_value) = 1;
3932*6fee86a4SJeremy Kemp 
3933*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3934*6fee86a4SJeremy Kemp }
3935*6fee86a4SJeremy Kemp 
testSemaphoreGetInfoReferenceCount(void)3936*6fee86a4SJeremy Kemp void testSemaphoreGetInfoReferenceCount(void)
3937*6fee86a4SJeremy Kemp {
3938*6fee86a4SJeremy Kemp     clGetSemaphoreInfoKHR_StubWithCallback(clGetSemaphoreInfoKHR_testSemaphoreGetReferenceCount);
3939*6fee86a4SJeremy Kemp 
3940*6fee86a4SJeremy Kemp     cl_int err = CL_INVALID_OPERATION;
3941*6fee86a4SJeremy Kemp 
3942*6fee86a4SJeremy Kemp     cl_uint ret = semaphorePool[0].getInfo<CL_SEMAPHORE_REFERENCE_COUNT_KHR>(&err);
3943*6fee86a4SJeremy Kemp 
3944*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
3945*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(1, ret);
3946*6fee86a4SJeremy Kemp }
3947*6fee86a4SJeremy Kemp 
clGetSemaphoreInfoKHR_testSemaphoreGetProperties(cl_semaphore_khr sema_object,cl_semaphore_info_khr param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)3948*6fee86a4SJeremy Kemp static cl_int clGetSemaphoreInfoKHR_testSemaphoreGetProperties(
3949*6fee86a4SJeremy Kemp     cl_semaphore_khr sema_object,
3950*6fee86a4SJeremy Kemp     cl_semaphore_info_khr param_name,
3951*6fee86a4SJeremy Kemp     size_t param_value_size,
3952*6fee86a4SJeremy Kemp     void* param_value,
3953*6fee86a4SJeremy Kemp     size_t* param_value_size_ret,
3954*6fee86a4SJeremy Kemp     int num_calls)
3955*6fee86a4SJeremy Kemp {
3956*6fee86a4SJeremy Kemp     (void) num_calls;
3957*6fee86a4SJeremy Kemp     static const cl_semaphore_properties_khr test_properties[] =
3958*6fee86a4SJeremy Kemp         {CL_SEMAPHORE_TYPE_KHR,
3959*6fee86a4SJeremy Kemp          CL_SEMAPHORE_TYPE_BINARY_KHR};
3960*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(semaphorePool[0](), sema_object);
3961*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_SEMAPHORE_PROPERTIES_KHR, param_name);
3962*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(test_properties));
3963*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
3964*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(test_properties);
3965*6fee86a4SJeremy Kemp     if (param_value != nullptr) {
3966*6fee86a4SJeremy Kemp         static_cast<cl_semaphore_properties_khr *>(param_value)[0] = test_properties[0];
3967*6fee86a4SJeremy Kemp         static_cast<cl_semaphore_properties_khr *>(param_value)[1] = test_properties[1];
3968*6fee86a4SJeremy Kemp     }
3969*6fee86a4SJeremy Kemp 
3970*6fee86a4SJeremy Kemp     return CL_SUCCESS;
3971*6fee86a4SJeremy Kemp }
3972*6fee86a4SJeremy Kemp 
testSemaphoreGetInfoProperties(void)3973*6fee86a4SJeremy Kemp void testSemaphoreGetInfoProperties(void)
3974*6fee86a4SJeremy Kemp {
3975*6fee86a4SJeremy Kemp     clGetSemaphoreInfoKHR_StubWithCallback(clGetSemaphoreInfoKHR_testSemaphoreGetProperties);
3976*6fee86a4SJeremy Kemp 
3977*6fee86a4SJeremy Kemp     cl_int err = CL_INVALID_OPERATION;
3978*6fee86a4SJeremy Kemp 
3979*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl_semaphore_properties_khr> ret = semaphorePool[0].getInfo<CL_SEMAPHORE_PROPERTIES_KHR>(&err);
3980*6fee86a4SJeremy Kemp 
3981*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
3982*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(2, ret.size());
3983*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SEMAPHORE_TYPE_KHR, ret[0]);
3984*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SEMAPHORE_TYPE_BINARY_KHR, ret[1]);
3985*6fee86a4SJeremy Kemp }
3986*6fee86a4SJeremy Kemp 
clGetSemaphoreInfoKHR_testSemaphoreGetType(cl_semaphore_khr sema_object,cl_semaphore_info_khr param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)3987*6fee86a4SJeremy Kemp static cl_int clGetSemaphoreInfoKHR_testSemaphoreGetType(
3988*6fee86a4SJeremy Kemp     cl_semaphore_khr sema_object,
3989*6fee86a4SJeremy Kemp     cl_semaphore_info_khr param_name,
3990*6fee86a4SJeremy Kemp     size_t param_value_size,
3991*6fee86a4SJeremy Kemp     void* param_value,
3992*6fee86a4SJeremy Kemp     size_t* param_value_size_ret,
3993*6fee86a4SJeremy Kemp     int num_calls)
3994*6fee86a4SJeremy Kemp {
3995*6fee86a4SJeremy Kemp     (void) num_calls;
3996*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(semaphorePool[0](), sema_object);
3997*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_SEMAPHORE_TYPE_KHR, param_name);
3998*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_semaphore_type_khr));
3999*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
4000*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_semaphore_type_khr);
4001*6fee86a4SJeremy Kemp     if (param_value != nullptr)
4002*6fee86a4SJeremy Kemp         *static_cast<cl_semaphore_type_khr *>(param_value) = CL_SEMAPHORE_TYPE_BINARY_KHR;
4003*6fee86a4SJeremy Kemp 
4004*6fee86a4SJeremy Kemp     return CL_SUCCESS;
4005*6fee86a4SJeremy Kemp }
4006*6fee86a4SJeremy Kemp 
testSemaphoreGetInfoType(void)4007*6fee86a4SJeremy Kemp void testSemaphoreGetInfoType(void)
4008*6fee86a4SJeremy Kemp {
4009*6fee86a4SJeremy Kemp     clGetSemaphoreInfoKHR_StubWithCallback(clGetSemaphoreInfoKHR_testSemaphoreGetType);
4010*6fee86a4SJeremy Kemp 
4011*6fee86a4SJeremy Kemp     cl_int err = CL_INVALID_OPERATION;
4012*6fee86a4SJeremy Kemp 
4013*6fee86a4SJeremy Kemp     cl_semaphore_type_khr ret = semaphorePool[0].getInfo<CL_SEMAPHORE_TYPE_KHR>(&err);
4014*6fee86a4SJeremy Kemp 
4015*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
4016*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SEMAPHORE_TYPE_BINARY_KHR, ret);
4017*6fee86a4SJeremy Kemp }
4018*6fee86a4SJeremy Kemp 
clGetSemaphoreInfoKHR_testSemaphoreGetPayload(cl_semaphore_khr sema_object,cl_semaphore_info_khr param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)4019*6fee86a4SJeremy Kemp static cl_int clGetSemaphoreInfoKHR_testSemaphoreGetPayload(
4020*6fee86a4SJeremy Kemp     cl_semaphore_khr sema_object,
4021*6fee86a4SJeremy Kemp     cl_semaphore_info_khr param_name,
4022*6fee86a4SJeremy Kemp     size_t param_value_size,
4023*6fee86a4SJeremy Kemp     void* param_value,
4024*6fee86a4SJeremy Kemp     size_t* param_value_size_ret,
4025*6fee86a4SJeremy Kemp     int num_calls)
4026*6fee86a4SJeremy Kemp {
4027*6fee86a4SJeremy Kemp     (void) num_calls;
4028*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(semaphorePool[0](), sema_object);
4029*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_SEMAPHORE_PAYLOAD_KHR, param_name);
4030*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(cl_semaphore_payload_khr));
4031*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
4032*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(cl_semaphore_payload_khr);
4033*6fee86a4SJeremy Kemp     if (param_value != nullptr)
4034*6fee86a4SJeremy Kemp         *static_cast<cl_semaphore_payload_khr *>(param_value) = 1;
4035*6fee86a4SJeremy Kemp 
4036*6fee86a4SJeremy Kemp     return CL_SUCCESS;
4037*6fee86a4SJeremy Kemp }
4038*6fee86a4SJeremy Kemp 
testSemaphoreGetInfoPayload(void)4039*6fee86a4SJeremy Kemp void testSemaphoreGetInfoPayload(void)
4040*6fee86a4SJeremy Kemp {
4041*6fee86a4SJeremy Kemp     clGetSemaphoreInfoKHR_StubWithCallback(clGetSemaphoreInfoKHR_testSemaphoreGetPayload);
4042*6fee86a4SJeremy Kemp 
4043*6fee86a4SJeremy Kemp     cl_int err = CL_INVALID_OPERATION;
4044*6fee86a4SJeremy Kemp 
4045*6fee86a4SJeremy Kemp     cl_semaphore_payload_khr ret = semaphorePool[0].getInfo<CL_SEMAPHORE_PAYLOAD_KHR>(&err);
4046*6fee86a4SJeremy Kemp 
4047*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
4048*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(1, ret);
4049*6fee86a4SJeremy Kemp }
4050*6fee86a4SJeremy Kemp 
4051*6fee86a4SJeremy Kemp #if defined(CL_SEMAPHORE_DEVICE_HANDLE_LIST_KHR)
clGetSemaphoreInfoKHR_testSemaphoreGetDevices(cl_semaphore_khr sema_object,cl_semaphore_info_khr param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)4052*6fee86a4SJeremy Kemp static cl_int clGetSemaphoreInfoKHR_testSemaphoreGetDevices(
4053*6fee86a4SJeremy Kemp     cl_semaphore_khr sema_object,
4054*6fee86a4SJeremy Kemp     cl_semaphore_info_khr param_name,
4055*6fee86a4SJeremy Kemp     size_t param_value_size,
4056*6fee86a4SJeremy Kemp     void* param_value,
4057*6fee86a4SJeremy Kemp     size_t* param_value_size_ret,
4058*6fee86a4SJeremy Kemp     int num_calls)
4059*6fee86a4SJeremy Kemp {
4060*6fee86a4SJeremy Kemp     (void) num_calls;
4061*6fee86a4SJeremy Kemp     static const cl_device_id test_devices[] =
4062*6fee86a4SJeremy Kemp         {make_device_id(0), make_device_id(1)};
4063*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(semaphorePool[0](), sema_object);
4064*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(CL_SEMAPHORE_DEVICE_HANDLE_LIST_KHR, param_name);
4065*6fee86a4SJeremy Kemp     TEST_ASSERT(param_value == nullptr || param_value_size >= sizeof(test_devices));
4066*6fee86a4SJeremy Kemp     if (param_value_size_ret != nullptr)
4067*6fee86a4SJeremy Kemp         *param_value_size_ret = sizeof(test_devices);
4068*6fee86a4SJeremy Kemp     if (param_value != nullptr) {
4069*6fee86a4SJeremy Kemp         static_cast<cl_device_id *>(param_value)[0] = test_devices[0];
4070*6fee86a4SJeremy Kemp         static_cast<cl_device_id *>(param_value)[1] = test_devices[1];
4071*6fee86a4SJeremy Kemp     }
4072*6fee86a4SJeremy Kemp 
4073*6fee86a4SJeremy Kemp     return CL_SUCCESS;
4074*6fee86a4SJeremy Kemp }
4075*6fee86a4SJeremy Kemp 
testSemaphoreGetInfoDevicesList(void)4076*6fee86a4SJeremy Kemp void testSemaphoreGetInfoDevicesList(void)
4077*6fee86a4SJeremy Kemp {
4078*6fee86a4SJeremy Kemp     cl_device_id expected_devices[] = {make_device_id(0), make_device_id(1)};
4079*6fee86a4SJeremy Kemp     int device_refcounts[] = {1, 1};
4080*6fee86a4SJeremy Kemp 
4081*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
4082*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
4083*6fee86a4SJeremy Kemp     prepare_deviceRefcounts(ARRAY_SIZE(expected_devices), expected_devices, device_refcounts);
4084*6fee86a4SJeremy Kemp 
4085*6fee86a4SJeremy Kemp     clGetSemaphoreInfoKHR_StubWithCallback(clGetSemaphoreInfoKHR_testSemaphoreGetDevices);
4086*6fee86a4SJeremy Kemp 
4087*6fee86a4SJeremy Kemp     cl_int err = CL_INVALID_OPERATION;
4088*6fee86a4SJeremy Kemp 
4089*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl::Device> ret = semaphorePool[0].getInfo<CL_SEMAPHORE_DEVICE_HANDLE_LIST_KHR>(&err);
4090*6fee86a4SJeremy Kemp 
4091*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
4092*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(2, ret.size());
4093*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(make_device_id(0), ret[0]());
4094*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(make_device_id(1), ret[1]());
4095*6fee86a4SJeremy Kemp }
4096*6fee86a4SJeremy Kemp #else
testSemaphoreGetInfoDevicesList(void)4097*6fee86a4SJeremy Kemp void testSemaphoreGetInfoDevicesList(void) {}
4098*6fee86a4SJeremy Kemp #endif
4099*6fee86a4SJeremy Kemp 
testSemaphoreRetain(void)4100*6fee86a4SJeremy Kemp void testSemaphoreRetain(void)
4101*6fee86a4SJeremy Kemp {
4102*6fee86a4SJeremy Kemp     clRetainSemaphoreKHR_ExpectAndReturn(semaphorePool[0](), CL_SUCCESS);
4103*6fee86a4SJeremy Kemp 
4104*6fee86a4SJeremy Kemp     cl_int status = semaphorePool[0].retain();
4105*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, status);
4106*6fee86a4SJeremy Kemp }
4107*6fee86a4SJeremy Kemp 
testSemaphoreRelease(void)4108*6fee86a4SJeremy Kemp void testSemaphoreRelease(void)
4109*6fee86a4SJeremy Kemp {
4110*6fee86a4SJeremy Kemp     clReleaseSemaphoreKHR_ExpectAndReturn(semaphorePool[0](), CL_SUCCESS);
4111*6fee86a4SJeremy Kemp 
4112*6fee86a4SJeremy Kemp     cl_int status = semaphorePool[0].release();
4113*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, status);
4114*6fee86a4SJeremy Kemp }
4115*6fee86a4SJeremy Kemp 
4116*6fee86a4SJeremy Kemp #else
testEnqueueWaitSemaphores(void)4117*6fee86a4SJeremy Kemp void testEnqueueWaitSemaphores(void) {}
testEnqueueSignalSemaphores(void)4118*6fee86a4SJeremy Kemp void testEnqueueSignalSemaphores(void) {}
testSemaphoreWithProperties(void)4119*6fee86a4SJeremy Kemp void testSemaphoreWithProperties(void) {}
testSemaphoreGetInfoContext(void)4120*6fee86a4SJeremy Kemp void testSemaphoreGetInfoContext(void) {}
testSemaphoreGetInfoReferenceCount(void)4121*6fee86a4SJeremy Kemp void testSemaphoreGetInfoReferenceCount(void) {}
testSemaphoreGetInfoProperties(void)4122*6fee86a4SJeremy Kemp void testSemaphoreGetInfoProperties(void) {}
testSemaphoreGetInfoType(void)4123*6fee86a4SJeremy Kemp void testSemaphoreGetInfoType(void) {}
testSemaphoreGetInfoPayload(void)4124*6fee86a4SJeremy Kemp void testSemaphoreGetInfoPayload(void) {}
testSemaphoreGetInfoDevicesList(void)4125*6fee86a4SJeremy Kemp void testSemaphoreGetInfoDevicesList(void) {}
testSemaphoreRetain(void)4126*6fee86a4SJeremy Kemp void testSemaphoreRetain(void) {}
testSemaphoreRelease(void)4127*6fee86a4SJeremy Kemp void testSemaphoreRelease(void) {}
4128*6fee86a4SJeremy Kemp #endif // cl_khr_semaphore
4129*6fee86a4SJeremy Kemp // Tests for external semaphores:
4130*6fee86a4SJeremy Kemp #if defined(cl_khr_external_semaphore)
4131*6fee86a4SJeremy Kemp 
make_external_semaphore_handle(cl_external_semaphore_handle_type_khr handle_type)4132*6fee86a4SJeremy Kemp static void* make_external_semaphore_handle(
4133*6fee86a4SJeremy Kemp     cl_external_semaphore_handle_type_khr handle_type )
4134*6fee86a4SJeremy Kemp {
4135*6fee86a4SJeremy Kemp     return (void*)(uintptr_t)(handle_type << 16 | 0x1111);
4136*6fee86a4SJeremy Kemp }
4137*6fee86a4SJeremy Kemp 
make_external_semaphore_fd(cl_external_semaphore_handle_type_khr handle_type)4138*6fee86a4SJeremy Kemp static int make_external_semaphore_fd(
4139*6fee86a4SJeremy Kemp     cl_external_semaphore_handle_type_khr handle_type)
4140*6fee86a4SJeremy Kemp {
4141*6fee86a4SJeremy Kemp     return (int)(handle_type << 16 | 0x2222);
4142*6fee86a4SJeremy Kemp }
4143*6fee86a4SJeremy Kemp 
clGetSemaphoreHandleForTypeKHR_GetHandles(cl_semaphore_khr sema_object,cl_device_id device,cl_external_semaphore_handle_type_khr handle_type,size_t handle_size,void * handle_ptr,size_t * handle_size_ret,int num_calls)4144*6fee86a4SJeremy Kemp static cl_int clGetSemaphoreHandleForTypeKHR_GetHandles(
4145*6fee86a4SJeremy Kemp     cl_semaphore_khr sema_object,
4146*6fee86a4SJeremy Kemp     cl_device_id device,
4147*6fee86a4SJeremy Kemp     cl_external_semaphore_handle_type_khr handle_type,
4148*6fee86a4SJeremy Kemp     size_t handle_size,
4149*6fee86a4SJeremy Kemp     void* handle_ptr,
4150*6fee86a4SJeremy Kemp     size_t* handle_size_ret,
4151*6fee86a4SJeremy Kemp     int num_calls)
4152*6fee86a4SJeremy Kemp {
4153*6fee86a4SJeremy Kemp     (void) sema_object;
4154*6fee86a4SJeremy Kemp     (void) device;
4155*6fee86a4SJeremy Kemp     (void) num_calls;
4156*6fee86a4SJeremy Kemp 
4157*6fee86a4SJeremy Kemp     switch (handle_type) {
4158*6fee86a4SJeremy Kemp #if defined(cl_khr_external_semaphore_dx_fence)
4159*6fee86a4SJeremy Kemp     case CL_SEMAPHORE_HANDLE_D3D12_FENCE_KHR:
4160*6fee86a4SJeremy Kemp     {
4161*6fee86a4SJeremy Kemp         void* ret = make_external_semaphore_handle(handle_type);
4162*6fee86a4SJeremy Kemp         if (handle_size == sizeof(ret) && handle_ptr) {
4163*6fee86a4SJeremy Kemp             void** pHandle = static_cast<void**>(handle_ptr);
4164*6fee86a4SJeremy Kemp             *pHandle = ret;
4165*6fee86a4SJeremy Kemp         }
4166*6fee86a4SJeremy Kemp         if (handle_size_ret) {
4167*6fee86a4SJeremy Kemp             *handle_size_ret = sizeof(ret);
4168*6fee86a4SJeremy Kemp         }
4169*6fee86a4SJeremy Kemp         return CL_SUCCESS;
4170*6fee86a4SJeremy Kemp     }
4171*6fee86a4SJeremy Kemp #endif
4172*6fee86a4SJeremy Kemp #if defined(cl_khr_external_semaphore_win32)
4173*6fee86a4SJeremy Kemp     case CL_SEMAPHORE_HANDLE_OPAQUE_WIN32_KHR:
4174*6fee86a4SJeremy Kemp     case CL_SEMAPHORE_HANDLE_OPAQUE_WIN32_KMT_KHR:
4175*6fee86a4SJeremy Kemp     {
4176*6fee86a4SJeremy Kemp         void* ret = make_external_semaphore_handle(handle_type);
4177*6fee86a4SJeremy Kemp         if (handle_size == sizeof(ret) && handle_ptr) {
4178*6fee86a4SJeremy Kemp             void** pHandle = static_cast<void**>(handle_ptr);
4179*6fee86a4SJeremy Kemp             *pHandle = ret;
4180*6fee86a4SJeremy Kemp         }
4181*6fee86a4SJeremy Kemp         if (handle_size_ret) {
4182*6fee86a4SJeremy Kemp             *handle_size_ret = sizeof(ret);
4183*6fee86a4SJeremy Kemp         }
4184*6fee86a4SJeremy Kemp         return CL_SUCCESS;
4185*6fee86a4SJeremy Kemp     }
4186*6fee86a4SJeremy Kemp #endif
4187*6fee86a4SJeremy Kemp #if defined(cl_khr_external_semaphore_opaque_fd)
4188*6fee86a4SJeremy Kemp     case CL_SEMAPHORE_HANDLE_OPAQUE_FD_KHR:
4189*6fee86a4SJeremy Kemp     {
4190*6fee86a4SJeremy Kemp         int ret = make_external_semaphore_fd(handle_type);
4191*6fee86a4SJeremy Kemp         if (handle_size == sizeof(ret) && handle_ptr) {
4192*6fee86a4SJeremy Kemp             int* pHandle = static_cast<int*>(handle_ptr);
4193*6fee86a4SJeremy Kemp             *pHandle = ret;
4194*6fee86a4SJeremy Kemp         }
4195*6fee86a4SJeremy Kemp         if (handle_size_ret) {
4196*6fee86a4SJeremy Kemp             *handle_size_ret = sizeof(ret);
4197*6fee86a4SJeremy Kemp         }
4198*6fee86a4SJeremy Kemp         return CL_SUCCESS;
4199*6fee86a4SJeremy Kemp     }
4200*6fee86a4SJeremy Kemp #endif
4201*6fee86a4SJeremy Kemp #if defined(cl_khr_external_semaphore_opaque_fd)
4202*6fee86a4SJeremy Kemp     case CL_SEMAPHORE_HANDLE_SYNC_FD_KHR:
4203*6fee86a4SJeremy Kemp     {
4204*6fee86a4SJeremy Kemp         int ret = make_external_semaphore_fd(handle_type);
4205*6fee86a4SJeremy Kemp         if (handle_size == sizeof(ret) && handle_ptr) {
4206*6fee86a4SJeremy Kemp             int* pHandle = static_cast<int*>(handle_ptr);
4207*6fee86a4SJeremy Kemp             *pHandle = ret;
4208*6fee86a4SJeremy Kemp         }
4209*6fee86a4SJeremy Kemp         if (handle_size_ret) {
4210*6fee86a4SJeremy Kemp             *handle_size_ret = sizeof(ret);
4211*6fee86a4SJeremy Kemp         }
4212*6fee86a4SJeremy Kemp         return CL_SUCCESS;
4213*6fee86a4SJeremy Kemp     }
4214*6fee86a4SJeremy Kemp #endif
4215*6fee86a4SJeremy Kemp     default: break;
4216*6fee86a4SJeremy Kemp     }
4217*6fee86a4SJeremy Kemp     TEST_FAIL();
4218*6fee86a4SJeremy Kemp     return CL_INVALID_OPERATION;
4219*6fee86a4SJeremy Kemp }
4220*6fee86a4SJeremy Kemp 
testTemplateGetSemaphoreHandleForTypeKHR(void)4221*6fee86a4SJeremy Kemp void testTemplateGetSemaphoreHandleForTypeKHR(void)
4222*6fee86a4SJeremy Kemp {
4223*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
4224*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
4225*6fee86a4SJeremy Kemp     clReleaseDevice_ExpectAndReturn(make_device_id(0), CL_SUCCESS);
4226*6fee86a4SJeremy Kemp 
4227*6fee86a4SJeremy Kemp     cl::Device device(make_device_id(0));
4228*6fee86a4SJeremy Kemp 
4229*6fee86a4SJeremy Kemp     clGetSemaphoreHandleForTypeKHR_StubWithCallback(clGetSemaphoreHandleForTypeKHR_GetHandles);
4230*6fee86a4SJeremy Kemp 
4231*6fee86a4SJeremy Kemp     cl::Semaphore semaphore;
4232*6fee86a4SJeremy Kemp #if defined(cl_khr_external_semaphore_dx_fence)
4233*6fee86a4SJeremy Kemp     {
4234*6fee86a4SJeremy Kemp         auto handle0 = semaphore.getHandleForTypeKHR<cl::ExternalSemaphoreType::D3D12Fence>(device);
4235*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(handle0, make_external_semaphore_handle(cl::ExternalSemaphoreType::D3D12Fence));
4236*6fee86a4SJeremy Kemp     }
4237*6fee86a4SJeremy Kemp #endif
4238*6fee86a4SJeremy Kemp #if defined(cl_khr_external_semaphore_opaque_fd)
4239*6fee86a4SJeremy Kemp     {
4240*6fee86a4SJeremy Kemp         auto fd0 = semaphore.getHandleForTypeKHR<cl::ExternalSemaphoreType::OpaqueFd>(device);
4241*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(fd0, make_external_semaphore_fd(cl::ExternalSemaphoreType::OpaqueFd));
4242*6fee86a4SJeremy Kemp     }
4243*6fee86a4SJeremy Kemp #endif
4244*6fee86a4SJeremy Kemp #if defined(cl_khr_external_semaphore_sync_fd)
4245*6fee86a4SJeremy Kemp     {
4246*6fee86a4SJeremy Kemp         auto fd1 = semaphore.getHandleForTypeKHR<cl::ExternalSemaphoreType::SyncFd>(device);
4247*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(fd1, make_external_semaphore_fd(cl::ExternalSemaphoreType::SyncFd));
4248*6fee86a4SJeremy Kemp     }
4249*6fee86a4SJeremy Kemp #endif
4250*6fee86a4SJeremy Kemp #if defined(cl_khr_external_semaphore_win32)
4251*6fee86a4SJeremy Kemp     {
4252*6fee86a4SJeremy Kemp         auto handle1 = semaphore.getHandleForTypeKHR<cl::ExternalSemaphoreType::OpaqueWin32>(device);
4253*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(handle1, make_external_semaphore_handle(cl::ExternalSemaphoreType::OpaqueWin32));
4254*6fee86a4SJeremy Kemp         auto handle2 = semaphore.getHandleForTypeKHR<cl::ExternalSemaphoreType::OpaqueWin32Kmt>(device);
4255*6fee86a4SJeremy Kemp         TEST_ASSERT_EQUAL(handle2, make_external_semaphore_handle(cl::ExternalSemaphoreType::OpaqueWin32Kmt));
4256*6fee86a4SJeremy Kemp     }
4257*6fee86a4SJeremy Kemp #endif
4258*6fee86a4SJeremy Kemp }
4259*6fee86a4SJeremy Kemp #else
testTemplateGetSemaphoreHandleForTypeKHR()4260*6fee86a4SJeremy Kemp void testTemplateGetSemaphoreHandleForTypeKHR() {}
4261*6fee86a4SJeremy Kemp #endif // defined(cl_khr_external_semaphore)
4262*6fee86a4SJeremy Kemp 
4263*6fee86a4SJeremy Kemp /****************************************************************************
4264*6fee86a4SJeremy Kemp  * Tests for cl_khr_external_memory
4265*6fee86a4SJeremy Kemp  ****************************************************************************/
4266*6fee86a4SJeremy Kemp #ifdef cl_khr_external_memory
clEnqueueAcquireExternalMemObjectsKHR_testEnqueueAcquireExternalMemObjects(cl_command_queue command_queue,cl_uint num_mem_objects,const cl_mem * mem_objects,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event,int num_calls)4267*6fee86a4SJeremy Kemp static cl_int clEnqueueAcquireExternalMemObjectsKHR_testEnqueueAcquireExternalMemObjects(
4268*6fee86a4SJeremy Kemp     cl_command_queue command_queue,
4269*6fee86a4SJeremy Kemp     cl_uint num_mem_objects,
4270*6fee86a4SJeremy Kemp     const cl_mem* mem_objects,
4271*6fee86a4SJeremy Kemp     cl_uint num_events_in_wait_list,
4272*6fee86a4SJeremy Kemp     const cl_event* event_wait_list,
4273*6fee86a4SJeremy Kemp     cl_event* event,
4274*6fee86a4SJeremy Kemp     int num_calls)
4275*6fee86a4SJeremy Kemp {
4276*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
4277*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(commandQueuePool[0](), command_queue);
4278*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(1, num_mem_objects);
4279*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(make_mem(0), *mem_objects);
4280*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_events_in_wait_list);
4281*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(event_wait_list);
4282*6fee86a4SJeremy Kemp 
4283*6fee86a4SJeremy Kemp     if (event != nullptr)
4284*6fee86a4SJeremy Kemp     {
4285*6fee86a4SJeremy Kemp         *event = make_event(0);
4286*6fee86a4SJeremy Kemp     }
4287*6fee86a4SJeremy Kemp 
4288*6fee86a4SJeremy Kemp     return CL_SUCCESS;
4289*6fee86a4SJeremy Kemp }
4290*6fee86a4SJeremy Kemp 
testEnqueueAcquireExternalMemObjects(void)4291*6fee86a4SJeremy Kemp void testEnqueueAcquireExternalMemObjects(void)
4292*6fee86a4SJeremy Kemp {
4293*6fee86a4SJeremy Kemp     clGetCommandQueueInfo_StubWithCallback(clGetCommandQueueInfo_testCommandQueueGetDevice);
4294*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
4295*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
4296*6fee86a4SJeremy Kemp 
4297*6fee86a4SJeremy Kemp     clEnqueueAcquireExternalMemObjectsKHR_StubWithCallback(clEnqueueAcquireExternalMemObjectsKHR_testEnqueueAcquireExternalMemObjects);
4298*6fee86a4SJeremy Kemp 
4299*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl::Memory> mem_objects;
4300*6fee86a4SJeremy Kemp     mem_objects.emplace_back(make_mem(0), false);
4301*6fee86a4SJeremy Kemp     cl::Event event;
4302*6fee86a4SJeremy Kemp 
4303*6fee86a4SJeremy Kemp     cl_int status = commandQueuePool[0].enqueueAcquireExternalMemObjects(mem_objects, nullptr, &event);
4304*6fee86a4SJeremy Kemp 
4305*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, status);
4306*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_event(0), event());
4307*6fee86a4SJeremy Kemp 
4308*6fee86a4SJeremy Kemp     // prevent destructor from interfering with the test
4309*6fee86a4SJeremy Kemp     event() = nullptr;
4310*6fee86a4SJeremy Kemp     mem_objects[0]() = nullptr;
4311*6fee86a4SJeremy Kemp }
4312*6fee86a4SJeremy Kemp 
clEnqueueReleaseExternalMemObjectsKHR_testEnqueueReleaseExternalMemObjects(cl_command_queue command_queue,cl_uint num_mem_objects,const cl_mem * mem_objects,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event,int num_calls)4313*6fee86a4SJeremy Kemp static cl_int clEnqueueReleaseExternalMemObjectsKHR_testEnqueueReleaseExternalMemObjects(
4314*6fee86a4SJeremy Kemp     cl_command_queue command_queue,
4315*6fee86a4SJeremy Kemp     cl_uint num_mem_objects,
4316*6fee86a4SJeremy Kemp     const cl_mem* mem_objects,
4317*6fee86a4SJeremy Kemp     cl_uint num_events_in_wait_list,
4318*6fee86a4SJeremy Kemp     const cl_event* event_wait_list,
4319*6fee86a4SJeremy Kemp     cl_event* event,
4320*6fee86a4SJeremy Kemp     int num_calls)
4321*6fee86a4SJeremy Kemp {
4322*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
4323*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(commandQueuePool[0](), command_queue);
4324*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(1, num_mem_objects);
4325*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(make_mem(0), *mem_objects);
4326*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_events_in_wait_list);
4327*6fee86a4SJeremy Kemp     TEST_ASSERT_NULL(event_wait_list);
4328*6fee86a4SJeremy Kemp 
4329*6fee86a4SJeremy Kemp     if (event != nullptr)
4330*6fee86a4SJeremy Kemp     {
4331*6fee86a4SJeremy Kemp         *event = make_event(0);
4332*6fee86a4SJeremy Kemp     }
4333*6fee86a4SJeremy Kemp 
4334*6fee86a4SJeremy Kemp     return CL_SUCCESS;
4335*6fee86a4SJeremy Kemp }
4336*6fee86a4SJeremy Kemp 
testEnqueueReleaseExternalMemObjects(void)4337*6fee86a4SJeremy Kemp void testEnqueueReleaseExternalMemObjects(void)
4338*6fee86a4SJeremy Kemp {
4339*6fee86a4SJeremy Kemp     clGetCommandQueueInfo_StubWithCallback(clGetCommandQueueInfo_testCommandQueueGetDevice);
4340*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
4341*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_1_1);
4342*6fee86a4SJeremy Kemp 
4343*6fee86a4SJeremy Kemp     clEnqueueReleaseExternalMemObjectsKHR_StubWithCallback(clEnqueueReleaseExternalMemObjectsKHR_testEnqueueReleaseExternalMemObjects);
4344*6fee86a4SJeremy Kemp 
4345*6fee86a4SJeremy Kemp     VECTOR_CLASS<cl::Memory> mem_objects;
4346*6fee86a4SJeremy Kemp     mem_objects.emplace_back(make_mem(0), false);
4347*6fee86a4SJeremy Kemp     cl::Event event;
4348*6fee86a4SJeremy Kemp 
4349*6fee86a4SJeremy Kemp     cl_int status = commandQueuePool[0].enqueueReleaseExternalMemObjects(mem_objects, nullptr, &event);
4350*6fee86a4SJeremy Kemp 
4351*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, status);
4352*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_event(0), event());
4353*6fee86a4SJeremy Kemp 
4354*6fee86a4SJeremy Kemp     // prevent destructor from interfering with the test
4355*6fee86a4SJeremy Kemp     event() = nullptr;
4356*6fee86a4SJeremy Kemp     mem_objects[0]() = nullptr;
4357*6fee86a4SJeremy Kemp }
4358*6fee86a4SJeremy Kemp 
4359*6fee86a4SJeremy Kemp #else
testEnqueueAcquireExternalMemObjects(void)4360*6fee86a4SJeremy Kemp void testEnqueueAcquireExternalMemObjects(void) {}
testEnqueueReleaseExternalMemObjects(void)4361*6fee86a4SJeremy Kemp void testEnqueueReleaseExternalMemObjects(void) {}
4362*6fee86a4SJeremy Kemp #endif // cl_khr_external_memory
4363*6fee86a4SJeremy Kemp 
4364*6fee86a4SJeremy Kemp /****************************************************************************
4365*6fee86a4SJeremy Kemp  * Tests for allocate and deallocate API (stubs for clSVMAlloc, clSVMFree, clEnqueueSVMMap)
4366*6fee86a4SJeremy Kemp  ****************************************************************************/
4367*6fee86a4SJeremy Kemp int *testMemory;
clSVMAllocARM_stubForMemoryAllocation(cl_context context,cl_svm_mem_flags flags,size_t size,cl_uint alignment,int cmock_num_calls)4368*6fee86a4SJeremy Kemp void *clSVMAllocARM_stubForMemoryAllocation(cl_context context,cl_svm_mem_flags flags,
4369*6fee86a4SJeremy Kemp                          size_t size, cl_uint alignment, int cmock_num_calls)
4370*6fee86a4SJeremy Kemp {
4371*6fee86a4SJeremy Kemp     (void) context;
4372*6fee86a4SJeremy Kemp     (void) flags;
4373*6fee86a4SJeremy Kemp     (void) alignment;
4374*6fee86a4SJeremy Kemp     (void) cmock_num_calls;
4375*6fee86a4SJeremy Kemp 
4376*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(size, 3 * sizeof(int));
4377*6fee86a4SJeremy Kemp     testMemory = new int[size / sizeof(int)];
4378*6fee86a4SJeremy Kemp     return testMemory;
4379*6fee86a4SJeremy Kemp }
clEnqueueSVMMap_stubForMemoryAllocation(cl_command_queue command_queue,cl_bool blocking_map,cl_map_flags flags,void * svm_ptr,size_t size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,cl_event * event,int cmock_num_calls)4380*6fee86a4SJeremy Kemp cl_int clEnqueueSVMMap_stubForMemoryAllocation(cl_command_queue command_queue, cl_bool blocking_map, cl_map_flags flags, void* svm_ptr, size_t size, cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event, int cmock_num_calls)
4381*6fee86a4SJeremy Kemp {
4382*6fee86a4SJeremy Kemp     (void) command_queue;
4383*6fee86a4SJeremy Kemp     (void) blocking_map;
4384*6fee86a4SJeremy Kemp     (void) flags;
4385*6fee86a4SJeremy Kemp     (void) num_events_in_wait_list;
4386*6fee86a4SJeremy Kemp     (void) event_wait_list;
4387*6fee86a4SJeremy Kemp     (void) event;
4388*6fee86a4SJeremy Kemp     (void) cmock_num_calls;
4389*6fee86a4SJeremy Kemp 
4390*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(svm_ptr, testMemory);
4391*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_HEX(size, 3 * sizeof(int));
4392*6fee86a4SJeremy Kemp     return CL_SUCCESS;
4393*6fee86a4SJeremy Kemp }
clSVMFree_stubForMemoryAllocation(cl_context context,void * svm_pointer,int cmock_num_calls)4394*6fee86a4SJeremy Kemp void clSVMFree_stubForMemoryAllocation(cl_context context, void *svm_pointer,
4395*6fee86a4SJeremy Kemp     int cmock_num_calls)
4396*6fee86a4SJeremy Kemp {
4397*6fee86a4SJeremy Kemp     (void) context;
4398*6fee86a4SJeremy Kemp     (void) cmock_num_calls;
4399*6fee86a4SJeremy Kemp 
4400*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(svm_pointer, testMemory);
4401*6fee86a4SJeremy Kemp     delete[] (int*) svm_pointer;
4402*6fee86a4SJeremy Kemp }
testSVMMemoryAllocation(void)4403*6fee86a4SJeremy Kemp void testSVMMemoryAllocation(void)
4404*6fee86a4SJeremy Kemp {
4405*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 200
4406*6fee86a4SJeremy Kemp     cl::SVMAllocator<int, cl::SVMTraitCoarse<>> svmAllocator;
4407*6fee86a4SJeremy Kemp 
4408*6fee86a4SJeremy Kemp     clSVMAlloc_StubWithCallback(clSVMAllocARM_stubForMemoryAllocation);
4409*6fee86a4SJeremy Kemp     clEnqueueSVMMap_StubWithCallback(clEnqueueSVMMap_stubForMemoryAllocation);
4410*6fee86a4SJeremy Kemp     clSVMFree_StubWithCallback(clSVMFree_stubForMemoryAllocation);
4411*6fee86a4SJeremy Kemp 
4412*6fee86a4SJeremy Kemp     int *ptr = svmAllocator.allocate(3);
4413*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(ptr,testMemory);
4414*6fee86a4SJeremy Kemp     clSVMFree_Expect(0, ptr);
4415*6fee86a4SJeremy Kemp     svmAllocator.deallocate(ptr,3);
4416*6fee86a4SJeremy Kemp #endif
4417*6fee86a4SJeremy Kemp }
4418*6fee86a4SJeremy Kemp 
4419*6fee86a4SJeremy Kemp #if defined(cl_ext_image_requirements_info)
4420*6fee86a4SJeremy Kemp constexpr size_t TEST_SIZE_TYPE_VALUE  = 4;
4421*6fee86a4SJeremy Kemp constexpr cl_uint TEST_UINT_VALUE  = 256;
4422*6fee86a4SJeremy Kemp 
clGetImageRequirementsInfoEXT_GetInfo(cl_context context,const cl_mem_properties * properties,cl_mem_flags flags,const cl_image_format * image_format,const cl_image_desc * image_desc,cl_image_requirements_info_ext param_name,size_t param_value_size,void * param_value,size_t * param_value_size_ret,int num_calls)4423*6fee86a4SJeremy Kemp static cl_int clGetImageRequirementsInfoEXT_GetInfo(
4424*6fee86a4SJeremy Kemp     cl_context context,
4425*6fee86a4SJeremy Kemp     const cl_mem_properties* properties,
4426*6fee86a4SJeremy Kemp     cl_mem_flags flags,
4427*6fee86a4SJeremy Kemp     const cl_image_format* image_format,
4428*6fee86a4SJeremy Kemp     const cl_image_desc* image_desc,
4429*6fee86a4SJeremy Kemp     cl_image_requirements_info_ext param_name,
4430*6fee86a4SJeremy Kemp     size_t param_value_size,
4431*6fee86a4SJeremy Kemp     void* param_value,
4432*6fee86a4SJeremy Kemp     size_t* param_value_size_ret,
4433*6fee86a4SJeremy Kemp     int num_calls)
4434*6fee86a4SJeremy Kemp {
4435*6fee86a4SJeremy Kemp     (void) context;
4436*6fee86a4SJeremy Kemp     (void) properties;
4437*6fee86a4SJeremy Kemp     (void) flags;
4438*6fee86a4SJeremy Kemp     (void) image_format;
4439*6fee86a4SJeremy Kemp     (void) image_desc;
4440*6fee86a4SJeremy Kemp     (void) num_calls;
4441*6fee86a4SJeremy Kemp 
4442*6fee86a4SJeremy Kemp     switch(param_name)
4443*6fee86a4SJeremy Kemp     {
4444*6fee86a4SJeremy Kemp         case CL_IMAGE_REQUIREMENTS_ROW_PITCH_ALIGNMENT_EXT:
4445*6fee86a4SJeremy Kemp         case CL_IMAGE_REQUIREMENTS_BASE_ADDRESS_ALIGNMENT_EXT:
4446*6fee86a4SJeremy Kemp #if defined(cl_ext_image_from_buffer)
4447*6fee86a4SJeremy Kemp         case CL_IMAGE_REQUIREMENTS_SLICE_PITCH_ALIGNMENT_EXT:
4448*6fee86a4SJeremy Kemp #endif
4449*6fee86a4SJeremy Kemp         case CL_IMAGE_REQUIREMENTS_SIZE_EXT:
4450*6fee86a4SJeremy Kemp         {
4451*6fee86a4SJeremy Kemp             size_t ret = 4;
4452*6fee86a4SJeremy Kemp             if (param_value_size == sizeof(ret) && param_value) {
4453*6fee86a4SJeremy Kemp                 *static_cast<size_t *>(param_value) = ret;
4454*6fee86a4SJeremy Kemp             }
4455*6fee86a4SJeremy Kemp 
4456*6fee86a4SJeremy Kemp             if (param_value_size_ret) {
4457*6fee86a4SJeremy Kemp                 *param_value_size_ret = sizeof(ret);
4458*6fee86a4SJeremy Kemp             }
4459*6fee86a4SJeremy Kemp 
4460*6fee86a4SJeremy Kemp             return CL_SUCCESS;
4461*6fee86a4SJeremy Kemp         }
4462*6fee86a4SJeremy Kemp         case CL_IMAGE_REQUIREMENTS_MAX_WIDTH_EXT:
4463*6fee86a4SJeremy Kemp         case CL_IMAGE_REQUIREMENTS_MAX_HEIGHT_EXT:
4464*6fee86a4SJeremy Kemp         case CL_IMAGE_REQUIREMENTS_MAX_DEPTH_EXT:
4465*6fee86a4SJeremy Kemp         case CL_IMAGE_REQUIREMENTS_MAX_ARRAY_SIZE_EXT:
4466*6fee86a4SJeremy Kemp         {
4467*6fee86a4SJeremy Kemp             cl_uint ret = TEST_UINT_VALUE;
4468*6fee86a4SJeremy Kemp             if (param_value_size == sizeof(ret) && param_value) {
4469*6fee86a4SJeremy Kemp                 *static_cast<cl_uint *>(param_value) = ret;
4470*6fee86a4SJeremy Kemp             }
4471*6fee86a4SJeremy Kemp 
4472*6fee86a4SJeremy Kemp             if (param_value_size_ret) {
4473*6fee86a4SJeremy Kemp                 *param_value_size_ret = sizeof(ret);
4474*6fee86a4SJeremy Kemp             }
4475*6fee86a4SJeremy Kemp 
4476*6fee86a4SJeremy Kemp             return CL_SUCCESS;
4477*6fee86a4SJeremy Kemp         }
4478*6fee86a4SJeremy Kemp         default: break;
4479*6fee86a4SJeremy Kemp     }
4480*6fee86a4SJeremy Kemp     TEST_FAIL();
4481*6fee86a4SJeremy Kemp     return CL_INVALID_OPERATION;
4482*6fee86a4SJeremy Kemp }
4483*6fee86a4SJeremy Kemp 
testTemplateGetImageRequirementsInfo(void)4484*6fee86a4SJeremy Kemp void testTemplateGetImageRequirementsInfo(void)
4485*6fee86a4SJeremy Kemp {
4486*6fee86a4SJeremy Kemp     cl::Context context(make_context(0));
4487*6fee86a4SJeremy Kemp     cl_device_id device_expect = make_device_id(0);
4488*6fee86a4SJeremy Kemp     int device_refcount = 1;
4489*6fee86a4SJeremy Kemp 
4490*6fee86a4SJeremy Kemp     prepare_deviceRefcounts(1, &device_expect, &device_refcount);
4491*6fee86a4SJeremy Kemp 
4492*6fee86a4SJeremy Kemp     clGetContextInfo_StubWithCallback(clGetContextInfo_device);
4493*6fee86a4SJeremy Kemp     clGetDeviceInfo_StubWithCallback(clGetDeviceInfo_platform);
4494*6fee86a4SJeremy Kemp     clGetPlatformInfo_StubWithCallback(clGetPlatformInfo_version_2_0);
4495*6fee86a4SJeremy Kemp     clReleaseContext_ExpectAndReturn(make_context(0), CL_SUCCESS);
4496*6fee86a4SJeremy Kemp 
4497*6fee86a4SJeremy Kemp     clGetImageRequirementsInfoEXT_StubWithCallback(clGetImageRequirementsInfoEXT_GetInfo);
4498*6fee86a4SJeremy Kemp 
4499*6fee86a4SJeremy Kemp     auto info0 = context.getImageRequirementsInfoExt<cl::ImageRequirementsInfoExt::RowPitchAlign>();
4500*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(info0, TEST_SIZE_TYPE_VALUE);
4501*6fee86a4SJeremy Kemp 
4502*6fee86a4SJeremy Kemp     auto info1 = context.getImageRequirementsInfoExt<cl::ImageRequirementsInfoExt::BaseAddAlign>();
4503*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(info1, TEST_SIZE_TYPE_VALUE);
4504*6fee86a4SJeremy Kemp 
4505*6fee86a4SJeremy Kemp     auto info2 = context.getImageRequirementsInfoExt<cl::ImageRequirementsInfoExt::Size>();
4506*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(info2, TEST_SIZE_TYPE_VALUE);
4507*6fee86a4SJeremy Kemp 
4508*6fee86a4SJeremy Kemp #if defined(cl_ext_image_from_buffer)
4509*6fee86a4SJeremy Kemp     auto info3 = context.getImageRequirementsInfoExt<cl::ImageRequirementsInfoExt::SlicePitchAlign>();
4510*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(info3, TEST_SIZE_TYPE_VALUE);
4511*6fee86a4SJeremy Kemp #endif
4512*6fee86a4SJeremy Kemp 
4513*6fee86a4SJeremy Kemp     auto info4 = context.getImageRequirementsInfoExt<cl::ImageRequirementsInfoExt::MaxWidth>();
4514*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(info4, TEST_UINT_VALUE);
4515*6fee86a4SJeremy Kemp 
4516*6fee86a4SJeremy Kemp     auto info5 = context.getImageRequirementsInfoExt<cl::ImageRequirementsInfoExt::MaxHeight>();
4517*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(info5, TEST_UINT_VALUE);
4518*6fee86a4SJeremy Kemp 
4519*6fee86a4SJeremy Kemp     auto info6 = context.getImageRequirementsInfoExt<cl::ImageRequirementsInfoExt::MaxDepth>();
4520*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(info6, TEST_UINT_VALUE);
4521*6fee86a4SJeremy Kemp 
4522*6fee86a4SJeremy Kemp     auto info7 = context.getImageRequirementsInfoExt<cl::ImageRequirementsInfoExt::MaxArraySize>();
4523*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(info7, TEST_UINT_VALUE);
4524*6fee86a4SJeremy Kemp }
4525*6fee86a4SJeremy Kemp #else
testTemplateGetImageRequirementsInfo()4526*6fee86a4SJeremy Kemp void testTemplateGetImageRequirementsInfo() {}
4527*6fee86a4SJeremy Kemp #endif // cl_ext_image_requirements_info
4528*6fee86a4SJeremy Kemp 
clCreateFromGLBuffer_testgetObjectInfo(cl_context context,cl_mem_flags flags,cl_GLuint bufobj,cl_int * errcode_ret,int num_calls)4529*6fee86a4SJeremy Kemp static cl_mem clCreateFromGLBuffer_testgetObjectInfo(cl_context context,
4530*6fee86a4SJeremy Kemp                                                      cl_mem_flags flags,
4531*6fee86a4SJeremy Kemp                                                      cl_GLuint bufobj,
4532*6fee86a4SJeremy Kemp                                                      cl_int *errcode_ret,
4533*6fee86a4SJeremy Kemp                                                      int num_calls)
4534*6fee86a4SJeremy Kemp {
4535*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, bufobj);
4536*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_context(0), context);
4537*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, flags);
4538*6fee86a4SJeremy Kemp     if (errcode_ret)
4539*6fee86a4SJeremy Kemp         *errcode_ret = CL_SUCCESS;
4540*6fee86a4SJeremy Kemp     return make_mem(0);
4541*6fee86a4SJeremy Kemp }
4542*6fee86a4SJeremy Kemp 
clGetGLObjectInfo_testgetObjectInfo(cl_mem memobj,cl_gl_object_type * type,cl_GLuint * gl_object_name,int num)4543*6fee86a4SJeremy Kemp static cl_int clGetGLObjectInfo_testgetObjectInfo(cl_mem memobj,
4544*6fee86a4SJeremy Kemp                                                   cl_gl_object_type *type,
4545*6fee86a4SJeremy Kemp                                                   cl_GLuint *gl_object_name,
4546*6fee86a4SJeremy Kemp                                                   int num)
4547*6fee86a4SJeremy Kemp {
4548*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(memobj, make_mem(0));
4549*6fee86a4SJeremy Kemp     *type = CL_GL_OBJECT_BUFFER;
4550*6fee86a4SJeremy Kemp 
4551*6fee86a4SJeremy Kemp     *gl_object_name = 0;
4552*6fee86a4SJeremy Kemp     return CL_SUCCESS;
4553*6fee86a4SJeremy Kemp }
4554*6fee86a4SJeremy Kemp 
testgetObjectInfo()4555*6fee86a4SJeremy Kemp void testgetObjectInfo() {
4556*6fee86a4SJeremy Kemp     cl_mem_flags flags = 0;
4557*6fee86a4SJeremy Kemp     cl_int err = 0;
4558*6fee86a4SJeremy Kemp     cl_GLuint bufobj = 0;
4559*6fee86a4SJeremy Kemp     cl_mem memobj = make_mem(0);
4560*6fee86a4SJeremy Kemp     cl_gl_object_type type = CL_GL_OBJECT_TEXTURE2D_ARRAY;
4561*6fee86a4SJeremy Kemp     clGetGLObjectInfo_StubWithCallback(clGetGLObjectInfo_testgetObjectInfo);
4562*6fee86a4SJeremy Kemp     clCreateFromGLBuffer_StubWithCallback(
4563*6fee86a4SJeremy Kemp         clCreateFromGLBuffer_testgetObjectInfo);
4564*6fee86a4SJeremy Kemp     clReleaseMemObject_ExpectAndReturn(make_mem(0), CL_SUCCESS);
4565*6fee86a4SJeremy Kemp     cl::BufferGL buffer(contextPool[0], flags, bufobj, &err);
4566*6fee86a4SJeremy Kemp 
4567*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(make_mem(0), buffer());
4568*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(CL_SUCCESS, err);
4569*6fee86a4SJeremy Kemp 
4570*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(buffer.getObjectInfo(&type, &bufobj), CL_SUCCESS);
4571*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(type, CL_GL_OBJECT_BUFFER);
4572*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(bufobj, 0);
4573*6fee86a4SJeremy Kemp }
4574*6fee86a4SJeremy Kemp #if CL_HPP_TARGET_OPENCL_VERSION >= 210
clGetHostTimer_testgetHostTimer(cl_device_id device,cl_ulong * host_timestamp,int num_calls)4575*6fee86a4SJeremy Kemp static cl_int clGetHostTimer_testgetHostTimer(cl_device_id device,
4576*6fee86a4SJeremy Kemp                                               cl_ulong *host_timestamp,
4577*6fee86a4SJeremy Kemp                                               int num_calls) {
4578*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL_PTR(devicePool[0](), device);
4579*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(0, num_calls);
4580*6fee86a4SJeremy Kemp     *host_timestamp = 1;
4581*6fee86a4SJeremy Kemp     return 0;
4582*6fee86a4SJeremy Kemp }
4583*6fee86a4SJeremy Kemp 
testgetHostTimer()4584*6fee86a4SJeremy Kemp void testgetHostTimer() {
4585*6fee86a4SJeremy Kemp     cl_ulong retVal = 0;
4586*6fee86a4SJeremy Kemp     cl_int *error = nullptr;
4587*6fee86a4SJeremy Kemp 
4588*6fee86a4SJeremy Kemp     clGetHostTimer_StubWithCallback(clGetHostTimer_testgetHostTimer);
4589*6fee86a4SJeremy Kemp     retVal = devicePool[0].getHostTimer(error);
4590*6fee86a4SJeremy Kemp     TEST_ASSERT_EQUAL(retVal, 1);
4591*6fee86a4SJeremy Kemp }
4592*6fee86a4SJeremy Kemp #else
testgetHostTimer()4593*6fee86a4SJeremy Kemp void testgetHostTimer() {}
4594*6fee86a4SJeremy Kemp #endif // CL_HPP_TARGET_OPENCL_VERSION >= 210
4595*6fee86a4SJeremy Kemp } // extern "C"
4596