summaryrefslogtreecommitdiff
path: root/src/program.lisp
blob: 4f27a251ef4ed73b496e52b668f55b28f9d80881 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
(in-package #:ocl)

(defun create-program-with-source (context list-of-strings)
  (setf list-of-strings (alexandria:ensure-list list-of-strings))
  (let ((num-strings (length list-of-strings)))
    (cffi:with-foreign-object (c-strings :pointer num-strings)
      (dotimes (i num-strings)
        (setf (cffi:mem-aref c-strings :pointer i)
              (cffi:foreign-string-alloc (elt list-of-strings i))))
      (unwind-protect
           (check-error-arg (%create-program-with-source context num-strings c-strings (cffi:null-pointer)))
        (dotimes (i num-strings)
          (cffi:foreign-string-free (cffi:mem-aref c-strings :pointer i)))))))

(defun retain-program (program)
  (check-error (%retain-program program)))

(defun release-program (program)
  (%release-program program))

(defun build-program (program device-list &key (options (cffi:null-pointer))
                                            (pfn-notify (cffi:null-pointer))
                                            (user-data (cffi:null-pointer)))
  (setf device-list (alexandria:ensure-list device-list))
  (with-foreign-sequence (c-devices device-list 'cl-device-id num-devices)
    (check-error (%build-program program num-devices c-devices options
                                 pfn-notify user-data))))

;; (defun compile-program (program device-list
;;                         &key (options (cffi:null-pointer))
;;                           input-headers
;;                           header-include-names
;;                           (pfn-notify (cffi:null-pointer))
;;                           (user-data (cffi:null-pointer)))
;;   (with-foreign-sequence ((c-device-list device-list 'cl-device-id num-devices)
;;                           (c-input-headers input-headers 'cl-program num-input-headers))
;;     (check-error (%compile-program program num-devices c-device-list options
;;                                    num-input-headers c-input-headers
;;                                    pfn-notify user-data))))

(defun link-program (context device-list input-programs &key (options (cffi:null-pointer))
                                                          (pfn-notify (cffi:null-pointer))
                                                          (user-data (cffi:null-pointer)))
  (assert (not (emptyp input-programs)))
  (with-foreign-sequences ((c-device-list device-list 'cl-device-id num-devices)
                           (c-input-programs input-programs 'cl-program num-input-programs))
    (check-error-arg (%link-program context num-devices c-device-list options
                                    num-input-programs c-input-programs
                                    pfn-notify user-data))))

(defun unload-platform-compiler (platform)
  (check-error (%unload-platform-compiler platform)))

(defparameter +program-info-type-alist+
  '((:program-reference-count            . cl-uint)
    (:program-context                    . cl-context)
    (:program-num-devices                . cl-uint)
    (:program-devices                    . (:pointer cl-device-id))
    (:program-source                     . :string)
    (:program-il                         . (:pointer :char))
    (:program-binary-sizes               . (:pointer :size))
    (:program-binaries                   . (:pointer (:pointer :char)))
    (:program-num-kernels                . :size)
    (:program-kernel-names               . (:pointer :char))
    (:program-scope-global-ctors-present . cl-bool)
    (:program-scope-global-dtors-present . cl-bool)))

;; %get-program-info

(defparameter +program-build-info-type-alist+
  '((:program-build-status                     . cl-build-status)
    (:program-build-options                    . :string)
    (:program-build-log                        . :string)
    (:program-binary-type                      . cl-program-binary-type)
    (:program-build-global-variable-total-size . :size)))

;; %get-program-build-info

(defmacro with-program-from-source ((program context list-of-strings) &body body)
  `(let ((,program (create-program-with-source ,context ,list-of-strings)))
     (unwind-protect
          (progn ,@body)
       (release-program ,program))))