 (defn info-error-correction-support [device]
   (info-bool* CL/clGetDeviceInfo device CL/CL_DEVICE_ERROR_CORRECTION_SUPPORT))
 
-;;TODO
 (defn info-execution-capabilities [device]
-  (info-long* CL/clGetDeviceInfo device CL/CL_DEVICE_EXECUTION_CAPABILITIES))
-
-;;TODO partition the string
+  (info-mask* CL/clGetDeviceInfo device
+              CL/CL_DEVICE_DOUBLE_FP_CONFIG
+              exec-capabilities-table))
+
 (defn info-extensions [device]
-  (info-string* CL/clGetDeviceInfo device CL/CL_DEVICE_EXTENSIONS))
+  (str/split (info-string* CL/clGetDeviceInfo device
+                           CL/CL_DEVICE_EXTENSIONS)
+             #" "))
 
 (defn info-global-mem-cache-size [device]
   (info-long* CL/clGetDeviceInfo device CL/CL_DEVICE_GLOBAL_MEM_CACHE_SIZE))
 
-;;TODO
 (defn info-global-mem-cache-type [device]
-  (info-long* CL/clGetDeviceInfo device CL/CL_DEVICE_GLOBAL_MEM_CACHE_TYPE))
+  (info-mask-one* CL/clGetDeviceInfo device
+                  CL/CL_DEVICE_GLOBAL_MEM_CACHE_TYPE
+                  cache-type-table))
 
 (defn info-global-mem-cacheline-size ^long [device]
   (info-int* CL/clGetDeviceInfo device CL/CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE))

  (info-bool* CL/clGetDeviceInfo device CL/CL_DEVICE_AVAILABLE))

(defn info-built-in-kernels [device]
  (info-string* CL/clGetDeviceInfo device CL/CL_DEVICE_BUILT_IN_KERNELS))

(defn info-compiler-available [device]
  (info-bool* CL/clGetDeviceInfo device CL/CL_DEVICE_COMPILER_AVAILABLE))

;;TODO
(defn info-double-fp-config [device]
  (info-long* CL/clGetDeviceInfo device CL/CL_DEVICE_DOUBLE_FP_CONFIG))

(defn info-endian-little [device]
  (info-bool* CL/clGetDeviceInfo device CL/CL_DEVICE_ENDIAN_LITTLE))

;; ============= Context ===========================================
(defn context-properties [props]
  (reduce (fn [^cl_context_properties cp [p v]]
            (doto cp (.addProperty (context-prop-table p) v)))
          (cl_context_properties.)
          props))

