Name Strings

    cl_amd_planar_yuv

Contributors

    Brian Sumner
    German Andryeyev

Contact

    Brian Sumner, AMD (Brian.Sumner 'at' amd.com)

IP Status

    No known IP issues.
    
Version

    Version 1.0, May 10, 2018
    
Number
    
    OpenCL Extension #54
    
Status

    Draft

Extension Type

    OpenCL platform extension
    
Dependencies

    OpenCL 2.0, cl_khr_d3d11_sharing

Overview

    This extension extends the cl_khr_d3d11_sharing function
    clCreateFromD3D11Texture2DKHR to accept resources in planar YUV formats
    sucn as NV12 and P010. It also adds a new runtime API call to create
    new images from the Y or UV plane of images createed using
    clCreateFromD3D11Texture2DKHR.

New Procedures and Functions

    cl_mem clGetPlaneFromImageAMD(cl_context context,
           cl_mem mem, cl_uint plane, cl_int* errcode_ret);

New Types

    None

New Tokens

Macros for the <plane> argument passed to clGetPlaneFromImageAMD:
     CL_YUV_IMAGE_Y_PLANE_AMD           0x0
     CL_YUV_IMAGE_UV_PLANE_AMD          0x1

Additions to section 9.10.7.4 Sharing Direct3D 11 Texture and Resources as
OpenCL Image Objects

Add the following to table 9.11.3

     +---------------------+---------------------------+
     | DXGI format         | CL image format (channel  |
     |                     | order, channel data type) |
     +---------------------+---------------------------+
     | DXGI_FORMAT_NV12    | CL_R, CL_UNSIGNED_INT8    |
     | DXGI_FORMAT_P010    | CL_R, CL_UNSIGNED_INT16   |
     +---------------------+---------------------------+

Add the following Note to the end of section 9.10.7.4:

    Note: In table 9.11.3, the DXGI formats DXGI_FORMAT_NV12 and
    DXGI_FORMAT_P010 are only permitted for ID3D11Texture2D resource arguments
    to clCreateFromD3D11Texture2DKHR

Add the following to section 5.3.1 Creating Image Objects

    The function

    cl_mem clGetPlaneFromImageAMD(cl_context context,
                                  cl_mem     mem,
                                  cl_uint    plane,
                                  cl_int*    errcode_ret)

    creates an OpenCL 2D image object from a particular YUV
    plane of an OpenCL Direct3D 11 interop image.

    <context> is a valid OpenCL context created from a Direct3D 11 device.

    <mem> is an OpenCL interop image created from a D3D11 resource with
    DXGI format DXGI_FORMAT_NV12 or DXGI_FORMAT_P010

    <plane> selects the plane used to create the image and is either
    CL_YUV_IMAGE_Y_PLANE_AMD or CL_YUV_IMAGE_UV_PLANE_AMD.

    <errcode_ret> will return an appropriate error code. If <errcode_ret> is
    NULL, no error code is  returned

    The following table specifies the format of the image created by
    clGetPlaneFromImageAMD:

    +---------------------------+-----------+------------------+
    | <plane> value             | Channel   | channel mappings |
    |                           | order     |                  |
    +---------------------------+-----------+------------------+
    | CL_YUV_IMAGE_Y_PLANE_AMD  | CL_R      | R = Y            |
    | CL_YUV_IMAGE_UV_PLANE_AMD | CL_RG     | R = U, G = V     |
    +---------------------------+-----------+------------------+
    
    The dimensions of the created image are as follows: if the
    dimensions of the original D3D11 texture are (width, height),
    the dimensions of the Y plane image will be (width, height), and the
    dimensions of the UV plange image will be (width/2, height/2).

    clGetPlaneFromImageAMD returns a valid non-zero image object created
    and <errcode_ret> is set to CL_SUCCESS if the image object is created
    successfully.  Otherwise, it returns a NULL value with one of the
    following error values returned in <errcode_ret>:

    CL_INVALID_CONTEXT if context is not a valid context.

    CL_INVALID_VALUE if values specified in plane are not valid or if <mem>
    object is NULL.
 
    CL_INVALID_MEM_OBJECT is generated if <mem> is not a valid cl_mem object.

    CL_INVALID_D3D11_RESOURCE_KHR if <mem> is not a valid interop image from
    a YUV texture allocated in D3D11.

    CL_MEM_OBJECT_ALLOCATION_FAILURE if OCL runtime failed to allocate
    a new image for the specified plane.

    CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources 
    required by the OpenCL implementation on the host.

Revision History

    Version 1, 2018/05/10 (Brian Sumner) - initial extension specification.

