diff --git a/doc/make_constants.py b/doc/make_constants.py
index f4e540c6671f4ef87aa1d5a2a2aa330eff6e0dde..5bb8186f265dbeb090b9c9654f7d156b1593e086 100644
--- a/doc/make_constants.py
+++ b/doc/make_constants.py
@@ -1,19 +1,10 @@
 import pyopencl as cl
 
-devi = cl.device_info
-ctxi = cl.context_info
-ctxp = cl.context_properties
-fpc = cl.device_fp_config
-cho = cl.channel_order
-wgi = cl.kernel_work_group_info
-iam = cl.addressing_mode
-evi = cl.event_info
-memi = cl.mem_info
-ctype = cl.command_type
-memf = cl.mem_flags
-dppe = cl.device_partition_property_ext
-ade = cl.affinity_domain_ext
-mof = cl.migrate_mem_object_flags_ext
+fission = ("cl_ext_device_fission", "2011.1")
+nv_devattr = ("cl_nv_device_attribute_query", "0.92")
+gl_sharing = ("cl_khr_gl_sharing", "0.92")
+cl_11 = ("CL_1.1", "0.92")
+cl_12 = ("CL_1.2", "2011.2")
 
 def get_extra_lines(tup):
     ext_name, pyopencl_ver = tup
