From 5d2c1649f408ccd6a2bce8ef29fc78f743e1cbfc Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Wed, 9 Sep 2020 14:12:30 -0500
Subject: [PATCH] Add OpenCL 3 constants

---
 doc/make_constants.py  | 55 ++++++++++++++++++++++++--
 pyopencl/__init__.py   |  7 ++++
 src/wrap_constants.cpp | 87 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 145 insertions(+), 4 deletions(-)

diff --git a/doc/make_constants.py b/doc/make_constants.py
index 2e20383b..cca0b7ce 100644
--- a/doc/make_constants.py
+++ b/doc/make_constants.py
@@ -31,6 +31,7 @@ cl_12 = ("CL_1.2", "2011.2")
 cl_12_2015 = ("CL_1.2", "2015.2")
 cl_20 = ("CL_2.0", "2015.2")
 cl_21 = ("CL_2.1", "2016.2")
+cl_30 = ("CL_3.0", "2020.3")
 amd_devattr = ("cl_amd_device_attribute_query", "2013.2")
 qcom_hp_devattr = ("cl_qcom_ext_host_ptr", "2016.2")
 intel_me_devattr = ("cl_intel_advanced_motion_estimation", "2016.2")
@@ -58,6 +59,7 @@ def get_extra_lines(tup):
         yield "    .. versionadded:: %s" % pyopencl_ver
         yield ""
 
