From a1d49ce1f11d18f0e1592c9567e911e1728fc4a4 Mon Sep 17 00:00:00 2001 From: Jamie Gennis Date: Tue, 4 Sep 2012 19:49:51 -0700 Subject: [PATCH] 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 --- ....txt => EGL_ANDROID_native_fence_sync.txt} | 134 ++++++++++-------- 1 file changed, 73 insertions(+), 61 deletions(-) rename opengl/specs/{EGL_ANDROID_fence_sync.txt => EGL_ANDROID_native_fence_sync.txt} (64%) diff --git a/opengl/specs/EGL_ANDROID_fence_sync.txt b/opengl/specs/EGL_ANDROID_native_fence_sync.txt similarity index 64% rename from opengl/specs/EGL_ANDROID_fence_sync.txt rename to opengl/specs/EGL_ANDROID_native_fence_sync.txt index 316ee1cc8..bd1cddaa7 100644 --- a/opengl/specs/EGL_ANDROID_fence_sync.txt +++ b/opengl/specs/EGL_ANDROID_native_fence_sync.txt @@ -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 when eglGetSyncAttribKHR is called with EGL_SYNC_TYPE_KHR: - EGL_SYNC_ANDROID_FENCE_ANDROID 0x3144 + EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144 Accepted by the parameter of eglCreateSyncKHR: - EGL_SYNC_ANDROID_FENCE_FD_ANDROID 0x3145 + EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145 Accepted by the 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 when eglGetSyncAttribKHR is called with 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 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 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 to unblock. If - the sync object is an EGL Android fence sync object then the native Android + eglClientWaitSyncKHR commands (see below) blocking on 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 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 is EGL_SYNC_FENCE_KHR and is neither NULL nor empty (containing only EGL_NONE), EGL_NO_SYNC_KHR is returned and an EGL_BAD_ATTRIBUTE error is generated. - * If is EGL_SYNC_ANDROID_FENCE_ANDROID and contains - an attribute other than EGL_SYNC_ANDROID_FENCE_FD_ANDROID, EGL_NO_SYNC_KHR is + * If is EGL_SYNC_NATIVE_FENCE_ANDROID and 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 is not a supported type of sync object, EGL_NO_SYNC_KHR is returned and an EGL_BAD_ATTRIBUTE error is generated. - * If is EGL_SYNC_FENCE_KHR or EGL_SYNC_ANDROID_FENCE_ANDROID and + * If 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 is EGL_SYNC_FENCE_KHR or EGL_SYNC_ANDROID_FENCE_ANDROID and + * If is EGL_SYNC_FENCE_KHR or EGL_SYNC_NATIVE_FENCE_ANDROID and 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 is EGL_SYNC_FENCE_KHR or EGL_SYNC_ANDROID_FENCE_ANDROID and + * If 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 will no longer be the handle of a valid sync object. Additionally, if 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 is not a valid sync object for , - 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 is - EGL_NO_ANDROID_FENCE_ANDROID, EGL_NO_ANDROID_FENCE_ANDROID is returned + * If the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute of is + EGL_NO_NATIVE_FENCE_ANDROID, EGL_NO_NATIVE_FENCE_ANDROID is returned and an EGL_BAD_PARAMETER error is generated. * If does not match the display passed to eglCreateSyncKHR when 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