2017-03-13 1 views
2
로이드

에 opengles 스레드를 해제 할 수 없다. 다른 기기 (galaxy note2,3 galaxy S7)로 오류가 발생하지 않습니다. OpenGLES 2.0에 JNI를 사용하고 특정 장치에 4.3 버전 (API 18)이 있습니다.는 <p>함수, eglReleaseThread()를 호출</p> 즉시 애플리케이션이 갤럭시 S4 '는 특정 장치에 대한 임의의 반환 값없이 폐쇄 .. I 약간 문제가

이것은 파트 소스 코드입니다.

if (mEGLDisplay != EGL_NO_DISPLAY) { 
    CppLog("env - release - exist display"); 
    if(!eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)){ 
     CppError("ImageProcGLES - eglMakeCurrent"); 
     return -1; 
    } 
    else{ 
     CppLog("env - release - eglMakeCurrent"); 
    } 

    if(!eglDestroySurface(mEGLDisplay, mEGLSurface)){ 
     CppError("ImageProcGLES - eglDestroySurface Error."); 
     return -1; 
    } 
    else{ 
     CppLog("env - release - eglDestroySurface"); 
    } 

    if(!eglDestroyContext(mEGLDisplay, mEGLContext)){ 
     CppError("ImageProcGLES - eglDestroyContext."); 
     return -1; 
    }else{ 
     CppLog("env - release - eglDestroyContext"); 
    } 

    if(!eglReleaseThread()){ 
     CppError("ImageProcGLES - eglReleaseThread."); 
     return -1; 
    }else{ 
     CppLog("env - release - eglReleaseThread"); 
    } 

    if(!eglTerminate(mEGLDisplay)){ 
     CppError("ImageProcGLES - eglTerminate."); 
     return -1; 
    }else{ 
     CppLog("env - release - eglTerminate"); 
    } 
} 
else{ 
    CppError("env - release - No Display"); 
} 

이것은 복구 로그입니다. 당신은 어떤 생각을 가지고있는 경우

buffer - release 
    env - release - start 
    env - release - exist display 
    env - release - eglMakeCurrent 
    env - release - eglDestroySurface 
    env - release - eglDestroyContext 

... 좀 도와주세요 :(

+0

장치 드라이버의 버그처럼 보입니다. 어떤 갤럭시 S4의 특정 모델을 사용하고 있습니까? 일부는 SGX GPU를 기반으로하고 다른 일부는 Adreno GPU를 기반으로합니다. – solidpixel

+0

@solidpixel 장치 드라이브에 버그가있는 경우 문제를 해결하는 방법? 정확히 어떤 GPU가 사용되는지 모르겠는데, 아마도 'SGX544MP3'을 기반으로 한 ** I9500/한국 모델 **입니다. GPU –

+0

고칠 수 없습니다. 이를 해결할 수도 있지만 해결할 수는 없습니다. 가장 좋은 대답은'eglReleaseThread()'호출을 피하는 것입니다 ... 이론적으로'eglTerminate()'를 호출 할 때 모든 EGL 리소스를 해제해야합니다. – solidpixel

답변

1

그것은 EGL 드라이버의 버그입니다. 나는 표면에서 EGL 표면을 만들고 그것을 해결하기 위해, 동일한 문제를 가지고하는 데 사용 .하지 SurfaceTexture 당신은 표면을 만들 때 :

여기

키 순간 SurfaceTexture에서 표면을 만드는 것입니다

mSurface = new Surface(mSurfaceTexture); 
      mEglSurface = EGL14.eglCreateWindowSurface(mEglDisplay, 
mEglConfig, mSurface, surfaceAttribs, 0); 
:

Surface surface = new Surface(mSurfaceTexture);