+
 const_ext_lookup = {
         cl.status_code: {
             "PLATFORM_NOT_FOUND_KHR": ("cl_khr_icd", "2011.1"),
@@ -184,6 +186,21 @@ const_ext_lookup = {
             "IL_VERSION": cl_21,
             "MAX_NUM_SUB_GROUPS": cl_21,
             "SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS": cl_21,
+
+            "NUMERIC_VERSION": cl_30,
+            "EXTENSIONS_WITH_VERSION": cl_30,
+            "ILS_WITH_VERSION": cl_30,
+            "BUILT_IN_KERNELS_WITH_VERSION": cl_30,
+            "ATOMIC_MEMORY_CAPABILITIES": cl_30,
+            "ATOMIC_FENCE_CAPABILITIES": cl_30,
+            "NON_UNIFORM_WORK_GROUP_SUPPORT": cl_30,
+            "OPENCL_C_ALL_VERSIONS": cl_30,
+            "PREFERRED_WORK_GROUP_SIZE_MULTIPLE": cl_30,
+            "WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT": cl_30,
+            "GENERIC_ADDRESS_SPACE_SUPPORT": cl_30,
+            "OPENCL_C_FEATURES": cl_30,
+            "DEVICE_ENQUEUE_SUPPORT": cl_30,
+            "PIPE_SUPPORT": cl_30,
             },
 
         cl.mem_object_type: {
@@ -251,6 +268,7 @@ const_ext_lookup = {
             "MIP_FILTER_MODE": cl_20,
             "LOD_MIN": cl_20,
             "LOD_MAX": cl_20,
+            "PROPERTIES": cl_30,
             },
 
         cl.event_info: {
@@ -271,6 +289,12 @@ const_ext_lookup = {
             "NUM_SAMPLES": cl_12,
             },
 
+        cl.pipe_info: {
+            "PACKET_SIZE": ("CL_2.0", "2020.3"),
+            "MAX_PACKETS": ("CL_2.0", "2020.3"),
+            "PROPERTIES": cl_30,
+            },
+
         cl.map_flags: {
             "WRITE_INVALIDATE_REGION": cl_12,
             },
@@ -343,6 +367,7 @@ const_ext_lookup = {
             "SVM_MEMFILL": cl_20,
             "SVM_MAP": cl_20,
             "SVM_UNMAP": cl_20,
+            "SVM_MIGRATE_MEM": cl_30,
             },
 
         cl.command_queue_info: {
@@ -396,6 +421,16 @@ const_ext_lookup = {
             "NEXT_PARITIONNABLE": cl_12,
             },
 
+        cl.device_atomic_capabilities: {
+            "ORDER_RELAXED": cl_30,
+            "ORDER_ACQ_REL": cl_30,
+            "ORDER_SEQ_CST": cl_30,
+            "SCOPE_WORK_ITEM": cl_30,
+            "SCOPE_WORK_GROUP": cl_30,
+            "SCOPE_DEVICE": cl_30,
+            "SCOPE_ALL_DEVICES": cl_30,
+            },
+
         cl.profiling_info: {
             "COMPLETE": cl_20,
             },
@@ -405,6 +440,18 @@ const_ext_lookup = {
             "CONTENT_UNDEFINED": cl_12,
             },
 
+        cl.version_bits: {
+            "MAJOR_BITS": cl_30,
+            "MINOR_BITS": cl_30,
+            "PATCH_BITS": cl_30,
+            "MAJOR_MASK": cl_30,
+            "MINOR_MASK": cl_30,
+            "PATCH_MASK": cl_30,
+            },
+
+        cl.khronos_vendor_id: {
+            "CODEPLAY": cl_30,
+            },
         }
 try:
     gl_ci = cl.gl_context_info
@@ -433,8 +480,8 @@ def doc_class(cls):
         print()
 
     if cls in cls_ext_lookup:
-        for l in get_extra_lines(cls_ext_lookup[cls]):
-            print(l)
+        for ln in get_extra_lines(cls_ext_lookup[cls]):
+            print(ln)
 
     cls_const_ext = const_ext_lookup.get(cls, {})
     for name in sorted(dir(cls)):
@@ -442,8 +489,8 @@ def doc_class(cls):
             print("    .. attribute :: %s" % name)
 
             if name in cls_const_ext:
-                for l in get_extra_lines(cls_const_ext[name]):
-                    print("    "+l)
+                for ln in get_extra_lines(cls_const_ext[name]):
+                    print("    "+ln)
 
     print("    .. method :: to_string(value)")
     print()
diff --git a/pyopencl/__init__.py b/pyopencl/__init__.py
index 4e2ef296..354b942b 100644
--- a/pyopencl/__init__.py
+++ b/pyopencl/__init__.py
@@ -79,6 +79,7 @@ from pyopencl._cl import (  # noqa
         mem_object_type,
         mem_info,
         image_info,
+        pipe_info,
         addressing_mode,
         filter_mode,
         sampler_info,
@@ -102,6 +103,10 @@ from pyopencl._cl import (  # noqa
         mem_migration_flags,
         device_partition_property,
         device_affinity_domain,
+        device_atomic_capabilities,
+
+        version_bits,
+        khronos_vendor_id,
 
         Error, MemoryError, LogicError, RuntimeError,
 
@@ -229,6 +234,8 @@ BITFIELD_CONSTANT_CLASSES = (
         _cl.device_svm_capabilities,
         _cl.queue_properties,
         _cl.svm_mem_flags,
+        _cl.device_atomic_capabilities,
+        _cl.version_bits,
         )
 
 
diff --git a/src/wrap_constants.cpp b/src/wrap_constants.cpp
index 2420be38..6fc5658f 100644
--- a/src/wrap_constants.cpp
+++ b/src/wrap_constants.cpp
@@ -58,6 +58,7 @@ namespace
   class mem_object_type { };
   class mem_info { };
   class image_info { };
+  class pipe_info { };
   class addressing_mode { };
   class filter_mode { };
   class sampler_info { };
@@ -82,6 +83,10 @@ namespace
 
   class device_partition_property { };
   class device_affinity_domain { };
+  class device_atomic_capabilities { };
+
+  class version_bits { };
+  class khronos_vendor_id { };
 
   class gl_object_type { };
   class gl_texture_info { };
@@ -249,6 +254,13 @@ void pyopencl_expose_constants(py::module &m)
     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);
 #endif
   }
 
@@ -459,6 +471,22 @@ void pyopencl_expose_constants(py::module &m)
 #ifdef CL_DEVICE_ME_VERSION_INTEL
     ADD_ATTR(DEVICE_, ME_VERSION_INTEL);
 #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);
+    ADD_ATTR(DEVICE_, DEVICE_ENQUEUE_SUPPORT);
+    ADD_ATTR(DEVICE_, PIPE_SUPPORT);
+#endif
 
     /* cl_qcom_ext_host_ptr */
 #ifdef CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM
@@ -595,6 +623,9 @@ void pyopencl_expose_constants(py::module &m)
     ADD_ATTR(QUEUE_, DEVICE);
     ADD_ATTR(QUEUE_, REFERENCE_COUNT);
     ADD_ATTR(QUEUE_, PROPERTIES);
+#if PYOPENCL_CL_VERSION >= 0x3000
+    ADD_ATTR(QUEUE_, PROPERTIES_ARRAY);
+#endif
   }
 
   {
@@ -602,6 +633,9 @@ void pyopencl_expose_constants(py::module &m)
 #if PYOPENCL_CL_VERSION >= 0x2000
     ADD_ATTR(QUEUE_, PROPERTIES);
     ADD_ATTR(QUEUE_, SIZE);
+#endif
+#if PYOPENCL_CL_VERSION >= 0x2010
+    ADD_ATTR(QUEUE_, DEVICE_DEFAULT);
 #endif
   }
 
@@ -712,6 +746,9 @@ void pyopencl_expose_constants(py::module &m)
 #endif
 #if PYOPENCL_CL_VERSION >= 0x2000
     ADD_ATTR(MEM_, USES_SVM_POINTER);
+#endif
+#if PYOPENCL_CL_VERSION >= 0x3000
+    ADD_ATTR(MEM_, PROPERTIES);
 #endif
   }
 
@@ -732,6 +769,16 @@ void pyopencl_expose_constants(py::module &m)
 #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_<addressing_mode> cls(m, "addressing_mode");
     ADD_ATTR(ADDRESS_, NONE);
@@ -760,6 +807,9 @@ void pyopencl_expose_constants(py::module &m)
     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);
 #endif
   }
 
@@ -938,6 +988,9 @@ void pyopencl_expose_constants(py::module &m)
     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);
 #endif
   }
 
@@ -1001,6 +1054,40 @@ void pyopencl_expose_constants(py::module &m)
 #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_<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
+  }
+
+
 #ifdef HAVE_GL
   {
     py::class_<gl_object_type> cls(m, "gl_object_type");
-- 
GitLab