@@ -30,15 +30,14 @@ static const char gVertexShader[] =
3030static const char gFragmentShader [] =
3131 " #version 300 es\n "
3232 " precision mediump float;\n "
33- " uniform vec2 iResolution;\n "
3433 " uniform sampler2D iChannel0;\n "
3534 " uniform sampler2D iChannel1;\n "
3635 " uniform sampler2D iChannel2;\n "
3736 " uniform sampler2D iChannel3;\n "
3837 " in vec2 vTexCoord;\n "
3938 " out vec4 fragmentColor;\n "
4039 " void main() {\n "
41- " vec2 uv = vTexCoord; //vec2(vTexCoord.x / 5.0, vTexCoord.y / 5.0); \n "
40+ " vec2 uv = vTexCoord;\n "
4241 " vec4 fragColor0 = vec4(texture(iChannel0, uv).rgb, 1.0);\n "
4342 " vec4 fragColor1 = vec4(texture(iChannel1, uv).rgb, 1.0);\n "
4443 " vec4 fragColor2 = vec4(texture(iChannel2, uv).rgb, 1.0);\n "
@@ -48,33 +47,26 @@ static const char gFragmentShader[] =
4847
4948ImageMixer::ImageMixer (jni::JNIEnv &env, jni::jint width, jni::jint height)
5049{
51- // Step 1 - Get the default display.
5250 eglDisplay = eglGetDisplay (EGL_DEFAULT_DISPLAY);
5351
54- // Step 2 - Initialize EGL.
5552 EGLint eglMajVers, eglMinVers;
5653 eglInitialize (eglDisplay, &eglMajVers, &eglMinVers);
5754 LOGI (" EGL init with version %d.%d" , eglMajVers, eglMinVers);
5855
59-
60- // Step 3 - Make OpenGL ES the current API.
6156 eglBindAPI (EGL_OPENGL_ES_API);
6257
63- // Step 4 - Specify the required configuration attributes.
6458 EGLint configAttr[] = {
65- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, // very important!
66- EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, // we will create a pixelbuffer surface
59+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
60+ EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
6761 EGL_RED_SIZE, 8 ,
6862 EGL_GREEN_SIZE, 8 ,
6963 EGL_BLUE_SIZE, 8 ,
7064 EGL_NONE
7165 };
7266
73- // Step 5 - Find a config that matches all requirements.
7467 int iConfigs;
7568 EGLConfig eglConfig;
76- eglChooseConfig (eglDisplay, configAttr, &eglConfig, 1 ,
77- &iConfigs);
69+ eglChooseConfig (eglDisplay, configAttr, &eglConfig, 1 , &iConfigs);
7870
7971 if (iConfigs != 1 ) {
8072 jni::ThrowIllegalStateException (env, " Error: eglChooseConfig(): config not found" );
@@ -87,16 +79,13 @@ ImageMixer::ImageMixer(jni::JNIEnv &env, jni::jint width, jni::jint height)
8779 };
8880 eglSurface = eglCreatePbufferSurface (eglDisplay, eglConfig, surfaceAttr);
8981
90- // Step 7 - Create a context.
91-
9282 const EGLint ctxAttr[] = {
93- EGL_CONTEXT_CLIENT_VERSION, 3 , // very important!
83+ EGL_CONTEXT_CLIENT_VERSION, 3 , // Need to support GLSL 300
9484 EGL_NONE
9585 };
96- eglContext = eglCreateContext (eglDisplay, eglConfig, NULL ,
86+ eglContext = eglCreateContext (eglDisplay, eglConfig, nullptr ,
9787 ctxAttr);
9888
99- // Step 8 - Bind the context to the current thread
10089 eglMakeCurrent (eglDisplay, eglSurface, eglSurface, eglContext);
10190
10291 const GLubyte *glslVersion = glGetString (GL_SHADING_LANGUAGE_VERSION);
@@ -108,23 +97,20 @@ ImageMixer::ImageMixer(jni::JNIEnv &env, jni::jint width, jni::jint height)
10897 if (!glProgram) {
10998 jni::ThrowIllegalStateException (env, " Could not create program." );
11099 }
111- gvPositionHandle = glGetAttribLocation (glProgram, " aPosition" );
100+ glPositionShaderInput = (GLuint) glGetAttribLocation (glProgram, " aPosition" );
112101 checkGlError (" glGetAttribLocation" );
113- LOGI (" glGetAttribLocation(\" aPosition\" ) = %d\n " , gvPositionHandle);
114102
115103 glViewport (0 , 0 , width, height);
116104 checkGlError (" glViewport" );
117105
118- glGenBuffers (1 , &quadBuffer );
119- glBindBuffer (GL_ARRAY_BUFFER, quadBuffer );
106+ glGenBuffers (1 , &glQuadBuffer );
107+ glBindBuffer (GL_ARRAY_BUFFER, glQuadBuffer );
120108 glBufferData (GL_ARRAY_BUFFER, sizeof (quadVertices), quadVertices, GL_STATIC_DRAW);
121109 glBindBuffer (GL_ARRAY_BUFFER, GL_NONE);
122110}
123111
124112ImageMixer::~ImageMixer ()
125113{
126- // TODO iterate over textures and unload them all
127-
128114 if (eglDisplay != EGL_NO_DISPLAY) {
129115 eglMakeCurrent (eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
130116 if (eglContext != EGL_NO_CONTEXT) {
@@ -181,8 +167,6 @@ void ImageMixer::convert(jni::JNIEnv &env, jni::String &outPath)
181167 if (!is_egl_context_creator_thread) {
182168 jni::ThrowIllegalStateException (env, " Called from thread which is different to one who created eglContext" );
183169 }
184- // commit the clear to the offscreen surface
185- // eglSwapBuffers(eglDisplay, eglSurface);
186170
187171 glClearColor (1.0 , 1.0 , 1.0 , 1.0 );
188172 glClear (GL_COLOR_BUFFER_BIT);
@@ -211,35 +195,20 @@ void ImageMixer::convert(jni::JNIEnv &env, jni::String &outPath)
211195
212196 }
213197 }
214- // bind resolution uniform
215- GLint viewport[4 ];
216198
217- glGetIntegerv (GL_VIEWPORT, viewport);
218- GLsizei width = viewport[2 ], height = viewport[3 ];
219- GLint resolutionName = glGetUniformLocation (glProgram, " iResolution" );
220- checkGlError (" glGetUniformLocation" );
221- glUniform2f (resolutionName, (GLfloat)width, (GLfloat)height);
222- checkGlError (" glUniform2f" );
223199
224- glEnableVertexAttribArray (gvPositionHandle );
200+ glEnableVertexAttribArray (glPositionShaderInput );
225201 checkGlError (" glEnableVertexAttribArray" );
226202
227- glBindBuffer (GL_ARRAY_BUFFER, quadBuffer );
203+ glBindBuffer (GL_ARRAY_BUFFER, glQuadBuffer );
228204 checkGlError (" glBindBuffer" );
229- glVertexAttribPointer (
230- gvPositionHandle, // attribute
231- 2 , // number of elements per vertex, here (x,y)
232- GL_FLOAT, // the type of each element
233- GL_FALSE, // take our values as-is
234- 0 , // no extra data between each position
235- 0 // offset of first element
236- );
205+ glVertexAttribPointer (glPositionShaderInput, 2 , GL_FLOAT, GL_FALSE, 0 , 0 );
237206 checkGlError (" glVertexAttribPointer" );
238207
239208 glDrawArrays (GL_TRIANGLE_STRIP, 0 , 4 );
240209 checkGlError (" glDrawArrays" );
241210
242- glDisableVertexAttribArray (gvPositionHandle );
211+ glDisableVertexAttribArray (glPositionShaderInput );
243212 checkGlError (" glDisableVertexAttribArray" );
244213
245214 for (GLuint unit = 0 ; unit < MAX_IMAGES; unit++) {
@@ -252,8 +221,9 @@ void ImageMixer::convert(jni::JNIEnv &env, jni::String &outPath)
252221 }
253222
254223 // read
255-
256- const auto readPixels = std::get_temporary_buffer<uint32_t >(width * height);
224+ GLint viewport[4 ];
225+ glGetIntegerv (GL_VIEWPORT, viewport);
226+ const auto readPixels = std::get_temporary_buffer<uint32_t >(viewport[2 ] * viewport[3 ]);
257227 glReadPixels (viewport[0 ], viewport[1 ], viewport[2 ], viewport[3 ], GL_RGB, GL_UNSIGNED_BYTE, readPixels.first );
258228 checkGlError (" glReadPixels" );
259229
@@ -262,7 +232,8 @@ void ImageMixer::convert(jni::JNIEnv &env, jni::String &outPath)
262232
263233 // save
264234 std::string result_path = jni::Make<std::string>(env, outPath);
265- bool success = (bool ) SOIL_save_screenshot (result_path.c_str (), SOIL_SAVE_TYPE_BMP, viewport[0 ], viewport[1 ], viewport[2 ], viewport[3 ]);
235+ int success = SOIL_save_screenshot (result_path.c_str (), SOIL_SAVE_TYPE_BMP,
236+ viewport[0 ], viewport[1 ], viewport[2 ], viewport[3 ]);
266237 std::return_temporary_buffer (readPixels.first );
267238
268239 if (!success) {
0 commit comments