Branch
Hash :
774bca93
Author :
Date :
2025-10-08T18:41:13
[metal] Add commands scheduled sync object We need a thread-safe way to wait for ANGLE Metal command buffers to be scheduled for IOSurface synchronization with DrDC + Graphite on Mac. The existing eglWaitUntilWorkScheduledANGLE API isn't thread-safe as it reaches into ContextMtl innards to flush the command buffer. This CL adds the EGL_ANGLE_metal_commands_scheduled_sync extension which introduces a EGL_SYNC_METAL_COMMANDS_SCHEDULED_ANGLE sync object type. This sync object is signaled when pending Metal commands are scheduled to run on the GPU (MTLCommandBufferStatusScheduled). These sync objects are thread-safe - eglClientWaitSync() can be called on any thread even without a current context which is needed for DrDC + Graphite on Mac. Bug: chromium:444702048 Change-Id: Ia13b352385a6fefaa026526ef74f6e596a6a6964 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/7027996 Auto-Submit: Sunny Sachanandani <sunnyps@chromium.org> Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Sunny Sachanandani <sunnyps@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
Name
ANGLE_metal_commands_scheduled_sync
Name Strings
EGL_ANGLE_metal_commands_scheduled_sync
Contributors
Sunny Sachanandani, Google
Contacts
Sunny Sachanandani, Google (sunnyps `at` google.com)
Status
Draft
Version
Version 1, 2025-10-09
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
signaled when any pending Metal commands are scheduled on the GPU. The EGL
fence sync objects have nearly identical semantics to those sync objects
defined by the EGL 1.5 Specification, except where noted.
Creating the sync object flushes any pending work. These sync objects are
thread-safe and can be waited on from any thread with eglClientWaitSync
without a current context. Note that eglWaitSync is a no-op for these
sync objects since they only track CPU side scheduling of GPU commands. In
particular, specifying EGL_SYNC_FLUSH_COMMANDS_BIT has no effect either
since pending work is always flushed on creation of the sync object.
New Types
None.
New Procedures and Functions
None.
New Tokens
Accepted by the <type> parameter of eglCreateSync, and returned
in <value> when eglGetSyncAttrib is called with <attribute>
EGL_SYNC_TYPE:
EGL_SYNC_METAL_COMMANDS_SCHEDULED_ANGLE 0x34E0
Additions to the EGL Specification
Add the following after the first paragraph of Section 3.8.1.1 (Creating
Fence Sync Objects),
"If <type> is EGL_SYNC_METAL_COMMANDS_SCHEDULED_ANGLE, an EGL commands
scheduled sync object is created. No attributes may be specified in this
case.
The default values for the EGL commands scheduled sync object attributes
are as follows:
Attribute Name Initial Attribute Value(s)
-------------- --------------------------
EGL_SYNC_TYPE EGL_SYNC_METAL_COMMANDS_SCHEDULED_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 commands scheduled sync
object is created, 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."
Issues
None.
Revision History
Version 1, 2025-10-09
- Initial draft