Add the EGL_ANDROID_fence_sync spec.
Change-Id: I8c26e5caaf8d89a60a09a5308d55e336537b916e
This commit is contained in:
parent
24adb709b7
commit
1401ad526c
213
opengl/specs/EGL_ANDROID_fence_sync.txt
Normal file
213
opengl/specs/EGL_ANDROID_fence_sync.txt
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
Name
|
||||||
|
|
||||||
|
ANDROID_fence_sync
|
||||||
|
|
||||||
|
Name Strings
|
||||||
|
|
||||||
|
EGL_ANDROID_fence_sync
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
|
||||||
|
Jamie Gennis
|
||||||
|
|
||||||
|
Contact
|
||||||
|
|
||||||
|
Jamie Gennis, Google Inc. (jgennis 'at' google.com)
|
||||||
|
|
||||||
|
Status
|
||||||
|
|
||||||
|
Draft.
|
||||||
|
|
||||||
|
Version
|
||||||
|
|
||||||
|
Version 1, May 29, 2012
|
||||||
|
|
||||||
|
Number
|
||||||
|
|
||||||
|
EGL Extension #XXX
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
|
||||||
|
Requires EGL 1.1
|
||||||
|
|
||||||
|
This extension is written against the wording of the EGL 1.2 Specification
|
||||||
|
|
||||||
|
EGL_KHR_fence_sync is required.
|
||||||
|
|
||||||
|
Overview
|
||||||
|
|
||||||
|
This extension enables the creation of EGL fence sync objects that are
|
||||||
|
associated with an Android Sync HAL fence object. These EGL fence sync
|
||||||
|
objects have nearly identical semantics to those defined by the
|
||||||
|
KHR_fence_sync extension, except that they have an additional attribute
|
||||||
|
storing the file descriptor referring to the native Android fence object.
|
||||||
|
|
||||||
|
New Types
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
New Procedures and Functions
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
New Tokens
|
||||||
|
|
||||||
|
Accepted by the <type> parameter of eglCreateSyncKHR, and returned
|
||||||
|
in <value> when eglGetSyncAttribKHR is called with <attribute>
|
||||||
|
EGL_SYNC_TYPE_KHR:
|
||||||
|
|
||||||
|
EGL_SYNC_ANDROID_FENCE_ANDROID 0x3144
|
||||||
|
|
||||||
|
Accepted by the <attribute> parameter of eglGetSyncAttribKHR:
|
||||||
|
|
||||||
|
EGL_SYNC_FENCE_FD_ANDROID 0x3145
|
||||||
|
|
||||||
|
Returned in <value> when eglGetSyncAttribKHR is called with <attribute>
|
||||||
|
EGL_SYNC_CONDITION_KHR:
|
||||||
|
|
||||||
|
EGL_SYNC_ANDROID_FENCE_SIGNALED_ANDROID 0x3146
|
||||||
|
|
||||||
|
Changes to Chapter 3 of the EGL 1.2 Specification (EGL Functions and Errors)
|
||||||
|
|
||||||
|
Add the following after the sixth paragraph of Section 3.8.1 (Sync
|
||||||
|
Objects), added by KHR_fence_sync
|
||||||
|
|
||||||
|
"If <type> is EGL_SYNC_ANDROID_FENCE_ANDROID, an EGL Android fence sync
|
||||||
|
object is created. In this case the EGL_SYNC_FENCE_FD_ANDROID attribute may
|
||||||
|
optionally be specified. If this attribute is specified, it must be set to
|
||||||
|
a file descriptor that refers to a native Android fence object.
|
||||||
|
|
||||||
|
The default values for the EGL Android fence sync object attributes are as
|
||||||
|
follows:
|
||||||
|
|
||||||
|
Attribute Name Initial Attribute Value(s)
|
||||||
|
--------------- --------------------------
|
||||||
|
EGL_SYNC_TYPE_KHR EGL_SYNC_ANDROID_FENCE_ANDROID
|
||||||
|
EGL_SYNC_STATUS_KHR EGL_UNSIGNALED_KHR
|
||||||
|
EGL_SYNC_CONDITION_KHR EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR
|
||||||
|
|
||||||
|
Upon creation of an EGL Android fence sync object, the
|
||||||
|
EGL_SYNC_FENCE_FD_ANDROID attribute is set to a newly generated file
|
||||||
|
descriptor that refers to a native Android fence object. If the
|
||||||
|
EGL_SYNC_FENCE_FD_ANDROID attribute is specified in the eglCreateSyncKHR
|
||||||
|
call then the generated file descriptor refers to the same native Android
|
||||||
|
fence object as the file descriptor passed to eglCreateSyncKHR. Note,
|
||||||
|
however, that the value of the sync object attribute is *not* the same file
|
||||||
|
descriptor as the one passed to eglCreateSyncKHR - it simply refers to the
|
||||||
|
same underlying native Android fence object. Additionally, if the
|
||||||
|
EGL_SYNC_FENCE_FD_ANDROID attribute is specified then the
|
||||||
|
EGL_SYNC_CONDITION_KHR attribute is set to
|
||||||
|
EGL_SYNC_ANDROID_FENCE_SIGNALED_ANDROID and the EGL_SYNC_STATUS_KHR
|
||||||
|
attribute is set to reflect the signal status of the native Android fence
|
||||||
|
object."
|
||||||
|
|
||||||
|
Modify Section 3.8.1 (Sync Objects), added by KHR_fence_sync, starting at
|
||||||
|
the seventh paragraph
|
||||||
|
|
||||||
|
"When a fence sync object is created or when an EGL Android fence sync
|
||||||
|
object is created without specifying the EGL_SYNC_FENCE_FD_ANDROID
|
||||||
|
attribute, eglCreateSyncKHR 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.
|
||||||
|
|
||||||
|
When the condition of the sync object is satisfied by the fence command,
|
||||||
|
the sync is signaled by the associated client API context, causing any
|
||||||
|
eglClientWaitSyncKHR commands (see below) blocking on <sync> to unblock. If
|
||||||
|
the sync object is an EGL Android fence sync object then the native Android
|
||||||
|
fence object is also signaled when the condition is satisfied. The
|
||||||
|
EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR condition is satisfied by completion
|
||||||
|
of the fence command corresponding to the sync object and all preceding
|
||||||
|
commands in the associated client API context's command stream. The sync
|
||||||
|
object will not be signaled until all effects from these commands on the
|
||||||
|
client API's internal and framebuffer state are fully realized. No other
|
||||||
|
state is affected by execution of the fence command.
|
||||||
|
|
||||||
|
The EGL_SYNC_ANDROID_FENCE_SIGNALED_ANDROID condition is satisfied by the
|
||||||
|
signaling of the native Android fence object. When this happens any
|
||||||
|
eglClientWaitSyncKHR commands blocking on <sync> unblock."
|
||||||
|
|
||||||
|
Modify the list of eglCreateSyncKHR errors in Section 3.8.1 (Sync Objects),
|
||||||
|
added by KHR_fence_sync
|
||||||
|
|
||||||
|
"Errors
|
||||||
|
------
|
||||||
|
|
||||||
|
* If <dpy> is not the name of a valid, initialized EGLDisplay,
|
||||||
|
EGL_NO_SYNC_KHR is returned and an EGL_BAD_DISPLAY error is
|
||||||
|
generated.
|
||||||
|
* If <type> is EGL_SYNC_FENCE_KHR and <attrib_list> is neither NULL nor
|
||||||
|
empty (containing only EGL_NONE), EGL_NO_SYNC_KHR is returned and an
|
||||||
|
EGL_BAD_ATTRIBUTE error is generated.
|
||||||
|
* If <type> is EGL_SYNC_ANDROID_FENCE_ANDROID and <attrib_list> contains
|
||||||
|
an attribute other than EGL_SYNC_FENCE_FD_ANDROID, EGL_NO_SYNC_KHR is
|
||||||
|
returned and an EGL_BAD_ATTRIBUTE error is generated.
|
||||||
|
* If <type> is not a supported type of sync object,
|
||||||
|
EGL_NO_SYNC_KHR is returned and an EGL_BAD_ATTRIBUTE error is
|
||||||
|
generated.
|
||||||
|
* If <type> is EGL_SYNC_FENCE_KHR or EGL_SYNC_ANDROID_FENCE_ANDROID and
|
||||||
|
no context is current for the bound API (i.e., eglGetCurrentContext
|
||||||
|
returns EGL_NO_CONTEXT), EGL_NO_SYNC_KHR is returned and an
|
||||||
|
EGL_BAD_MATCH error is generated.
|
||||||
|
* If <type> is EGL_SYNC_FENCE_KHR or EGL_SYNC_ANDROID_FENCE_ANDROID and
|
||||||
|
<dpy> does not match the EGLDisplay of the currently bound context for
|
||||||
|
the currently bound client API (the EGLDisplay returned by
|
||||||
|
eglGetCurrentDisplay()) then EGL_NO_SYNC_KHR is returned and an
|
||||||
|
EGL_BAD_MATCH error is generated.
|
||||||
|
* If <type> is EGL_SYNC_FENCE_KHR or EGL_SYNC_ANDROID_FENCE_ANDROID and
|
||||||
|
the currently bound client API does not support the client API
|
||||||
|
extension indicating it can place fence commands, then EGL_NO_SYNC_KHR
|
||||||
|
is returned and an EGL_BAD_MATCH error is generated."
|
||||||
|
|
||||||
|
Modify table 3.cc in Section 3.8.1 (Sync Objects), added by KHR_fence_sync
|
||||||
|
|
||||||
|
"
|
||||||
|
Attribute Description Supported Sync Objects
|
||||||
|
----------------- ----------------------- ----------------------
|
||||||
|
EGL_SYNC_TYPE_KHR Type of the sync object All
|
||||||
|
EGL_SYNC_STATUS_KHR Status of the sync object All
|
||||||
|
EGL_SYNC_CONDITION_KHR Signaling condition EGL_SYNC_FENCE_KHR and
|
||||||
|
EGL_SYNC_ANDROID_FENCE_ANDROID only
|
||||||
|
EGL_SYNC_FENCE_FD_ANDROID Native Android fence EGL_SYNC_ANDROID_FENCE_ANDROID only
|
||||||
|
object file descriptor
|
||||||
|
"
|
||||||
|
|
||||||
|
Modify the second paragraph description of eglDestroySyncKHR in Section
|
||||||
|
3.8.1 (Sync Objects), added by KHR_fence_sync
|
||||||
|
|
||||||
|
"If no errors are generated, EGL_TRUE is returned, and <sync> will no
|
||||||
|
longer be the handle of a valid sync object. Additionally, if <sync> is an
|
||||||
|
EGL Android fence sync object then the file descriptor stored in the
|
||||||
|
EGL_SYNC_FENCE_FD_ANDROID attribute is closed and is no longer a valid file
|
||||||
|
descriptor."
|
||||||
|
|
||||||
|
Issues
|
||||||
|
|
||||||
|
1. Should EGLSyncKHR objects that wrap Android fence objects use the
|
||||||
|
EGL_SYNC_FENCE_KHR type?
|
||||||
|
|
||||||
|
RESOLVED: A new sync object type will be added.
|
||||||
|
|
||||||
|
We don't want to require all EGL fence sync objects to wrap Android fence
|
||||||
|
objects, so we need some way to tell the EGL implementation at sync object
|
||||||
|
creation whether the sync object should support querying the Android fence
|
||||||
|
FD attribute. We could do this with either a new sync object type or with a
|
||||||
|
boolean attribute. It might be nice to pick up future signaling conditions
|
||||||
|
that might be added for fence sync objects, but there may be things that
|
||||||
|
get added that don't make sense in the context of Android fence objects.
|
||||||
|
|
||||||
|
2. Who is responsible for dup'ing the Android fence file descriptors?
|
||||||
|
|
||||||
|
RESOLVED: The recipient of a file descriptor is responsible for dup'ing it
|
||||||
|
if it wishes to maintain a reference to the Android fence object.
|
||||||
|
|
||||||
|
This means that when eglCreateSyncKHR is called with an existing file
|
||||||
|
descriptor, the EGL implementation must dup it. On the other hand, when
|
||||||
|
eglGetSyncAttribKHR is called to query the file descriptor, it is the
|
||||||
|
responsibility of the caller to dup the file descriptor if it wishes to
|
||||||
|
maintain a reference that will outlast the EGLSyncKHR object.
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
#1 (Jamie Gennis, May 29, 2012)
|
||||||
|
- Initial draft.
|
@ -10,4 +10,7 @@ for use by Android extensions.
|
|||||||
0x3141 (unused)
|
0x3141 (unused)
|
||||||
0x3142 EGL_ANDROID_recordable
|
0x3142 EGL_ANDROID_recordable
|
||||||
0x3143 EGL_VERSION_HW_ANDROID (internal use)
|
0x3143 EGL_VERSION_HW_ANDROID (internal use)
|
||||||
0x3144 - 0x314F (unused)
|
0x3144 EGL_SYNC_ANDROID_FENCE_ANDROID
|
||||||
|
0x3145 EGL_SYNC_FENCE_FD_ANDROID
|
||||||
|
0x3146 EGL_SYNC_ANDROID_FENCE_SIGNALED_ANDROID
|
||||||
|
0x3147 - 0x314F (unused)
|
||||||
|
Loading…
Reference in New Issue
Block a user