29 #define GL_GLEXT_PROTOTYPES
31 #include <GLES3/gl31.h>
32 #include <GLES2/gl2ext.h>
42 namespace ArgusSamples
46 : m_eglStream(eglStream)
47 , m_streamState(EGL_NONE)
51 , m_sync(EGL_NO_SYNC_KHR)
63 #ifdef WAR_EGL_STREAM_RACE
65 #endif // WAR_EGL_STREAM_RACE
66 PROPAGATE_ERROR(Thread::initialize());
67 PROPAGATE_ERROR(Thread::waitRunning());
73 PROPAGATE_ERROR(Thread::shutdown());
98 #ifdef WAR_EGL_STREAM_RACE
103 #endif // WAR_EGL_STREAM_RACE
111 PROPAGATE_ERROR(
m_context.makeCurrent());
116 ORIGINATE_ERROR(
"Failed to create GL texture");
120 ORIGINATE_ERROR(
"Unable to connect GL as consumer");
121 glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);
123 #if defined(WAR_EGL_STREAM_RACE) && defined(EGL_NV_stream_sync)
127 if (
m_sync == EGL_NO_SYNC_KHR)
128 ORIGINATE_ERROR(
"eglCreateStreamSyncNV failed (error 0x%04x)", eglGetError());
129 #endif // WAR_EGL_STREAM_RACE && EGL_NV_stream_sync
133 EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, -1))
135 ORIGINATE_ERROR(
"eglStreamAttribKHR failed (error 0x%04x)", eglGetError());
155 ORIGINATE_ERROR(
"eglQueryStreamKHR failed");
167 ORIGINATE_ERROR(
"EGL stream is in bad state (0x%04x)",
m_streamState);
170 (
m_streamState == EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR) ||
173 #ifdef WAR_EGL_STREAM_RACE
174 bool hasNewFrame =
false;
180 const EGLint ret = eglClientWaitSyncKHR(display,
m_sync, 0 ,
182 if (ret == EGL_CONDITION_SATISFIED_KHR)
185 if (!eglSignalSyncKHR(display,
m_sync, EGL_UNSIGNALED_KHR))
186 ORIGINATE_ERROR(
"eglSignalSyncKHR failed (error 0x%04x)", eglGetError());
190 else if (ret != EGL_TIMEOUT_EXPIRED_KHR)
192 ORIGINATE_ERROR(
"eglClientWaitSyncKHR failed with 0x%04x (error 0x%04x)", ret,
198 if (
m_streamState == EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR)
211 bool acquired =
false;
218 acquired = eglStreamConsumerAcquireKHR(display,
m_eglStream);
229 if (eglGetError() == EGL_BAD_STATE_KHR)
230 PROPAGATE_ERROR(requestShutdown());
232 ORIGINATE_ERROR(
"Failed to aquire from egl stream");
235 #else // WAR_EGL_STREAM_RACE
236 if (eglStreamConsumerAcquireKHR(display,
m_eglStream))
244 if (eglGetError() == EGL_BAD_STATE_KHR)
245 PROPAGATE_ERROR(requestShutdown());
247 ORIGINATE_ERROR(
"Failed to aquire from egl stream");
249 #endif // WAR_EGL_STREAM_RACE
257 #if defined(WAR_EGL_STREAM_RACE) && defined(EGL_NV_stream_sync)
261 REPORT_ERROR(
"eglDestroySyncKHR failed (error 0x%04x)", eglGetError());
264 #endif // WAR_EGL_STREAM_RACE && EGL_NV_stream_sync