better fix for [3028370] GL get error should return a valid error if no context is bound.
it turns out that we cannot return INVALID_OPERATION from glGetError() because the GL spec says that it must be called in a loop until it returns GL_NO_ERROR. now, we always return 0 from GL functions called from a thread with no context bound. This means that glGetError() will return NO_ERROR in this case, which is better than returning a random value (which could trap the app in a loop). if this happens in the main thread of a process, we LOG an error message once. Change-Id: Id59620e675a890286ef62a257c02b06e0fdcaf69
This commit is contained in:
parent
05c53113e0
commit
6f0871222f
@ -428,19 +428,14 @@ static void(*findProcAddress(const char* name,
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
static void gl_no_context() {
|
static int gl_no_context() {
|
||||||
tls_t* tls = getTLS();
|
tls_t* tls = getTLS();
|
||||||
if (tls->logCallWithNoContext == EGL_TRUE) {
|
if (tls->logCallWithNoContext == EGL_TRUE) {
|
||||||
tls->logCallWithNoContext = EGL_FALSE;
|
tls->logCallWithNoContext = EGL_FALSE;
|
||||||
LOGE("call to OpenGL ES API with no current context "
|
LOGE("call to OpenGL ES API with no current context "
|
||||||
"(logged once per thread)");
|
"(logged once per thread)");
|
||||||
}
|
}
|
||||||
}
|
return 0;
|
||||||
|
|
||||||
// Always return GL_INVALID_OPERATION from glGetError() when called from
|
|
||||||
// a thread without a bound context.
|
|
||||||
static GLenum gl_no_context_glGetError() {
|
|
||||||
return GL_INVALID_OPERATION;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void early_egl_init(void)
|
static void early_egl_init(void)
|
||||||
@ -454,8 +449,6 @@ static void early_egl_init(void)
|
|||||||
addr,
|
addr,
|
||||||
sizeof(gHooksNoContext));
|
sizeof(gHooksNoContext));
|
||||||
|
|
||||||
gHooksNoContext.gl.glGetError = gl_no_context_glGetError;
|
|
||||||
|
|
||||||
setGlThreadSpecific(&gHooksNoContext);
|
setGlThreadSpecific(&gHooksNoContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,6 +58,7 @@ using namespace android;
|
|||||||
"ldr r12, [r12, %[tls]] \n" \
|
"ldr r12, [r12, %[tls]] \n" \
|
||||||
"cmp r12, #0 \n" \
|
"cmp r12, #0 \n" \
|
||||||
"ldrne pc, [r12, %[api]] \n" \
|
"ldrne pc, [r12, %[api]] \n" \
|
||||||
|
"mov r0, #0 \n" \
|
||||||
"bx lr \n" \
|
"bx lr \n" \
|
||||||
: \
|
: \
|
||||||
: [tls] "J"(TLS_SLOT_OPENGL_API*4), \
|
: [tls] "J"(TLS_SLOT_OPENGL_API*4), \
|
||||||
|
@ -114,6 +114,7 @@ GL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type,
|
|||||||
"ldr r12, [r12, %[tls]] \n" \
|
"ldr r12, [r12, %[tls]] \n" \
|
||||||
"cmp r12, #0 \n" \
|
"cmp r12, #0 \n" \
|
||||||
"ldrne pc, [r12, %[api]] \n" \
|
"ldrne pc, [r12, %[api]] \n" \
|
||||||
|
"mov r0, #0 \n" \
|
||||||
"bx lr \n" \
|
"bx lr \n" \
|
||||||
: \
|
: \
|
||||||
: [tls] "J"(TLS_SLOT_OPENGL_API*4), \
|
: [tls] "J"(TLS_SLOT_OPENGL_API*4), \
|
||||||
|
Loading…
Reference in New Issue
Block a user