@@ -36,133 +27,251 @@ def get_extra_lines(tup):
         yield ""
 
 const_ext_lookup = {
-        devi: {
-            getattr(devi, "PLATFORM_NOT_FOUND_KHR", None):
-            ("cl_khr_icd", "2011.1"),
-
-            getattr(devi, "PREFERRED_VECTOR_WIDTH_HALF", None): ("CL_1.1", "0.92"),
-            getattr(devi, "HOST_UNIFIED_MEMORY", None): ("CL_1.1", "0.92"),
-            getattr(devi, "NATIVE_VECTOR_WIDTH_CHAR", None): ("CL_1.1", "0.92"),
-            getattr(devi, "NATIVE_VECTOR_WIDTH_SHORT", None): ("CL_1.1", "0.92"),
-            getattr(devi, "NATIVE_VECTOR_WIDTH_INT", None): ("CL_1.1", "0.92"),
-            getattr(devi, "NATIVE_VECTOR_WIDTH_LONG", None): ("CL_1.1", "0.92"),
-            getattr(devi, "NATIVE_VECTOR_WIDTH_FLOAT", None): ("CL_1.1", "0.92"),
-            getattr(devi, "NATIVE_VECTOR_WIDTH_DOUBLE", None): ("CL_1.1", "0.92"),
-            getattr(devi, "NATIVE_VECTOR_WIDTH_HALF", None): ("CL_1.1", "0.92"),
-            getattr(devi, "OPENCL_C_VERSION", None): ("CL_1.1", "0.92"),
-            getattr(devi, "COMPUTE_CAPABILITY_MAJOR_NV", None):
-            ("cl_nv_device_attribute_query", "0.92"),
-            getattr(devi, "COMPUTE_CAPABILITY_MINOR_NV", None):
-            ("cl_nv_device_attribute_query", "0.92"),
-            getattr(devi, "REGISTERS_PER_BLOCK_NV", None):
-            ("cl_nv_device_attribute_query", "0.92"),
-            getattr(devi, "WARP_SIZE_NV", None):
-            ("cl_nv_device_attribute_query", "0.92"),
-            getattr(devi, "GPU_OVERLAP_NV", None):
-            ("cl_nv_device_attribute_query", "0.92"),
-            getattr(devi, "KERNEL_EXEC_TIMEOUT_NV", None):
-            ("cl_nv_device_attribute_query", "0.92"),
-            getattr(devi, "INTEGRATED_MEMORY_NV", None):
-            ("cl_nv_device_attribute_query", "0.92"),
-
-            getattr(devi, "DOUBLE_FP_CONFIG", None):
+        cl.status_code: {
+            "PLATFORM_NOT_FOUND_KHR": ("cl_khr_icd", "2011.1"),
+
+            "INVALID_GL_SHAREGROUP_REFERENCE_KHR": gl_sharing,
+
+            "MISALIGNED_SUB_BUFFER_OFFSET": cl_11,
+            "EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST": cl_11,
+            "INVALID_GLOBAL_WORK_SIZE": cl_11,
+
+            "COMPILE_PROGRAM_FAILURE": cl_12,
+            "LINKER_NOT_AVAILABLE": cl_12,
+            "LINK_PROGRAM_FAILURE": cl_12,
+            "DEVICE_PARTITION_FAILED": cl_12,
+            "KERNEL_ARG_INFO_NOT_AVAILABLE": cl_12,
+            "INVALID_IMAGE_DESCRIPTOR": cl_12,
+            "INVALID_COMPILER_OPTIONS": cl_12,
+            "INVALID_LINKER_OPTIONS": cl_12,
+            "INVALID_DEVICE_PARTITION_COUNT": cl_12,
+
+            },
+
+        cl.device_info: {
+            "PREFERRED_VECTOR_WIDTH_HALF": cl_11,
+            "HOST_UNIFIED_MEMORY": cl_11,
+            "NATIVE_VECTOR_WIDTH_CHAR": cl_11,
+            "NATIVE_VECTOR_WIDTH_SHORT": cl_11,
+            "NATIVE_VECTOR_WIDTH_INT": cl_11,
+            "NATIVE_VECTOR_WIDTH_LONG": cl_11,
+            "NATIVE_VECTOR_WIDTH_FLOAT": cl_11,
+            "NATIVE_VECTOR_WIDTH_DOUBLE": cl_11,
+            "NATIVE_VECTOR_WIDTH_HALF": cl_11,
+            "OPENCL_C_VERSION": cl_11,
+            "COMPUTE_CAPABILITY_MAJOR_NV": nv_devattr,
+            "COMPUTE_CAPABILITY_MINOR_NV": nv_devattr,
+            "REGISTERS_PER_BLOCK_NV": nv_devattr,
+            "WARP_SIZE_NV": nv_devattr,
+            "GPU_OVERLAP_NV": nv_devattr,
+            "KERNEL_EXEC_TIMEOUT_NV": nv_devattr,
+            "INTEGRATED_MEMORY_NV": nv_devattr,
+
+            "DOUBLE_FP_CONFIG":
             ("cl_khr_fp64", "2011.1"),
-            getattr(devi, "HALF_FP_CONFIG", None):
+            "HALF_FP_CONFIG":
             ("cl_khr_fp16", "2011.1"),
 
-            getattr(devi, "PROFILING_TIMER_OFFSET_AMD", None):
+            "PROFILING_TIMER_OFFSET_AMD":
             ("cl_amd_device_attribute_query", "2011.1"),
 
-            getattr(devi, "PARENT_DEVICE_EXT", None):
-            ("cl_ext_device_fission", "2011.1"),
-            getattr(devi, "PARTITION_TYPES_EXT", None):
-            ("cl_ext_device_fission", "2011.1"),
-            getattr(devi, "AFFINITY_DOMAINS_EXT", None):
-            ("cl_ext_device_fission", "2011.1"),
-            getattr(devi, "REFERENCE_COUNT_EXT", None):
-            ("cl_ext_device_fission", "2011.1"),
-            getattr(devi, "PARTITION_STYLE_EXT", None):
-            ("cl_ext_device_fission", "2011.1"),
-            },
-
-        ctxp: {
-            getattr(ctxp, "GL_CONTEXT_KHR", None): ("cl_khr_gl_sharing", "0.92"),
-            getattr(ctxp, "EGL_DISPLAY_KHR", None): ("cl_khr_gl_sharing", "0.92"),
-            getattr(ctxp, "GLX_DISPLAY_KHR", None): ("cl_khr_gl_sharing", "0.92"),
-            getattr(ctxp, "WGL_HDC_KHR", None): ("cl_khr_gl_sharing", "0.92"),
-            getattr(ctxp, "CGL_SHAREGROUP_KHR", None): ("cl_khr_gl_sharing", "0.92"),
-
-            getattr(ctxp, "OFFLINE_DEVICES_AMD", None): 
+            "PARENT_DEVICE_EXT":
+            fission,
+            "PARTITION_TYPES_EXT":
+            fission,
+            "AFFINITY_DOMAINS_EXT":
+            fission,
+            "REFERENCE_COUNT_EXT":
+            fission,
+            "PARTITION_STYLE_EXT": fission,
+
+            "LINKER_AVAILABLE": cl_12,
+            "BUILT_IN_KERNELS": cl_12,
+            "IMAGE_MAX_BUFFER_SIZE": cl_12,
+            "IMAGE_MAX_ARRAY_SIZE": cl_12,
+            "PARENT_DEVICE": cl_12,
+            "PARTITION_MAX_SUB_DEVICES": cl_12,
+            "PARTITION_PROPERTIES": cl_12,
+            "PARTITION_AFFINITY_DOMAIN": cl_12,
+            "PARTITION_TYPE": cl_12,
+            "REFERENCE_COUNT": cl_12,
+            "PREFERRED_INTEROP_USER_SYNC": cl_12,
+            "PRINTF_BUFFER_SIZE": cl_12,
+            },
+
+        cl.mem_object_type: {
+            "IMAGE2D_ARRAY": cl_12,
+            "IMAGE1D": cl_12,
+            "IMAGE1D_ARRAY": cl_12,
+            "IMAGE1D_BUFFER": cl_12,
+            },
+
+        cl.device_type: {
+            "CUSTOM": cl_12,
+            },
+
+        cl.context_properties: {
+            "GL_CONTEXT_KHR": gl_sharing,
+            "EGL_DISPLAY_KHR": gl_sharing,
+            "GLX_DISPLAY_KHR": gl_sharing,
+            "WGL_HDC_KHR": gl_sharing,
+            "CGL_SHAREGROUP_KHR": gl_sharing,
+
+            "OFFLINE_DEVICES_AMD": 
             ("cl_amd_offline_devices", "2011.1"),
             },
 
-        fpc: {
-            getattr(fpc, "SOFT_FLOAT", None): ("CL_1.1", "0.92"),
+        cl.device_fp_config: {
+            "SOFT_FLOAT": cl_11,
+            "CORRECTLY_ROUNDED_DIVIDE_SQRT": cl_12,
+            },
+
+        cl.context_info: {
+            "NUM_DEVICES": cl_11,
+            "INTEROP_USER_SYNC": cl_12,
+            },
+
+        cl.channel_order: {
+            "Rx": cl_11,
+            "RGx": cl_11,
+            "RGBx": cl_11,
+            },
+
+        cl.kernel_work_group_info: {
+            "PREFERRED_WORK_GROUP_SIZE_MULTIPLE": cl_11,
+            "PRIVATE_MEM_SIZE": cl_11,
+            "GLOBAL_WORK_SIZE": cl_12,
             },
 
-        ctxi: {
-            getattr(ctxi, "NUM_DEVICES", None): ("CL_1.1", "0.92"),
+        cl.addressing_mode: {
+            "MIRRORED_REPEAT": cl_11,
             },
 
-        cho: {
-            getattr(cho, "Rx", None): ("CL_1.1", "0.92"),
-            getattr(cho, "RGx", None): ("CL_1.1", "0.92"),
-            getattr(cho, "RGBx", None): ("CL_1.1", "0.92"),
+        cl.event_info: {
+            "CONTEXT": cl_11,
             },
 
-        wgi: {
-            getattr(wgi, "PREFERRED_WORK_GROUP_SIZE_MULTIPLE", None): ("CL_1.1", "0.92"),
-            getattr(wgi, "PRIVATE_MEM_SIZE", None): ("CL_1.1", "0.92"),
+        cl.mem_info: {
+            "ASSOCIATED_MEMOBJECT": cl_11,
+            "OFFSET": cl_11,
             },
 
-        iam: {
-            getattr(iam, "MIRRORED_REPEAT", None): ("CL_1.1", "0.92"),
+        cl.image_info: {
+            "ARRAY_SIZE": cl_12,
+            "BUFFER": cl_12,
+            "NUM_MIP_LEVELS": cl_12,
+            "NUM_SAMPLES": cl_12,
             },
 
-        evi: {
-            getattr(evi, "CONTEXT", None): ("CL_1.1", "0.92"),
+        cl.map_flags: {
+            "WRITE_INVALIDATE_REGION": cl_12,
             },
 
-        memi: {
-            getattr(memi, "ASSOCIATED_MEMOBJECT", None): ("CL_1.1", "0.92"),
-            getattr(memi, "OFFSET", None): ("CL_1.1", "0.92"),
+        cl.program_info: {
+            "NUM_KERNELS": cl_12,
+            "KERNEL_NAMES": cl_12,
             },
 
-        ctype: {
-            getattr(ctype, "READ_BUFFER_RECT", None): ("CL_1.1", "0.92"),
-            getattr(ctype, "WRITE_BUFFER_RECT", None): ("CL_1.1", "0.92"),
-            getattr(ctype, "COPY_BUFFER_RECT", None): ("CL_1.1", "0.92"),
-            getattr(ctype, "USER", None): ("CL_1.1", "0.92"),
-            getattr(ctype, "MIGRATE_MEM_OBJECT_EXT", None): 
-            ("cl_ext_migrate_memobject", "2011.2"),
+        cl.program_build_info: {
+            "BINARY_TYPE": cl_12,
             },
 
-        memf: {
-            getattr(memf, "USE_PERSISTENT_MEM_AMD", None): 
+        cl.program_binary_type: {
+            "NONE": cl_12,
+            "COMPILED_OBJECT": cl_12,
+            "LIBRARY": cl_12,
+            "EXECUTABLE": cl_12,
+            },
+
+        cl.kernel_info: {
+            "ATTRIBUTES": cl_12,
+            },
+
+        cl.kernel_arg_info: {
+            "ADDRESS_QUALIFIER": cl_12,
+            "ACCESS_QUALIFIER": cl_12,
+            "TYPE_NAME": cl_12,
+            "ARG_NAME": cl_12,
+            },
+
+        cl.kernel_arg_address_qualifier: {
+            "GLOBAL": cl_12,
+            "LOCAL": cl_12,
+            "CONSTANT": cl_12,
+            "PRIVATE": cl_12,
+            },
+
+        cl.kernel_arg_access_qualifier: {
+            "READ_ONLY": cl_12,
+            "WRITE_ONLY": cl_12,
+            "READ_WRITE": cl_12,
+            "NONE": cl_12,
+            },
+
+        cl.command_type: {
+            "READ_BUFFER_RECT": cl_11,
+            "WRITE_BUFFER_RECT": cl_11,
+            "COPY_BUFFER_RECT": cl_11,
+            "USER": cl_11,
+            "MIGRATE_MEM_OBJECT_EXT": ("cl_ext_migrate_memobject", "2011.2"),
+            "BARRIER": cl_12,
+            "MIGRATE_MEM_OBJECTS": cl_12,
+            "FILL_BUFFER": cl_12,
+            "FILL_IMAGE": cl_12,
+            },
+
+        cl.mem_flags: {
+            "USE_PERSISTENT_MEM_AMD": 
             ("cl_amd_device_memory_flags", "2011.1"),
+            "HOST_WRITE_ONLY": cl_12,
             },
 
-        dppe: {
-            getattr(dppe, "EQUALLY", None): ("cl_ext_device_fission", "2011.1"),
-            getattr(dppe, "BY_COUNTS", None): ("cl_ext_device_fission", "2011.1"),
-            getattr(dppe, "BY_NAMES", None): ("cl_ext_device_fission", "2011.1"),
-            getattr(dppe, "BY_AFFINITY_DOMAIN", None): ("cl_ext_device_fission", "2011.1"),
+        cl.device_partition_property: {
+            "EQUALLY": cl_12,
+            "BY_COUNTS": cl_12,
+            "BY_NAMES": cl_12,
+            "BY_AFFINITY_DOMAIN": cl_12,
 
-            getattr(dppe, "PROPERTIES_LIST_END", None): ("cl_ext_device_fission", "2011.1"),
-            getattr(dppe, "PARTITION_BY_COUNTS_LIST_END", None): ("cl_ext_device_fission", "2011.1"),
-            getattr(dppe, "PARTITION_BY_NAMES_LIST_END", None): ("cl_ext_device_fission", "2011.1"),
+            "PROPERTIES_LIST_END": cl_12,
+            "PARTITION_BY_COUNTS_LIST_END": cl_12,
+            "PARTITION_BY_NAMES_LIST_END": cl_12,
             },
-        ade: {
-            getattr(ade, "L1_CACHE", None): ("cl_ext_device_fission", "2011.1"),
-            getattr(ade, "L2_CACHE", None): ("cl_ext_device_fission", "2011.1"),
-            getattr(ade, "L3_CACHE", None): ("cl_ext_device_fission", "2011.1"),
-            getattr(ade, "L4_CACHE", None): ("cl_ext_device_fission", "2011.1"),
-            getattr(ade, "NUMA", None): ("cl_ext_device_fission", "2011.1"),
-            getattr(ade, "NEXT_FISSIONABLE", None): ("cl_ext_device_fission", "2011.1"),
+
+        cl.affinity_domain: {
+            "NUMA": cl_12,
+            "L4_CACHE": cl_12,
+            "L3_CACHE": cl_12,
+            "L2_CACHE": cl_12,
+            "L1_CACHE": cl_12,
+            "NEXT_PARITIONNABLE": cl_12,
+            },
+
+        cl.device_partition_property_ext: {
+            "EQUALLY": fission,
+            "BY_COUNTS": fission,
+            "BY_NAMES": fission,
+            "BY_AFFINITY_DOMAIN": fission,
+
+            "PROPERTIES_LIST_END": fission,
+            "PARTITION_BY_COUNTS_LIST_END": fission,
+            "PARTITION_BY_NAMES_LIST_END": fission,
+            },
+        cl.affinity_domain_ext: {
+            "L1_CACHE": fission,
+            "L2_CACHE": fission,
+            "L3_CACHE": fission,
+            "L4_CACHE": fission,
+            "NUMA": fission,
+            "NEXT_FISSIONABLE": fission,
+            },
+
+        cl.mem_migration_flags: {
+            "HOST": cl_12,
+            "CONTENT_UNDEFINED": cl_12,
             },
 
-        mof: {
-            getattr(mof, "HOST", None): ("cl_ext_migrate_memobject", "2011.2"),
+        cl.migrate_mem_object_flags_ext: {
+            "HOST": ("cl_ext_migrate_memobject", "2011.2"),
             },
         }
 try:
@@ -172,10 +281,10 @@ except AttributeError:
 else:
     const_ext_lookup[gl_ci] = {
             getattr(gl_ci, "CURRENT_DEVICE_FOR_GL_CONTEXT_KHR", None):
-            ("cl_khr_gl_sharing", "0.92"),
+            gl_sharing,
 
             getattr(gl_ci, "DEVICES_FOR_GL_CONTEXT_KHR", None):
-            ("cl_khr_gl_sharing", "0.92"),
+            gl_sharing,
             }
 
 cls_ext_lookup = {
@@ -195,13 +304,13 @@ def doc_class(cls):
             print l
 
     cls_const_ext = const_ext_lookup.get(cls, {})
-    for i in sorted(dir(cls)):
-        if not i.startswith("_")  and not i in ["to_string", "names", "values"]:
-            print "    .. attribute :: %s" % i
-            value = getattr(cls, i)
+    for name in sorted(dir(cls)):
+        if not name.startswith("_")  and not name in ["to_string", "names", "values"]:
+            print "    .. attribute :: %s" % name
+            value = getattr(cls, name)
 
-            if value in cls_const_ext:
-                for l in get_extra_lines(cls_const_ext[value]):
+            if name in cls_const_ext:
+                for l in get_extra_lines(cls_const_ext[name]):
                     print "    "+l
 
     print "    .. method :: to_string(value)"
diff --git a/doc/source/misc.rst b/doc/source/misc.rst
index e1ae14a4e6f4eaa259c30e9c62c36a5ab120dd52..71143f9b3ea7737b54c3ecc700b602f624b888ad 100644
--- a/doc/source/misc.rst
+++ b/doc/source/misc.rst
@@ -91,6 +91,8 @@ Version 2011.2
 * Add :mod:`pyopencl.characterize`.
 * Ensure compatibility with OS X Lion.
 
+.. * Beta support for OpenCL 1.2.
+
 Version 2011.1.2
 ----------------
 
diff --git a/src/wrapper/wrap_cl.hpp b/src/wrapper/wrap_cl.hpp
index 27d671d41b2b09bc0b4a7e35cd8633d797bd66ef..17ae1a910f7d1bdce8827c481e21b48e8ff8d2d5 100644
--- a/src/wrapper/wrap_cl.hpp
+++ b/src/wrapper/wrap_cl.hpp
@@ -295,7 +295,9 @@ namespace pyopencl
   inline
   py::tuple get_cl_header_version()
   {
-#if defined(CL_VERSION_1_1)
+#if defined(CL_VERSION_1_2)
+    return py::make_tuple(1, 2);
+#elif defined(CL_VERSION_1_1)
     return py::make_tuple(1, 1);
 #else
     return py::make_tuple(1, 0);
diff --git a/src/wrapper/wrap_constants.cpp b/src/wrapper/wrap_constants.cpp
index 321fd43f928e46147e9117f22fb814fd582e9a07..2e2813c756c667ffd272dd0eee0abc1990108b55 100644
--- a/src/wrapper/wrap_constants.cpp
+++ b/src/wrapper/wrap_constants.cpp
@@ -60,21 +60,30 @@ namespace
   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 kernel_work_group_info { };
   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 affinity_domain { };
 
   class device_partition_property_ext { };
   class affinity_domain_ext { };
 
   class gl_object_type { };
   class gl_texture_info { };
-  class migrate_mem_object_flags {};
+
+  class migrate_mem_object_flags_ext {};
   // }}}
 }
 
@@ -183,6 +192,18 @@ void pyopencl_expose_constants()
     ADD_ATTR(, INVALID_GLOBAL_WORK_SIZE);
 #endif
 
+#ifdef CL_VERSION_1_2
+    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 defined(cl_ext_device_fission) && defined(PYOPENCL_USE_DEVICE_FISSION)
     ADD_ATTR(, DEVICE_PARTITION_FAILED_EXT);
     ADD_ATTR(, INVALID_PARTITION_COUNT_EXT);
@@ -207,6 +228,9 @@ void pyopencl_expose_constants()
     ADD_ATTR(DEVICE_TYPE_, CPU);
     ADD_ATTR(DEVICE_TYPE_, GPU);
     ADD_ATTR(DEVICE_TYPE_, ACCELERATOR);
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(DEVICE_TYPE_, CUSTOM);
+#endif
     ADD_ATTR(DEVICE_TYPE_, ALL);
   }
 
@@ -301,6 +325,20 @@ void pyopencl_expose_constants()
     ADD_ATTR(DEVICE_, AFFINITY_DOMAINS_EXT);
     ADD_ATTR(DEVICE_, REFERENCE_COUNT_EXT);
     ADD_ATTR(DEVICE_, PARTITION_STYLE_EXT);
+#endif
+#ifdef CL_VERSION_1_2
+    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
   }
 
@@ -314,6 +352,9 @@ void pyopencl_expose_constants()
     ADD_ATTR(FP_, FMA);
 #ifdef CL_VERSION_1_1
     ADD_ATTR(FP_, SOFT_FLOAT);
+#endif
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(FP_, CORRECTLY_ROUNDED_DIVIDE_SQRT);
 #endif
   }
 
@@ -349,6 +390,9 @@ void pyopencl_expose_constants()
     ADD_ATTR(CONTEXT_, PROPERTIES);
 #ifdef CL_VERSION_1_1
     ADD_ATTR(CONTEXT_, NUM_DEVICES);
+#endif
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(CONTEXT_, INTEROP_USER_SYNC);
 #endif
   }
 
@@ -397,6 +441,11 @@ void pyopencl_expose_constants()
     ADD_ATTR(MEM_, COPY_HOST_PTR);
 #ifdef cl_amd_device_memory_flags
     ADD_ATTR(MEM_, USE_PERSISTENT_MEM_AMD);
+#endif
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(MEM_, HOST_WRITE_ONLY);
+    ADD_ATTR(MEM_, HOST_READ_ONLY);
+    ADD_ATTR(MEM_, HOST_NO_ACCESS);
 #endif
   }
 
@@ -442,6 +491,12 @@ void pyopencl_expose_constants()
     ADD_ATTR(MEM_OBJECT_, BUFFER);
     ADD_ATTR(MEM_OBJECT_, IMAGE2D);
     ADD_ATTR(MEM_OBJECT_, IMAGE3D);
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(MEM_OBJECT_, IMAGE2D_ARRAY);
+    ADD_ATTR(MEM_OBJECT_, IMAGE1D);
+    ADD_ATTR(MEM_OBJECT_, IMAGE1D_ARRAY);
+    ADD_ATTR(MEM_OBJECT_, IMAGE1D_BUFFER);
+#endif
   }
 
   {
@@ -468,6 +523,12 @@ void pyopencl_expose_constants()
     ADD_ATTR(IMAGE_, WIDTH);
     ADD_ATTR(IMAGE_, HEIGHT);
     ADD_ATTR(IMAGE_, DEPTH);
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(IMAGE_, ARRAY_SIZE);
+    ADD_ATTR(IMAGE_, BUFFER);
+    ADD_ATTR(IMAGE_, NUM_MIP_LEVELS);
+    ADD_ATTR(IMAGE_, NUM_SAMPLES);
+#endif
   }
 
   {
@@ -500,6 +561,9 @@ void pyopencl_expose_constants()
     py::class_<map_flags> cls("map_flags", py::no_init);
     ADD_ATTR(MAP_, READ);
     ADD_ATTR(MAP_, WRITE);
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(MAP_, WRITE_INVALIDATE_REGION);
+#endif
   }
 
   {
@@ -511,6 +575,10 @@ void pyopencl_expose_constants()
     ADD_ATTR(PROGRAM_, SOURCE);
     ADD_ATTR(PROGRAM_, BINARY_SIZES);
     ADD_ATTR(PROGRAM_, BINARIES);
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(PROGRAM_, NUM_KERNELS);
+    ADD_ATTR(PROGRAM_, KERNEL_NAMES);
+#endif
   }
 
   {
@@ -518,6 +586,19 @@ void pyopencl_expose_constants()
     ADD_ATTR(PROGRAM_BUILD_, STATUS);
     ADD_ATTR(PROGRAM_BUILD_, OPTIONS);
     ADD_ATTR(PROGRAM_BUILD_, LOG);
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(PROGRAM_, BINARY_TYPE);
+#endif
+  }
+
+  {
+    py::class_<program_binary_type> cls("program_binary_type", py::no_init);
+#ifdef CL_VERSION_1_2
+    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
   }
 
   {
@@ -527,6 +608,41 @@ void pyopencl_expose_constants()
     ADD_ATTR(KERNEL_, REFERENCE_COUNT);
     ADD_ATTR(KERNEL_, CONTEXT);
     ADD_ATTR(KERNEL_, PROGRAM);
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(KERNEL_, ATTRIBUTES);
+#endif
+  }
+
+  {
+    py::class_<kernel_arg_info> cls("kernel_arg_info", py::no_init);
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(KERNEL_ARG_, ADDRESS_QUALIFIER);
+    ADD_ATTR(KERNEL_ARG_, ACCESS_QUALIFIER);
+    ADD_ATTR(KERNEL_ARG_, TYPE_NAME);
+    ADD_ATTR(KERNEL_ARG_, ARG_NAME);
+#endif
+  }
+
+  {
+    py::class_<kernel_arg_address_qualifier> cls(
+        "kernel_arg_address_qualifier", py::no_init);
+#ifdef CL_VERSION_1_2
+    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(
+        "kernel_arg_access_qualifier", py::no_init);
+#ifdef CL_VERSION_1_2
+    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
   }
 
   {
@@ -537,6 +653,9 @@ void pyopencl_expose_constants()
 #ifdef CL_VERSION_1_1
     ADD_ATTR(KERNEL_, PREFERRED_WORK_GROUP_SIZE_MULTIPLE);
     ADD_ATTR(KERNEL_, PRIVATE_MEM_SIZE);
+#endif
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(KERNEL_, GLOBAL_WORK_SIZE);
 #endif
   }
 
@@ -577,7 +696,13 @@ void pyopencl_expose_constants()
     ADD_ATTR(COMMAND_, USER);
 #endif
 #ifdef cl_ext_migrate_memobject
-    ADD_ATTR_SUFFIX(COMMAND_, MIGRATE_MEM_OBJECT, _EXT);
+    ADD_ATTR(COMMAND_, MIGRATE_MEM_OBJECT_EXT);
+#endif
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(COMMAND_, BARRIER);
+    ADD_ATTR(COMMAND_, MIGRATE_MEM_OBJECTS);
+    ADD_ATTR(COMMAND_, FILL_BUFFER);
+    ADD_ATTR(COMMAND_, FILL_IMAGE);
 #endif
   }
 
@@ -605,6 +730,16 @@ void pyopencl_expose_constants()
   }
 #endif
 */
+
+  {
+    py::class_<mem_migration_flags> cls(
+        "mem_migration_flags", py::no_init);
+#ifdef CL_VERSION_1_2
+    ADD_ATTR(MIGRATE_MEM_OBJECT_, HOST);
+    ADD_ATTR(MIGRATE_MEM_OBJECT_, CONTENT_UNDEFINED);
+#endif
+  }
+
   {
     py::class_<device_partition_property_ext> cls(
         "device_partition_property_ext", py::no_init);
@@ -631,6 +766,29 @@ void pyopencl_expose_constants()
 #endif
   }
 
+  {
+    py::class_<device_partition_property> cls(
+        "device_partition_property", py::no_init);
+#ifdef CL_VERSION_1_2
+    ADD_ATTR_SUFFIX(DEVICE_PARTITION_, EQUALLY, _EXT);
+    ADD_ATTR_SUFFIX(DEVICE_PARTITION_, BY_COUNTS, _EXT);
+    ADD_ATTR_SUFFIX(DEVICE_PARTITION_, BY_AFFINITY_DOMAIN, _EXT);
+    ADD_ATTR_SUFFIX(, PARTITION_BY_COUNTS_LIST_END, _EXT);
+#endif
+  }
+
+  {
+    py::class_<affinity_domain> cls("affinity_domain", py::no_init);
+#ifdef CL_VERSION_1_2
+    ADD_ATTR_SUFFIX(AFFINITY_DOMAIN_, NUMA, _EXT);
+    ADD_ATTR_SUFFIX(AFFINITY_DOMAIN_, L4_CACHE, _EXT);
+    ADD_ATTR_SUFFIX(AFFINITY_DOMAIN_, L3_CACHE, _EXT);
+    ADD_ATTR_SUFFIX(AFFINITY_DOMAIN_, L2_CACHE, _EXT);
+    ADD_ATTR_SUFFIX(AFFINITY_DOMAIN_, L1_CACHE, _EXT);
+    ADD_ATTR_SUFFIX(AFFINITY_DOMAIN_, NEXT_PARTITIONABLE, _EXT);
+#endif
+  }
+
 #ifdef HAVE_GL
   {
     py::class_<gl_object_type> cls("gl_object_type", py::no_init);
@@ -648,7 +806,7 @@ void pyopencl_expose_constants()
 #endif
 
   {
-    py::class_<migrate_mem_object_flags> cls("migrate_mem_object_flags_ext", py::no_init);
+    py::class_<migrate_mem_object_flags_ext> cls("migrate_mem_object_flags_ext", py::no_init);
 #ifdef cl_ext_migrate_memobject
     ADD_ATTR_SUFFIX(MIGRATE_MEM_OBJECT_, HOST, _EXT);
 #endif