| <para> | |
| General information about sharing memory objects with DX9 follows. | |
| </para> | |
| <!-- section 9.9--> | |
| <para> | |
| The goal of this extension is to allow applications to use media surfaces as OpenCL memory | |
| objects. This allows efficient sharing of data between OpenCL and selected adapter APIs (only | |
| DX9 for now). If this extension is supported, an OpenCL image object can be created from a | |
| media surface and the OpenCL API can be used to execute kernels that read and/or write | |
| memory objects that are media surfaces. Note that OpenCL memory objects may be created | |
| from the adapter media surface if and only if the OpenCL context has been created from that | |
| adapter. | |
| </para> | |
| <para> | |
| If this extension is supported by an implementation, the string "cl_khr_dx9_media_sharing" | |
| will be present in the <constant>CL_PLATFORM_EXTENSIONS</constant> | |
| (see <citerefentry><refentrytitle>clGetPlatformInfo</refentrytitle></citerefentry>) | |
| or <constant>CL_DEVICE_EXTENSIONS</constant> | |
| (see <citerefentry><refentrytitle>clGetDeviceInfo</refentrytitle></citerefentry>). | |
| </para> | |
| <para> | |
| As currently proposed the interfaces for this extension would be provided in | |
| <code>cl_dx9_media_sharing.h</code>. | |
| </para> | |
| <!-- 9.9.7.5 --> | |
| <bridgehead>Surface formats for Media Surface Sharing</bridgehead> | |
| <para> | |
| <!-- ext. spec 9.9.7.5 Surface formats for Media Surface Sharing --> | |
| This section includes the D3D surface formats | |
| that are supported when the adapter type is one of the Direct 3D lineage. Using a D3D | |
| surface format not listed here is an error. To extend the use of this extension to support | |
| media adapters beyond DirectX9 tables similar to the ones in this section will need to be | |
| defined for the surface formats supported by the new media adapter. All implementations | |
| that support this extension are required to support the NV12 surface format, the other | |
| surface formats supported are the same surface formats that the adapter you are sharing | |
| with supports as long as they are listed in the tables below (Tables 9.10.3 and 9.10.4). | |
| </para> | |
| <!-- Table 9.10.3 --> | |
| <informaltable frame="all"> | |
| <tgroup cols="2" align="center" colsep="1" rowsep="1"> | |
| <colspec colname="col1" colnum="1" /> | |
| <colspec colname="col2" colnum="2" /> | |
| <thead> | |
| <row> | |
| <entry>FOUR CC code</entry> | |
| <entry>CL image format (channel order, channel data type)</entry> | |
| </row> | |
| </thead> | |
| <tbody> | |
| <row> | |
| <entry>FOURCC('N', 'V', '1', '2'), Plane 0</entry> | |
| <entry><constant>CL_R, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| <row> | |
| <entry>FOURCC('N', 'V', '1', '2'), Plane 1</entry> | |
| <entry><constant>CL_RG, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| <row> | |
| <entry>FOURCC('Y', 'V', '1', '2'), Plane 0</entry> | |
| <entry><constant>CL_R, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| <row> | |
| <entry>FOURCC('Y', 'V', '1', '2'), Plane 1</entry> | |
| <entry><constant>CL_R, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| <row> | |
| <entry>FOURCC('Y', 'V', '1', '2'), Plane 2</entry> | |
| <entry><constant>CL_R, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| </tbody> | |
| </tgroup> | |
| </informaltable> | |
| <para> | |
| In the table above, NV12 Plane 0 corresponds to the luminance (Y) channel and Plane 1 | |
| corresponds to the UV channels. The YV12 Plane 0 corresponds to the Y channel, Plane | |
| 1 to the U channel and Plane 2 to the V channel. Note that the YUV formats map to | |
| <constant>CL_R</constant> and <constant>CL_RG</constant> but do not perform any YUV to | |
| RGB conversion and vice-versa. | |
| </para> | |
| <!-- Table 9.10.4 --> | |
| <informaltable frame="all"> | |
| <tgroup cols="2" align="center" colsep="1" rowsep="1"> | |
| <colspec colname="col1" colnum="1" /> | |
| <colspec colname="col2" colnum="2" /> | |
| <thead> | |
| <row> | |
| <entry>D3D format</entry> | |
| <entry>CL image format (channel order, channel data type)</entry> | |
| </row> | |
| </thead> | |
| <tbody> | |
| <row> | |
| <entry>D3DFMT_R32F</entry> | |
| <entry><constant>CL_R, CL_FLOAT</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_R16F</entry> | |
| <entry><constant>CL_R, CL_HALF_FLOAT</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_L16</entry> | |
| <entry><constant>CL_R, CL_UNORM_INT16</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_A8</entry> | |
| <entry><constant>CL_A, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_L8</entry> | |
| <entry><constant>CL_R, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_G32R32F</entry> | |
| <entry><constant>CL_RG, CL_FLOAT</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_G16R16F</entry> | |
| <entry><constant>CL_RG, CL_HALF_FLOAT</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_G16R16</entry> | |
| <entry><constant>CL_RG, CL_UNORM_INT16</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_A8L8</entry> | |
| <entry><constant>CL_RG, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_A32B32G32R32F</entry> | |
| <entry><constant>CL_RGBA, CL_FLOAT</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_A16B16G16R16F</entry> | |
| <entry><constant>CL_RGBA, CL_HALF_FLOAT</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_A16B16G16R16</entry> | |
| <entry><constant>CL_RGBA, CL_UNORM_INT16</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_A8B8G8R8</entry> | |
| <entry><constant>CL_RGBA, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_X8B8G8R8</entry> | |
| <entry><constant>CL_RGBA, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_A8R8G8B8</entry> | |
| <entry><constant>CL_BGRA, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| <row> | |
| <entry>D3DFMT_X8R8G8B8</entry> | |
| <entry><constant>CL_BGRA, CL_UNORM_INT8</constant></entry> | |
| </row> | |
| </tbody> | |
| </tgroup> | |
| </informaltable> | |
| <para> | |
| Note that D3D9 format names seem to imply that the order of the color channels are switched | |
| relative to OpenCL but this is not the case. For example, layout of channels for each pixel | |
| for <constant>D3DFMT_A32FB32FG32FR32F</constant> is the same as | |
| <constant>CL_RGBA</constant>, <constant>CL_FLOAT</constant>. | |
| </para> | |
| <para> | |
| Properties of media surface objects may be queried using | |
| <citerefentry><refentrytitle>clGetMemObjectInfo</refentrytitle></citerefentry> | |
| and <citerefentry><refentrytitle>clGetImageInfo</refentrytitle></citerefentry> with | |
| <varname>param_name</varname> <constant>CL_MEM_DX9_MEDIA_ADAPTER_TYPE_KHR</constant>, | |
| <constant>CL_MEM_DX9_MEDIA_SURFACE_INFO_KHR</constant> and | |
| <constant>CL_IMAGE_DX9_MEDIA_SURFACE_PLANE_KHR</constant>. | |
| </para> | |
| <!-- 26-Oct-2015, Ext rev. 10 --> | |