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:
parent
453851f3a0
commit
48d438d05f
|
@ -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++;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
// ----------------------------------------------------------------------------
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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[];
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue