Name ANGLE_metal_shared_event_sync Name Strings EGL_ANGLE_metal_shared_event_sync Contributors Dan Glastonbury, Apple Contacts Dan Glastonbury, Apple (djg 'at' apple.com) Status Draft Version Version 2, 2022-09-08 Number EGL Extensions XXX Extension Type EGL display extension Dependencies This extension is written against the wording of the EGL 1.5 Specification. Overview This extension enables the creation of EGL fence sync objects that are associated with a native Metal event object. The EGL fence sync objects have nearly identical semantics to those sync objects defined by the EGL 1.5 Specification, except that they have an additional attribute storing the id referring to the metal event object and the integer value to signal the event with. New Types None. New Procedures and Functions void* eglCopyMetalSharedEventANGLE( EGLDisplay dpy, EGLSync sync); New Tokens Accepted by the parameter of eglCreateSync, and returned in when eglGetSyncAttrib is called with EGL_SYNC_TYPE: EGL_SYNC_METAL_SHARED_EVENT_ANGLE 0x34D8 Accepted by the parameter of eglCreateSync: EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE 0x34D9 EGL_SYNC_METAL_SHARED_EVENT_SIGNAL_VALUE_LO_ANGLE 0x34DA EGL_SYNC_METAL_SHARED_EVENT_SIGNAL_VALUE_HI_ANGLE 0x34DB EGL_SYNC_METAL_SHARED_EVENT_SIGNALED_ANGLE 0x34DC Additions to the EGL Specification Add the following after the first paragraph of Section 3.8.1.1 (Creating Fence Sync Objects), "If is EGL_SYNC_METAL_SHARED_EVENT_ANGLE, an EGL metal event sync object is created. In this case the EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE, EGL_SYNC_METAL_SHARED_EVENT_SIGNAL_VALUE_LO_ANGLE, EGL_SYNC_METAL_SHARED_EVENT_SIGNAL_VALUE_HI_ANGLE, and EGL_SYNC_CONDITION may be specified. If EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE attribute is specified, it must be set to a pointer to a valid id, or to a NULL pointer. If EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE is not specified, or is a NULL pointer, the EGL implementation will create a Metal event object. Additionally, the EGL implementation assumes ownership of the Metal event object and will follow Objective-C behavior and increase the Metal event object's retain count. EGL_SYNC_METAL_SHARED_EVENT_SIGNAL_VALUE_LO_ANGLE and EGL_SYNC_METAL_SHARED_EVENT_HI_ANGLE are optional attributes specifying the low and high 32-bit parts of an unsigned 64-bit value to be set when the event is signaled. If these attributes are unspecified, the event is signaled with one more than the event's signaledValue property at the time of EGLSync creation. The signal value will wrap to 0 if the initial signaledValue is the maximum value for uint64_t. If EGL_SYNC_CONDITION attribute is specified, it must be either EGL_SYNC_PRIOR_COMMANDS_COMPLETE or EGL_SYNC_METAL_SHARED_EVENT_SIGNALED_ANGLE. The EGL_SYNC_METAL_SHARED_EVENT_SIGNALED_ANGLE condition is satisfied by the signaling of the MTLSharedEvent referred to by the EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE attribute. When this happens any eglClientWaitSync commands blocking on unblock. The default values for the EGL metal event sync object attributes are as follows: Attribute Name Initial Attribute Value(s) -------------- -------------------------- EGL_SYNC_TYPE EGL_SYNC_METAL_SHARED_EVENT_ANGLE EGL_SYNC_STATUS EGL_UNSIGNALED EGL_SYNC_CONDITION EGL_SYNC_PRIOR_COMMANDS_COMPLETE Modify the list of eglCreateSync errors in Section 3.8.1.2 (Creating OpenCL Event Sync Objects) "Errors ------ ..." Modify the second paragraph of Section 3.8.1.1 (Creating Fence Sync Objects), When a fence sync object is created or when an EGL metal shared event sync object is created with the EGL_SYNC_CONDITION attribute set to EGL_SYNC_PRIOR_COMMANDS_COMPLETE, eglCreateSync also inserts a fence command into the command stream of the bound client API’s current context (i.e., the context returned by eglGetCurrentContext), and associates it with the newly created sync object. Add the following after the last paragraph of Section 3.8.1 (Sync Objects): "The command void* eglCopyMetalSharedEventANGLE( EGLDisplay dpy, EGLSync sync); increases the retain count of the id stored in the EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE attribute of an EGL metal shared event sync object and returns a pointer to the event as a void* pointer. If this returns a non-null value, the caller is responsible for releasing the MTLSharedEvent once after calling this function." Issues 1. What should the name be? METAL_EVENT_ANGLE? MTL or METAL? Revision History Version 1, 2022-05-17 - Initial draft Version 2, 2022-09-08 - Add eglCopyMetalSharedEventANGLE function Version 3, 2023-03-06 - Add EGL_SYNC_METAL_SHARED_EVENT_SIGNALED_ANGLE