module Foreign.OpenCL.Bindings.CommandQueue (
createCommandQueue, queueContext, queueDevice, queueProperties, flush
) where
import Control.Applicative
import Foreign
import Foreign.C.Types
import Foreign.OpenCL.Bindings.Internal.Types
import Foreign.OpenCL.Bindings.Internal.Finalizers
import Foreign.OpenCL.Bindings.Internal.Error
import Foreign.OpenCL.Bindings.Internal.Util
import Foreign.OpenCL.Bindings.Internal.Logging as Log
createCommandQueue :: Context
-> DeviceID
-> [CommandQueueProperties]
-> IO CommandQueue
createCommandQueue ctx dev props =
withForeignPtr ctx $ \ctx_ptr ->
alloca $ \ep -> do
Log.debug "Invoking clCreateCommandQueue"
queue <- clCreateCommandQueue ctx_ptr dev (enumToBitfield props) ep
checkClError_ "clCreateCommandQueue" =<< peek ep
attachFinalizer queue
queueContext :: CommandQueue -> IO Context
queueContext queue = getCommandQueueInfo queue QueueContext
>>= attachRetainFinalizer
queueDevice :: CommandQueue -> IO DeviceID
queueDevice queue = getCommandQueueInfo queue QueueDevice
queueProperties :: CommandQueue -> IO [CommandQueueProperties]
queueProperties queue =
enumFromBitfield queue_props <$> (getCommandQueueInfo queue QueueProperties :: IO CInt)
where
queue_props = [QueueOutOfOrderExecModeEnable,
QueueProfilingEnable]
flush :: CommandQueue -> IO ()
flush queue =
withForeignPtr queue $ \queue_ptr ->
checkClError_ "clFlush" =<< clFlush queue_ptr
getCommandQueueInfo queue info =
withForeignPtr queue $ \queue_ptr ->
getInfo (clGetCommandQueueInfo_ queue_ptr) info
where
clGetCommandQueueInfo_ =
checkClError5 "clGetCommandQueueInfo"
clGetCommandQueueInfo
foreign import ccall unsafe "Foreign/OpenCL/Bindings/CommandQueue.chs.h clCreateCommandQueue"
clCreateCommandQueue :: ((Ptr (CContext)) -> ((DeviceID) -> (CULLong -> ((Ptr CInt) -> (IO (Ptr (CCommandQueue)))))))
foreign import ccall unsafe "Foreign/OpenCL/Bindings/CommandQueue.chs.h clFlush"
clFlush :: ((Ptr (CCommandQueue)) -> (IO CInt))
foreign import ccall unsafe "Foreign/OpenCL/Bindings/CommandQueue.chs.h clGetCommandQueueInfo"
clGetCommandQueueInfo :: ((Ptr (CCommandQueue)) -> (CUInt -> (CULong -> ((Ptr ()) -> ((Ptr CULong) -> (IO CInt))))))