Name

    CL_QCOM_EXT_HOST_PTR

Name Strings

    cl_qcom_ext_host_ptr

Contact

    ssusheel at quicinc dot com
    dgarcia at qti dot qualcomm dot com

Contributors

    Balaji Calidas, QUALCOMM
    David Garcia, QUALCOMM
    Rajeev Rao, QUALCOMM
    Sushmita Susheelendra, QUALCOMM Innovation Center Inc.

Status

    SHIPPING

Number

    OpenCL Extension #21

Dependencies

    OpenCL 1.1 is required. 
    
    This extension is written against the OpenCL 1.1 specification

Overview

    This extension extends the functionality provided by
    clCreateBuffer, clCreateImage2D, clCreateImage3D.
    It allows applications to specify a new flag CL_MEM_EXT_HOST_PTR_QCOM
    which enables the driver to map external memory allocations
    --to be defined in future layered extensions--
    to the device's address space and thus avoiding having to
    copy data back and forth between the host and the device.

IP Status

    No known IP claims.

New Procedures and Functions

    cl_int clGetDeviceImageInfoQCOM(cl_device_id             device,
                                    size_t                   image_width,
                                    size_t                   image_height,
                                    const cl_image_format   *image_format,
                                    cl_image_pitch_info_qcom param_name,
                                    size_t                   param_value_size,
                                    void                    *param_value,
                                    size_t                  *param_value_size_ret);

New Types

    typedef cl_uint cl_image_pitch_info_qcom;

New Tokens

    Accepted by the <param_name> argument of clGetDeviceInfo

        CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM    0x40A0      
        CL_DEVICE_PAGE_SIZE_QCOM                   0x40A1
        
    Accepted by the <flags> argument of clCreateBuffer, clCreateImage2D and clCreateImage3D:

        CL_MEM_EXT_HOST_PTR_QCOM                   (1 << 29)

    Accepted by the <host_ptr> argument of clCreateBuffer, clCreateImage2D and clCreateImage3D:

        typedef struct _cl_mem_ext_host_ptr
        {
            // Type of external memory allocation.
            // Legal values will be defined in layered extensions.
            cl_uint  allocation_type;
            
            // Host cache policy for this external memory allocation.
            cl_uint  host_cache_policy;

        } cl_mem_ext_host_ptr;
        
    Accepted values for cl_mem_ext_host_ptr::host_cache_policy:
    
        CL_MEM_HOST_UNCACHED_QCOM                  0x40A4
        CL_MEM_HOST_WRITEBACK_QCOM                 0x40A5
        CL_MEM_HOST_WRITETHROUGH_QCOM              0x40A6
        CL_MEM_HOST_WRITE_COMBINING_QCOM           0x40A7

    Accepted by the <param_name> argument of clGetDeviceImageInfoQCOM
    
        CL_IMAGE_ROW_ALIGNMENT_QCOM                0x40A2
        CL_IMAGE_SLICE_ALIGNMENT_QCOM              0x40A3

Additions to Chapter 5.2.1 of the OpenCL 1.1 Specification
(Creating Buffer Objects)

    Add the following token to Table 5.3 (clCreateBuffer List of supported cl_mem_flags values):
    
        CL_MEM_EXT_HOST_PTR_QCOM             This flag is valid only when used together with CL_MEM_USE_HOST_PTR.
                                             If specified, it indicates that the <host_ptr> argument provided by
                                             the application is actually a pointer to cl_mem_ext_host_ptr.

                                             
        When CL_MEM_EXT_HOST_PTR_QCOM is enabled in the <flags> argument, then <host_ptr> is interpreted as a pointer to cl_mem_ext_host_ptr.
        The application must then initialize cl_mem_ext_host_ptr::allocation_type to the allowed token values defined in future layered extensions.
        
        The application must also initialize cl_mem_ext_host_ptr::host_cache_policy to one of CL_MEM_HOST_UNCACHED_QCOM, CL_MEM_HOST_WRITEBACK_QCOM,
        CL_MEM_HOST_WRITETHROUGH_QCOM, or CL_MEM_HOST_WRITE_COMBINING_QCOM according to the cache policy used in the host for this memory allocation.
        
    Add the following token to Table 4.3 (clGetDeviceInfo OpenCL Device Queries):

        CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM    Returns the amount of memory padding that the application must add
                                                   to the end of every external allocation that will be used in conjunction with
                                                   CL_MEM_EXT_HOST_PTR_QCOM.

        CL_DEVICE_PAGE_SIZE_QCOM                   Returns the device's page size.
                                                  
        The application may query the row and slice pitch values using clGetDeviceImageInfoQCOM
        and provide the queried values or any other supported value to clCreateImage2D and clCreateImage3D
        when using CL_MEM_EXT_HOST_PTR_QCOM.

        A supported value for row pitch and slice pitch is defined respectively as:
        
        * Any value greater than or equal to CL_IMAGE_ROW_PITCH   that is also a multiple of CL_IMAGE_ROW_ALIGNMENT_QCOM
        * Any value greater than or equal to CL_IMAGE_SLICE_PITCH that is also a multiple of CL_IMAGE_SLICE_ALIGNMENT_QCOM
        
