29 #define GL_GLEXT_PROTOTYPES
31 #include <GLES3/gl31.h>
32 #include <GLES2/gl2ext.h>
37 #include "UniquePointer.h"
44 namespace ArgusSamples
48 : m_initialized(false)
52 , m_windowAspectRatio(1.0f)
54 , m_composerSequence(0)
74 Window &window = Window::getInstance();
75 PROPAGATE_ERROR(
onResize(window.getWidth(), window.getHeight()));
78 PROPAGATE_ERROR(window.registerObserver(
this));
80 PROPAGATE_ERROR(Thread::initialize());
81 PROPAGATE_ERROR(Thread::waitRunning());
93 PROPAGATE_ERROR_CONTINUE(Window::getInstance().unregisterObserver(
this));
96 PROPAGATE_ERROR_CONTINUE(Thread::requestShutdown());
101 PROPAGATE_ERROR_CONTINUE(Thread::shutdown());
105 PROPAGATE_ERROR_CONTINUE(it->m_consumer->shutdown());
106 delete it->m_consumer;
117 if (eglStream == EGL_NO_STREAM_KHR)
118 ORIGINATE_ERROR(
"Invalid stream");
122 UniquePointer<StreamConsumer> streamConsumer(
new StreamConsumer(eglStream));
124 ORIGINATE_ERROR(
"Out of memory");
126 PROPAGATE_ERROR(streamConsumer->initialize());
129 PROPAGATE_ERROR(sm.expectLocked());
146 if (it->m_consumer->isEGLStream(eglStream))
148 PROPAGATE_ERROR(it->m_consumer->shutdown());
149 delete it->m_consumer;
157 ORIGINATE_ERROR(
"Stream was not bound");
169 if (it->m_consumer->isEGLStream(eglStream))
171 it->m_active = active;
178 ORIGINATE_ERROR(
"Stream was not bound");
190 if (it->m_consumer->isEGLStream(eglStream))
192 PROPAGATE_ERROR(it->m_consumer->setStreamAspectRatio(aspectRatio));
199 ORIGINATE_ERROR(
"Stream was not bound");
228 PROPAGATE_ERROR(
m_context.initialize(&Window::getInstance()));
229 PROPAGATE_ERROR(
m_context.makeCurrent());
232 static const char vtxSrc[] =
234 "#extension GL_ARB_explicit_uniform_location : require\n"
235 "in layout(location = 0) vec2 vertex;\n"
236 "out vec2 vTexCoord;\n"
237 "layout(location = 0) uniform vec2 offset;\n"
238 "layout(location = 1) uniform vec2 scale;\n"
240 " gl_Position = vec4((offset + vertex * scale) * 2.0 - 1.0, 0.0, 1.0);\n"
241 " vTexCoord = vec2(vertex.x, 1.0 - vertex.y);\n"
243 static const char frgSrc[] =
245 "#extension GL_OES_EGL_image_external : require\n"
246 "precision highp float;\n"
247 "uniform samplerExternalOES texSampler;\n"
248 "in vec2 vTexCoord;\n"
249 "out vec4 fragColor;\n"
251 " fragColor = texture2D(texSampler, vTexCoord);\n"
256 static const GLfloat vertices[] = {
262 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices);
263 glEnableVertexAttribArray(0);
265 if (eglSwapInterval(renderer.
getEGLDisplay(), 1) != EGL_TRUE)
266 ORIGINATE_ERROR(
"Failed to set the swap interval");
290 glClear(GL_COLOR_BUFFER_BIT);
301 if (streamsCopy.size() != 0)
307 uint32_t activeStreams = 0;
308 for (StreamList::iterator it = streamsCopy.begin(); it != streamsCopy.end(); ++it)
314 const uint32_t cells =
static_cast<uint32_t
>(ceil(sqrt(activeStreams)));
315 const float scaleX = 1.0f / cells;
316 const float scaleY = 1.0f / cells;
317 uint32_t offsetX = 0, offsetY = cells - 1;
319 for (StreamList::iterator it = streamsCopy.begin(); it != streamsCopy.end(); ++it)
323 #ifdef WAR_EGL_STREAM_RACE
325 ScopedMutex sm(it->m_consumer->getStreamTextureMutex());
326 PROPAGATE_ERROR(sm.expectLocked());
327 #endif // WAR_EGL_STREAM_RACE
329 glBindTexture(GL_TEXTURE_EXTERNAL_OES, it->m_consumer->getStreamTextureID());
347 (offsetX - (sizeX - 1.0f) * 0.5f) * scaleX,
348 (offsetY - (sizeY - 1.0f) * 0.5f) * scaleY);
349 glUniform2f(1, scaleX * sizeX, scaleY * sizeY);
351 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
353 glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);
356 if (offsetX == cells)
367 PROPAGATE_ERROR(
m_context.swapBuffers());