blob: 0635e72b0f026559f2586dbf40a72ca7d0a5a8cc [file] [log] [blame]
Name String
cl_khr_d3d10_sharing
Contact
Mike Houston, Advanced Micro Devices, Inc. ( michael.houston 'at' amd.com )
Christopher Cameron, NVIDIA Corporation ( chcameron 'at' nvidia.com )
Contributors
Christopher Cameron (Nvidia)
Ben Gaster (AMD)
Michael Gold (Nvidia)
Mike Houston (AMD)
John Kessenich (Intel)
Christopher Lamb (Nvidia)
Victor Odintsov (AMD)
Ofer Rosenberg (Intel)
Version
Version 9, March 31, 2010
Number
OpenCL Extension #6
Status
Complete. Version 7 approved by the OpenCL Working Group.
Ratified by the Khronos Promoters, February 26, 2010.
Extension Type
OpenCL platform extension
Dependencies
OpenCL 1.0 is required. This extension is written against the OpenCL
1.0-rev48 Specification.
A Direct3D 10 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 10. This is designed to function analogously to
the OpenGL interoperability as defined in the OpenCL 1.0
specification and accompanying extensions.
Header File
Interfaces for this extension are provided in cl_d3d10.h .
New Procedures and Functions
cl_int clGetDeviceIDsFromD3D10KHR(
cl_platform_id platform,
cl_d3d10_device_source_khr d3d_device_source,
void *d3d_object,
cl_d3d10_device_set_khr d3d_device_set,
cl_uint num_entries,
cl_device_id *devices,
cl_uint *num_devices)
cl_mem clCreateFromD3D10BufferKHR(
cl_context context,
cl_mem_flags flags,
ID3D10Buffer *resource,
cl_int *errcode_ret)
cl_mem clCreateFromD3D10Texture2DKHR(
cl_context context,
cl_mem_flags flags,
ID3D10Texture2D *resource,
UINT subresource,
cl_int *errcode_ret)
cl_mem clCreateFromD3D10Texture3DKHR(
cl_context context,
cl_mem_flags flags,
ID3D10Texture3D *resource,
UINT subresource,
cl_int *errcode_ret)
cl_int clEnqueueAcquireD3D10ObjectsKHR(
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 clEnqueueReleaseD3D10ObjectsKHR(
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 10 device source in the <d3d_device_source>
parameter of clGetDeviceIDsFromD3D10KHR:
CL_D3D10_DEVICE_KHR 0x4010
CL_D3D10_DXGI_ADAPTER_KHR 0x4011
Accepted as a set of Direct3D 10 devices in the <d3d_device_set> parameter
of clGetDeviceIDsFromD3D10KHR:
CL_PREFERRED_DEVICES_FOR_D3D10_KHR 0x4012
CL_ALL_DEVICES_FOR_D3D10_KHR 0x4013
Accepted as a property name in the <properties> parameter of
clCreateContext and clCreateContextFromType:
CL_CONTEXT_D3D10_DEVICE_KHR 0x4014
Accepted as a property name in the <param_name> parameter of
clGetContextInfo:
CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR 0x402C
Accepted as the property being queried in the <param_name>
parameter of clGetMemObjectInfo:
CL_MEM_D3D10_RESOURCE_KHR 0x4015
Accepted as the property being queried in the <param_name>
parameter of clGetImageInfo:
CL_IMAGE_D3D10_SUBRESOURCE_KHR 0x4016
Returned in the <param_value> parameter of clGetEventInfo when
<param_name> is CL_EVENT_COMMAND_TYPE:
CL_COMMAND_ACQUIRE_D3D10_OBJECTS_KHR 0x4017
CL_COMMAND_RELEASE_D3D10_OBJECTS_KHR 0x4018
Returned by clCreateContext and clCreateContextFromType if the Direct3D 10
device specified for interoperability is not compatible with the devices
against which the context is to be created:
CL_INVALID_D3D10_DEVICE_KHR -1002
Returned by clCreateFromD3D10BufferKHR when <resource> is not a Direct3D 10
buffer object, and by clCreateFromD3D10Texture2DKHR and
clCreateFromD3D10Texture3DKHR when <resource> is not a Direct3D 10 texture
object.
CL_INVALID_D3D10_RESOURCE_KHR -1003
Returned by clEnqueueAcquireD3D10ObjectsKHR when any of <mem_objects> are
currently acquired by OpenCL
CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR -1004
Returned by clEnqueueReleaseD3D10ObjectsKHR when any of <mem_objects> are
not currently acquired by OpenCL
CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR -1005
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_D3D10_DEVICE_KHR ID3D10Device* NULL Specifies the ID3D10Device*
to use for Direct3D 10
interoperabilty."
--------------------------------------------------------------------------------------"
Add to the list of errors for clCreateContext:
"* CL_INVALID_D3D10_DEVICE_KHR if the value of the property
CL_CONTEXT_D3D10_DEVICE_KHR is non-NULL and does not specify a valid
Direct3D 10 device with which the cl_device_ids against which this context
is to be created may interoperate.
* CL_INVALID_OPERATION if Direct3D 10 interoperability is specified by
setting CL_INVALID_D3D10_DEVICE_KHR 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.
Add the following row to table 4.5:
"--------------------------------------------------------------------------------------
cl_context_info Return Type Information returned in param_value
--------------------- ----------- -----------------------------------
CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR
cl_bool Returns CL_TRUE if Direct3D 10 resources
created as shared by setting MiscFlags to
include D3D10_RESOURCE_MISC_SHARED will perform
faster when shared with OpenCL, compared with
resources which have not set this flag.
Otherwise returns CL_FALSE."
--------------------------------------------------------------------------------------"
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_D3D10_RESOURCE_KHR if <param_name> is CL_MEM_D3D10_RESOURCE_KHR
and <memobj> was not created by the function clCreateFromD3D10BufferKHR,
clCreateFromD3D10Texture2DKHR, or
clCreateFromD3D10Texture3DKHR."
Extend table 5.8 to include the following entry.
cl_mem_info Return type Info. returned in param_value
----------- --------------- -----------------------------
CL_MEM_D3D10_RESOURCE_KHR ID3D10Resource* If <memobj> was created using
clCreateFromD3D10BufferKHR,
clCreateFromD3D10Texture2DKHR, or
clCreateFromD3D10Texture3DKHR,
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_D3D10_RESOURCE_KHR if <param_name> is CL_MEM_D3D10_SUBRESOURCE_KHR
and <image> was not created by the function clCreateFromD3D10Texture2DKHR or
clCreateFromD3D10Texture3DKHR."
Extend table 5.9 to include the following entry.
cl_image_info Return type Info. returned in param_value
------------- --------------- -----------------------------
CL_IMAGE_D3D10_SUBRESOURCE_KHR ID3D10Resource* If <image> was created using
clCreateFromD3D10Texture2DKHR, or
clCreateFromD3D10Texture3DKHR,
returns the <subresource> 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_D3D10_OBJECTS_KHR
CL_COMMAND_RELEASE_D3D10_OBJECTS_KHR
Add new section 9.13
9.13 Sharing Memory Objects with Direct3D 10 Resources
This section discusses OpenCL functions that allow applications to use
Direct3D 10 resources as OpenCL memory objects. This allows efficient
sharing of data between OpenCL and Direct3D 10. The OpenCL API may be
used to execute kernels that read and/or write memory objects that are
also Direct3D 10 resources. An OpenCL image object may be created from
a Direct3D 10 texture resource. An OpenCL buffer object may
be created from a Direct3D 10 buffer resource. OpenCL memory objects
may be created from Direct3D 10 objects if and only if the OpenCL context
has been created from a Direct3D 10 device.
9.13.1 Querying OpenCL Devices Corresponding to Direct3D 10 Devices
The OpenCL devices corresponding to a Direct3D 10 device may be queried.
The OpenCL devices corresponding to a DXGI adapter may also be
queried. The OpenCL devices corresponding to a Direct3D 10 device will
be a subset of the OpenCL devices corresponding to the DXGI adapter
against which the Direct3D 10 device was created.
The OpenCL devices corresponding to a Direct3D 10 device or a DXGI device
may be queried using the function
cl_int clGetDeviceIDsFromD3D10KHR(
cl_platform_id platform,
cl_d3d10_device_source_khr d3d_device_source,
void *d3d_object,
cl_d3d10_device_set_khr 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.
clGetDeviceIDsFromD3D10KHR 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_d3d_device_source_khr Type of <d3d_object>
------------------------ --------------------
CL_D3D10_DEVICE_KHR ID3D10Device *
CL_D3D10_DXGI_ADAPTER_KHR IDXGIAdapter *
--------------------------------------------------------------------
Table 9.13.1.1: Types used to specify the object whose corresponding
OpenCL devices are being queried by clGetDeviceIDsFromD3D10KHR.
--------------------------------------------------------------------
cl_d3d_device_set_khr Devices returned in <devices>
------------------------ -----------------------------
CL_PREFERRED_DEVICES_FOR_D3D10_KHR The OpenCL devices associated with
the specified Direct3D object.
CL_ALL_DEVICES_FOR_D3D10_KHR 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
clGetDeviceIDsFromD3D10KHR.
9.13.2 Lifetime of Shared Objects
An OpenCL memory object created from a Direct3D 10 resource remains
valid as long as the corresponding Direct3D 10 resource has not been
deleted. If the Direct3D 10 resource is deleted through the Direct3D
10 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 10 device
specified via the context create parameter CL_CONTEXT_D3D10_DEVICE_KHR
will increment the internal Direct3D reference count on the specified
Direct3D 10 device. The internal Direct3D reference count on that
Direct3D 10 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 10 device from which the OpenCL context
was created. If the Direct3D 10 device is deleted through the Direct3D 10
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 10 Buffer Resources as OpenCL Buffer Objects
The function
cl_mem clCreateFromD3D10BufferKHR(
cl_context context,
cl_mem_flags flags,
ID3D10Buffer *resource,
int *errcode_ret)
creates an OpenCL buffer object from a Direct3D 10 buffer.
<context> is a valid OpenCL context created from a Direct3D 10 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 10 buffer to share.
<errcode_ret> will return an appropriate error code. If
<errcode_ret> is NULL, no error code is returned.
clCreateFromD3D10BufferKHR 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_D3D10_RESOURCE_KHR if <resource> is not a Direct3D 10
buffer resource, if <resource> was created with the D3D10_USAGE
flag D3D10_USAGE_IMMUTABLE, if a cl_mem from <resource> has already
been created using clCreateFromD3D10BufferKHR, or if <context>
was not created against the same Direct3D 10 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 10 Texture and Resources as OpenCL Image
Objects
The function
cl_mem clCreateFromD3D10Texture2DKHR(
cl_context context,
cl_mem_flags flags,
ID3D10Texture2D *resource,
UINT subresource,
int *errcode_ret)
creates an OpenCL 2D image object from a subresource of a Direct3D
10 2D texture.
<context> is a valid OpenCL context created from a Direct3D 10 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 10 2D texture to share.
<subresource> is the subresource of <resource> to share.
<errcode_ret> will return an appropriate error code. If
<errcode_ret> is NULL, no error code is returned.
clCreateFromD3D10Texture2DKHR returns a valid non-zero OpenCL image
object 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 <flags> are not valid or if
<subresource> is not a valid subresource index for <resource>.
* CL_INVALID_D3D10_RESOURCE_KHR if <resource> is not a Direct3D 10
texture resource, if <resource> was created with the D3D10_USAGE flag
D3D10_USAGE_IMMUTABLE, if <resource> is a multisampled
texture, if a cl_mem from subresource <subresource> of <resource> has
already been created using clCreateFromD3D10Texture2DKHR,
or if <context> was not created against the same Direct3D 10 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 subresource <subresource>
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 clCreateFromD3D10Texture3DKHR(
cl_context context,
cl_mem_flags flags,
ID3D10Texture3D *resource,
UINT subresource,
int *errcode_ret)
creates an OpenCL 3D image object from a subresource of a Direct3D
10 3D texture.
<context> is a valid OpenCL context created from a Direct3D 10 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 10 3D texture to share.
<subresource> is the subresource of <resource> to share.
<errcode_ret> will return an appropriate error code. If
<errcode_ret> is NULL, no error code is returned.
clCreateFromD3D10Texture3DKHR returns a valid non-zero OpenCL image
object 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 <flags> are not valid or if
<subresource> is not a valid subresource index for <resource>.
* CL_INVALID_D3D10_RESOURCE_KHR if <resource> is not a Direct3D 10
texture resource, if <resource> was created with the D3D10_USAGE flag
D3D10_USAGE_IMMUTABLE, if a cl_mem from subresource <subresource> of
<resource> has already been created using clCreateFromD3D10Texture3DKHR,
or if <context> was not created against the same Direct3D 10 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 return OpenCL 3D image object
are determined by the width, height, and depth of subresource
<subresource> 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.
------------------------------------------------------------------
DXGI Format cl_channel_order cl_channel_type
------------------------------ ---------------- ---------------
DXGI_FORMAT_R32G32B32A32_FLOAT CL_RGBA CL_FLOAT
DXGI_FORMAT_R32G32B32A32_UINT CL_RGBA CL_UNSIGNED_INT32
DXGI_FORMAT_R32G32B32A32_SINT CL_RGBA CL_SIGNED_INT32
DXGI_FORMAT_R16G16B16A16_FLOAT CL_RGBA CL_HALF_FLOAT
DXGI_FORMAT_R16G16B16A16_UNORM CL_RGBA CL_UNORM_INT16
DXGI_FORMAT_R16G16B16A16_UINT CL_RGBA CL_UNSIGNED_INT16
DXGI_FORMAT_R16G16B16A16_SNORM CL_RGBA CL_SNORM_INT16
DXGI_FORMAT_R16G16B16A16_SINT CL_RGBA CL_SIGNED_INT16
DXGI_FORMAT_R8G8B8A8_UNORM CL_RGBA CL_UNORM_INT8
DXGI_FORMAT_R8G8B8A8_UINT CL_RGBA CL_UNSIGNED_INT8
DXGI_FORMAT_R8G8B8A8_SNORM CL_RGBA CL_SNORM_INT8
DXGI_FORMAT_R8G8B8A8_SINT CL_RGBA CL_SIGNED_INT8
DXGI_FORMAT_R32G32_FLOAT CL_RG CL_FLOAT
DXGI_FORMAT_R32G32_UINT CL_RG CL_UNSIGNED_INT32
DXGI_FORMAT_R32G32_SINT CL_RG CL_SIGNED_INT32
DXGI_FORMAT_R16G16_FLOAT CL_RG CL_HALF_FLOAT
DXGI_FORMAT_R16G16_UNORM CL_RG CL_UNORM_INT16
DXGI_FORMAT_R16G16_UINT CL_RG CL_UNSIGNED_INT16
DXGI_FORMAT_R16G16_SNORM CL_RG CL_SNORM_INT16
DXGI_FORMAT_R16G16_SINT CL_RG CL_SIGNED_INT16
DXGI_FORMAT_R8G8_UNORM CL_RG CL_UNORM_INT8
DXGI_FORMAT_R8G8_UINT CL_RG CL_UNSIGNED_INT8
DXGI_FORMAT_R8G8_SNORM CL_RG CL_SNORM_INT8
DXGI_FORMAT_R8G8_SINT CL_RG CL_SIGNED_INT8
DXGI_FORMAT_R32_FLOAT CL_R CL_FLOAT
DXGI_FORMAT_R32_UINT CL_R CL_UNSIGNED_INT32
DXGI_FORMAT_R32_SINT CL_R CL_SIGNED_INT32
DXGI_FORMAT_R16_FLOAT CL_R CL_HALF_FLOAT
DXGI_FORMAT_R16_UNORM CL_R CL_UNORM_INT16
DXGI_FORMAT_R16_UINT CL_R CL_UNSIGNED_INT16
DXGI_FORMAT_R16_SNORM CL_R CL_SNORM_INT16
DXGI_FORMAT_R16_SINT CL_R CL_SIGNED_INT16
DXGI_FORMAT_R8_UNORM CL_R CL_UNORM_INT8
DXGI_FORMAT_R8_UINT CL_R CL_UNSIGNED_INT8
DXGI_FORMAT_R8_SNORM CL_R CL_SNORM_INT8
DXGI_FORMAT_R8_SINT CL_R CL_SIGNED_INT8
------------------------------------------------------------------
Table 9.13.4.1: List of Direct3D 10 and corresponding OpenCL Image
Formats
9.13.5 Querying Direct3D properties of memory objects created from
Direct3D 10 resources.
Properties of Direct3D 10 objects may be queried using clGetMemObjectInfo
and clGetImageInfo with <param_name> CL_MEM_D3D10_RESOURCE_KHR and
CL_IMAGE_D3D10_SUBRESOURCE_KHR as described in section 5.2.9.
9.13.6 Sharing memory objects created from Direct3D 10 resources between
Direct3D 10 and OpenCL contexts
The function
cl_int clEnqueueAcquireD3D10ObjectsKHR(
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 10 resources. The Direct3D 10 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 10 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 10
resource is used while it is not currently acquired by OpenCL, the call
attempting to use that OpenCL memory object will return
CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR.
clEnqueueAcquireD3D10ObjectsKHR provides the synchronization guarantee
that any Direct3D 10 calls made before clEnqueueAcquireD3D10ObjectsKHR 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 10 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.
clEnqueueAcquireD3D10ObjectsKHR 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 10 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 10 context.
* CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR if memory objects in
<mem_objects> have previously been acquired using
clEnqueueAcquireD3D10ObjectsKHR but have not been released
using clEnqueueReleaseD3D10ObjectsKHR.
* 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 clEnqueueReleaseD3D10ObjectsKHR(
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 10 resources. The Direct3D 10 objects are released by the
OpenCL context associated with <command_queue>.
OpenCL memory objects created from Direct3D 10 resources which have
been acquired by OpenCL must be released by OpenCL before they may be
accessed by Direct3D 10. Accessing a Direct3D 10 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.
clEnqueueReleaseD3D10ObjectsKHR provides the synchronization guarantee
that any calls to Direct3D 10 made after the call to
clEnqueueReleaseD3D10ObjectsKHR 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 10 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.
clEnqueueReleaseD3D10ObjectsKHR 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 10 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 10 device.
* CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR if memory objects in
<mem_objects> have not previously
clEnqueueAcquireD3D10ObjectsKHR, or have been released using
clEnqueueReleaseD3D10ObjectsKHR 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.
Issues
1) Should this extension be KHR or EXT?
PROPOSED: KHR. If this extension is to be approved by Khronos then
it should be KHR, otherwise EXT. Not all platforms can support this
extension, but that is also true of OpenGL interop.
RESOLVED: KHR.
2) Requiring SharedHandle on ID3D10Resource
Requiring this can largely simplify things at the DDI level and make
some implementations faster. However, the DirectX spec only defines
the shared handle for a subset of the resources we would like to
support:
D3D10_RESOURCE_MISC_SHARED
Enables the sharing of resource data between two or more Direct3D
devices. The only resources that can be shared are 2D
non-mipmapped textures.
PROPOSED A: add wording to the spec about some implementations needing
the resource setup as shared:
"Some implementations may require the resource to be shared on the
D3D10 side of the API"
If we do that, do we need another enum to describe this failure case?
PROPOSED B: required that all implementations support both shared
and non-shared resources. The restrictions prohibiting multisample
textures and the flag D3D10_USAGE_IMMUTABLE guarantee software
access to all shareable resources.
RESOLVED: Require that implementations support both
D3D10_RESOURCE_MISC_SHARED being set and not set. Add the query
for CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR to determine on a
per-context basis which method will be faster.
3) Texture1D support
There is not a matching CL type, so do we want to
support this and map to buffer or Texture2D? If so the command might
correspond to the 2D / 3D versions:
cl_mem clCreateFromD3D10Texture1D(cl_context context,
cl_mem_flags flags,
ID3D10Texture2D *resource,
UINT subresource,
int *errcode_ret)
RESOLVED: We will not add support for ID3D10Texture1D objects unless
a corresponding OpenCL 1D Image type is created.
4) CL/D3D10 queries
The GL interop has clGetGLObjectInfo and clGetGLTextureInfo. It is
unclear if these are needed on the D3D10 interop side since the
D3D10 spec makes these queries trivial on the D3D10 object itself.
Also, not all of the sematics of the GL call map across.
PROPOSED: Add the clGetMemObjectInfo and clGetImageInfo parameter
names CL_MEM_D3D10_RESOURCE_KHR and CL_IMAGE_D3D10_SUBRESOURCE_KHR to
query the D3D10 resource from which a cl_mem was created. From this
data, any D3D10 side information may be queried using the D3D10 API.
RESOLVED: We will use clGetMemObjectInfo and clGetImageInfo to
access this information.
Revision History
Version 9, 2010/03/31 (Jon Leech) - cleanup for publication. Update
Status and Header File fields with final approved information. Fix
clEnqueueReleaseExternalObjectsKHR->clEnqueueReleaseD3D10ObjectsKHR
typo.
Version 8, 2010/02/08 (Christopher Cameron) - fix typos and add
enumerant values.
Version 7, 2009/12/14 (Christopher Cameron) - resolve issue 2 by
adding CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR query.
Version 6, 2009/12/01 (Christopher Cameron) - clarify error
codes and behavior of clContextCreate with CL_CONTEXT_D3D10_DEVICE.
Version 5, 2009/11/30 (Christopher Cameron) - clarify object
lifetime, add KHR decoration to symbols, clarify size and format of
shared objects, clarify acquire/release semantics mark issues as
resolved.
Version 4, 2009/11/23 (Christopher Cameron) - add synchronization
guarantees for clEnqueueAcquireD3D10Objects and
clEnqueueReleaseD3D10Objects.
Version 3, 2009/11/20 (Christopher Cameron) - add device/adapter
query function clGetDeviceIDsFromD3D10KHR. Add prohibition on
D3D10_USAGE_IMMUTABLE and multisample textures to guarantee a
consistent image format (e.g, how should a 2x multisampled texture
appear to OpenCL), add support for querying
CL_MEM_D3D10_RESOURCE_KHR and CL_IMAGE_D3D10_SUBRESOURCE_KHR. Add
image format conversion table. Minor tweaks of names, formatting.
Change extension name to cl_khr_d3d10_sharing to match OpenGL.
Version 2, 2009/09/08 (Jon Leech) - tweak spec to match CL extension
template structurally, some minor reformatting and reflowing of
text. Move clCreateFromD3D10Texture1D from the New Functions section
into issue 3. Update section numbering to be against OpenCL 1.0 rev
47.
Version 1, 2009/08/31 (Michael Houston) - initial extension
specification based on discussion in bug 3663.