[Mesa-stable] [PATCH] mesa_glinterop: allow building without X and related headers

Emil Velikov emil.l.velikov at gmail.com
Wed Oct 12 19:33:58 UTC 2016


On 12 October 2016 at 19:15, Chih-Wei Huang <cwhuang at android-x86.org> wrote:
> 2016-10-13 1:49 GMT+08:00 Emil Velikov <emil.l.velikov at gmail.com>:
>> This commit effectively reverts c10dcb2ce837922c6ee4e191e6d6202098a5ee10
>> and fixes the typedef redefinition which inspired it.
>>
>> In order to prevent requiring X packages at build time earlier commit
>> forward declared the required X/GLX typedefs. Since that approach
>> introduced typedef redefinition (a C11 feature) it was reverted.
>>
>> To avoid the redefinition while _not_ mandating X and related headers
>> forward declare the structs and use those through the header.
>>
>> As anyone uses the mesa interop header they ensure that the X (or others
>> in terms of EGL) headers are included, which ensures that everything is
>> resolved within the compilation unit.
>>
>> Cc: Vinson Lee <vlee at freedesktop.org>
>> Cc: "12.0" <mesa-stable at lists.freedesktop.org>
>> Cc: Tapani Pälli <tapani.palli at intel.com>
>> Cc: Chih-Wei Huang <cwhuang at android-x86.org>
>> Fixes: c10dcb2ce837 ("Revert "mesa_glinterop: remove inclusion of GLX
>> header"")
>> Fixes: 8472045b16b3 ("mesa_glinterop: remove inclusion of GLX header")
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96770
>> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
>> ---
>> TL;DR; Yay typedefs, because they make things so much better ;-)
>>
>> Tapani/Chih-Wei, this should fix the breakage that you are seing. Please
>> let me know if it sorts things on your end.
>>
>> Vison, this should resolve things on your end as well. A confirmation
>> would be great.
>> ---
>>  include/GL/mesa_glinterop.h | 13 ++++++++-----
>>  1 file changed, 8 insertions(+), 5 deletions(-)
>>
>> diff --git a/include/GL/mesa_glinterop.h b/include/GL/mesa_glinterop.h
>> index c6a967e..173476a 100644
>> --- a/include/GL/mesa_glinterop.h
>> +++ b/include/GL/mesa_glinterop.h
>> @@ -52,12 +52,15 @@
>>
>>  #include <stddef.h>
>>  #include <stdint.h>
>> -#include <GL/glx.h>
>>
>>  #ifdef __cplusplus
>>  extern "C" {
>>  #endif
>>
>> +/* Forward declarations to avoid inclusion of GL/glx.h */
>> +struct _XDisplay;
>> +struct __GLXcontextRec;
>> +
>>  /* Forward declarations to avoid inclusion of EGL/egl.h */
>>  typedef void *EGLDisplay;
>>  typedef void *EGLContext;
>> @@ -243,7 +246,7 @@ struct mesa_glinterop_export_out {
>>   * \return MESA_GLINTEROP_SUCCESS or MESA_GLINTEROP_* != 0 on error
>>   */
>>  int
>> -MesaGLInteropGLXQueryDeviceInfo(Display *dpy, GLXContext context,
>> +MesaGLInteropGLXQueryDeviceInfo(struct _XDisplay *dpy, struct __GLXcontextRec *context,
>>                                  struct mesa_glinterop_device_info *out);
>>
>>
>> @@ -268,7 +271,7 @@ MesaGLInteropEGLQueryDeviceInfo(EGLDisplay dpy, EGLContext context,
>>   * \return MESA_GLINTEROP_SUCCESS or MESA_GLINTEROP_* != 0 on error
>>   */
>>  int
>> -MesaGLInteropGLXExportObject(Display *dpy, GLXContext context,
>> +MesaGLInteropGLXExportObject(struct _XDisplay *dpy, struct __GLXcontextRec *context,
>>                               struct mesa_glinterop_export_in *in,
>>                               struct mesa_glinterop_export_out *out);
>>
>> @@ -283,11 +286,11 @@ MesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context,
>>                               struct mesa_glinterop_export_out *out);
>>
>>
>> -typedef int (PFNMESAGLINTEROPGLXQUERYDEVICEINFOPROC)(Display *dpy, GLXContext context,
>> +typedef int (PFNMESAGLINTEROPGLXQUERYDEVICEINFOPROC)(struct _XDisplay *dpy, struct __GLXcontextRec *context,
>>                                                       struct mesa_glinterop_device_info *out);
>>  typedef int (PFNMESAGLINTEROPEGLQUERYDEVICEINFOPROC)(EGLDisplay dpy, EGLContext context,
>>                                                       struct mesa_glinterop_device_info *out);
>> -typedef int (PFNMESAGLINTEROPGLXEXPORTOBJECTPROC)(Display *dpy, GLXContext context,
>> +typedef int (PFNMESAGLINTEROPGLXEXPORTOBJECTPROC)(struct _XDisplay *dpy, struct __GLXcontextRec *context,
>>                                                    struct mesa_glinterop_export_in *in,
>>                                                    struct mesa_glinterop_export_out *out);
>>  typedef int (PFNMESAGLINTEROPEGLEXPORTOBJECTPROC)(EGLDisplay dpy, EGLContext context,
>> --
>> 2.10.0
>>
>
> Build OK on Android 7.0. Thanks!
>
> BTW, the typedef EGLDisplay and EGLContext
> has similar redefinition issues.
> Should we fix them in the same way?
>
Yes and no... for EGL the actual typedefs vary based on some very
"interesting" and fragile heuristics. So one would either need to a)
import the here (very bad idea), b) see how my earlier series to
untangle it goes [1] and use the 'generic' typedef or c) see if is an
actual issue somewhere and worry about it then.

I'm leaning towards the last one ;-)
Emil

[1] https://patchwork.freedesktop.org/series/12778/


More information about the mesa-stable mailing list