Returns the address of the extension function named by
funcname
for a given platform
.
void*
clGetExtensionFunctionAddressForPlatform
(
| cl_platform_id platform , |
const
char
*funcname
) |
The function clGetExtensionFunctionAddressForPlatform
returns
the address of the extension function named by funcname
for a
given platform
. The pointer returned should be cast to a function
pointer type matching the extension function's definition defined in the appropriate
extension specification and header file.
A return value of NULL indicates that the specified function does not exist for the
implementation or platform
is not a valid platform. A non-NULL
return value for clGetExtensionFunctionAddressForPlatform
does not guarantee that an extension function is actually supported by
the platform. The application must also make a corresponding query using
clGetPlatformInfo
(platform, CL_PLATFORM_EXTENSIONS
, ... ) or
clGetDeviceInfo
(device,CL_DEVICE_EXTENSIONS
, ... ) to determine if an extension
is supported by the OpenCL implementation.
clGetExtensionFunctionAddressForPlatform
may not be queried
for core (non-extension) functions in OpenCL. For functions that are queryable with
clGetExtensionFunctionAddressForPlatform
, implementations may
choose to also export those functions statically from the object libraries implementing
those functions. However, portable applications cannot rely on this behavior.
Function pointer typedefs must be declared for all extensions that add API entrypoints.
These typedefs are a required part of the extension interface, to be provided in
an appropriate header (such as cl_ext.h
if the extension is an OpenCL
extension, or cl_gl_ext.h
if the extension is an OpenCL/OpenGL sharing
extension).
Since there is no way to qualify the query with a device, the function pointer returned must work for all implementations of that extension on different devices for a platform. The behavior of calling a device extension function on a device not supporting that extension is undefined.
If the cl_khr_icd
extension is enabled, for functions supported by the ICD Loader,
clGetExtensionFunctionAddress
will return the function pointer of the ICD Loader
implementation. For extension functions which the ICD
Loader is unaware of, the function
clGetExtensionFunctionAddress
will determine the vendor
implementation to return based on the string passed in.
The ICD Loader will return the result from querying
clGetExtensionFunctionAddress
on the vendor ICD enumerated by the ICD
Loader whose ICD suffix is a suffix of the function
name being queried. If no such vendor exists
or the suffix of the function is KHR
or EXT
then
clGetExtensionFunctionAddress
will return NULL.
The following convention must be followed for all extensions affecting the host API,
where TAG can be KHR
, EXT
or vendor-specific:
#ifndef extension_name #define extension_name 1 // all data typedefs, token #defines, prototypes, and // function pointer typedefs for this extension // function pointer typedefs must use the // following naming convention typedef CL_API_ENTRY return type (CL_API_CALL *clextension_func_nameTAG_fn)(...); #endif // extension_name |
Consider, for example, the
cl_khr_gl_sharing
extension. This extension would add the following to cl_gl_ext.h
:
#ifndef cl_khr_gl_sharing #define cl_khr_gl_sharing 1 // all data typedefs, token #defines, prototypes, and // function pointer typedefs for this extension #define CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR -1000 #define CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR 0x2006 #define CL_DEVICES_FOR_GL_CONTEXT_KHR 0x2007 #define CL_GL_CONTEXT_KHR 0x2008 #define CL_EGL_DISPLAY_KHR 0x2009 #define CL_GLX_DISPLAY_KHR 0x200A #define CL_WGL_HDC_KHR 0x200B #define CL_CGL_SHAREGROUP_KHR 0x200C // function pointer typedefs must use the // following naming convention typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetGLContextInfoKHR_fn)( const cl_context_properties * /* properties */, cl_gl_context_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /*param_value_size_ret*/); #endif // cl_khr_gl_sharing |