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:
Mathias Agopian 2010-09-23 16:38:38 -07:00
parent 05c53113e0
commit 6f0871222f
3 changed files with 4 additions and 9 deletions

View File

@ -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);
} }

View File

@ -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), \

View File

@ -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), \