From 582457c4a7ebb824c87dc1427e900702f5e2e873 Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Fri, 10 Aug 2018 17:30:05 -0500
Subject: [PATCH] Wrap CL2 constants

---
 pyopencl/__init__.py   |  21 ++----
 src/wrap_cl.hpp        |  98 +++++++++++++++++++++---
 src/wrap_constants.cpp | 168 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 263 insertions(+), 24 deletions(-)

diff --git a/pyopencl/__init__.py b/pyopencl/__init__.py
index ffd03907..0b3de63a 100644
--- a/pyopencl/__init__.py
+++ b/pyopencl/__init__.py
@@ -64,20 +64,17 @@ from pyopencl._cl import (  # noqa
         device_mem_cache_type,
         device_local_mem_type,
         device_exec_capabilities,
-        # FIXME
-        # device_svm_capabilities,
+        device_svm_capabilities,
 
         command_queue_properties,
         context_info,
         gl_context_info,
         context_properties,
         command_queue_info,
-        # FIXME
-        # queue_properties,
+        queue_properties,
 
         mem_flags,
-        # FIXME
-        # svm_mem_flags,
+        svm_mem_flags,
 
         channel_order,
         channel_type,
@@ -94,10 +91,9 @@ from pyopencl._cl import (  # noqa
 
         kernel_info,
         kernel_arg_info,
-        # FIXME
-        # kernel_arg_address_qualifier,
-        # kernel_arg_access_qualifier,
-        # kernel_arg_type_qualifier,
+        kernel_arg_address_qualifier,
+        kernel_arg_access_qualifier,
+        kernel_arg_type_qualifier,
         kernel_work_group_info,
 
         event_info,
@@ -105,8 +101,7 @@ from pyopencl._cl import (  # noqa
         command_execution_status,
         profiling_info,
         mem_migration_flags,
-        # FIXME
-        # mem_migration_flags_ext,
+        mem_migration_flags_ext,
         device_partition_property,
         device_affinity_domain,
         gl_object_type,
@@ -132,8 +127,6 @@ from pyopencl._cl import (  # noqa
         # SVM,
         # SVMMap,
 
-        # FIXME
-        # CompilerWarning,
         _Program,
         Kernel,
 
diff --git a/src/wrap_cl.hpp b/src/wrap_cl.hpp
index 1a4cbd48..ab735ea1 100644
--- a/src/wrap_cl.hpp
+++ b/src/wrap_cl.hpp
@@ -648,7 +648,11 @@ namespace pyopencl
           case CL_DEVICE_AVAILABLE: DEV_GET_INT_INF(cl_bool);
           case CL_DEVICE_COMPILER_AVAILABLE: DEV_GET_INT_INF(cl_bool);
           case CL_DEVICE_EXECUTION_CAPABILITIES: DEV_GET_INT_INF(cl_device_exec_capabilities);
+#if PYOPENCL_CL_VERSION >= 0x2000
+          case CL_DEVICE_QUEUE_ON_HOST_PROPERTIES: DEV_GET_INT_INF(cl_command_queue_properties);
+#else
           case CL_DEVICE_QUEUE_PROPERTIES: DEV_GET_INT_INF(cl_command_queue_properties);
+#endif
 
           case CL_DEVICE_NAME:
           case CL_DEVICE_VENDOR:
@@ -687,6 +691,30 @@ namespace pyopencl
           case CL_DEVICE_INTEGRATED_MEMORY_NV:
             DEV_GET_INT_INF(cl_bool);
 #endif
+#ifdef CL_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT_NV
+          case CL_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT_NV:
+            DEV_GET_INT_INF(cl_uint);
+#endif
+#ifdef CL_DEVICE_PCI_BUS_ID_NV
+          case CL_DEVICE_PCI_BUS_ID_NV:
+            DEV_GET_INT_INF(cl_uint);
+#endif
+#ifdef CL_DEVICE_PCI_SLOT_ID_NV
+          case CL_DEVICE_PCI_SLOT_ID_NV:
+            DEV_GET_INT_INF(cl_uint);
+#endif
+#ifdef CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD
+          case CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD: DEV_GET_INT_INF(cl_bool);
+#endif
+#ifdef CL_DEVICE_GFXIP_MAJOR_AMD
+          case CL_DEVICE_GFXIP_MAJOR_AMD: DEV_GET_INT_INF(cl_uint);
+#endif
+#ifdef CL_DEVICE_GFXIP_MINOR_AMD
+          case CL_DEVICE_GFXIP_MINOR_AMD: DEV_GET_INT_INF(cl_uint);
+#endif
+#ifdef CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD
+          case CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD: DEV_GET_INT_INF(cl_uint);
+#endif
 #if PYOPENCL_CL_VERSION >= 0x1020
           case CL_DEVICE_LINKER_AVAILABLE: DEV_GET_INT_INF(cl_bool);
           case CL_DEVICE_BUILT_IN_KERNELS:
@@ -713,7 +741,7 @@ namespace pyopencl
           case CL_DEVICE_PREFERRED_INTEROP_USER_SYNC: DEV_GET_INT_INF(cl_bool);
           case CL_DEVICE_PRINTF_BUFFER_SIZE: DEV_GET_INT_INF(cl_bool);
 #endif
-// {{{ AMD dev attrs
+// {{{ AMD dev attrs cl_amd_device_attribute_query
 //
 // types of AMD dev attrs divined from
 // https://www.khronos.org/registry/cl/api/1.2/cl.hpp
@@ -740,15 +768,6 @@ namespace pyopencl
 #ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD
           case CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD: DEV_GET_INT_INF(cl_uint);
 #endif
-#ifdef CL_DEVICE_SIMD_WIDTH_AMD
-          case CL_DEVICE_SIMD_WIDTH_AMD: DEV_GET_INT_INF(cl_uint);
-#endif
-#ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD
-          case CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD: DEV_GET_INT_INF(cl_uint);
-#endif
-#ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
-          case CL_DEVICE_WAVEFRONT_WIDTH_AMD: DEV_GET_INT_INF(cl_uint);
-#endif
 #ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD
           case CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD: DEV_GET_INT_INF(cl_uint);
 #endif
@@ -769,6 +788,56 @@ namespace pyopencl
 #ifdef CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT
           case CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT: DEV_GET_INT_INF(cl_uint);
 #endif
+#if PYOPENCL_CL_VERSION >= 0x2000
+          case CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS: DEV_GET_INT_INF(cl_uint);
+          case CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE: DEV_GET_INT_INF(size_t);
+          case CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES: DEV_GET_INT_INF(cl_command_queue_properties);
+          case CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE: DEV_GET_INT_INF(cl_uint);
+          case CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE: DEV_GET_INT_INF(cl_uint);
+          case CL_DEVICE_MAX_ON_DEVICE_QUEUES: DEV_GET_INT_INF(cl_uint);
+          case CL_DEVICE_MAX_ON_DEVICE_EVENTS: DEV_GET_INT_INF(cl_uint);
+          case CL_DEVICE_SVM_CAPABILITIES: DEV_GET_INT_INF(cl_device_svm_capabilities);
+          case CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE: DEV_GET_INT_INF(size_t);
+          case CL_DEVICE_MAX_PIPE_ARGS: DEV_GET_INT_INF(cl_uint);
+          case CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS: DEV_GET_INT_INF(cl_uint);
+          case CL_DEVICE_PIPE_MAX_PACKET_SIZE: DEV_GET_INT_INF(cl_uint);
+          case CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT: DEV_GET_INT_INF(cl_uint);
+          case CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT: DEV_GET_INT_INF(cl_uint);
+          case CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT: DEV_GET_INT_INF(cl_uint);
+#endif
+#if PYOPENCL_CL_VERSION >= 0x2010
+          case CL_DEVICE_IL_VERSION: DEV_GET_INT_INF();
+          case CL_DEVICE_MAX_NUM_SUB_GROUPS: DEV_GET_INT_INF();
+          case CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS: DEV_GET_INT_INF();
+#endif
+#ifdef CL_DEVICE_ME_VERSION_INTEL
+          case CL_DEVICE_ME_VERSION_INTEL: DEV_GET_INT_INF(cl_uint);
+#endif
+#ifdef CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM
+          case CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM: DEV_GET_INT_INF(cl_uint);
+#endif
+#ifdef CL_DEVICE_PAGE_SIZE_QCOM
+          case CL_DEVICE_PAGE_SIZE_QCOM: DEV_GET_INT_INF(cl_uint);
+#endif
+#ifdef CL_DEVICE_SPIR_VERSIONS
+          case CL_DEVICE_SPIR_VERSIONS:
+            PYOPENCL_GET_STR_INFO(Device, m_device, param_name);
+#endif
+#ifdef CL_DEVICE_CORE_TEMPERATURE_ALTERA
+          case CL_DEVICE_CORE_TEMPERATURE_ALTERA: DEV_GET_INT_INF(cl_int);
+#endif
+
+#ifdef CL_DEVICE_SIMULTANEOUS_INTEROPS_INTEL
+          case CL_DEVICE_SIMULTANEOUS_INTEROPS_INTEL:
+            {
+              std::vector<cl_uint> result;
+              PYOPENCL_GET_VEC_INFO(Device, m_device, param_name, result);
+              PYOPENCL_RETURN_VECTOR(cl_uint, result);
+            }
+#endif
+#ifdef CL_DEVICE_NUM_SIMULTANEOUS_INTEROPS_INTEL
+          case CL_DEVICE_NUM_SIMULTANEOUS_INTEROPS_INTEL: DEV_GET_INT_INF(cl_uint);
+#endif
 
           default:
             throw error("Device.get_info", CL_INVALID_VALUE);
@@ -1255,6 +1324,9 @@ namespace pyopencl
           case CL_PROFILING_COMMAND_SUBMIT:
           case CL_PROFILING_COMMAND_START:
           case CL_PROFILING_COMMAND_END:
+#if PYOPENCL_CL_VERSION >= 0x2000
+          case CL_PROFILING_COMMAND_COMPLETE:
+#endif
             PYOPENCL_GET_INTEGRAL_INFO(EventProfiling, m_event, param_name,
                 cl_ulong);
           default:
@@ -3177,6 +3249,12 @@ namespace pyopencl
                 PYOPENCL_FIRST_ARG, param_name,
                 cl_program_binary_type);
 #endif
+#if PYOPENCL_CL_VERSION >= 0x2000
+          case CL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE:
+            PYOPENCL_GET_INTEGRAL_INFO(ProgramBuild,
+                PYOPENCL_FIRST_ARG, param_name,
+                size_t);
+#endif
 #undef PYOPENCL_FIRST_ARG
 
           default:
diff --git a/src/wrap_constants.cpp b/src/wrap_constants.cpp
index 3356eba5..7bf410c9 100644
--- a/src/wrap_constants.cpp
+++ b/src/wrap_constants.cpp
@@ -15,6 +15,7 @@ namespace
   class device_mem_cache_type { };
   class device_local_mem_type { };
   class device_exec_capabilities { };
+  class device_svm_capabilities { };
   class command_queue_properties { };
   class context_info { };
   class gl_context_info { };
@@ -38,6 +39,7 @@ namespace
   class kernel_arg_info { };
   class kernel_arg_address_qualifier { };
   class kernel_arg_access_qualifier { };
+  class kernel_arg_type_qualifier { };
   class kernel_work_group_info { };
   class event_info { };
   class command_type { };
@@ -186,6 +188,11 @@ void pyopencl_expose_constants(py::module &m)
     ADD_ATTR(, INVALID_DEVICE_PARTITION_COUNT);
 #endif
 
+#if PYOPENCL_CL_VERSION >= 0x2000
+    ADD_ATTR(, INVALID_PIPE_SIZE);
+    ADD_ATTR(, INVALID_DEVICE_QUEUE);
+#endif
+
 #if defined(cl_ext_device_fission) && defined(PYOPENCL_USE_DEVICE_FISSION)
     ADD_ATTR(, DEVICE_PARTITION_FAILED_EXT);
     ADD_ATTR(, INVALID_PARTITION_COUNT_EXT);
@@ -267,6 +274,9 @@ void pyopencl_expose_constants(py::module &m)
     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
     ADD_ATTR(DEVICE_, NAME);
     ADD_ATTR(DEVICE_, VENDOR);
     ADD_ATTR(, DRIVER_VERSION);
@@ -296,6 +306,16 @@ void pyopencl_expose_constants(py::module &m)
     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
 #endif
 // {{{ cl_amd_device_attribute_query
 #ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD
@@ -338,6 +358,19 @@ void pyopencl_expose_constants(py::module &m)
     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_MAX_ATOMIC_COUNTERS_EXT
     ADD_ATTR(DEVICE_, MAX_ATOMIC_COUNTERS_EXT);
 #endif
@@ -358,6 +391,58 @@ void pyopencl_expose_constants(py::module &m)
 #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
+    /* 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);
 #endif
   }
 
@@ -399,12 +484,27 @@ void pyopencl_expose_constants(py::module &m)
 #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);
 #endif
   }
 
@@ -456,6 +556,15 @@ void pyopencl_expose_constants(py::module &m)
     ADD_ATTR(QUEUE_, PROPERTIES);
   }
 
+  {
+    // queue_properties
+#if PYOPENCL_CL_VERSION >= 0x2000
+    py::class_<queue_properties> cls(m, "queue_properties");
+    ADD_ATTR(QUEUE_, PROPERTIES);
+    ADD_ATTR(QUEUE_, SIZE);
+#endif
+  }
+
   {
     py::class_<mem_flags> cls(m, "mem_flags");
     ADD_ATTR(MEM_, READ_WRITE);
@@ -471,6 +580,20 @@ void pyopencl_expose_constants(py::module &m)
     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
+  }
+
+  {
+#if PYOPENCL_CL_VERSION >= 0x2000
+    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);
 #endif
   }
 
@@ -489,6 +612,13 @@ void pyopencl_expose_constants(py::module &m)
     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);
 #endif
   }
 
@@ -521,6 +651,9 @@ void pyopencl_expose_constants(py::module &m)
     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);
 #endif
   }
 
@@ -536,6 +669,9 @@ void pyopencl_expose_constants(py::module &m)
 #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
   }
 
@@ -580,6 +716,11 @@ void pyopencl_expose_constants(py::module &m)
     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
   }
 
   {
@@ -613,6 +754,9 @@ void pyopencl_expose_constants(py::module &m)
     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);
 #endif
   }
 
@@ -670,6 +814,20 @@ void pyopencl_expose_constants(py::module &m)
 #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);
@@ -728,6 +886,13 @@ void pyopencl_expose_constants(py::module &m)
     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
   }
 
@@ -745,6 +910,9 @@ void pyopencl_expose_constants(py::module &m)
     ADD_ATTR(PROFILING_COMMAND_, SUBMIT);
     ADD_ATTR(PROFILING_COMMAND_, START);
     ADD_ATTR(PROFILING_COMMAND_, END);
+#if PYOPENCL_CL_VERSION >= 0x2000
+    ADD_ATTR("profiling_info", PROFILING_COMMAND_, COMPLETE);
+#endif
   }
 
 /* not needed--filled in automatically by implementation.
-- 
GitLab