[PATCH 0/7] Add tracing and retracing for EGL (with desktop GL)

José Fonseca jose.r.fonseca at gmail.com
Sun Nov 6 02:22:10 PST 2011


On Fri, Nov 4, 2011 at 7:05 AM, Chia-I Wu <olvaffe at gmail.com> wrote:
> On Fri, Nov 4, 2011 at 7:04 AM, José Fonseca <jose.r.fonseca at gmail.com> wrote:
>> On Thu, Nov 3, 2011 at 10:56 AM, Chia-I Wu <olvaffe at gmail.com> wrote:
>>> Hi list,
>>>
>>> We, at LunarG, use apitrace to trace GLES apps on Android.  This is an attemp
>>> to contribute back our changes to apitrace, mainly to add support for EGL and
>>> GLES.  In this first series, EGL (with desktop GL) support is added.
>>>
>>> Following this, I'd like to send an RFC series to add GLES support.  If you'd
>>> like to see the complete changes to determine whether this series is to be
>>> accepted, the changes for GLES are available on github
>>>
>>>  https://github.com/olvaffe/apitrace/tree/gles
>>>
>>> I could also send that RFC series to the list if that is preferred.
>>>
>>> This series adds a new target, egltrace.so, when EGL is found on the system.
>>> It is supposed to be used like glxtrace.so, but is for EGL/OpenGL apps.  They
>>> are tested with demos from Mesa demos repository.
>>>
>>> For now, only EGL 1.4 functions are traced.  No extensions are supported.
>>> This could limit its usefulness a lot, but I'd like to get the infrastructure
>>> ready first before expanding it to be more complete and useable.
>>>
>>> If you try to use it with an EGL/GLES app, first of all, the trace file will
>>> be incomplete as GLES specific functions are not intercepted.  And when you
>>> run glretrace on it, glretrace will abort with a warning when the first call
>>> to eglCreateContext is retraced.
>>
>> Hi Olv,
>>
>> Thank you and LunarG for contributing this. I have't had much personal
>> exposure to EGL/GLES, but it seems to have pickup a lot of interest
>> lately.
>>
>> I'll need a bit more time to go through this series and the branch.
>>
>> I'm not very worry about the new functionality -- I've seen from the
>> LunarG website that works pretty well --, but I'd like to understand
>> better how it will interact with existing full GL support, given that
>> some GLES entrypoints have same names as full GL. So, could you
>> briefly explain what's the plan to handle that? Will GL vs GLES be
>> selected at compile time? Or will GL and GLES be built side-by-side?
>> And how do you envision that we should handle apps that use both GL
>> and GLES?
> In the series to be posted, GLES-specific entrypoints are described in
> specs/glesapi.py.  egltrace.so will have all symbols from glapi.py and
> glesapi.py.  That makes sure all entrypoints, GL or GLES, are
> overridden.

Sounds good.

I like how the interactions with tracing/retracing of full GL have
been minimized, as that means that the likelihood of regressions on
current functionality is minized too, specially on platforms that
don't have EGL/GLES, making easier to merge in master.

> When tracing, egltrace needs to know the client API in use.  It is so
> that the tracer does not check for features that are not available in
> GLES, such as secondary color array or PBO.  For that, the tracer
> should have a local context that caches the necessary GL states:
>
>  struct tracer_context {
>      enum tracer_context_profile profile; // GL, GLES1, GLES2
>      bool user_arrays;
>      bool user_arrays_arb;
>      bool user_arrays_nv;
>  };
>
> It is just a static variable for now, and replaces __user_arrays and
> etc.  Longer term, it can cache more states to avoid any querying that
> is currently done.  For example, it can cache whether there is a PBO
> bound so that there is no need to check
> GL_PIXEL_UNPACK_BUFFER_BINDING.  It should also be a prerequisite to
> support multiple contexts or multiple threaded apps.

Yes, I've been avoiding having per-context tracing state (which is why
user_arrays means "an user array was set in any context"), to avoid
messing with TLS, but it is indeed inevitable.

> GL and GLES can be supported side-by-side in egltrace.so.  EGL says
> nothing about exported symbols of the client API libraries.  But it
> does specify that a function pointer returned by eglGetProcAddress can
> be used for any client API (GL, GLESv1, GLESv2) that supports it.  We
> take the liberty to believe that if an entrypoint exists in more than
> one of the client APIs, all of them will behave the same.  That is the
> case with Mesa when --enable-shared-glapi is given (without the
> option, using both GL and GLES in an app will fail anyway).  Android
> supports that from the beginning.

Sounds good.

> When egltrace.so(/glproc.hpp) needs to look up a symbol, it calls
> __libegl_sym.  Right now, the function just tries both
> eglGetProcAddress and dlsym with RTLD_NEXT to find the symbol.  It
> does not try to find the right libraries to look up the symbol, nor
> override dlopen.  As such, the apps must link to the client API
> libraries at compile-time.

Ok. Is this temporary, or is there a portability issue with hooking dlopen?

> The thing is we ran into a class of apps that we believed use their
> own ELF loader to load and find symbols.  It seems nothing will work
> for them except for installing apitrace as the system's libraries.  We
> do not have that done yet.  But because of those apps, we think it
> might be better to not complicating __libegl_sym while knowing there
> are always corner cases that it cannot handle.

Do they respect LD_LIBRARY_PATH? I believe that that's a more reliable
interception approach than LD_PRELOAD, as it avoids hooking into
dlopen.


Anyway, I've reviewed the egl and gles series, and it looks good overall.

The only bit I prefer done differently is the gles enum pretty name
workaround -- I rather have all GLES enums that are not part of GL
defined on a header in the form:

  #ifndef GL_SOME_GLES_SPECIFIC_ENUM
  #define GL_SOME_GLES_SPECIFIC_ENUM 0xXXXX
  #endif

so that the C++ code can always rely on them being defined, regardless
of platform support.


I'll commit the egl series once I've finished testing on non-Linux platforms.


Jose


More information about the apitrace mailing list