add support for GL_EXT_debug_marker

This extension is always added to the GL_EXTENSIONS
extension string for the current GL context, regardless
of if it's supported by the h/w driver.

The extension itself will be handled by GLES_trace (eventually),
when GLES_trace is not enabled, it'll result to a no-op.

If the h/w implementation has this extension, we'll call that version
instead of our dummy version.

Change-Id: Ie5dd3387c4d45cd5ed5f03b73bda6045620a96bc
This commit is contained in:
Mathias Agopian 2012-01-28 21:44:00 -08:00
parent 453851f3a0
commit 48d438d05f
12 changed files with 118 additions and 12 deletions

View File

@ -253,6 +253,19 @@ void Loader::init_api(void* dso,
if (f == NULL) {
//ALOGD("%s", name);
f = (__eglMustCastToProperFunctionPointerType)gl_unimplemented;
/*
* GL_EXT_debug_label is special, we always report it as
* supported, it's handled by GLES_trace. If GLES_trace is not
* enabled, then these are no-ops.
*/
if (!strcmp(name, "glInsertEventMarkerEXT")) {
f = (__eglMustCastToProperFunctionPointerType)gl_noop;
} else if (!strcmp(name, "glPushGroupMarkerEXT")) {
f = (__eglMustCastToProperFunctionPointerType)gl_noop;
} else if (!strcmp(name, "glPopGroupMarkerEXT")) {
f = (__eglMustCastToProperFunctionPointerType)gl_noop;
}
}
*curr++ = f;
api++;

View File

@ -233,6 +233,26 @@ EGLImageKHR egl_get_image_for_current_context(EGLImageKHR image)
// ----------------------------------------------------------------------------
const GLubyte * egl_get_string_for_current_context(GLenum name) {
// NOTE: returning NULL here will fall-back to the default
// implementation.
EGLContext context = egl_tls_t::getContext();
if (context == EGL_NO_CONTEXT)
return NULL;
egl_context_t const * const c = get_context(context);
if (c == NULL) // this should never happen, by construction
return NULL;
if (name != GL_EXTENSIONS)
return NULL;
return (const GLubyte *)c->gl_extensions.string();
}
// ----------------------------------------------------------------------------
// this mutex protects:
// d->disp[]
// egl_init_drivers_locked()
@ -290,6 +310,9 @@ void gl_unimplemented() {
ALOGE("called unimplemented OpenGL ES API");
}
void gl_noop() {
}
// ----------------------------------------------------------------------------
#if USE_FAST_TLS_KEY

View File

@ -578,8 +578,7 @@ static void loseCurrent(egl_context_t * cur_c)
SurfaceRef _cur_r(cur_r);
SurfaceRef _cur_d(cur_d);
cur_c->read = NULL;
cur_c->draw = NULL;
cur_c->onLooseCurrent();
_cur_c.release();
_cur_r.release();
@ -687,8 +686,7 @@ EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw,
_c.acquire();
_r.acquire();
_d.acquire();
c->read = read;
c->draw = draw;
c->onMakeCurrent(draw, read);
} else {
setGLHooksThreadSpecific(&gHooksNoContext);
egl_tls_t::setContext(EGL_NO_CONTEXT);
@ -924,7 +922,8 @@ __eglMustCastToProperFunctionPointerType eglGetProcAddress(const char *procname)
cnx->hooks[GLESv1_INDEX]->ext.extensions[slot] =
cnx->hooks[GLESv2_INDEX]->ext.extensions[slot] =
#if EGL_TRACE
debugHooks->ext.extensions[slot] = gHooksTrace.ext.extensions[slot] =
debugHooks->ext.extensions[slot] =
gHooksTrace.ext.extensions[slot] =
#endif
cnx->egl.eglGetProcAddress(procname);
}

View File

@ -61,6 +61,42 @@ bool egl_object_t::get(egl_display_t const* display, egl_object_t* object) {
return display->getObject(object);
}
// ----------------------------------------------------------------------------
egl_context_t::egl_context_t(EGLDisplay dpy, EGLContext context, EGLConfig config,
int impl, egl_connection_t const* cnx, int version) :
egl_object_t(get_display(dpy)), dpy(dpy), context(context),
config(config), read(0), draw(0), impl(impl), cnx(cnx),
version(version)
{
}
void egl_context_t::onLooseCurrent() {
read = NULL;
draw = NULL;
}
void egl_context_t::onMakeCurrent(EGLSurface draw, EGLSurface read) {
this->read = read;
this->draw = draw;
/*
* Here we cache the GL_EXTENSIONS string for this context and we
* add the extensions always handled by the wrapper
*/
if (gl_extensions.isEmpty()) {
// call the implementation's glGetString(GL_EXTENSIONS)
const char* exts = (const char *)gEGLImpl[impl].hooks[version]->gl.glGetString(GL_EXTENSIONS);
gl_extensions.setTo(exts);
if (gl_extensions.find("GL_EXT_debug_marker") < 0) {
String8 temp("GL_EXT_debug_marker ");
temp.append(gl_extensions);
gl_extensions.setTo(temp);
}
}
}
// ----------------------------------------------------------------------------
}; // namespace android
// ----------------------------------------------------------------------------

