-- GENERATED by C->Haskell Compiler, version 0.16.3 Crystal Seed, 24 Jan 2009 (Haskell) -- Edit the ORIGNAL .chs file instead! {-# LINE 1 "src/Control/Parallel/OpenCL/Memory.chs" #-}{- Copyright (c) 2011 Luis Cabellos, All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of nor the names of other contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -} {-# LANGUAGE ForeignFunctionInterface, ScopedTypeVariables, CPP #-} module Control.Parallel.OpenCL.Memory( -- * Types CLMem, CLSampler, CLMemFlag(..), CLMemObjectType(..), CLAddressingMode(..), CLFilterMode(..), CLImageFormat(..), -- * Memory Functions clCreateBuffer, clRetainMemObject, clReleaseMemObject, clGetMemType, clGetMemFlags, clGetMemSize, clGetMemHostPtr, clGetMemMapCount, clGetMemReferenceCount, clGetMemContext, -- * Image Functions clCreateImage2D, clCreateImage3D, clGetSupportedImageFormats, clGetImageFormat, clGetImageElementSize, clGetImageRowPitch, clGetImageSlicePitch, clGetImageWidth, clGetImageHeight, clGetImageDepth, -- * Sampler Functions clCreateSampler, clRetainSampler, clReleaseSampler, clGetSamplerReferenceCount, clGetSamplerContext, clGetSamplerAddressingMode, clGetSamplerFilterMode, clGetSamplerNormalizedCoords ) where -- ----------------------------------------------------------------------------- import Foreign import Foreign.C.Types import Control.Applicative( (<$>), (<*>) ) import Control.Parallel.OpenCL.Types( CLMem, CLContext, CLSampler, CLint, CLuint, CLbool, CLMemFlags_, CLMemInfo_, CLAddressingMode_, CLFilterMode_, CLSamplerInfo_, CLImageInfo_, CLAddressingMode(..), CLFilterMode(..), CLMemFlag(..), CLMemObjectType_, CLMemObjectType(..), wrapPError, wrapCheckSuccess, wrapGetInfo, whenSuccess, getEnumCL, bitmaskFromFlags, bitmaskToMemFlags, getCLValue ) -- ----------------------------------------------------------------------------- foreign import CALLCONV "clCreateBuffer" raw_clCreateBuffer :: CLContext -> CLMemFlags_ -> CSize -> Ptr () -> Ptr CLint -> IO CLMem foreign import CALLCONV "clCreateImage2D" raw_clCreateImage2D :: CLContext -> CLMemFlags_ -> CLImageFormat_p -> CSize -> CSize -> CSize -> Ptr () -> Ptr CLint -> IO CLMem foreign import CALLCONV "clCreateImage3D" raw_clCreateImage3D :: CLContext -> CLMemFlags_-> CLImageFormat_p -> CSize -> CSize -> CSize -> CSize -> CSize -> Ptr () -> Ptr CLint -> IO CLMem foreign import CALLCONV "clRetainMemObject" raw_clRetainMemObject :: CLMem -> IO CLint foreign import CALLCONV "clReleaseMemObject" raw_clReleaseMemObject :: CLMem -> IO CLint foreign import CALLCONV "clGetSupportedImageFormats" raw_clGetSupportedImageFormats :: CLContext -> CLMemFlags_ -> CLMemObjectType_ -> CLuint -> CLImageFormat_p -> Ptr CLuint -> IO CLint foreign import CALLCONV "clGetMemObjectInfo" raw_clGetMemObjectInfo :: CLMem -> CLMemInfo_ -> CSize -> Ptr () -> Ptr CSize -> IO CLint foreign import CALLCONV "clGetImageInfo" raw_clGetImageInfo :: CLMem -> CLImageInfo_ -> CSize -> Ptr () -> Ptr CSize -> IO CLint foreign import CALLCONV "clCreateSampler" raw_clCreateSampler :: CLContext -> CLbool -> CLAddressingMode_ -> CLFilterMode_ -> Ptr CLint -> IO CLSampler foreign import CALLCONV "clRetainSampler" raw_clRetainSampler :: CLSampler -> IO CLint foreign import CALLCONV "clReleaseSampler" raw_clReleaseSampler :: CLSampler -> IO CLint foreign import CALLCONV "clGetSamplerInfo" raw_clGetSamplerInfo :: CLSampler -> CLSamplerInfo_ -> CSize -> Ptr () -> Ptr CSize -> IO CLint -- ----------------------------------------------------------------------------- {-| Creates a buffer object. Returns a valid non-zero buffer object if the buffer object is created successfully. Otherwise, it throws the 'CLError': * 'CL_INVALID_CONTEXT' if context is not a valid context. * 'CL_INVALID_VALUE' if values specified in flags are not valid. * 'CL_INVALID_BUFFER_SIZE' if size is 0 or is greater than 'clDeviceMaxMemAllocSize' value for all devices in context. * 'CL_INVALID_HOST_PTR' if host_ptr is NULL and 'CL_MEM_USE_HOST_PTR' or 'CL_MEM_COPY_HOST_PTR' are set in flags or if host_ptr is not NULL but 'CL_MEM_COPY_HOST_PTR' or 'CL_MEM_USE_HOST_PTR' are not set in flags. * 'CL_MEM_OBJECT_ALLOCATION_FAILURE' if there is a failure to allocate memory for buffer object. * 'CL_OUT_OF_HOST_MEMORY' if there is a failure to allocate resources required by the OpenCL implementation on the host. -} clCreateBuffer :: Integral a => CLContext -> [CLMemFlag] -> (a, Ptr ()) -> IO CLMem clCreateBuffer ctx xs (sbuff,buff) = wrapPError $ \perr -> do raw_clCreateBuffer ctx flags (fromIntegral sbuff) buff perr where flags = bitmaskFromFlags xs -- | Increments the memory object reference count. returns 'True' if the -- function is executed successfully. After the memobj reference count becomes -- zero and commands queued for execution on a command-queue(s) that use memobj -- have finished, the memory object is deleted. It returns 'False' if memobj is -- not a valid memory object. clRetainMemObject :: CLMem -> IO Bool clRetainMemObject mem = wrapCheckSuccess $ raw_clRetainMemObject mem -- | Decrements the memory object reference count. After the memobj reference -- count becomes zero and commands queued for execution on a command-queue(s) -- that use memobj have finished, the memory object is deleted. Returns 'True' -- if the function is executed successfully. It returns 'False' if memobj is not -- a valid memory object. clReleaseMemObject :: CLMem -> IO Bool clReleaseMemObject mem = wrapCheckSuccess $ raw_clReleaseMemObject mem -- ----------------------------------------------------------------------------- {-| Specifies the number of channels and the channel layout i.e. the memory layout in which channels are stored in the image. Valid values are described in the table below. * 'CL_R', 'CL_A'. * 'CL_INTENSITY', This format can only be used if channel data type = 'CL_UNORM_INT8', 'CL_UNORM_INT16', 'CL_SNORM_INT8', 'CL_SNORM_INT16', 'CL_HALF_FLOAT', or 'CL_FLOAT'. * 'CL_LUMINANCE', This format can only be used if channel data type = 'CL_UNORM_INT8', 'CL_UNORM_INT16', 'CL_SNORM_INT8', 'CL_SNORM_INT16', 'CL_HALF_FLOAT', or 'CL_FLOAT'. * 'CL_RG', 'CL_RA'. * 'CL_RGB', This format can only be used if channel data type = 'CL_UNORM_SHORT_565', 'CL_UNORM_SHORT_555' or 'CL_UNORM_INT101010'. * 'CL_RGBA'. * 'CL_ARGB', 'CL_BGRA'. This format can only be used if channel data type = 'CL_UNORM_INT8', 'CL_SNORM_INT8', 'CL_SIGNED_INT8' or 'CL_UNSIGNED_INT8'. -} data CLChannelOrder = CL_R | CL_A | CL_INTENSITY | CL_LUMINANCE | CL_RG | CL_RA | CL_RGB | CL_RGBA | CL_ARGB | CL_BGRA deriving (Show) instance Enum CLChannelOrder where fromEnum CL_R = 4272 fromEnum CL_A = 4273 fromEnum CL_INTENSITY = 4280 fromEnum CL_LUMINANCE = 4281 fromEnum CL_RG = 4274 fromEnum CL_RA = 4275 fromEnum CL_RGB = 4276 fromEnum CL_RGBA = 4277 fromEnum CL_ARGB = 4279 fromEnum CL_BGRA = 4278 toEnum 4272 = CL_R toEnum 4273 = CL_A toEnum 4280 = CL_INTENSITY toEnum 4281 = CL_LUMINANCE toEnum 4274 = CL_RG toEnum 4275 = CL_RA toEnum 4276 = CL_RGB toEnum 4277 = CL_RGBA toEnum 4279 = CL_ARGB toEnum 4278 = CL_BGRA toEnum unmatched = error ("CLChannelOrder.toEnum: Cannot match " ++ show unmatched) {-# LINE 180 "src/Control/Parallel/OpenCL/Memory.chs" #-} {-| Describes the size of the channel data type. The number of bits per element determined by the image_channel_data_type and image_channel_order must be a power of two. The list of supported values is described in the table below. * 'CL_SNORM_INT8', Each channel component is a normalized signed 8-bit integer value. * 'CL_SNORM_INT16', Each channel component is a normalized signed 16-bit integer value. * 'CL_UNORM_INT8', Each channel component is a normalized unsigned 8-bit integer value. * 'CL_UNORM_INT16', Each channel component is a normalized unsigned 16-bit integer value. * 'CL_UNORM_SHORT_565', Represents a normalized 5-6-5 3-channel RGB image. The channel order must be 'CL_RGB'. * 'CL_UNORM_SHORT_555', Represents a normalized x-5-5-5 4-channel xRGB image. The channel order must be 'CL_RGB'. * 'CL_UNORM_INT_101010', Represents a normalized x-10-10-10 4-channel xRGB image. The channel order must be 'CL_RGB'. * 'CL_SIGNED_INT8', Each channel component is an unnormalized signed 8-bit integer value. * 'CL_SIGNED_INT16', Each channel component is an unnormalized signed 16-bit integer value. * 'CL_SIGNED_INT32', Each channel component is an unnormalized signed 32-bit integer value. * 'CL_UNSIGNED_INT8', Each channel component is an unnormalized unsigned 8-bit integer value. * 'CL_UNSIGNED_INT16', Each channel component is an unnormalized unsigned 16-bit integer value. * 'CL_UNSIGNED_INT32', Each channel component is an unnormalized unsigned 32-bit integer value. * 'CL_HALF_FLOAT', Each channel component is a 16-bit half-float value. * 'CL_FLOAT', Each channel component is a single precision floating-point value. -} data CLChannelType = CL_SNORM_INT8 | CL_SNORM_INT16 | CL_UNORM_INT8 | CL_UNORM_INT16 | CL_UNORM_SHORT_565 | CL_UNORM_SHORT_555 | CL_UNORM_INT_101010 | CL_SIGNED_INT8 | CL_SIGNED_INT16 | CL_SIGNED_INT32 | CL_UNSIGNED_INT8 | CL_UNSIGNED_INT16 | CL_UNSIGNED_INT32 | CL_HALF_FLOAT | CL_FLOAT deriving (Show) instance Enum CLChannelType where fromEnum CL_SNORM_INT8 = 4304 fromEnum CL_SNORM_INT16 = 4305 fromEnum CL_UNORM_INT8 = 4306 fromEnum CL_UNORM_INT16 = 4307 fromEnum CL_UNORM_SHORT_565 = 4308 fromEnum CL_UNORM_SHORT_555 = 4309 fromEnum CL_UNORM_INT_101010 = 4310 fromEnum CL_SIGNED_INT8 = 4311 fromEnum CL_SIGNED_INT16 = 4312 fromEnum CL_SIGNED_INT32 = 4313 fromEnum CL_UNSIGNED_INT8 = 4314 fromEnum CL_UNSIGNED_INT16 = 4315 fromEnum CL_UNSIGNED_INT32 = 4316 fromEnum CL_HALF_FLOAT = 4317 fromEnum CL_FLOAT = 4318 toEnum 4304 = CL_SNORM_INT8 toEnum 4305 = CL_SNORM_INT16 toEnum 4306 = CL_UNORM_INT8 toEnum 4307 = CL_UNORM_INT16 toEnum 4308 = CL_UNORM_SHORT_565 toEnum 4309 = CL_UNORM_SHORT_555 toEnum 4310 = CL_UNORM_INT_101010 toEnum 4311 = CL_SIGNED_INT8 toEnum 4312 = CL_SIGNED_INT16 toEnum 4313 = CL_SIGNED_INT32 toEnum 4314 = CL_UNSIGNED_INT8 toEnum 4315 = CL_UNSIGNED_INT16 toEnum 4316 = CL_UNSIGNED_INT32 toEnum 4317 = CL_HALF_FLOAT toEnum 4318 = CL_FLOAT toEnum unmatched = error ("CLChannelType.toEnum: Cannot match " ++ show unmatched) {-# LINE 249 "src/Control/Parallel/OpenCL/Memory.chs" #-} data CLImageFormat = CLImageFormat { image_channel_order :: ! CLChannelOrder , image_channel_data_type :: ! CLChannelType } deriving( Show ) type CLImageFormat_p = Ptr (CLImageFormat) {-# LINE 255 "src/Control/Parallel/OpenCL/Memory.chs" #-} instance Storable CLImageFormat where alignment _ = alignment (undefined :: CDouble) sizeOf _ = 8 {-# LINE 258 "src/Control/Parallel/OpenCL/Memory.chs" #-} peek p = CLImageFormat <$> fmap getEnumCL ((\ptr -> do {peekByteOff ptr 0 ::IO CUInt}) p) <*> fmap getEnumCL ((\ptr -> do {peekByteOff ptr 4 ::IO CUInt}) p) poke p (CLImageFormat a b) = do (\ptr val -> do {pokeByteOff ptr 0 (val::CUInt)}) p (getCLValue a) (\ptr val -> do {pokeByteOff ptr 4 (val::CUInt)}) p (getCLValue b) -- ----------------------------------------------------------------------------- {-| Creates a 2D image object. 'clCreateImage2D' returns a valid non-zero image object created if the image object is created successfully. Otherwise, it throws one of the following 'CLError' exceptions: * 'CL_INVALID_CONTEXT' if context is not a valid context. * 'CL_INVALID_VALUE' if values specified in flags are not valid. * 'CL_INVALID_IMAGE_FORMAT_DESCRIPTOR' if values specified in image_format are not valid. * 'CL_INVALID_IMAGE_SIZE' if image_width or image_height are 0 or if they exceed values specified in 'CL_DEVICE_IMAGE2D_MAX_WIDTH' or 'CL_DEVICE_IMAGE2D_MAX_HEIGHT' respectively for all devices in context or if values specified by image_row_pitch do not follow rules described in the argument description above. * 'CL_INVALID_HOST_PTR' if host_ptr is 'nullPtr' and 'CL_MEM_USE_HOST_PTR' or 'CL_MEM_COPY_HOST_PTR' are set in flags or if host_ptr is not 'nullPtr' but 'CL_MEM_COPY_HOST_PTR' or 'CL_MEM_USE_HOST_PTR' are not set in flags. * 'CL_IMAGE_FORMAT_NOT_SUPPORTED' if the image_format is not supported. * 'CL_MEM_OBJECT_ALLOCATION_FAILURE' if there is a failure to allocate memory for image object. * 'CL_INVALID_OPERATION' if there are no devices in context that support images (i.e. 'CL_DEVICE_IMAGE_SUPPORT' (specified in the table of OpenCL Device Queries for 'clGetDeviceInfo') is 'False'). * 'CL_OUT_OF_HOST_MEMORY' if there is a failure to allocate resources required by the OpenCL implementation on the host. -} clCreateImage2D :: Integral a => CLContext -- ^ A valid OpenCL context on which -- the image object is to be created. -> [CLMemFlag] -- ^ A list of flags that is used to specify -- allocation and usage information about the -- image memory object being created. -> CLImageFormat -- ^ Structure that describes format -- properties of the image to be allocated. -> a -- ^ The width of the image in pixels. It must be values -- greater than or equal to 1. -> a -- ^ The height of the image in pixels. It must be -- values greater than or equal to 1. -> a -- ^ The scan-line pitch in bytes. This must be 0 if -- host_ptr is 'nullPtr' and can be either 0 or greater -- than or equal to image_width * size of element in -- bytes if host_ptr is not 'nullPtr'. If host_ptr is -- not 'nullPtr' and image_row_pitch is equal to 0, -- image_row_pitch is calculated as image_width * size -- of element in bytes. If image_row_pitch is not 0, it -- must be a multiple of the image element size in -- bytes. -> Ptr () -- ^ A pointer to the image data that may already -- be allocated by the application. The size of the -- buffer that host_ptr points to must be greater -- than or equal to image_row_pitch * -- image_height. The size of each element in bytes -- must be a power of 2. The image data specified -- by host_ptr is stored as a linear sequence of -- adjacent scanlines. Each scanline is stored as a -- linear sequence of image elements. -> IO CLMem clCreateImage2D ctx xs fmt iw ih irp ptr = wrapPError $ \perr -> with fmt $ \pfmt -> do raw_clCreateImage2D ctx flags pfmt ciw cih cirp ptr perr where flags = bitmaskFromFlags xs ciw = fromIntegral iw cih = fromIntegral ih cirp = fromIntegral irp {-| Creates a 3D image object. 'clCreateImage3D' returns a valid non-zero image object created if the image object is created successfully. Otherwise, it throws one of the following 'CLError' exceptions: * 'CL_INVALID_CONTEXT' if context is not a valid context. * 'CL_INVALID_VALUE' if values specified in flags are not valid. * 'CL_INVALID_IMAGE_FORMAT_DESCRIPTOR' if values specified in image_format are not valid. * 'CL_INVALID_IMAGE_SIZE' if image_width, image_height are 0 or if image_depth less than or equal to 1 or if they exceed values specified in 'CL_DEVICE_IMAGE3D_MAX_WIDTH', CL_DEVICE_IMAGE3D_MAX_HEIGHT' or 'CL_DEVICE_IMAGE3D_MAX_DEPTH' respectively for all devices in context or if values specified by image_row_pitch and image_slice_pitch do not follow rules described in the argument description above. * 'CL_INVALID_HOST_PTR' if host_ptr is 'nullPtr' and 'CL_MEM_USE_HOST_PTR' or 'CL_MEM_COPY_HOST_PTR' are set in flags or if host_ptr is not 'nullPtr' but 'CL_MEM_COPY_HOST_PTR' or 'CL_MEM_USE_HOST_PTR' are not set in flags. * 'CL_IMAGE_FORMAT_NOT_SUPPORTED' if the image_format is not supported. * 'CL_MEM_OBJECT_ALLOCATION_FAILURE' if there is a failure to allocate memory for image object. * 'CL_INVALID_OPERATION' if there are no devices in context that support images (i.e. 'CL_DEVICE_IMAGE_SUPPORT' (specified in the table of OpenCL Device Queries for clGetDeviceInfo) is 'False'). * 'CL_OUT_OF_HOST_MEMORY' if there is a failure to allocate resources required by the OpenCL implementation on the host. -} clCreateImage3D :: Integral a => CLContext -- ^ A valid OpenCL context on which -- the image object is to be created. -> [CLMemFlag] -- ^ A list of flags that is used to specify -- allocation and usage information about the -- image memory object being created. -> CLImageFormat -- ^ Structure that describes format -- properties of the image to be allocated. -> a -- ^ The width of the image in pixels. It must be values -- greater than or equal to 1. -> a -- ^ The height of the image in pixels. It must be -- values greater than or equal to 1. -> a -- ^ The depth of the image in pixels. This must be a -- value greater than 1. -> a -- ^ The scan-line pitch in bytes. This must be 0 if -- host_ptr is 'nullPtr' and can be either 0 or greater -- than or equal to image_width * size of element in -- bytes if host_ptr is not 'nullPtr'. If host_ptr is -- not 'nullPtr' and image_row_pitch is equal to 0, -- image_row_pitch is calculated as image_width * size -- of element in bytes. If image_row_pitch is not 0, it -- must be a multiple of the image element size in -- bytes. -> a -- ^ The size in bytes of each 2D slice in the 3D -- image. This must be 0 if host_ptr is 'nullPtr' and -- can be either 0 or greater than or equal to -- image_row_pitch * image_height if host_ptr is not -- 'nullPtr'. If host_ptr is not 'nullPtr' and -- image_slice_pitch equal to 0, image_slice_pitch is -- calculated as image_row_pitch * image_height. If -- image_slice_pitch is not 0, it must be a multiple of -- the image_row_pitch. -> Ptr () -- ^ A pointer to the image data that may already -- be allocated by the application. The size of the -- buffer that host_ptr points to must be greater -- than or equal to image_slice_pitch * -- image_depth. The size of each element in bytes -- must be a power of 2. The image data specified -- by host_ptr is stored as a linear sequence of -- adjacent 2D slices. Each 2D slice is a linear -- sequence of adjacent scanlines. Each scanline is -- a linear sequence of image elements. -> IO CLMem clCreateImage3D ctx xs fmt iw ih idepth irp isp ptr = wrapPError $ \perr -> with fmt $ \pfmt -> do raw_clCreateImage3D ctx flags pfmt ciw cih cid cirp cisp ptr perr where flags = bitmaskFromFlags xs ciw = fromIntegral iw cih = fromIntegral ih cid = fromIntegral idepth cirp = fromIntegral irp cisp = fromIntegral isp getNumSupportedImageFormats :: CLContext -> [CLMemFlag] -> CLMemObjectType -> IO CLuint getNumSupportedImageFormats ctx xs mtype = alloca $ \(value_size :: Ptr CLuint) -> do whenSuccess (raw_clGetSupportedImageFormats ctx flags (getCLValue mtype) 0 nullPtr value_size) $ peek value_size where flags = bitmaskFromFlags xs {-| Get the list of image formats supported by an OpenCL implementation. 'clGetSupportedImageFormats' can be used to get the list of image formats supported by an OpenCL implementation when the following information about an image memory object is specified: * Context * Image type - 2D or 3D image * Image object allocation information Throws 'CL_INVALID_CONTEXT' if context is not a valid context, throws 'CL_INVALID_VALUE' if flags or image_type are not valid. -} clGetSupportedImageFormats :: CLContext -- ^ A valid OpenCL context on which the -- image object(s) will be created. -> [CLMemFlag] -- ^ A bit-field that is used to -- specify allocation and usage -- information about the image -- memory object. -> CLMemObjectType -- ^ Describes the image type -- and must be either -- 'CL_MEM_OBJECT_IMAGE2D' or -- 'CL_MEM_OBJECT_IMAGE3D'. -> IO [CLImageFormat] clGetSupportedImageFormats ctx xs mtype = do num <- getNumSupportedImageFormats ctx xs mtype allocaArray (fromIntegral num) $ \(buff :: Ptr CLImageFormat) -> do whenSuccess (raw_clGetSupportedImageFormats ctx flags (getCLValue mtype) num (castPtr buff) nullPtr) $ peekArray (fromIntegral num) buff where flags = bitmaskFromFlags xs -- ----------------------------------------------------------------------------- data CLImageInfo = CL_IMAGE_FORMAT | CL_IMAGE_ELEMENT_SIZE | CL_IMAGE_ROW_PITCH | CL_IMAGE_SLICE_PITCH | CL_IMAGE_WIDTH | CL_IMAGE_HEIGHT | CL_IMAGE_DEPTH instance Enum CLImageInfo where fromEnum CL_IMAGE_FORMAT = 4368 fromEnum CL_IMAGE_ELEMENT_SIZE = 4369 fromEnum CL_IMAGE_ROW_PITCH = 4370 fromEnum CL_IMAGE_SLICE_PITCH = 4371 fromEnum CL_IMAGE_WIDTH = 4372 fromEnum CL_IMAGE_HEIGHT = 4373 fromEnum CL_IMAGE_DEPTH = 4374 toEnum 4368 = CL_IMAGE_FORMAT toEnum 4369 = CL_IMAGE_ELEMENT_SIZE toEnum 4370 = CL_IMAGE_ROW_PITCH toEnum 4371 = CL_IMAGE_SLICE_PITCH toEnum 4372 = CL_IMAGE_WIDTH toEnum 4373 = CL_IMAGE_HEIGHT toEnum 4374 = CL_IMAGE_DEPTH toEnum unmatched = error ("CLImageInfo.toEnum: Cannot match " ++ show unmatched) {-# LINE 482 "src/Control/Parallel/OpenCL/Memory.chs" #-} -- | Return image format descriptor specified when image is created with -- clCreateImage2D or clCreateImage3D. -- -- This function execute OpenCL clGetImageInfo with 'CL_IMAGE_FORMAT'. clGetImageFormat :: CLMem -> IO CLImageFormat clGetImageFormat mem = wrapGetInfo (\(dat :: Ptr CLImageFormat) -> raw_clGetImageInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_IMAGE_FORMAT size = fromIntegral $ sizeOf (undefined :: CLImageFormat) -- | Return size of each element of the image memory object given by image. An -- element is made up of n channels. The value of n is given in 'CLImageFormat' -- descriptor. -- -- This function execute OpenCL clGetImageInfo with 'CL_IMAGE_ELEMENT_SIZE'. clGetImageElementSize :: CLMem -> IO CSize clGetImageElementSize mem = wrapGetInfo (\(dat :: Ptr CSize) -> raw_clGetImageInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_IMAGE_ELEMENT_SIZE size = fromIntegral $ sizeOf (undefined :: CSize) -- | Return size in bytes of a row of elements of the image object given by -- image. -- -- This function execute OpenCL clGetImageInfo with 'CL_IMAGE_ROW_PITCH'. clGetImageRowPitch :: CLMem -> IO CSize clGetImageRowPitch mem = wrapGetInfo (\(dat :: Ptr CSize) -> raw_clGetImageInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_IMAGE_ROW_PITCH size = fromIntegral $ sizeOf (undefined :: CSize) -- | Return size in bytes of a 2D slice for the 3D image object given by -- image. For a 2D image object this value will be 0. -- -- This function execute OpenCL clGetImageInfo with 'CL_IMAGE_SLICE_PITCH'. clGetImageSlicePitch :: CLMem -> IO CSize clGetImageSlicePitch mem = wrapGetInfo (\(dat :: Ptr CSize) -> raw_clGetImageInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_IMAGE_SLICE_PITCH size = fromIntegral $ sizeOf (undefined :: CSize) -- | Return width of image in pixels. -- -- This function execute OpenCL clGetImageInfo with 'CL_IMAGE_WIDTH'. clGetImageWidth :: CLMem -> IO CSize clGetImageWidth mem = wrapGetInfo (\(dat :: Ptr CSize) -> raw_clGetImageInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_IMAGE_WIDTH size = fromIntegral $ sizeOf (undefined :: CSize) -- | Return height of image in pixels. -- -- This function execute OpenCL clGetImageInfo with 'CL_IMAGE_HEIGHT'. clGetImageHeight :: CLMem -> IO CSize clGetImageHeight mem = wrapGetInfo (\(dat :: Ptr CSize) -> raw_clGetImageInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_IMAGE_HEIGHT size = fromIntegral $ sizeOf (undefined :: CSize) -- | Return depth of the image in pixels. For a 2D image, depth equals 0. -- -- This function execute OpenCL clGetImageInfo with 'CL_IMAGE_DEPTH'. clGetImageDepth :: CLMem -> IO CSize clGetImageDepth mem = wrapGetInfo (\(dat :: Ptr CSize) -> raw_clGetImageInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_IMAGE_DEPTH size = fromIntegral $ sizeOf (undefined :: CSize) -- ----------------------------------------------------------------------------- data CLMemInfo = CL_MEM_TYPE | CL_MEM_FLAGS | CL_MEM_SIZE | CL_MEM_HOST_PTR | CL_MEM_MAP_COUNT | CL_MEM_REFERENCE_COUNT | CL_MEM_CONTEXT instance Enum CLMemInfo where fromEnum CL_MEM_TYPE = 4352 fromEnum CL_MEM_FLAGS = 4353 fromEnum CL_MEM_SIZE = 4354 fromEnum CL_MEM_HOST_PTR = 4355 fromEnum CL_MEM_MAP_COUNT = 4356 fromEnum CL_MEM_REFERENCE_COUNT = 4357 fromEnum CL_MEM_CONTEXT = 4358 toEnum 4352 = CL_MEM_TYPE toEnum 4353 = CL_MEM_FLAGS toEnum 4354 = CL_MEM_SIZE toEnum 4355 = CL_MEM_HOST_PTR toEnum 4356 = CL_MEM_MAP_COUNT toEnum 4357 = CL_MEM_REFERENCE_COUNT toEnum 4358 = CL_MEM_CONTEXT toEnum unmatched = error ("CLMemInfo.toEnum: Cannot match " ++ show unmatched) {-# LINE 578 "src/Control/Parallel/OpenCL/Memory.chs" #-} -- | Returns the mem object type. -- -- This function execute OpenCL clGetMemObjectInfo with 'CL_MEM_TYPE'. clGetMemType :: CLMem -> IO CLMemObjectType clGetMemType mem = wrapGetInfo (\(dat :: Ptr CLMemObjectType_) -> raw_clGetMemObjectInfo mem infoid size (castPtr dat)) getEnumCL where infoid = getCLValue CL_MEM_TYPE size = fromIntegral $ sizeOf (0::CLMemObjectType_) -- | Return the flags argument value specified when memobj was created. -- -- This function execute OpenCL clGetMemObjectInfo with 'CL_MEM_FLAGS'. clGetMemFlags :: CLMem -> IO [CLMemFlag] clGetMemFlags mem = wrapGetInfo (\(dat :: Ptr CLMemFlags_)-> raw_clGetMemObjectInfo mem infoid size (castPtr dat)) bitmaskToMemFlags where infoid = getCLValue CL_MEM_FLAGS size = fromIntegral $ sizeOf (0::CLMemFlags_) -- | Return actual size of memobj in bytes. -- -- This function execute OpenCL clGetMemObjectInfo with 'CL_MEM_SIZE'. clGetMemSize :: CLMem -> IO CSize clGetMemSize mem = wrapGetInfo (\(dat :: Ptr CSize)-> raw_clGetMemObjectInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_MEM_SIZE size = fromIntegral $ sizeOf (0::CSize) -- | Return the host_ptr argument value specified when memobj is created. -- -- This function execute OpenCL clGetMemObjectInfo with 'CL_MEM_HOST_PTR'. clGetMemHostPtr :: CLMem -> IO (Ptr ()) clGetMemHostPtr mem = wrapGetInfo (\(dat :: Ptr (Ptr ()))-> raw_clGetMemObjectInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_MEM_HOST_PTR size = fromIntegral $ sizeOf (nullPtr::Ptr ()) -- | Map count. The map count returned should be considered immediately -- stale. It is unsuitable for general use in applications. This feature is -- provided for debugging. -- -- This function execute OpenCL clGetMemObjectInfo with 'CL_MEM_MAP_COUNT'. clGetMemMapCount :: CLMem -> IO CLuint clGetMemMapCount mem = wrapGetInfo (\(dat :: Ptr CLuint)-> raw_clGetMemObjectInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_MEM_MAP_COUNT size = fromIntegral $ sizeOf (0 :: CLuint) -- | Return memobj reference count. The reference count returned should be -- considered immediately stale. It is unsuitable for general use in -- applications. This feature is provided for identifying memory leaks. -- -- This function execute OpenCL clGetMemObjectInfo with 'CL_MEM_REFERENCE_COUNT'. clGetMemReferenceCount :: CLMem -> IO CLuint clGetMemReferenceCount mem = wrapGetInfo (\(dat :: Ptr CLuint)-> raw_clGetMemObjectInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_MEM_REFERENCE_COUNT size = fromIntegral $ sizeOf (0 :: CLuint) -- | Return context specified when memory object is created. -- -- This function execute OpenCL clGetMemObjectInfo with 'CL_MEM_CONTEXT'. clGetMemContext :: CLMem -> IO CLContext clGetMemContext mem = wrapGetInfo (\(dat :: Ptr CLContext)-> raw_clGetMemObjectInfo mem infoid size (castPtr dat)) id where infoid = getCLValue CL_MEM_CONTEXT size = fromIntegral $ sizeOf (0 :: CLuint) -- ----------------------------------------------------------------------------- {-| Creates a sampler object. A sampler object describes how to sample an image when the image is read in the kernel. The built-in functions to read from an image in a kernel take a sampler as an argument. The sampler arguments to the image read function can be sampler objects created using OpenCL functions and passed as argument values to the kernel or can be samplers declared inside a kernel. In this section we discuss how sampler objects are created using OpenCL functions. Returns a valid non-zero sampler object if the sampler object is created successfully. Otherwise, it throws one of the following 'CLError' exceptions: * 'CL_INVALID_CONTEXT' if context is not a valid context. * 'CL_INVALID_VALUE' if addressing_mode, filter_mode, or normalized_coords or a combination of these argument values are not valid. * 'CL_INVALID_OPERATION' if images are not supported by any device associated with context (i.e. 'CL_DEVICE_IMAGE_SUPPORT' specified in the table of OpenCL Device Queries for clGetDeviceInfo is 'False'). * 'CL_OUT_OF_HOST_MEMORY' if there is a failure to allocate resources required by the OpenCL implementation on the host. -} clCreateSampler :: CLContext -> Bool -> CLAddressingMode -> CLFilterMode -> IO CLSampler clCreateSampler ctx norm am fm = wrapPError $ \perr -> do raw_clCreateSampler ctx (fromBool norm) (getCLValue am) (getCLValue fm) perr -- | Increments the sampler reference count. 'clCreateSampler' does an implicit -- retain. Returns 'True' if the function is executed successfully. It returns -- 'False' if sampler is not a valid sampler object. clRetainSampler :: CLSampler -> IO Bool clRetainSampler mem = wrapCheckSuccess $ raw_clRetainSampler mem -- | Decrements the sampler reference count. The sampler object is deleted after -- the reference count becomes zero and commands queued for execution on a -- command-queue(s) that use sampler have finished. 'clReleaseSampler' returns -- 'True' if the function is executed successfully. It returns 'False' if -- sampler is not a valid sampler object. clReleaseSampler :: CLSampler -> IO Bool clReleaseSampler mem = wrapCheckSuccess $ raw_clReleaseSampler mem data CLSamplerInfo = CL_SAMPLER_REFERENCE_COUNT | CL_SAMPLER_CONTEXT | CL_SAMPLER_ADDRESSING_MODE | CL_SAMPLER_FILTER_MODE | CL_SAMPLER_NORMALIZED_COORDS instance Enum CLSamplerInfo where fromEnum CL_SAMPLER_REFERENCE_COUNT = 4432 fromEnum CL_SAMPLER_CONTEXT = 4433 fromEnum CL_SAMPLER_ADDRESSING_MODE = 4435 fromEnum CL_SAMPLER_FILTER_MODE = 4436 fromEnum CL_SAMPLER_NORMALIZED_COORDS = 4434 toEnum 4432 = CL_SAMPLER_REFERENCE_COUNT toEnum 4433 = CL_SAMPLER_CONTEXT toEnum 4435 = CL_SAMPLER_ADDRESSING_MODE toEnum 4436 = CL_SAMPLER_FILTER_MODE toEnum 4434 = CL_SAMPLER_NORMALIZED_COORDS toEnum unmatched = error ("CLSamplerInfo.toEnum: Cannot match " ++ show unmatched) {-# LINE 713 "src/Control/Parallel/OpenCL/Memory.chs" #-} -- | Return the sampler reference count. The reference count returned should be -- considered immediately stale. It is unsuitable for general use in -- applications. This feature is provided for identifying memory leaks. -- -- This function execute OpenCL clGetSamplerInfo with -- 'CL_SAMPLER_REFERENCE_COUNT'. clGetSamplerReferenceCount :: CLSampler -> IO CLuint clGetSamplerReferenceCount sam = wrapGetInfo (\(dat :: Ptr CLuint)-> raw_clGetSamplerInfo sam infoid size (castPtr dat)) id where infoid = getCLValue CL_SAMPLER_REFERENCE_COUNT size = fromIntegral $ sizeOf (0 :: CLuint) -- | Return the context specified when the sampler is created. -- -- This function execute OpenCL clGetSamplerInfo with 'CL_SAMPLER_CONTEXT'. clGetSamplerContext :: CLSampler -> IO CLContext clGetSamplerContext sam = wrapGetInfo (\(dat :: Ptr CLContext)-> raw_clGetSamplerInfo sam infoid size (castPtr dat)) id where infoid = getCLValue CL_SAMPLER_CONTEXT size = fromIntegral $ sizeOf (nullPtr :: CLContext) -- | Return the value specified by addressing_mode argument to clCreateSampler. -- -- This function execute OpenCL clGetSamplerInfo with -- 'CL_SAMPLER_ADDRESSING_MODE'. clGetSamplerAddressingMode :: CLSampler -> IO CLAddressingMode clGetSamplerAddressingMode sam = wrapGetInfo (\(dat :: Ptr CLAddressingMode_)-> raw_clGetSamplerInfo sam infoid size (castPtr dat)) getEnumCL where infoid = getCLValue CL_SAMPLER_ADDRESSING_MODE size = fromIntegral $ sizeOf (0 :: CLAddressingMode_) -- | Return the value specified by filter_mode argument to clCreateSampler. -- -- This function execute OpenCL clGetSamplerInfo with 'CL_SAMPLER_FILTER_MODE'. clGetSamplerFilterMode :: CLSampler -> IO CLFilterMode clGetSamplerFilterMode sam = wrapGetInfo (\(dat :: Ptr CLFilterMode_)-> raw_clGetSamplerInfo sam infoid size (castPtr dat)) getEnumCL where infoid = getCLValue CL_SAMPLER_FILTER_MODE size = fromIntegral $ sizeOf (0 :: CLFilterMode_) -- | Return the value specified by normalized_coords argument to -- clCreateSampler. -- -- This function execute OpenCL clGetSamplerInfo with -- 'CL_SAMPLER_NORMALIZED_COORDS'. clGetSamplerNormalizedCoords :: CLSampler -> IO Bool clGetSamplerNormalizedCoords sam = wrapGetInfo (\(dat :: Ptr CLbool)-> raw_clGetSamplerInfo sam infoid size (castPtr dat)) (/=0) where infoid = getCLValue CL_SAMPLER_NORMALIZED_COORDS size = fromIntegral $ sizeOf (0 :: CLbool) -- -----------------------------------------------------------------------------