blob: 5604c4d50bd27b67d9d5ac650fd0ae66c8429fdb [file] [log] [blame]
Name
NV_stream_sync
Name Strings
EGL_NV_stream_sync
Contributors
Acorn Pooley
Marcus Lorentzon
Contacts
Ian Stewart, NVIDIA (istewart 'at' nvidia.com)
Status
Complete
Version
Version 6, June 5, 2012
Number
EGL Extension #56
Dependencies
Requires EGL 1.2.
Requires EGL_KHR_stream extension
Requires EGL_KHR_reusable_sync
This extension is written based on the wording of the EGL 1.2
specification.
Overview
This extension defines a new type of reusable sync object. This
sync object will be signaled each time a new image frame becomes
available in an EGLStream for the consumer to consume.
New functions
EGLSyncKHR eglCreateStreamSyncNV(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLenum type,
const EGLint *attrib_list);
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_NEW_FRAME_NV 0x321F
Add a new paragraph to section "3.8.1 Sync Objects" in the
EGL_KHR_reusable_sync extension, just before the paragraph that
mentions the eglClientWaitSyncKHR function:
The command
EGLSyncKHR eglCreateStreamSyncNV(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLenum type,
const EGLint *attrib_list);
creates a sync object of the specified <type> associated with the
specified display <dpy> and the specified EGLStream <stream>, and
returns a handle to the new object. <attrib_list> is an
attribute-value list specifying other attributes of the sync
object, terminated by an attribute entry EGL_NONE. Attributes not
specified in the list will be assigned their default values. The
state of <stream> must not be EGL_STREAM_STATE_CREATED_KHR or
EGL_STREAM_STATE_DISCONNECTED_KHR.
If <type> is EGL_SYNC_NEW_FRAME_NV, a stream-new-frame reusable
sync object is created. In this case <attrib_list> must be NULL or
empty (containing only EGL_NONE). Attributes of the reusable
stream-new-frame sync object are set as follows:
Attribute Name Initial Attribute Value(s)
--------------- --------------------------
EGL_SYNC_TYPE_KHR EGL_SYNC_NEW_FRAME_NV
EGL_SYNC_STATUS_KHR EGL_UNSIGNALED_KHR
Any time the state of <stream> transitions to
EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR (from any other state),
the returned stream-new-frame reusable sync object is signaled.
(This effectively means the sync object will become signaled
whenever the producer inserts a new image frame into the
EGLStream.)
EGL does not automatically unsignal the stream-new-frame reusable
sync object. Generally applications will want to unsignal the
sync object after it has been signaled so that the availability
of the next frame can
be detected.
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 <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 <stream> is not a valid EGLStream created for <dpy>,
EGL_NO_SYNC_KHR is returned and an EGL_BAD_STREAM error is
generated.
* If <stream>'s state is EGL_STREAM_STATE_CREATED_KHR or
EGL_STREAM_STATE_DISCONNECTED_KHR then EGL_NO_SYNC_KHR is
returned and an EGL_BAD_ACCESS error is generated.
* If a sync object of <type> has already been created for
<stream> (and not destroyed), EGL_NO_SYNC_KHR is returned and
an EGL_BAD_ACCESS error is generated.
* If <type> is not a supported type of stream sync object,
EGL_NO_SYNC_KHR is returned and an EGL_BAD_ATTRIBUTE error is
generated.
Issues
1. Is this extension useful, or does the built in blocking
behavior of the consumer described by the
EGL_NV_stream_consumer_gltexture extension render this
un-useful?
RESOLVED: Yes. It is useful to have a thread waiting on the
signal.
2. Does EGL automatically unsignal the sync object?
RESOLVED: No. After the sync object has been signaled, it is
up to the application to unsignal it before waiting on it
again. It is important to check for the availability of
another frame by querying EGL_PRODUCER_FRAME_KHR after
unsignaling the sync object and before waiting on the sync
object to prevent a race condition. This can be done using
the following code:
void ConsumeFrames(EGLDisplay dpy, EGLStreamKHR stream)
{
EGLuint64KHR last_frame = 0;
EGLuint64KHR new_frame = 0;
EGLSyncKHR sync;
sync = eglCreateStreamSyncNV(dpy,
stream,
EGL_SYNC_NEW_FRAME_NV,
0);
for(;;) {
eglSignalSyncKHR(dpy, sync, EGL_UNSIGNALED_KHR);
eglQueryStreamu64KHR(dpy,
stream,
EGL_PRODUCER_FRAME_KHR,
&new_frame);
if (new_frame != last_frame) {
last_frame = new_frame;
ConsumeNewFrame(stream);
} else {
eglClientWaitSyncKHR(dpy, sync, 0, EGL_FOREVER_KHR);
}
}
}
Revision History
#7 (July 10, 2013) Jon Leech
- Fix spelling of 'signalled' -> 'signaled' and assign extension
number for publication.
#6 (June 5, 2012) Acorn Pooley
- Add error if stream is in state EGL_STREAM_STATE_CREATED_KHR
or EGL_STREAM_STATE_DISCONNECTED_KHR when sync is created.
#5 (September 30, 2011) Acorn Pooley
- Change eglCreateStreamSyncKHR to eglCreateStreamSyncNV
#4 (September 28, 2011) Acorn Pooley
- Add issue 2
- Fix return type of eglCreateStreamSyncNV
#3 (September 27, 2011) Acorn Pooley
- Assign enum values (bug 8064)
#2 (July 6, 2011) Acorn Pooley
- Rename EGL_KHR_image_stream to EGL_KHR_stream
#1 (June 30, 2011) Acorn Pooley
- Initial draft