@@ -56,6 +56,8 @@ struct renderer {
5656 InitRender_t init ;
5757 RenderFrame_t renderFrame ;
5858 DestroyRender_t destroy ;
59+ EGLint renderableType ;
60+ EGLint clientVersion ;
5961};
6062
6163static struct renderer renderer = {0 };
@@ -125,7 +127,7 @@ static int createSurface(struct renderer* renderer, void* nativeWinSurface) {
125127 return 1 ;
126128}
127129
128- static int initContext (struct renderer * renderer , EGLint clientVersion ) {
130+ static int createContext (struct renderer * renderer , EGLint clientVersion ) {
129131 LOG (I , "Initializing context" )
130132 EGLint attribs [] = {
131133 EGL_CONTEXT_CLIENT_VERSION , clientVersion /* 1 or 2 or 3 */ ,
@@ -135,28 +137,40 @@ static int initContext(struct renderer* renderer, EGLint clientVersion) {
135137 renderer -> destroy ();
136138 return 0 ;
137139 }
138-
140+
141+ LOG (I , "Context initialized" )
142+ return 1 ;
143+ }
144+
145+ static int setAsCurrent (struct renderer * renderer ) {
146+ LOG (I , "Setting current context" )
139147 if (!eglMakeCurrent (display , surface , surface , context )) {
140148 logEGLError ( "eglMakeCurrent" , eglGetError ());
141149 renderer -> destroy ();
142150 return 0 ;
143151 }
144152
145- LOG (I , "Context initialized " )
153+ LOG (I , "Set current context " )
146154 return 1 ;
147155}
148156
149157static int destroyContext () {
150- eglMakeCurrent (display , EGL_NO_SURFACE , EGL_NO_SURFACE , EGL_NO_CONTEXT );
151158 eglDestroyContext (display , context );
159+ context = EGL_NO_CONTEXT ;
160+ return 1 ;
161+ }
162+
163+ static int destroySurface () {
152164 eglDestroySurface (display , surface );
165+ surface = EGL_NO_SURFACE ;
166+ return 1 ;
167+ }
168+
169+ static int destroyDisplay () {
153170 eglTerminate (display );
154171 eglReleaseThread ();
155172
156173 display = EGL_NO_DISPLAY ;
157- surface = EGL_NO_SURFACE ;
158- context = EGL_NO_CONTEXT ;
159-
160174 return 1 ;
161175}
162176
@@ -223,32 +237,9 @@ static void renderFrameOpenGLES1()
223237
224238static void destroyRenderOpenGLES1 () {
225239 LOG (I , "Destroying OpenGL 1 context" )
226-
227- if (!destroyContext ()) {
228-
229- }
230- return ;
231240}
232241
233242static int initRenderOpenGLES1 (TestPlatform * p , void * eglDisplay , void * nativeWinSurface ) {
234- setenv (p -> ios_platform_env_key , p -> ios_platform_env_value , 1 );
235-
236- if (!getAndInitDisplay (& renderer , p , eglDisplay )) {
237- return 0 ;
238- }
239-
240- if (!chooseConfig (& renderer , EGL_OPENGL_ES_BIT )) {
241- return 0 ;
242- }
243-
244- if (!createSurface (& renderer , nativeWinSurface )) {
245- return 0 ;
246- }
247-
248- if (!initContext (& renderer ,1 )) {
249- return 0 ;
250- }
251-
252243 glDisable (GL_DITHER );
253244 glHint (GL_PERSPECTIVE_CORRECTION_HINT , GL_FASTEST );
254245 glClearColor (0 , 0 , 0 , 0 );
@@ -262,8 +253,6 @@ static int initRenderOpenGLES1(TestPlatform* p, void* eglDisplay, void* nativeWi
262253 glMatrixMode (GL_PROJECTION );
263254 glLoadIdentity ();
264255 glFrustumf (- ratio , ratio , -1 , 1 , 1 , 10 );
265-
266- LOG (I , "Context initialized" )
267256 return 1 ;
268257}
269258
@@ -653,31 +642,9 @@ static void renderFrameOpenGLES2()
653642
654643static void destroyRenderOpenGLES2 () {
655644 LOG (I , "Destroying OpenGL 2 context" )
656-
657- if (!destroyContext ()) {
658-
659- }
660- return ;
661645}
662646
663647static int initRenderOpenGLES2 (TestPlatform * p , void * eglDisplay , void * nativeWinSurface ) {
664-
665- if (!getAndInitDisplay (& renderer , p , eglDisplay )) {
666- return 0 ;
667- }
668-
669- if (!chooseConfig (& renderer , EGL_OPENGL_ES2_BIT )) {
670- return 0 ;
671- }
672-
673- if (!createSurface (& renderer , nativeWinSurface )) {
674- return 0 ;
675- }
676-
677- if (!initContext (& renderer ,2 )) {
678- return 0 ;
679- }
680-
681648 if (!compileShaders (vertexShader , fragmentShader , & vertexShaderObjectId , & fragmentShaderObjectId , & programObjectId )) {
682649 renderer .destroy ();
683650 return 0 ;
@@ -705,6 +672,8 @@ static void sample(TestPlatform* p, void* eglDisplay, void* nativeWinSurface, in
705672 renderer .init = initRenderOpenGLES1 ;
706673 renderer .renderFrame = renderFrameOpenGLES1 ;
707674 renderer .destroy = destroyRenderOpenGLES1 ;
675+ renderer .renderableType = EGL_OPENGL_ES_BIT ;
676+ renderer .clientVersion = 1 ;
708677 LOG (I , "Running with OpenGL ES 1.X" )
709678 break ;
710679 }
@@ -713,6 +682,8 @@ static void sample(TestPlatform* p, void* eglDisplay, void* nativeWinSurface, in
713682 renderer .init = initRenderOpenGLES2 ;
714683 renderer .renderFrame = renderFrameOpenGLES2 ;
715684 renderer .destroy = destroyRenderOpenGLES2 ;
685+ renderer .renderableType = EGL_OPENGL_ES2_BIT ;
686+ renderer .clientVersion = 2 ;
716687 LOG (I , "Running with OpenGL ES 2.X" )
717688 break ;
718689 }
@@ -721,40 +692,97 @@ static void sample(TestPlatform* p, void* eglDisplay, void* nativeWinSurface, in
721692 break ;
722693 }
723694
695+ if (!getAndInitDisplay (& renderer , p , eglDisplay )) {
696+ return ;
697+ }
724698
725- if (renderer .init (p , eglDisplay , nativeWinSurface )) {
726- int i = 0 ;
727- TimeRecord_t s ;
728- TimeRecord_t e ;
729- if (!eglSwapInterval (display , 1 )) {
730- logEGLError ("eglSwapInterval()" , eglGetError ());
731- }
732- else {
733- while (i < maxFrameCount )
734- {
735- LOG (I , "FRAME ..." )
736- renderer .renderFrame ();
737- START_RECORD_DURATION (& s );
738- if (!eglSwapBuffers (display , surface )) {
739- logEGLError ("eglSwapBuffers()" , eglGetError ());
740- }
741- LOG (I , "FRAME DONE" )
742- END_RECORD_DURATION (& e );
743- LOG_DURATION (& s , & e )
744- i ++ ;
699+ if (!chooseConfig (& renderer , renderer .renderableType )) {
700+ return ;
701+ }
702+
703+ init :
704+ if (!createSurface (& renderer , nativeWinSurface )) {
705+ return ;
706+ }
707+
708+ if (!createContext (& renderer ,renderer .clientVersion )) {
709+ return ;
710+ }
711+
712+ if (!setAsCurrent (& renderer )) {
713+ return ;
714+ }
715+
716+ if (!eglSwapInterval (display , 1 )) {
717+ logEGLError ("eglSwapInterval()" , eglGetError ());
718+ return ;
719+ }
720+
721+ EGLint error ;
722+ if (!renderer .init (p , eglDisplay , nativeWinSurface )) {
723+ return ;
724+ }
725+
726+ int i = 0 ;
727+ TimeRecord_t s ;
728+ TimeRecord_t e ;
729+ while (i < maxFrameCount )
730+ {
731+ LOG (I , "FRAME ..." )
732+ renderer .renderFrame ();
733+ START_RECORD_DURATION (& s );
734+ if (!eglSwapBuffers (display , surface )) {
735+ error = eglGetError ();
736+ logEGLError ("eglSwapBuffers()" , error );
737+ if (error != EGL_CONTEXT_LOST ) {
738+ break ;
745739 }
740+ if (!destroySurface ()) {
741+ return ;
742+ }
743+
744+ if (!destroyContext ()) {
745+ return ;
746+ }
747+
748+ if (!setAsCurrent (& renderer )) {
749+ return ;
750+ }
751+
752+ goto init ;
746753 }
754+ LOG (I , "FRAME DONE" )
755+ END_RECORD_DURATION (& e );
756+ LOG_DURATION (& s , & e )
757+ i ++ ;
747758 }
759+
748760 renderer .destroy ();
761+
762+ if (!destroySurface ()) {
763+ return ;
764+ }
765+
766+ if (!destroyContext ()) {
767+ return ;
768+ }
769+
770+ if (!setAsCurrent (& renderer )) {
771+ return ;
772+ }
773+
774+ if (!destroyDisplay ()) {
775+ return ;
776+ }
749777}
750778
751779void run_sample1 (TestPlatform * p ) {
752780 LOG (I , "Executing: " __FILE__ )
753781 setup (p );
754- sample (p , p -> validNativeDisplay , p -> validNativeWindow , 1000 , 1 );
782+ sample (p , p -> validNativeDisplay , p -> validNativeWindow , 100 , 1 );
755783 teardown (p );
756784 setup (p );
757- sample (p , p -> validNativeDisplay , p -> validNativeWindow , 1000 , 2 );
785+ sample (p , p -> validNativeDisplay , p -> validNativeWindow , 100 , 2 );
758786 teardown (p );
759787}
760788
0 commit comments