blob: 708c162edca87e71705788d9fc721148d86dc372 [file] [log] [blame]
Name String
cl_nv_d3d9_sharing
Version
Version 2, January 6, 2010
Number
OpenCL Extension #2
Status
Unknown
Extension Type
OpenCL platform extension
Dependencies
OpenCL 1.0 is required and a Direct3D 9 implementation supporting
sharing of buffer and texture objects with OpenCL is required.
Overview
The goal of this extension is to provide interoperability between
OpenCL and Direct3D 9. This is designed to function analogously to
the OpenGL interoperability as defined in the OpenCL 1.0
specification and accompanying extensions.
New Procedures and Functions
cl_int clGetDeviceIDsFromD3D9NV(
cl_platform_id platform,
cl_d3d9_device_source_nv d3d_device_source,
void *d3d_object,
cl_d3d9_device_set_nv d3d_device_set,
cl_uint num_entries,
cl_device_id *devices,
cl_uint *num_devices)
cl_mem clCreateFromD3D9VertexBufferNV(
cl_context context,
cl_mem_flags flags,
IDirect3DVertexBuffer9 *resource,
cl_int *errcode_ret)
cl_mem clCreateFromD3D9IndexBufferNV(
cl_context context,
cl_mem_flags flags,
IDirect3DIndexBuffer9 *resource,
cl_int *errcode_ret)
cl_mem clCreateFromD3D9SurfaceNV(
cl_context context,
cl_mem_flags flags,
IDirect3DSurface9 *resource,
cl_int *errcode_ret)
cl_mem clCreateFromD3D9TextureNV(
cl_context context,
cl_mem_flags flags,
IDirect3DTexture9 *resource,
UINT miplevel,
cl_int *errcode_ret)
cl_mem clCreateFromD3D9CubeTextureNV(
cl_context context,
cl_mem_flags flags,
IDirect3DCubeTexture9 *resource,
D3DCUBEMAP_FACES facetype,
UINT miplevel,
cl_int *errcode_ret)
cl_mem clCreateFromD3D9VolumeTextureNV(
cl_context context,
cl_mem_flags flags,
IDirect3DVolumeTexture9 *resource,
UINT miplevel,
cl_int *errcode_ret)
cl_int clEnqueueAcquireD3D9ObjectsNV(
cl_command_queue command_queue,
cl_uint num_objects,
const cl_mem *mem_objects,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event)
cl_int clEnqueueReleaseD3D9ObjectsNV(
cl_command_queue command_queue,
cl_uint num_objects,
cl_mem *mem_objects,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event)
New Tokens
Accepted as a Direct3D 9 device source in the <d3d_device_source>
parameter of clGetDeviceIDsFromD3D9NV:
CL_D3D9_DEVICE_NV 0x4022
CL_D3D9_ADAPTER_NAME_NV 0x4023
Accepted as a set of Direct3D 9 devices in the <d3d_device_set> parameter
of clGetDeviceIDsFromD3D9NV:
CL_PREFERRED_DEVICES_FOR_D3D9_NV 0x4024
CL_ALL_DEVICES_FOR_D3D9_NV 0x4025
Accepted as a property name in the <properties> parameter of
clCreateContext and clCreateContextFromType:
CL_CONTEXT_D3D9_DEVICE_NV 0x4026
Accepted as the property being queried in the <param_name>
parameter of clGetMemObjectInfo:
CL_MEM_D3D9_RESOURCE_NV 0x4027
Accepted as the property being queried in the <param_name>
parameter of clGetImageInfo:
CL_IMAGE_D3D9_FACE_NV 0x4028
CL_IMAGE_D3D9_LEVEL_NV 0x4029
Returned in the <param_value> parameter of clGetEventInfo when
<param_name> is CL_EVENT_COMMAND_TYPE:
CL_COMMAND_ACQUIRE_D3D9_OBJECTS_NV 0x402A
CL_COMMAND_RELEASE_D3D9_OBJECTS_NV 0x402B
Returned by clCreateContext and clCreateContextFromType if the Direct3D 9
device specified for interoperability is not compatible with the devices
against which the context is to be created:
CL_INVALID_D3D9_DEVICE_NV -1010
Returned by clCreateFromD3D9VertexBufferNV, clCreateFromD3D9IndexBufferNV
clCreateFromD3D9SurfaceNV, clCreateFromD3D9TextureNV,
clCreateFromD3D9CubeTextureNV, and clCreateFromD3D9VolumeTextureNV when
<resource> is not a Direct3D 9 resource of the required type:
CL_INVALID_D3D9_RESOURCE_NV -1011
Returned by clEnqueueAcquireD3D9ObjectsNV when any of <mem_objects> are
currently acquired by OpenCL:
CL_D3D9_RESOURCE_ALREADY_ACQUIRED_NV -1012
Returned by clEnqueueReleaseD3D9ObjectsNV when any of <mem_objects> are
not currently acquired by OpenCL:
CL_D3D9_RESOURCE_NOT_ACQUIRED_NV -1013
Additions to Chapter 4 of the OpenCL 1.0 Specification
In section 4.3, replace the description of <properties> under
clCreateContext with:
"<properties> specifies a list of context property names and their
corresponding values. Each property is followed immediately by the
corresponding desired value. The list is terminated with zero.
If a property is not specified in <properties>, then its default
value (listed in table 4.4) is used (it is said to be specified
implicitly). If <properties> is NULL or empty (points to a list
whose first value is zero), all attributes take on their default
values."
Replace existing table 4.4 with:
"--------------------------------------------------------------------------------------
cl_context_properties Value type Default value Description
--------------------- ---------- ------------- -----------
CL_CONTEXT_PLATFORM cl_platform_id NULL Specifies the cl_platform_id
on whic to create the OpenCL
context.
CL_CONTEXT_D3D9_DEVICE_NV IDirect3DDevice9* NULL Specifies the IDirect3DDevice9*
to use for Direct3D 9
interoperabilty."
--------------------------------------------------------------------------------------"
Add to the list of errors for clCreateContext:
"* CL_INVALID_D3D9_DEVICE_NV if the value of the property
CL_CONTEXT_D3D9_DEVICE_NV is non-NULL and does not specify a valid
Direct3D 9 device with which the cl_device_ids against which this context
is to be created may interoperate.
* CL_INVALID_OPERATION if Direct3D 9 interoperability is specified by
setting CL_INVALID_D3D9_DEVICE_NV to a non-NULL value, and
interoperability with another graphics API is also specified."
Add to the list of errors for clCreateContextFromType the same new
errors described above for clCreateContext.
Additions to Chapter 5 of the OpenCL 1.0 Specification
5.2.9 Memory Object Queries
Change the last paragraph before table 5.8 to read
"clGetMemObjectInfo 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 the size in bytes
specified by <param_value_size> is less than the size of the return type as
described in table 5.8 and <param_value> is not NULL.
* CL_INVALID_MEM_OBJECT if <memobj> is a not a valid memory object.
* CL_INVALID_D3D9_RESOURCE_NV if <param_name> is CL_MEM_D3D9_RESOURCE_NV
and <memobj> was not created from a Direct3D 9 resource."
Extend table 5.8 to include the following entry.
-----------------------------------------------------------------------
cl_mem_info Return type Info. returned in param_value
----------- --------------- -----------------------------
CL_MEM_D3D9_RESOURCE_NV IDirect3DResource9*
If <memobj> was created from a
Direct3D 9 resource using
clCreateFromD3D9VertexBufferNV,
clCreateFromD3D9IndexBufferNV,
clCreateFromD3D9SurfaceNV,
clCreateFromD3D9TextureNV,
clCreateFromD3D9CubeTextureNV, or
clCreateFromD3D9VolumeTextureNV,
returns the <resource> argument
specified when <memobj> was
created.
-----------------------------------------------------------------------
Change the last paragraph before table 5.9 to read
"clGetImageInfo 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 the size in bytes
specified by <param_value_size> is less than the size of the return type as
described in table 5.9 and <param_value> is not NULL.
* CL_INVALID_MEM_OBJECT if <image> is a not a valid image object.
* CL_INVALID_D3D9_RESOURCE_NV if <param_name> is CL_MEM_D3D9_LEVEL_NV
and <image> was not created from a Direct3D 9 resource using
clCreateFromD3D9TextureNV, clCreateFromD3D9CubeTextureNV, or
clCreateFromD3D9VolumeTextureNV or if <param_name> is
CL_MEM_D3D9_FACE_NV and <image> was not created from a Direct3D 9
resource using clCreateFromD3D9CubeTextureNV."
Extend table 5.9 to include the following entry.
-----------------------------------------------------------------------
cl_image_info Return type Info. returned in param_value
------------- ----------- -----------------------------
CL_IMAGE_D3D9_LEVEL_NV UINT If <image> was created using
clCreateFromD3D9TextureNV,
clCreateFromD3D9CubeTextureNV, or
clCreateFromD3D9VolumeTextureNV,
returns the <miplevel> argument
specified when <image> was
created.
CL_IMAGE_D3D9_FACE_NV D3DCUBEMAP_FACES If <image> was created using
clCreateFromD3D9CubeTextureNV,
returns the <facetype> argument
specified when <image> was
created.
-----------------------------------------------------------------------
5.7 Event Objects
Add to Table 5.15 in the "Info returned in <param_value>" column
for cl_event_info CL_EVENT_COMMAND_TYPE:
CL_COMMAND_ACQUIRE_D3D9_OBJECTS_NV
CL_COMMAND_RELEASE_D3D9_OBJECTS_NV
Add new section 9.13
9.13 Sharing Memory Objects with Direct3D 9 Resources
This section discusses OpenCL functions that allow applications to use
Direct3D 9 resources as OpenCL memory objects. This allows efficient
sharing of data between OpenCL and Direct3D 9. The OpenCL API may be
used to execute kernels that read and/or write memory objects that are
also Direct3D 9 resources. An OpenCL image object may be created from
a Direct3D 9 texture or surface resource. An OpenCL buffer object may
be created from a Direct3D 9 buffer resource. OpenCL memory objects
may be created from Direct3D 9 objects if and only if the OpenCL context
has been created from a Direct3D 9 device.
9.13.1 Querying OpenCL Devices Corresponding to Direct3D 9 Devices
The OpenCL devices corresponding to a Direct3D 9 device may be queried.
The OpenCL devices corresponding to an adapter name may also be
queried. The OpenCL devices corresponding to a Direct3D 9 device will
be a subset of the OpenCL devices corresponding to the adapter
against which the Direct3D 9 device was created.
The OpenCL devices corresponding to a Direct3D 9 device or adapter
name may be queried using the function
cl_int clGetDeviceIDsFromD3D9NV(
cl_platform_id platform,
cl_d3d9_device_source_nv d3d_device_source,
void *d3d_object,
cl_d3d9_device_set_nv d3d_device_set,
cl_uint num_entries,
cl_device_id *devices,
cl_uint *num_devices)
<platform> refers to the platform ID returned by clGetPlatformIDs.
<d3d_device_source> specifies the type of <d3d_object>, and must be
one of the values shown in table 9.13.1.1.
<d3d_object> specifies the object whose corresponding OpenCL devices
are being queried. The type of <d3d_object> must be as specified in
table 9.13.1.1.
<cl_device_set> specifies the set of devices to return and must be
one of the values shown in table 9.13.1.2.
<num_entries> is the number of cl_device_id entries that can be added to
<devices>. If <devices> is not NULL then <num_entries> must be greater than
zero.
<devices> returns a list of OpenCL devices found. The cl_device_id values
returned in <devices> can be used to identify a specific OpenCL device.
If <devices> is NULL, this argument is ignored. The number of
OpenCL devices returned is the mininum of the value specified by
<num_entries> and the number of OpenCL devices corresponding to
<d3d_object>.
<num_devices> returns the number of OpenCL devices available that
correspond to <d3d_object>. If <num_devices> is NULL, this argument
is ignored.
clGetDeviceIDsFromD3D9NV returns CL_SUCCESS if the function is executed
successfully. Otherwise it may return
* CL_INVALID_PLATFORM if <platform> is not a valid platform,
* CL_INVALID_VALUE if <d3d_device_source> is not a valid value,
<d3d_device_set> is not a valid value, <num_entries> is equal
to zero and <devices> is not NULL, or if both <num_devices>
and <devices> are NULL.
* CL_DEVICE_NOT_FOUND if no OpenCL devices that correspond to
<d3d_object> were found.
--------------------------------------------------------------------
cl_d3d9_device_source_nv Type of <d3d_object>
------------------------ --------------------
CL_D3D9_DEVICE_NV IDirect3DDevice9 *
CL_D3D9_ADAPTER_NAME_NV char[]
--------------------------------------------------------------------
Table 9.13.1.1: Types used to specify the object whose corresponding
OpenCL devices are being queried by clGetDeviceIDsFromD3D9NV.
--------------------------------------------------------------------
cl_d3d9_device_set_nv Devices returned in <devices>
------------------------ -----------------------------
CL_PREFERRED_DEVICES_FOR_D3D9_NV The OpenCL devices associated with
the specified Direct3D object.
CL_ALL_DEVICES_FOR_D3D9_NV All OpenCL devices which may
interoperate with the specified
Direct3D object. Performance of
sharing data on these devices may
be considerably less than on the
preferred devices.
--------------------------------------------------------------------
Table 9.13.1.2: Sets of devices queriable using
clGetDeviceIDsFromD3D9NV.
9.13.2 Lifetime of Shared Resources
An OpenCL memory object created from a Direct3D 9 resource remains
valid as long as the corresponding Direct3D 9 resource has not been
deleted. If the Direct3D 9 resource is deleted through the Direct3D
9 API, subsequent use of the OpenCL memory object will result
in undefined behavior, including but not limited to possible OpenCL
errors, data corruption, and program termination.
The successful creation of a cl_context against a Direct3D 9 device
specified via the context create parameter CL_CONTEXT_D3D9_DEVICE_NV
will increment the internal Direct3D reference count on the specified
Direct3D 9 device. The internal Direct3D reference count on that
Direct3D 9 device will be decremented when the OpenCL reference
count on the returned OpenCL context drops to zero.
The OpenCL context and corresponding command-queues are dependent on
the existence of the Direct3D 9 device from which the OpenCL context
was created. If the Direct3D 9 device is deleted through the Direct3D 9
API, subsequent use of the OpenCL context will result in undefined
behavior, including but not limited to possible OpenCL errors, data
corruption, and program termination.
9.13.3 Sharing Direct3D 9 Buffer Resources as OpenCL Buffer Objects
The function
cl_mem clCreateFromD3D9VertexBufferNV(
cl_context context,
cl_mem_flags flags,
IDirect3DVertexBuffer9 *resource,
cl_int *errcode_ret)
creates an OpenCL buffer object from a Direct3D 9 vertex buffer.
<context> is a valid OpenCL context created from a Direct3D 9 device.
<flags> is a bit-field that is used to specify usage information.
Refer to table 5.3 for a description of <flags>. Only
CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY and CL_MEM_READ_WRITE values
specified in table 5.3 can be used.
<resource> is a pointer to the Direct3D 9 vertex buffer to share.
<errcode_ret> will return an appropriate error code. If
<errcode_ret> is NULL, no error code is returned.
clCreateFromD3D9VertexBufferNV returns a valid non-zero OpenCL buffer
object and <errcode_ret> is set to CL_SUCCESS if the buffer 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 <flags> are not valid.
* CL_INVALID_D3D9_RESOURCE_NV if <resource> is not a Direct3D 9
vertex buffer created in D3DPOOL_DEFAULT, if a cl_mem from
<resource> has already been created, or if <context> was not
created against the same Direct3D 9 device from which <resource>
was created.
* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
required by the OpenCL implementation on the host.
The size of the returned OpenCL buffer object is the same as the
size of <resource>.
This call will increment the internal Direct3D reference count on
<resource>. The internal Direct3D reference count on <resource>
will be decremented when the OpenCL reference count on the returned
OpenCL memory object drops to zero.
The function
cl_mem clCreateFromD3D9IndexBufferNV(
cl_context context,
cl_mem_flags flags,
IDirect3DIndexBuffer9 *resource,
cl_int *errcode_ret)
creates an OpenCL buffer object from a Direct3D 9 index buffer.
<context> is a valid OpenCL context created from a Direct3D 9 device.
<flags> is a bit-field that is used to specify usage information.
Refer to table 5.3 for a description of <flags>. Only
CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY and CL_MEM_READ_WRITE values
specified in table 5.3 can be used.
<resource> is a pointer to the Direct3D 9 index buffer to share.
<errcode_ret> will return an appropriate error code. If
<errcode_ret> is NULL, no error code is returned.
clCreateFromD3D9IndexBufferNV returns a valid non-zero OpenCL buffer
object and <errcode_ret> is set to CL_SUCCESS if the buffer 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 <flags> are not valid.
* CL_INVALID_D3D9_RESOURCE_NV if <resource> is not a Direct3D 9
index buffer created in D3DPOOL_DEFAULT, if a cl_mem from
<resource> has already been created, or if <context> was not
created against the same Direct3D 9 device from which <resource>
was created.
* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
required by the OpenCL implementation on the host.
The size of the returned OpenCL buffer object is the same as the
size of <resource>.
This call will increment the internal Direct3D reference count on
<resource>. The internal Direct3D reference count on <resource>
will be decremented when the OpenCL reference count on the returned
OpenCL memory object drops to zero.
9.13.4 Sharing Direct3D 9 Texture and Surface Resources as OpenCL
Image Objects
The function
cl_mem clCreateFromD3D9SurfaceNV(
cl_context context,
cl_mem_flags flags,
IDirect3DSurface9 *resource,
cl_int *errcode_ret)
creates an OpenCL 2D image object from a Direct3D 9 surface.
<context> is a valid OpenCL context created from a Direct3D 9 device.
<flags> is a bit-field that is used to specify usage information.
Refer to table 5.3 for a description of <flags>. Only
CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY and CL_MEM_READ_WRITE values
specified in table 5.3 can be used.
<resource> is a pointer to the Direct3D 9 surface to share. This
surface must be a stand-alone surface which exports the interface
IDirect3DResource9, and not a level of an IDirect3DTexture9 or a
face of a level of an IDirect3DCubeTexture9.
<errcode_ret> will return an appropriate error code. If
<errcode_ret> is NULL, no error code is returned.
clCreateFromD3D9SurfaceNV returns a valid non-zero OpenCL 2D image
object and <errcode_ret> is set to CL_SUCCESS if the OpenCL 2D 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 <flags> are not valid.
* CL_INVALID_D3D9_RESOURCE_NV if <resource> is not a Direct3D 9
surface created in D3DPOOL_DEFAULT, if a cl_mem from
<resource> has already been created, or if <context> was not
created against the same Direct3D 9 device from which <resource>
was created.
* CL_INVALID_IMAGE_FORMAT_DESCRIPTOR if the Direct3D 10 texture
format of <resource> is not listed in table 9.13.4.1.
* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
required by the OpenCL implementation on the host.
The width and height of the returned OpenCL 2D image object are
determined by the width and height of <resource>. The channel
type and order of the returned OpenCL 2D image object is determined
by the format of <resource> by table 9.13.4.1.
This call will increment the internal Direct3D reference count on
<resource>. The internal Direct3D reference count on <resource>
will be decremented when the OpenCL reference count on the returned
OpenCL memory object drops to zero.
The function
cl_mem clCreateFromD3D9TextureNV(
cl_context context,
cl_mem_flags flags,
IDirect3DTexture9 *resource,
UINT miplevel,
cl_int *errcode_ret)
creates an OpenCL 2D image object from a level of a Direct3D 9 texture.
<context> is a valid OpenCL context created from a Direct3D 9 device.
<flags> is a bit-field that is used to specify usage information.
Refer to table 5.3 for a description of <flags>. Only
CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY and CL_MEM_READ_WRITE values
specified in table 5.3 can be used.
<resource> is a pointer to the Direct3D 9 texture to share.
<miplevel> is the mipmap level of <resource> to share.
<errcode_ret> will return an appropriate error code. If
<errcode_ret> is NULL, no error code is returned.
clCreateFromD3D9TextureNV returns a valid non-zero OpenCL 2D image
object and <errcode_ret> is set to CL_SUCCESS if the OpenCL 2D 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 <flags> are not valid
or if <miplevel> is not a valid mipmap level of <resource>.
* CL_INVALID_D3D9_RESOURCE_NV if <resource> is not a Direct3D 9
texture created in D3DPOOL_DEFAULT, if a cl_mem from
mipmap level <miplevel> of <resource> has already been created,
or if <context> was not created against the same Direct3D 9 device
from which <resource> was created.
* CL_INVALID_IMAGE_FORMAT_DESCRIPTOR if the Direct3D 10 texture
format of <resource> is not listed in table 9.13.4.1.
* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
required by the OpenCL implementation on the host.
The width and height of the returned OpenCL 2D image object are
determined by the width and height of mipmap level <miplevel> of
<resource>. The channel type and order of the returned OpenCL 2D image
object is determined by the format of <resource> by table 9.13.4.1.
This call will increment the internal Direct3D reference count on
<resource>. The internal Direct3D reference count on <resource>
will be decremented when the OpenCL reference count on the returned
OpenCL memory object drops to zero.
The function
cl_mem clCreateFromD3D9CubeTextureNV(
cl_context context,
cl_mem_flags flags,
IDirect3DCubeTexture9 *resource,
D3DCUBEMAP_FACES facetype,
UINT miplevel,
cl_int *errcode_ret)
creates an OpenCL 2D image object from a face of a level of a
Direct3D 9 cube texture.
<context> is a valid OpenCL context created from a Direct3D 9 device.
<flags> is a bit-field that is used to specify usage information.
Refer to table 5.3 for a description of <flags>. Only
CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY and CL_MEM_READ_WRITE values
specified in table 5.3 can be used.
<resource> is a pointer to the Direct3D 9 cube texture to share.
<facetype> is the face of <resource> to share.
<miplevel> is the mipmap level of <resource> to share.
<errcode_ret> will return an appropriate error code. If
<errcode_ret> is NULL, no error code is returned.
clCreateFromD3D9CubeTextureNV returns a valid non-zero OpenCL 2D image
object and <errcode_ret> is set to CL_SUCCESS if the OpenCL 2D 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 <flags> are not valid,
if <miplevel> is not a valid mipmap level of <resource>, or if
<facetype> is not a valid cube face.
* CL_INVALID_D3D9_RESOURCE_NV if <resource> is not a Direct3D 9
cube texture created in D3DPOOL_DEFAULT, if a cl_mem from
cube face <facetype> and mipmap level <miplevel> of <resource>
has already been created, or if <context> was not created against
the same Direct3D 9 device from which <resource> was created.
* CL_INVALID_IMAGE_FORMAT_DESCRIPTOR if the Direct3D 10 texture
format of <resource> is not listed in table 9.13.4.1.
* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
required by the OpenCL implementation on the host.
The width and height of the returned OpenCL 2D image object are
determined by the width and height of mipmap level <miplevel> of
<resource>. The channel type and order of the returned OpenCL 2D image
object is determined by the format of <resource> by table 9.13.4.1.
This call will increment the internal Direct3D reference count on
<resource>. The internal Direct3D reference count on <resource>
will be decremented when the OpenCL reference count on the returned
OpenCL memory object drops to zero.
The function
cl_mem clCreateFromD3D9VolumeTextureNV(
cl_context context,
cl_mem_flags flags,
IDirect3DVolumeTexture9 *resource,
UINT miplevel,
cl_int *errcode_ret)
creates an OpenCL 3D image object from a face of a level of a
Direct3D 9 volume texture.
<context> is a valid OpenCL context created from a Direct3D 9 device.
<flags> is a bit-field that is used to specify usage information.
Refer to table 5.3 for a description of <flags>. Only
CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY and CL_MEM_READ_WRITE values
specified in table 5.3 can be used.
<resource> is a pointer to the Direct3D 9 volume texture to share.
<miplevel> is the mipmap level of <resource> to share.
<errcode_ret> will return an appropriate error code. If
<errcode_ret> is NULL, no error code is returned.
clCreateFromD3D9VolumeTextureNV returns a valid non-zero OpenCL 3D
image object and <errcode_ret> is set to CL_SUCCESS if the OpenCL
3D 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 <flags> are not valid
or if <miplevel> is not a valid mipmap level of <resource>.
* CL_INVALID_D3D9_RESOURCE_NV if <resource> is not a Direct3D 9
volume texture created in D3DPOOL_DEFAULT, if a cl_mem from
mipmap level <miplevel> of <resource> has already been created,
or if <context> was not created against the same Direct3D 9
device from which <resource> was created.
* CL_INVALID_IMAGE_FORMAT_DESCRIPTOR if the Direct3D 10 texture
format of <resource> is not listed in table 9.13.4.1.
* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
required by the OpenCL implementation on the host.
The width, height, and depth of the returned OpenCL 3D image object are
determined by the width, height, and depth of mipmap level <miplevel> of
<resource>. The channel type and order of the returned OpenCL 3D image
object is determined by the format of <resource> by table 9.13.4.1.
This call will increment the internal Direct3D reference count on
<resource>. The internal Direct3D reference count on <resource>
will be decremented when the OpenCL reference count on the returned
OpenCL memory object drops to zero.
------------------------------------------------------------------
D3D Format cl_channel_order cl_channel_type
------------------------------ ---------------- ---------------
D3DFMT_R32F CL_R CL_FLOAT
D3DFMT_R16F CL_R CL_HALF_FLOAT
D3DFMT_L16 CL_R CL_UNORM_INT16
D3DFMT_A8 CL_R CL_UNORM_INT8
D3DFMT_L8 CL_R CL_UNORM_INT8
D3DFMT_G32R32F CL_RG CL_FLOAT
D3DFMT_G16R16F CL_RG CL_HALF_FLOAT
D3DFMT_G16R16 CL_RG CL_UNORM_INT16
D3DFMT_V16U16 CL_RG CL_SNORM_INT16
D3DFMT_A8L8 CL_RG CL_UNORM_INT8
D3DFMT_V8U8 CL_RG CL_SNORM_INT8
D3DFMT_A32B32G32R32F CL_RGBA CL_FLOAT
D3DFMT_A16B16G16R16F CL_RGBA CL_HALF_FLOAT
D3DFMT_A16B16G16R16 CL_RGBA CL_UNORM_INT16
D3DFMT_Q16W16V16U16 CL_RGBA CL_SNORM_INT16
D3DFMT_A8B8G8R8 CL_RGBA CL_UNORM_INT8
D3DFMT_X8B8G8R8 CL_RGBA CL_UNORM_INT8
D3DFMT_A8R8G8B8 CL_RGBA CL_UNORM_INT8
D3DFMT_X8R8G8B8 CL_RGBA CL_UNORM_INT8
D3DFMT_Q8W8V8U8 CL_RGBA CL_SNORM_INT8
------------------------------------------------------------------
Table 9.13.4.1: List of Direct3D 9 and corresponding OpenCL Image
Formats.
Note that the channel order is literal and makes no effort to swizzle
the channels so that the OpenCL channel order matches the Direct3D 9
channel order. For example, for a texture of format
D3DFMT_A32B32G32R32F, the OpenCL red component will correspond to the
Direct3D alpha component, the OpenCL green component will correspond
to the Direct3D blue component, and so on.
9.13.5 Querying Direct3D properties of memory objects created from
Direct3D 9 resources.
Properties of Direct3D 9 objects may be queried using clGetMemObjectInfo
and clGetImageInfo with <param_name> CL_MEM_D3D9_RESOURCE_NV,
CL_IMAGE_D3D9_LEVEL_NV, and CL_IMAGE_D3D9_FACE_NV as described in
section 5.2.9.
9.13.6 Sharing memory objects created from Direct3D 9 resources between
Direct3D 9 and OpenCL contexts
The function
cl_int clEnqueueAcquireD3D9ObjectsNV(
cl_command_queue command_queue,
cl_uint num_objects,
const cl_mem *mem_objects,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event)
is used to acquire OpenCL memory objects that have been created from
Direct3D 9 resources. The Direct3D 9 objects are acquired by the
OpenCL context associated with <command_queue> and can therefore be
used by all command-queues associated with the OpenCL context.
OpenCL memory objects created from Direct3D 9 resources must be
acquired before they can be used by any OpenCL commands queued to
a command-queue. If an OpenCL memory object created from a Direct3D 9
resource is used while it is not currently acquired by OpenCL, the call
attempting to use that OpenCL memory object will return
CL_D3D9_RESOURCE_NOT_ACQUIRED_NV.
clEnqueueAcquireD3D9ObjectsNV provides the synchronization guarantee
that any Direct3D 9 calls made before clEnqueueAcquireD3D9ObjectsNV is
called will complete executing before <event> reports completion
and before the execution of any subsequent OpenCL work issued in
<command_queue> begins.
<command_queue> is a valid command-queue.
<num_objects> is the number of memory objects to be acquired in
<mem_objects>.
<mem_objects> is a pointer to a list of OpenCL memory objects that
were created from Direct3D 9 resources.
<event_wait_list> and <num_events_in_wait_list> specify events that
need to complete before this particular command can be executed. If
<event_wait_list> is NULL, then this particular command does not
wait on any event to complete. If <event_wait_list> is NULL,
<num_events_in_wait_list> must be 0. If <event_wait_list> is not
NULL, the list of events pointed to by <event_wait_list> must be
valid and <num_events_in_wait_list> must be greater than 0. The
events specified in <event_wait_list> act as synchronization points.
<event> returns an event object that identifies this particular
command and can be used to query or queue a wait for this
particular command to complete. <event> can be NULL in which case it
will not be possible for the application to query the status of this
command or queue a wait for this command to complete.
clEnqueueAcquireD3D9ObjectsNV returns CL_SUCCESS if the function is
executed successfully. If <num_objects> is 0 and <mem_objects> is
NULL then the function does nothing and returns CL_SUCCESS. Otherwise it
returns one of the following errors:
* CL_INVALID_VALUE if <num_objects> is zero and <mem_objects> is
not a NULL value or if <num_objects> > 0 and <mem_objects> is
NULL.
* CL_INVALID_MEM_OBJECT if memory objects in <mem_objects> are not
valid OpenCL memory objects or if memory objects in <mem_objects>
have not been created from Direct3D 9 resources.
* CL_INVALID_COMMAND_QUEUE if <command_queue> is not a valid
command-queue.
* CL_INVALID_CONTEXT if context associated with <command_queue> was
not created from an Direct3D 9 device.
* CL_D3D9_RESOURCE_ALREADY_ACQUIRED_NV if memory objects in
<mem_objects> have previously been acquired using
clEnqueueAcquireD3D9ObjectsNV but have not been released
using clEnqueueReleaseD3D9ObjectsNV.
* CL_INVALID_EVENT_WAIT_LIST if <event_wait_list> is NULL and
<num_events_in_wait_list> > 0, or <event_wait_list> is not NULL
and <num_events_in_wait_list> is 0, or if event objects in
<event_wait_list> are not valid events.
* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
required by the OpenCL implementation on the host.
The function
cl_int clEnqueueReleaseD3D9ObjectsNV(
cl_command_queue command_queue,
cl_uint num_objects,
const cl_mem *mem_objects,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event)
is used to release OpenCL memory objects that have been created from
Direct3D 9 resources. The Direct3D 9 objects are released by the
OpenCL context associated with <command_queue>.
OpenCL memory objects created from Direct3D 9 resources which have
been acquired by OpenCL must be released by OpenCL before they may be
accessed by Direct3D 9. Accessing a Direct3D 9 resource while its
corresponding OpenCL memory object is acquired is in error and will
result in undefined behavior, including but not limited to possible
OpenCL errors, data corruption, and program termination.
clEnqueueReleaseD3D9ObjectsNV provides the synchronization guarantee
that any calls to Direct3D 9 made after the call to
clEnqueueReleaseD3D9ObjectsNV will not start executing until after
all events in <event_wait_list> are complete and all work already
submitted to <command_queue> completes execution.
<num_objects> is the number of memory objects to be released in
<mem_objects>.
<mem_objects> is a pointer to a list of OpenCL memory objects that
were created from Direct3D 9 resources.
<event_wait_list> and <num_events_in_wait_list> specify events that
need to complete before this particular command can be executed. If
<event_wait_list> is NULL, then this particular command does not
wait on any event to complete. If <event_wait_list> is NULL,
<num_events_in_wait_list> must be 0. If <event_wait_list> is not
NULL, the list of events pointed to by <event_wait_list> must be
valid and <num_events_in_wait_list> must be greater than 0. The
events specified in
<event> returns an event object that identifies this particular
command and can be used to query or queue a wait for this
particular command to complete. <event> can be NULL in which case it
will not be possible for the application to query the status of this
command or queue a wait for this command to complete.
clEnqueueReleaseExternalObjectsNV returns CL_SUCCESS if the function
is executed successfully. If <num_objects> is 0 and <mem_objects> is
NULL the function does nothing and returns CL_SUCCESS. Otherwise it
returns one of the following errors:
* CL_INVALID_VALUE if <num_objects> is zero and <mem_objects> is
not a NULL value or if <num_objects> > 0 and <mem_objects> is
NULL.
* CL_INVALID_MEM_OBJECT if memory objects in <mem_objects> are not
valid OpenCL memory objects or if memory objects in <mem_objects>
have not been created from Direct3D 9 resources.
* CL_INVALID_COMMAND_QUEUE if <command_queue> is not a valid
command-queue.
* CL_INVALID_CONTEXT if context associated with <command_queue> was
not created from a Direct3D 9 device.
* CL_D3D9_RESOURCE_NOT_ACQUIRED_NV if memory objects in
<mem_objects> have not previously
clEnqueueAcquireD3D9ObjectsNV, or have been released using
clEnqueueReleaseD3D9ObjectsNV since the last time that they
were acquired.
* CL_INVALID_EVENT_WAIT_LIST if <event_wait_list> is NULL and
<num_events_in_wait_list> > 0, or <event_wait_list> is not NULL
and <num_events_in_wait_list> is 0, or if event objects in
<event_wait_list> are not valid events.
* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
required by the OpenCL implementation on the host.
Revision History
Version 2, 2010/01/06 (Jon Leech) - add missing extension template
fields and publish in the Khronos Registry.
Version 1, 2009/12/07 - branched from draft of cl_nv_d3d10_sharing.