Newer
Older
// Wrap CL constants and errors
//
// Copyright (C) 2009 Andreas Kloeckner
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
Andreas Klöckner
committed
#define NO_IMPORT_ARRAY
#define PY_ARRAY_UNIQUE_SYMBOL pyopencl_ARRAY_API
#include "wrap_cl.hpp"
using namespace pyopencl;
namespace
{
// {{{ 'fake' constant scopes
class status_code { };
class platform_info { };
class device_type { };
class device_info { };
class device_topology_type_amd { };
class device_fp_config { };
class device_mem_cache_type { };
class device_local_mem_type { };
class device_exec_capabilities { };
class command_queue_properties { };
class context_info { };
class gl_context_info { };
class context_properties { };
class command_queue_info { };
class channel_order { };
class channel_type { };
class mem_object_type { };
class mem_info { };
class image_info { };
class addressing_mode { };
class filter_mode { };
class sampler_info { };
class map_flags { };
class program_info { };
class program_build_info { };
class program_binary_type { };
class build_status { };
class kernel_info { };
class kernel_arg_info { };
class kernel_arg_address_qualifier { };
class kernel_arg_access_qualifier { };
class event_info { };
class command_type { };
class command_execution_status { };
class profiling_info { };
class buffer_create_type { };
class mem_migration_flags { };
class device_partition_property { };
class device_affinity_domain { };
class device_device_enqueue_capabilities { };
class version_bits { };
class khronos_vendor_id { };
class gl_object_type { };
class gl_texture_info { };
// }}}
}
void pyopencl_expose_constants(py::module_ &m)
static py::exception<pyopencl::error> CL##NAME(m, #NAME, BASE);
DECLARE_EXC(Error, PyExc_Exception);
DECLARE_EXC(MemoryError, CLError.ptr());
DECLARE_EXC(LogicError, CLError.ptr());
DECLARE_EXC(RuntimeError, CLError.ptr());
py::register_exception_translator(
[](std::exception_ptr p)
{
try
{
if (p) std::rethrow_exception(p);
}
catch (pyopencl::error &err)
{
py::object err_obj = py::cast(err);
if (err.code() == CL_MEM_OBJECT_ALLOCATION_FAILURE)
PyErr_SetObject(CLMemoryError.ptr(), err_obj.ptr());
else if (err.code() <= CL_INVALID_VALUE)
PyErr_SetObject(CLLogicError.ptr(), err_obj.ptr());
else if (err.code() > CL_INVALID_VALUE && err.code() < CL_SUCCESS)
PyErr_SetObject(CLRuntimeError.ptr(), err_obj.ptr());
else
PyErr_SetObject(CLError.ptr(), err_obj.ptr());
}
});
py::class_<error> (m, "_ErrorRecord")
.def(py::init<const char *, cl_int, const char *>(),
py::arg("routine"),
py::arg("code"),
py::arg("msg"))
.DEF_SIMPLE_METHOD(routine)
.DEF_SIMPLE_METHOD(code)
.DEF_SIMPLE_METHOD(what)
.def("_program", &cls::get_program)
// }}}
// {{{ constants
#define ADD_ATTR(PREFIX, NAME) \
cls.attr(#NAME) = CL_##PREFIX##NAME
#define ADD_ATTR_SUFFIX(PREFIX, NAME, SUFFIX) \
cls.attr(#NAME) = CL_##PREFIX##NAME##SUFFIX
py::class_<status_code> cls(m, "status_code");
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
ADD_ATTR(, SUCCESS);
ADD_ATTR(, DEVICE_NOT_FOUND);
ADD_ATTR(, DEVICE_NOT_AVAILABLE);
#if !(defined(CL_PLATFORM_NVIDIA) && CL_PLATFORM_NVIDIA == 0x3001)
ADD_ATTR(, COMPILER_NOT_AVAILABLE);
#endif
ADD_ATTR(, MEM_OBJECT_ALLOCATION_FAILURE);
ADD_ATTR(, OUT_OF_RESOURCES);
ADD_ATTR(, OUT_OF_HOST_MEMORY);
ADD_ATTR(, PROFILING_INFO_NOT_AVAILABLE);
ADD_ATTR(, MEM_COPY_OVERLAP);
ADD_ATTR(, IMAGE_FORMAT_MISMATCH);
ADD_ATTR(, IMAGE_FORMAT_NOT_SUPPORTED);
ADD_ATTR(, BUILD_PROGRAM_FAILURE);
ADD_ATTR(, MAP_FAILURE);
ADD_ATTR(, INVALID_VALUE);
ADD_ATTR(, INVALID_DEVICE_TYPE);
ADD_ATTR(, INVALID_PLATFORM);
ADD_ATTR(, INVALID_DEVICE);
ADD_ATTR(, INVALID_CONTEXT);
ADD_ATTR(, INVALID_QUEUE_PROPERTIES);
ADD_ATTR(, INVALID_COMMAND_QUEUE);
ADD_ATTR(, INVALID_HOST_PTR);
ADD_ATTR(, INVALID_MEM_OBJECT);
ADD_ATTR(, INVALID_IMAGE_FORMAT_DESCRIPTOR);
ADD_ATTR(, INVALID_IMAGE_SIZE);
ADD_ATTR(, INVALID_SAMPLER);
ADD_ATTR(, INVALID_BINARY);
ADD_ATTR(, INVALID_BUILD_OPTIONS);
ADD_ATTR(, INVALID_PROGRAM);
ADD_ATTR(, INVALID_PROGRAM_EXECUTABLE);
ADD_ATTR(, INVALID_KERNEL_NAME);
ADD_ATTR(, INVALID_KERNEL_DEFINITION);
ADD_ATTR(, INVALID_KERNEL);
ADD_ATTR(, INVALID_ARG_INDEX);
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
ADD_ATTR(, INVALID_ARG_VALUE);
ADD_ATTR(, INVALID_ARG_SIZE);
ADD_ATTR(, INVALID_KERNEL_ARGS);
ADD_ATTR(, INVALID_WORK_DIMENSION);
ADD_ATTR(, INVALID_WORK_GROUP_SIZE);
ADD_ATTR(, INVALID_WORK_ITEM_SIZE);
ADD_ATTR(, INVALID_GLOBAL_OFFSET);
ADD_ATTR(, INVALID_EVENT_WAIT_LIST);
ADD_ATTR(, INVALID_EVENT);
ADD_ATTR(, INVALID_OPERATION);
ADD_ATTR(, INVALID_GL_OBJECT);
ADD_ATTR(, INVALID_BUFFER_SIZE);
ADD_ATTR(, INVALID_MIP_LEVEL);
#if defined(cl_khr_icd) && (cl_khr_icd >= 1)
ADD_ATTR(, PLATFORM_NOT_FOUND_KHR);
#endif
#if defined(cl_khr_gl_sharing) && (cl_khr_gl_sharing >= 1)
ADD_ATTR(, INVALID_GL_SHAREGROUP_REFERENCE_KHR);
#endif
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(, MISALIGNED_SUB_BUFFER_OFFSET);
ADD_ATTR(, EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST);
ADD_ATTR(, INVALID_GLOBAL_WORK_SIZE);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(, COMPILE_PROGRAM_FAILURE);
ADD_ATTR(, LINKER_NOT_AVAILABLE);
ADD_ATTR(, LINK_PROGRAM_FAILURE);
ADD_ATTR(, DEVICE_PARTITION_FAILED);
ADD_ATTR(, KERNEL_ARG_INFO_NOT_AVAILABLE);
ADD_ATTR(, INVALID_IMAGE_DESCRIPTOR);
ADD_ATTR(, INVALID_COMPILER_OPTIONS);
ADD_ATTR(, INVALID_LINKER_OPTIONS);
ADD_ATTR(, INVALID_DEVICE_PARTITION_COUNT);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(, INVALID_PIPE_SIZE);
ADD_ATTR(, INVALID_DEVICE_QUEUE);
#endif
#if PYOPENCL_CL_VERSION >= 0x2020
ADD_ATTR(, INVALID_SPEC_ID);
ADD_ATTR(, MAX_SIZE_RESTRICTION_EXCEEDED);
#endif
#if defined(cl_ext_device_fission) && defined(PYOPENCL_USE_DEVICE_FISSION)
ADD_ATTR(, DEVICE_PARTITION_FAILED_EXT);
ADD_ATTR(, INVALID_PARTITION_COUNT_EXT);
ADD_ATTR(, INVALID_PARTITION_NAME_EXT);
#endif
}
{
py::class_<platform_info> cls(m, "platform_info");
ADD_ATTR(PLATFORM_, PROFILE);
ADD_ATTR(PLATFORM_, VERSION);
ADD_ATTR(PLATFORM_, NAME);
ADD_ATTR(PLATFORM_, VENDOR);
#if !(defined(CL_PLATFORM_NVIDIA) && CL_PLATFORM_NVIDIA == 0x3001)
ADD_ATTR(PLATFORM_, EXTENSIONS);
#endif
#if PYOPENCL_CL_VERSION >= 0x2010
ADD_ATTR(PLATFORM_, HOST_TIMER_RESOLUTION);
#endif
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(PLATFORM_, NUMERIC_VERSION);
ADD_ATTR(PLATFORM_, EXTENSIONS_WITH_VERSION);
py::class_<device_type> cls(m, "device_type");
ADD_ATTR(DEVICE_TYPE_, DEFAULT);
ADD_ATTR(DEVICE_TYPE_, CPU);
ADD_ATTR(DEVICE_TYPE_, GPU);
ADD_ATTR(DEVICE_TYPE_, ACCELERATOR);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(DEVICE_TYPE_, CUSTOM);
#endif
ADD_ATTR(DEVICE_TYPE_, ALL);
}
{
py::class_<device_info> cls(m, "device_info");
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
ADD_ATTR(DEVICE_, TYPE);
ADD_ATTR(DEVICE_, VENDOR_ID);
ADD_ATTR(DEVICE_, MAX_COMPUTE_UNITS);
ADD_ATTR(DEVICE_, MAX_WORK_ITEM_DIMENSIONS);
ADD_ATTR(DEVICE_, MAX_WORK_GROUP_SIZE);
ADD_ATTR(DEVICE_, MAX_WORK_ITEM_SIZES);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_CHAR);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_SHORT);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_INT);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_LONG);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_FLOAT);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_DOUBLE);
ADD_ATTR(DEVICE_, MAX_CLOCK_FREQUENCY);
ADD_ATTR(DEVICE_, ADDRESS_BITS);
ADD_ATTR(DEVICE_, MAX_READ_IMAGE_ARGS);
ADD_ATTR(DEVICE_, MAX_WRITE_IMAGE_ARGS);
ADD_ATTR(DEVICE_, MAX_MEM_ALLOC_SIZE);
ADD_ATTR(DEVICE_, IMAGE2D_MAX_WIDTH);
ADD_ATTR(DEVICE_, IMAGE2D_MAX_HEIGHT);
ADD_ATTR(DEVICE_, IMAGE3D_MAX_WIDTH);
ADD_ATTR(DEVICE_, IMAGE3D_MAX_HEIGHT);
ADD_ATTR(DEVICE_, IMAGE3D_MAX_DEPTH);
ADD_ATTR(DEVICE_, IMAGE_SUPPORT);
ADD_ATTR(DEVICE_, MAX_PARAMETER_SIZE);
ADD_ATTR(DEVICE_, MAX_SAMPLERS);
ADD_ATTR(DEVICE_, MEM_BASE_ADDR_ALIGN);
ADD_ATTR(DEVICE_, MIN_DATA_TYPE_ALIGN_SIZE);
ADD_ATTR(DEVICE_, SINGLE_FP_CONFIG);
#ifdef CL_DEVICE_DOUBLE_FP_CONFIG
ADD_ATTR(DEVICE_, DOUBLE_FP_CONFIG);
#endif
#ifdef CL_DEVICE_HALF_FP_CONFIG
ADD_ATTR(DEVICE_, HALF_FP_CONFIG);
#endif
ADD_ATTR(DEVICE_, GLOBAL_MEM_CACHE_TYPE);
ADD_ATTR(DEVICE_, GLOBAL_MEM_CACHELINE_SIZE);
ADD_ATTR(DEVICE_, GLOBAL_MEM_CACHE_SIZE);
ADD_ATTR(DEVICE_, GLOBAL_MEM_SIZE);
ADD_ATTR(DEVICE_, MAX_CONSTANT_BUFFER_SIZE);
ADD_ATTR(DEVICE_, MAX_CONSTANT_ARGS);
ADD_ATTR(DEVICE_, LOCAL_MEM_TYPE);
ADD_ATTR(DEVICE_, LOCAL_MEM_SIZE);
ADD_ATTR(DEVICE_, ERROR_CORRECTION_SUPPORT);
ADD_ATTR(DEVICE_, PROFILING_TIMER_RESOLUTION);
ADD_ATTR(DEVICE_, ENDIAN_LITTLE);
ADD_ATTR(DEVICE_, AVAILABLE);
ADD_ATTR(DEVICE_, COMPILER_AVAILABLE);
ADD_ATTR(DEVICE_, EXECUTION_CAPABILITIES);
ADD_ATTR(DEVICE_, QUEUE_PROPERTIES);
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(DEVICE_, QUEUE_ON_HOST_PROPERTIES);
#endif
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
ADD_ATTR(DEVICE_, NAME);
ADD_ATTR(DEVICE_, VENDOR);
ADD_ATTR(, DRIVER_VERSION);
ADD_ATTR(DEVICE_, VERSION);
ADD_ATTR(DEVICE_, PROFILE);
ADD_ATTR(DEVICE_, VERSION);
ADD_ATTR(DEVICE_, EXTENSIONS);
ADD_ATTR(DEVICE_, PLATFORM);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_HALF);
ADD_ATTR(DEVICE_, HOST_UNIFIED_MEMORY);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_CHAR);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_SHORT);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_INT);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_LONG);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_FLOAT);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_DOUBLE);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_HALF);
ADD_ATTR(DEVICE_, OPENCL_C_VERSION);
#endif
// support for cl_nv_device_attribute_query
#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV
ADD_ATTR(DEVICE_, COMPUTE_CAPABILITY_MAJOR_NV);
ADD_ATTR(DEVICE_, COMPUTE_CAPABILITY_MINOR_NV);
ADD_ATTR(DEVICE_, REGISTERS_PER_BLOCK_NV);
ADD_ATTR(DEVICE_, WARP_SIZE_NV);
ADD_ATTR(DEVICE_, GPU_OVERLAP_NV);
ADD_ATTR(DEVICE_, KERNEL_EXEC_TIMEOUT_NV);
ADD_ATTR(DEVICE_, INTEGRATED_MEMORY_NV);
// Nvidia specific device attributes, not defined in Khronos CL/cl_ext.h
#ifdef CL_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT_NV
ADD_ATTR(DEVICE_, ATTRIBUTE_ASYNC_ENGINE_COUNT_NV);
#endif
#ifdef CL_DEVICE_PCI_BUS_ID_NV
ADD_ATTR(DEVICE_, PCI_BUS_ID_NV);
#endif
#ifdef CL_DEVICE_PCI_SLOT_ID_NV
ADD_ATTR(DEVICE_, PCI_SLOT_ID_NV);
#endif
#ifdef CL_DEVICE_PCI_SLOT_ID_NV
ADD_ATTR(DEVICE_, PCI_DOMAIN_ID_NV);
#endif
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
// {{{ cl_amd_device_attribute_query
#ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD
ADD_ATTR(DEVICE_, PROFILING_TIMER_OFFSET_AMD);
#endif
#ifdef CL_DEVICE_TOPOLOGY_AMD
ADD_ATTR(DEVICE_, TOPOLOGY_AMD);
#endif
#ifdef CL_DEVICE_BOARD_NAME_AMD
ADD_ATTR(DEVICE_, BOARD_NAME_AMD);
#endif
#ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD
ADD_ATTR(DEVICE_, GLOBAL_FREE_MEMORY_AMD);
#endif
#ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD
ADD_ATTR(DEVICE_, SIMD_PER_COMPUTE_UNIT_AMD);
#endif
#ifdef CL_DEVICE_SIMD_WIDTH_AMD
ADD_ATTR(DEVICE_, SIMD_WIDTH_AMD);
#endif
#ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD
ADD_ATTR(DEVICE_, SIMD_INSTRUCTION_WIDTH_AMD);
#endif
#ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
ADD_ATTR(DEVICE_, WAVEFRONT_WIDTH_AMD);
#endif
#ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD
ADD_ATTR(DEVICE_, GLOBAL_MEM_CHANNELS_AMD);
#endif
#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD
ADD_ATTR(DEVICE_, GLOBAL_MEM_CHANNEL_BANKS_AMD);
#endif
#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD
ADD_ATTR(DEVICE_, GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD);
#endif
#ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD
ADD_ATTR(DEVICE_, LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD);
#endif
#ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD
ADD_ATTR(DEVICE_, LOCAL_MEM_BANKS_AMD);
#endif
#ifdef CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD
ADD_ATTR(DEVICE_, THREAD_TRACE_SUPPORTED_AMD);
#endif
#ifdef CL_DEVICE_GFXIP_MAJOR_AMD
ADD_ATTR(DEVICE_, GFXIP_MAJOR_AMD);
#endif
#ifdef CL_DEVICE_GFXIP_MINOR_AMD
ADD_ATTR(DEVICE_, GFXIP_MINOR_AMD);
#endif
#ifdef CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD
ADD_ATTR(DEVICE_, AVAILABLE_ASYNC_QUEUES_AMD);
#endif
#ifdef CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_AMD
ADD_ATTR(DEVICE_, PREFERRED_WORK_GROUP_SIZE_AMD);
#endif
#ifdef CL_DEVICE_MAX_WORK_GROUP_SIZE_AMD
ADD_ATTR(DEVICE_, MAX_WORK_GROUP_SIZE_AMD);
#endif
#ifdef CL_DEVICE_PREFERRED_CONSTANT_BUFFER_SIZE_AMD
ADD_ATTR(DEVICE_, PREFERRED_CONSTANT_BUFFER_SIZE_AMD);
#endif
#ifdef CL_DEVICE_PCIE_ID_AMD
ADD_ATTR(DEVICE_, PCIE_ID_AMD);
#endif
// }}}
#ifdef CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT
ADD_ATTR(DEVICE_, MAX_ATOMIC_COUNTERS_EXT);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(DEVICE_, LINKER_AVAILABLE);
ADD_ATTR(DEVICE_, BUILT_IN_KERNELS);
ADD_ATTR(DEVICE_, IMAGE_MAX_BUFFER_SIZE);
ADD_ATTR(DEVICE_, IMAGE_MAX_ARRAY_SIZE);
ADD_ATTR(DEVICE_, PARENT_DEVICE);
ADD_ATTR(DEVICE_, PARTITION_MAX_SUB_DEVICES);
ADD_ATTR(DEVICE_, PARTITION_PROPERTIES);
ADD_ATTR(DEVICE_, PARTITION_AFFINITY_DOMAIN);
ADD_ATTR(DEVICE_, PARTITION_TYPE);
ADD_ATTR(DEVICE_, REFERENCE_COUNT);
ADD_ATTR(DEVICE_, PREFERRED_INTEROP_USER_SYNC);
ADD_ATTR(DEVICE_, PRINTF_BUFFER_SIZE);
#endif
#ifdef cl_khr_image2d_from_buffer
ADD_ATTR(DEVICE_, IMAGE_PITCH_ALIGNMENT);
ADD_ATTR(DEVICE_, IMAGE_BASE_ADDRESS_ALIGNMENT);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(DEVICE_, MAX_READ_WRITE_IMAGE_ARGS);
ADD_ATTR(DEVICE_, MAX_GLOBAL_VARIABLE_SIZE);
ADD_ATTR(DEVICE_, QUEUE_ON_DEVICE_PROPERTIES);
ADD_ATTR(DEVICE_, QUEUE_ON_DEVICE_PREFERRED_SIZE);
ADD_ATTR(DEVICE_, QUEUE_ON_DEVICE_MAX_SIZE);
ADD_ATTR(DEVICE_, MAX_ON_DEVICE_QUEUES);
ADD_ATTR(DEVICE_, MAX_ON_DEVICE_EVENTS);
ADD_ATTR(DEVICE_, SVM_CAPABILITIES);
ADD_ATTR(DEVICE_, GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE);
ADD_ATTR(DEVICE_, MAX_PIPE_ARGS);
ADD_ATTR(DEVICE_, PIPE_MAX_ACTIVE_RESERVATIONS);
ADD_ATTR(DEVICE_, PIPE_MAX_PACKET_SIZE);
ADD_ATTR(DEVICE_, PREFERRED_PLATFORM_ATOMIC_ALIGNMENT);
ADD_ATTR(DEVICE_, PREFERRED_GLOBAL_ATOMIC_ALIGNMENT);
ADD_ATTR(DEVICE_, PREFERRED_LOCAL_ATOMIC_ALIGNMENT);
#endif
#if PYOPENCL_CL_VERSION >= 0x2010
ADD_ATTR(DEVICE_, IL_VERSION);
ADD_ATTR(DEVICE_, MAX_NUM_SUB_GROUPS);
ADD_ATTR(DEVICE_, SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS);
#endif
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(DEVICE_, NUMERIC_VERSION);
ADD_ATTR(DEVICE_, EXTENSIONS_WITH_VERSION);
ADD_ATTR(DEVICE_, ILS_WITH_VERSION);
ADD_ATTR(DEVICE_, BUILT_IN_KERNELS_WITH_VERSION);
ADD_ATTR(DEVICE_, ATOMIC_MEMORY_CAPABILITIES);
ADD_ATTR(DEVICE_, ATOMIC_FENCE_CAPABILITIES);
ADD_ATTR(DEVICE_, NON_UNIFORM_WORK_GROUP_SUPPORT);
ADD_ATTR(DEVICE_, OPENCL_C_ALL_VERSIONS);
ADD_ATTR(DEVICE_, PREFERRED_WORK_GROUP_SIZE_MULTIPLE);
ADD_ATTR(DEVICE_, WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT);
ADD_ATTR(DEVICE_, GENERIC_ADDRESS_SPACE_SUPPORT);
ADD_ATTR(DEVICE_, OPENCL_C_FEATURES);
#ifdef CL_DEVICE_DEVICE_ENQUEUE_SUPPORT
// some busted headers shipped by Debian have this
cls.attr("DEVICE_ENQUEUE_CAPABILITIES") = CL_DEVICE_DEVICE_ENQUEUE_SUPPORT;
#else
ADD_ATTR(DEVICE_, DEVICE_ENQUEUE_CAPABILITIES);
#endif
/* cl_intel_advanced_motion_estimation */
#ifdef CL_DEVICE_ME_VERSION_INTEL
ADD_ATTR(DEVICE_, ME_VERSION_INTEL);
#endif
/* cl_qcom_ext_host_ptr */
#ifdef CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM
ADD_ATTR(DEVICE_, EXT_MEM_PADDING_IN_BYTES_QCOM);
#endif
#ifdef CL_DEVICE_PAGE_SIZE_QCOM
ADD_ATTR(DEVICE_, PAGE_SIZE_QCOM);
#endif
/* cl_khr_spir */
#ifdef CL_DEVICE_SPIR_VERSIONS
ADD_ATTR(DEVICE_, SPIR_VERSIONS);
#endif
/* cl_altera_device_temperature */
#ifdef CL_DEVICE_CORE_TEMPERATURE_ALTERA
ADD_ATTR(DEVICE_, CORE_TEMPERATURE_ALTERA);
#endif
/* cl_intel_simultaneous_sharing */
#ifdef CL_DEVICE_SIMULTANEOUS_INTEROPS_INTEL
ADD_ATTR(DEVICE_, SIMULTANEOUS_INTEROPS_INTEL);
#endif
#ifdef CL_DEVICE_NUM_SIMULTANEOUS_INTEROPS_INTEL
ADD_ATTR(DEVICE_, NUM_SIMULTANEOUS_INTEROPS_INTEL);
py::class_<device_topology_type_amd> cls(m, "device_topology_type_amd");
#ifdef CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD
cls.attr("PCIE") = CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD;
#endif
py::class_<device_fp_config> cls(m, "device_fp_config");
ADD_ATTR(FP_, DENORM);
ADD_ATTR(FP_, INF_NAN);
ADD_ATTR(FP_, ROUND_TO_NEAREST);
ADD_ATTR(FP_, ROUND_TO_ZERO);
ADD_ATTR(FP_, ROUND_TO_INF);
ADD_ATTR(FP_, FMA);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(FP_, SOFT_FLOAT);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(FP_, CORRECTLY_ROUNDED_DIVIDE_SQRT);
#endif
}
{
py::class_<device_mem_cache_type> cls(m, "device_mem_cache_type");
ADD_ATTR( , NONE);
ADD_ATTR( , READ_ONLY_CACHE);
ADD_ATTR( , READ_WRITE_CACHE);
}
{
py::class_<device_local_mem_type> cls(m, "device_local_mem_type");
ADD_ATTR( , LOCAL);
ADD_ATTR( , GLOBAL);
}
{
py::class_<device_exec_capabilities> cls(m, "device_exec_capabilities");
ADD_ATTR(EXEC_, KERNEL);
ADD_ATTR(EXEC_, NATIVE_KERNEL);
#ifdef CL_EXEC_IMMEDIATE_EXECUTION_INTEL
ADD_ATTR(EXEC_, IMMEDIATE_EXECUTION_INTEL);
#endif
}
{
py::class_<device_svm_capabilities> cls(m, "device_svm_capabilities");
#if PYOPENCL_CL_VERSION >= 0x2000
// device_svm_capabilities
ADD_ATTR(DEVICE_SVM_, COARSE_GRAIN_BUFFER);
ADD_ATTR(DEVICE_SVM_, FINE_GRAIN_BUFFER);
ADD_ATTR(DEVICE_SVM_, FINE_GRAIN_SYSTEM);
ADD_ATTR(DEVICE_SVM_, ATOMICS);
#endif
}
py::class_<command_queue_properties> cls(m, "command_queue_properties");
ADD_ATTR(QUEUE_, OUT_OF_ORDER_EXEC_MODE_ENABLE);
ADD_ATTR(QUEUE_, PROFILING_ENABLE);
#ifdef CL_QUEUE_IMMEDIATE_EXECUTION_ENABLE_INTEL
ADD_ATTR(QUEUE_, IMMEDIATE_EXECUTION_ENABLE_INTEL);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(QUEUE_, ON_DEVICE);
ADD_ATTR(QUEUE_, ON_DEVICE_DEFAULT);
py::class_<context_info> cls(m, "context_info");
ADD_ATTR(CONTEXT_, REFERENCE_COUNT);
ADD_ATTR(CONTEXT_, DEVICES);
ADD_ATTR(CONTEXT_, PROPERTIES);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(CONTEXT_, NUM_DEVICES);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(CONTEXT_, INTEROP_USER_SYNC);
#endif
}
{
py::class_<gl_context_info> cls(m, "gl_context_info");
#if defined(cl_khr_gl_sharing) && (cl_khr_gl_sharing >= 1)
ADD_ATTR(, CURRENT_DEVICE_FOR_GL_CONTEXT_KHR);
ADD_ATTR(, DEVICES_FOR_GL_CONTEXT_KHR);
#endif
}
{
py::class_<context_properties> cls(m, "context_properties");
ADD_ATTR(CONTEXT_, PLATFORM);
#if defined(cl_khr_gl_sharing) && (cl_khr_gl_sharing >= 1)
ADD_ATTR( ,GL_CONTEXT_KHR);
ADD_ATTR( ,EGL_DISPLAY_KHR);
ADD_ATTR( ,GLX_DISPLAY_KHR);
ADD_ATTR( ,WGL_HDC_KHR);
ADD_ATTR( ,CGL_SHAREGROUP_KHR);
#endif
#if defined(__APPLE__) && defined(HAVE_GL)
ADD_ATTR( ,CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE);
#endif /* __APPLE__ */
// cl_amd_offline_devices
#ifdef CL_CONTEXT_OFFLINE_DEVICES_AMD
ADD_ATTR(CONTEXT_, OFFLINE_DEVICES_AMD);
#endif
}
{
py::class_<command_queue_info> cls(m, "command_queue_info");
ADD_ATTR(QUEUE_, CONTEXT);
ADD_ATTR(QUEUE_, DEVICE);
ADD_ATTR(QUEUE_, REFERENCE_COUNT);
ADD_ATTR(QUEUE_, PROPERTIES);
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(QUEUE_, PROPERTIES_ARRAY);
#endif
{
py::class_<queue_properties> cls(m, "queue_properties");
ADD_ATTR(QUEUE_, PROPERTIES);
ADD_ATTR(QUEUE_, SIZE);
#endif
#if PYOPENCL_CL_VERSION >= 0x2010
ADD_ATTR(QUEUE_, DEVICE_DEFAULT);
py::class_<mem_flags> cls(m, "mem_flags");
ADD_ATTR(MEM_, READ_WRITE);
ADD_ATTR(MEM_, WRITE_ONLY);
ADD_ATTR(MEM_, READ_ONLY);
ADD_ATTR(MEM_, USE_HOST_PTR);
ADD_ATTR(MEM_, ALLOC_HOST_PTR);
ADD_ATTR(MEM_, COPY_HOST_PTR);
#ifdef cl_amd_device_memory_flags
ADD_ATTR(MEM_, USE_PERSISTENT_MEM_AMD);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(MEM_, HOST_WRITE_ONLY);
ADD_ATTR(MEM_, HOST_READ_ONLY);
ADD_ATTR(MEM_, HOST_NO_ACCESS);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(MEM_, KERNEL_READ_AND_WRITE);
#endif
}
{
py::class_<svm_mem_flags> cls(m, "svm_mem_flags");
ADD_ATTR(MEM_, READ_WRITE);
ADD_ATTR(MEM_, WRITE_ONLY);
ADD_ATTR(MEM_, READ_ONLY);
ADD_ATTR(MEM_, SVM_FINE_GRAIN_BUFFER);
ADD_ATTR(MEM_, SVM_ATOMICS);
py::class_<channel_order> cls(m, "channel_order");
ADD_ATTR( , R);
ADD_ATTR( , A);
ADD_ATTR( , RG);
ADD_ATTR( , RA);
ADD_ATTR( , RGB);
ADD_ATTR( , RGBA);
ADD_ATTR( , BGRA);
ADD_ATTR( , INTENSITY);
ADD_ATTR( , LUMINANCE);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR( , Rx);
ADD_ATTR( , RGx);
ADD_ATTR( , RGBx);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR( , sRGB);
ADD_ATTR( , sRGBx);
ADD_ATTR( , sRGBA);
ADD_ATTR( , sBGRA);
ADD_ATTR( , ABGR);
py::class_<channel_type> cls(m, "channel_type");
ADD_ATTR( , SNORM_INT8);
ADD_ATTR( , SNORM_INT16);
ADD_ATTR( , UNORM_INT8);
ADD_ATTR( , UNORM_INT16);
ADD_ATTR( , UNORM_SHORT_565);
ADD_ATTR( , UNORM_SHORT_555);
ADD_ATTR( , UNORM_INT_101010);
ADD_ATTR( , SIGNED_INT8);
ADD_ATTR( , SIGNED_INT16);
ADD_ATTR( , SIGNED_INT32);
ADD_ATTR( , UNSIGNED_INT8);
ADD_ATTR( , UNSIGNED_INT16);
ADD_ATTR( , UNSIGNED_INT32);
ADD_ATTR( , HALF_FLOAT);
ADD_ATTR( , FLOAT);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR( , UNORM_INT24);
#endif
#if PYOPENCL_CL_VERSION >= 0x2010
ADD_ATTR( , UNORM_INT_101010_2);
#endif
py::class_<mem_object_type> cls(m, "mem_object_type");
ADD_ATTR(MEM_OBJECT_, BUFFER);
ADD_ATTR(MEM_OBJECT_, IMAGE2D);
ADD_ATTR(MEM_OBJECT_, IMAGE3D);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(MEM_OBJECT_, IMAGE2D_ARRAY);
ADD_ATTR(MEM_OBJECT_, IMAGE1D);
ADD_ATTR(MEM_OBJECT_, IMAGE1D_ARRAY);
ADD_ATTR(MEM_OBJECT_, IMAGE1D_BUFFER);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(MEM_OBJECT_, PIPE);
py::class_<mem_info> cls(m, "mem_info");
ADD_ATTR(MEM_, TYPE);
ADD_ATTR(MEM_, FLAGS);
ADD_ATTR(MEM_, SIZE);
ADD_ATTR(MEM_, HOST_PTR);
ADD_ATTR(MEM_, MAP_COUNT);
ADD_ATTR(MEM_, REFERENCE_COUNT);
ADD_ATTR(MEM_, CONTEXT);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(MEM_, ASSOCIATED_MEMOBJECT);
ADD_ATTR(MEM_, OFFSET);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(MEM_, USES_SVM_POINTER);
#endif
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(MEM_, PROPERTIES);
py::class_<image_info> cls(m, "image_info");
ADD_ATTR(IMAGE_, FORMAT);
ADD_ATTR(IMAGE_, ELEMENT_SIZE);
ADD_ATTR(IMAGE_, ROW_PITCH);
ADD_ATTR(IMAGE_, SLICE_PITCH);
ADD_ATTR(IMAGE_, WIDTH);
ADD_ATTR(IMAGE_, HEIGHT);
ADD_ATTR(IMAGE_, DEPTH);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(IMAGE_, ARRAY_SIZE);
ADD_ATTR(IMAGE_, BUFFER);
ADD_ATTR(IMAGE_, NUM_MIP_LEVELS);
ADD_ATTR(IMAGE_, NUM_SAMPLES);
#endif
}
{
py::class_<pipe_info> cls(m, "pipe_info");
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(PIPE_, PACKET_SIZE);
ADD_ATTR(PIPE_, MAX_PACKETS);
#endif
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(PIPE_, PROPERTIES);
#endif
}
py::class_<pipe_properties> cls(m, "pipe_properties");
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(PIPE_, PACKET_SIZE);
ADD_ATTR(PIPE_, MAX_PACKETS);
#endif
}
py::class_<addressing_mode> cls(m, "addressing_mode");
ADD_ATTR(ADDRESS_, NONE);
ADD_ATTR(ADDRESS_, CLAMP_TO_EDGE);
ADD_ATTR(ADDRESS_, CLAMP);
ADD_ATTR(ADDRESS_, REPEAT);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(ADDRESS_, MIRRORED_REPEAT);
#endif
}
{
py::class_<filter_mode> cls(m, "filter_mode");
ADD_ATTR(FILTER_, NEAREST);
ADD_ATTR(FILTER_, LINEAR);
}
{
py::class_<sampler_info> cls(m, "sampler_info");
ADD_ATTR(SAMPLER_, REFERENCE_COUNT);
ADD_ATTR(SAMPLER_, CONTEXT);
ADD_ATTR(SAMPLER_, NORMALIZED_COORDS);
ADD_ATTR(SAMPLER_, ADDRESSING_MODE);
ADD_ATTR(SAMPLER_, FILTER_MODE);
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(SAMPLER_, MIP_FILTER_MODE);
ADD_ATTR(SAMPLER_, LOD_MIN);
ADD_ATTR(SAMPLER_, LOD_MAX);
#endif
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(SAMPLER_, PROPERTIES);
// {{{ cl_khr_mipmap_image
#ifdef CL_SAMPLER_MIP_FILTER_MODE_KHR
ADD_ATTR(SAMPLER_, MIP_FILTER_MODE_KHR);
ADD_ATTR(SAMPLER_, LOD_MIN_KHR);
ADD_ATTR(SAMPLER_, LOD_MAX_KHR);
#endif
// }}}
{
py::class_<sampler_properties> cls(m, "sampler_properties");
ADD_ATTR(SAMPLER_, NORMALIZED_COORDS);
ADD_ATTR(SAMPLER_, ADDRESSING_MODE);
ADD_ATTR(SAMPLER_, FILTER_MODE);
}
py::class_<map_flags> cls(m, "map_flags");
ADD_ATTR(MAP_, READ);
ADD_ATTR(MAP_, WRITE);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(MAP_, WRITE_INVALIDATE_REGION);
#endif
}
{
py::class_<program_info> cls(m, "program_info");
ADD_ATTR(PROGRAM_, REFERENCE_COUNT);
ADD_ATTR(PROGRAM_, CONTEXT);
ADD_ATTR(PROGRAM_, NUM_DEVICES);
ADD_ATTR(PROGRAM_, DEVICES);
ADD_ATTR(PROGRAM_, SOURCE);
ADD_ATTR(PROGRAM_, BINARY_SIZES);
ADD_ATTR(PROGRAM_, BINARIES);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(PROGRAM_, NUM_KERNELS);
ADD_ATTR(PROGRAM_, KERNEL_NAMES);
#endif
#if PYOPENCL_CL_VERSION >= 0x2010
ADD_ATTR(PROGRAM_, IL);
#endif
#if PYOPENCL_CL_VERSION >= 0x2020
ADD_ATTR(PROGRAM_, SCOPE_GLOBAL_CTORS_PRESENT);
ADD_ATTR(PROGRAM_, SCOPE_GLOBAL_DTORS_PRESENT);
py::class_<program_build_info> cls(m, "program_build_info");
ADD_ATTR(PROGRAM_BUILD_, STATUS);
ADD_ATTR(PROGRAM_BUILD_, OPTIONS);
ADD_ATTR(PROGRAM_BUILD_, LOG);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(PROGRAM_, BINARY_TYPE);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(PROGRAM_BUILD_, GLOBAL_VARIABLE_TOTAL_SIZE);
py::class_<program_binary_type> cls(m, "program_binary_type");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(PROGRAM_BINARY_TYPE_, NONE);
ADD_ATTR(PROGRAM_BINARY_TYPE_, COMPILED_OBJECT);
ADD_ATTR(PROGRAM_BINARY_TYPE_, LIBRARY);
ADD_ATTR(PROGRAM_BINARY_TYPE_, EXECUTABLE);
#endif
}
{
py::class_<kernel_info> cls(m, "kernel_info");
ADD_ATTR(KERNEL_, FUNCTION_NAME);
ADD_ATTR(KERNEL_, NUM_ARGS);
ADD_ATTR(KERNEL_, REFERENCE_COUNT);
ADD_ATTR(KERNEL_, CONTEXT);
ADD_ATTR(KERNEL_, PROGRAM);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(KERNEL_, ATTRIBUTES);
#endif
}
{
py::class_<kernel_arg_info> cls(m, "kernel_arg_info");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(KERNEL_ARG_, ADDRESS_QUALIFIER);
ADD_ATTR(KERNEL_ARG_, ACCESS_QUALIFIER);
ADD_ATTR(KERNEL_ARG_, TYPE_NAME);
ADD_ATTR(KERNEL_ARG_, NAME);
#endif
}
{
py::class_<kernel_arg_address_qualifier> cls(
m, "kernel_arg_address_qualifier");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(KERNEL_ARG_ADDRESS_, GLOBAL);
ADD_ATTR(KERNEL_ARG_ADDRESS_, LOCAL);
ADD_ATTR(KERNEL_ARG_ADDRESS_, CONSTANT);
ADD_ATTR(KERNEL_ARG_ADDRESS_, PRIVATE);
#endif
}
{
py::class_<kernel_arg_access_qualifier> cls(
m, "kernel_arg_access_qualifier");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(KERNEL_ARG_ACCESS_, READ_ONLY);
ADD_ATTR(KERNEL_ARG_ACCESS_, WRITE_ONLY);
ADD_ATTR(KERNEL_ARG_ACCESS_, READ_WRITE);
ADD_ATTR(KERNEL_ARG_ACCESS_, NONE);
#endif
}
{
py::class_<kernel_arg_type_qualifier> cls(
m, "kernel_arg_type_qualifier");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(KERNEL_ARG_TYPE_, NONE);
ADD_ATTR(KERNEL_ARG_TYPE_, CONST);
ADD_ATTR(KERNEL_ARG_TYPE_, RESTRICT);
ADD_ATTR(KERNEL_ARG_TYPE_, VOLATILE);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(KERNEL_ARG_TYPE_, PIPE);
#endif
}
py::class_<kernel_work_group_info> cls(m, "kernel_work_group_info");
ADD_ATTR(KERNEL_, WORK_GROUP_SIZE);
ADD_ATTR(KERNEL_, COMPILE_WORK_GROUP_SIZE);
ADD_ATTR(KERNEL_, LOCAL_MEM_SIZE);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(KERNEL_, PREFERRED_WORK_GROUP_SIZE_MULTIPLE);
ADD_ATTR(KERNEL_, PRIVATE_MEM_SIZE);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(KERNEL_, GLOBAL_WORK_SIZE);
#endif
}
{
py::class_<kernel_sub_group_info> cls(m, "kernel_sub_group_info");
#if PYOPENCL_CL_VERSION >= 0x2010
ADD_ATTR(KERNEL_, MAX_SUB_GROUP_SIZE_FOR_NDRANGE);
ADD_ATTR(KERNEL_, SUB_GROUP_COUNT_FOR_NDRANGE);
ADD_ATTR(KERNEL_, LOCAL_SIZE_FOR_SUB_GROUP_COUNT);
ADD_ATTR(KERNEL_, MAX_NUM_SUB_GROUPS);
ADD_ATTR(KERNEL_, COMPILE_NUM_SUB_GROUPS);
#endif
}
py::class_<event_info> cls(m, "event_info");
ADD_ATTR(EVENT_, COMMAND_QUEUE);
ADD_ATTR(EVENT_, COMMAND_TYPE);
ADD_ATTR(EVENT_, REFERENCE_COUNT);
ADD_ATTR(EVENT_, COMMAND_EXECUTION_STATUS);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(EVENT_, CONTEXT);
#endif
}
{
py::class_<command_type> cls(m, "command_type");
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
ADD_ATTR(COMMAND_, NDRANGE_KERNEL);
ADD_ATTR(COMMAND_, TASK);
ADD_ATTR(COMMAND_, NATIVE_KERNEL);
ADD_ATTR(COMMAND_, READ_BUFFER);
ADD_ATTR(COMMAND_, WRITE_BUFFER);
ADD_ATTR(COMMAND_, COPY_BUFFER);
ADD_ATTR(COMMAND_, READ_IMAGE);
ADD_ATTR(COMMAND_, WRITE_IMAGE);
ADD_ATTR(COMMAND_, COPY_IMAGE);
ADD_ATTR(COMMAND_, COPY_IMAGE_TO_BUFFER);
ADD_ATTR(COMMAND_, COPY_BUFFER_TO_IMAGE);
ADD_ATTR(COMMAND_, MAP_BUFFER);
ADD_ATTR(COMMAND_, MAP_IMAGE);
ADD_ATTR(COMMAND_, UNMAP_MEM_OBJECT);
ADD_ATTR(COMMAND_, MARKER);
ADD_ATTR(COMMAND_, ACQUIRE_GL_OBJECTS);
ADD_ATTR(COMMAND_, RELEASE_GL_OBJECTS);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(COMMAND_, READ_BUFFER_RECT);
ADD_ATTR(COMMAND_, WRITE_BUFFER_RECT);
ADD_ATTR(COMMAND_, COPY_BUFFER_RECT);
ADD_ATTR(COMMAND_, USER);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(COMMAND_, BARRIER);
ADD_ATTR(COMMAND_, MIGRATE_MEM_OBJECTS);
ADD_ATTR(COMMAND_, FILL_BUFFER);
ADD_ATTR(COMMAND_, FILL_IMAGE);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(COMMAND_, SVM_FREE);
ADD_ATTR(COMMAND_, SVM_MEMCPY);
ADD_ATTR(COMMAND_, SVM_MEMFILL);
ADD_ATTR(COMMAND_, SVM_MAP);
ADD_ATTR(COMMAND_, SVM_UNMAP);
#endif
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(COMMAND_, SVM_MIGRATE_MEM);
py::class_<command_execution_status> cls(m, "command_execution_status");
ADD_ATTR(, COMPLETE);
ADD_ATTR(, RUNNING);
ADD_ATTR(, SUBMITTED);
ADD_ATTR(, QUEUED);
}
{
py::class_<profiling_info> cls(m, "profiling_info");
ADD_ATTR(PROFILING_COMMAND_, QUEUED);
ADD_ATTR(PROFILING_COMMAND_, SUBMIT);
ADD_ATTR(PROFILING_COMMAND_, START);
ADD_ATTR(PROFILING_COMMAND_, END);
ADD_ATTR(PROFILING_COMMAND_, COMPLETE);
}
/* not needed--filled in automatically by implementation.
#if PYOPENCL_CL_VERSION >= 0x1010
{
py::class_<buffer_create_type> cls(m, "buffer_create_type");
ADD_ATTR(BUFFER_CREATE_TYPE_, REGION);
}
#endif
*/
{
py::class_<mem_migration_flags> cls(
m, "mem_migration_flags");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(MIGRATE_MEM_OBJECT_, HOST);
ADD_ATTR(MIGRATE_MEM_OBJECT_, CONTENT_UNDEFINED);
#endif
}
{
py::class_<device_partition_property> cls(
m, "device_partition_property");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(DEVICE_PARTITION_, EQUALLY);
ADD_ATTR(DEVICE_PARTITION_, BY_COUNTS);
ADD_ATTR(DEVICE_PARTITION_, BY_COUNTS_LIST_END);
ADD_ATTR(DEVICE_PARTITION_, BY_AFFINITY_DOMAIN);
#endif
}
{
py::class_<device_affinity_domain> cls(m, "device_affinity_domain");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(DEVICE_AFFINITY_DOMAIN_, NUMA);
ADD_ATTR(DEVICE_AFFINITY_DOMAIN_, L4_CACHE);
ADD_ATTR(DEVICE_AFFINITY_DOMAIN_, L3_CACHE);
ADD_ATTR(DEVICE_AFFINITY_DOMAIN_, L2_CACHE);
ADD_ATTR(DEVICE_AFFINITY_DOMAIN_, L1_CACHE);
ADD_ATTR(DEVICE_AFFINITY_DOMAIN_, NEXT_PARTITIONABLE);
#endif
}
{
py::class_<device_atomic_capabilities> cls(m, "device_atomic_capabilities");
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(DEVICE_ATOMIC_, ORDER_RELAXED);
ADD_ATTR(DEVICE_ATOMIC_, ORDER_ACQ_REL);
ADD_ATTR(DEVICE_ATOMIC_, ORDER_SEQ_CST);
ADD_ATTR(DEVICE_ATOMIC_, SCOPE_WORK_ITEM);
ADD_ATTR(DEVICE_ATOMIC_, SCOPE_WORK_GROUP);
ADD_ATTR(DEVICE_ATOMIC_, SCOPE_DEVICE);
ADD_ATTR(DEVICE_ATOMIC_, SCOPE_ALL_DEVICES);
#endif
}
{
py::class_<device_device_enqueue_capabilities> cls(m, "device_device_enqueue_capabilities");
#if (PYOPENCL_CL_VERSION >= 0x3000) && defined(CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES)
ADD_ATTR(DEVICE_QUEUE_, SUPPORTED);
ADD_ATTR(DEVICE_QUEUE_, REPLACEABLE_DEFAULT);
#endif
}
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
{
py::class_<version_bits> cls(m, "version_bits");
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(VERSION_, MAJOR_BITS);
ADD_ATTR(VERSION_, MINOR_BITS);
ADD_ATTR(VERSION_, PATCH_BITS);
ADD_ATTR(VERSION_, MAJOR_MASK);
ADD_ATTR(VERSION_, MINOR_MASK);
ADD_ATTR(VERSION_, PATCH_MASK);
#endif
}
{
py::class_<khronos_vendor_id> cls(m, "khronos_vendor_id");
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(KHRONOS_VENDOR_ID_, CODEPLAY);
#endif
}
py::class_<gl_object_type> cls(m, "gl_object_type");
ADD_ATTR(GL_OBJECT_, BUFFER);
ADD_ATTR(GL_OBJECT_, TEXTURE2D);
ADD_ATTR(GL_OBJECT_, TEXTURE3D);
ADD_ATTR(GL_OBJECT_, RENDERBUFFER);
}
{
py::class_<gl_texture_info> cls(m, "gl_texture_info");
ADD_ATTR(GL_, TEXTURE_TARGET);
ADD_ATTR(GL_, MIPMAP_LEVEL);
}
#endif
// }}}
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
// {{{ cl_name_version
#if PYOPENCL_CL_VERSION >= 0x3000
{
typedef cl_name_version cls;
py::class_<cls>(m, "NameVersion")
.def(py::init(
[](cl_version version, const char* name)
{
cl_name_version result;
result.version = version;
result.name[0] = '\0';
// https://stackoverflow.com/a/1258577
strncat(result.name, name, CL_NAME_VERSION_MAX_NAME_SIZE-1);
return result;
}),
py::arg("version")=0,
py::arg("name")=0)
.def_property("version",
[](cls &t) { return t.version; },
[](cls &t, cl_version val) { t.version = val; })
.def_property("name",
[](cls &t) { return t.name; },
[](cls &t, const char *name)
{
t.name[0] = '\0';
// https://stackoverflow.com/a/1258577
strncat(t.name, name, CL_NAME_VERSION_MAX_NAME_SIZE-1);
})
;
}
#endif
// }}}
#ifdef CL_DEVICE_TOPOLOGY_AMD
{
typedef cl_device_topology_amd cls;
py::class_<cls>(m, "DeviceTopologyAmd")
.def(py::init(
[](cl_char bus, cl_char device, cl_char function)
{
cl_device_topology_amd result;
result.pcie.type = CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD;
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
result.pcie.bus = bus;
result.pcie.device = device;
result.pcie.function = function;
return result;
}),
py::arg("bus")=0,
py::arg("device")=0,
py::arg("function")=0)
.def_property("type",
[](cls &t) { return t.pcie.type; },
[](cls &t, cl_uint val) { t.pcie.type = val; })
.def_property("bus",
[](cls &t) { return t.pcie.bus; },
[](cls &t, cl_char val) { t.pcie.bus = val; })
.def_property("device",
[](cls &t) { return t.pcie.device; },
[](cls &t, cl_char val) { t.pcie.device = val; })
.def_property("function",
[](cls &t) { return t.pcie.function; },
[](cls &t, cl_char val) { t.pcie.function = val; })
;
}
// vim: foldmethod=marker