Merge pull request #44 from b-sumner/master

Add cl_amd_planar_yuv extension
diff --git a/extensions/amd/cl_amd_planar_yuv.txt b/extensions/amd/cl_amd_planar_yuv.txt
new file mode 100644
index 0000000..0e90350
--- /dev/null
+++ b/extensions/amd/cl_amd_planar_yuv.txt
@@ -0,0 +1,143 @@
+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.
+
diff --git a/extensions/clext.php b/extensions/clext.php
index 9f4f388..bc0bf81 100644
--- a/extensions/clext.php
+++ b/extensions/clext.php
@@ -105,4 +105,6 @@
 </li>
 <li value=53><a href="extensions/qcom/cl_qcom_ext_host_ptr_iocoherent.txt">cl_qcom_ext_host_ptr_iocoherent</a>
 </li>
+<li value=54><a href="extensions/amd/cl_amd_planar_yuv.txt">cl_amd_planar_yuv</a>
+</li>
 </ol>
diff --git a/extensions/registry.py b/extensions/registry.py
index 2134461..7a4ac11 100644
--- a/extensions/registry.py
+++ b/extensions/registry.py
@@ -266,4 +266,9 @@
         'flags' : { 'public' },
         'url' : 'extensions/qcom/cl_qcom_ext_host_ptr_iocoherent.txt',
     },
+    'cl_amd_planar_yuv' : {
+        'number' : 54,
+        'flags' : { 'public' },
+        'url' : 'extensions/amd/cl_amd_planar_yuv.txt',
+    },
 }