1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // validationCL.cpp: Validation functions for generic CL entry point parameters
7*8975f5c5SAndroid Build Coastguard Worker // based on the OpenCL Specification V3.0.7, see https://www.khronos.org/registry/OpenCL/
8*8975f5c5SAndroid Build Coastguard Worker // Each used CL error code is preceeded by a citation of the relevant rule in the spec.
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/cl_utils.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/validationCL_autogen.h"
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker #include "common/string_utils.h"
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_VALIDATE_VERSION(version, major, minor) \
16*8975f5c5SAndroid Build Coastguard Worker do \
17*8975f5c5SAndroid Build Coastguard Worker { \
18*8975f5c5SAndroid Build Coastguard Worker if (version < CL_MAKE_VERSION(major##u, minor##u, 0u)) \
19*8975f5c5SAndroid Build Coastguard Worker { \
20*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE; \
21*8975f5c5SAndroid Build Coastguard Worker } \
22*8975f5c5SAndroid Build Coastguard Worker } while (0)
23*8975f5c5SAndroid Build Coastguard Worker
24*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_VALIDATE_EXTENSION(extension) \
25*8975f5c5SAndroid Build Coastguard Worker do \
26*8975f5c5SAndroid Build Coastguard Worker { \
27*8975f5c5SAndroid Build Coastguard Worker if (!extension) \
28*8975f5c5SAndroid Build Coastguard Worker { \
29*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE; \
30*8975f5c5SAndroid Build Coastguard Worker } \
31*8975f5c5SAndroid Build Coastguard Worker } while (0)
32*8975f5c5SAndroid Build Coastguard Worker
33*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_VALIDATE(expression) \
34*8975f5c5SAndroid Build Coastguard Worker do \
35*8975f5c5SAndroid Build Coastguard Worker { \
36*8975f5c5SAndroid Build Coastguard Worker const cl_int _errorCode = expression; \
37*8975f5c5SAndroid Build Coastguard Worker if (_errorCode != CL_SUCCESS) \
38*8975f5c5SAndroid Build Coastguard Worker { \
39*8975f5c5SAndroid Build Coastguard Worker return _errorCode; \
40*8975f5c5SAndroid Build Coastguard Worker } \
41*8975f5c5SAndroid Build Coastguard Worker } while (0)
42*8975f5c5SAndroid Build Coastguard Worker
43*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_VALIDATE_VERSION_OR_EXTENSION(version, major, minor, extension) \
44*8975f5c5SAndroid Build Coastguard Worker do \
45*8975f5c5SAndroid Build Coastguard Worker { \
46*8975f5c5SAndroid Build Coastguard Worker if (version < CL_MAKE_VERSION(major##u, minor##u, 0u)) \
47*8975f5c5SAndroid Build Coastguard Worker { \
48*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_EXTENSION(extension); \
49*8975f5c5SAndroid Build Coastguard Worker } \
50*8975f5c5SAndroid Build Coastguard Worker } while (0)
51*8975f5c5SAndroid Build Coastguard Worker
52*8975f5c5SAndroid Build Coastguard Worker namespace cl
53*8975f5c5SAndroid Build Coastguard Worker {
54*8975f5c5SAndroid Build Coastguard Worker
55*8975f5c5SAndroid Build Coastguard Worker namespace
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker
ValidateContextProperties(const cl_context_properties * properties,const Platform * & platform)58*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateContextProperties(const cl_context_properties *properties, const Platform *&platform)
59*8975f5c5SAndroid Build Coastguard Worker {
60*8975f5c5SAndroid Build Coastguard Worker platform = nullptr;
61*8975f5c5SAndroid Build Coastguard Worker bool hasUserSync = false;
62*8975f5c5SAndroid Build Coastguard Worker if (properties != nullptr)
63*8975f5c5SAndroid Build Coastguard Worker {
64*8975f5c5SAndroid Build Coastguard Worker while (*properties != 0)
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker switch (*properties++)
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker case CL_CONTEXT_PLATFORM:
69*8975f5c5SAndroid Build Coastguard Worker {
70*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROPERTY if the same property name is specified more than once.
71*8975f5c5SAndroid Build Coastguard Worker if (platform != nullptr)
72*8975f5c5SAndroid Build Coastguard Worker {
73*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROPERTY;
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker cl_platform_id nativePlatform = reinterpret_cast<cl_platform_id>(*properties++);
76*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PLATFORM if platform value specified in properties
77*8975f5c5SAndroid Build Coastguard Worker // is not a valid platform.
78*8975f5c5SAndroid Build Coastguard Worker if (!Platform::IsValid(nativePlatform))
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PLATFORM;
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker platform = &nativePlatform->cast<Platform>();
83*8975f5c5SAndroid Build Coastguard Worker break;
84*8975f5c5SAndroid Build Coastguard Worker }
85*8975f5c5SAndroid Build Coastguard Worker case CL_CONTEXT_INTEROP_USER_SYNC:
86*8975f5c5SAndroid Build Coastguard Worker {
87*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROPERTY if the value specified for a supported property name
88*8975f5c5SAndroid Build Coastguard Worker // is not valid, or if the same property name is specified more than once.
89*8975f5c5SAndroid Build Coastguard Worker if ((*properties != CL_FALSE && *properties != CL_TRUE) || hasUserSync)
90*8975f5c5SAndroid Build Coastguard Worker {
91*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROPERTY;
92*8975f5c5SAndroid Build Coastguard Worker }
93*8975f5c5SAndroid Build Coastguard Worker ++properties;
94*8975f5c5SAndroid Build Coastguard Worker hasUserSync = true;
95*8975f5c5SAndroid Build Coastguard Worker break;
96*8975f5c5SAndroid Build Coastguard Worker }
97*8975f5c5SAndroid Build Coastguard Worker default:
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROPERTY if context property name in properties
100*8975f5c5SAndroid Build Coastguard Worker // is not a supported property name.
101*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROPERTY;
102*8975f5c5SAndroid Build Coastguard Worker }
103*8975f5c5SAndroid Build Coastguard Worker }
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker }
106*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker
ValidateMemoryFlags(MemFlags flags,const Platform & platform)109*8975f5c5SAndroid Build Coastguard Worker bool ValidateMemoryFlags(MemFlags flags, const Platform &platform)
110*8975f5c5SAndroid Build Coastguard Worker {
111*8975f5c5SAndroid Build Coastguard Worker // CL_MEM_READ_WRITE, CL_MEM_WRITE_ONLY, and CL_MEM_READ_ONLY are mutually exclusive.
112*8975f5c5SAndroid Build Coastguard Worker MemFlags allowedFlags(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY);
113*8975f5c5SAndroid Build Coastguard Worker if (!flags.areMutuallyExclusive(CL_MEM_READ_WRITE, CL_MEM_WRITE_ONLY, CL_MEM_READ_ONLY))
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker return false;
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker // CL_MEM_USE_HOST_PTR is mutually exclusive with either of the other two flags.
118*8975f5c5SAndroid Build Coastguard Worker allowedFlags.set(CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR);
119*8975f5c5SAndroid Build Coastguard Worker if (!flags.areMutuallyExclusive(CL_MEM_USE_HOST_PTR,
120*8975f5c5SAndroid Build Coastguard Worker CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR))
121*8975f5c5SAndroid Build Coastguard Worker {
122*8975f5c5SAndroid Build Coastguard Worker return false;
123*8975f5c5SAndroid Build Coastguard Worker }
124*8975f5c5SAndroid Build Coastguard Worker if (platform.isVersionOrNewer(1u, 2u))
125*8975f5c5SAndroid Build Coastguard Worker {
126*8975f5c5SAndroid Build Coastguard Worker // CL_MEM_HOST_WRITE_ONLY, CL_MEM_HOST_READ_ONLY,
127*8975f5c5SAndroid Build Coastguard Worker // and CL_MEM_HOST_NO_ACCESS are mutually exclusive.
128*8975f5c5SAndroid Build Coastguard Worker allowedFlags.set(CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS);
129*8975f5c5SAndroid Build Coastguard Worker if (!flags.areMutuallyExclusive(CL_MEM_HOST_WRITE_ONLY, CL_MEM_HOST_READ_ONLY,
130*8975f5c5SAndroid Build Coastguard Worker CL_MEM_HOST_NO_ACCESS))
131*8975f5c5SAndroid Build Coastguard Worker {
132*8975f5c5SAndroid Build Coastguard Worker return false;
133*8975f5c5SAndroid Build Coastguard Worker }
134*8975f5c5SAndroid Build Coastguard Worker }
135*8975f5c5SAndroid Build Coastguard Worker if (platform.isVersionOrNewer(2u, 0u))
136*8975f5c5SAndroid Build Coastguard Worker {
137*8975f5c5SAndroid Build Coastguard Worker allowedFlags.set(CL_MEM_KERNEL_READ_AND_WRITE);
138*8975f5c5SAndroid Build Coastguard Worker }
139*8975f5c5SAndroid Build Coastguard Worker if (flags.hasOtherBitsThan(allowedFlags))
140*8975f5c5SAndroid Build Coastguard Worker {
141*8975f5c5SAndroid Build Coastguard Worker return false;
142*8975f5c5SAndroid Build Coastguard Worker }
143*8975f5c5SAndroid Build Coastguard Worker return true;
144*8975f5c5SAndroid Build Coastguard Worker }
145*8975f5c5SAndroid Build Coastguard Worker
ValidateMapFlags(MapFlags flags,const Platform & platform)146*8975f5c5SAndroid Build Coastguard Worker bool ValidateMapFlags(MapFlags flags, const Platform &platform)
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker MemFlags allowedFlags(CL_MAP_READ | CL_MAP_WRITE);
149*8975f5c5SAndroid Build Coastguard Worker if (platform.isVersionOrNewer(1u, 2u))
150*8975f5c5SAndroid Build Coastguard Worker {
151*8975f5c5SAndroid Build Coastguard Worker // CL_MAP_READ or CL_MAP_WRITE and CL_MAP_WRITE_INVALIDATE_REGION are mutually exclusive.
152*8975f5c5SAndroid Build Coastguard Worker allowedFlags.set(CL_MAP_WRITE_INVALIDATE_REGION);
153*8975f5c5SAndroid Build Coastguard Worker if (!flags.areMutuallyExclusive(CL_MAP_WRITE_INVALIDATE_REGION, CL_MAP_READ | CL_MAP_WRITE))
154*8975f5c5SAndroid Build Coastguard Worker {
155*8975f5c5SAndroid Build Coastguard Worker return false;
156*8975f5c5SAndroid Build Coastguard Worker }
157*8975f5c5SAndroid Build Coastguard Worker }
158*8975f5c5SAndroid Build Coastguard Worker if (flags.hasOtherBitsThan(allowedFlags))
159*8975f5c5SAndroid Build Coastguard Worker {
160*8975f5c5SAndroid Build Coastguard Worker return false;
161*8975f5c5SAndroid Build Coastguard Worker }
162*8975f5c5SAndroid Build Coastguard Worker return true;
163*8975f5c5SAndroid Build Coastguard Worker }
164*8975f5c5SAndroid Build Coastguard Worker
ValidateMemoryProperties(const cl_mem_properties * properties)165*8975f5c5SAndroid Build Coastguard Worker bool ValidateMemoryProperties(const cl_mem_properties *properties)
166*8975f5c5SAndroid Build Coastguard Worker {
167*8975f5c5SAndroid Build Coastguard Worker if (properties != nullptr)
168*8975f5c5SAndroid Build Coastguard Worker {
169*8975f5c5SAndroid Build Coastguard Worker // OpenCL 3.0 does not define any optional properties.
170*8975f5c5SAndroid Build Coastguard Worker // This function is reserved for extensions and future use.
171*8975f5c5SAndroid Build Coastguard Worker if (*properties != 0)
172*8975f5c5SAndroid Build Coastguard Worker {
173*8975f5c5SAndroid Build Coastguard Worker return false;
174*8975f5c5SAndroid Build Coastguard Worker }
175*8975f5c5SAndroid Build Coastguard Worker }
176*8975f5c5SAndroid Build Coastguard Worker return true;
177*8975f5c5SAndroid Build Coastguard Worker }
178*8975f5c5SAndroid Build Coastguard Worker
ValidateCommandQueueAndEventWaitList(cl_command_queue commandQueue,bool validateImageSupport,cl_uint numEvents,const cl_event * events)179*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCommandQueueAndEventWaitList(cl_command_queue commandQueue,
180*8975f5c5SAndroid Build Coastguard Worker bool validateImageSupport,
181*8975f5c5SAndroid Build Coastguard Worker cl_uint numEvents,
182*8975f5c5SAndroid Build Coastguard Worker const cl_event *events)
183*8975f5c5SAndroid Build Coastguard Worker {
184*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_COMMAND_QUEUE if command_queue is not a valid host command-queue.
185*8975f5c5SAndroid Build Coastguard Worker if (!CommandQueue::IsValid(commandQueue))
186*8975f5c5SAndroid Build Coastguard Worker {
187*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
188*8975f5c5SAndroid Build Coastguard Worker }
189*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = commandQueue->cast<CommandQueue>();
190*8975f5c5SAndroid Build Coastguard Worker if (!queue.isOnHost())
191*8975f5c5SAndroid Build Coastguard Worker {
192*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
193*8975f5c5SAndroid Build Coastguard Worker }
194*8975f5c5SAndroid Build Coastguard Worker
195*8975f5c5SAndroid Build Coastguard Worker if (validateImageSupport)
196*8975f5c5SAndroid Build Coastguard Worker {
197*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if the device associated with command_queue does not support images.
198*8975f5c5SAndroid Build Coastguard Worker if (queue.getDevice().getInfo().imageSupport == CL_FALSE)
199*8975f5c5SAndroid Build Coastguard Worker {
200*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
201*8975f5c5SAndroid Build Coastguard Worker }
202*8975f5c5SAndroid Build Coastguard Worker }
203*8975f5c5SAndroid Build Coastguard Worker
204*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0,
205*8975f5c5SAndroid Build Coastguard Worker // or event_wait_list is not NULL and num_events_in_wait_list is 0, ...
206*8975f5c5SAndroid Build Coastguard Worker if ((events == nullptr) != (numEvents == 0u))
207*8975f5c5SAndroid Build Coastguard Worker {
208*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_EVENT_WAIT_LIST;
209*8975f5c5SAndroid Build Coastguard Worker }
210*8975f5c5SAndroid Build Coastguard Worker while (numEvents-- != 0u)
211*8975f5c5SAndroid Build Coastguard Worker {
212*8975f5c5SAndroid Build Coastguard Worker // or if event objects in event_wait_list are not valid events.
213*8975f5c5SAndroid Build Coastguard Worker if (!Event::IsValid(*events))
214*8975f5c5SAndroid Build Coastguard Worker {
215*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_EVENT_WAIT_LIST;
216*8975f5c5SAndroid Build Coastguard Worker }
217*8975f5c5SAndroid Build Coastguard Worker
218*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if the context associated with command_queue
219*8975f5c5SAndroid Build Coastguard Worker // and events in event_wait_list are not the same.
220*8975f5c5SAndroid Build Coastguard Worker if (&queue.getContext() != &(*events++)->cast<Event>().getContext())
221*8975f5c5SAndroid Build Coastguard Worker {
222*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
223*8975f5c5SAndroid Build Coastguard Worker }
224*8975f5c5SAndroid Build Coastguard Worker }
225*8975f5c5SAndroid Build Coastguard Worker
226*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
227*8975f5c5SAndroid Build Coastguard Worker }
228*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueBuffer(const CommandQueue & queue,cl_mem buffer,bool hostRead,bool hostWrite)229*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueBuffer(const CommandQueue &queue,
230*8975f5c5SAndroid Build Coastguard Worker cl_mem buffer,
231*8975f5c5SAndroid Build Coastguard Worker bool hostRead,
232*8975f5c5SAndroid Build Coastguard Worker bool hostWrite)
233*8975f5c5SAndroid Build Coastguard Worker {
234*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if buffer is not a valid buffer object.
235*8975f5c5SAndroid Build Coastguard Worker if (!Buffer::IsValid(buffer))
236*8975f5c5SAndroid Build Coastguard Worker {
237*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
238*8975f5c5SAndroid Build Coastguard Worker }
239*8975f5c5SAndroid Build Coastguard Worker const Buffer &buf = buffer->cast<Buffer>();
240*8975f5c5SAndroid Build Coastguard Worker
241*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if the context associated with command_queue and buffer are not the same.
242*8975f5c5SAndroid Build Coastguard Worker if (&queue.getContext() != &buf.getContext())
243*8975f5c5SAndroid Build Coastguard Worker {
244*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
245*8975f5c5SAndroid Build Coastguard Worker }
246*8975f5c5SAndroid Build Coastguard Worker
247*8975f5c5SAndroid Build Coastguard Worker // CL_MISALIGNED_SUB_BUFFER_OFFSET if buffer is a sub-buffer object and offset specified
248*8975f5c5SAndroid Build Coastguard Worker // when the sub-buffer object is created is not aligned to CL_DEVICE_MEM_BASE_ADDR_ALIGN
249*8975f5c5SAndroid Build Coastguard Worker // value (which is in bits!) for device associated with queue.
250*8975f5c5SAndroid Build Coastguard Worker if (buf.isSubBuffer() &&
251*8975f5c5SAndroid Build Coastguard Worker (buf.getOffset() % (queue.getDevice().getInfo().memBaseAddrAlign / 8u)) != 0u)
252*8975f5c5SAndroid Build Coastguard Worker {
253*8975f5c5SAndroid Build Coastguard Worker return CL_MISALIGNED_SUB_BUFFER_OFFSET;
254*8975f5c5SAndroid Build Coastguard Worker }
255*8975f5c5SAndroid Build Coastguard Worker
256*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if a read function is called on buffer which
257*8975f5c5SAndroid Build Coastguard Worker // has been created with CL_MEM_HOST_WRITE_ONLY or CL_MEM_HOST_NO_ACCESS.
258*8975f5c5SAndroid Build Coastguard Worker if (hostRead && buf.getFlags().intersects(CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_NO_ACCESS))
259*8975f5c5SAndroid Build Coastguard Worker {
260*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
261*8975f5c5SAndroid Build Coastguard Worker }
262*8975f5c5SAndroid Build Coastguard Worker
263*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if a write function is called on buffer which
264*8975f5c5SAndroid Build Coastguard Worker // has been created with CL_MEM_HOST_READ_ONLY or CL_MEM_HOST_NO_ACCESS.
265*8975f5c5SAndroid Build Coastguard Worker if (hostWrite && buf.getFlags().intersects(CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS))
266*8975f5c5SAndroid Build Coastguard Worker {
267*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
268*8975f5c5SAndroid Build Coastguard Worker }
269*8975f5c5SAndroid Build Coastguard Worker
270*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
271*8975f5c5SAndroid Build Coastguard Worker }
272*8975f5c5SAndroid Build Coastguard Worker
ValidateBufferRect(const Buffer & buffer,const size_t * origin,const size_t * region,size_t rowPitch,size_t slicePitch)273*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateBufferRect(const Buffer &buffer,
274*8975f5c5SAndroid Build Coastguard Worker const size_t *origin,
275*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
276*8975f5c5SAndroid Build Coastguard Worker size_t rowPitch,
277*8975f5c5SAndroid Build Coastguard Worker size_t slicePitch)
278*8975f5c5SAndroid Build Coastguard Worker {
279*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if origin or region is NULL.
280*8975f5c5SAndroid Build Coastguard Worker if (origin == nullptr || region == nullptr)
281*8975f5c5SAndroid Build Coastguard Worker {
282*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
283*8975f5c5SAndroid Build Coastguard Worker }
284*8975f5c5SAndroid Build Coastguard Worker
285*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if any region array element is 0.
286*8975f5c5SAndroid Build Coastguard Worker if (region[0] == 0u || region[1] == 0u || region[2] == 0u)
287*8975f5c5SAndroid Build Coastguard Worker {
288*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
289*8975f5c5SAndroid Build Coastguard Worker }
290*8975f5c5SAndroid Build Coastguard Worker
291*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if row_pitch is not 0 and is less than region[0].
292*8975f5c5SAndroid Build Coastguard Worker if (rowPitch == 0u)
293*8975f5c5SAndroid Build Coastguard Worker {
294*8975f5c5SAndroid Build Coastguard Worker rowPitch = region[0];
295*8975f5c5SAndroid Build Coastguard Worker }
296*8975f5c5SAndroid Build Coastguard Worker else if (rowPitch < region[0])
297*8975f5c5SAndroid Build Coastguard Worker {
298*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
299*8975f5c5SAndroid Build Coastguard Worker }
300*8975f5c5SAndroid Build Coastguard Worker
301*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if slice_pitch is not 0 and is less than
302*8975f5c5SAndroid Build Coastguard Worker // region[1] x row_pitch and not a multiple of row_pitch.
303*8975f5c5SAndroid Build Coastguard Worker if (slicePitch == 0u)
304*8975f5c5SAndroid Build Coastguard Worker {
305*8975f5c5SAndroid Build Coastguard Worker slicePitch = region[1] * rowPitch;
306*8975f5c5SAndroid Build Coastguard Worker }
307*8975f5c5SAndroid Build Coastguard Worker else if (slicePitch < region[1] * rowPitch || (slicePitch % rowPitch) != 0u)
308*8975f5c5SAndroid Build Coastguard Worker {
309*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
310*8975f5c5SAndroid Build Coastguard Worker }
311*8975f5c5SAndroid Build Coastguard Worker
312*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if the region being read or written specified
313*8975f5c5SAndroid Build Coastguard Worker // by (origin, region, row_pitch, slice_pitch) is out of bounds.
314*8975f5c5SAndroid Build Coastguard Worker if (!buffer.isRegionValid(
315*8975f5c5SAndroid Build Coastguard Worker origin[2] * slicePitch + origin[1] * rowPitch + origin[0],
316*8975f5c5SAndroid Build Coastguard Worker (region[2] - 1u) * slicePitch + (region[1] - 1u) * rowPitch + region[0]))
317*8975f5c5SAndroid Build Coastguard Worker {
318*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
319*8975f5c5SAndroid Build Coastguard Worker }
320*8975f5c5SAndroid Build Coastguard Worker
321*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
322*8975f5c5SAndroid Build Coastguard Worker }
323*8975f5c5SAndroid Build Coastguard Worker
ValidateHostRect(const size_t * hostOrigin,const size_t * region,size_t hostRowPitch,size_t hostSlicePitch,const void * ptr)324*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateHostRect(const size_t *hostOrigin,
325*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
326*8975f5c5SAndroid Build Coastguard Worker size_t hostRowPitch,
327*8975f5c5SAndroid Build Coastguard Worker size_t hostSlicePitch,
328*8975f5c5SAndroid Build Coastguard Worker const void *ptr)
329*8975f5c5SAndroid Build Coastguard Worker {
330*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if host_origin or region is NULL.
331*8975f5c5SAndroid Build Coastguard Worker if (hostOrigin == nullptr || region == nullptr)
332*8975f5c5SAndroid Build Coastguard Worker {
333*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
334*8975f5c5SAndroid Build Coastguard Worker }
335*8975f5c5SAndroid Build Coastguard Worker
336*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if any region array element is 0.
337*8975f5c5SAndroid Build Coastguard Worker if (region[0] == 0u || region[1] == 0u || region[2] == 0u)
338*8975f5c5SAndroid Build Coastguard Worker {
339*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
340*8975f5c5SAndroid Build Coastguard Worker }
341*8975f5c5SAndroid Build Coastguard Worker
342*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if host_row_pitch is not 0 and is less than region[0].
343*8975f5c5SAndroid Build Coastguard Worker if (hostRowPitch == 0u)
344*8975f5c5SAndroid Build Coastguard Worker {
345*8975f5c5SAndroid Build Coastguard Worker hostRowPitch = region[0];
346*8975f5c5SAndroid Build Coastguard Worker }
347*8975f5c5SAndroid Build Coastguard Worker else if (hostRowPitch < region[0])
348*8975f5c5SAndroid Build Coastguard Worker {
349*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
350*8975f5c5SAndroid Build Coastguard Worker }
351*8975f5c5SAndroid Build Coastguard Worker
352*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if host_slice_pitch is not 0 and is less than
353*8975f5c5SAndroid Build Coastguard Worker // region[1] x host_row_pitch and not a multiple of host_row_pitch.
354*8975f5c5SAndroid Build Coastguard Worker if (hostSlicePitch != 0u &&
355*8975f5c5SAndroid Build Coastguard Worker (hostSlicePitch < region[1] * hostRowPitch || (hostSlicePitch % hostRowPitch) != 0u))
356*8975f5c5SAndroid Build Coastguard Worker {
357*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
358*8975f5c5SAndroid Build Coastguard Worker }
359*8975f5c5SAndroid Build Coastguard Worker
360*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if ptr is NULL.
361*8975f5c5SAndroid Build Coastguard Worker if (ptr == nullptr)
362*8975f5c5SAndroid Build Coastguard Worker {
363*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
364*8975f5c5SAndroid Build Coastguard Worker }
365*8975f5c5SAndroid Build Coastguard Worker
366*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
367*8975f5c5SAndroid Build Coastguard Worker }
368*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueImage(const CommandQueue & queue,cl_mem image,bool hostRead,bool hostWrite)369*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueImage(const CommandQueue &queue, cl_mem image, bool hostRead, bool hostWrite)
370*8975f5c5SAndroid Build Coastguard Worker {
371*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if image is not a valid image object.
372*8975f5c5SAndroid Build Coastguard Worker if (!Image::IsValid(image))
373*8975f5c5SAndroid Build Coastguard Worker {
374*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
375*8975f5c5SAndroid Build Coastguard Worker }
376*8975f5c5SAndroid Build Coastguard Worker const Image &img = image->cast<Image>();
377*8975f5c5SAndroid Build Coastguard Worker
378*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if the context associated with command_queue and image are not the same.
379*8975f5c5SAndroid Build Coastguard Worker if (&queue.getContext() != &img.getContext())
380*8975f5c5SAndroid Build Coastguard Worker {
381*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
382*8975f5c5SAndroid Build Coastguard Worker }
383*8975f5c5SAndroid Build Coastguard Worker
384*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if a read function is called on image which
385*8975f5c5SAndroid Build Coastguard Worker // has been created with CL_MEM_HOST_WRITE_ONLY or CL_MEM_HOST_NO_ACCESS.
386*8975f5c5SAndroid Build Coastguard Worker if (hostRead && img.getFlags().intersects(CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_NO_ACCESS))
387*8975f5c5SAndroid Build Coastguard Worker {
388*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
389*8975f5c5SAndroid Build Coastguard Worker }
390*8975f5c5SAndroid Build Coastguard Worker
391*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if a write function is called on image which
392*8975f5c5SAndroid Build Coastguard Worker // has been created with CL_MEM_HOST_READ_ONLY or CL_MEM_HOST_NO_ACCESS.
393*8975f5c5SAndroid Build Coastguard Worker if (hostWrite && img.getFlags().intersects(CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS))
394*8975f5c5SAndroid Build Coastguard Worker {
395*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
396*8975f5c5SAndroid Build Coastguard Worker }
397*8975f5c5SAndroid Build Coastguard Worker
398*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
399*8975f5c5SAndroid Build Coastguard Worker }
400*8975f5c5SAndroid Build Coastguard Worker
ValidateImageForDevice(const Image & image,const Device & device,const size_t * origin,const size_t * region)401*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateImageForDevice(const Image &image,
402*8975f5c5SAndroid Build Coastguard Worker const Device &device,
403*8975f5c5SAndroid Build Coastguard Worker const size_t *origin,
404*8975f5c5SAndroid Build Coastguard Worker const size_t *region)
405*8975f5c5SAndroid Build Coastguard Worker {
406*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if origin or region is NULL.
407*8975f5c5SAndroid Build Coastguard Worker if (origin == nullptr || region == nullptr)
408*8975f5c5SAndroid Build Coastguard Worker {
409*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
410*8975f5c5SAndroid Build Coastguard Worker }
411*8975f5c5SAndroid Build Coastguard Worker
412*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if values in origin and region do not follow rules
413*8975f5c5SAndroid Build Coastguard Worker // described in the argument description for origin and region.
414*8975f5c5SAndroid Build Coastguard Worker // The values in region cannot be 0.
415*8975f5c5SAndroid Build Coastguard Worker if (region[0] == 0u || region[1] == 0u || region[2] == 0u)
416*8975f5c5SAndroid Build Coastguard Worker {
417*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
418*8975f5c5SAndroid Build Coastguard Worker }
419*8975f5c5SAndroid Build Coastguard Worker switch (image.getType())
420*8975f5c5SAndroid Build Coastguard Worker {
421*8975f5c5SAndroid Build Coastguard Worker // If image is a 1D image or 1D image buffer object,
422*8975f5c5SAndroid Build Coastguard Worker // origin[1] and origin[2] must be 0 and region[1] and region[2] must be 1.
423*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D:
424*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D_Buffer:
425*8975f5c5SAndroid Build Coastguard Worker if (origin[1] != 0u || origin[2] != 0u || region[1] != 1u || region[2] != 1u)
426*8975f5c5SAndroid Build Coastguard Worker {
427*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
428*8975f5c5SAndroid Build Coastguard Worker }
429*8975f5c5SAndroid Build Coastguard Worker break;
430*8975f5c5SAndroid Build Coastguard Worker // If image is a 2D image object or a 1D image array object,
431*8975f5c5SAndroid Build Coastguard Worker // origin[2] must be 0 and region[2] must be 1.
432*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image2D:
433*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D_Array:
434*8975f5c5SAndroid Build Coastguard Worker if (origin[2] != 0u || region[2] != 1u)
435*8975f5c5SAndroid Build Coastguard Worker {
436*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
437*8975f5c5SAndroid Build Coastguard Worker }
438*8975f5c5SAndroid Build Coastguard Worker break;
439*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image3D:
440*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image2D_Array:
441*8975f5c5SAndroid Build Coastguard Worker break;
442*8975f5c5SAndroid Build Coastguard Worker default:
443*8975f5c5SAndroid Build Coastguard Worker ASSERT(false);
444*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
445*8975f5c5SAndroid Build Coastguard Worker }
446*8975f5c5SAndroid Build Coastguard Worker
447*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if the region being read or written
448*8975f5c5SAndroid Build Coastguard Worker // specified by origin and region is out of bounds.
449*8975f5c5SAndroid Build Coastguard Worker
450*8975f5c5SAndroid Build Coastguard Worker if (!image.isRegionValid(cl::MemOffsets{origin[0], origin[1], origin[2]},
451*8975f5c5SAndroid Build Coastguard Worker cl::Coordinate{region[0], region[1], region[2]}))
452*8975f5c5SAndroid Build Coastguard Worker {
453*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
454*8975f5c5SAndroid Build Coastguard Worker }
455*8975f5c5SAndroid Build Coastguard Worker
456*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_IMAGE_SIZE if image dimensions (image width, height, specified or compute
457*8975f5c5SAndroid Build Coastguard Worker // row and/or slice pitch) for image are not supported by device associated with queue.
458*8975f5c5SAndroid Build Coastguard Worker if (!device.supportsImageDimensions(image.getDescriptor()))
459*8975f5c5SAndroid Build Coastguard Worker {
460*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_SIZE;
461*8975f5c5SAndroid Build Coastguard Worker }
462*8975f5c5SAndroid Build Coastguard Worker
463*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
464*8975f5c5SAndroid Build Coastguard Worker }
465*8975f5c5SAndroid Build Coastguard Worker
ValidateHostRegionForImage(const Image & image,const size_t region[3],size_t rowPitch,size_t slicePitch,const void * ptr)466*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateHostRegionForImage(const Image &image,
467*8975f5c5SAndroid Build Coastguard Worker const size_t region[3],
468*8975f5c5SAndroid Build Coastguard Worker size_t rowPitch,
469*8975f5c5SAndroid Build Coastguard Worker size_t slicePitch,
470*8975f5c5SAndroid Build Coastguard Worker const void *ptr)
471*8975f5c5SAndroid Build Coastguard Worker {
472*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if row_pitch is not 0 and is less than the element size in bytes x width.
473*8975f5c5SAndroid Build Coastguard Worker if (rowPitch == 0u)
474*8975f5c5SAndroid Build Coastguard Worker {
475*8975f5c5SAndroid Build Coastguard Worker rowPitch = image.getElementSize() * region[0];
476*8975f5c5SAndroid Build Coastguard Worker }
477*8975f5c5SAndroid Build Coastguard Worker else if (rowPitch < image.getElementSize() * region[0])
478*8975f5c5SAndroid Build Coastguard Worker {
479*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
480*8975f5c5SAndroid Build Coastguard Worker }
481*8975f5c5SAndroid Build Coastguard Worker if (slicePitch != 0u)
482*8975f5c5SAndroid Build Coastguard Worker {
483*8975f5c5SAndroid Build Coastguard Worker // TODO(jplate) Follow up with https://github.com/KhronosGroup/OpenCL-Docs/issues/624
484*8975f5c5SAndroid Build Coastguard Worker // This error is missing in the OpenCL spec.
485*8975f5c5SAndroid Build Coastguard Worker // slice_pitch must be 0 if image is a 1D or 2D image.
486*8975f5c5SAndroid Build Coastguard Worker if (image.getType() == MemObjectType::Image1D ||
487*8975f5c5SAndroid Build Coastguard Worker image.getType() == MemObjectType::Image1D_Buffer ||
488*8975f5c5SAndroid Build Coastguard Worker image.getType() == MemObjectType::Image2D)
489*8975f5c5SAndroid Build Coastguard Worker {
490*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
491*8975f5c5SAndroid Build Coastguard Worker }
492*8975f5c5SAndroid Build Coastguard Worker else if (slicePitch < rowPitch)
493*8975f5c5SAndroid Build Coastguard Worker {
494*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
495*8975f5c5SAndroid Build Coastguard Worker }
496*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if slice_pitch is not 0 and is less than row_pitch x height.
497*8975f5c5SAndroid Build Coastguard Worker else if (((image.getType() == MemObjectType::Image2D_Array) ||
498*8975f5c5SAndroid Build Coastguard Worker (image.getType() == MemObjectType::Image3D)) &&
499*8975f5c5SAndroid Build Coastguard Worker (slicePitch < rowPitch * region[1]))
500*8975f5c5SAndroid Build Coastguard Worker {
501*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
502*8975f5c5SAndroid Build Coastguard Worker }
503*8975f5c5SAndroid Build Coastguard Worker }
504*8975f5c5SAndroid Build Coastguard Worker
505*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if ptr is NULL.
506*8975f5c5SAndroid Build Coastguard Worker if (ptr == nullptr)
507*8975f5c5SAndroid Build Coastguard Worker {
508*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
509*8975f5c5SAndroid Build Coastguard Worker }
510*8975f5c5SAndroid Build Coastguard Worker
511*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
512*8975f5c5SAndroid Build Coastguard Worker }
513*8975f5c5SAndroid Build Coastguard Worker
514*8975f5c5SAndroid Build Coastguard Worker } // namespace
515*8975f5c5SAndroid Build Coastguard Worker
516*8975f5c5SAndroid Build Coastguard Worker // CL 1.0
ValidateGetPlatformIDs(cl_uint num_entries,const cl_platform_id * platforms,const cl_uint * num_platforms)517*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetPlatformIDs(cl_uint num_entries,
518*8975f5c5SAndroid Build Coastguard Worker const cl_platform_id *platforms,
519*8975f5c5SAndroid Build Coastguard Worker const cl_uint *num_platforms)
520*8975f5c5SAndroid Build Coastguard Worker {
521*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if num_entries is equal to zero and platforms is not NULL
522*8975f5c5SAndroid Build Coastguard Worker // or if both num_platforms and platforms are NULL.
523*8975f5c5SAndroid Build Coastguard Worker if ((num_entries == 0u && platforms != nullptr) ||
524*8975f5c5SAndroid Build Coastguard Worker (platforms == nullptr && num_platforms == nullptr))
525*8975f5c5SAndroid Build Coastguard Worker {
526*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
527*8975f5c5SAndroid Build Coastguard Worker }
528*8975f5c5SAndroid Build Coastguard Worker
529*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
530*8975f5c5SAndroid Build Coastguard Worker }
531*8975f5c5SAndroid Build Coastguard Worker
ValidateGetPlatformInfo(cl_platform_id platform,PlatformInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)532*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetPlatformInfo(cl_platform_id platform,
533*8975f5c5SAndroid Build Coastguard Worker PlatformInfo param_name,
534*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
535*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
536*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
537*8975f5c5SAndroid Build Coastguard Worker {
538*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PLATFORM if platform is not a valid platform.
539*8975f5c5SAndroid Build Coastguard Worker if (!Platform::IsValidOrDefault(platform))
540*8975f5c5SAndroid Build Coastguard Worker {
541*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PLATFORM;
542*8975f5c5SAndroid Build Coastguard Worker }
543*8975f5c5SAndroid Build Coastguard Worker
544*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not one of the supported values.
545*8975f5c5SAndroid Build Coastguard Worker const cl_version version = platform->cast<Platform>().getVersion();
546*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
547*8975f5c5SAndroid Build Coastguard Worker {
548*8975f5c5SAndroid Build Coastguard Worker case PlatformInfo::HostTimerResolution:
549*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 2, 1);
550*8975f5c5SAndroid Build Coastguard Worker break;
551*8975f5c5SAndroid Build Coastguard Worker case PlatformInfo::NumericVersion:
552*8975f5c5SAndroid Build Coastguard Worker case PlatformInfo::ExtensionsWithVersion:
553*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 3, 0);
554*8975f5c5SAndroid Build Coastguard Worker break;
555*8975f5c5SAndroid Build Coastguard Worker case PlatformInfo::InvalidEnum:
556*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
557*8975f5c5SAndroid Build Coastguard Worker default:
558*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
559*8975f5c5SAndroid Build Coastguard Worker break;
560*8975f5c5SAndroid Build Coastguard Worker }
561*8975f5c5SAndroid Build Coastguard Worker
562*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
563*8975f5c5SAndroid Build Coastguard Worker }
564*8975f5c5SAndroid Build Coastguard Worker
ValidateGetDeviceIDs(cl_platform_id platform,DeviceType device_type,cl_uint num_entries,const cl_device_id * devices,const cl_uint * num_devices)565*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetDeviceIDs(cl_platform_id platform,
566*8975f5c5SAndroid Build Coastguard Worker DeviceType device_type,
567*8975f5c5SAndroid Build Coastguard Worker cl_uint num_entries,
568*8975f5c5SAndroid Build Coastguard Worker const cl_device_id *devices,
569*8975f5c5SAndroid Build Coastguard Worker const cl_uint *num_devices)
570*8975f5c5SAndroid Build Coastguard Worker {
571*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PLATFORM if platform is not a valid platform.
572*8975f5c5SAndroid Build Coastguard Worker if (!Platform::IsValidOrDefault(platform))
573*8975f5c5SAndroid Build Coastguard Worker {
574*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PLATFORM;
575*8975f5c5SAndroid Build Coastguard Worker }
576*8975f5c5SAndroid Build Coastguard Worker
577*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE_TYPE if device_type is not a valid value.
578*8975f5c5SAndroid Build Coastguard Worker if (!Device::IsValidType(device_type))
579*8975f5c5SAndroid Build Coastguard Worker {
580*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE_TYPE;
581*8975f5c5SAndroid Build Coastguard Worker }
582*8975f5c5SAndroid Build Coastguard Worker
583*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if num_entries is equal to zero and devices is not NULL
584*8975f5c5SAndroid Build Coastguard Worker // or if both num_devices and devices are NULL.
585*8975f5c5SAndroid Build Coastguard Worker if ((num_entries == 0u && devices != nullptr) || (num_devices == nullptr && devices == nullptr))
586*8975f5c5SAndroid Build Coastguard Worker {
587*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
588*8975f5c5SAndroid Build Coastguard Worker }
589*8975f5c5SAndroid Build Coastguard Worker
590*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
591*8975f5c5SAndroid Build Coastguard Worker }
592*8975f5c5SAndroid Build Coastguard Worker
ValidateGetDeviceInfo(cl_device_id device,DeviceInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)593*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetDeviceInfo(cl_device_id device,
594*8975f5c5SAndroid Build Coastguard Worker DeviceInfo param_name,
595*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
596*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
597*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
598*8975f5c5SAndroid Build Coastguard Worker {
599*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if device is not a valid device.
600*8975f5c5SAndroid Build Coastguard Worker if (!Device::IsValid(device))
601*8975f5c5SAndroid Build Coastguard Worker {
602*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
603*8975f5c5SAndroid Build Coastguard Worker }
604*8975f5c5SAndroid Build Coastguard Worker const Device &dev = device->cast<Device>();
605*8975f5c5SAndroid Build Coastguard Worker
606*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not one of the supported values
607*8975f5c5SAndroid Build Coastguard Worker // or if param_name is a value that is available as an extension
608*8975f5c5SAndroid Build Coastguard Worker // and the corresponding extension is not supported by the device.
609*8975f5c5SAndroid Build Coastguard Worker const cl_version version = dev.getVersion();
610*8975f5c5SAndroid Build Coastguard Worker const rx::CLDeviceImpl::Info &info = dev.getInfo();
611*8975f5c5SAndroid Build Coastguard Worker // Enums ordered within their version block as they appear in the OpenCL spec V3.0.7, table 5
612*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
613*8975f5c5SAndroid Build Coastguard Worker {
614*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PreferredVectorWidthHalf:
615*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::NativeVectorWidthChar:
616*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::NativeVectorWidthShort:
617*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::NativeVectorWidthInt:
618*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::NativeVectorWidthLong:
619*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::NativeVectorWidthFloat:
620*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::NativeVectorWidthDouble:
621*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::NativeVectorWidthHalf:
622*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::HostUnifiedMemory:
623*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::OpenCL_C_Version:
624*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 1, 1);
625*8975f5c5SAndroid Build Coastguard Worker break;
626*8975f5c5SAndroid Build Coastguard Worker
627*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::ImageMaxBufferSize:
628*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::ImageMaxArraySize:
629*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::LinkerAvailable:
630*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::BuiltInKernels:
631*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PrintfBufferSize:
632*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PreferredInteropUserSync:
633*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::ParentDevice:
634*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PartitionMaxSubDevices:
635*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PartitionProperties:
636*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PartitionAffinityDomain:
637*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PartitionType:
638*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::ReferenceCount:
639*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 1, 2);
640*8975f5c5SAndroid Build Coastguard Worker break;
641*8975f5c5SAndroid Build Coastguard Worker
642*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::MaxReadWriteImageArgs:
643*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::ImagePitchAlignment:
644*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::ImageBaseAddressAlignment:
645*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::MaxPipeArgs:
646*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PipeMaxActiveReservations:
647*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PipeMaxPacketSize:
648*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::MaxGlobalVariableSize:
649*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::GlobalVariablePreferredTotalSize:
650*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::QueueOnDeviceProperties:
651*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::QueueOnDevicePreferredSize:
652*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::QueueOnDeviceMaxSize:
653*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::MaxOnDeviceQueues:
654*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::MaxOnDeviceEvents:
655*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::SVM_Capabilities:
656*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PreferredPlatformAtomicAlignment:
657*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PreferredGlobalAtomicAlignment:
658*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PreferredLocalAtomicAlignment:
659*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 2, 0);
660*8975f5c5SAndroid Build Coastguard Worker break;
661*8975f5c5SAndroid Build Coastguard Worker
662*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::IL_Version:
663*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::MaxNumSubGroups:
664*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::SubGroupIndependentForwardProgress:
665*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 2, 1);
666*8975f5c5SAndroid Build Coastguard Worker break;
667*8975f5c5SAndroid Build Coastguard Worker
668*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::ILsWithVersion:
669*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::BuiltInKernelsWithVersion:
670*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::NumericVersion:
671*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::OpenCL_C_AllVersions:
672*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::OpenCL_C_Features:
673*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::ExtensionsWithVersion:
674*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::AtomicMemoryCapabilities:
675*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::AtomicFenceCapabilities:
676*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::NonUniformWorkGroupSupport:
677*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::WorkGroupCollectiveFunctionsSupport:
678*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::GenericAddressSpaceSupport:
679*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::DeviceEnqueueCapabilities:
680*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PipeSupport:
681*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::PreferredWorkGroupSizeMultiple:
682*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::LatestConformanceVersionPassed:
683*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 3, 0);
684*8975f5c5SAndroid Build Coastguard Worker break;
685*8975f5c5SAndroid Build Coastguard Worker
686*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::DoubleFpConfig:
687*8975f5c5SAndroid Build Coastguard Worker // This extension became a core query from OpenCL 1.2 onward.
688*8975f5c5SAndroid Build Coastguard Worker // Only need to validate for OpenCL versions less than 1.2 here.
689*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION_OR_EXTENSION(version, 1, 2, info.khrFP64);
690*8975f5c5SAndroid Build Coastguard Worker break;
691*8975f5c5SAndroid Build Coastguard Worker
692*8975f5c5SAndroid Build Coastguard Worker case DeviceInfo::InvalidEnum:
693*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
694*8975f5c5SAndroid Build Coastguard Worker default:
695*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
696*8975f5c5SAndroid Build Coastguard Worker break;
697*8975f5c5SAndroid Build Coastguard Worker }
698*8975f5c5SAndroid Build Coastguard Worker
699*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
700*8975f5c5SAndroid Build Coastguard Worker }
701*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateContext(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),const void * user_data)702*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateContext(const cl_context_properties *properties,
703*8975f5c5SAndroid Build Coastguard Worker cl_uint num_devices,
704*8975f5c5SAndroid Build Coastguard Worker const cl_device_id *devices,
705*8975f5c5SAndroid Build Coastguard Worker void(CL_CALLBACK *pfn_notify)(const char *errinfo,
706*8975f5c5SAndroid Build Coastguard Worker const void *private_info,
707*8975f5c5SAndroid Build Coastguard Worker size_t cb,
708*8975f5c5SAndroid Build Coastguard Worker void *user_data),
709*8975f5c5SAndroid Build Coastguard Worker const void *user_data)
710*8975f5c5SAndroid Build Coastguard Worker {
711*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if devices is NULL or if num_devices is equal to zero
712*8975f5c5SAndroid Build Coastguard Worker // or if pfn_notify is NULL but user_data is not NULL.
713*8975f5c5SAndroid Build Coastguard Worker if (devices == nullptr || num_devices == 0u || (pfn_notify == nullptr && user_data != nullptr))
714*8975f5c5SAndroid Build Coastguard Worker {
715*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
716*8975f5c5SAndroid Build Coastguard Worker }
717*8975f5c5SAndroid Build Coastguard Worker
718*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if any device in devices is not a valid device.
719*8975f5c5SAndroid Build Coastguard Worker for (cl_uint i = 0; i < num_devices; ++i)
720*8975f5c5SAndroid Build Coastguard Worker {
721*8975f5c5SAndroid Build Coastguard Worker if (!Device::IsValid(devices[i]))
722*8975f5c5SAndroid Build Coastguard Worker {
723*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
724*8975f5c5SAndroid Build Coastguard Worker }
725*8975f5c5SAndroid Build Coastguard Worker }
726*8975f5c5SAndroid Build Coastguard Worker
727*8975f5c5SAndroid Build Coastguard Worker // Because ANGLE can have one or more platforms here (e.g. passthrough, Vulkan, etc.), if a
728*8975f5c5SAndroid Build Coastguard Worker // context platform is not explicitly specified in the properties, spec says to default to an
729*8975f5c5SAndroid Build Coastguard Worker // implementation-defined platform. In ANGLE's case, we can derive the platform from the device
730*8975f5c5SAndroid Build Coastguard Worker // object.
731*8975f5c5SAndroid Build Coastguard Worker const Platform *platform = nullptr;
732*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateContextProperties(properties, platform));
733*8975f5c5SAndroid Build Coastguard Worker if (platform == nullptr)
734*8975f5c5SAndroid Build Coastguard Worker {
735*8975f5c5SAndroid Build Coastguard Worker // Just use/pick the first device's platform object here
736*8975f5c5SAndroid Build Coastguard Worker platform = &(devices[0])->cast<Device>().getPlatform();
737*8975f5c5SAndroid Build Coastguard Worker }
738*8975f5c5SAndroid Build Coastguard Worker
739*8975f5c5SAndroid Build Coastguard Worker // Ensure that each device in device list is derived from the same platform object
740*8975f5c5SAndroid Build Coastguard Worker for (cl_uint i = 0; i < num_devices; ++i)
741*8975f5c5SAndroid Build Coastguard Worker {
742*8975f5c5SAndroid Build Coastguard Worker if (platform != &(devices[i])->cast<Device>().getPlatform())
743*8975f5c5SAndroid Build Coastguard Worker {
744*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PLATFORM;
745*8975f5c5SAndroid Build Coastguard Worker }
746*8975f5c5SAndroid Build Coastguard Worker }
747*8975f5c5SAndroid Build Coastguard Worker
748*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
749*8975f5c5SAndroid Build Coastguard Worker }
750*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateContextFromType(const cl_context_properties * properties,DeviceType device_type,void (CL_CALLBACK * pfn_notify)(const char * errinfo,const void * private_info,size_t cb,void * user_data),const void * user_data)751*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateContextFromType(const cl_context_properties *properties,
752*8975f5c5SAndroid Build Coastguard Worker DeviceType device_type,
753*8975f5c5SAndroid Build Coastguard Worker void(CL_CALLBACK *pfn_notify)(const char *errinfo,
754*8975f5c5SAndroid Build Coastguard Worker const void *private_info,
755*8975f5c5SAndroid Build Coastguard Worker size_t cb,
756*8975f5c5SAndroid Build Coastguard Worker void *user_data),
757*8975f5c5SAndroid Build Coastguard Worker const void *user_data)
758*8975f5c5SAndroid Build Coastguard Worker {
759*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE_TYPE if device_type is not a valid value.
760*8975f5c5SAndroid Build Coastguard Worker if (!Device::IsValidType(device_type))
761*8975f5c5SAndroid Build Coastguard Worker {
762*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE_TYPE;
763*8975f5c5SAndroid Build Coastguard Worker }
764*8975f5c5SAndroid Build Coastguard Worker
765*8975f5c5SAndroid Build Coastguard Worker const Platform *platform = nullptr;
766*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateContextProperties(properties, platform));
767*8975f5c5SAndroid Build Coastguard Worker if (platform == nullptr)
768*8975f5c5SAndroid Build Coastguard Worker {
769*8975f5c5SAndroid Build Coastguard Worker platform = Platform::GetDefault();
770*8975f5c5SAndroid Build Coastguard Worker if (platform == nullptr)
771*8975f5c5SAndroid Build Coastguard Worker {
772*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PLATFORM;
773*8975f5c5SAndroid Build Coastguard Worker }
774*8975f5c5SAndroid Build Coastguard Worker }
775*8975f5c5SAndroid Build Coastguard Worker
776*8975f5c5SAndroid Build Coastguard Worker if (!platform->hasDeviceType(device_type))
777*8975f5c5SAndroid Build Coastguard Worker {
778*8975f5c5SAndroid Build Coastguard Worker return CL_DEVICE_NOT_FOUND;
779*8975f5c5SAndroid Build Coastguard Worker }
780*8975f5c5SAndroid Build Coastguard Worker
781*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if pfn_notify is NULL but user_data is not NULL.
782*8975f5c5SAndroid Build Coastguard Worker if (pfn_notify == nullptr && user_data != nullptr)
783*8975f5c5SAndroid Build Coastguard Worker {
784*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
785*8975f5c5SAndroid Build Coastguard Worker }
786*8975f5c5SAndroid Build Coastguard Worker
787*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
788*8975f5c5SAndroid Build Coastguard Worker }
789*8975f5c5SAndroid Build Coastguard Worker
ValidateRetainContext(cl_context context)790*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateRetainContext(cl_context context)
791*8975f5c5SAndroid Build Coastguard Worker {
792*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid OpenCL context.
793*8975f5c5SAndroid Build Coastguard Worker return Context::IsValid(context) ? CL_SUCCESS : CL_INVALID_CONTEXT;
794*8975f5c5SAndroid Build Coastguard Worker }
795*8975f5c5SAndroid Build Coastguard Worker
ValidateReleaseContext(cl_context context)796*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateReleaseContext(cl_context context)
797*8975f5c5SAndroid Build Coastguard Worker {
798*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid OpenCL context.
799*8975f5c5SAndroid Build Coastguard Worker return Context::IsValid(context) ? CL_SUCCESS : CL_INVALID_CONTEXT;
800*8975f5c5SAndroid Build Coastguard Worker }
801*8975f5c5SAndroid Build Coastguard Worker
ValidateGetContextInfo(cl_context context,ContextInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)802*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetContextInfo(cl_context context,
803*8975f5c5SAndroid Build Coastguard Worker ContextInfo param_name,
804*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
805*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
806*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
807*8975f5c5SAndroid Build Coastguard Worker {
808*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
809*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValid(context))
810*8975f5c5SAndroid Build Coastguard Worker {
811*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
812*8975f5c5SAndroid Build Coastguard Worker }
813*8975f5c5SAndroid Build Coastguard Worker
814*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not one of the supported values.
815*8975f5c5SAndroid Build Coastguard Worker if (param_name == ContextInfo::InvalidEnum)
816*8975f5c5SAndroid Build Coastguard Worker {
817*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
818*8975f5c5SAndroid Build Coastguard Worker }
819*8975f5c5SAndroid Build Coastguard Worker
820*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
821*8975f5c5SAndroid Build Coastguard Worker }
822*8975f5c5SAndroid Build Coastguard Worker
ValidateRetainCommandQueue(cl_command_queue command_queue)823*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateRetainCommandQueue(cl_command_queue command_queue)
824*8975f5c5SAndroid Build Coastguard Worker {
825*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_COMMAND_QUEUE if command_queue is not a valid command-queue.
826*8975f5c5SAndroid Build Coastguard Worker return CommandQueue::IsValid(command_queue) ? CL_SUCCESS : CL_INVALID_COMMAND_QUEUE;
827*8975f5c5SAndroid Build Coastguard Worker }
828*8975f5c5SAndroid Build Coastguard Worker
ValidateReleaseCommandQueue(cl_command_queue command_queue)829*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateReleaseCommandQueue(cl_command_queue command_queue)
830*8975f5c5SAndroid Build Coastguard Worker {
831*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_COMMAND_QUEUE if command_queue is not a valid command-queue.
832*8975f5c5SAndroid Build Coastguard Worker return CommandQueue::IsValid(command_queue) ? CL_SUCCESS : CL_INVALID_COMMAND_QUEUE;
833*8975f5c5SAndroid Build Coastguard Worker }
834*8975f5c5SAndroid Build Coastguard Worker
ValidateGetCommandQueueInfo(cl_command_queue command_queue,CommandQueueInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)835*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetCommandQueueInfo(cl_command_queue command_queue,
836*8975f5c5SAndroid Build Coastguard Worker CommandQueueInfo param_name,
837*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
838*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
839*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
840*8975f5c5SAndroid Build Coastguard Worker {
841*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_COMMAND_QUEUE if command_queue is not a valid command-queue ...
842*8975f5c5SAndroid Build Coastguard Worker if (!CommandQueue::IsValid(command_queue))
843*8975f5c5SAndroid Build Coastguard Worker {
844*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
845*8975f5c5SAndroid Build Coastguard Worker }
846*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
847*8975f5c5SAndroid Build Coastguard Worker // or if command_queue is not a valid command-queue for param_name.
848*8975f5c5SAndroid Build Coastguard Worker if (param_name == CommandQueueInfo::Size && queue.isOnDevice() &&
849*8975f5c5SAndroid Build Coastguard Worker !queue.getDevice().hasDeviceEnqueueCaps())
850*8975f5c5SAndroid Build Coastguard Worker {
851*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
852*8975f5c5SAndroid Build Coastguard Worker }
853*8975f5c5SAndroid Build Coastguard Worker
854*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not one of the supported values.
855*8975f5c5SAndroid Build Coastguard Worker const cl_version version = queue.getDevice().getVersion();
856*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
857*8975f5c5SAndroid Build Coastguard Worker {
858*8975f5c5SAndroid Build Coastguard Worker case CommandQueueInfo::Size:
859*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 2, 0);
860*8975f5c5SAndroid Build Coastguard Worker break;
861*8975f5c5SAndroid Build Coastguard Worker case CommandQueueInfo::DeviceDefault:
862*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 2, 1);
863*8975f5c5SAndroid Build Coastguard Worker break;
864*8975f5c5SAndroid Build Coastguard Worker case CommandQueueInfo::PropertiesArray:
865*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 3, 0);
866*8975f5c5SAndroid Build Coastguard Worker break;
867*8975f5c5SAndroid Build Coastguard Worker case CommandQueueInfo::InvalidEnum:
868*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
869*8975f5c5SAndroid Build Coastguard Worker default:
870*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
871*8975f5c5SAndroid Build Coastguard Worker break;
872*8975f5c5SAndroid Build Coastguard Worker }
873*8975f5c5SAndroid Build Coastguard Worker
874*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
875*8975f5c5SAndroid Build Coastguard Worker }
876*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateBuffer(cl_context context,MemFlags flags,size_t size,const void * host_ptr)877*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateBuffer(cl_context context, MemFlags flags, size_t size, const void *host_ptr)
878*8975f5c5SAndroid Build Coastguard Worker {
879*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
880*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValid(context))
881*8975f5c5SAndroid Build Coastguard Worker {
882*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
883*8975f5c5SAndroid Build Coastguard Worker }
884*8975f5c5SAndroid Build Coastguard Worker const Context &ctx = context->cast<Context>();
885*8975f5c5SAndroid Build Coastguard Worker
886*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if values specified in flags are not valid
887*8975f5c5SAndroid Build Coastguard Worker // as defined in the Memory Flags table.
888*8975f5c5SAndroid Build Coastguard Worker if (!ValidateMemoryFlags(flags, ctx.getPlatform()))
889*8975f5c5SAndroid Build Coastguard Worker {
890*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
891*8975f5c5SAndroid Build Coastguard Worker }
892*8975f5c5SAndroid Build Coastguard Worker
893*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_BUFFER_SIZE if size is 0 ...
894*8975f5c5SAndroid Build Coastguard Worker if (size == 0u)
895*8975f5c5SAndroid Build Coastguard Worker {
896*8975f5c5SAndroid Build Coastguard Worker CL_INVALID_BUFFER_SIZE;
897*8975f5c5SAndroid Build Coastguard Worker }
898*8975f5c5SAndroid Build Coastguard Worker for (const DevicePtr &device : ctx.getDevices())
899*8975f5c5SAndroid Build Coastguard Worker {
900*8975f5c5SAndroid Build Coastguard Worker // or if size is greater than CL_DEVICE_MAX_MEM_ALLOC_SIZE for all devices in context.
901*8975f5c5SAndroid Build Coastguard Worker if (size > device->getInfo().maxMemAllocSize)
902*8975f5c5SAndroid Build Coastguard Worker {
903*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_BUFFER_SIZE;
904*8975f5c5SAndroid Build Coastguard Worker }
905*8975f5c5SAndroid Build Coastguard Worker }
906*8975f5c5SAndroid Build Coastguard Worker
907*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_HOST_PTR
908*8975f5c5SAndroid Build Coastguard Worker // if host_ptr is NULL and CL_MEM_USE_HOST_PTR or CL_MEM_COPY_HOST_PTR are set in flags or
909*8975f5c5SAndroid Build Coastguard Worker // if host_ptr is not NULL but CL_MEM_COPY_HOST_PTR or CL_MEM_USE_HOST_PTR are not set in flags.
910*8975f5c5SAndroid Build Coastguard Worker if ((host_ptr != nullptr) != flags.intersects(CL_MEM_USE_HOST_PTR | CL_MEM_COPY_HOST_PTR))
911*8975f5c5SAndroid Build Coastguard Worker {
912*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_HOST_PTR;
913*8975f5c5SAndroid Build Coastguard Worker }
914*8975f5c5SAndroid Build Coastguard Worker
915*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
916*8975f5c5SAndroid Build Coastguard Worker }
917*8975f5c5SAndroid Build Coastguard Worker
ValidateRetainMemObject(cl_mem memobj)918*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateRetainMemObject(cl_mem memobj)
919*8975f5c5SAndroid Build Coastguard Worker {
920*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if memobj is not a valid memory object.
921*8975f5c5SAndroid Build Coastguard Worker return Memory::IsValid(memobj) ? CL_SUCCESS : CL_INVALID_MEM_OBJECT;
922*8975f5c5SAndroid Build Coastguard Worker }
923*8975f5c5SAndroid Build Coastguard Worker
ValidateReleaseMemObject(cl_mem memobj)924*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateReleaseMemObject(cl_mem memobj)
925*8975f5c5SAndroid Build Coastguard Worker {
926*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if memobj is not a valid memory object.
927*8975f5c5SAndroid Build Coastguard Worker return Memory::IsValid(memobj) ? CL_SUCCESS : CL_INVALID_MEM_OBJECT;
928*8975f5c5SAndroid Build Coastguard Worker }
929*8975f5c5SAndroid Build Coastguard Worker
ValidateGetSupportedImageFormats(cl_context context,MemFlags flags,MemObjectType image_type,cl_uint num_entries,const cl_image_format * image_formats,const cl_uint * num_image_formats)930*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetSupportedImageFormats(cl_context context,
931*8975f5c5SAndroid Build Coastguard Worker MemFlags flags,
932*8975f5c5SAndroid Build Coastguard Worker MemObjectType image_type,
933*8975f5c5SAndroid Build Coastguard Worker cl_uint num_entries,
934*8975f5c5SAndroid Build Coastguard Worker const cl_image_format *image_formats,
935*8975f5c5SAndroid Build Coastguard Worker const cl_uint *num_image_formats)
936*8975f5c5SAndroid Build Coastguard Worker {
937*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
938*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValid(context))
939*8975f5c5SAndroid Build Coastguard Worker {
940*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
941*8975f5c5SAndroid Build Coastguard Worker }
942*8975f5c5SAndroid Build Coastguard Worker const Context &ctx = context->cast<Context>();
943*8975f5c5SAndroid Build Coastguard Worker
944*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if flags or image_type are not valid,
945*8975f5c5SAndroid Build Coastguard Worker if (!ValidateMemoryFlags(flags, ctx.getPlatform()) || !Image::IsTypeValid(image_type))
946*8975f5c5SAndroid Build Coastguard Worker {
947*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
948*8975f5c5SAndroid Build Coastguard Worker }
949*8975f5c5SAndroid Build Coastguard Worker // or if num_entries is 0 and image_formats is not NULL.
950*8975f5c5SAndroid Build Coastguard Worker if (num_entries == 0u && image_formats != nullptr)
951*8975f5c5SAndroid Build Coastguard Worker {
952*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
953*8975f5c5SAndroid Build Coastguard Worker }
954*8975f5c5SAndroid Build Coastguard Worker
955*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
956*8975f5c5SAndroid Build Coastguard Worker }
957*8975f5c5SAndroid Build Coastguard Worker
ValidateGetMemObjectInfo(cl_mem memobj,MemInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)958*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetMemObjectInfo(cl_mem memobj,
959*8975f5c5SAndroid Build Coastguard Worker MemInfo param_name,
960*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
961*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
962*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
963*8975f5c5SAndroid Build Coastguard Worker {
964*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if memobj is a not a valid memory object.
965*8975f5c5SAndroid Build Coastguard Worker if (!Memory::IsValid(memobj))
966*8975f5c5SAndroid Build Coastguard Worker {
967*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
968*8975f5c5SAndroid Build Coastguard Worker }
969*8975f5c5SAndroid Build Coastguard Worker
970*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not valid.
971*8975f5c5SAndroid Build Coastguard Worker const cl_version version = memobj->cast<Memory>().getContext().getPlatform().getVersion();
972*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
973*8975f5c5SAndroid Build Coastguard Worker {
974*8975f5c5SAndroid Build Coastguard Worker case MemInfo::AssociatedMemObject:
975*8975f5c5SAndroid Build Coastguard Worker case MemInfo::Offset:
976*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 1, 1);
977*8975f5c5SAndroid Build Coastguard Worker break;
978*8975f5c5SAndroid Build Coastguard Worker case MemInfo::UsesSVM_Pointer:
979*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 2, 0);
980*8975f5c5SAndroid Build Coastguard Worker break;
981*8975f5c5SAndroid Build Coastguard Worker case MemInfo::Properties:
982*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 3, 0);
983*8975f5c5SAndroid Build Coastguard Worker break;
984*8975f5c5SAndroid Build Coastguard Worker case MemInfo::InvalidEnum:
985*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
986*8975f5c5SAndroid Build Coastguard Worker default:
987*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
988*8975f5c5SAndroid Build Coastguard Worker break;
989*8975f5c5SAndroid Build Coastguard Worker }
990*8975f5c5SAndroid Build Coastguard Worker
991*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
992*8975f5c5SAndroid Build Coastguard Worker }
993*8975f5c5SAndroid Build Coastguard Worker
ValidateGetImageInfo(cl_mem image,ImageInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)994*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetImageInfo(cl_mem image,
995*8975f5c5SAndroid Build Coastguard Worker ImageInfo param_name,
996*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
997*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
998*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
999*8975f5c5SAndroid Build Coastguard Worker {
1000*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if image is a not a valid image object.
1001*8975f5c5SAndroid Build Coastguard Worker if (!Image::IsValid(image))
1002*8975f5c5SAndroid Build Coastguard Worker {
1003*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
1004*8975f5c5SAndroid Build Coastguard Worker }
1005*8975f5c5SAndroid Build Coastguard Worker
1006*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not valid.
1007*8975f5c5SAndroid Build Coastguard Worker const cl_version version = image->cast<Image>().getContext().getPlatform().getVersion();
1008*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
1009*8975f5c5SAndroid Build Coastguard Worker {
1010*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::ArraySize:
1011*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::Buffer:
1012*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::NumMipLevels:
1013*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::NumSamples:
1014*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 1, 2);
1015*8975f5c5SAndroid Build Coastguard Worker break;
1016*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::InvalidEnum:
1017*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1018*8975f5c5SAndroid Build Coastguard Worker default:
1019*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
1020*8975f5c5SAndroid Build Coastguard Worker break;
1021*8975f5c5SAndroid Build Coastguard Worker }
1022*8975f5c5SAndroid Build Coastguard Worker
1023*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1024*8975f5c5SAndroid Build Coastguard Worker }
1025*8975f5c5SAndroid Build Coastguard Worker
ValidateRetainSampler(cl_sampler sampler)1026*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateRetainSampler(cl_sampler sampler)
1027*8975f5c5SAndroid Build Coastguard Worker {
1028*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_SAMPLER if sampler is not a valid sampler object.
1029*8975f5c5SAndroid Build Coastguard Worker return Sampler::IsValid(sampler) ? CL_SUCCESS : CL_INVALID_SAMPLER;
1030*8975f5c5SAndroid Build Coastguard Worker }
1031*8975f5c5SAndroid Build Coastguard Worker
ValidateReleaseSampler(cl_sampler sampler)1032*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateReleaseSampler(cl_sampler sampler)
1033*8975f5c5SAndroid Build Coastguard Worker {
1034*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_SAMPLER if sampler is not a valid sampler object.
1035*8975f5c5SAndroid Build Coastguard Worker return Sampler::IsValid(sampler) ? CL_SUCCESS : CL_INVALID_SAMPLER;
1036*8975f5c5SAndroid Build Coastguard Worker }
1037*8975f5c5SAndroid Build Coastguard Worker
ValidateGetSamplerInfo(cl_sampler sampler,SamplerInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)1038*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetSamplerInfo(cl_sampler sampler,
1039*8975f5c5SAndroid Build Coastguard Worker SamplerInfo param_name,
1040*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
1041*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
1042*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
1043*8975f5c5SAndroid Build Coastguard Worker {
1044*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_SAMPLER if sampler is a not a valid sampler object.
1045*8975f5c5SAndroid Build Coastguard Worker if (!Sampler::IsValid(sampler))
1046*8975f5c5SAndroid Build Coastguard Worker {
1047*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_SAMPLER;
1048*8975f5c5SAndroid Build Coastguard Worker }
1049*8975f5c5SAndroid Build Coastguard Worker
1050*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not valid.
1051*8975f5c5SAndroid Build Coastguard Worker const cl_version version = sampler->cast<Sampler>().getContext().getPlatform().getVersion();
1052*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
1053*8975f5c5SAndroid Build Coastguard Worker {
1054*8975f5c5SAndroid Build Coastguard Worker case SamplerInfo::Properties:
1055*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 3, 0);
1056*8975f5c5SAndroid Build Coastguard Worker break;
1057*8975f5c5SAndroid Build Coastguard Worker case SamplerInfo::InvalidEnum:
1058*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1059*8975f5c5SAndroid Build Coastguard Worker default:
1060*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
1061*8975f5c5SAndroid Build Coastguard Worker break;
1062*8975f5c5SAndroid Build Coastguard Worker }
1063*8975f5c5SAndroid Build Coastguard Worker
1064*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1065*8975f5c5SAndroid Build Coastguard Worker }
1066*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateProgramWithSource(cl_context context,cl_uint count,const char ** strings,const size_t * lengths)1067*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateProgramWithSource(cl_context context,
1068*8975f5c5SAndroid Build Coastguard Worker cl_uint count,
1069*8975f5c5SAndroid Build Coastguard Worker const char **strings,
1070*8975f5c5SAndroid Build Coastguard Worker const size_t *lengths)
1071*8975f5c5SAndroid Build Coastguard Worker {
1072*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
1073*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValid(context))
1074*8975f5c5SAndroid Build Coastguard Worker {
1075*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
1076*8975f5c5SAndroid Build Coastguard Worker }
1077*8975f5c5SAndroid Build Coastguard Worker
1078*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if count is zero or if strings or any entry in strings is NULL.
1079*8975f5c5SAndroid Build Coastguard Worker if (count == 0u || strings == nullptr)
1080*8975f5c5SAndroid Build Coastguard Worker {
1081*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1082*8975f5c5SAndroid Build Coastguard Worker }
1083*8975f5c5SAndroid Build Coastguard Worker while (count-- != 0u)
1084*8975f5c5SAndroid Build Coastguard Worker {
1085*8975f5c5SAndroid Build Coastguard Worker if (*strings++ == nullptr)
1086*8975f5c5SAndroid Build Coastguard Worker {
1087*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1088*8975f5c5SAndroid Build Coastguard Worker }
1089*8975f5c5SAndroid Build Coastguard Worker }
1090*8975f5c5SAndroid Build Coastguard Worker
1091*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1092*8975f5c5SAndroid Build Coastguard Worker }
1093*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateProgramWithBinary(cl_context context,cl_uint num_devices,const cl_device_id * device_list,const size_t * lengths,const unsigned char ** binaries,const cl_int * binary_status)1094*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateProgramWithBinary(cl_context context,
1095*8975f5c5SAndroid Build Coastguard Worker cl_uint num_devices,
1096*8975f5c5SAndroid Build Coastguard Worker const cl_device_id *device_list,
1097*8975f5c5SAndroid Build Coastguard Worker const size_t *lengths,
1098*8975f5c5SAndroid Build Coastguard Worker const unsigned char **binaries,
1099*8975f5c5SAndroid Build Coastguard Worker const cl_int *binary_status)
1100*8975f5c5SAndroid Build Coastguard Worker {
1101*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
1102*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValid(context))
1103*8975f5c5SAndroid Build Coastguard Worker {
1104*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
1105*8975f5c5SAndroid Build Coastguard Worker }
1106*8975f5c5SAndroid Build Coastguard Worker const Context &ctx = context->cast<Context>();
1107*8975f5c5SAndroid Build Coastguard Worker
1108*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if device_list is NULL or num_devices is zero.
1109*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if lengths or binaries is NULL.
1110*8975f5c5SAndroid Build Coastguard Worker if (device_list == nullptr || num_devices == 0u || lengths == nullptr || binaries == nullptr)
1111*8975f5c5SAndroid Build Coastguard Worker {
1112*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1113*8975f5c5SAndroid Build Coastguard Worker }
1114*8975f5c5SAndroid Build Coastguard Worker while (num_devices-- != 0u)
1115*8975f5c5SAndroid Build Coastguard Worker {
1116*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if any device in device_list
1117*8975f5c5SAndroid Build Coastguard Worker // is not in the list of devices associated with context.
1118*8975f5c5SAndroid Build Coastguard Worker if (!ctx.hasDevice(*device_list++))
1119*8975f5c5SAndroid Build Coastguard Worker {
1120*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
1121*8975f5c5SAndroid Build Coastguard Worker }
1122*8975f5c5SAndroid Build Coastguard Worker
1123*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if any entry in lengths[i] is zero or binaries[i] is NULL.
1124*8975f5c5SAndroid Build Coastguard Worker if (*lengths++ == 0u || *binaries++ == nullptr)
1125*8975f5c5SAndroid Build Coastguard Worker {
1126*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1127*8975f5c5SAndroid Build Coastguard Worker }
1128*8975f5c5SAndroid Build Coastguard Worker }
1129*8975f5c5SAndroid Build Coastguard Worker
1130*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1131*8975f5c5SAndroid Build Coastguard Worker }
1132*8975f5c5SAndroid Build Coastguard Worker
ValidateRetainProgram(cl_program program)1133*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateRetainProgram(cl_program program)
1134*8975f5c5SAndroid Build Coastguard Worker {
1135*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROGRAM if program is not a valid program object.
1136*8975f5c5SAndroid Build Coastguard Worker return Program::IsValid(program) ? CL_SUCCESS : CL_INVALID_PROGRAM;
1137*8975f5c5SAndroid Build Coastguard Worker }
1138*8975f5c5SAndroid Build Coastguard Worker
ValidateReleaseProgram(cl_program program)1139*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateReleaseProgram(cl_program program)
1140*8975f5c5SAndroid Build Coastguard Worker {
1141*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROGRAM if program is not a valid program object.
1142*8975f5c5SAndroid Build Coastguard Worker return Program::IsValid(program) ? CL_SUCCESS : CL_INVALID_PROGRAM;
1143*8975f5c5SAndroid Build Coastguard Worker }
1144*8975f5c5SAndroid Build Coastguard Worker
ValidateBuildProgram(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),const void * user_data)1145*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateBuildProgram(cl_program program,
1146*8975f5c5SAndroid Build Coastguard Worker cl_uint num_devices,
1147*8975f5c5SAndroid Build Coastguard Worker const cl_device_id *device_list,
1148*8975f5c5SAndroid Build Coastguard Worker const char *options,
1149*8975f5c5SAndroid Build Coastguard Worker void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
1150*8975f5c5SAndroid Build Coastguard Worker const void *user_data)
1151*8975f5c5SAndroid Build Coastguard Worker {
1152*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROGRAM if program is not a valid program object.
1153*8975f5c5SAndroid Build Coastguard Worker if (!Program::IsValid(program))
1154*8975f5c5SAndroid Build Coastguard Worker {
1155*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1156*8975f5c5SAndroid Build Coastguard Worker }
1157*8975f5c5SAndroid Build Coastguard Worker const Program &prog = program->cast<Program>();
1158*8975f5c5SAndroid Build Coastguard Worker
1159*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if device_list is NULL and num_devices is greater than zero,
1160*8975f5c5SAndroid Build Coastguard Worker // or if device_list is not NULL and num_devices is zero.
1161*8975f5c5SAndroid Build Coastguard Worker if ((device_list != nullptr) != (num_devices != 0u))
1162*8975f5c5SAndroid Build Coastguard Worker {
1163*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1164*8975f5c5SAndroid Build Coastguard Worker }
1165*8975f5c5SAndroid Build Coastguard Worker
1166*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if any device in device_list
1167*8975f5c5SAndroid Build Coastguard Worker // is not in the list of devices associated with program.
1168*8975f5c5SAndroid Build Coastguard Worker while (num_devices-- != 0u)
1169*8975f5c5SAndroid Build Coastguard Worker {
1170*8975f5c5SAndroid Build Coastguard Worker if (!prog.hasDevice(*device_list++))
1171*8975f5c5SAndroid Build Coastguard Worker {
1172*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
1173*8975f5c5SAndroid Build Coastguard Worker }
1174*8975f5c5SAndroid Build Coastguard Worker }
1175*8975f5c5SAndroid Build Coastguard Worker
1176*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if pfn_notify is NULL but user_data is not NULL.
1177*8975f5c5SAndroid Build Coastguard Worker if (pfn_notify == nullptr && user_data != nullptr)
1178*8975f5c5SAndroid Build Coastguard Worker {
1179*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1180*8975f5c5SAndroid Build Coastguard Worker }
1181*8975f5c5SAndroid Build Coastguard Worker
1182*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if the build of a program executable for any of the devices listed
1183*8975f5c5SAndroid Build Coastguard Worker // in device_list by a previous call to clBuildProgram for program has not completed.
1184*8975f5c5SAndroid Build Coastguard Worker if (prog.isBuilding())
1185*8975f5c5SAndroid Build Coastguard Worker {
1186*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
1187*8975f5c5SAndroid Build Coastguard Worker }
1188*8975f5c5SAndroid Build Coastguard Worker
1189*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if there are kernel objects attached to program.
1190*8975f5c5SAndroid Build Coastguard Worker if (prog.hasAttachedKernels())
1191*8975f5c5SAndroid Build Coastguard Worker {
1192*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
1193*8975f5c5SAndroid Build Coastguard Worker }
1194*8975f5c5SAndroid Build Coastguard Worker
1195*8975f5c5SAndroid Build Coastguard Worker // If program was created with clCreateProgramWithBinary and device does not have a valid
1196*8975f5c5SAndroid Build Coastguard Worker // program binary loaded
1197*8975f5c5SAndroid Build Coastguard Worker std::vector<size_t> binSizes{prog.getDevices().size()};
1198*8975f5c5SAndroid Build Coastguard Worker std::vector<std::vector<unsigned char *>> bins{prog.getDevices().size()};
1199*8975f5c5SAndroid Build Coastguard Worker if (IsError(prog.getInfo(ProgramInfo::BinarySizes, binSizes.size() * sizeof(size_t),
1200*8975f5c5SAndroid Build Coastguard Worker binSizes.data(), nullptr)))
1201*8975f5c5SAndroid Build Coastguard Worker {
1202*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1203*8975f5c5SAndroid Build Coastguard Worker }
1204*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < prog.getDevices().size(); ++i)
1205*8975f5c5SAndroid Build Coastguard Worker {
1206*8975f5c5SAndroid Build Coastguard Worker cl_program_binary_type binType;
1207*8975f5c5SAndroid Build Coastguard Worker bins.at(i).resize(binSizes[i]);
1208*8975f5c5SAndroid Build Coastguard Worker
1209*8975f5c5SAndroid Build Coastguard Worker if (IsError(prog.getInfo(ProgramInfo::Binaries, sizeof(unsigned char *) * bins.size(),
1210*8975f5c5SAndroid Build Coastguard Worker bins.data(), nullptr)))
1211*8975f5c5SAndroid Build Coastguard Worker {
1212*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1213*8975f5c5SAndroid Build Coastguard Worker }
1214*8975f5c5SAndroid Build Coastguard Worker if (IsError(prog.getBuildInfo(prog.getDevices()[i]->getNative(),
1215*8975f5c5SAndroid Build Coastguard Worker ProgramBuildInfo::BinaryType, sizeof(cl_program_binary_type),
1216*8975f5c5SAndroid Build Coastguard Worker &binType, nullptr)))
1217*8975f5c5SAndroid Build Coastguard Worker {
1218*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1219*8975f5c5SAndroid Build Coastguard Worker }
1220*8975f5c5SAndroid Build Coastguard Worker if ((binType != CL_PROGRAM_BINARY_TYPE_NONE) && bins[i].empty())
1221*8975f5c5SAndroid Build Coastguard Worker {
1222*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_BINARY;
1223*8975f5c5SAndroid Build Coastguard Worker }
1224*8975f5c5SAndroid Build Coastguard Worker }
1225*8975f5c5SAndroid Build Coastguard Worker
1226*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1227*8975f5c5SAndroid Build Coastguard Worker }
1228*8975f5c5SAndroid Build Coastguard Worker
ValidateGetProgramInfo(cl_program program,ProgramInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)1229*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetProgramInfo(cl_program program,
1230*8975f5c5SAndroid Build Coastguard Worker ProgramInfo param_name,
1231*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
1232*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
1233*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
1234*8975f5c5SAndroid Build Coastguard Worker {
1235*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROGRAM if program is not a valid program object.
1236*8975f5c5SAndroid Build Coastguard Worker if (!Program::IsValid(program))
1237*8975f5c5SAndroid Build Coastguard Worker {
1238*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1239*8975f5c5SAndroid Build Coastguard Worker }
1240*8975f5c5SAndroid Build Coastguard Worker const Program &prog = program->cast<Program>();
1241*8975f5c5SAndroid Build Coastguard Worker
1242*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not valid.
1243*8975f5c5SAndroid Build Coastguard Worker const cl_version version = prog.getContext().getPlatform().getVersion();
1244*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
1245*8975f5c5SAndroid Build Coastguard Worker {
1246*8975f5c5SAndroid Build Coastguard Worker case ProgramInfo::NumKernels:
1247*8975f5c5SAndroid Build Coastguard Worker case ProgramInfo::KernelNames:
1248*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 1, 2);
1249*8975f5c5SAndroid Build Coastguard Worker break;
1250*8975f5c5SAndroid Build Coastguard Worker case ProgramInfo::IL:
1251*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 2, 1);
1252*8975f5c5SAndroid Build Coastguard Worker break;
1253*8975f5c5SAndroid Build Coastguard Worker case ProgramInfo::ScopeGlobalCtorsPresent:
1254*8975f5c5SAndroid Build Coastguard Worker case ProgramInfo::ScopeGlobalDtorsPresent:
1255*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 2, 2);
1256*8975f5c5SAndroid Build Coastguard Worker break;
1257*8975f5c5SAndroid Build Coastguard Worker case ProgramInfo::InvalidEnum:
1258*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1259*8975f5c5SAndroid Build Coastguard Worker default:
1260*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
1261*8975f5c5SAndroid Build Coastguard Worker break;
1262*8975f5c5SAndroid Build Coastguard Worker }
1263*8975f5c5SAndroid Build Coastguard Worker
1264*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return type
1265*8975f5c5SAndroid Build Coastguard Worker // as described in the Program Object Queries table and param_value is not NULL.
1266*8975f5c5SAndroid Build Coastguard Worker if (param_value != nullptr)
1267*8975f5c5SAndroid Build Coastguard Worker {
1268*8975f5c5SAndroid Build Coastguard Worker size_t valueSizeRet = 0;
1269*8975f5c5SAndroid Build Coastguard Worker if (IsError(prog.getInfo(param_name, 0, nullptr, &valueSizeRet)) ||
1270*8975f5c5SAndroid Build Coastguard Worker param_value_size < valueSizeRet)
1271*8975f5c5SAndroid Build Coastguard Worker {
1272*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1273*8975f5c5SAndroid Build Coastguard Worker }
1274*8975f5c5SAndroid Build Coastguard Worker }
1275*8975f5c5SAndroid Build Coastguard Worker
1276*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1277*8975f5c5SAndroid Build Coastguard Worker }
1278*8975f5c5SAndroid Build Coastguard Worker
ValidateGetProgramBuildInfo(cl_program program,cl_device_id device,ProgramBuildInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)1279*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetProgramBuildInfo(cl_program program,
1280*8975f5c5SAndroid Build Coastguard Worker cl_device_id device,
1281*8975f5c5SAndroid Build Coastguard Worker ProgramBuildInfo param_name,
1282*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
1283*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
1284*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
1285*8975f5c5SAndroid Build Coastguard Worker {
1286*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROGRAM if program is not a valid program object.
1287*8975f5c5SAndroid Build Coastguard Worker if (!Program::IsValid(program))
1288*8975f5c5SAndroid Build Coastguard Worker {
1289*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1290*8975f5c5SAndroid Build Coastguard Worker }
1291*8975f5c5SAndroid Build Coastguard Worker const Program &prog = program->cast<Program>();
1292*8975f5c5SAndroid Build Coastguard Worker
1293*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if device is not in the list of devices associated with program.
1294*8975f5c5SAndroid Build Coastguard Worker if (!prog.hasDevice(device))
1295*8975f5c5SAndroid Build Coastguard Worker {
1296*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
1297*8975f5c5SAndroid Build Coastguard Worker }
1298*8975f5c5SAndroid Build Coastguard Worker
1299*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not valid.
1300*8975f5c5SAndroid Build Coastguard Worker const cl_version version = prog.getContext().getPlatform().getVersion();
1301*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
1302*8975f5c5SAndroid Build Coastguard Worker {
1303*8975f5c5SAndroid Build Coastguard Worker case ProgramBuildInfo::BinaryType:
1304*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 1, 2);
1305*8975f5c5SAndroid Build Coastguard Worker break;
1306*8975f5c5SAndroid Build Coastguard Worker case ProgramBuildInfo::GlobalVariableTotalSize:
1307*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 2, 0);
1308*8975f5c5SAndroid Build Coastguard Worker break;
1309*8975f5c5SAndroid Build Coastguard Worker case ProgramBuildInfo::InvalidEnum:
1310*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1311*8975f5c5SAndroid Build Coastguard Worker default:
1312*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
1313*8975f5c5SAndroid Build Coastguard Worker break;
1314*8975f5c5SAndroid Build Coastguard Worker }
1315*8975f5c5SAndroid Build Coastguard Worker
1316*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return type
1317*8975f5c5SAndroid Build Coastguard Worker // as described in the Program Object Queries table and param_value is not NULL.
1318*8975f5c5SAndroid Build Coastguard Worker if (param_value != nullptr)
1319*8975f5c5SAndroid Build Coastguard Worker {
1320*8975f5c5SAndroid Build Coastguard Worker size_t valueSizeRet = 0;
1321*8975f5c5SAndroid Build Coastguard Worker if (IsError(prog.getBuildInfo(device, param_name, 0, nullptr, &valueSizeRet)) ||
1322*8975f5c5SAndroid Build Coastguard Worker param_value_size < valueSizeRet)
1323*8975f5c5SAndroid Build Coastguard Worker {
1324*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1325*8975f5c5SAndroid Build Coastguard Worker }
1326*8975f5c5SAndroid Build Coastguard Worker }
1327*8975f5c5SAndroid Build Coastguard Worker
1328*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1329*8975f5c5SAndroid Build Coastguard Worker }
1330*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateKernel(cl_program program,const char * kernel_name)1331*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateKernel(cl_program program, const char *kernel_name)
1332*8975f5c5SAndroid Build Coastguard Worker {
1333*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROGRAM if program is not a valid program object.
1334*8975f5c5SAndroid Build Coastguard Worker if (!Program::IsValid(program))
1335*8975f5c5SAndroid Build Coastguard Worker {
1336*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1337*8975f5c5SAndroid Build Coastguard Worker }
1338*8975f5c5SAndroid Build Coastguard Worker cl::Program &prog = program->cast<cl::Program>();
1339*8975f5c5SAndroid Build Coastguard Worker
1340*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if kernel_name is NULL.
1341*8975f5c5SAndroid Build Coastguard Worker if (kernel_name == nullptr)
1342*8975f5c5SAndroid Build Coastguard Worker {
1343*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1344*8975f5c5SAndroid Build Coastguard Worker }
1345*8975f5c5SAndroid Build Coastguard Worker
1346*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROGRAM_EXECUTABLE if there is no successfully built executable for program.
1347*8975f5c5SAndroid Build Coastguard Worker std::vector<cl_device_id> associatedDevices;
1348*8975f5c5SAndroid Build Coastguard Worker size_t associatedDeviceCount = 0;
1349*8975f5c5SAndroid Build Coastguard Worker bool isAnyDeviceProgramBuilt = false;
1350*8975f5c5SAndroid Build Coastguard Worker if (IsError(prog.getInfo(ProgramInfo::Devices, 0, nullptr, &associatedDeviceCount)))
1351*8975f5c5SAndroid Build Coastguard Worker {
1352*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1353*8975f5c5SAndroid Build Coastguard Worker }
1354*8975f5c5SAndroid Build Coastguard Worker associatedDevices.resize(associatedDeviceCount / sizeof(cl_device_id));
1355*8975f5c5SAndroid Build Coastguard Worker if (IsError(prog.getInfo(ProgramInfo::Devices, associatedDeviceCount, associatedDevices.data(),
1356*8975f5c5SAndroid Build Coastguard Worker nullptr)))
1357*8975f5c5SAndroid Build Coastguard Worker {
1358*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1359*8975f5c5SAndroid Build Coastguard Worker }
1360*8975f5c5SAndroid Build Coastguard Worker for (const cl_device_id &device : associatedDevices)
1361*8975f5c5SAndroid Build Coastguard Worker {
1362*8975f5c5SAndroid Build Coastguard Worker cl_build_status status = CL_BUILD_NONE;
1363*8975f5c5SAndroid Build Coastguard Worker if (IsError(prog.getBuildInfo(device, ProgramBuildInfo::Status, sizeof(cl_build_status),
1364*8975f5c5SAndroid Build Coastguard Worker &status, nullptr)))
1365*8975f5c5SAndroid Build Coastguard Worker {
1366*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1367*8975f5c5SAndroid Build Coastguard Worker }
1368*8975f5c5SAndroid Build Coastguard Worker
1369*8975f5c5SAndroid Build Coastguard Worker if (status == CL_BUILD_SUCCESS)
1370*8975f5c5SAndroid Build Coastguard Worker {
1371*8975f5c5SAndroid Build Coastguard Worker isAnyDeviceProgramBuilt = true;
1372*8975f5c5SAndroid Build Coastguard Worker break;
1373*8975f5c5SAndroid Build Coastguard Worker }
1374*8975f5c5SAndroid Build Coastguard Worker }
1375*8975f5c5SAndroid Build Coastguard Worker if (!isAnyDeviceProgramBuilt)
1376*8975f5c5SAndroid Build Coastguard Worker {
1377*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM_EXECUTABLE;
1378*8975f5c5SAndroid Build Coastguard Worker }
1379*8975f5c5SAndroid Build Coastguard Worker
1380*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_KERNEL_NAME if kernel_name is not found in program.
1381*8975f5c5SAndroid Build Coastguard Worker std::string kernelNames;
1382*8975f5c5SAndroid Build Coastguard Worker size_t kernelNamesSize = 0;
1383*8975f5c5SAndroid Build Coastguard Worker if (IsError(prog.getInfo(ProgramInfo::KernelNames, 0, nullptr, &kernelNamesSize)))
1384*8975f5c5SAndroid Build Coastguard Worker {
1385*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1386*8975f5c5SAndroid Build Coastguard Worker }
1387*8975f5c5SAndroid Build Coastguard Worker kernelNames.resize(kernelNamesSize);
1388*8975f5c5SAndroid Build Coastguard Worker if (IsError(
1389*8975f5c5SAndroid Build Coastguard Worker prog.getInfo(ProgramInfo::KernelNames, kernelNamesSize, kernelNames.data(), nullptr)))
1390*8975f5c5SAndroid Build Coastguard Worker {
1391*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1392*8975f5c5SAndroid Build Coastguard Worker }
1393*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> tokenizedKernelNames =
1394*8975f5c5SAndroid Build Coastguard Worker angle::SplitString(kernelNames.c_str(), ";", angle::WhitespaceHandling::TRIM_WHITESPACE,
1395*8975f5c5SAndroid Build Coastguard Worker angle::SplitResult::SPLIT_WANT_NONEMPTY);
1396*8975f5c5SAndroid Build Coastguard Worker if (std::find(tokenizedKernelNames.begin(), tokenizedKernelNames.end(), kernel_name) ==
1397*8975f5c5SAndroid Build Coastguard Worker tokenizedKernelNames.end())
1398*8975f5c5SAndroid Build Coastguard Worker {
1399*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_KERNEL_NAME;
1400*8975f5c5SAndroid Build Coastguard Worker }
1401*8975f5c5SAndroid Build Coastguard Worker
1402*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1403*8975f5c5SAndroid Build Coastguard Worker }
1404*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateKernelsInProgram(cl_program program,cl_uint num_kernels,const cl_kernel * kernels,const cl_uint * num_kernels_ret)1405*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateKernelsInProgram(cl_program program,
1406*8975f5c5SAndroid Build Coastguard Worker cl_uint num_kernels,
1407*8975f5c5SAndroid Build Coastguard Worker const cl_kernel *kernels,
1408*8975f5c5SAndroid Build Coastguard Worker const cl_uint *num_kernels_ret)
1409*8975f5c5SAndroid Build Coastguard Worker {
1410*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROGRAM if program is not a valid program object.
1411*8975f5c5SAndroid Build Coastguard Worker if (!Program::IsValid(program))
1412*8975f5c5SAndroid Build Coastguard Worker {
1413*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1414*8975f5c5SAndroid Build Coastguard Worker }
1415*8975f5c5SAndroid Build Coastguard Worker
1416*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if kernels is not NULL and num_kernels is less than the number of kernels in
1417*8975f5c5SAndroid Build Coastguard Worker // program.
1418*8975f5c5SAndroid Build Coastguard Worker size_t kernelCount = 0;
1419*8975f5c5SAndroid Build Coastguard Worker cl::Program &prog = program->cast<cl::Program>();
1420*8975f5c5SAndroid Build Coastguard Worker if (IsError(prog.getInfo(ProgramInfo::NumKernels, sizeof(size_t), &prog, nullptr)))
1421*8975f5c5SAndroid Build Coastguard Worker {
1422*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
1423*8975f5c5SAndroid Build Coastguard Worker }
1424*8975f5c5SAndroid Build Coastguard Worker if (kernels != nullptr && num_kernels < kernelCount)
1425*8975f5c5SAndroid Build Coastguard Worker {
1426*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1427*8975f5c5SAndroid Build Coastguard Worker }
1428*8975f5c5SAndroid Build Coastguard Worker
1429*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1430*8975f5c5SAndroid Build Coastguard Worker }
1431*8975f5c5SAndroid Build Coastguard Worker
ValidateRetainKernel(cl_kernel kernel)1432*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateRetainKernel(cl_kernel kernel)
1433*8975f5c5SAndroid Build Coastguard Worker {
1434*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_KERNEL if kernel is not a valid kernel object.
1435*8975f5c5SAndroid Build Coastguard Worker return Kernel::IsValid(kernel) ? CL_SUCCESS : CL_INVALID_KERNEL;
1436*8975f5c5SAndroid Build Coastguard Worker }
1437*8975f5c5SAndroid Build Coastguard Worker
ValidateReleaseKernel(cl_kernel kernel)1438*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateReleaseKernel(cl_kernel kernel)
1439*8975f5c5SAndroid Build Coastguard Worker {
1440*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_KERNEL if kernel is not a valid kernel object.
1441*8975f5c5SAndroid Build Coastguard Worker return Kernel::IsValid(kernel) ? CL_SUCCESS : CL_INVALID_KERNEL;
1442*8975f5c5SAndroid Build Coastguard Worker }
1443*8975f5c5SAndroid Build Coastguard Worker
ValidateSetKernelArg(cl_kernel kernel,cl_uint arg_index,size_t arg_size,const void * arg_value)1444*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSetKernelArg(cl_kernel kernel,
1445*8975f5c5SAndroid Build Coastguard Worker cl_uint arg_index,
1446*8975f5c5SAndroid Build Coastguard Worker size_t arg_size,
1447*8975f5c5SAndroid Build Coastguard Worker const void *arg_value)
1448*8975f5c5SAndroid Build Coastguard Worker {
1449*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_KERNEL if kernel is not a valid kernel object.
1450*8975f5c5SAndroid Build Coastguard Worker if (!Kernel::IsValid(kernel))
1451*8975f5c5SAndroid Build Coastguard Worker {
1452*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_KERNEL;
1453*8975f5c5SAndroid Build Coastguard Worker }
1454*8975f5c5SAndroid Build Coastguard Worker const Kernel &krnl = kernel->cast<Kernel>();
1455*8975f5c5SAndroid Build Coastguard Worker
1456*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_ARG_INDEX if arg_index is not a valid argument index.
1457*8975f5c5SAndroid Build Coastguard Worker if (arg_index >= krnl.getInfo().args.size())
1458*8975f5c5SAndroid Build Coastguard Worker {
1459*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_ARG_INDEX;
1460*8975f5c5SAndroid Build Coastguard Worker }
1461*8975f5c5SAndroid Build Coastguard Worker
1462*8975f5c5SAndroid Build Coastguard Worker if (arg_size == sizeof(cl_mem) && arg_value != nullptr)
1463*8975f5c5SAndroid Build Coastguard Worker {
1464*8975f5c5SAndroid Build Coastguard Worker const std::string &typeName = krnl.getInfo().args[arg_index].typeName;
1465*8975f5c5SAndroid Build Coastguard Worker
1466*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT for an argument declared to be a memory object
1467*8975f5c5SAndroid Build Coastguard Worker // when the specified arg_value is not a valid memory object.
1468*8975f5c5SAndroid Build Coastguard Worker if (typeName == "image1d_t")
1469*8975f5c5SAndroid Build Coastguard Worker {
1470*8975f5c5SAndroid Build Coastguard Worker const cl_mem image = *static_cast<const cl_mem *>(arg_value);
1471*8975f5c5SAndroid Build Coastguard Worker if (!Image::IsValid(image) || image->cast<Image>().getType() != MemObjectType::Image1D)
1472*8975f5c5SAndroid Build Coastguard Worker {
1473*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
1474*8975f5c5SAndroid Build Coastguard Worker }
1475*8975f5c5SAndroid Build Coastguard Worker }
1476*8975f5c5SAndroid Build Coastguard Worker else if (typeName == "image2d_t")
1477*8975f5c5SAndroid Build Coastguard Worker {
1478*8975f5c5SAndroid Build Coastguard Worker const cl_mem image = *static_cast<const cl_mem *>(arg_value);
1479*8975f5c5SAndroid Build Coastguard Worker if (!Image::IsValid(image) || image->cast<Image>().getType() != MemObjectType::Image2D)
1480*8975f5c5SAndroid Build Coastguard Worker {
1481*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
1482*8975f5c5SAndroid Build Coastguard Worker }
1483*8975f5c5SAndroid Build Coastguard Worker }
1484*8975f5c5SAndroid Build Coastguard Worker else if (typeName == "image3d_t")
1485*8975f5c5SAndroid Build Coastguard Worker {
1486*8975f5c5SAndroid Build Coastguard Worker const cl_mem image = *static_cast<const cl_mem *>(arg_value);
1487*8975f5c5SAndroid Build Coastguard Worker if (!Image::IsValid(image) || image->cast<Image>().getType() != MemObjectType::Image3D)
1488*8975f5c5SAndroid Build Coastguard Worker {
1489*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
1490*8975f5c5SAndroid Build Coastguard Worker }
1491*8975f5c5SAndroid Build Coastguard Worker }
1492*8975f5c5SAndroid Build Coastguard Worker else if (typeName == "image1d_array_t")
1493*8975f5c5SAndroid Build Coastguard Worker {
1494*8975f5c5SAndroid Build Coastguard Worker const cl_mem image = *static_cast<const cl_mem *>(arg_value);
1495*8975f5c5SAndroid Build Coastguard Worker if (!Image::IsValid(image) ||
1496*8975f5c5SAndroid Build Coastguard Worker image->cast<Image>().getType() != MemObjectType::Image1D_Array)
1497*8975f5c5SAndroid Build Coastguard Worker {
1498*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
1499*8975f5c5SAndroid Build Coastguard Worker }
1500*8975f5c5SAndroid Build Coastguard Worker }
1501*8975f5c5SAndroid Build Coastguard Worker else if (typeName == "image2d_array_t")
1502*8975f5c5SAndroid Build Coastguard Worker {
1503*8975f5c5SAndroid Build Coastguard Worker const cl_mem image = *static_cast<const cl_mem *>(arg_value);
1504*8975f5c5SAndroid Build Coastguard Worker if (!Image::IsValid(image) ||
1505*8975f5c5SAndroid Build Coastguard Worker image->cast<Image>().getType() != MemObjectType::Image2D_Array)
1506*8975f5c5SAndroid Build Coastguard Worker {
1507*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
1508*8975f5c5SAndroid Build Coastguard Worker }
1509*8975f5c5SAndroid Build Coastguard Worker }
1510*8975f5c5SAndroid Build Coastguard Worker else if (typeName == "image1d_buffer_t")
1511*8975f5c5SAndroid Build Coastguard Worker {
1512*8975f5c5SAndroid Build Coastguard Worker const cl_mem image = *static_cast<const cl_mem *>(arg_value);
1513*8975f5c5SAndroid Build Coastguard Worker if (!Image::IsValid(image) ||
1514*8975f5c5SAndroid Build Coastguard Worker image->cast<Image>().getType() != MemObjectType::Image1D_Buffer)
1515*8975f5c5SAndroid Build Coastguard Worker {
1516*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
1517*8975f5c5SAndroid Build Coastguard Worker }
1518*8975f5c5SAndroid Build Coastguard Worker }
1519*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_SAMPLER for an argument declared to be of type sampler_t
1520*8975f5c5SAndroid Build Coastguard Worker // when the specified arg_value is not a valid sampler object.
1521*8975f5c5SAndroid Build Coastguard Worker else if (typeName == "sampler_t")
1522*8975f5c5SAndroid Build Coastguard Worker {
1523*8975f5c5SAndroid Build Coastguard Worker static_assert(sizeof(cl_mem) == sizeof(cl_sampler), "api object size check failed");
1524*8975f5c5SAndroid Build Coastguard Worker if (!Sampler::IsValid(*static_cast<const cl_sampler *>(arg_value)))
1525*8975f5c5SAndroid Build Coastguard Worker {
1526*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_SAMPLER;
1527*8975f5c5SAndroid Build Coastguard Worker }
1528*8975f5c5SAndroid Build Coastguard Worker }
1529*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE_QUEUE for an argument declared to be of type queue_t
1530*8975f5c5SAndroid Build Coastguard Worker // when the specified arg_value is not a valid device queue object.
1531*8975f5c5SAndroid Build Coastguard Worker else if (typeName == "queue_t")
1532*8975f5c5SAndroid Build Coastguard Worker {
1533*8975f5c5SAndroid Build Coastguard Worker static_assert(sizeof(cl_mem) == sizeof(cl_command_queue),
1534*8975f5c5SAndroid Build Coastguard Worker "api object size check failed");
1535*8975f5c5SAndroid Build Coastguard Worker const cl_command_queue queue = *static_cast<const cl_command_queue *>(arg_value);
1536*8975f5c5SAndroid Build Coastguard Worker if (!CommandQueue::IsValid(queue) || !queue->cast<CommandQueue>().isOnDevice())
1537*8975f5c5SAndroid Build Coastguard Worker {
1538*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE_QUEUE;
1539*8975f5c5SAndroid Build Coastguard Worker }
1540*8975f5c5SAndroid Build Coastguard Worker }
1541*8975f5c5SAndroid Build Coastguard Worker }
1542*8975f5c5SAndroid Build Coastguard Worker
1543*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1544*8975f5c5SAndroid Build Coastguard Worker }
1545*8975f5c5SAndroid Build Coastguard Worker
ValidateGetKernelInfo(cl_kernel kernel,KernelInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)1546*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetKernelInfo(cl_kernel kernel,
1547*8975f5c5SAndroid Build Coastguard Worker KernelInfo param_name,
1548*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
1549*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
1550*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
1551*8975f5c5SAndroid Build Coastguard Worker {
1552*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_KERNEL if kernel is a not a valid kernel object.
1553*8975f5c5SAndroid Build Coastguard Worker if (!Kernel::IsValid(kernel))
1554*8975f5c5SAndroid Build Coastguard Worker {
1555*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_KERNEL;
1556*8975f5c5SAndroid Build Coastguard Worker }
1557*8975f5c5SAndroid Build Coastguard Worker
1558*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not valid.
1559*8975f5c5SAndroid Build Coastguard Worker const cl_version version =
1560*8975f5c5SAndroid Build Coastguard Worker kernel->cast<Kernel>().getProgram().getContext().getPlatform().getVersion();
1561*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
1562*8975f5c5SAndroid Build Coastguard Worker {
1563*8975f5c5SAndroid Build Coastguard Worker case KernelInfo::Attributes:
1564*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 1, 2);
1565*8975f5c5SAndroid Build Coastguard Worker break;
1566*8975f5c5SAndroid Build Coastguard Worker case KernelInfo::InvalidEnum:
1567*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1568*8975f5c5SAndroid Build Coastguard Worker default:
1569*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
1570*8975f5c5SAndroid Build Coastguard Worker break;
1571*8975f5c5SAndroid Build Coastguard Worker }
1572*8975f5c5SAndroid Build Coastguard Worker
1573*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1574*8975f5c5SAndroid Build Coastguard Worker }
1575*8975f5c5SAndroid Build Coastguard Worker
ValidateGetKernelWorkGroupInfo(cl_kernel kernel,cl_device_id device,KernelWorkGroupInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)1576*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetKernelWorkGroupInfo(cl_kernel kernel,
1577*8975f5c5SAndroid Build Coastguard Worker cl_device_id device,
1578*8975f5c5SAndroid Build Coastguard Worker KernelWorkGroupInfo param_name,
1579*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
1580*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
1581*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
1582*8975f5c5SAndroid Build Coastguard Worker {
1583*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_KERNEL if kernel is a not a valid kernel object.
1584*8975f5c5SAndroid Build Coastguard Worker if (!Kernel::IsValid(kernel))
1585*8975f5c5SAndroid Build Coastguard Worker {
1586*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_KERNEL;
1587*8975f5c5SAndroid Build Coastguard Worker }
1588*8975f5c5SAndroid Build Coastguard Worker const Kernel &krnl = kernel->cast<Kernel>();
1589*8975f5c5SAndroid Build Coastguard Worker
1590*8975f5c5SAndroid Build Coastguard Worker const Device *dev = nullptr;
1591*8975f5c5SAndroid Build Coastguard Worker if (device != nullptr)
1592*8975f5c5SAndroid Build Coastguard Worker {
1593*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if device is not in the list of devices associated with kernel ...
1594*8975f5c5SAndroid Build Coastguard Worker if (krnl.getProgram().getContext().hasDevice(device))
1595*8975f5c5SAndroid Build Coastguard Worker {
1596*8975f5c5SAndroid Build Coastguard Worker dev = &device->cast<Device>();
1597*8975f5c5SAndroid Build Coastguard Worker }
1598*8975f5c5SAndroid Build Coastguard Worker else
1599*8975f5c5SAndroid Build Coastguard Worker {
1600*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
1601*8975f5c5SAndroid Build Coastguard Worker }
1602*8975f5c5SAndroid Build Coastguard Worker }
1603*8975f5c5SAndroid Build Coastguard Worker else
1604*8975f5c5SAndroid Build Coastguard Worker {
1605*8975f5c5SAndroid Build Coastguard Worker // or if device is NULL but there is more than one device associated with kernel.
1606*8975f5c5SAndroid Build Coastguard Worker if (krnl.getProgram().getContext().getDevices().size() == 1u)
1607*8975f5c5SAndroid Build Coastguard Worker {
1608*8975f5c5SAndroid Build Coastguard Worker dev = krnl.getProgram().getContext().getDevices().front().get();
1609*8975f5c5SAndroid Build Coastguard Worker }
1610*8975f5c5SAndroid Build Coastguard Worker else
1611*8975f5c5SAndroid Build Coastguard Worker {
1612*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
1613*8975f5c5SAndroid Build Coastguard Worker }
1614*8975f5c5SAndroid Build Coastguard Worker }
1615*8975f5c5SAndroid Build Coastguard Worker
1616*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not valid.
1617*8975f5c5SAndroid Build Coastguard Worker const cl_version version = krnl.getProgram().getContext().getPlatform().getInfo().version;
1618*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
1619*8975f5c5SAndroid Build Coastguard Worker {
1620*8975f5c5SAndroid Build Coastguard Worker case KernelWorkGroupInfo::GlobalWorkSize:
1621*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 1, 2);
1622*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is CL_KERNEL_GLOBAL_WORK_SIZE and
1623*8975f5c5SAndroid Build Coastguard Worker // device is not a custom device and kernel is not a built-in kernel.
1624*8975f5c5SAndroid Build Coastguard Worker if (!dev->supportsBuiltInKernel(krnl.getInfo().functionName))
1625*8975f5c5SAndroid Build Coastguard Worker {
1626*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1627*8975f5c5SAndroid Build Coastguard Worker }
1628*8975f5c5SAndroid Build Coastguard Worker break;
1629*8975f5c5SAndroid Build Coastguard Worker case KernelWorkGroupInfo::InvalidEnum:
1630*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1631*8975f5c5SAndroid Build Coastguard Worker default:
1632*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
1633*8975f5c5SAndroid Build Coastguard Worker break;
1634*8975f5c5SAndroid Build Coastguard Worker }
1635*8975f5c5SAndroid Build Coastguard Worker
1636*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1637*8975f5c5SAndroid Build Coastguard Worker }
1638*8975f5c5SAndroid Build Coastguard Worker
ValidateWaitForEvents(cl_uint num_events,const cl_event * event_list)1639*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateWaitForEvents(cl_uint num_events, const cl_event *event_list)
1640*8975f5c5SAndroid Build Coastguard Worker {
1641*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if num_events is zero or event_list is NULL.
1642*8975f5c5SAndroid Build Coastguard Worker if (num_events == 0u || event_list == nullptr)
1643*8975f5c5SAndroid Build Coastguard Worker {
1644*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1645*8975f5c5SAndroid Build Coastguard Worker }
1646*8975f5c5SAndroid Build Coastguard Worker
1647*8975f5c5SAndroid Build Coastguard Worker const Context *context = nullptr;
1648*8975f5c5SAndroid Build Coastguard Worker while (num_events-- != 0u)
1649*8975f5c5SAndroid Build Coastguard Worker {
1650*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_EVENT if event objects specified in event_list are not valid event objects.
1651*8975f5c5SAndroid Build Coastguard Worker if (!Event::IsValid(*event_list))
1652*8975f5c5SAndroid Build Coastguard Worker {
1653*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_EVENT;
1654*8975f5c5SAndroid Build Coastguard Worker }
1655*8975f5c5SAndroid Build Coastguard Worker
1656*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if events specified in event_list do not belong to the same context.
1657*8975f5c5SAndroid Build Coastguard Worker const Context *eventContext = &(*event_list++)->cast<Event>().getContext();
1658*8975f5c5SAndroid Build Coastguard Worker if (context == nullptr)
1659*8975f5c5SAndroid Build Coastguard Worker {
1660*8975f5c5SAndroid Build Coastguard Worker context = eventContext;
1661*8975f5c5SAndroid Build Coastguard Worker }
1662*8975f5c5SAndroid Build Coastguard Worker else if (context != eventContext)
1663*8975f5c5SAndroid Build Coastguard Worker {
1664*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
1665*8975f5c5SAndroid Build Coastguard Worker }
1666*8975f5c5SAndroid Build Coastguard Worker }
1667*8975f5c5SAndroid Build Coastguard Worker
1668*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1669*8975f5c5SAndroid Build Coastguard Worker }
1670*8975f5c5SAndroid Build Coastguard Worker
ValidateGetEventInfo(cl_event event,EventInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)1671*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetEventInfo(cl_event event,
1672*8975f5c5SAndroid Build Coastguard Worker EventInfo param_name,
1673*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
1674*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
1675*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
1676*8975f5c5SAndroid Build Coastguard Worker {
1677*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_EVENT if event is a not a valid event object.
1678*8975f5c5SAndroid Build Coastguard Worker if (!Event::IsValid(event))
1679*8975f5c5SAndroid Build Coastguard Worker {
1680*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_EVENT;
1681*8975f5c5SAndroid Build Coastguard Worker }
1682*8975f5c5SAndroid Build Coastguard Worker
1683*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not valid.
1684*8975f5c5SAndroid Build Coastguard Worker const cl_version version = event->cast<Event>().getContext().getPlatform().getVersion();
1685*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
1686*8975f5c5SAndroid Build Coastguard Worker {
1687*8975f5c5SAndroid Build Coastguard Worker case EventInfo::Context:
1688*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 1, 1);
1689*8975f5c5SAndroid Build Coastguard Worker break;
1690*8975f5c5SAndroid Build Coastguard Worker case EventInfo::InvalidEnum:
1691*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1692*8975f5c5SAndroid Build Coastguard Worker default:
1693*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
1694*8975f5c5SAndroid Build Coastguard Worker break;
1695*8975f5c5SAndroid Build Coastguard Worker }
1696*8975f5c5SAndroid Build Coastguard Worker
1697*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1698*8975f5c5SAndroid Build Coastguard Worker }
1699*8975f5c5SAndroid Build Coastguard Worker
ValidateRetainEvent(cl_event event)1700*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateRetainEvent(cl_event event)
1701*8975f5c5SAndroid Build Coastguard Worker {
1702*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_EVENT if event is not a valid event object.
1703*8975f5c5SAndroid Build Coastguard Worker return Event::IsValid(event) ? CL_SUCCESS : CL_INVALID_EVENT;
1704*8975f5c5SAndroid Build Coastguard Worker }
1705*8975f5c5SAndroid Build Coastguard Worker
ValidateReleaseEvent(cl_event event)1706*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateReleaseEvent(cl_event event)
1707*8975f5c5SAndroid Build Coastguard Worker {
1708*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_EVENT if event is not a valid event object.
1709*8975f5c5SAndroid Build Coastguard Worker return Event::IsValid(event) ? CL_SUCCESS : CL_INVALID_EVENT;
1710*8975f5c5SAndroid Build Coastguard Worker }
1711*8975f5c5SAndroid Build Coastguard Worker
ValidateGetEventProfilingInfo(cl_event event,ProfilingInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)1712*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetEventProfilingInfo(cl_event event,
1713*8975f5c5SAndroid Build Coastguard Worker ProfilingInfo param_name,
1714*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
1715*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
1716*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
1717*8975f5c5SAndroid Build Coastguard Worker {
1718*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_EVENT if event is a not a valid event object.
1719*8975f5c5SAndroid Build Coastguard Worker if (!Event::IsValid(event))
1720*8975f5c5SAndroid Build Coastguard Worker {
1721*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_EVENT;
1722*8975f5c5SAndroid Build Coastguard Worker }
1723*8975f5c5SAndroid Build Coastguard Worker const Event &evt = event->cast<Event>();
1724*8975f5c5SAndroid Build Coastguard Worker
1725*8975f5c5SAndroid Build Coastguard Worker // CL_PROFILING_INFO_NOT_AVAILABLE if event is a user event object,
1726*8975f5c5SAndroid Build Coastguard Worker if (evt.getCommandType() == CL_COMMAND_USER)
1727*8975f5c5SAndroid Build Coastguard Worker {
1728*8975f5c5SAndroid Build Coastguard Worker return CL_PROFILING_INFO_NOT_AVAILABLE;
1729*8975f5c5SAndroid Build Coastguard Worker }
1730*8975f5c5SAndroid Build Coastguard Worker // or if the CL_QUEUE_PROFILING_ENABLE flag is not set for the command-queue.
1731*8975f5c5SAndroid Build Coastguard Worker if (evt.getCommandQueue()->getProperties().excludes(CL_QUEUE_PROFILING_ENABLE))
1732*8975f5c5SAndroid Build Coastguard Worker {
1733*8975f5c5SAndroid Build Coastguard Worker return CL_PROFILING_INFO_NOT_AVAILABLE;
1734*8975f5c5SAndroid Build Coastguard Worker }
1735*8975f5c5SAndroid Build Coastguard Worker
1736*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not valid.
1737*8975f5c5SAndroid Build Coastguard Worker const cl_version version = evt.getContext().getPlatform().getVersion();
1738*8975f5c5SAndroid Build Coastguard Worker switch (param_name)
1739*8975f5c5SAndroid Build Coastguard Worker {
1740*8975f5c5SAndroid Build Coastguard Worker case ProfilingInfo::CommandComplete:
1741*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_VERSION(version, 2, 0);
1742*8975f5c5SAndroid Build Coastguard Worker break;
1743*8975f5c5SAndroid Build Coastguard Worker case ProfilingInfo::InvalidEnum:
1744*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1745*8975f5c5SAndroid Build Coastguard Worker default:
1746*8975f5c5SAndroid Build Coastguard Worker // All remaining possible values for param_name are valid for all versions.
1747*8975f5c5SAndroid Build Coastguard Worker break;
1748*8975f5c5SAndroid Build Coastguard Worker }
1749*8975f5c5SAndroid Build Coastguard Worker
1750*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1751*8975f5c5SAndroid Build Coastguard Worker }
1752*8975f5c5SAndroid Build Coastguard Worker
ValidateFlush(cl_command_queue command_queue)1753*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateFlush(cl_command_queue command_queue)
1754*8975f5c5SAndroid Build Coastguard Worker {
1755*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_COMMAND_QUEUE if command_queue is not a valid host command-queue.
1756*8975f5c5SAndroid Build Coastguard Worker if (!CommandQueue::IsValid(command_queue) || !command_queue->cast<CommandQueue>().isOnHost())
1757*8975f5c5SAndroid Build Coastguard Worker {
1758*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
1759*8975f5c5SAndroid Build Coastguard Worker }
1760*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1761*8975f5c5SAndroid Build Coastguard Worker }
1762*8975f5c5SAndroid Build Coastguard Worker
ValidateFinish(cl_command_queue command_queue)1763*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateFinish(cl_command_queue command_queue)
1764*8975f5c5SAndroid Build Coastguard Worker {
1765*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_COMMAND_QUEUE if command_queue is not a valid host command-queue.
1766*8975f5c5SAndroid Build Coastguard Worker if (!CommandQueue::IsValid(command_queue) || !command_queue->cast<CommandQueue>().isOnHost())
1767*8975f5c5SAndroid Build Coastguard Worker {
1768*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
1769*8975f5c5SAndroid Build Coastguard Worker }
1770*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1771*8975f5c5SAndroid Build Coastguard Worker }
1772*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueReadBuffer(cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_read,size_t offset,size_t size,const void * ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)1773*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueReadBuffer(cl_command_queue command_queue,
1774*8975f5c5SAndroid Build Coastguard Worker cl_mem buffer,
1775*8975f5c5SAndroid Build Coastguard Worker cl_bool blocking_read,
1776*8975f5c5SAndroid Build Coastguard Worker size_t offset,
1777*8975f5c5SAndroid Build Coastguard Worker size_t size,
1778*8975f5c5SAndroid Build Coastguard Worker const void *ptr,
1779*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
1780*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
1781*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
1782*8975f5c5SAndroid Build Coastguard Worker {
1783*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
1784*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
1785*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueBuffer(command_queue->cast<CommandQueue>(), buffer, true, false));
1786*8975f5c5SAndroid Build Coastguard Worker
1787*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if the region being read or written specified
1788*8975f5c5SAndroid Build Coastguard Worker // by (offset, size) is out of bounds or if ptr is a NULL value.
1789*8975f5c5SAndroid Build Coastguard Worker if (!buffer->cast<Buffer>().isRegionValid(offset, size) || ptr == nullptr)
1790*8975f5c5SAndroid Build Coastguard Worker {
1791*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1792*8975f5c5SAndroid Build Coastguard Worker }
1793*8975f5c5SAndroid Build Coastguard Worker
1794*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1795*8975f5c5SAndroid Build Coastguard Worker }
1796*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueWriteBuffer(cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_write,size_t offset,size_t size,const void * ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)1797*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueWriteBuffer(cl_command_queue command_queue,
1798*8975f5c5SAndroid Build Coastguard Worker cl_mem buffer,
1799*8975f5c5SAndroid Build Coastguard Worker cl_bool blocking_write,
1800*8975f5c5SAndroid Build Coastguard Worker size_t offset,
1801*8975f5c5SAndroid Build Coastguard Worker size_t size,
1802*8975f5c5SAndroid Build Coastguard Worker const void *ptr,
1803*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
1804*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
1805*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
1806*8975f5c5SAndroid Build Coastguard Worker {
1807*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
1808*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
1809*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueBuffer(command_queue->cast<CommandQueue>(), buffer, false, true));
1810*8975f5c5SAndroid Build Coastguard Worker
1811*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if the region being read or written specified
1812*8975f5c5SAndroid Build Coastguard Worker // by (offset, size) is out of bounds or if ptr is a NULL value.
1813*8975f5c5SAndroid Build Coastguard Worker if (!buffer->cast<Buffer>().isRegionValid(offset, size) || ptr == nullptr)
1814*8975f5c5SAndroid Build Coastguard Worker {
1815*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1816*8975f5c5SAndroid Build Coastguard Worker }
1817*8975f5c5SAndroid Build Coastguard Worker
1818*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1819*8975f5c5SAndroid Build Coastguard Worker }
1820*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueCopyBuffer(cl_command_queue command_queue,cl_mem src_buffer,cl_mem dst_buffer,size_t src_offset,size_t dst_offset,size_t size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)1821*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueCopyBuffer(cl_command_queue command_queue,
1822*8975f5c5SAndroid Build Coastguard Worker cl_mem src_buffer,
1823*8975f5c5SAndroid Build Coastguard Worker cl_mem dst_buffer,
1824*8975f5c5SAndroid Build Coastguard Worker size_t src_offset,
1825*8975f5c5SAndroid Build Coastguard Worker size_t dst_offset,
1826*8975f5c5SAndroid Build Coastguard Worker size_t size,
1827*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
1828*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
1829*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
1830*8975f5c5SAndroid Build Coastguard Worker {
1831*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
1832*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
1833*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
1834*8975f5c5SAndroid Build Coastguard Worker
1835*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueBuffer(queue, src_buffer, false, false));
1836*8975f5c5SAndroid Build Coastguard Worker const Buffer &src = src_buffer->cast<Buffer>();
1837*8975f5c5SAndroid Build Coastguard Worker
1838*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueBuffer(queue, dst_buffer, false, false));
1839*8975f5c5SAndroid Build Coastguard Worker const Buffer &dst = dst_buffer->cast<Buffer>();
1840*8975f5c5SAndroid Build Coastguard Worker
1841*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if src_offset, dst_offset, size, src_offset + size or dst_offset + size
1842*8975f5c5SAndroid Build Coastguard Worker // require accessing elements outside the src_buffer and dst_buffer buffer objects respectively.
1843*8975f5c5SAndroid Build Coastguard Worker if (!src.isRegionValid(src_offset, size) || !dst.isRegionValid(dst_offset, size))
1844*8975f5c5SAndroid Build Coastguard Worker {
1845*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
1846*8975f5c5SAndroid Build Coastguard Worker }
1847*8975f5c5SAndroid Build Coastguard Worker
1848*8975f5c5SAndroid Build Coastguard Worker // CL_MEM_COPY_OVERLAP if src_buffer and dst_buffer are the same buffer or sub-buffer object
1849*8975f5c5SAndroid Build Coastguard Worker // and the source and destination regions overlap or if src_buffer and dst_buffer are
1850*8975f5c5SAndroid Build Coastguard Worker // different sub-buffers of the same associated buffer object and they overlap.
1851*8975f5c5SAndroid Build Coastguard Worker if ((src.isSubBuffer() ? src.getParent().get() : &src) ==
1852*8975f5c5SAndroid Build Coastguard Worker (dst.isSubBuffer() ? dst.getParent().get() : &dst))
1853*8975f5c5SAndroid Build Coastguard Worker {
1854*8975f5c5SAndroid Build Coastguard Worker // Only sub-buffers have offsets larger than zero
1855*8975f5c5SAndroid Build Coastguard Worker src_offset += src.getOffset();
1856*8975f5c5SAndroid Build Coastguard Worker dst_offset += dst.getOffset();
1857*8975f5c5SAndroid Build Coastguard Worker
1858*8975f5c5SAndroid Build Coastguard Worker if (OverlapRegions(src_offset, dst_offset, size))
1859*8975f5c5SAndroid Build Coastguard Worker {
1860*8975f5c5SAndroid Build Coastguard Worker return CL_MEM_COPY_OVERLAP;
1861*8975f5c5SAndroid Build Coastguard Worker }
1862*8975f5c5SAndroid Build Coastguard Worker }
1863*8975f5c5SAndroid Build Coastguard Worker
1864*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1865*8975f5c5SAndroid Build Coastguard Worker }
1866*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueReadImage(cl_command_queue command_queue,cl_mem image,cl_bool blocking_read,const size_t * origin,const size_t * region,size_t row_pitch,size_t slice_pitch,const void * ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)1867*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueReadImage(cl_command_queue command_queue,
1868*8975f5c5SAndroid Build Coastguard Worker cl_mem image,
1869*8975f5c5SAndroid Build Coastguard Worker cl_bool blocking_read,
1870*8975f5c5SAndroid Build Coastguard Worker const size_t *origin,
1871*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
1872*8975f5c5SAndroid Build Coastguard Worker size_t row_pitch,
1873*8975f5c5SAndroid Build Coastguard Worker size_t slice_pitch,
1874*8975f5c5SAndroid Build Coastguard Worker const void *ptr,
1875*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
1876*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
1877*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
1878*8975f5c5SAndroid Build Coastguard Worker {
1879*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, true,
1880*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
1881*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
1882*8975f5c5SAndroid Build Coastguard Worker
1883*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueImage(queue, image, true, false));
1884*8975f5c5SAndroid Build Coastguard Worker const Image &img = image->cast<Image>();
1885*8975f5c5SAndroid Build Coastguard Worker
1886*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateImageForDevice(img, queue.getDevice(), origin, region));
1887*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateHostRegionForImage(img, region, row_pitch, slice_pitch, ptr));
1888*8975f5c5SAndroid Build Coastguard Worker
1889*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1890*8975f5c5SAndroid Build Coastguard Worker }
1891*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueWriteImage(cl_command_queue command_queue,cl_mem image,cl_bool blocking_write,const size_t * origin,const size_t * region,size_t input_row_pitch,size_t input_slice_pitch,const void * ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)1892*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueWriteImage(cl_command_queue command_queue,
1893*8975f5c5SAndroid Build Coastguard Worker cl_mem image,
1894*8975f5c5SAndroid Build Coastguard Worker cl_bool blocking_write,
1895*8975f5c5SAndroid Build Coastguard Worker const size_t *origin,
1896*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
1897*8975f5c5SAndroid Build Coastguard Worker size_t input_row_pitch,
1898*8975f5c5SAndroid Build Coastguard Worker size_t input_slice_pitch,
1899*8975f5c5SAndroid Build Coastguard Worker const void *ptr,
1900*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
1901*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
1902*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
1903*8975f5c5SAndroid Build Coastguard Worker {
1904*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, true,
1905*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
1906*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
1907*8975f5c5SAndroid Build Coastguard Worker
1908*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueImage(queue, image, false, true));
1909*8975f5c5SAndroid Build Coastguard Worker const Image &img = image->cast<Image>();
1910*8975f5c5SAndroid Build Coastguard Worker
1911*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateImageForDevice(img, queue.getDevice(), origin, region));
1912*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(
1913*8975f5c5SAndroid Build Coastguard Worker ValidateHostRegionForImage(img, region, input_row_pitch, input_slice_pitch, ptr));
1914*8975f5c5SAndroid Build Coastguard Worker
1915*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1916*8975f5c5SAndroid Build Coastguard Worker }
1917*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueCopyImage(cl_command_queue command_queue,cl_mem src_image,cl_mem dst_image,const size_t * src_origin,const size_t * dst_origin,const size_t * region,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)1918*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueCopyImage(cl_command_queue command_queue,
1919*8975f5c5SAndroid Build Coastguard Worker cl_mem src_image,
1920*8975f5c5SAndroid Build Coastguard Worker cl_mem dst_image,
1921*8975f5c5SAndroid Build Coastguard Worker const size_t *src_origin,
1922*8975f5c5SAndroid Build Coastguard Worker const size_t *dst_origin,
1923*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
1924*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
1925*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
1926*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
1927*8975f5c5SAndroid Build Coastguard Worker {
1928*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, true,
1929*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
1930*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
1931*8975f5c5SAndroid Build Coastguard Worker
1932*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueImage(queue, src_image, false, false));
1933*8975f5c5SAndroid Build Coastguard Worker const Image &src = src_image->cast<Image>();
1934*8975f5c5SAndroid Build Coastguard Worker
1935*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueImage(queue, dst_image, false, false));
1936*8975f5c5SAndroid Build Coastguard Worker const Image &dst = dst_image->cast<Image>();
1937*8975f5c5SAndroid Build Coastguard Worker
1938*8975f5c5SAndroid Build Coastguard Worker // CL_IMAGE_FORMAT_MISMATCH if src_image and dst_image do not use the same image format.
1939*8975f5c5SAndroid Build Coastguard Worker if (src.getFormat().image_channel_order != dst.getFormat().image_channel_order ||
1940*8975f5c5SAndroid Build Coastguard Worker src.getFormat().image_channel_data_type != dst.getFormat().image_channel_data_type)
1941*8975f5c5SAndroid Build Coastguard Worker {
1942*8975f5c5SAndroid Build Coastguard Worker return CL_IMAGE_FORMAT_MISMATCH;
1943*8975f5c5SAndroid Build Coastguard Worker }
1944*8975f5c5SAndroid Build Coastguard Worker
1945*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateImageForDevice(src, queue.getDevice(), src_origin, region));
1946*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateImageForDevice(dst, queue.getDevice(), dst_origin, region));
1947*8975f5c5SAndroid Build Coastguard Worker
1948*8975f5c5SAndroid Build Coastguard Worker // CL_MEM_COPY_OVERLAP if src_image and dst_image are the same image object
1949*8975f5c5SAndroid Build Coastguard Worker // and the source and destination regions overlap.
1950*8975f5c5SAndroid Build Coastguard Worker if (&src == &dst)
1951*8975f5c5SAndroid Build Coastguard Worker {
1952*8975f5c5SAndroid Build Coastguard Worker const MemObjectType type = src.getType();
1953*8975f5c5SAndroid Build Coastguard Worker // Check overlap in first dimension
1954*8975f5c5SAndroid Build Coastguard Worker if (OverlapRegions(src_origin[0], dst_origin[0], region[0]))
1955*8975f5c5SAndroid Build Coastguard Worker {
1956*8975f5c5SAndroid Build Coastguard Worker if (type == MemObjectType::Image1D || type == MemObjectType::Image1D_Buffer)
1957*8975f5c5SAndroid Build Coastguard Worker {
1958*8975f5c5SAndroid Build Coastguard Worker return CL_MEM_COPY_OVERLAP;
1959*8975f5c5SAndroid Build Coastguard Worker }
1960*8975f5c5SAndroid Build Coastguard Worker
1961*8975f5c5SAndroid Build Coastguard Worker // Check overlap in second dimension
1962*8975f5c5SAndroid Build Coastguard Worker if (OverlapRegions(src_origin[1], dst_origin[1], region[1]))
1963*8975f5c5SAndroid Build Coastguard Worker {
1964*8975f5c5SAndroid Build Coastguard Worker if (type == MemObjectType::Image2D || type == MemObjectType::Image1D_Array)
1965*8975f5c5SAndroid Build Coastguard Worker {
1966*8975f5c5SAndroid Build Coastguard Worker return CL_MEM_COPY_OVERLAP;
1967*8975f5c5SAndroid Build Coastguard Worker }
1968*8975f5c5SAndroid Build Coastguard Worker
1969*8975f5c5SAndroid Build Coastguard Worker // Check overlap in third dimension
1970*8975f5c5SAndroid Build Coastguard Worker if (OverlapRegions(src_origin[2], dst_origin[2], region[2]))
1971*8975f5c5SAndroid Build Coastguard Worker {
1972*8975f5c5SAndroid Build Coastguard Worker return CL_MEM_COPY_OVERLAP;
1973*8975f5c5SAndroid Build Coastguard Worker }
1974*8975f5c5SAndroid Build Coastguard Worker }
1975*8975f5c5SAndroid Build Coastguard Worker }
1976*8975f5c5SAndroid Build Coastguard Worker }
1977*8975f5c5SAndroid Build Coastguard Worker
1978*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
1979*8975f5c5SAndroid Build Coastguard Worker }
1980*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueCopyImageToBuffer(cl_command_queue command_queue,cl_mem src_image,cl_mem dst_buffer,const size_t * src_origin,const size_t * region,size_t dst_offset,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)1981*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueCopyImageToBuffer(cl_command_queue command_queue,
1982*8975f5c5SAndroid Build Coastguard Worker cl_mem src_image,
1983*8975f5c5SAndroid Build Coastguard Worker cl_mem dst_buffer,
1984*8975f5c5SAndroid Build Coastguard Worker const size_t *src_origin,
1985*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
1986*8975f5c5SAndroid Build Coastguard Worker size_t dst_offset,
1987*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
1988*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
1989*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
1990*8975f5c5SAndroid Build Coastguard Worker {
1991*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, true,
1992*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
1993*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
1994*8975f5c5SAndroid Build Coastguard Worker
1995*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueImage(queue, src_image, false, false));
1996*8975f5c5SAndroid Build Coastguard Worker const Image &src = src_image->cast<Image>();
1997*8975f5c5SAndroid Build Coastguard Worker
1998*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueBuffer(queue, dst_buffer, false, false));
1999*8975f5c5SAndroid Build Coastguard Worker const Buffer &dst = dst_buffer->cast<Buffer>();
2000*8975f5c5SAndroid Build Coastguard Worker
2001*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if src_image is a 1D image buffer object created from dst_buffer.
2002*8975f5c5SAndroid Build Coastguard Worker if (src.getType() == MemObjectType::Image1D_Buffer && src.getParent() == &dst)
2003*8975f5c5SAndroid Build Coastguard Worker {
2004*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
2005*8975f5c5SAndroid Build Coastguard Worker }
2006*8975f5c5SAndroid Build Coastguard Worker
2007*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateImageForDevice(src, queue.getDevice(), src_origin, region));
2008*8975f5c5SAndroid Build Coastguard Worker
2009*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if the region specified by dst_offset and dst_offset + dst_cb
2010*8975f5c5SAndroid Build Coastguard Worker // refer to a region outside dst_buffer.
2011*8975f5c5SAndroid Build Coastguard Worker const MemObjectType type = src.getType();
2012*8975f5c5SAndroid Build Coastguard Worker size_t dst_cb = src.getElementSize() * region[0];
2013*8975f5c5SAndroid Build Coastguard Worker if (type != MemObjectType::Image1D && type != MemObjectType::Image1D_Buffer)
2014*8975f5c5SAndroid Build Coastguard Worker {
2015*8975f5c5SAndroid Build Coastguard Worker dst_cb *= region[1];
2016*8975f5c5SAndroid Build Coastguard Worker if (type != MemObjectType::Image2D && type != MemObjectType::Image1D_Array)
2017*8975f5c5SAndroid Build Coastguard Worker {
2018*8975f5c5SAndroid Build Coastguard Worker dst_cb *= region[2];
2019*8975f5c5SAndroid Build Coastguard Worker }
2020*8975f5c5SAndroid Build Coastguard Worker }
2021*8975f5c5SAndroid Build Coastguard Worker if (!dst.isRegionValid(dst_offset, dst_cb))
2022*8975f5c5SAndroid Build Coastguard Worker {
2023*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2024*8975f5c5SAndroid Build Coastguard Worker }
2025*8975f5c5SAndroid Build Coastguard Worker
2026*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2027*8975f5c5SAndroid Build Coastguard Worker }
2028*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueCopyBufferToImage(cl_command_queue command_queue,cl_mem src_buffer,cl_mem dst_image,size_t src_offset,const size_t * dst_origin,const size_t * region,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)2029*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueCopyBufferToImage(cl_command_queue command_queue,
2030*8975f5c5SAndroid Build Coastguard Worker cl_mem src_buffer,
2031*8975f5c5SAndroid Build Coastguard Worker cl_mem dst_image,
2032*8975f5c5SAndroid Build Coastguard Worker size_t src_offset,
2033*8975f5c5SAndroid Build Coastguard Worker const size_t *dst_origin,
2034*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
2035*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
2036*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
2037*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
2038*8975f5c5SAndroid Build Coastguard Worker {
2039*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, true,
2040*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
2041*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
2042*8975f5c5SAndroid Build Coastguard Worker
2043*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueBuffer(queue, src_buffer, false, false));
2044*8975f5c5SAndroid Build Coastguard Worker const Buffer &src = src_buffer->cast<Buffer>();
2045*8975f5c5SAndroid Build Coastguard Worker
2046*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueImage(queue, dst_image, false, false));
2047*8975f5c5SAndroid Build Coastguard Worker const Image &dst = dst_image->cast<Image>();
2048*8975f5c5SAndroid Build Coastguard Worker
2049*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if dst_image is a 1D image buffer object created from src_buffer.
2050*8975f5c5SAndroid Build Coastguard Worker if (dst.getType() == MemObjectType::Image1D_Buffer && dst.getParent() == &src)
2051*8975f5c5SAndroid Build Coastguard Worker {
2052*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
2053*8975f5c5SAndroid Build Coastguard Worker }
2054*8975f5c5SAndroid Build Coastguard Worker
2055*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateImageForDevice(dst, queue.getDevice(), dst_origin, region));
2056*8975f5c5SAndroid Build Coastguard Worker
2057*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if the region specified by src_offset and src_offset + src_cb
2058*8975f5c5SAndroid Build Coastguard Worker // refer to a region outside src_buffer.
2059*8975f5c5SAndroid Build Coastguard Worker const MemObjectType type = dst.getType();
2060*8975f5c5SAndroid Build Coastguard Worker size_t src_cb = dst.getElementSize() * region[0];
2061*8975f5c5SAndroid Build Coastguard Worker if (type != MemObjectType::Image1D && type != MemObjectType::Image1D_Buffer)
2062*8975f5c5SAndroid Build Coastguard Worker {
2063*8975f5c5SAndroid Build Coastguard Worker src_cb *= region[1];
2064*8975f5c5SAndroid Build Coastguard Worker if (type != MemObjectType::Image2D && type != MemObjectType::Image1D_Array)
2065*8975f5c5SAndroid Build Coastguard Worker {
2066*8975f5c5SAndroid Build Coastguard Worker src_cb *= region[2];
2067*8975f5c5SAndroid Build Coastguard Worker }
2068*8975f5c5SAndroid Build Coastguard Worker }
2069*8975f5c5SAndroid Build Coastguard Worker if (!src.isRegionValid(src_offset, src_cb))
2070*8975f5c5SAndroid Build Coastguard Worker {
2071*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2072*8975f5c5SAndroid Build Coastguard Worker }
2073*8975f5c5SAndroid Build Coastguard Worker
2074*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2075*8975f5c5SAndroid Build Coastguard Worker }
2076*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueMapBuffer(cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_map,MapFlags map_flags,size_t offset,size_t size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)2077*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueMapBuffer(cl_command_queue command_queue,
2078*8975f5c5SAndroid Build Coastguard Worker cl_mem buffer,
2079*8975f5c5SAndroid Build Coastguard Worker cl_bool blocking_map,
2080*8975f5c5SAndroid Build Coastguard Worker MapFlags map_flags,
2081*8975f5c5SAndroid Build Coastguard Worker size_t offset,
2082*8975f5c5SAndroid Build Coastguard Worker size_t size,
2083*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
2084*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
2085*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
2086*8975f5c5SAndroid Build Coastguard Worker {
2087*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
2088*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
2089*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
2090*8975f5c5SAndroid Build Coastguard Worker
2091*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if buffer has been created with CL_MEM_HOST_WRITE_ONLY or
2092*8975f5c5SAndroid Build Coastguard Worker // CL_MEM_HOST_NO_ACCESS and CL_MAP_READ is set in map_flags
2093*8975f5c5SAndroid Build Coastguard Worker // or if buffer has been created with CL_MEM_HOST_READ_ONLY or CL_MEM_HOST_NO_ACCESS
2094*8975f5c5SAndroid Build Coastguard Worker // and CL_MAP_WRITE or CL_MAP_WRITE_INVALIDATE_REGION is set in map_flags.
2095*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(
2096*8975f5c5SAndroid Build Coastguard Worker ValidateEnqueueBuffer(queue, buffer, map_flags.intersects(CL_MAP_READ),
2097*8975f5c5SAndroid Build Coastguard Worker map_flags.intersects(CL_MAP_WRITE | CL_MAP_WRITE_INVALIDATE_REGION)));
2098*8975f5c5SAndroid Build Coastguard Worker
2099*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if region being mapped given by (offset, size) is out of bounds
2100*8975f5c5SAndroid Build Coastguard Worker // or if size is 0 or if values specified in map_flags are not valid.
2101*8975f5c5SAndroid Build Coastguard Worker if (!buffer->cast<Buffer>().isRegionValid(offset, size) || size == 0u ||
2102*8975f5c5SAndroid Build Coastguard Worker !ValidateMapFlags(map_flags, queue.getContext().getPlatform()))
2103*8975f5c5SAndroid Build Coastguard Worker {
2104*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2105*8975f5c5SAndroid Build Coastguard Worker }
2106*8975f5c5SAndroid Build Coastguard Worker
2107*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2108*8975f5c5SAndroid Build Coastguard Worker }
2109*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueMapImage(cl_command_queue command_queue,cl_mem image,cl_bool blocking_map,MapFlags map_flags,const size_t * origin,const size_t * region,const size_t * image_row_pitch,const size_t * image_slice_pitch,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)2110*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueMapImage(cl_command_queue command_queue,
2111*8975f5c5SAndroid Build Coastguard Worker cl_mem image,
2112*8975f5c5SAndroid Build Coastguard Worker cl_bool blocking_map,
2113*8975f5c5SAndroid Build Coastguard Worker MapFlags map_flags,
2114*8975f5c5SAndroid Build Coastguard Worker const size_t *origin,
2115*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
2116*8975f5c5SAndroid Build Coastguard Worker const size_t *image_row_pitch,
2117*8975f5c5SAndroid Build Coastguard Worker const size_t *image_slice_pitch,
2118*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
2119*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
2120*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
2121*8975f5c5SAndroid Build Coastguard Worker {
2122*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, true,
2123*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
2124*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
2125*8975f5c5SAndroid Build Coastguard Worker
2126*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if image has been created with CL_MEM_HOST_WRITE_ONLY or
2127*8975f5c5SAndroid Build Coastguard Worker // CL_MEM_HOST_NO_ACCESS and CL_MAP_READ is set in map_flags
2128*8975f5c5SAndroid Build Coastguard Worker // or if image has been created with CL_MEM_HOST_READ_ONLY or CL_MEM_HOST_NO_ACCESS
2129*8975f5c5SAndroid Build Coastguard Worker // and CL_MAP_WRITE or CL_MAP_WRITE_INVALIDATE_REGION is set in map_flags.
2130*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(
2131*8975f5c5SAndroid Build Coastguard Worker ValidateEnqueueImage(queue, image, map_flags.intersects(CL_MAP_READ),
2132*8975f5c5SAndroid Build Coastguard Worker map_flags.intersects(CL_MAP_WRITE | CL_MAP_WRITE_INVALIDATE_REGION)));
2133*8975f5c5SAndroid Build Coastguard Worker const Image &img = image->cast<Image>();
2134*8975f5c5SAndroid Build Coastguard Worker
2135*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateImageForDevice(img, queue.getDevice(), origin, region));
2136*8975f5c5SAndroid Build Coastguard Worker
2137*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if values specified in map_flags are not valid.
2138*8975f5c5SAndroid Build Coastguard Worker if (!ValidateMapFlags(map_flags, queue.getContext().getPlatform()))
2139*8975f5c5SAndroid Build Coastguard Worker {
2140*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2141*8975f5c5SAndroid Build Coastguard Worker }
2142*8975f5c5SAndroid Build Coastguard Worker
2143*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if image_row_pitch is NULL.
2144*8975f5c5SAndroid Build Coastguard Worker if (image_row_pitch == nullptr)
2145*8975f5c5SAndroid Build Coastguard Worker {
2146*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2147*8975f5c5SAndroid Build Coastguard Worker }
2148*8975f5c5SAndroid Build Coastguard Worker
2149*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if image is a 3D image, 1D or 2D image array object
2150*8975f5c5SAndroid Build Coastguard Worker // and image_slice_pitch is NULL.
2151*8975f5c5SAndroid Build Coastguard Worker if ((img.getType() == MemObjectType::Image3D || img.getType() == MemObjectType::Image1D_Array ||
2152*8975f5c5SAndroid Build Coastguard Worker img.getType() == MemObjectType::Image2D_Array) &&
2153*8975f5c5SAndroid Build Coastguard Worker image_slice_pitch == nullptr)
2154*8975f5c5SAndroid Build Coastguard Worker {
2155*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2156*8975f5c5SAndroid Build Coastguard Worker }
2157*8975f5c5SAndroid Build Coastguard Worker
2158*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2159*8975f5c5SAndroid Build Coastguard Worker }
2160*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueUnmapMemObject(cl_command_queue command_queue,cl_mem memobj,const void * mapped_ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)2161*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueUnmapMemObject(cl_command_queue command_queue,
2162*8975f5c5SAndroid Build Coastguard Worker cl_mem memobj,
2163*8975f5c5SAndroid Build Coastguard Worker const void *mapped_ptr,
2164*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
2165*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
2166*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
2167*8975f5c5SAndroid Build Coastguard Worker {
2168*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
2169*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
2170*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
2171*8975f5c5SAndroid Build Coastguard Worker
2172*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if memobj is not a valid memory object or is a pipe object.
2173*8975f5c5SAndroid Build Coastguard Worker if (!Memory::IsValid(memobj))
2174*8975f5c5SAndroid Build Coastguard Worker {
2175*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
2176*8975f5c5SAndroid Build Coastguard Worker }
2177*8975f5c5SAndroid Build Coastguard Worker const Memory &memory = memobj->cast<Memory>();
2178*8975f5c5SAndroid Build Coastguard Worker if (memory.getType() == MemObjectType::Pipe)
2179*8975f5c5SAndroid Build Coastguard Worker {
2180*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
2181*8975f5c5SAndroid Build Coastguard Worker }
2182*8975f5c5SAndroid Build Coastguard Worker
2183*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context associated with command_queue and memobj are not the same.
2184*8975f5c5SAndroid Build Coastguard Worker if (&queue.getContext() != &memory.getContext())
2185*8975f5c5SAndroid Build Coastguard Worker {
2186*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
2187*8975f5c5SAndroid Build Coastguard Worker }
2188*8975f5c5SAndroid Build Coastguard Worker
2189*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2190*8975f5c5SAndroid Build Coastguard Worker }
2191*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueNDRangeKernel(cl_command_queue command_queue,cl_kernel kernel,cl_uint work_dim,const size_t * global_work_offset,const size_t * global_work_size,const size_t * local_work_size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)2192*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueNDRangeKernel(cl_command_queue command_queue,
2193*8975f5c5SAndroid Build Coastguard Worker cl_kernel kernel,
2194*8975f5c5SAndroid Build Coastguard Worker cl_uint work_dim,
2195*8975f5c5SAndroid Build Coastguard Worker const size_t *global_work_offset,
2196*8975f5c5SAndroid Build Coastguard Worker const size_t *global_work_size,
2197*8975f5c5SAndroid Build Coastguard Worker const size_t *local_work_size,
2198*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
2199*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
2200*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
2201*8975f5c5SAndroid Build Coastguard Worker {
2202*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
2203*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
2204*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
2205*8975f5c5SAndroid Build Coastguard Worker const Device &device = queue.getDevice();
2206*8975f5c5SAndroid Build Coastguard Worker
2207*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_KERNEL if kernel is not a valid kernel object.
2208*8975f5c5SAndroid Build Coastguard Worker if (!Kernel::IsValid(kernel))
2209*8975f5c5SAndroid Build Coastguard Worker {
2210*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_KERNEL;
2211*8975f5c5SAndroid Build Coastguard Worker }
2212*8975f5c5SAndroid Build Coastguard Worker const Kernel &krnl = kernel->cast<Kernel>();
2213*8975f5c5SAndroid Build Coastguard Worker
2214*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context associated with command_queue and kernel are not the same.
2215*8975f5c5SAndroid Build Coastguard Worker if (&queue.getContext() != &krnl.getProgram().getContext())
2216*8975f5c5SAndroid Build Coastguard Worker {
2217*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
2218*8975f5c5SAndroid Build Coastguard Worker }
2219*8975f5c5SAndroid Build Coastguard Worker
2220*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_WORK_DIMENSION if work_dim is not a valid value.
2221*8975f5c5SAndroid Build Coastguard Worker if (work_dim == 0u || work_dim > device.getInfo().maxWorkItemSizes.size())
2222*8975f5c5SAndroid Build Coastguard Worker {
2223*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_WORK_DIMENSION;
2224*8975f5c5SAndroid Build Coastguard Worker }
2225*8975f5c5SAndroid Build Coastguard Worker
2226*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_GLOBAL_OFFSET if global_work_offset is non-NULL before version 1.1.
2227*8975f5c5SAndroid Build Coastguard Worker if (!queue.getContext().getPlatform().isVersionOrNewer(1u, 1u) && global_work_offset != nullptr)
2228*8975f5c5SAndroid Build Coastguard Worker {
2229*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_GLOBAL_OFFSET;
2230*8975f5c5SAndroid Build Coastguard Worker }
2231*8975f5c5SAndroid Build Coastguard Worker
2232*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_KERNEL_ARGS if all the kernel arguments have not been set for the kernel
2233*8975f5c5SAndroid Build Coastguard Worker if (!krnl.areAllArgsSet())
2234*8975f5c5SAndroid Build Coastguard Worker {
2235*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_KERNEL_ARGS;
2236*8975f5c5SAndroid Build Coastguard Worker }
2237*8975f5c5SAndroid Build Coastguard Worker
2238*8975f5c5SAndroid Build Coastguard Worker size_t compileWorkGroupSize[3] = {0, 0, 0};
2239*8975f5c5SAndroid Build Coastguard Worker if (IsError(krnl.getWorkGroupInfo(const_cast<cl_device_id>(device.getNative()),
2240*8975f5c5SAndroid Build Coastguard Worker KernelWorkGroupInfo::CompileWorkGroupSize,
2241*8975f5c5SAndroid Build Coastguard Worker sizeof(compileWorkGroupSize), compileWorkGroupSize, nullptr)))
2242*8975f5c5SAndroid Build Coastguard Worker {
2243*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2244*8975f5c5SAndroid Build Coastguard Worker }
2245*8975f5c5SAndroid Build Coastguard Worker if (local_work_size != nullptr)
2246*8975f5c5SAndroid Build Coastguard Worker {
2247*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_WORK_GROUP_SIZE when non-uniform work-groups are not supported, the size of
2248*8975f5c5SAndroid Build Coastguard Worker // each work-group must be uniform. If local_work_size is specified, the values specified in
2249*8975f5c5SAndroid Build Coastguard Worker // global_work_size[0],...,global_work_size[work_dim - 1] must be evenly divisible by
2250*8975f5c5SAndroid Build Coastguard Worker // the corresponding values specified in local_work_size[0],...,
2251*8975f5c5SAndroid Build Coastguard Worker // local_work_size[work_dim-1].
2252*8975f5c5SAndroid Build Coastguard Worker if (!device.supportsNonUniformWorkGroups())
2253*8975f5c5SAndroid Build Coastguard Worker {
2254*8975f5c5SAndroid Build Coastguard Worker for (cl_uint i = 0; i < work_dim; ++i)
2255*8975f5c5SAndroid Build Coastguard Worker {
2256*8975f5c5SAndroid Build Coastguard Worker if (global_work_size[i] % local_work_size[i] != 0)
2257*8975f5c5SAndroid Build Coastguard Worker {
2258*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_WORK_GROUP_SIZE;
2259*8975f5c5SAndroid Build Coastguard Worker }
2260*8975f5c5SAndroid Build Coastguard Worker }
2261*8975f5c5SAndroid Build Coastguard Worker }
2262*8975f5c5SAndroid Build Coastguard Worker
2263*8975f5c5SAndroid Build Coastguard Worker for (cl_uint i = 0; i < work_dim; ++i)
2264*8975f5c5SAndroid Build Coastguard Worker {
2265*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_WORK_GROUP_SIZE when non-uniform work-groups are not supported, the size
2266*8975f5c5SAndroid Build Coastguard Worker // of each work-group must be uniform. If local_work_size is specified, the values
2267*8975f5c5SAndroid Build Coastguard Worker // specified in global_work_size[0],..., global_work_size[work_dim - 1] must be
2268*8975f5c5SAndroid Build Coastguard Worker // evenly divisible by the corresponding values specified in local_work_size[0],...,
2269*8975f5c5SAndroid Build Coastguard Worker // local_work_size[work_dim-1].
2270*8975f5c5SAndroid Build Coastguard Worker if (local_work_size[i] == 0)
2271*8975f5c5SAndroid Build Coastguard Worker {
2272*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_WORK_GROUP_SIZE;
2273*8975f5c5SAndroid Build Coastguard Worker }
2274*8975f5c5SAndroid Build Coastguard Worker
2275*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_WORK_GROUP_SIZE if local_work_size is specified and does not match the
2276*8975f5c5SAndroid Build Coastguard Worker // required work-group size for kernel in the program source.
2277*8975f5c5SAndroid Build Coastguard Worker if (compileWorkGroupSize[i] != 0 && local_work_size[i] != compileWorkGroupSize[i])
2278*8975f5c5SAndroid Build Coastguard Worker {
2279*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_WORK_GROUP_SIZE;
2280*8975f5c5SAndroid Build Coastguard Worker }
2281*8975f5c5SAndroid Build Coastguard Worker }
2282*8975f5c5SAndroid Build Coastguard Worker }
2283*8975f5c5SAndroid Build Coastguard Worker
2284*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_GLOBAL_WORK_SIZE if global_work_size is NULL or if any of the values
2285*8975f5c5SAndroid Build Coastguard Worker // specified in global_work_size[0] ... global_work_size[work_dim - 1] are 0.
2286*8975f5c5SAndroid Build Coastguard Worker // Returning this error code under these circumstances is deprecated by version 2.1.
2287*8975f5c5SAndroid Build Coastguard Worker if (!queue.getContext().getPlatform().isVersionOrNewer(2u, 1u))
2288*8975f5c5SAndroid Build Coastguard Worker {
2289*8975f5c5SAndroid Build Coastguard Worker if (global_work_size == nullptr)
2290*8975f5c5SAndroid Build Coastguard Worker {
2291*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_GLOBAL_WORK_SIZE;
2292*8975f5c5SAndroid Build Coastguard Worker }
2293*8975f5c5SAndroid Build Coastguard Worker for (cl_uint dim = 0u; dim < work_dim; ++dim)
2294*8975f5c5SAndroid Build Coastguard Worker {
2295*8975f5c5SAndroid Build Coastguard Worker if (global_work_size[dim] == 0u)
2296*8975f5c5SAndroid Build Coastguard Worker {
2297*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_GLOBAL_WORK_SIZE;
2298*8975f5c5SAndroid Build Coastguard Worker }
2299*8975f5c5SAndroid Build Coastguard Worker }
2300*8975f5c5SAndroid Build Coastguard Worker }
2301*8975f5c5SAndroid Build Coastguard Worker
2302*8975f5c5SAndroid Build Coastguard Worker if (local_work_size != nullptr)
2303*8975f5c5SAndroid Build Coastguard Worker {
2304*8975f5c5SAndroid Build Coastguard Worker size_t numWorkItems = 1u; // Initialize with neutral element for multiplication
2305*8975f5c5SAndroid Build Coastguard Worker
2306*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_WORK_ITEM_SIZE if the number of work-items specified
2307*8975f5c5SAndroid Build Coastguard Worker // in any of local_work_size[0] ... local_work_size[work_dim - 1]
2308*8975f5c5SAndroid Build Coastguard Worker // is greater than the corresponding values specified by
2309*8975f5c5SAndroid Build Coastguard Worker // CL_DEVICE_MAX_WORK_ITEM_SIZES[0] ... CL_DEVICE_MAX_WORK_ITEM_SIZES[work_dim - 1].
2310*8975f5c5SAndroid Build Coastguard Worker for (cl_uint dim = 0u; dim < work_dim; ++dim)
2311*8975f5c5SAndroid Build Coastguard Worker {
2312*8975f5c5SAndroid Build Coastguard Worker if (local_work_size[dim] > device.getInfo().maxWorkItemSizes[dim])
2313*8975f5c5SAndroid Build Coastguard Worker {
2314*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_WORK_ITEM_SIZE;
2315*8975f5c5SAndroid Build Coastguard Worker }
2316*8975f5c5SAndroid Build Coastguard Worker numWorkItems *= local_work_size[dim];
2317*8975f5c5SAndroid Build Coastguard Worker }
2318*8975f5c5SAndroid Build Coastguard Worker
2319*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_WORK_GROUP_SIZE if local_work_size is specified
2320*8975f5c5SAndroid Build Coastguard Worker // and the total number of work-items in the work-group computed as
2321*8975f5c5SAndroid Build Coastguard Worker // local_work_size[0] x ... local_work_size[work_dim - 1] is greater than the value
2322*8975f5c5SAndroid Build Coastguard Worker // specified by CL_KERNEL_WORK_GROUP_SIZE in the Kernel Object Device Queries table.
2323*8975f5c5SAndroid Build Coastguard Worker if (numWorkItems > krnl.getInfo().workGroups[queue.getDeviceIndex()].workGroupSize)
2324*8975f5c5SAndroid Build Coastguard Worker {
2325*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_WORK_GROUP_SIZE;
2326*8975f5c5SAndroid Build Coastguard Worker }
2327*8975f5c5SAndroid Build Coastguard Worker }
2328*8975f5c5SAndroid Build Coastguard Worker
2329*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2330*8975f5c5SAndroid Build Coastguard Worker }
2331*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueNativeKernel(cl_command_queue command_queue,void (CL_CALLBACK * user_func)(void *),const void * args,size_t cb_args,cl_uint num_mem_objects,const cl_mem * mem_list,const void ** args_mem_loc,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)2332*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueNativeKernel(cl_command_queue command_queue,
2333*8975f5c5SAndroid Build Coastguard Worker void(CL_CALLBACK *user_func)(void *),
2334*8975f5c5SAndroid Build Coastguard Worker const void *args,
2335*8975f5c5SAndroid Build Coastguard Worker size_t cb_args,
2336*8975f5c5SAndroid Build Coastguard Worker cl_uint num_mem_objects,
2337*8975f5c5SAndroid Build Coastguard Worker const cl_mem *mem_list,
2338*8975f5c5SAndroid Build Coastguard Worker const void **args_mem_loc,
2339*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
2340*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
2341*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
2342*8975f5c5SAndroid Build Coastguard Worker {
2343*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
2344*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
2345*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
2346*8975f5c5SAndroid Build Coastguard Worker
2347*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if the device associated with command_queue
2348*8975f5c5SAndroid Build Coastguard Worker // cannot execute the native kernel.
2349*8975f5c5SAndroid Build Coastguard Worker if (queue.getDevice().getInfo().execCapabilities.excludes(CL_EXEC_NATIVE_KERNEL))
2350*8975f5c5SAndroid Build Coastguard Worker {
2351*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
2352*8975f5c5SAndroid Build Coastguard Worker }
2353*8975f5c5SAndroid Build Coastguard Worker
2354*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if user_func is NULL.
2355*8975f5c5SAndroid Build Coastguard Worker if (user_func == nullptr)
2356*8975f5c5SAndroid Build Coastguard Worker {
2357*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2358*8975f5c5SAndroid Build Coastguard Worker }
2359*8975f5c5SAndroid Build Coastguard Worker
2360*8975f5c5SAndroid Build Coastguard Worker if (args == nullptr)
2361*8975f5c5SAndroid Build Coastguard Worker {
2362*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if args is a NULL value and cb_args > 0 or num_mem_objects > 0.
2363*8975f5c5SAndroid Build Coastguard Worker if (cb_args > 0u || num_mem_objects > 0u)
2364*8975f5c5SAndroid Build Coastguard Worker {
2365*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2366*8975f5c5SAndroid Build Coastguard Worker }
2367*8975f5c5SAndroid Build Coastguard Worker }
2368*8975f5c5SAndroid Build Coastguard Worker else
2369*8975f5c5SAndroid Build Coastguard Worker {
2370*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if args is not NULL and cb_args is 0.
2371*8975f5c5SAndroid Build Coastguard Worker if (cb_args == 0u)
2372*8975f5c5SAndroid Build Coastguard Worker {
2373*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2374*8975f5c5SAndroid Build Coastguard Worker }
2375*8975f5c5SAndroid Build Coastguard Worker }
2376*8975f5c5SAndroid Build Coastguard Worker
2377*8975f5c5SAndroid Build Coastguard Worker if (num_mem_objects == 0u)
2378*8975f5c5SAndroid Build Coastguard Worker {
2379*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if num_mem_objects = 0 and mem_list or args_mem_loc are not NULL.
2380*8975f5c5SAndroid Build Coastguard Worker if (mem_list != nullptr || args_mem_loc != nullptr)
2381*8975f5c5SAndroid Build Coastguard Worker {
2382*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2383*8975f5c5SAndroid Build Coastguard Worker }
2384*8975f5c5SAndroid Build Coastguard Worker }
2385*8975f5c5SAndroid Build Coastguard Worker else
2386*8975f5c5SAndroid Build Coastguard Worker {
2387*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if num_mem_objects > 0 and mem_list or args_mem_loc are NULL.
2388*8975f5c5SAndroid Build Coastguard Worker if (mem_list == nullptr || args_mem_loc == nullptr)
2389*8975f5c5SAndroid Build Coastguard Worker {
2390*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2391*8975f5c5SAndroid Build Coastguard Worker }
2392*8975f5c5SAndroid Build Coastguard Worker
2393*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if one or more memory objects
2394*8975f5c5SAndroid Build Coastguard Worker // specified in mem_list are not valid or are not buffer objects.
2395*8975f5c5SAndroid Build Coastguard Worker while (num_mem_objects-- != 0u)
2396*8975f5c5SAndroid Build Coastguard Worker {
2397*8975f5c5SAndroid Build Coastguard Worker if (!Buffer::IsValid(*mem_list++))
2398*8975f5c5SAndroid Build Coastguard Worker {
2399*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
2400*8975f5c5SAndroid Build Coastguard Worker }
2401*8975f5c5SAndroid Build Coastguard Worker }
2402*8975f5c5SAndroid Build Coastguard Worker }
2403*8975f5c5SAndroid Build Coastguard Worker
2404*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2405*8975f5c5SAndroid Build Coastguard Worker }
2406*8975f5c5SAndroid Build Coastguard Worker
ValidateSetCommandQueueProperty(cl_command_queue command_queue,CommandQueueProperties properties,cl_bool enable,const cl_command_queue_properties * old_properties)2407*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSetCommandQueueProperty(cl_command_queue command_queue,
2408*8975f5c5SAndroid Build Coastguard Worker CommandQueueProperties properties,
2409*8975f5c5SAndroid Build Coastguard Worker cl_bool enable,
2410*8975f5c5SAndroid Build Coastguard Worker const cl_command_queue_properties *old_properties)
2411*8975f5c5SAndroid Build Coastguard Worker {
2412*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_COMMAND_QUEUE if command_queue is not a valid command-queue.
2413*8975f5c5SAndroid Build Coastguard Worker if (!CommandQueue::IsValid(command_queue))
2414*8975f5c5SAndroid Build Coastguard Worker {
2415*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
2416*8975f5c5SAndroid Build Coastguard Worker }
2417*8975f5c5SAndroid Build Coastguard Worker
2418*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if values specified in properties are not valid.
2419*8975f5c5SAndroid Build Coastguard Worker if (properties.hasOtherBitsThan(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE |
2420*8975f5c5SAndroid Build Coastguard Worker CL_QUEUE_PROFILING_ENABLE))
2421*8975f5c5SAndroid Build Coastguard Worker {
2422*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2423*8975f5c5SAndroid Build Coastguard Worker }
2424*8975f5c5SAndroid Build Coastguard Worker
2425*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2426*8975f5c5SAndroid Build Coastguard Worker }
2427*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateImage2D(cl_context context,MemFlags flags,const cl_image_format * image_format,size_t image_width,size_t image_height,size_t image_row_pitch,const void * host_ptr)2428*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateImage2D(cl_context context,
2429*8975f5c5SAndroid Build Coastguard Worker MemFlags flags,
2430*8975f5c5SAndroid Build Coastguard Worker const cl_image_format *image_format,
2431*8975f5c5SAndroid Build Coastguard Worker size_t image_width,
2432*8975f5c5SAndroid Build Coastguard Worker size_t image_height,
2433*8975f5c5SAndroid Build Coastguard Worker size_t image_row_pitch,
2434*8975f5c5SAndroid Build Coastguard Worker const void *host_ptr)
2435*8975f5c5SAndroid Build Coastguard Worker {
2436*8975f5c5SAndroid Build Coastguard Worker const cl_image_desc desc = {CL_MEM_OBJECT_IMAGE2D, image_width, image_height, 0u, 0u,
2437*8975f5c5SAndroid Build Coastguard Worker image_row_pitch, 0u, 0u, 0u, {nullptr}};
2438*8975f5c5SAndroid Build Coastguard Worker return ValidateCreateImage(context, flags, image_format, &desc, host_ptr);
2439*8975f5c5SAndroid Build Coastguard Worker }
2440*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateImage3D(cl_context context,MemFlags flags,const cl_image_format * image_format,size_t image_width,size_t image_height,size_t image_depth,size_t image_row_pitch,size_t image_slice_pitch,const void * host_ptr)2441*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateImage3D(cl_context context,
2442*8975f5c5SAndroid Build Coastguard Worker MemFlags flags,
2443*8975f5c5SAndroid Build Coastguard Worker const cl_image_format *image_format,
2444*8975f5c5SAndroid Build Coastguard Worker size_t image_width,
2445*8975f5c5SAndroid Build Coastguard Worker size_t image_height,
2446*8975f5c5SAndroid Build Coastguard Worker size_t image_depth,
2447*8975f5c5SAndroid Build Coastguard Worker size_t image_row_pitch,
2448*8975f5c5SAndroid Build Coastguard Worker size_t image_slice_pitch,
2449*8975f5c5SAndroid Build Coastguard Worker const void *host_ptr)
2450*8975f5c5SAndroid Build Coastguard Worker {
2451*8975f5c5SAndroid Build Coastguard Worker const cl_image_desc desc = {
2452*8975f5c5SAndroid Build Coastguard Worker CL_MEM_OBJECT_IMAGE3D, image_width, image_height, image_depth, 0u,
2453*8975f5c5SAndroid Build Coastguard Worker image_row_pitch, image_slice_pitch, 0u, 0u, {nullptr}};
2454*8975f5c5SAndroid Build Coastguard Worker return ValidateCreateImage(context, flags, image_format, &desc, host_ptr);
2455*8975f5c5SAndroid Build Coastguard Worker }
2456*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueMarker(cl_command_queue command_queue,const cl_event * event)2457*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueMarker(cl_command_queue command_queue, const cl_event *event)
2458*8975f5c5SAndroid Build Coastguard Worker {
2459*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_COMMAND_QUEUE if command_queue is not a valid host command-queue.
2460*8975f5c5SAndroid Build Coastguard Worker if (!CommandQueue::IsValid(command_queue) || !command_queue->cast<CommandQueue>().isOnHost())
2461*8975f5c5SAndroid Build Coastguard Worker {
2462*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
2463*8975f5c5SAndroid Build Coastguard Worker }
2464*8975f5c5SAndroid Build Coastguard Worker
2465*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if event is NULL.
2466*8975f5c5SAndroid Build Coastguard Worker if (event == nullptr)
2467*8975f5c5SAndroid Build Coastguard Worker {
2468*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2469*8975f5c5SAndroid Build Coastguard Worker }
2470*8975f5c5SAndroid Build Coastguard Worker
2471*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2472*8975f5c5SAndroid Build Coastguard Worker }
2473*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueWaitForEvents(cl_command_queue command_queue,cl_uint num_events,const cl_event * event_list)2474*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueWaitForEvents(cl_command_queue command_queue,
2475*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events,
2476*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_list)
2477*8975f5c5SAndroid Build Coastguard Worker {
2478*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_COMMAND_QUEUE if command_queue is not a valid host command-queue.
2479*8975f5c5SAndroid Build Coastguard Worker if (!CommandQueue::IsValid(command_queue))
2480*8975f5c5SAndroid Build Coastguard Worker {
2481*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
2482*8975f5c5SAndroid Build Coastguard Worker }
2483*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
2484*8975f5c5SAndroid Build Coastguard Worker if (!queue.isOnHost())
2485*8975f5c5SAndroid Build Coastguard Worker {
2486*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
2487*8975f5c5SAndroid Build Coastguard Worker }
2488*8975f5c5SAndroid Build Coastguard Worker
2489*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if num_events is 0 or event_list is NULL.
2490*8975f5c5SAndroid Build Coastguard Worker if (num_events == 0u || event_list == nullptr)
2491*8975f5c5SAndroid Build Coastguard Worker {
2492*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2493*8975f5c5SAndroid Build Coastguard Worker }
2494*8975f5c5SAndroid Build Coastguard Worker
2495*8975f5c5SAndroid Build Coastguard Worker while (num_events-- != 0u)
2496*8975f5c5SAndroid Build Coastguard Worker {
2497*8975f5c5SAndroid Build Coastguard Worker // The documentation for invalid events is missing.
2498*8975f5c5SAndroid Build Coastguard Worker if (!Event::IsValid(*event_list))
2499*8975f5c5SAndroid Build Coastguard Worker {
2500*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2501*8975f5c5SAndroid Build Coastguard Worker }
2502*8975f5c5SAndroid Build Coastguard Worker
2503*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context associated with command_queue
2504*8975f5c5SAndroid Build Coastguard Worker // and events in event_list are not the same.
2505*8975f5c5SAndroid Build Coastguard Worker if (&queue.getContext() != &(*event_list++)->cast<Event>().getContext())
2506*8975f5c5SAndroid Build Coastguard Worker {
2507*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
2508*8975f5c5SAndroid Build Coastguard Worker }
2509*8975f5c5SAndroid Build Coastguard Worker }
2510*8975f5c5SAndroid Build Coastguard Worker
2511*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2512*8975f5c5SAndroid Build Coastguard Worker }
2513*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueBarrier(cl_command_queue command_queue)2514*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueBarrier(cl_command_queue command_queue)
2515*8975f5c5SAndroid Build Coastguard Worker {
2516*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_COMMAND_QUEUE if command_queue is not a valid host command-queue.
2517*8975f5c5SAndroid Build Coastguard Worker if (!CommandQueue::IsValid(command_queue) || !command_queue->cast<CommandQueue>().isOnHost())
2518*8975f5c5SAndroid Build Coastguard Worker {
2519*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
2520*8975f5c5SAndroid Build Coastguard Worker }
2521*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2522*8975f5c5SAndroid Build Coastguard Worker }
2523*8975f5c5SAndroid Build Coastguard Worker
ValidateUnloadCompiler()2524*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateUnloadCompiler()
2525*8975f5c5SAndroid Build Coastguard Worker {
2526*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2527*8975f5c5SAndroid Build Coastguard Worker }
2528*8975f5c5SAndroid Build Coastguard Worker
ValidateGetExtensionFunctionAddress(const char * func_name)2529*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetExtensionFunctionAddress(const char *func_name)
2530*8975f5c5SAndroid Build Coastguard Worker {
2531*8975f5c5SAndroid Build Coastguard Worker return func_name != nullptr && *func_name != '\0' ? CL_SUCCESS : CL_INVALID_VALUE;
2532*8975f5c5SAndroid Build Coastguard Worker }
2533*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateCommandQueue(cl_context context,cl_device_id device,CommandQueueProperties properties)2534*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateCommandQueue(cl_context context,
2535*8975f5c5SAndroid Build Coastguard Worker cl_device_id device,
2536*8975f5c5SAndroid Build Coastguard Worker CommandQueueProperties properties)
2537*8975f5c5SAndroid Build Coastguard Worker {
2538*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
2539*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValid(context))
2540*8975f5c5SAndroid Build Coastguard Worker {
2541*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
2542*8975f5c5SAndroid Build Coastguard Worker }
2543*8975f5c5SAndroid Build Coastguard Worker
2544*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if device is not a valid device or is not associated with context.
2545*8975f5c5SAndroid Build Coastguard Worker if (!context->cast<Context>().hasDevice(device))
2546*8975f5c5SAndroid Build Coastguard Worker {
2547*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
2548*8975f5c5SAndroid Build Coastguard Worker }
2549*8975f5c5SAndroid Build Coastguard Worker
2550*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if values specified in properties are not valid.
2551*8975f5c5SAndroid Build Coastguard Worker if (properties.hasOtherBitsThan(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE |
2552*8975f5c5SAndroid Build Coastguard Worker CL_QUEUE_PROFILING_ENABLE))
2553*8975f5c5SAndroid Build Coastguard Worker {
2554*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2555*8975f5c5SAndroid Build Coastguard Worker }
2556*8975f5c5SAndroid Build Coastguard Worker
2557*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2558*8975f5c5SAndroid Build Coastguard Worker }
2559*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateSampler(cl_context context,cl_bool normalized_coords,AddressingMode addressing_mode,FilterMode filter_mode)2560*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateSampler(cl_context context,
2561*8975f5c5SAndroid Build Coastguard Worker cl_bool normalized_coords,
2562*8975f5c5SAndroid Build Coastguard Worker AddressingMode addressing_mode,
2563*8975f5c5SAndroid Build Coastguard Worker FilterMode filter_mode)
2564*8975f5c5SAndroid Build Coastguard Worker {
2565*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
2566*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValid(context))
2567*8975f5c5SAndroid Build Coastguard Worker {
2568*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
2569*8975f5c5SAndroid Build Coastguard Worker }
2570*8975f5c5SAndroid Build Coastguard Worker
2571*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if addressing_mode, filter_mode, normalized_coords
2572*8975f5c5SAndroid Build Coastguard Worker // or a combination of these arguements are not valid.
2573*8975f5c5SAndroid Build Coastguard Worker if ((normalized_coords != CL_FALSE && normalized_coords != CL_TRUE) ||
2574*8975f5c5SAndroid Build Coastguard Worker addressing_mode == AddressingMode::InvalidEnum || filter_mode == FilterMode::InvalidEnum)
2575*8975f5c5SAndroid Build Coastguard Worker {
2576*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2577*8975f5c5SAndroid Build Coastguard Worker }
2578*8975f5c5SAndroid Build Coastguard Worker
2579*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if images are not supported by any device associated with context.
2580*8975f5c5SAndroid Build Coastguard Worker if (!context->cast<Context>().supportsImages())
2581*8975f5c5SAndroid Build Coastguard Worker {
2582*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
2583*8975f5c5SAndroid Build Coastguard Worker }
2584*8975f5c5SAndroid Build Coastguard Worker
2585*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2586*8975f5c5SAndroid Build Coastguard Worker }
2587*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueTask(cl_command_queue command_queue,cl_kernel kernel,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)2588*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueTask(cl_command_queue command_queue,
2589*8975f5c5SAndroid Build Coastguard Worker cl_kernel kernel,
2590*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
2591*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
2592*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
2593*8975f5c5SAndroid Build Coastguard Worker {
2594*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
2595*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
2596*8975f5c5SAndroid Build Coastguard Worker
2597*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_KERNEL if kernel is not a valid kernel object.
2598*8975f5c5SAndroid Build Coastguard Worker if (!Kernel::IsValid(kernel))
2599*8975f5c5SAndroid Build Coastguard Worker {
2600*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_KERNEL;
2601*8975f5c5SAndroid Build Coastguard Worker }
2602*8975f5c5SAndroid Build Coastguard Worker
2603*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context associated with command_queue and kernel are not the same.
2604*8975f5c5SAndroid Build Coastguard Worker if (&command_queue->cast<CommandQueue>().getContext() !=
2605*8975f5c5SAndroid Build Coastguard Worker &kernel->cast<Kernel>().getProgram().getContext())
2606*8975f5c5SAndroid Build Coastguard Worker {
2607*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
2608*8975f5c5SAndroid Build Coastguard Worker }
2609*8975f5c5SAndroid Build Coastguard Worker
2610*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2611*8975f5c5SAndroid Build Coastguard Worker }
2612*8975f5c5SAndroid Build Coastguard Worker
2613*8975f5c5SAndroid Build Coastguard Worker // CL 1.1
ValidateCreateSubBuffer(cl_mem buffer,MemFlags flags,cl_buffer_create_type buffer_create_type,const void * buffer_create_info)2614*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateSubBuffer(cl_mem buffer,
2615*8975f5c5SAndroid Build Coastguard Worker MemFlags flags,
2616*8975f5c5SAndroid Build Coastguard Worker cl_buffer_create_type buffer_create_type,
2617*8975f5c5SAndroid Build Coastguard Worker const void *buffer_create_info)
2618*8975f5c5SAndroid Build Coastguard Worker {
2619*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if buffer is not a valid buffer object or is a sub-buffer object.
2620*8975f5c5SAndroid Build Coastguard Worker if (!Buffer::IsValid(buffer))
2621*8975f5c5SAndroid Build Coastguard Worker {
2622*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
2623*8975f5c5SAndroid Build Coastguard Worker }
2624*8975f5c5SAndroid Build Coastguard Worker const Buffer &buf = buffer->cast<Buffer>();
2625*8975f5c5SAndroid Build Coastguard Worker if (buf.isSubBuffer() || !buf.getContext().getPlatform().isVersionOrNewer(1u, 1u))
2626*8975f5c5SAndroid Build Coastguard Worker {
2627*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
2628*8975f5c5SAndroid Build Coastguard Worker }
2629*8975f5c5SAndroid Build Coastguard Worker
2630*8975f5c5SAndroid Build Coastguard Worker if (!ValidateMemoryFlags(flags, buf.getContext().getPlatform()))
2631*8975f5c5SAndroid Build Coastguard Worker {
2632*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2633*8975f5c5SAndroid Build Coastguard Worker }
2634*8975f5c5SAndroid Build Coastguard Worker
2635*8975f5c5SAndroid Build Coastguard Worker const MemFlags bufFlags = buf.getFlags();
2636*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if buffer was created with CL_MEM_WRITE_ONLY
2637*8975f5c5SAndroid Build Coastguard Worker // and flags specifies CL_MEM_READ_WRITE or CL_MEM_READ_ONLY,
2638*8975f5c5SAndroid Build Coastguard Worker if ((bufFlags.intersects(CL_MEM_WRITE_ONLY) &&
2639*8975f5c5SAndroid Build Coastguard Worker flags.intersects(CL_MEM_READ_WRITE | CL_MEM_READ_ONLY)) ||
2640*8975f5c5SAndroid Build Coastguard Worker // or if buffer was created with CL_MEM_READ_ONLY
2641*8975f5c5SAndroid Build Coastguard Worker // and flags specifies CL_MEM_READ_WRITE or CL_MEM_WRITE_ONLY,
2642*8975f5c5SAndroid Build Coastguard Worker (bufFlags.intersects(CL_MEM_READ_ONLY) &&
2643*8975f5c5SAndroid Build Coastguard Worker flags.intersects(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY)) ||
2644*8975f5c5SAndroid Build Coastguard Worker // or if flags specifies CL_MEM_USE_HOST_PTR, CL_MEM_ALLOC_HOST_PTR or CL_MEM_COPY_HOST_PTR.
2645*8975f5c5SAndroid Build Coastguard Worker flags.intersects(CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR))
2646*8975f5c5SAndroid Build Coastguard Worker {
2647*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2648*8975f5c5SAndroid Build Coastguard Worker }
2649*8975f5c5SAndroid Build Coastguard Worker
2650*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if buffer was created with CL_MEM_HOST_WRITE_ONLY
2651*8975f5c5SAndroid Build Coastguard Worker // and flags specify CL_MEM_HOST_READ_ONLY,
2652*8975f5c5SAndroid Build Coastguard Worker if ((bufFlags.intersects(CL_MEM_HOST_WRITE_ONLY) && flags.intersects(CL_MEM_HOST_READ_ONLY)) ||
2653*8975f5c5SAndroid Build Coastguard Worker // or if buffer was created with CL_MEM_HOST_READ_ONLY
2654*8975f5c5SAndroid Build Coastguard Worker // and flags specify CL_MEM_HOST_WRITE_ONLY,
2655*8975f5c5SAndroid Build Coastguard Worker (bufFlags.intersects(CL_MEM_HOST_READ_ONLY) && flags.intersects(CL_MEM_HOST_WRITE_ONLY)) ||
2656*8975f5c5SAndroid Build Coastguard Worker // or if buffer was created with CL_MEM_HOST_NO_ACCESS
2657*8975f5c5SAndroid Build Coastguard Worker // and flags specify CL_MEM_HOST_READ_ONLY or CL_MEM_HOST_WRITE_ONLY.
2658*8975f5c5SAndroid Build Coastguard Worker (bufFlags.intersects(CL_MEM_HOST_NO_ACCESS) &&
2659*8975f5c5SAndroid Build Coastguard Worker flags.intersects(CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_WRITE_ONLY)))
2660*8975f5c5SAndroid Build Coastguard Worker {
2661*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2662*8975f5c5SAndroid Build Coastguard Worker }
2663*8975f5c5SAndroid Build Coastguard Worker
2664*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if the value specified in buffer_create_type is not valid.
2665*8975f5c5SAndroid Build Coastguard Worker if (buffer_create_type != CL_BUFFER_CREATE_TYPE_REGION)
2666*8975f5c5SAndroid Build Coastguard Worker {
2667*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2668*8975f5c5SAndroid Build Coastguard Worker }
2669*8975f5c5SAndroid Build Coastguard Worker
2670*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if value(s) specified in buffer_create_info
2671*8975f5c5SAndroid Build Coastguard Worker // (for a given buffer_create_type) is not valid or if buffer_create_info is NULL.
2672*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if the region specified by the cl_buffer_region structure
2673*8975f5c5SAndroid Build Coastguard Worker // passed in buffer_create_info is out of bounds in buffer.
2674*8975f5c5SAndroid Build Coastguard Worker const cl_buffer_region *region = static_cast<const cl_buffer_region *>(buffer_create_info);
2675*8975f5c5SAndroid Build Coastguard Worker if (region == nullptr || !buf.isRegionValid(*region))
2676*8975f5c5SAndroid Build Coastguard Worker {
2677*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2678*8975f5c5SAndroid Build Coastguard Worker }
2679*8975f5c5SAndroid Build Coastguard Worker
2680*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_BUFFER_SIZE if the size field of the cl_buffer_region structure
2681*8975f5c5SAndroid Build Coastguard Worker // passed in buffer_create_info is 0.
2682*8975f5c5SAndroid Build Coastguard Worker if (region->size == 0u)
2683*8975f5c5SAndroid Build Coastguard Worker {
2684*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_BUFFER_SIZE;
2685*8975f5c5SAndroid Build Coastguard Worker }
2686*8975f5c5SAndroid Build Coastguard Worker
2687*8975f5c5SAndroid Build Coastguard Worker // CL_MISALIGNED_SUB_BUFFER_OFFSET when the sub-buffer object is created with an offset that is
2688*8975f5c5SAndroid Build Coastguard Worker // not aligned to CL_DEVICE_MEM_BASE_ADDR_ALIGN value (which is in bits!) for devices associated
2689*8975f5c5SAndroid Build Coastguard Worker // with the context.
2690*8975f5c5SAndroid Build Coastguard Worker const Memory &memory = buffer->cast<Memory>();
2691*8975f5c5SAndroid Build Coastguard Worker for (const DevicePtr &device : memory.getContext().getDevices())
2692*8975f5c5SAndroid Build Coastguard Worker {
2693*8975f5c5SAndroid Build Coastguard Worker if (region->origin % (device->getInfo().memBaseAddrAlign / CHAR_BIT) != 0)
2694*8975f5c5SAndroid Build Coastguard Worker {
2695*8975f5c5SAndroid Build Coastguard Worker return CL_MISALIGNED_SUB_BUFFER_OFFSET;
2696*8975f5c5SAndroid Build Coastguard Worker }
2697*8975f5c5SAndroid Build Coastguard Worker }
2698*8975f5c5SAndroid Build Coastguard Worker
2699*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2700*8975f5c5SAndroid Build Coastguard Worker }
2701*8975f5c5SAndroid Build Coastguard Worker
ValidateSetMemObjectDestructorCallback(cl_mem memobj,void (CL_CALLBACK * pfn_notify)(cl_mem memobj,void * user_data),const void * user_data)2702*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSetMemObjectDestructorCallback(cl_mem memobj,
2703*8975f5c5SAndroid Build Coastguard Worker void(CL_CALLBACK *pfn_notify)(cl_mem memobj,
2704*8975f5c5SAndroid Build Coastguard Worker void *user_data),
2705*8975f5c5SAndroid Build Coastguard Worker const void *user_data)
2706*8975f5c5SAndroid Build Coastguard Worker {
2707*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if memobj is not a valid memory object.
2708*8975f5c5SAndroid Build Coastguard Worker if (!Memory::IsValid(memobj))
2709*8975f5c5SAndroid Build Coastguard Worker {
2710*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
2711*8975f5c5SAndroid Build Coastguard Worker }
2712*8975f5c5SAndroid Build Coastguard Worker
2713*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if pfn_notify is NULL.
2714*8975f5c5SAndroid Build Coastguard Worker if (pfn_notify == nullptr)
2715*8975f5c5SAndroid Build Coastguard Worker {
2716*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2717*8975f5c5SAndroid Build Coastguard Worker }
2718*8975f5c5SAndroid Build Coastguard Worker
2719*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2720*8975f5c5SAndroid Build Coastguard Worker }
2721*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateUserEvent(cl_context context)2722*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateUserEvent(cl_context context)
2723*8975f5c5SAndroid Build Coastguard Worker {
2724*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
2725*8975f5c5SAndroid Build Coastguard Worker return Context::IsValidAndVersionOrNewer(context, 1u, 1u) ? CL_SUCCESS : CL_INVALID_CONTEXT;
2726*8975f5c5SAndroid Build Coastguard Worker }
2727*8975f5c5SAndroid Build Coastguard Worker
ValidateSetUserEventStatus(cl_event event,cl_int execution_status)2728*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSetUserEventStatus(cl_event event, cl_int execution_status)
2729*8975f5c5SAndroid Build Coastguard Worker {
2730*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_EVENT if event is not a valid user event object.
2731*8975f5c5SAndroid Build Coastguard Worker if (!Event::IsValid(event))
2732*8975f5c5SAndroid Build Coastguard Worker {
2733*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_EVENT;
2734*8975f5c5SAndroid Build Coastguard Worker }
2735*8975f5c5SAndroid Build Coastguard Worker const Event &evt = event->cast<Event>();
2736*8975f5c5SAndroid Build Coastguard Worker if (!evt.getContext().getPlatform().isVersionOrNewer(1u, 1u) ||
2737*8975f5c5SAndroid Build Coastguard Worker evt.getCommandType() != CL_COMMAND_USER)
2738*8975f5c5SAndroid Build Coastguard Worker {
2739*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_EVENT;
2740*8975f5c5SAndroid Build Coastguard Worker }
2741*8975f5c5SAndroid Build Coastguard Worker
2742*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if the execution_status is not CL_COMPLETE or a negative integer value.
2743*8975f5c5SAndroid Build Coastguard Worker if (execution_status != CL_COMPLETE && execution_status >= 0)
2744*8975f5c5SAndroid Build Coastguard Worker {
2745*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2746*8975f5c5SAndroid Build Coastguard Worker }
2747*8975f5c5SAndroid Build Coastguard Worker
2748*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if the execution_status for event has already been changed
2749*8975f5c5SAndroid Build Coastguard Worker // by a previous call to clSetUserEventStatus.
2750*8975f5c5SAndroid Build Coastguard Worker if (evt.wasStatusChanged())
2751*8975f5c5SAndroid Build Coastguard Worker {
2752*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
2753*8975f5c5SAndroid Build Coastguard Worker }
2754*8975f5c5SAndroid Build Coastguard Worker
2755*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2756*8975f5c5SAndroid Build Coastguard Worker }
2757*8975f5c5SAndroid Build Coastguard Worker
ValidateSetEventCallback(cl_event event,cl_int command_exec_callback_type,void (CL_CALLBACK * pfn_notify)(cl_event event,cl_int event_command_status,void * user_data),const void * user_data)2758*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSetEventCallback(cl_event event,
2759*8975f5c5SAndroid Build Coastguard Worker cl_int command_exec_callback_type,
2760*8975f5c5SAndroid Build Coastguard Worker void(CL_CALLBACK *pfn_notify)(cl_event event,
2761*8975f5c5SAndroid Build Coastguard Worker cl_int event_command_status,
2762*8975f5c5SAndroid Build Coastguard Worker void *user_data),
2763*8975f5c5SAndroid Build Coastguard Worker const void *user_data)
2764*8975f5c5SAndroid Build Coastguard Worker {
2765*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_EVENT if event is not a valid event object.
2766*8975f5c5SAndroid Build Coastguard Worker if (!Event::IsValid(event) ||
2767*8975f5c5SAndroid Build Coastguard Worker !event->cast<Event>().getContext().getPlatform().isVersionOrNewer(1u, 1u))
2768*8975f5c5SAndroid Build Coastguard Worker {
2769*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_EVENT;
2770*8975f5c5SAndroid Build Coastguard Worker }
2771*8975f5c5SAndroid Build Coastguard Worker
2772*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if pfn_event_notify is NULL
2773*8975f5c5SAndroid Build Coastguard Worker // or if command_exec_callback_type is not CL_SUBMITTED, CL_RUNNING, or CL_COMPLETE.
2774*8975f5c5SAndroid Build Coastguard Worker if (pfn_notify == nullptr ||
2775*8975f5c5SAndroid Build Coastguard Worker (command_exec_callback_type != CL_SUBMITTED && command_exec_callback_type != CL_RUNNING &&
2776*8975f5c5SAndroid Build Coastguard Worker command_exec_callback_type != CL_COMPLETE))
2777*8975f5c5SAndroid Build Coastguard Worker {
2778*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2779*8975f5c5SAndroid Build Coastguard Worker }
2780*8975f5c5SAndroid Build Coastguard Worker
2781*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2782*8975f5c5SAndroid Build Coastguard Worker }
2783*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueReadBufferRect(cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_read,const size_t * buffer_origin,const size_t * host_origin,const size_t * region,size_t buffer_row_pitch,size_t buffer_slice_pitch,size_t host_row_pitch,size_t host_slice_pitch,const void * ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)2784*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueReadBufferRect(cl_command_queue command_queue,
2785*8975f5c5SAndroid Build Coastguard Worker cl_mem buffer,
2786*8975f5c5SAndroid Build Coastguard Worker cl_bool blocking_read,
2787*8975f5c5SAndroid Build Coastguard Worker const size_t *buffer_origin,
2788*8975f5c5SAndroid Build Coastguard Worker const size_t *host_origin,
2789*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
2790*8975f5c5SAndroid Build Coastguard Worker size_t buffer_row_pitch,
2791*8975f5c5SAndroid Build Coastguard Worker size_t buffer_slice_pitch,
2792*8975f5c5SAndroid Build Coastguard Worker size_t host_row_pitch,
2793*8975f5c5SAndroid Build Coastguard Worker size_t host_slice_pitch,
2794*8975f5c5SAndroid Build Coastguard Worker const void *ptr,
2795*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
2796*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
2797*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
2798*8975f5c5SAndroid Build Coastguard Worker {
2799*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
2800*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
2801*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
2802*8975f5c5SAndroid Build Coastguard Worker if (!queue.getContext().getPlatform().isVersionOrNewer(1u, 1u))
2803*8975f5c5SAndroid Build Coastguard Worker {
2804*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
2805*8975f5c5SAndroid Build Coastguard Worker }
2806*8975f5c5SAndroid Build Coastguard Worker
2807*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueBuffer(queue, buffer, true, false));
2808*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateBufferRect(buffer->cast<Buffer>(), buffer_origin, region,
2809*8975f5c5SAndroid Build Coastguard Worker buffer_row_pitch, buffer_slice_pitch));
2810*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateHostRect(host_origin, region, host_row_pitch, host_slice_pitch, ptr));
2811*8975f5c5SAndroid Build Coastguard Worker
2812*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2813*8975f5c5SAndroid Build Coastguard Worker }
2814*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueWriteBufferRect(cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_write,const size_t * buffer_origin,const size_t * host_origin,const size_t * region,size_t buffer_row_pitch,size_t buffer_slice_pitch,size_t host_row_pitch,size_t host_slice_pitch,const void * ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)2815*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueWriteBufferRect(cl_command_queue command_queue,
2816*8975f5c5SAndroid Build Coastguard Worker cl_mem buffer,
2817*8975f5c5SAndroid Build Coastguard Worker cl_bool blocking_write,
2818*8975f5c5SAndroid Build Coastguard Worker const size_t *buffer_origin,
2819*8975f5c5SAndroid Build Coastguard Worker const size_t *host_origin,
2820*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
2821*8975f5c5SAndroid Build Coastguard Worker size_t buffer_row_pitch,
2822*8975f5c5SAndroid Build Coastguard Worker size_t buffer_slice_pitch,
2823*8975f5c5SAndroid Build Coastguard Worker size_t host_row_pitch,
2824*8975f5c5SAndroid Build Coastguard Worker size_t host_slice_pitch,
2825*8975f5c5SAndroid Build Coastguard Worker const void *ptr,
2826*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
2827*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
2828*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
2829*8975f5c5SAndroid Build Coastguard Worker {
2830*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
2831*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
2832*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
2833*8975f5c5SAndroid Build Coastguard Worker if (!queue.getContext().getPlatform().isVersionOrNewer(1u, 1u))
2834*8975f5c5SAndroid Build Coastguard Worker {
2835*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
2836*8975f5c5SAndroid Build Coastguard Worker }
2837*8975f5c5SAndroid Build Coastguard Worker
2838*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueBuffer(queue, buffer, false, true));
2839*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateBufferRect(buffer->cast<Buffer>(), buffer_origin, region,
2840*8975f5c5SAndroid Build Coastguard Worker buffer_row_pitch, buffer_slice_pitch));
2841*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateHostRect(host_origin, region, host_row_pitch, host_slice_pitch, ptr));
2842*8975f5c5SAndroid Build Coastguard Worker
2843*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2844*8975f5c5SAndroid Build Coastguard Worker }
2845*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueCopyBufferRect(cl_command_queue command_queue,cl_mem src_buffer,cl_mem dst_buffer,const size_t * src_origin,const size_t * dst_origin,const size_t * region,size_t src_row_pitch,size_t src_slice_pitch,size_t dst_row_pitch,size_t dst_slice_pitch,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)2846*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueCopyBufferRect(cl_command_queue command_queue,
2847*8975f5c5SAndroid Build Coastguard Worker cl_mem src_buffer,
2848*8975f5c5SAndroid Build Coastguard Worker cl_mem dst_buffer,
2849*8975f5c5SAndroid Build Coastguard Worker const size_t *src_origin,
2850*8975f5c5SAndroid Build Coastguard Worker const size_t *dst_origin,
2851*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
2852*8975f5c5SAndroid Build Coastguard Worker size_t src_row_pitch,
2853*8975f5c5SAndroid Build Coastguard Worker size_t src_slice_pitch,
2854*8975f5c5SAndroid Build Coastguard Worker size_t dst_row_pitch,
2855*8975f5c5SAndroid Build Coastguard Worker size_t dst_slice_pitch,
2856*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
2857*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
2858*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
2859*8975f5c5SAndroid Build Coastguard Worker {
2860*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
2861*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
2862*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
2863*8975f5c5SAndroid Build Coastguard Worker if (!queue.getContext().getPlatform().isVersionOrNewer(1u, 1u))
2864*8975f5c5SAndroid Build Coastguard Worker {
2865*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
2866*8975f5c5SAndroid Build Coastguard Worker }
2867*8975f5c5SAndroid Build Coastguard Worker
2868*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueBuffer(queue, src_buffer, false, false));
2869*8975f5c5SAndroid Build Coastguard Worker const Buffer &src = src_buffer->cast<Buffer>();
2870*8975f5c5SAndroid Build Coastguard Worker
2871*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueBuffer(queue, dst_buffer, false, false));
2872*8975f5c5SAndroid Build Coastguard Worker const Buffer &dst = dst_buffer->cast<Buffer>();
2873*8975f5c5SAndroid Build Coastguard Worker
2874*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateBufferRect(src, src_origin, region, src_row_pitch, src_slice_pitch));
2875*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateBufferRect(dst, dst_origin, region, dst_row_pitch, dst_slice_pitch));
2876*8975f5c5SAndroid Build Coastguard Worker
2877*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if src_buffer and dst_buffer are the same buffer object and src_slice_pitch
2878*8975f5c5SAndroid Build Coastguard Worker // is not equal to dst_slice_pitch or src_row_pitch is not equal to dst_row_pitch.
2879*8975f5c5SAndroid Build Coastguard Worker if (&src == &dst && (src_slice_pitch != dst_slice_pitch || src_row_pitch != dst_row_pitch))
2880*8975f5c5SAndroid Build Coastguard Worker {
2881*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2882*8975f5c5SAndroid Build Coastguard Worker }
2883*8975f5c5SAndroid Build Coastguard Worker
2884*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2885*8975f5c5SAndroid Build Coastguard Worker }
2886*8975f5c5SAndroid Build Coastguard Worker
2887*8975f5c5SAndroid Build Coastguard Worker // CL 1.2
ValidateCreateSubDevices(cl_device_id in_device,const cl_device_partition_property * properties,cl_uint num_devices,const cl_device_id * out_devices,const cl_uint * num_devices_ret)2888*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateSubDevices(cl_device_id in_device,
2889*8975f5c5SAndroid Build Coastguard Worker const cl_device_partition_property *properties,
2890*8975f5c5SAndroid Build Coastguard Worker cl_uint num_devices,
2891*8975f5c5SAndroid Build Coastguard Worker const cl_device_id *out_devices,
2892*8975f5c5SAndroid Build Coastguard Worker const cl_uint *num_devices_ret)
2893*8975f5c5SAndroid Build Coastguard Worker {
2894*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if in_device is not a valid device.
2895*8975f5c5SAndroid Build Coastguard Worker if (!Device::IsValid(in_device))
2896*8975f5c5SAndroid Build Coastguard Worker {
2897*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
2898*8975f5c5SAndroid Build Coastguard Worker }
2899*8975f5c5SAndroid Build Coastguard Worker const Device &device = in_device->cast<Device>();
2900*8975f5c5SAndroid Build Coastguard Worker if (!device.isVersionOrNewer(1u, 2u))
2901*8975f5c5SAndroid Build Coastguard Worker {
2902*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
2903*8975f5c5SAndroid Build Coastguard Worker }
2904*8975f5c5SAndroid Build Coastguard Worker
2905*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if values specified in properties are not valid
2906*8975f5c5SAndroid Build Coastguard Worker // or if values specified in properties are valid but not supported by the device
2907*8975f5c5SAndroid Build Coastguard Worker const std::vector<cl_device_partition_property> &devProps =
2908*8975f5c5SAndroid Build Coastguard Worker device.getInfo().partitionProperties;
2909*8975f5c5SAndroid Build Coastguard Worker if (properties == nullptr ||
2910*8975f5c5SAndroid Build Coastguard Worker std::find(devProps.cbegin(), devProps.cend(), *properties) == devProps.cend())
2911*8975f5c5SAndroid Build Coastguard Worker {
2912*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2913*8975f5c5SAndroid Build Coastguard Worker }
2914*8975f5c5SAndroid Build Coastguard Worker
2915*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2916*8975f5c5SAndroid Build Coastguard Worker }
2917*8975f5c5SAndroid Build Coastguard Worker
ValidateRetainDevice(cl_device_id device)2918*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateRetainDevice(cl_device_id device)
2919*8975f5c5SAndroid Build Coastguard Worker {
2920*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if device is not a valid device.
2921*8975f5c5SAndroid Build Coastguard Worker if (!Device::IsValid(device) || !device->cast<Device>().isVersionOrNewer(1u, 2u))
2922*8975f5c5SAndroid Build Coastguard Worker {
2923*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
2924*8975f5c5SAndroid Build Coastguard Worker }
2925*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2926*8975f5c5SAndroid Build Coastguard Worker }
2927*8975f5c5SAndroid Build Coastguard Worker
ValidateReleaseDevice(cl_device_id device)2928*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateReleaseDevice(cl_device_id device)
2929*8975f5c5SAndroid Build Coastguard Worker {
2930*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if device is not a valid device.
2931*8975f5c5SAndroid Build Coastguard Worker if (!Device::IsValid(device) || !device->cast<Device>().isVersionOrNewer(1u, 2u))
2932*8975f5c5SAndroid Build Coastguard Worker {
2933*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
2934*8975f5c5SAndroid Build Coastguard Worker }
2935*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
2936*8975f5c5SAndroid Build Coastguard Worker }
2937*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateImage(cl_context context,MemFlags flags,const cl_image_format * image_format,const cl_image_desc * image_desc,const void * host_ptr)2938*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateImage(cl_context context,
2939*8975f5c5SAndroid Build Coastguard Worker MemFlags flags,
2940*8975f5c5SAndroid Build Coastguard Worker const cl_image_format *image_format,
2941*8975f5c5SAndroid Build Coastguard Worker const cl_image_desc *image_desc,
2942*8975f5c5SAndroid Build Coastguard Worker const void *host_ptr)
2943*8975f5c5SAndroid Build Coastguard Worker {
2944*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
2945*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValidAndVersionOrNewer(context, 1u, 2u))
2946*8975f5c5SAndroid Build Coastguard Worker {
2947*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
2948*8975f5c5SAndroid Build Coastguard Worker }
2949*8975f5c5SAndroid Build Coastguard Worker const Context &ctx = context->cast<Context>();
2950*8975f5c5SAndroid Build Coastguard Worker
2951*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if values specified in flags are not valid.
2952*8975f5c5SAndroid Build Coastguard Worker if (!ValidateMemoryFlags(flags, ctx.getPlatform()))
2953*8975f5c5SAndroid Build Coastguard Worker {
2954*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
2955*8975f5c5SAndroid Build Coastguard Worker }
2956*8975f5c5SAndroid Build Coastguard Worker
2957*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_IMAGE_FORMAT_DESCRIPTOR if values specified in image_format are not valid
2958*8975f5c5SAndroid Build Coastguard Worker // or if image_format is NULL.
2959*8975f5c5SAndroid Build Coastguard Worker if (!IsValidImageFormat(image_format, ctx.getPlatform().getInfo()))
2960*8975f5c5SAndroid Build Coastguard Worker {
2961*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_FORMAT_DESCRIPTOR;
2962*8975f5c5SAndroid Build Coastguard Worker }
2963*8975f5c5SAndroid Build Coastguard Worker
2964*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_IMAGE_DESCRIPTOR if image_desc is NULL.
2965*8975f5c5SAndroid Build Coastguard Worker if (image_desc == nullptr)
2966*8975f5c5SAndroid Build Coastguard Worker {
2967*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
2968*8975f5c5SAndroid Build Coastguard Worker }
2969*8975f5c5SAndroid Build Coastguard Worker
2970*8975f5c5SAndroid Build Coastguard Worker const size_t elemSize = GetElementSize(*image_format);
2971*8975f5c5SAndroid Build Coastguard Worker if (elemSize == 0u)
2972*8975f5c5SAndroid Build Coastguard Worker {
2973*8975f5c5SAndroid Build Coastguard Worker ASSERT(false);
2974*8975f5c5SAndroid Build Coastguard Worker ERR() << "Failed to calculate image element size";
2975*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_FORMAT_DESCRIPTOR;
2976*8975f5c5SAndroid Build Coastguard Worker }
2977*8975f5c5SAndroid Build Coastguard Worker const size_t rowPitch = image_desc->image_row_pitch != 0u ? image_desc->image_row_pitch
2978*8975f5c5SAndroid Build Coastguard Worker : image_desc->image_width * elemSize;
2979*8975f5c5SAndroid Build Coastguard Worker const size_t imageHeight =
2980*8975f5c5SAndroid Build Coastguard Worker image_desc->image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY ? 1u : image_desc->image_height;
2981*8975f5c5SAndroid Build Coastguard Worker const size_t sliceSize = imageHeight * rowPitch;
2982*8975f5c5SAndroid Build Coastguard Worker
2983*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_IMAGE_DESCRIPTOR if values specified in image_desc are not valid.
2984*8975f5c5SAndroid Build Coastguard Worker switch (FromCLenum<MemObjectType>(image_desc->image_type))
2985*8975f5c5SAndroid Build Coastguard Worker {
2986*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D:
2987*8975f5c5SAndroid Build Coastguard Worker if (image_desc->image_width == 0u)
2988*8975f5c5SAndroid Build Coastguard Worker {
2989*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
2990*8975f5c5SAndroid Build Coastguard Worker }
2991*8975f5c5SAndroid Build Coastguard Worker break;
2992*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image2D:
2993*8975f5c5SAndroid Build Coastguard Worker if (image_desc->image_width == 0u || image_desc->image_height == 0u)
2994*8975f5c5SAndroid Build Coastguard Worker {
2995*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
2996*8975f5c5SAndroid Build Coastguard Worker }
2997*8975f5c5SAndroid Build Coastguard Worker break;
2998*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image3D:
2999*8975f5c5SAndroid Build Coastguard Worker if (image_desc->image_width == 0u || image_desc->image_height == 0u ||
3000*8975f5c5SAndroid Build Coastguard Worker image_desc->image_depth == 0u)
3001*8975f5c5SAndroid Build Coastguard Worker {
3002*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3003*8975f5c5SAndroid Build Coastguard Worker }
3004*8975f5c5SAndroid Build Coastguard Worker break;
3005*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D_Array:
3006*8975f5c5SAndroid Build Coastguard Worker if (image_desc->image_width == 0u || image_desc->image_array_size == 0u)
3007*8975f5c5SAndroid Build Coastguard Worker {
3008*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3009*8975f5c5SAndroid Build Coastguard Worker }
3010*8975f5c5SAndroid Build Coastguard Worker break;
3011*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image2D_Array:
3012*8975f5c5SAndroid Build Coastguard Worker if (image_desc->image_width == 0u || image_desc->image_height == 0u ||
3013*8975f5c5SAndroid Build Coastguard Worker image_desc->image_array_size == 0u)
3014*8975f5c5SAndroid Build Coastguard Worker {
3015*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3016*8975f5c5SAndroid Build Coastguard Worker }
3017*8975f5c5SAndroid Build Coastguard Worker break;
3018*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D_Buffer:
3019*8975f5c5SAndroid Build Coastguard Worker if (image_desc->image_width == 0u)
3020*8975f5c5SAndroid Build Coastguard Worker {
3021*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3022*8975f5c5SAndroid Build Coastguard Worker }
3023*8975f5c5SAndroid Build Coastguard Worker break;
3024*8975f5c5SAndroid Build Coastguard Worker default:
3025*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3026*8975f5c5SAndroid Build Coastguard Worker }
3027*8975f5c5SAndroid Build Coastguard Worker if (image_desc->image_row_pitch != 0u)
3028*8975f5c5SAndroid Build Coastguard Worker {
3029*8975f5c5SAndroid Build Coastguard Worker // image_row_pitch must be 0 if host_ptr is NULL.
3030*8975f5c5SAndroid Build Coastguard Worker if (host_ptr == nullptr)
3031*8975f5c5SAndroid Build Coastguard Worker {
3032*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3033*8975f5c5SAndroid Build Coastguard Worker }
3034*8975f5c5SAndroid Build Coastguard Worker // image_row_pitch can be either 0
3035*8975f5c5SAndroid Build Coastguard Worker // or >= image_width * size of element in bytes if host_ptr is not NULL.
3036*8975f5c5SAndroid Build Coastguard Worker if (image_desc->image_row_pitch < image_desc->image_width * elemSize)
3037*8975f5c5SAndroid Build Coastguard Worker {
3038*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3039*8975f5c5SAndroid Build Coastguard Worker }
3040*8975f5c5SAndroid Build Coastguard Worker // If image_row_pitch is not 0, it must be a multiple of the image element size in bytes.
3041*8975f5c5SAndroid Build Coastguard Worker if ((image_desc->image_row_pitch % elemSize) != 0u)
3042*8975f5c5SAndroid Build Coastguard Worker {
3043*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3044*8975f5c5SAndroid Build Coastguard Worker }
3045*8975f5c5SAndroid Build Coastguard Worker }
3046*8975f5c5SAndroid Build Coastguard Worker if (image_desc->image_slice_pitch != 0u)
3047*8975f5c5SAndroid Build Coastguard Worker {
3048*8975f5c5SAndroid Build Coastguard Worker // image_slice_pitch must be 0 if host_ptr is NULL.
3049*8975f5c5SAndroid Build Coastguard Worker if (host_ptr == nullptr)
3050*8975f5c5SAndroid Build Coastguard Worker {
3051*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3052*8975f5c5SAndroid Build Coastguard Worker }
3053*8975f5c5SAndroid Build Coastguard Worker // If host_ptr is not NULL, image_slice_pitch can be either 0
3054*8975f5c5SAndroid Build Coastguard Worker // or >= image_row_pitch * image_height for a 2D image array or 3D image
3055*8975f5c5SAndroid Build Coastguard Worker // and can be either 0 or >= image_row_pitch for a 1D image array.
3056*8975f5c5SAndroid Build Coastguard Worker if (image_desc->image_slice_pitch < sliceSize)
3057*8975f5c5SAndroid Build Coastguard Worker {
3058*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3059*8975f5c5SAndroid Build Coastguard Worker }
3060*8975f5c5SAndroid Build Coastguard Worker // If image_slice_pitch is not 0, it must be a multiple of the image_row_pitch.
3061*8975f5c5SAndroid Build Coastguard Worker if ((image_desc->image_slice_pitch % rowPitch) != 0u)
3062*8975f5c5SAndroid Build Coastguard Worker {
3063*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3064*8975f5c5SAndroid Build Coastguard Worker }
3065*8975f5c5SAndroid Build Coastguard Worker }
3066*8975f5c5SAndroid Build Coastguard Worker // num_mip_levels and num_samples must be 0.
3067*8975f5c5SAndroid Build Coastguard Worker if (image_desc->num_mip_levels != 0u || image_desc->num_samples != 0u)
3068*8975f5c5SAndroid Build Coastguard Worker {
3069*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3070*8975f5c5SAndroid Build Coastguard Worker }
3071*8975f5c5SAndroid Build Coastguard Worker // buffer can be a buffer memory object if image_type is CL_MEM_OBJECT_IMAGE1D_BUFFER or
3072*8975f5c5SAndroid Build Coastguard Worker // CL_MEM_OBJECT_IMAGE2D. buffer can be an image object if image_type is CL_MEM_OBJECT_IMAGE2D.
3073*8975f5c5SAndroid Build Coastguard Worker // Otherwise it must be NULL.
3074*8975f5c5SAndroid Build Coastguard Worker if (image_desc->buffer != nullptr &&
3075*8975f5c5SAndroid Build Coastguard Worker (!Buffer::IsValid(image_desc->buffer) ||
3076*8975f5c5SAndroid Build Coastguard Worker (image_desc->image_type != CL_MEM_OBJECT_IMAGE1D_BUFFER &&
3077*8975f5c5SAndroid Build Coastguard Worker image_desc->image_type != CL_MEM_OBJECT_IMAGE2D)) &&
3078*8975f5c5SAndroid Build Coastguard Worker (!Image::IsValid(image_desc->buffer) || image_desc->image_type != CL_MEM_OBJECT_IMAGE2D))
3079*8975f5c5SAndroid Build Coastguard Worker {
3080*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_DESCRIPTOR;
3081*8975f5c5SAndroid Build Coastguard Worker }
3082*8975f5c5SAndroid Build Coastguard Worker
3083*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if there are no devices in context that support images.
3084*8975f5c5SAndroid Build Coastguard Worker if (!ctx.supportsImages())
3085*8975f5c5SAndroid Build Coastguard Worker {
3086*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
3087*8975f5c5SAndroid Build Coastguard Worker }
3088*8975f5c5SAndroid Build Coastguard Worker
3089*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_IMAGE_SIZE if image dimensions specified in image_desc exceed the maximum
3090*8975f5c5SAndroid Build Coastguard Worker // image dimensions described in the Device Queries table for all devices in context.
3091*8975f5c5SAndroid Build Coastguard Worker const DevicePtrs &devices = ctx.getDevices();
3092*8975f5c5SAndroid Build Coastguard Worker if (std::find_if(devices.cbegin(), devices.cend(), [&](const DevicePtr &ptr) {
3093*8975f5c5SAndroid Build Coastguard Worker return ptr->supportsNativeImageDimensions(*image_desc);
3094*8975f5c5SAndroid Build Coastguard Worker }) == devices.cend())
3095*8975f5c5SAndroid Build Coastguard Worker {
3096*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_IMAGE_SIZE;
3097*8975f5c5SAndroid Build Coastguard Worker }
3098*8975f5c5SAndroid Build Coastguard Worker
3099*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_HOST_PTR
3100*8975f5c5SAndroid Build Coastguard Worker // if host_ptr is NULL and CL_MEM_USE_HOST_PTR or CL_MEM_COPY_HOST_PTR are set in flags or
3101*8975f5c5SAndroid Build Coastguard Worker // if host_ptr is not NULL but CL_MEM_COPY_HOST_PTR or CL_MEM_USE_HOST_PTR are not set in flags.
3102*8975f5c5SAndroid Build Coastguard Worker if ((host_ptr != nullptr) != flags.intersects(CL_MEM_USE_HOST_PTR | CL_MEM_COPY_HOST_PTR))
3103*8975f5c5SAndroid Build Coastguard Worker {
3104*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_HOST_PTR;
3105*8975f5c5SAndroid Build Coastguard Worker }
3106*8975f5c5SAndroid Build Coastguard Worker
3107*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3108*8975f5c5SAndroid Build Coastguard Worker }
3109*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateProgramWithBuiltInKernels(cl_context context,cl_uint num_devices,const cl_device_id * device_list,const char * kernel_names)3110*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateProgramWithBuiltInKernels(cl_context context,
3111*8975f5c5SAndroid Build Coastguard Worker cl_uint num_devices,
3112*8975f5c5SAndroid Build Coastguard Worker const cl_device_id *device_list,
3113*8975f5c5SAndroid Build Coastguard Worker const char *kernel_names)
3114*8975f5c5SAndroid Build Coastguard Worker {
3115*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
3116*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValidAndVersionOrNewer(context, 1u, 2u))
3117*8975f5c5SAndroid Build Coastguard Worker {
3118*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
3119*8975f5c5SAndroid Build Coastguard Worker }
3120*8975f5c5SAndroid Build Coastguard Worker const Context &ctx = context->cast<Context>();
3121*8975f5c5SAndroid Build Coastguard Worker
3122*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if device_list is NULL or num_devices is zero or if kernel_names is NULL.
3123*8975f5c5SAndroid Build Coastguard Worker if (device_list == nullptr || num_devices == 0u || kernel_names == nullptr)
3124*8975f5c5SAndroid Build Coastguard Worker {
3125*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3126*8975f5c5SAndroid Build Coastguard Worker }
3127*8975f5c5SAndroid Build Coastguard Worker
3128*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if any device in device_list
3129*8975f5c5SAndroid Build Coastguard Worker // is not in the list of devices associated with context.
3130*8975f5c5SAndroid Build Coastguard Worker for (size_t index = 0u; index < num_devices; ++index)
3131*8975f5c5SAndroid Build Coastguard Worker {
3132*8975f5c5SAndroid Build Coastguard Worker if (!ctx.hasDevice(device_list[index]))
3133*8975f5c5SAndroid Build Coastguard Worker {
3134*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
3135*8975f5c5SAndroid Build Coastguard Worker }
3136*8975f5c5SAndroid Build Coastguard Worker }
3137*8975f5c5SAndroid Build Coastguard Worker
3138*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if kernel_names contains a kernel name
3139*8975f5c5SAndroid Build Coastguard Worker // that is not supported by any of the devices in device_list.
3140*8975f5c5SAndroid Build Coastguard Worker const char *start = kernel_names;
3141*8975f5c5SAndroid Build Coastguard Worker do
3142*8975f5c5SAndroid Build Coastguard Worker {
3143*8975f5c5SAndroid Build Coastguard Worker const char *end = start;
3144*8975f5c5SAndroid Build Coastguard Worker while (*end != '\0' && *end != ';')
3145*8975f5c5SAndroid Build Coastguard Worker {
3146*8975f5c5SAndroid Build Coastguard Worker ++end;
3147*8975f5c5SAndroid Build Coastguard Worker }
3148*8975f5c5SAndroid Build Coastguard Worker const size_t length = end - start;
3149*8975f5c5SAndroid Build Coastguard Worker if (length != 0u && !ctx.supportsBuiltInKernel(std::string(start, length)))
3150*8975f5c5SAndroid Build Coastguard Worker {
3151*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3152*8975f5c5SAndroid Build Coastguard Worker }
3153*8975f5c5SAndroid Build Coastguard Worker start = end;
3154*8975f5c5SAndroid Build Coastguard Worker } while (*start++ != '\0');
3155*8975f5c5SAndroid Build Coastguard Worker
3156*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3157*8975f5c5SAndroid Build Coastguard Worker }
3158*8975f5c5SAndroid Build Coastguard Worker
ValidateCompileProgram(cl_program program,cl_uint num_devices,const cl_device_id * device_list,const char * options,cl_uint num_input_headers,const cl_program * input_headers,const char ** header_include_names,void (CL_CALLBACK * pfn_notify)(cl_program program,void * user_data),const void * user_data)3159*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCompileProgram(cl_program program,
3160*8975f5c5SAndroid Build Coastguard Worker cl_uint num_devices,
3161*8975f5c5SAndroid Build Coastguard Worker const cl_device_id *device_list,
3162*8975f5c5SAndroid Build Coastguard Worker const char *options,
3163*8975f5c5SAndroid Build Coastguard Worker cl_uint num_input_headers,
3164*8975f5c5SAndroid Build Coastguard Worker const cl_program *input_headers,
3165*8975f5c5SAndroid Build Coastguard Worker const char **header_include_names,
3166*8975f5c5SAndroid Build Coastguard Worker void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
3167*8975f5c5SAndroid Build Coastguard Worker const void *user_data)
3168*8975f5c5SAndroid Build Coastguard Worker {
3169*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROGRAM if program is not a valid program object.
3170*8975f5c5SAndroid Build Coastguard Worker if (!Program::IsValid(program))
3171*8975f5c5SAndroid Build Coastguard Worker {
3172*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
3173*8975f5c5SAndroid Build Coastguard Worker }
3174*8975f5c5SAndroid Build Coastguard Worker const Program &prog = program->cast<Program>();
3175*8975f5c5SAndroid Build Coastguard Worker if (!prog.getContext().getPlatform().isVersionOrNewer(1u, 2u))
3176*8975f5c5SAndroid Build Coastguard Worker {
3177*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
3178*8975f5c5SAndroid Build Coastguard Worker }
3179*8975f5c5SAndroid Build Coastguard Worker
3180*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if we do not have source code.
3181*8975f5c5SAndroid Build Coastguard Worker if (prog.getSource().empty())
3182*8975f5c5SAndroid Build Coastguard Worker {
3183*8975f5c5SAndroid Build Coastguard Worker ERR() << "No OpenCL C source available from program object (" << &prog << ")!";
3184*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
3185*8975f5c5SAndroid Build Coastguard Worker }
3186*8975f5c5SAndroid Build Coastguard Worker
3187*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if device_list is NULL and num_devices is greater than zero,
3188*8975f5c5SAndroid Build Coastguard Worker // or if device_list is not NULL and num_devices is zero.
3189*8975f5c5SAndroid Build Coastguard Worker if ((device_list != nullptr) != (num_devices != 0u))
3190*8975f5c5SAndroid Build Coastguard Worker {
3191*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3192*8975f5c5SAndroid Build Coastguard Worker }
3193*8975f5c5SAndroid Build Coastguard Worker
3194*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if any device in device_list
3195*8975f5c5SAndroid Build Coastguard Worker // is not in the list of devices associated with program.
3196*8975f5c5SAndroid Build Coastguard Worker while (num_devices-- != 0u)
3197*8975f5c5SAndroid Build Coastguard Worker {
3198*8975f5c5SAndroid Build Coastguard Worker if (!prog.hasDevice(*device_list++))
3199*8975f5c5SAndroid Build Coastguard Worker {
3200*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
3201*8975f5c5SAndroid Build Coastguard Worker }
3202*8975f5c5SAndroid Build Coastguard Worker }
3203*8975f5c5SAndroid Build Coastguard Worker
3204*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if num_input_headers is zero and header_include_names
3205*8975f5c5SAndroid Build Coastguard Worker // or input_headers are not NULL
3206*8975f5c5SAndroid Build Coastguard Worker // or if num_input_headers is not zero and header_include_names or input_headers are NULL.
3207*8975f5c5SAndroid Build Coastguard Worker if ((num_input_headers != 0u) != (header_include_names != nullptr) ||
3208*8975f5c5SAndroid Build Coastguard Worker (num_input_headers != 0u) != (input_headers != nullptr))
3209*8975f5c5SAndroid Build Coastguard Worker {
3210*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3211*8975f5c5SAndroid Build Coastguard Worker }
3212*8975f5c5SAndroid Build Coastguard Worker
3213*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if pfn_notify is NULL but user_data is not NULL.
3214*8975f5c5SAndroid Build Coastguard Worker if (pfn_notify == nullptr && user_data != nullptr)
3215*8975f5c5SAndroid Build Coastguard Worker {
3216*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3217*8975f5c5SAndroid Build Coastguard Worker }
3218*8975f5c5SAndroid Build Coastguard Worker
3219*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if the build of a program executable for any of the devices listed
3220*8975f5c5SAndroid Build Coastguard Worker // in device_list by a previous call to clBuildProgram for program has not completed.
3221*8975f5c5SAndroid Build Coastguard Worker if (prog.isBuilding())
3222*8975f5c5SAndroid Build Coastguard Worker {
3223*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
3224*8975f5c5SAndroid Build Coastguard Worker }
3225*8975f5c5SAndroid Build Coastguard Worker
3226*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if there are kernel objects attached to program.
3227*8975f5c5SAndroid Build Coastguard Worker if (prog.hasAttachedKernels())
3228*8975f5c5SAndroid Build Coastguard Worker {
3229*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
3230*8975f5c5SAndroid Build Coastguard Worker }
3231*8975f5c5SAndroid Build Coastguard Worker
3232*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3233*8975f5c5SAndroid Build Coastguard Worker }
3234*8975f5c5SAndroid Build Coastguard Worker
ValidateLinkProgram(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),const void * user_data)3235*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateLinkProgram(cl_context context,
3236*8975f5c5SAndroid Build Coastguard Worker cl_uint num_devices,
3237*8975f5c5SAndroid Build Coastguard Worker const cl_device_id *device_list,
3238*8975f5c5SAndroid Build Coastguard Worker const char *options,
3239*8975f5c5SAndroid Build Coastguard Worker cl_uint num_input_programs,
3240*8975f5c5SAndroid Build Coastguard Worker const cl_program *input_programs,
3241*8975f5c5SAndroid Build Coastguard Worker void(CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
3242*8975f5c5SAndroid Build Coastguard Worker const void *user_data)
3243*8975f5c5SAndroid Build Coastguard Worker {
3244*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
3245*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValidAndVersionOrNewer(context, 1u, 2u))
3246*8975f5c5SAndroid Build Coastguard Worker {
3247*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
3248*8975f5c5SAndroid Build Coastguard Worker }
3249*8975f5c5SAndroid Build Coastguard Worker const Context &ctx = context->cast<Context>();
3250*8975f5c5SAndroid Build Coastguard Worker
3251*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if the compilation or build of a program executable for any of the
3252*8975f5c5SAndroid Build Coastguard Worker // devices listed in device_list by a previous call to clCompileProgram or clBuildProgram for
3253*8975f5c5SAndroid Build Coastguard Worker // program has not completed.
3254*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < num_devices; ++i)
3255*8975f5c5SAndroid Build Coastguard Worker {
3256*8975f5c5SAndroid Build Coastguard Worker Device &device = device_list[i]->cast<Device>();
3257*8975f5c5SAndroid Build Coastguard Worker for (size_t j = 0; j < num_input_programs; ++j)
3258*8975f5c5SAndroid Build Coastguard Worker {
3259*8975f5c5SAndroid Build Coastguard Worker cl_build_status buildStatus = CL_BUILD_NONE;
3260*8975f5c5SAndroid Build Coastguard Worker Program &program = input_programs[j]->cast<Program>();
3261*8975f5c5SAndroid Build Coastguard Worker if (IsError(program.getBuildInfo(device.getNative(), ProgramBuildInfo::Status,
3262*8975f5c5SAndroid Build Coastguard Worker sizeof(cl_build_status), &buildStatus, nullptr)))
3263*8975f5c5SAndroid Build Coastguard Worker {
3264*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
3265*8975f5c5SAndroid Build Coastguard Worker }
3266*8975f5c5SAndroid Build Coastguard Worker
3267*8975f5c5SAndroid Build Coastguard Worker if (buildStatus != CL_BUILD_SUCCESS)
3268*8975f5c5SAndroid Build Coastguard Worker {
3269*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
3270*8975f5c5SAndroid Build Coastguard Worker }
3271*8975f5c5SAndroid Build Coastguard Worker }
3272*8975f5c5SAndroid Build Coastguard Worker }
3273*8975f5c5SAndroid Build Coastguard Worker
3274*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if the rules for devices containing compiled binaries or libraries as
3275*8975f5c5SAndroid Build Coastguard Worker // described in input_programs argument below are not followed.
3276*8975f5c5SAndroid Build Coastguard Worker //
3277*8975f5c5SAndroid Build Coastguard Worker // All programs specified by input_programs contain a compiled binary or library for the device.
3278*8975f5c5SAndroid Build Coastguard Worker // In this case, a link is performed to generate a program executable for this device.
3279*8975f5c5SAndroid Build Coastguard Worker //
3280*8975f5c5SAndroid Build Coastguard Worker // None of the programs contain a compiled binary or library for that device. In this case, no
3281*8975f5c5SAndroid Build Coastguard Worker // link is performed and there will be no program executable generated for this device.
3282*8975f5c5SAndroid Build Coastguard Worker //
3283*8975f5c5SAndroid Build Coastguard Worker // All other cases will return a CL_INVALID_OPERATION error.
3284*8975f5c5SAndroid Build Coastguard Worker BitField libraryOrObject(CL_PROGRAM_BINARY_TYPE_LIBRARY |
3285*8975f5c5SAndroid Build Coastguard Worker CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT);
3286*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < num_devices; ++i)
3287*8975f5c5SAndroid Build Coastguard Worker {
3288*8975f5c5SAndroid Build Coastguard Worker bool foundAnyLibraryOrObject = false;
3289*8975f5c5SAndroid Build Coastguard Worker Device &device = device_list[i]->cast<Device>();
3290*8975f5c5SAndroid Build Coastguard Worker for (size_t j = 0; j < num_input_programs; ++j)
3291*8975f5c5SAndroid Build Coastguard Worker {
3292*8975f5c5SAndroid Build Coastguard Worker cl_program_binary_type binaryType = CL_PROGRAM_BINARY_TYPE_NONE;
3293*8975f5c5SAndroid Build Coastguard Worker Program &program = input_programs[j]->cast<Program>();
3294*8975f5c5SAndroid Build Coastguard Worker if (IsError(program.getBuildInfo(device.getNative(), ProgramBuildInfo::BinaryType,
3295*8975f5c5SAndroid Build Coastguard Worker sizeof(cl_program_binary_type), &binaryType, nullptr)))
3296*8975f5c5SAndroid Build Coastguard Worker {
3297*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
3298*8975f5c5SAndroid Build Coastguard Worker }
3299*8975f5c5SAndroid Build Coastguard Worker
3300*8975f5c5SAndroid Build Coastguard Worker if (libraryOrObject.excludes(binaryType))
3301*8975f5c5SAndroid Build Coastguard Worker {
3302*8975f5c5SAndroid Build Coastguard Worker if (foundAnyLibraryOrObject)
3303*8975f5c5SAndroid Build Coastguard Worker {
3304*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
3305*8975f5c5SAndroid Build Coastguard Worker }
3306*8975f5c5SAndroid Build Coastguard Worker }
3307*8975f5c5SAndroid Build Coastguard Worker else
3308*8975f5c5SAndroid Build Coastguard Worker {
3309*8975f5c5SAndroid Build Coastguard Worker foundAnyLibraryOrObject = true;
3310*8975f5c5SAndroid Build Coastguard Worker }
3311*8975f5c5SAndroid Build Coastguard Worker }
3312*8975f5c5SAndroid Build Coastguard Worker }
3313*8975f5c5SAndroid Build Coastguard Worker
3314*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if device_list is NULL and num_devices is greater than zero,
3315*8975f5c5SAndroid Build Coastguard Worker // or if device_list is not NULL and num_devices is zero.
3316*8975f5c5SAndroid Build Coastguard Worker if ((device_list != nullptr) != (num_devices != 0u))
3317*8975f5c5SAndroid Build Coastguard Worker {
3318*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3319*8975f5c5SAndroid Build Coastguard Worker }
3320*8975f5c5SAndroid Build Coastguard Worker
3321*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if any device in device_list
3322*8975f5c5SAndroid Build Coastguard Worker // is not in the list of devices associated with context.
3323*8975f5c5SAndroid Build Coastguard Worker while (num_devices-- != 0u)
3324*8975f5c5SAndroid Build Coastguard Worker {
3325*8975f5c5SAndroid Build Coastguard Worker if (!ctx.hasDevice(*device_list++))
3326*8975f5c5SAndroid Build Coastguard Worker {
3327*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
3328*8975f5c5SAndroid Build Coastguard Worker }
3329*8975f5c5SAndroid Build Coastguard Worker }
3330*8975f5c5SAndroid Build Coastguard Worker
3331*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if num_input_programs is zero or input_programs is NULL.
3332*8975f5c5SAndroid Build Coastguard Worker if (num_input_programs == 0u || input_programs == nullptr)
3333*8975f5c5SAndroid Build Coastguard Worker {
3334*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3335*8975f5c5SAndroid Build Coastguard Worker }
3336*8975f5c5SAndroid Build Coastguard Worker
3337*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROGRAM if programs specified in input_programs are not valid program objects.
3338*8975f5c5SAndroid Build Coastguard Worker while (num_input_programs-- != 0u)
3339*8975f5c5SAndroid Build Coastguard Worker {
3340*8975f5c5SAndroid Build Coastguard Worker if (!Program::IsValid(*input_programs++))
3341*8975f5c5SAndroid Build Coastguard Worker {
3342*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROGRAM;
3343*8975f5c5SAndroid Build Coastguard Worker }
3344*8975f5c5SAndroid Build Coastguard Worker }
3345*8975f5c5SAndroid Build Coastguard Worker
3346*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if pfn_notify is NULL but user_data is not NULL.
3347*8975f5c5SAndroid Build Coastguard Worker if (pfn_notify == nullptr && user_data != nullptr)
3348*8975f5c5SAndroid Build Coastguard Worker {
3349*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3350*8975f5c5SAndroid Build Coastguard Worker }
3351*8975f5c5SAndroid Build Coastguard Worker
3352*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3353*8975f5c5SAndroid Build Coastguard Worker }
3354*8975f5c5SAndroid Build Coastguard Worker
ValidateUnloadPlatformCompiler(cl_platform_id platform)3355*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateUnloadPlatformCompiler(cl_platform_id platform)
3356*8975f5c5SAndroid Build Coastguard Worker {
3357*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PLATFORM if platform is not a valid platform.
3358*8975f5c5SAndroid Build Coastguard Worker if (!Platform::IsValid(platform) || !platform->cast<Platform>().isVersionOrNewer(1u, 2u))
3359*8975f5c5SAndroid Build Coastguard Worker {
3360*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PLATFORM;
3361*8975f5c5SAndroid Build Coastguard Worker }
3362*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3363*8975f5c5SAndroid Build Coastguard Worker }
3364*8975f5c5SAndroid Build Coastguard Worker
ValidateGetKernelArgInfo(cl_kernel kernel,cl_uint arg_index,KernelArgInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)3365*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetKernelArgInfo(cl_kernel kernel,
3366*8975f5c5SAndroid Build Coastguard Worker cl_uint arg_index,
3367*8975f5c5SAndroid Build Coastguard Worker KernelArgInfo param_name,
3368*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
3369*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
3370*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
3371*8975f5c5SAndroid Build Coastguard Worker {
3372*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_KERNEL if kernel is a not a valid kernel object.
3373*8975f5c5SAndroid Build Coastguard Worker if (!Kernel::IsValid(kernel))
3374*8975f5c5SAndroid Build Coastguard Worker {
3375*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_KERNEL;
3376*8975f5c5SAndroid Build Coastguard Worker }
3377*8975f5c5SAndroid Build Coastguard Worker const Kernel &krnl = kernel->cast<Kernel>();
3378*8975f5c5SAndroid Build Coastguard Worker if (!krnl.getProgram().getContext().getPlatform().isVersionOrNewer(1u, 2u))
3379*8975f5c5SAndroid Build Coastguard Worker {
3380*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_KERNEL;
3381*8975f5c5SAndroid Build Coastguard Worker }
3382*8975f5c5SAndroid Build Coastguard Worker
3383*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_ARG_INDEX if arg_index is not a valid argument index.
3384*8975f5c5SAndroid Build Coastguard Worker if (arg_index >= krnl.getInfo().args.size())
3385*8975f5c5SAndroid Build Coastguard Worker {
3386*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_ARG_INDEX;
3387*8975f5c5SAndroid Build Coastguard Worker }
3388*8975f5c5SAndroid Build Coastguard Worker
3389*8975f5c5SAndroid Build Coastguard Worker // CL_KERNEL_ARG_INFO_NOT_AVAILABLE if the argument information is not available for kernel.
3390*8975f5c5SAndroid Build Coastguard Worker if (!krnl.getInfo().args[arg_index].isAvailable())
3391*8975f5c5SAndroid Build Coastguard Worker {
3392*8975f5c5SAndroid Build Coastguard Worker return CL_KERNEL_ARG_INFO_NOT_AVAILABLE;
3393*8975f5c5SAndroid Build Coastguard Worker }
3394*8975f5c5SAndroid Build Coastguard Worker
3395*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if param_name is not valid.
3396*8975f5c5SAndroid Build Coastguard Worker if (param_name == KernelArgInfo::InvalidEnum)
3397*8975f5c5SAndroid Build Coastguard Worker {
3398*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3399*8975f5c5SAndroid Build Coastguard Worker }
3400*8975f5c5SAndroid Build Coastguard Worker
3401*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3402*8975f5c5SAndroid Build Coastguard Worker }
3403*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueFillBuffer(cl_command_queue command_queue,cl_mem buffer,const void * pattern,size_t pattern_size,size_t offset,size_t size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)3404*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueFillBuffer(cl_command_queue command_queue,
3405*8975f5c5SAndroid Build Coastguard Worker cl_mem buffer,
3406*8975f5c5SAndroid Build Coastguard Worker const void *pattern,
3407*8975f5c5SAndroid Build Coastguard Worker size_t pattern_size,
3408*8975f5c5SAndroid Build Coastguard Worker size_t offset,
3409*8975f5c5SAndroid Build Coastguard Worker size_t size,
3410*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
3411*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
3412*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
3413*8975f5c5SAndroid Build Coastguard Worker {
3414*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
3415*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
3416*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
3417*8975f5c5SAndroid Build Coastguard Worker if (!queue.getContext().getPlatform().isVersionOrNewer(1u, 2u))
3418*8975f5c5SAndroid Build Coastguard Worker {
3419*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
3420*8975f5c5SAndroid Build Coastguard Worker }
3421*8975f5c5SAndroid Build Coastguard Worker
3422*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueBuffer(queue, buffer, false, false));
3423*8975f5c5SAndroid Build Coastguard Worker
3424*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if offset or offset + size require accessing
3425*8975f5c5SAndroid Build Coastguard Worker // elements outside the buffer object respectively.
3426*8975f5c5SAndroid Build Coastguard Worker if (!buffer->cast<Buffer>().isRegionValid(offset, size))
3427*8975f5c5SAndroid Build Coastguard Worker {
3428*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3429*8975f5c5SAndroid Build Coastguard Worker }
3430*8975f5c5SAndroid Build Coastguard Worker
3431*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if pattern is NULL or if pattern_size is 0 or
3432*8975f5c5SAndroid Build Coastguard Worker // if pattern_size is not one of { 1, 2, 4, 8, 16, 32, 64, 128 }.
3433*8975f5c5SAndroid Build Coastguard Worker if (pattern == nullptr || pattern_size == 0u || pattern_size > 128u ||
3434*8975f5c5SAndroid Build Coastguard Worker (pattern_size & (pattern_size - 1u)) != 0u)
3435*8975f5c5SAndroid Build Coastguard Worker {
3436*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3437*8975f5c5SAndroid Build Coastguard Worker }
3438*8975f5c5SAndroid Build Coastguard Worker
3439*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if offset and size are not a multiple of pattern_size.
3440*8975f5c5SAndroid Build Coastguard Worker if ((offset % pattern_size) != 0u || (size % pattern_size) != 0u)
3441*8975f5c5SAndroid Build Coastguard Worker {
3442*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3443*8975f5c5SAndroid Build Coastguard Worker }
3444*8975f5c5SAndroid Build Coastguard Worker
3445*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3446*8975f5c5SAndroid Build Coastguard Worker }
3447*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueFillImage(cl_command_queue command_queue,cl_mem image,const void * fill_color,const size_t * origin,const size_t * region,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)3448*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueFillImage(cl_command_queue command_queue,
3449*8975f5c5SAndroid Build Coastguard Worker cl_mem image,
3450*8975f5c5SAndroid Build Coastguard Worker const void *fill_color,
3451*8975f5c5SAndroid Build Coastguard Worker const size_t *origin,
3452*8975f5c5SAndroid Build Coastguard Worker const size_t *region,
3453*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
3454*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
3455*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
3456*8975f5c5SAndroid Build Coastguard Worker {
3457*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, true,
3458*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
3459*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
3460*8975f5c5SAndroid Build Coastguard Worker if (!queue.getContext().getPlatform().isVersionOrNewer(1u, 2u))
3461*8975f5c5SAndroid Build Coastguard Worker {
3462*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
3463*8975f5c5SAndroid Build Coastguard Worker }
3464*8975f5c5SAndroid Build Coastguard Worker
3465*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateEnqueueImage(queue, image, false, false));
3466*8975f5c5SAndroid Build Coastguard Worker const Image &img = image->cast<Image>();
3467*8975f5c5SAndroid Build Coastguard Worker
3468*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateImageForDevice(img, queue.getDevice(), origin, region));
3469*8975f5c5SAndroid Build Coastguard Worker
3470*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if fill_color is NULL.
3471*8975f5c5SAndroid Build Coastguard Worker if (fill_color == nullptr)
3472*8975f5c5SAndroid Build Coastguard Worker {
3473*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3474*8975f5c5SAndroid Build Coastguard Worker }
3475*8975f5c5SAndroid Build Coastguard Worker
3476*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3477*8975f5c5SAndroid Build Coastguard Worker }
3478*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueMigrateMemObjects(cl_command_queue command_queue,cl_uint num_mem_objects,const cl_mem * mem_objects,MemMigrationFlags flags,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)3479*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueMigrateMemObjects(cl_command_queue command_queue,
3480*8975f5c5SAndroid Build Coastguard Worker cl_uint num_mem_objects,
3481*8975f5c5SAndroid Build Coastguard Worker const cl_mem *mem_objects,
3482*8975f5c5SAndroid Build Coastguard Worker MemMigrationFlags flags,
3483*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
3484*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
3485*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
3486*8975f5c5SAndroid Build Coastguard Worker {
3487*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
3488*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
3489*8975f5c5SAndroid Build Coastguard Worker const CommandQueue &queue = command_queue->cast<CommandQueue>();
3490*8975f5c5SAndroid Build Coastguard Worker if (!queue.getContext().getPlatform().isVersionOrNewer(1u, 2u))
3491*8975f5c5SAndroid Build Coastguard Worker {
3492*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
3493*8975f5c5SAndroid Build Coastguard Worker }
3494*8975f5c5SAndroid Build Coastguard Worker
3495*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if num_mem_objects is zero or if mem_objects is NULL.
3496*8975f5c5SAndroid Build Coastguard Worker if (num_mem_objects == 0u || mem_objects == nullptr)
3497*8975f5c5SAndroid Build Coastguard Worker {
3498*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3499*8975f5c5SAndroid Build Coastguard Worker }
3500*8975f5c5SAndroid Build Coastguard Worker
3501*8975f5c5SAndroid Build Coastguard Worker while (num_mem_objects-- != 0u)
3502*8975f5c5SAndroid Build Coastguard Worker {
3503*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_MEM_OBJECT if any of the memory objects
3504*8975f5c5SAndroid Build Coastguard Worker // in mem_objects is not a valid memory object.
3505*8975f5c5SAndroid Build Coastguard Worker if (!Memory::IsValid(*mem_objects))
3506*8975f5c5SAndroid Build Coastguard Worker {
3507*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_MEM_OBJECT;
3508*8975f5c5SAndroid Build Coastguard Worker }
3509*8975f5c5SAndroid Build Coastguard Worker
3510*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if the context associated with command_queue
3511*8975f5c5SAndroid Build Coastguard Worker // and memory objects in mem_objects are not the same.
3512*8975f5c5SAndroid Build Coastguard Worker if (&queue.getContext() != &(*mem_objects++)->cast<Memory>().getContext())
3513*8975f5c5SAndroid Build Coastguard Worker {
3514*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
3515*8975f5c5SAndroid Build Coastguard Worker }
3516*8975f5c5SAndroid Build Coastguard Worker }
3517*8975f5c5SAndroid Build Coastguard Worker
3518*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if flags is not 0 or is not any of the values described in the table.
3519*8975f5c5SAndroid Build Coastguard Worker const MemMigrationFlags allowedFlags(CL_MIGRATE_MEM_OBJECT_HOST |
3520*8975f5c5SAndroid Build Coastguard Worker CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED);
3521*8975f5c5SAndroid Build Coastguard Worker if (flags.hasOtherBitsThan(allowedFlags))
3522*8975f5c5SAndroid Build Coastguard Worker {
3523*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3524*8975f5c5SAndroid Build Coastguard Worker }
3525*8975f5c5SAndroid Build Coastguard Worker
3526*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3527*8975f5c5SAndroid Build Coastguard Worker }
3528*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueMarkerWithWaitList(cl_command_queue command_queue,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)3529*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueMarkerWithWaitList(cl_command_queue command_queue,
3530*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
3531*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
3532*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
3533*8975f5c5SAndroid Build Coastguard Worker {
3534*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
3535*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
3536*8975f5c5SAndroid Build Coastguard Worker if (!command_queue->cast<CommandQueue>().getContext().getPlatform().isVersionOrNewer(1u, 2u))
3537*8975f5c5SAndroid Build Coastguard Worker {
3538*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
3539*8975f5c5SAndroid Build Coastguard Worker }
3540*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3541*8975f5c5SAndroid Build Coastguard Worker }
3542*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueBarrierWithWaitList(cl_command_queue command_queue,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)3543*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueBarrierWithWaitList(cl_command_queue command_queue,
3544*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
3545*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
3546*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
3547*8975f5c5SAndroid Build Coastguard Worker {
3548*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCommandQueueAndEventWaitList(command_queue, false,
3549*8975f5c5SAndroid Build Coastguard Worker num_events_in_wait_list, event_wait_list));
3550*8975f5c5SAndroid Build Coastguard Worker if (!command_queue->cast<CommandQueue>().getContext().getPlatform().isVersionOrNewer(1u, 2u))
3551*8975f5c5SAndroid Build Coastguard Worker {
3552*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_COMMAND_QUEUE;
3553*8975f5c5SAndroid Build Coastguard Worker }
3554*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3555*8975f5c5SAndroid Build Coastguard Worker }
3556*8975f5c5SAndroid Build Coastguard Worker
ValidateGetExtensionFunctionAddressForPlatform(cl_platform_id platform,const char * func_name)3557*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetExtensionFunctionAddressForPlatform(cl_platform_id platform,
3558*8975f5c5SAndroid Build Coastguard Worker const char *func_name)
3559*8975f5c5SAndroid Build Coastguard Worker {
3560*8975f5c5SAndroid Build Coastguard Worker if (!Platform::IsValid(platform) || func_name == nullptr || *func_name == '\0')
3561*8975f5c5SAndroid Build Coastguard Worker {
3562*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3563*8975f5c5SAndroid Build Coastguard Worker }
3564*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3565*8975f5c5SAndroid Build Coastguard Worker }
3566*8975f5c5SAndroid Build Coastguard Worker
3567*8975f5c5SAndroid Build Coastguard Worker // CL 2.0
ValidateCreateCommandQueueWithProperties(cl_context context,cl_device_id device,const cl_queue_properties * properties)3568*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateCommandQueueWithProperties(cl_context context,
3569*8975f5c5SAndroid Build Coastguard Worker cl_device_id device,
3570*8975f5c5SAndroid Build Coastguard Worker const cl_queue_properties *properties)
3571*8975f5c5SAndroid Build Coastguard Worker {
3572*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
3573*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValidAndVersionOrNewer(context, 2u, 0u))
3574*8975f5c5SAndroid Build Coastguard Worker {
3575*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
3576*8975f5c5SAndroid Build Coastguard Worker }
3577*8975f5c5SAndroid Build Coastguard Worker
3578*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_DEVICE if device is not a valid device or is not associated with context.
3579*8975f5c5SAndroid Build Coastguard Worker if (!context->cast<Context>().hasDevice(device) ||
3580*8975f5c5SAndroid Build Coastguard Worker !device->cast<Device>().isVersionOrNewer(2u, 0u))
3581*8975f5c5SAndroid Build Coastguard Worker {
3582*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_DEVICE;
3583*8975f5c5SAndroid Build Coastguard Worker }
3584*8975f5c5SAndroid Build Coastguard Worker
3585*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if values specified in properties are not valid.
3586*8975f5c5SAndroid Build Coastguard Worker if (properties != nullptr)
3587*8975f5c5SAndroid Build Coastguard Worker {
3588*8975f5c5SAndroid Build Coastguard Worker bool isQueueOnDevice = false;
3589*8975f5c5SAndroid Build Coastguard Worker bool hasQueueSize = false;
3590*8975f5c5SAndroid Build Coastguard Worker while (*properties != 0)
3591*8975f5c5SAndroid Build Coastguard Worker {
3592*8975f5c5SAndroid Build Coastguard Worker switch (*properties++)
3593*8975f5c5SAndroid Build Coastguard Worker {
3594*8975f5c5SAndroid Build Coastguard Worker case CL_QUEUE_PROPERTIES:
3595*8975f5c5SAndroid Build Coastguard Worker {
3596*8975f5c5SAndroid Build Coastguard Worker const CommandQueueProperties props(*properties++);
3597*8975f5c5SAndroid Build Coastguard Worker const CommandQueueProperties validProps(
3598*8975f5c5SAndroid Build Coastguard Worker CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_PROFILING_ENABLE |
3599*8975f5c5SAndroid Build Coastguard Worker CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT);
3600*8975f5c5SAndroid Build Coastguard Worker if (props.hasOtherBitsThan(validProps) ||
3601*8975f5c5SAndroid Build Coastguard Worker // If CL_QUEUE_ON_DEVICE is set, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
3602*8975f5c5SAndroid Build Coastguard Worker // must also be set.
3603*8975f5c5SAndroid Build Coastguard Worker (props.intersects(CL_QUEUE_ON_DEVICE) &&
3604*8975f5c5SAndroid Build Coastguard Worker !props.intersects(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE)) ||
3605*8975f5c5SAndroid Build Coastguard Worker // CL_QUEUE_ON_DEVICE_DEFAULT can only be used with CL_QUEUE_ON_DEVICE.
3606*8975f5c5SAndroid Build Coastguard Worker (props.intersects(CL_QUEUE_ON_DEVICE_DEFAULT) &&
3607*8975f5c5SAndroid Build Coastguard Worker !props.intersects(CL_QUEUE_ON_DEVICE)))
3608*8975f5c5SAndroid Build Coastguard Worker {
3609*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3610*8975f5c5SAndroid Build Coastguard Worker }
3611*8975f5c5SAndroid Build Coastguard Worker isQueueOnDevice = props.intersects(CL_QUEUE_ON_DEVICE);
3612*8975f5c5SAndroid Build Coastguard Worker break;
3613*8975f5c5SAndroid Build Coastguard Worker }
3614*8975f5c5SAndroid Build Coastguard Worker case CL_QUEUE_SIZE:
3615*8975f5c5SAndroid Build Coastguard Worker {
3616*8975f5c5SAndroid Build Coastguard Worker // CL_QUEUE_SIZE must be a value <= CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE.
3617*8975f5c5SAndroid Build Coastguard Worker if (*properties++ > device->cast<Device>().getInfo().queueOnDeviceMaxSize)
3618*8975f5c5SAndroid Build Coastguard Worker {
3619*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3620*8975f5c5SAndroid Build Coastguard Worker }
3621*8975f5c5SAndroid Build Coastguard Worker hasQueueSize = true;
3622*8975f5c5SAndroid Build Coastguard Worker break;
3623*8975f5c5SAndroid Build Coastguard Worker }
3624*8975f5c5SAndroid Build Coastguard Worker default:
3625*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3626*8975f5c5SAndroid Build Coastguard Worker }
3627*8975f5c5SAndroid Build Coastguard Worker }
3628*8975f5c5SAndroid Build Coastguard Worker
3629*8975f5c5SAndroid Build Coastguard Worker // CL_QUEUE_SIZE can only be specified if CL_QUEUE_ON_DEVICE is set in CL_QUEUE_PROPERTIES.
3630*8975f5c5SAndroid Build Coastguard Worker if (hasQueueSize && !isQueueOnDevice)
3631*8975f5c5SAndroid Build Coastguard Worker {
3632*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3633*8975f5c5SAndroid Build Coastguard Worker }
3634*8975f5c5SAndroid Build Coastguard Worker }
3635*8975f5c5SAndroid Build Coastguard Worker
3636*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3637*8975f5c5SAndroid Build Coastguard Worker }
3638*8975f5c5SAndroid Build Coastguard Worker
ValidateCreatePipe(cl_context context,MemFlags flags,cl_uint pipe_packet_size,cl_uint pipe_max_packets,const cl_pipe_properties * properties)3639*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreatePipe(cl_context context,
3640*8975f5c5SAndroid Build Coastguard Worker MemFlags flags,
3641*8975f5c5SAndroid Build Coastguard Worker cl_uint pipe_packet_size,
3642*8975f5c5SAndroid Build Coastguard Worker cl_uint pipe_max_packets,
3643*8975f5c5SAndroid Build Coastguard Worker const cl_pipe_properties *properties)
3644*8975f5c5SAndroid Build Coastguard Worker {
3645*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3646*8975f5c5SAndroid Build Coastguard Worker }
3647*8975f5c5SAndroid Build Coastguard Worker
ValidateGetPipeInfo(cl_mem pipe,PipeInfo param_name,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)3648*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetPipeInfo(cl_mem pipe,
3649*8975f5c5SAndroid Build Coastguard Worker PipeInfo param_name,
3650*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
3651*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
3652*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
3653*8975f5c5SAndroid Build Coastguard Worker {
3654*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3655*8975f5c5SAndroid Build Coastguard Worker }
3656*8975f5c5SAndroid Build Coastguard Worker
ValidateSVMAlloc(cl_context context,SVM_MemFlags flags,size_t size,cl_uint alignment)3657*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSVMAlloc(cl_context context, SVM_MemFlags flags, size_t size, cl_uint alignment)
3658*8975f5c5SAndroid Build Coastguard Worker {
3659*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3660*8975f5c5SAndroid Build Coastguard Worker }
3661*8975f5c5SAndroid Build Coastguard Worker
ValidateSVMFree(cl_context context,const void * svm_pointer)3662*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSVMFree(cl_context context, const void *svm_pointer)
3663*8975f5c5SAndroid Build Coastguard Worker {
3664*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3665*8975f5c5SAndroid Build Coastguard Worker }
3666*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateSamplerWithProperties(cl_context context,const cl_sampler_properties * sampler_properties)3667*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateSamplerWithProperties(cl_context context,
3668*8975f5c5SAndroid Build Coastguard Worker const cl_sampler_properties *sampler_properties)
3669*8975f5c5SAndroid Build Coastguard Worker {
3670*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
3671*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValidAndVersionOrNewer(context, 2u, 0u))
3672*8975f5c5SAndroid Build Coastguard Worker {
3673*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
3674*8975f5c5SAndroid Build Coastguard Worker }
3675*8975f5c5SAndroid Build Coastguard Worker
3676*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if the property name in sampler_properties is not a supported property name,
3677*8975f5c5SAndroid Build Coastguard Worker // if the value specified for a supported property name is not valid,
3678*8975f5c5SAndroid Build Coastguard Worker // or if the same property name is specified more than once.
3679*8975f5c5SAndroid Build Coastguard Worker if (sampler_properties != nullptr)
3680*8975f5c5SAndroid Build Coastguard Worker {
3681*8975f5c5SAndroid Build Coastguard Worker bool hasNormalizedCoords = false;
3682*8975f5c5SAndroid Build Coastguard Worker bool hasAddressingMode = false;
3683*8975f5c5SAndroid Build Coastguard Worker bool hasFilterMode = false;
3684*8975f5c5SAndroid Build Coastguard Worker const cl_sampler_properties *propIt = sampler_properties;
3685*8975f5c5SAndroid Build Coastguard Worker while (*propIt != 0)
3686*8975f5c5SAndroid Build Coastguard Worker {
3687*8975f5c5SAndroid Build Coastguard Worker switch (*propIt++)
3688*8975f5c5SAndroid Build Coastguard Worker {
3689*8975f5c5SAndroid Build Coastguard Worker case CL_SAMPLER_NORMALIZED_COORDS:
3690*8975f5c5SAndroid Build Coastguard Worker if (hasNormalizedCoords || (*propIt != CL_FALSE && *propIt != CL_TRUE))
3691*8975f5c5SAndroid Build Coastguard Worker {
3692*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3693*8975f5c5SAndroid Build Coastguard Worker }
3694*8975f5c5SAndroid Build Coastguard Worker hasNormalizedCoords = true;
3695*8975f5c5SAndroid Build Coastguard Worker ++propIt;
3696*8975f5c5SAndroid Build Coastguard Worker break;
3697*8975f5c5SAndroid Build Coastguard Worker case CL_SAMPLER_ADDRESSING_MODE:
3698*8975f5c5SAndroid Build Coastguard Worker if (hasAddressingMode || FromCLenum<AddressingMode>(static_cast<CLenum>(
3699*8975f5c5SAndroid Build Coastguard Worker *propIt++)) == AddressingMode::InvalidEnum)
3700*8975f5c5SAndroid Build Coastguard Worker {
3701*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3702*8975f5c5SAndroid Build Coastguard Worker }
3703*8975f5c5SAndroid Build Coastguard Worker hasAddressingMode = true;
3704*8975f5c5SAndroid Build Coastguard Worker break;
3705*8975f5c5SAndroid Build Coastguard Worker case CL_SAMPLER_FILTER_MODE:
3706*8975f5c5SAndroid Build Coastguard Worker if (hasFilterMode || FromCLenum<FilterMode>(static_cast<CLenum>(*propIt++)) ==
3707*8975f5c5SAndroid Build Coastguard Worker FilterMode::InvalidEnum)
3708*8975f5c5SAndroid Build Coastguard Worker {
3709*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3710*8975f5c5SAndroid Build Coastguard Worker }
3711*8975f5c5SAndroid Build Coastguard Worker hasFilterMode = true;
3712*8975f5c5SAndroid Build Coastguard Worker break;
3713*8975f5c5SAndroid Build Coastguard Worker default:
3714*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3715*8975f5c5SAndroid Build Coastguard Worker }
3716*8975f5c5SAndroid Build Coastguard Worker }
3717*8975f5c5SAndroid Build Coastguard Worker }
3718*8975f5c5SAndroid Build Coastguard Worker
3719*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if images are not supported by any device associated with context.
3720*8975f5c5SAndroid Build Coastguard Worker if (!context->cast<Context>().supportsImages())
3721*8975f5c5SAndroid Build Coastguard Worker {
3722*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
3723*8975f5c5SAndroid Build Coastguard Worker }
3724*8975f5c5SAndroid Build Coastguard Worker
3725*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3726*8975f5c5SAndroid Build Coastguard Worker }
3727*8975f5c5SAndroid Build Coastguard Worker
ValidateSetKernelArgSVMPointer(cl_kernel kernel,cl_uint arg_index,const void * arg_value)3728*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSetKernelArgSVMPointer(cl_kernel kernel, cl_uint arg_index, const void *arg_value)
3729*8975f5c5SAndroid Build Coastguard Worker {
3730*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3731*8975f5c5SAndroid Build Coastguard Worker }
3732*8975f5c5SAndroid Build Coastguard Worker
ValidateSetKernelExecInfo(cl_kernel kernel,KernelExecInfo param_name,size_t param_value_size,const void * param_value)3733*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSetKernelExecInfo(cl_kernel kernel,
3734*8975f5c5SAndroid Build Coastguard Worker KernelExecInfo param_name,
3735*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
3736*8975f5c5SAndroid Build Coastguard Worker const void *param_value)
3737*8975f5c5SAndroid Build Coastguard Worker {
3738*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3739*8975f5c5SAndroid Build Coastguard Worker }
3740*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueSVMFree(cl_command_queue command_queue,cl_uint num_svm_pointers,void * const svm_pointers[],void (CL_CALLBACK * pfn_free_func)(cl_command_queue queue,cl_uint num_svm_pointers,void * svm_pointers[],void * user_data),const void * user_data,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)3741*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueSVMFree(cl_command_queue command_queue,
3742*8975f5c5SAndroid Build Coastguard Worker cl_uint num_svm_pointers,
3743*8975f5c5SAndroid Build Coastguard Worker void *const svm_pointers[],
3744*8975f5c5SAndroid Build Coastguard Worker void(CL_CALLBACK *pfn_free_func)(cl_command_queue queue,
3745*8975f5c5SAndroid Build Coastguard Worker cl_uint num_svm_pointers,
3746*8975f5c5SAndroid Build Coastguard Worker void *svm_pointers[],
3747*8975f5c5SAndroid Build Coastguard Worker void *user_data),
3748*8975f5c5SAndroid Build Coastguard Worker const void *user_data,
3749*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
3750*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
3751*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
3752*8975f5c5SAndroid Build Coastguard Worker {
3753*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3754*8975f5c5SAndroid Build Coastguard Worker }
3755*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueSVMMemcpy(cl_command_queue command_queue,cl_bool blocking_copy,const void * dst_ptr,const void * src_ptr,size_t size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)3756*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueSVMMemcpy(cl_command_queue command_queue,
3757*8975f5c5SAndroid Build Coastguard Worker cl_bool blocking_copy,
3758*8975f5c5SAndroid Build Coastguard Worker const void *dst_ptr,
3759*8975f5c5SAndroid Build Coastguard Worker const void *src_ptr,
3760*8975f5c5SAndroid Build Coastguard Worker size_t size,
3761*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
3762*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
3763*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
3764*8975f5c5SAndroid Build Coastguard Worker {
3765*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3766*8975f5c5SAndroid Build Coastguard Worker }
3767*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueSVMMemFill(cl_command_queue command_queue,const void * svm_ptr,const void * pattern,size_t pattern_size,size_t size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)3768*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueSVMMemFill(cl_command_queue command_queue,
3769*8975f5c5SAndroid Build Coastguard Worker const void *svm_ptr,
3770*8975f5c5SAndroid Build Coastguard Worker const void *pattern,
3771*8975f5c5SAndroid Build Coastguard Worker size_t pattern_size,
3772*8975f5c5SAndroid Build Coastguard Worker size_t size,
3773*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
3774*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
3775*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
3776*8975f5c5SAndroid Build Coastguard Worker {
3777*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3778*8975f5c5SAndroid Build Coastguard Worker }
3779*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueSVMMap(cl_command_queue command_queue,cl_bool blocking_map,MapFlags flags,const void * svm_ptr,size_t size,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)3780*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueSVMMap(cl_command_queue command_queue,
3781*8975f5c5SAndroid Build Coastguard Worker cl_bool blocking_map,
3782*8975f5c5SAndroid Build Coastguard Worker MapFlags flags,
3783*8975f5c5SAndroid Build Coastguard Worker const void *svm_ptr,
3784*8975f5c5SAndroid Build Coastguard Worker size_t size,
3785*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
3786*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
3787*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
3788*8975f5c5SAndroid Build Coastguard Worker {
3789*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3790*8975f5c5SAndroid Build Coastguard Worker }
3791*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueSVMUnmap(cl_command_queue command_queue,const void * svm_ptr,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)3792*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueSVMUnmap(cl_command_queue command_queue,
3793*8975f5c5SAndroid Build Coastguard Worker const void *svm_ptr,
3794*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
3795*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
3796*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
3797*8975f5c5SAndroid Build Coastguard Worker {
3798*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3799*8975f5c5SAndroid Build Coastguard Worker }
3800*8975f5c5SAndroid Build Coastguard Worker
3801*8975f5c5SAndroid Build Coastguard Worker // CL 2.1
ValidateSetDefaultDeviceCommandQueue(cl_context context,cl_device_id device,cl_command_queue command_queue)3802*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSetDefaultDeviceCommandQueue(cl_context context,
3803*8975f5c5SAndroid Build Coastguard Worker cl_device_id device,
3804*8975f5c5SAndroid Build Coastguard Worker cl_command_queue command_queue)
3805*8975f5c5SAndroid Build Coastguard Worker {
3806*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3807*8975f5c5SAndroid Build Coastguard Worker }
3808*8975f5c5SAndroid Build Coastguard Worker
ValidateGetDeviceAndHostTimer(cl_device_id device,const cl_ulong * device_timestamp,const cl_ulong * host_timestamp)3809*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetDeviceAndHostTimer(cl_device_id device,
3810*8975f5c5SAndroid Build Coastguard Worker const cl_ulong *device_timestamp,
3811*8975f5c5SAndroid Build Coastguard Worker const cl_ulong *host_timestamp)
3812*8975f5c5SAndroid Build Coastguard Worker {
3813*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3814*8975f5c5SAndroid Build Coastguard Worker }
3815*8975f5c5SAndroid Build Coastguard Worker
ValidateGetHostTimer(cl_device_id device,const cl_ulong * host_timestamp)3816*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetHostTimer(cl_device_id device, const cl_ulong *host_timestamp)
3817*8975f5c5SAndroid Build Coastguard Worker {
3818*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3819*8975f5c5SAndroid Build Coastguard Worker }
3820*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateProgramWithIL(cl_context context,const void * il,size_t length)3821*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateProgramWithIL(cl_context context, const void *il, size_t length)
3822*8975f5c5SAndroid Build Coastguard Worker {
3823*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
3824*8975f5c5SAndroid Build Coastguard Worker if (!Context::IsValidAndVersionOrNewer(context, 2u, 1u))
3825*8975f5c5SAndroid Build Coastguard Worker {
3826*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
3827*8975f5c5SAndroid Build Coastguard Worker }
3828*8975f5c5SAndroid Build Coastguard Worker const Context &ctx = context->cast<Context>();
3829*8975f5c5SAndroid Build Coastguard Worker
3830*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_OPERATION if no devices in context support intermediate language programs.
3831*8975f5c5SAndroid Build Coastguard Worker if (!ctx.supportsIL())
3832*8975f5c5SAndroid Build Coastguard Worker {
3833*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_OPERATION;
3834*8975f5c5SAndroid Build Coastguard Worker }
3835*8975f5c5SAndroid Build Coastguard Worker
3836*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if il is NULL or if length is zero.
3837*8975f5c5SAndroid Build Coastguard Worker if (il == nullptr || length == 0u)
3838*8975f5c5SAndroid Build Coastguard Worker {
3839*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3840*8975f5c5SAndroid Build Coastguard Worker }
3841*8975f5c5SAndroid Build Coastguard Worker
3842*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3843*8975f5c5SAndroid Build Coastguard Worker }
3844*8975f5c5SAndroid Build Coastguard Worker
ValidateCloneKernel(cl_kernel source_kernel)3845*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCloneKernel(cl_kernel source_kernel)
3846*8975f5c5SAndroid Build Coastguard Worker {
3847*8975f5c5SAndroid Build Coastguard Worker if (!Kernel::IsValid(source_kernel))
3848*8975f5c5SAndroid Build Coastguard Worker {
3849*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_KERNEL;
3850*8975f5c5SAndroid Build Coastguard Worker }
3851*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3852*8975f5c5SAndroid Build Coastguard Worker }
3853*8975f5c5SAndroid Build Coastguard Worker
ValidateGetKernelSubGroupInfo(cl_kernel kernel,cl_device_id device,KernelSubGroupInfo param_name,size_t input_value_size,const void * input_value,size_t param_value_size,const void * param_value,const size_t * param_value_size_ret)3854*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateGetKernelSubGroupInfo(cl_kernel kernel,
3855*8975f5c5SAndroid Build Coastguard Worker cl_device_id device,
3856*8975f5c5SAndroid Build Coastguard Worker KernelSubGroupInfo param_name,
3857*8975f5c5SAndroid Build Coastguard Worker size_t input_value_size,
3858*8975f5c5SAndroid Build Coastguard Worker const void *input_value,
3859*8975f5c5SAndroid Build Coastguard Worker size_t param_value_size,
3860*8975f5c5SAndroid Build Coastguard Worker const void *param_value,
3861*8975f5c5SAndroid Build Coastguard Worker const size_t *param_value_size_ret)
3862*8975f5c5SAndroid Build Coastguard Worker {
3863*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3864*8975f5c5SAndroid Build Coastguard Worker }
3865*8975f5c5SAndroid Build Coastguard Worker
ValidateEnqueueSVMMigrateMem(cl_command_queue command_queue,cl_uint num_svm_pointers,const void ** svm_pointers,const size_t * sizes,MemMigrationFlags flags,cl_uint num_events_in_wait_list,const cl_event * event_wait_list,const cl_event * event)3866*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateEnqueueSVMMigrateMem(cl_command_queue command_queue,
3867*8975f5c5SAndroid Build Coastguard Worker cl_uint num_svm_pointers,
3868*8975f5c5SAndroid Build Coastguard Worker const void **svm_pointers,
3869*8975f5c5SAndroid Build Coastguard Worker const size_t *sizes,
3870*8975f5c5SAndroid Build Coastguard Worker MemMigrationFlags flags,
3871*8975f5c5SAndroid Build Coastguard Worker cl_uint num_events_in_wait_list,
3872*8975f5c5SAndroid Build Coastguard Worker const cl_event *event_wait_list,
3873*8975f5c5SAndroid Build Coastguard Worker const cl_event *event)
3874*8975f5c5SAndroid Build Coastguard Worker {
3875*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3876*8975f5c5SAndroid Build Coastguard Worker }
3877*8975f5c5SAndroid Build Coastguard Worker
3878*8975f5c5SAndroid Build Coastguard Worker // CL 2.2
ValidateSetProgramReleaseCallback(cl_program program,void (CL_CALLBACK * pfn_notify)(cl_program program,void * user_data),const void * user_data)3879*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSetProgramReleaseCallback(cl_program program,
3880*8975f5c5SAndroid Build Coastguard Worker void(CL_CALLBACK *pfn_notify)(cl_program program,
3881*8975f5c5SAndroid Build Coastguard Worker void *user_data),
3882*8975f5c5SAndroid Build Coastguard Worker const void *user_data)
3883*8975f5c5SAndroid Build Coastguard Worker {
3884*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3885*8975f5c5SAndroid Build Coastguard Worker }
3886*8975f5c5SAndroid Build Coastguard Worker
ValidateSetProgramSpecializationConstant(cl_program program,cl_uint spec_id,size_t spec_size,const void * spec_value)3887*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSetProgramSpecializationConstant(cl_program program,
3888*8975f5c5SAndroid Build Coastguard Worker cl_uint spec_id,
3889*8975f5c5SAndroid Build Coastguard Worker size_t spec_size,
3890*8975f5c5SAndroid Build Coastguard Worker const void *spec_value)
3891*8975f5c5SAndroid Build Coastguard Worker {
3892*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3893*8975f5c5SAndroid Build Coastguard Worker }
3894*8975f5c5SAndroid Build Coastguard Worker
3895*8975f5c5SAndroid Build Coastguard Worker // CL 3.0
ValidateSetContextDestructorCallback(cl_context context,void (CL_CALLBACK * pfn_notify)(cl_context context,void * user_data),const void * user_data)3896*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateSetContextDestructorCallback(cl_context context,
3897*8975f5c5SAndroid Build Coastguard Worker void(CL_CALLBACK *pfn_notify)(cl_context context,
3898*8975f5c5SAndroid Build Coastguard Worker void *user_data),
3899*8975f5c5SAndroid Build Coastguard Worker const void *user_data)
3900*8975f5c5SAndroid Build Coastguard Worker {
3901*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3902*8975f5c5SAndroid Build Coastguard Worker }
3903*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateBufferWithProperties(cl_context context,const cl_mem_properties * properties,MemFlags flags,size_t size,const void * host_ptr)3904*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateBufferWithProperties(cl_context context,
3905*8975f5c5SAndroid Build Coastguard Worker const cl_mem_properties *properties,
3906*8975f5c5SAndroid Build Coastguard Worker MemFlags flags,
3907*8975f5c5SAndroid Build Coastguard Worker size_t size,
3908*8975f5c5SAndroid Build Coastguard Worker const void *host_ptr)
3909*8975f5c5SAndroid Build Coastguard Worker {
3910*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCreateBuffer(context, flags, size, host_ptr));
3911*8975f5c5SAndroid Build Coastguard Worker
3912*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
3913*8975f5c5SAndroid Build Coastguard Worker if (!context->cast<Context>().getPlatform().isVersionOrNewer(3u, 0u))
3914*8975f5c5SAndroid Build Coastguard Worker {
3915*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
3916*8975f5c5SAndroid Build Coastguard Worker }
3917*8975f5c5SAndroid Build Coastguard Worker
3918*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROPERTY if a property name in properties is not a supported property name,
3919*8975f5c5SAndroid Build Coastguard Worker // if the value specified for a supported property name is not valid,
3920*8975f5c5SAndroid Build Coastguard Worker // or if the same property name is specified more than once.
3921*8975f5c5SAndroid Build Coastguard Worker if (!ValidateMemoryProperties(properties))
3922*8975f5c5SAndroid Build Coastguard Worker {
3923*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROPERTY;
3924*8975f5c5SAndroid Build Coastguard Worker }
3925*8975f5c5SAndroid Build Coastguard Worker
3926*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3927*8975f5c5SAndroid Build Coastguard Worker }
3928*8975f5c5SAndroid Build Coastguard Worker
ValidateCreateImageWithProperties(cl_context context,const cl_mem_properties * properties,MemFlags flags,const cl_image_format * image_format,const cl_image_desc * image_desc,const void * host_ptr)3929*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateCreateImageWithProperties(cl_context context,
3930*8975f5c5SAndroid Build Coastguard Worker const cl_mem_properties *properties,
3931*8975f5c5SAndroid Build Coastguard Worker MemFlags flags,
3932*8975f5c5SAndroid Build Coastguard Worker const cl_image_format *image_format,
3933*8975f5c5SAndroid Build Coastguard Worker const cl_image_desc *image_desc,
3934*8975f5c5SAndroid Build Coastguard Worker const void *host_ptr)
3935*8975f5c5SAndroid Build Coastguard Worker {
3936*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE(ValidateCreateImage(context, flags, image_format, image_desc, host_ptr));
3937*8975f5c5SAndroid Build Coastguard Worker
3938*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_CONTEXT if context is not a valid context.
3939*8975f5c5SAndroid Build Coastguard Worker if (!context->cast<Context>().getPlatform().isVersionOrNewer(3u, 0u))
3940*8975f5c5SAndroid Build Coastguard Worker {
3941*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_CONTEXT;
3942*8975f5c5SAndroid Build Coastguard Worker }
3943*8975f5c5SAndroid Build Coastguard Worker
3944*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_PROPERTY if a property name in properties is not a supported property name,
3945*8975f5c5SAndroid Build Coastguard Worker // if the value specified for a supported property name is not valid,
3946*8975f5c5SAndroid Build Coastguard Worker // or if the same property name is specified more than once.
3947*8975f5c5SAndroid Build Coastguard Worker if (!ValidateMemoryProperties(properties))
3948*8975f5c5SAndroid Build Coastguard Worker {
3949*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_PROPERTY;
3950*8975f5c5SAndroid Build Coastguard Worker }
3951*8975f5c5SAndroid Build Coastguard Worker
3952*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3953*8975f5c5SAndroid Build Coastguard Worker }
3954*8975f5c5SAndroid Build Coastguard Worker
3955*8975f5c5SAndroid Build Coastguard Worker // cl_khr_icd
ValidateIcdGetPlatformIDsKHR(cl_uint num_entries,const cl_platform_id * platforms,const cl_uint * num_platforms)3956*8975f5c5SAndroid Build Coastguard Worker cl_int ValidateIcdGetPlatformIDsKHR(cl_uint num_entries,
3957*8975f5c5SAndroid Build Coastguard Worker const cl_platform_id *platforms,
3958*8975f5c5SAndroid Build Coastguard Worker const cl_uint *num_platforms)
3959*8975f5c5SAndroid Build Coastguard Worker {
3960*8975f5c5SAndroid Build Coastguard Worker if ((num_entries == 0u && platforms != nullptr) ||
3961*8975f5c5SAndroid Build Coastguard Worker (platforms == nullptr && num_platforms == nullptr))
3962*8975f5c5SAndroid Build Coastguard Worker {
3963*8975f5c5SAndroid Build Coastguard Worker return CL_INVALID_VALUE;
3964*8975f5c5SAndroid Build Coastguard Worker }
3965*8975f5c5SAndroid Build Coastguard Worker return CL_SUCCESS;
3966*8975f5c5SAndroid Build Coastguard Worker }
3967*8975f5c5SAndroid Build Coastguard Worker
3968*8975f5c5SAndroid Build Coastguard Worker } // namespace cl
3969