(in-package #:ocl) (defun create-command-queue-with-properties (context device &key queue-properties queue-size) (let ((properties '(0))) (when queue-properties (push (cffi:foreign-bitfield-value 'cl-command-queue-properties queue-properties) properties) (push :queue-properties properties)) (when queue-size (push queue-size properties) (push :queue-size properties)) (with-foreign-sequence (c-properties properties 'cl-queue-properties) (check-error-arg (%create-command-queue-with-properties context device c-properties))))) (defun retain-command-queue (command-queue) (check-error (%retain-command-queue command-queue))) (defun release-command-queue (command-queue) (check-error (%release-command-queue command-queue))) (defparameter +command-queue-info-type-alist+ '((:queue-context . cl-context) (:queue-device . cl-device-id) (:queue-reference-count . cl-uint) (:queue-properties . cl-command-queue-properties) (:queue-properties-array . (:pointer cl-queue-properties)) (:queue-size . cl-uint) (:queue-device-default . cl-command-queue))) (wrap-get-info-function get-command-queue-info %get-command-queue-info +command-queue-info-type-alist+) (defmacro with-command-queue ((queue context device &key queue-properties queue-size) &body body) `(let ((,queue (create-command-queue-with-properties ,context ,device :queue-properties ,queue-properties :queue-size ,queue-size))) (unwind-protect (progn ,@body) (release-command-queue ,queue))))