Additions to Section 5.3 after clGetImageInfo

    An application that creates OpenCL image objects with the CL_MEM_EXT_HOST_PTR_QCOM flag
    can invoke the following function to query the required row pitch, slice pitch and
    alignment for a particular device:

    cl_int clGetDeviceImageInfoQCOM(cl_device_id             device,
                                    size_t                   image_width,
                                    size_t                   image_height,
                                    const cl_image_format   *image_format,
                                    cl_image_pitch_info_qcom param_name,
                                    size_t                   param_value_size,
                                    void                    *param_value,
                                    size_t                  *param_value_size_ret);

    device               - is a valid device

    image_width          - width of the image in image elements (pixels)

    image_height         - height of the image in image elements (pixels)

    image_row_pitch      - scan-line pitch in bytes

    param_name           - specifies the information to query. The list of supported param_name types and the
                           information returned in param_value by clGetImageInfo is described in table 5.XXX

    param_value          - is a pointer to memory where the appropriate result being queried is returned. If
                           param_value is NULL, it is ignored.

    param_value_size     - is used to specify the size in bytes of memory pointed to by param_value.
                            This size must be >= size of return type as described in table 5.8.

    param_value_size_ret - returns the actual size in bytes of data being queried by param_value. If
                           param_value_size_ret is NULL, it is ignored.

    clGetDeviceImageInfoQCOM returns CL_SUCCESS if the function is executed successfully.
    Otherwise, it returns one of the following errors:

    CL_INVALID_VALUE        - if param_name is not valid, or if size in bytes specified by param_value_size
                              is < size of return type for that param_value and param_value is not NULL.
    CL_INVALID_MEM_OBJECT   - if image is a not a valid image object.
    CL_OUT_OF_RESOURCES     - if there is a failure to allocate resources required by the OpenCL implementation on the device.
    CL_OUT_OF_HOST_MEMORY   - if there is a failure to allocate resources required by the OpenCL implementation on the host.

Table 5.XXX

    List of supported param_names by clGetDeviceImageInfoQCOM

        cl_image_pitch_info_qcom       Return Type   Info returned in param_value
        CL_IMAGE_ROW_PITCH             cl_uint       Returns the image row pitch supported by this device
        CL_IMAGE_ROW_ALIGNMENT_QCOM    cl_uint       Returns the image row pitch alignment supported by this device
        CL_IMAGE_SLICE_PITCH           cl_uint       Returns the image slice pitch supported by this device
        CL_IMAGE_SLICE_ALIGNMENT_QCOM  cl_uint       Returns the image slice pitch alignment supported by this device

    
Additions to Section 5.3.1. (Creating Image Objects) at the end
of the list of errors returned by clCreateImage2D and clCreateImage3D

    CL_INVALID_VALUE if <flags> has CL_MEM_EXT_HOST_PTR_QCOM enabled and yet
    CL_MEM_USE_HOST_PTR is not enabled.

    CL_INVALID_VALUE if <flags> has CL_MEM_EXT_HOST_PTR_QCOM enabled and if
    <image_row_pitch> and/or <image_slice_pitch> fail to match the requirements
    of section 5.3
    
    CL_INVALID_VALUE if any of the fields in the struct pointed at by <host_ptr> are invalid.
    
Issues

    None.

Revision History

    Revision 1, 2013/05/27: Initial version.