View File

@ -28,6 +28,7 @@
#include <GLES/glext.h>
#include <utils/threads.h>
#include <utils/String8.h>
#include <system/window.h>
@ -158,11 +159,11 @@ public:
typedef egl_object_t::LocalRef<egl_context_t, EGLContext> Ref;
egl_context_t(EGLDisplay dpy, EGLContext context, EGLConfig config,
int impl, egl_connection_t const* cnx, int version) :
egl_object_t(get_display(dpy)), dpy(dpy), context(context),
config(config), read(0), draw(0), impl(impl), cnx(cnx),
version(version) {
}
int impl, egl_connection_t const* cnx, int version);
void onLooseCurrent();
void onMakeCurrent(EGLSurface draw, EGLSurface read);
EGLDisplay dpy;
EGLContext context;
EGLConfig config;
@ -171,6 +172,7 @@ public:
int impl;
egl_connection_t const* cnx;
int version;
String8 gl_extensions;
};
class egl_image_t: public egl_object_t {

View File

@ -58,6 +58,7 @@ extern gl_hooks_t gHooks[2][IMPL_NUM_IMPLEMENTATIONS];
extern gl_hooks_t gHooksNoContext;
extern pthread_key_t gGLWrapperKey;
extern "C" void gl_unimplemented();
extern "C" void gl_noop();
extern char const * const gl_names[];
extern char const * const egl_names[];

View File

@ -110,6 +110,20 @@ extern "C" {
#undef CALL_GL_API
#undef CALL_GL_API_RETURN
/*
* glGetString() is special because we expose some extensions in the wrapper
*/
extern "C" const GLubyte * __glGetString(GLenum name);
const GLubyte * glGetString(GLenum name)
{
const GLubyte * ret = egl_get_string_for_current_context(name);
if (ret == NULL) {
ret = __glGetString(name);
}
return ret;
}
/*
* These GL calls are special because they need to EGL to retrieve some

View File

@ -211,7 +211,7 @@ void API_ENTRY(glGetShaderPrecisionFormat)(GLenum shadertype, GLenum precisionty
void API_ENTRY(glGetShaderSource)(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source) {
CALL_GL_API(glGetShaderSource, shader, bufsize, length, source);
}
const GLubyte* API_ENTRY(glGetString)(GLenum name) {
const GLubyte* API_ENTRY(__glGetString)(GLenum name) {
CALL_GL_API_RETURN(glGetString, name);
}
void API_ENTRY(glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat* params) {

View File

@ -165,6 +165,20 @@ extern "C" {
#undef CALL_GL_API
#undef CALL_GL_API_RETURN
/*
* glGetString() is special because we expose some extensions in the wrapper
*/
extern "C" const GLubyte * __glGetString(GLenum name);
const GLubyte * glGetString(GLenum name)
{
const GLubyte * ret = egl_get_string_for_current_context(name);
if (ret == NULL) {
ret = __glGetString(name);
}
return ret;
}
/*
* These GL calls are special because they need to EGL to retrieve some

View File

@ -262,7 +262,7 @@ void API_ENTRY(glGetMaterialxv)(GLenum face, GLenum pname, GLfixed *params) {
void API_ENTRY(glGetPointerv)(GLenum pname, GLvoid **params) {
CALL_GL_API(glGetPointerv, pname, params);
}
const GLubyte * API_ENTRY(glGetString)(GLenum name) {
const GLubyte * API_ENTRY(__glGetString)(GLenum name) {
CALL_GL_API_RETURN(glGetString, name);
}
void API_ENTRY(glGetTexEnviv)(GLenum env, GLenum pname, GLint *params) {

View File

@ -29,6 +29,7 @@
namespace android {
// ----------------------------------------------------------------------------
EGLAPI const GLubyte * egl_get_string_for_current_context(GLenum name);
EGLAPI EGLImageKHR egl_get_image_for_current_context(EGLImageKHR image);
// ----------------------------------------------------------------------------

View File

@ -43,6 +43,9 @@ while (my $line = <>) {
if ($name eq "glEGLImageTargetRenderbufferStorageOES") {
$prefix = "__";
}
if ($name eq "glGetString") {
$prefix = "__";
}
printf("%s API_ENTRY(%s%s)(%s)", $type, $prefix, $name, $args);