| <% |
| # Extensions to skip by default because they are in dedicated headers: |
| skipExtensions = { |
| 'cl_khr_d3d10_sharing', |
| 'cl_khr_d3d11_sharing', |
| 'cl_khr_dx9_media_sharing', |
| 'cl_khr_egl_event', |
| 'cl_khr_egl_image', |
| 'cl_khr_gl_depth_images', |
| 'cl_khr_gl_event', |
| 'cl_khr_gl_msaa_sharing', |
| 'cl_khr_gl_sharing', |
| 'cl_loader_layers', |
| 'cl_intel_dx9_media_sharing', |
| 'cl_intel_va_api_media_sharing', |
| 'cl_intel_sharing_format_query_d3d10', |
| 'cl_intel_sharing_format_query_d3d11', |
| 'cl_intel_sharing_format_query_dx9', |
| 'cl_intel_sharing_format_query_gl', |
| 'cl_intel_sharing_format_query_va_api', |
| } |
| |
| # Extensions to include in this header: |
| def shouldGenerate(extension): |
| if extension in genExtensions: |
| return True |
| elif not genExtensions and not extension in skipExtensions: |
| return True |
| return False |
| |
| # XML blocks to include in the headers: |
| def shouldEmit(block): |
| for type in block.findall('type'): |
| if type.get('name') in typedefs: |
| return True |
| elif type.get('name') in macros: |
| return True |
| elif type.get('name') in structs: |
| return True |
| for enum in block.findall('enum'): |
| #if enum.get('name') in enums: |
| return True |
| for func in block.findall('command'): |
| return True |
| return False |
| |
| # Initially, keep the same extension order as the original headers: |
| orderedExtensions = [ |
| # cl_ext.h: |
| 'cl_khr_command_buffer', |
| 'cl_khr_command_buffer_multi_device', |
| 'cl_khr_command_buffer_mutable_dispatch', |
| 'cl_khr_fp64', |
| 'cl_khr_fp16', |
| 'cl_APPLE_SetMemObjectDestructor', |
| 'cl_APPLE_ContextLoggingFunctions', |
| 'cl_khr_icd', |
| 'cl_khr_il_program', |
| 'cl_khr_image2D_from_buffer', # incorrect name |
| 'cl_khr_image2d_from_buffer', |
| 'cl_khr_initialize_memory', |
| 'cl_khr_terminate_context', |
| 'cl_khr_spir', |
| 'cl_khr_create_command_queue', |
| 'cl_nv_device_attribute_query', |
| 'cl_amd_device_attribute_query', |
| 'cl_arm_printf', |
| 'cl_ext_device_fission', |
| 'cl_ext_migrate_memobject', |
| 'cl_ext_cxx_for_opencl', |
| 'cl_qcom_ext_host_ptr', |
| 'cl_qcom_ext_host_ptr_iocoherent', |
| 'cl_qcom_ion_host_ptr', |
| 'cl_qcom_android_native_buffer_host_ptr', |
| 'cl_img_yuv_image', |
| 'cl_img_cached_allocations', |
| 'cl_img_use_gralloc_ptr', |
| 'cl_img_generate_mipmap', |
| 'cl_img_mem_properties', |
| 'cl_khr_subgroups', |
| 'cl_khr_mipmap_image', |
| 'cl_khr_priority_hints', |
| 'cl_khr_throttle_hints', |
| 'cl_khr_subgroup_named_barrier', |
| 'cl_khr_extended_versioning', |
| 'cl_khr_device_uuid', |
| 'cl_khr_pci_bus_info', |
| 'cl_khr_suggested_local_work_size', |
| 'cl_khr_integer_dot_product', |
| 'cl_khr_external_memory', |
| 'cl_khr_external_memory_dma_buf', |
| 'cl_khr_external_memory_dx', |
| 'cl_khr_external_memory_opaque_fd', |
| 'cl_khr_external_memory_win32', |
| 'cl_khr_external_semaphore', |
| 'cl_khr_external_semaphore_dx_fence', |
| 'cl_khr_external_semaphore_opaque_fd', |
| 'cl_khr_external_semaphore_sync_fd', |
| 'cl_khr_external_semaphore_win32', |
| 'cl_khr_semaphore', |
| 'cl_arm_import_memory', |
| 'cl_arm_shared_virtual_memory', |
| 'cl_arm_get_core_id', |
| 'cl_arm_job_slot_selection', |
| 'cl_arm_scheduling_controls', |
| 'cl_arm_controlled_kernel_termination', |
| 'cl_arm_protected_memory_allocation', |
| 'cl_intel_exec_by_local_thread', |
| 'cl_intel_device_attribute_query', |
| 'cl_intel_device_partition_by_names', |
| 'cl_intel_accelerator', |
| 'cl_intel_motion_estimation', |
| 'cl_intel_advanced_motion_estimation', |
| 'cl_intel_simultaneous_sharing', |
| 'cl_intel_egl_image_yuv', |
| 'cl_intel_packed_yuv', |
| 'cl_intel_required_subgroup_size', |
| 'cl_intel_driver_diagnostics', |
| 'cl_intel_planar_yuv', |
| 'cl_intel_device_side_avc_motion_estimation', |
| 'cl_intel_unified_shared_memory', |
| 'cl_intel_mem_alloc_buffer_location', |
| 'cl_intel_create_buffer_with_properties', |
| 'cl_intel_program_scope_host_pipe', |
| 'cl_intel_mem_channel_property', |
| 'cl_intel_mem_force_host_memory', |
| 'cl_intel_command_queue_families', |
| 'cl_intel_queue_no_sync_operations', |
| 'cl_intel_sharing_format_query', |
| 'cl_ext_image_requirements_info', |
| 'cl_ext_image_from_buffer', |
| 'cl_loader_info', |
| 'cl_khr_depth_images', |
| 'cl_ext_float_atomics', |
| 'cl_intel_create_mem_object_properties', |
| 'cl_pocl_content_size', |
| 'cl_ext_image_raw10_raw12', |
| # cl_d3d10.h |
| 'cl_khr_d3d10_sharing', |
| 'cl_intel_sharing_format_query_d3d10', |
| # cl_d3d11.h |
| 'cl_khr_d3d11_sharing', |
| 'cl_intel_sharing_format_query_d3d11', |
| # cl_dx9_media_sharing.h |
| 'cl_khr_dx9_media_sharing', |
| 'cl_intel_dx9_media_sharing', |
| 'cl_intel_sharing_format_query_dx9', |
| # cl_egl.h |
| 'cl_khr_egl_image', |
| 'cl_khr_egl_event', |
| # cl_gl.h |
| 'cl_khr_gl_sharing', |
| 'cl_khr_gl_event', |
| 'cl_khr_gl_depth_images', |
| 'cl_khr_gl_msaa_sharing', |
| 'cl_intel_sharing_format_query_gl', |
| # cl_layer.h |
| 'cl_loader_layers', |
| # cl_va_api_media_sharing_intel.h |
| 'cl_intel_sharing_format_query_va_api', |
| 'cl_intel_va_api_media_sharing', |
| ] |
| |
| def getExtensionSortKey(item): |
| name = item.get('name') |
| try: |
| index = orderedExtensions.index(name) |
| except ValueError: |
| if name.startswith('cl_khr'): |
| index = 10000 |
| elif name.startswith('cl_ext'): |
| index = 10001 |
| else: |
| index = 10002 |
| return index, name |
| |
| # Order the extensions should be emitted in the headers. |
| # KHR -> EXT -> Vendor Extensions |
| def getExtensionSortKey_ideal(item): |
| name = item.get('name') |
| if name.startswith('cl_khr'): |
| return 0, name |
| if name.startswith('cl_ext'): |
| return 1, name |
| return 99, name |
| |
| # Order enums should be emitted in the headers. |
| # Enums Without Bits -> Ordered Bit Enums |
| def getEnumSortKey(item): |
| name = item.get('name') |
| if name in enums: |
| if enums[name].Value: |
| return -1 |
| if enums[name].Bitpos: |
| return int(enums[name].Bitpos) |
| return 99 |
| |
| # Gets C function parameter strings for the specified API params: |
| def getCParameterStrings(params): |
| strings = [] |
| if len(params) == 0: |
| strings.append("void") |
| else: |
| for param in params: |
| paramstr = param.Type + ' ' + param.Name + param.TypeEnd |
| strings.append(paramstr) |
| return strings |
| |
| # Gets a bit string for the specified bit position: |
| def getBitPosString(bitpos): |
| ret = '(' |
| ret += '(cl_bitfield)' if int(bitpos) >= 31 else '' |
| ret += '1 << ' |
| ret += bitpos |
| ret += ')' |
| return ret |
| |
| # Extensions that are included in the ICD dispatch table for historical reasons. |
| # This should not be required for new extensions! |
| loaderExtensions = { |
| 'cl_ext_device_fission', |
| 'cl_khr_d3d10_sharing', |
| 'cl_khr_d3d11_sharing', |
| 'cl_khr_dx9_media_sharing', |
| 'cl_khr_egl_event', |
| 'cl_khr_egl_image', |
| 'cl_khr_gl_event', |
| 'cl_khr_gl_sharing', |
| 'cl_khr_subgroups' |
| } |
| |
| # Gets the preprocessor guard for the given extension: |
| def getPrototypeIfGuard(name): |
| if name in loaderExtensions: |
| guard = '!defined(CL_NO_ICD_DISPATCH_EXTENSION_PROTOTYPES)' |
| else: |
| guard = '!defined(CL_NO_NON_ICD_DISPATCH_EXTENSION_PROTOTYPES)' |
| return guard |
| |
| # Names that have been generated already, since some may be shared by multiple |
| # extensions: |
| generatedNames = set() |
| |
| def isDuplicateName(name): |
| if name in generatedNames: |
| return True |
| generatedNames.add(name) |
| return False |
| |
| %>/******************************************************************************* |
| * Copyright (c) 2008-2023 The Khronos Group Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| ******************************************************************************/ |
| |
| #ifndef ${guard} |
| #define ${guard} |
| |
| /* |
| ** This header is generated from the Khronos OpenCL XML API Registry. |
| */ |
| |
| %if includes: |
| ${includes} |
| |
| %endif |
| #include <CL/cl.h> |
| |
| /* CL_NO_PROTOTYPES implies CL_NO_EXTENSION_PROTOTYPES: */ |
| #if defined(CL_NO_PROTOTYPES) && !defined(CL_NO_EXTENSION_PROTOTYPES) |
| #define CL_NO_EXTENSION_PROTOTYPES |
| #endif |
| |
| /* CL_NO_EXTENSION_PROTOTYPES implies |
| CL_NO_ICD_DISPATCH_EXTENSION_PROTOTYPES and |
| CL_NO_NON_ICD_DISPATCH_EXTENSION_PROTOTYPES: */ |
| #if defined(CL_NO_EXTENSION_PROTOTYPES) && ${"\\"} |
| !defined(CL_NO_ICD_DISPATCH_EXTENSION_PROTOTYPES) |
| #define CL_NO_ICD_DISPATCH_EXTENSION_PROTOTYPES |
| #endif |
| #if defined(CL_NO_EXTENSION_PROTOTYPES) && ${"\\"} |
| !defined(CL_NO_NON_ICD_DISPATCH_EXTENSION_PROTOTYPES) |
| #define CL_NO_NON_ICD_DISPATCH_EXTENSION_PROTOTYPES |
| #endif |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| %for extension in sorted(spec.findall('extensions/extension'), key=getExtensionSortKey): |
| % if shouldGenerate(extension.get('name')): |
| <% |
| name = extension.get('name') |
| %>/*************************************************************** |
| * ${name} |
| ***************************************************************/ |
| %if extension.get('condition'): |
| #if ${extension.get('condition')} |
| |
| %endif |
| #define ${name} 1 |
| #define ${name.upper()}_EXTENSION_NAME ${"\\"} |
| "${name}" |
| |
| %for block in extension.findall('require'): |
| % if shouldEmit(block): |
| % if block.get('condition'): |
| #if ${block.get('condition')} |
| % endif |
| % if block.get('comment'): |
| /* ${block.get('comment')} */ |
| % endif |
| % for type in block.findall('type'): |
| % if isDuplicateName(type.get('name')): |
| /* type ${type.get('name')} */ |
| % else: |
| % if type.get('name') in typedefs: |
| ${typedefs[type.get('name')].Typedef.ljust(27)} ${type.get('name')}; |
| % elif type.get('name') in macros: |
| #define ${type.get('name')}${macros[type.get('name')].Macro} |
| % elif type.get('name') in structs: |
| <% |
| struct = structs[type.get('name')] |
| %>typedef struct _${struct.Name} { |
| % for i, member in enumerate(struct.Members): |
| ${member.Type} ${member.Name}${member.TypeEnd}; |
| % endfor |
| } ${struct.Name}; |
| % else: |
| // type ${type.get('name')} not found! |
| % endif |
| % endif |
| % endfor |
| % for enum in sorted(block.findall('enum'), key=getEnumSortKey): |
| % if isDuplicateName(enum.get('name')): |
| /* enum ${enum.get('name')} */ |
| % else: |
| % if enum.get('name') in enums: |
| % if enums[enum.get('name')].Value: |
| #define ${enum.get('name').ljust(51)} ${enums[enum.get('name')].Value} |
| % elif enums[enum.get('name')].Bitpos: |
| #define ${enum.get('name').ljust(51)} ${getBitPosString(enums[enum.get('name')].Bitpos)} |
| % else: |
| // enum ${enum.get('name')} is unassigned! |
| % endif |
| % else: |
| // enum ${enum.get('name')} not found! |
| % endif |
| % endif |
| % endfor |
| % if block.findall('command'): |
| % for func in block.findall('command'): |
| <% |
| api = apisigs[func.get('name')] |
| %> |
| typedef ${api.RetType} CL_API_CALL |
| ${api.Name}_t( |
| % for i, paramStr in enumerate(getCParameterStrings(api.Params)): |
| % if i < len(api.Params)-1: |
| ${paramStr}, |
| % else: |
| ${paramStr}); |
| % endif |
| % endfor |
| |
| typedef ${api.Name}_t * |
| ${api.Name}_fn ${api.Suffix}; |
| % endfor |
| % if generate_pfn_typedefs: |
| |
| /* |
| ** The function pointer typedefs prefixed with "pfn_" are provided for |
| ** compatibility with earlier versions of the headers. New code is |
| ** encouraged to use the function pointer typedefs that are suffixed with |
| ** "_fn" instead, for consistency. |
| */ |
| % for func in block.findall('command'): |
| <% |
| api = apisigs[func.get('name')] |
| %> |
| typedef ${api.Name}_t * |
| pfn_${api.Name} ${api.Suffix}; |
| % endfor |
| % endif |
| |
| #if ${getPrototypeIfGuard(name)} |
| % for func in block.findall('command'): |
| <% |
| api = apisigs[func.get('name')] |
| %> |
| extern CL_API_ENTRY ${api.RetType} CL_API_CALL |
| ${api.Name}( |
| % for i, paramStr in enumerate(getCParameterStrings(api.Params)): |
| % if i < len(api.Params)-1: |
| ${paramStr}, |
| % else: |
| ${paramStr}) ${api.Suffix}; |
| % endif |
| % endfor |
| % endfor |
| |
| #endif /* ${getPrototypeIfGuard(name)} */ |
| % endif |
| % if block.get('condition'): |
| |
| #endif /* ${block.get('condition')} */ |
| % endif |
| |
| % endif |
| %endfor |
| %if extension.get('condition'): |
| #endif /* ${extension.get('condition')} */ |
| |
| %endif |
| % endif |
| %endfor |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* ${guard} */ |