EGL_ANDROID_fence_sync: make it more generic
This change updates the extension spec to refer to generic "native fence sync objects" rather than "Android fence sync objects." Change-Id: I15a79f08571586431845b54c58c8420b652f40ef
This commit is contained in:
parent
da8d0a5c0c
commit
a1d49ce1f1
@ -1,10 +1,10 @@
|
||||
Name
|
||||
|
||||
ANDROID_fence_sync
|
||||
ANDROID_native_fence_sync
|
||||
|
||||
Name Strings
|
||||
|
||||
EGL_ANDROID_fence_sync
|
||||
EGL_ANDROID_native_fence_sync
|
||||
|
||||
Contributors
|
||||
|
||||
@ -37,10 +37,17 @@ Dependencies
|
||||
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.
|
||||
associated with a native synchronization fence object that is referenced
|
||||
using a file descriptor. 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 fence object.
|
||||
|
||||
This extension assumes the existence of a native fence synchronization
|
||||
object that behaves similarly to an EGL fence sync object. These native
|
||||
objects must have a signal status like that of an EGLSyncKHR object that
|
||||
indicates whether the fence has ever been signaled. Once signaled the
|
||||
native object's signal status may not change again.
|
||||
|
||||
New Types
|
||||
|
||||
@ -48,7 +55,7 @@ New Types
|
||||
|
||||
New Procedures and Functions
|
||||
|
||||
EGLint eglDupAndroidFenceFDANDROID(
|
||||
EGLint eglDupNativeFenceFDANDROID(
|
||||
EGLDisplay dpy,
|
||||
EGLSyncKHR);
|
||||
|
||||
@ -58,72 +65,72 @@ New Tokens
|
||||
in <value> when eglGetSyncAttribKHR is called with <attribute>
|
||||
EGL_SYNC_TYPE_KHR:
|
||||
|
||||
EGL_SYNC_ANDROID_FENCE_ANDROID 0x3144
|
||||
EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144
|
||||
|
||||
Accepted by the <attrib_list> parameter of eglCreateSyncKHR:
|
||||
|
||||
EGL_SYNC_ANDROID_FENCE_FD_ANDROID 0x3145
|
||||
EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145
|
||||
|
||||
Accepted by the <attrib_list> parameter of eglCreateSyncKHR, and returned
|
||||
by eglDupAndroidFenceFDANDROID in the event of an error:
|
||||
by eglDupNativeFenceFDANDROID in the event of an error:
|
||||
|
||||
EGL_NO_ANDROID_FENCE_ANDROID -1
|
||||
EGL_NO_NATIVE_FENCE_ANDROID -1
|
||||
|
||||
Returned in <value> when eglGetSyncAttribKHR is called with <attribute>
|
||||
EGL_SYNC_CONDITION_KHR:
|
||||
|
||||
EGL_SYNC_ANDROID_FENCE_SIGNALED_ANDROID 0x3146
|
||||
EGL_SYNC_NATIVE_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_ANDROID_FENCE_FD_ANDROID
|
||||
"If <type> is EGL_SYNC_NATIVE_FENCE_ANDROID, an EGL native fence sync
|
||||
object is created. In this case the EGL_SYNC_NATIVE_FENCE_FD_ANDROID
|
||||
attribute may optionally be specified. If this attribute is specified, it
|
||||
must be set to either a file descriptor that refers to a native Android
|
||||
fence object or to the value EGL_NO_ANDROID_FENCE_ANDROID.
|
||||
must be set to either a file descriptor that refers to a native fence
|
||||
object or to the value EGL_NO_NATIVE_FENCE_ANDROID.
|
||||
|
||||
The default values for the EGL Android fence sync object attributes are as
|
||||
The default values for the EGL native fence sync object attributes are as
|
||||
follows:
|
||||
|
||||
Attribute Name Initial Attribute Value(s)
|
||||
--------------- --------------------------
|
||||
EGL_SYNC_TYPE_KHR EGL_SYNC_ANDROID_FENCE_ANDROID
|
||||
EGL_SYNC_TYPE_KHR EGL_SYNC_NATIVE_FENCE_ANDROID
|
||||
EGL_SYNC_STATUS_KHR EGL_UNSIGNALED_KHR
|
||||
EGL_SYNC_CONDITION_KHR EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR
|
||||
EGL_SYNC_ANDROID_FENCE_FD_ANDROID EGL_NO_ANDROID_FENCE_ANDROID
|
||||
EGL_SYNC_NATIVE_FENCE_FD_ANDROID EGL_NO_NATIVE_FENCE_ANDROID
|
||||
|
||||
If the EGL_SYNC_ANDROID_FENCE_FD_ANDROID attribute is not
|
||||
EGL_NO_ANDROID_FENCE_ANDROID 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. Additionally, the EGL implementation assumes ownership of the file
|
||||
If the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute is not
|
||||
EGL_NO_NATIVE_FENCE_ANDROID then the EGL_SYNC_CONDITION_KHR attribute is
|
||||
set to EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID and the EGL_SYNC_STATUS_KHR
|
||||
attribute is set to reflect the signal status of the native fence object.
|
||||
Additionally, the EGL implementation assumes ownership of the file
|
||||
descriptor, so the caller must not use it after calling eglCreateSyncKHR."
|
||||
|
||||
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 with the EGL_SYNC_ANDROID_FENCE_FD_ANDROID attribute set
|
||||
to EGL_NO_ANDROID_FENCE_ANDROID, eglCreateSyncKHR also inserts a fence
|
||||
"When a fence sync object is created or when an EGL native fence sync
|
||||
object is created with the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute set
|
||||
to EGL_NO_NATIVE_FENCE_ANDROID, 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.
|
||||
|
||||
After associating the fence command with an EGL Android fence sync object,
|
||||
After associating the fence command with an EGL native fence sync object,
|
||||
the next Flush() operation performed by the current client API causes a
|
||||
new native Android fence object to be created, and the
|
||||
EGL_SYNC_ANDROID_FENCE_ANDROID attribute of the EGL Android fence object
|
||||
is set to a file descriptor that refers to the new native Android fence
|
||||
object. This new native Android fence object is signaled when the EGL
|
||||
Android fence sync object is signaled.
|
||||
new native fence object to be created, and the
|
||||
EGL_SYNC_NATIVE_FENCE_ANDROID attribute of the EGL native fence object is
|
||||
set to a file descriptor that refers to the new native fence object. This
|
||||
new native fence object is signaled when the EGL native fence sync object
|
||||
is signaled.
|
||||
|
||||
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
|
||||
eglClientWaitSyncKHR commands (see below) blocking on <sync> to unblock.
|
||||
If the sync object is an EGL native fence sync object then the native
|
||||
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
|
||||
@ -132,9 +139,9 @@ Changes to Chapter 3 of the EGL 1.2 Specification (EGL Functions and Errors)
|
||||
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 referred to by the
|
||||
EGL_SYNC_ANDROID_FENCE_FD_ANDROID attribute. When this happens any
|
||||
The EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID condition is satisfied by the
|
||||
signaling of the native fence object referred to by the
|
||||
EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute. When this happens any
|
||||
eglClientWaitSyncKHR commands blocking on <sync> unblock."
|
||||
|
||||
Modify the list of eglCreateSyncKHR errors in Section 3.8.1 (Sync Objects),
|
||||
@ -149,22 +156,22 @@ Changes to Chapter 3 of the EGL 1.2 Specification (EGL Functions and Errors)
|
||||
* 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_ANDROID_FENCE_FD_ANDROID, EGL_NO_SYNC_KHR is
|
||||
* If <type> is EGL_SYNC_NATIVE_FENCE_ANDROID and <attrib_list> contains
|
||||
an attribute other than EGL_SYNC_NATIVE_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
|
||||
* If <type> is EGL_SYNC_FENCE_KHR or EGL_SYNC_NATIVE_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
|
||||
* If <type> is EGL_SYNC_FENCE_KHR or EGL_SYNC_NATIVE_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
|
||||
* If <type> is EGL_SYNC_FENCE_KHR or EGL_SYNC_NATIVE_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."
|
||||
@ -177,7 +184,7 @@ Changes to Chapter 3 of the EGL 1.2 Specification (EGL Functions and Errors)
|
||||
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_NATIVE_FENCE_ANDROID only
|
||||
"
|
||||
|
||||
Modify the second paragraph description of eglDestroySyncKHR in Section
|
||||
@ -185,8 +192,8 @@ Changes to Chapter 3 of the EGL 1.2 Specification (EGL Functions and Errors)
|
||||
|
||||
"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 and the EGL_SYNC_ANDROID_FENCE_FD_ANDROID
|
||||
attribute is not EGL_NO_ANDROID_FENCE_ANDROID then that file descriptor is
|
||||
EGL native fence sync object and the EGL_SYNC_NATIVE_FENCE_FD_ANDROID
|
||||
attribute is not EGL_NO_NATIVE_FENCE_ANDROID then that file descriptor is
|
||||
closed."
|
||||
|
||||
Add the following after the last paragraph of Section 3.8.1 (Sync
|
||||
@ -194,51 +201,50 @@ Changes to Chapter 3 of the EGL 1.2 Specification (EGL Functions and Errors)
|
||||
|
||||
The command
|
||||
|
||||
EGLint eglDupAndroidFenceFDANDROID(
|
||||
EGLint eglDupNativeFenceFDANDROID(
|
||||
EGLdisplay dpy,
|
||||
EGLSyncKHR sync);
|
||||
|
||||
duplicates the file descriptor stored in the
|
||||
EGL_SYNC_ANDROID_FENCE_FD_ANDROID attribute of an EGL Android fence sync
|
||||
EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute of an EGL native fence sync
|
||||
object and returns the new file descriptor.
|
||||
|
||||
Errors
|
||||
------
|
||||
|
||||
* If <sync> is not a valid sync object for <dpy>,
|
||||
EGL_NO_ANDROID_FENCE_ANDROID is returned and an EGL_BAD_PARAMETER
|
||||
EGL_NO_NATIVE_FENCE_ANDROID is returned and an EGL_BAD_PARAMETER
|
||||
error is generated.
|
||||
* If the EGL_SYNC_ANDROID_FENCE_FD_ANDROID attribute of <sync> is
|
||||
EGL_NO_ANDROID_FENCE_ANDROID, EGL_NO_ANDROID_FENCE_ANDROID is returned
|
||||
* If the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute of <sync> is
|
||||
EGL_NO_NATIVE_FENCE_ANDROID, EGL_NO_NATIVE_FENCE_ANDROID is returned
|
||||
and an EGL_BAD_PARAMETER error is generated.
|
||||
* If <dpy> does not match the display passed to eglCreateSyncKHR
|
||||
when <sync> was created, the behaviour is undefined."
|
||||
|
||||
Issues
|
||||
|
||||
1. Should EGLSyncKHR objects that wrap Android fence objects use the
|
||||
1. Should EGLSyncKHR objects that wrap native 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
|
||||
We don't want to require all EGL fence sync objects to wrap native 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
|
||||
creation whether the sync object should support querying the native 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.
|
||||
get added that don't make sense in the context of native fence objects.
|
||||
|
||||
2. Who is responsible for dup'ing the Android fence file descriptors?
|
||||
2. Who is responsible for dup'ing the native fence file descriptors?
|
||||
|
||||
RESOLVED: Whenever a file descriptor is passed into or returned from an
|
||||
EGL call in this extension, ownership of that file descriptor is
|
||||
transfered. The recipient of the file descriptor must close it when it is
|
||||
no longer needed, and the provider of the file descriptor must dup it
|
||||
before providing it if they require continued use of the native Android
|
||||
fence.
|
||||
before providing it if they require continued use of the native fence.
|
||||
|
||||
3. Can the EGL_SYNC_ANDROID_FENCE_FD_ANDROID attribute be queried?
|
||||
3. Can the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute be queried?
|
||||
|
||||
RESOLVED: No.
|
||||
|
||||
@ -250,15 +256,21 @@ Issues
|
||||
|
||||
That said, the attribute is useful both as a way to pass an existing file
|
||||
descriptor to eglCreateSyncKHR and as a way to describe the subsequent
|
||||
behavior of EGL Android fence sync objects, so it is left as an attribute
|
||||
behavior of EGL native fence sync objects, so it is left as an attribute
|
||||
for which the value cannot be queried.
|
||||
|
||||
Revision History
|
||||
|
||||
#3 (Jamie Gennis, September 4, 2012)
|
||||
- Reworded the extension to refer to "native fence" objects rather than
|
||||
"Android fence" objects.
|
||||
- Added a paragraph to the overview that describes assumptions about the
|
||||
native fence sync objects.
|
||||
|
||||
#2 (Jamie Gennis, July 23, 2012)
|
||||
- Changed the file descriptor ownership transferring behavior.
|
||||
- Added the eglDupAndroidFenceFDANDROID function.
|
||||
- Removed EGL_SYNC_ANDROID_FENCE_FD_ANDROID from the table of gettable
|
||||
- Removed EGL_SYNC_NATIVE_FENCE_FD_ANDROID from the table of gettable
|
||||
attributes.
|
||||
- Added language specifying that a native Android fence is created at the
|
||||
flush following the creation of an EGL Android fence sync object that is
|
Loading…
Reference in New Issue
Block a user