[Mesa-dev] [PATCH] scons: Add support for GLES.

Chia-I Wu olvaffe at gmail.com
Fri Jan 21 01:04:26 PST 2011


On Fri, Jan 21, 2011 at 12:18 AM, José Fonseca <jfonseca at vmware.com> wrote:
> Hi Olv,
>
> Looks good to me FWIW.
Thanks.
> I think we should avoid having opengl32.dll or the ICD loading
> glapi.dll, but that's not a reason to s given you've made it optional.
How to make scons build an ICD?  I have to make opengl32.dll load
libglapi.dll, instead of statically linked, because _glapi_* are
declared __declspec(dllimport).  It might make some sense to not build
opengl32.dll when gles=yes is given.
> Implementing EGL on Windows without implementing GL doesn't make much
> sense, so we could have GLES libraries dynamically loading the ICD or
> something like that. On Windows CE EGL story would be different though
> -- but I'm not familiar with the ABIs there.
>
> BTW, I'm very happy to see somebody else to serious changes on scons.
> See also
> http://www.reddit.com/r/programming/comments/eyl75/i_saw_a_book_entitled_die_gnu_autotools_and_i/ for a laugh. ;-)
Good one :)
> Jose
>
> On Thu, 2011-01-20 at 06:23 -0800, Chia-I Wu wrote:
>> From: Chia-I Wu <olv at lunarg.com>
>>
>> GLES can be enabled by running scons with
>>
>>   $ scons gles=yes
>>
>> When gles=yes is given, the build is changed in three ways.  First,
>> libmesa.a will be built with FEATURE_ES1 and FEATURE_ES2.  This makes
>> DRI drivers and libEGL support and advertise GLES support.  Second, GLES
>> libraries will be created.  They are libGLESv1_CM, libGLESv2, and
>> libglapi.  Last, libGL or opengl32 will link to libglapi.  This change
>> is required as _glapi_* will be declared as __declspec(dllimport) in
>> libmesa.a on windows.  libmesa.a expects those symbols to be defined in
>> another DLL.  Due to this change to GL, GLES support is marked
>> experimental.
>>
>> Note that GLES requires libxml2-python to generate some of its sources.
>> The Windows build is tested with samples from
>>
>>   http://code.google.com/p/angleproject/
>> ---
>>  SConstruct                                  |    6 ++
>>  common.py                                   |    1 +
>>  src/SConscript                              |    7 ++
>>  src/gallium/state_trackers/wgl/SConscript   |    3 +
>>  src/gallium/state_trackers/wgl/stw_device.c |    3 +
>>  src/gallium/targets/egl-static/SConscript   |   16 +++-
>>  src/gallium/targets/libgl-gdi/SConscript    |    6 ++
>>  src/gallium/targets/libgl-xlib/SConscript   |    6 ++
>>  src/mapi/glapi/SConscript                   |    5 +
>>  src/mapi/glapi/glapi.h                      |    5 -
>>  src/mapi/shared-glapi/SConscript            |  116 +++++++++++++++++++++++++++
>>  src/mesa/SConscript                         |   63 +++++++++++++++
>>  12 files changed, 228 insertions(+), 9 deletions(-)
>>  create mode 100644 src/mapi/shared-glapi/SConscript
>>
>> diff --git a/SConstruct b/SConstruct
>> index 368ad83..a2c2047 100644
>> --- a/SConstruct
>> +++ b/SConstruct
>> @@ -56,6 +56,12 @@ else:
>>
>>  Help(opts.GenerateHelpText(env))
>>
>> +# fail early for a common error on windows
>> +if env['gles']:
>> +    try:
>> +        import libxml2
>> +    except ImportError:
>> +        raise SCons.Errors.UserError, "GLES requires libxml2-python to build"
>>
>>  #######################################################################
>>  # Environment setup
>> diff --git a/common.py b/common.py
>> index 76184d5..cbb6162 100644
>> --- a/common.py
>> +++ b/common.py
>> @@ -90,6 +90,7 @@ def AddOptions(opts):
>>         opts.Add(EnumOption('platform', 'target platform', host_platform,
>>                                                                                          allowed_values=('linux', 'cell', 'windows', 'winddk', 'wince', 'darwin', 'embedded', 'cygwin', 'sunos5', 'freebsd8')))
>>         opts.Add('toolchain', 'compiler toolchain', default_toolchain)
>> +       opts.Add(BoolOption('gles', 'EXPERIMENTAL: enable OpenGL ES support', 'no'))
>>         opts.Add(BoolOption('llvm', 'use LLVM', default_llvm))
>>         opts.Add(BoolOption('debug', 'DEPRECATED: debug build', 'yes'))
>>         opts.Add(BoolOption('profile', 'DEPRECATED: profile build', 'no'))
>> diff --git a/src/SConscript b/src/SConscript
>> index 201812c..06c6f94 100644
>> --- a/src/SConscript
>> +++ b/src/SConscript
>> @@ -8,6 +8,10 @@ else:
>>      Export('talloc')
>>
>>  SConscript('glsl/SConscript')
>> +# When env['gles'] is set, the targets defined in mapi/glapi/SConscript are not
>> +# used.  libgl-xlib and libgl-gdi adapt themselves to use the targets defined
>> +# in mapi/glapi-shared/SConscript.  mesa/SConscript also adapts itself to
>> +# enable OpenGL ES support.
>>  SConscript('mapi/glapi/SConscript')
>>  SConscript('mesa/SConscript')
>>
>> @@ -17,5 +21,8 @@ if env['platform'] != 'embedded':
>>      SConscript('egl/main/SConscript')
>>      SConscript('glut/glx/SConscript')
>>
>> +    if env['gles']:
>> +        SConscript('mapi/shared-glapi/SConscript')
>> +
>>  SConscript('gallium/SConscript')
>>
>> diff --git a/src/gallium/state_trackers/wgl/SConscript b/src/gallium/state_trackers/wgl/SConscript
>> index 1b7597d..7cb953b 100644
>> --- a/src/gallium/state_trackers/wgl/SConscript
>> +++ b/src/gallium/state_trackers/wgl/SConscript
>> @@ -15,6 +15,9 @@ env.AppendUnique(CPPDEFINES = [
>>      'BUILD_GL32', # declare gl* as __declspec(dllexport) in Mesa headers
>>      'WIN32_LEAN_AND_MEAN', # http://msdn2.microsoft.com/en-us/library/6dwk3a1z.aspx
>>  ])
>> +if not env['gles']:
>> +    # prevent _glapi_* from being declared __declspec(dllimport)
>> +    env.Append(CPPDEFINES = ['_GLAPI_NO_EXPORTS'])
>>
>>  sources = [
>>      'stw_context.c',
>> diff --git a/src/gallium/state_trackers/wgl/stw_device.c b/src/gallium/state_trackers/wgl/stw_device.c
>> index c4822d4..4ece4e4 100644
>> --- a/src/gallium/state_trackers/wgl/stw_device.c
>> +++ b/src/gallium/state_trackers/wgl/stw_device.c
>> @@ -170,7 +170,10 @@ stw_cleanup(void)
>>
>>     _glthread_DESTROY_MUTEX(OneTimeLock);
>>
>> +   /* glapi is statically linked: we can call the local destroy function. */
>> +#ifdef _GLAPI_NO_EXPORTS
>>     _glapi_destroy_multithread();
>> +#endif
>>
>>  #ifdef DEBUG
>>     debug_memory_end(stw_dev->memdbg_no);
>> diff --git a/src/gallium/targets/egl-static/SConscript b/src/gallium/targets/egl-static/SConscript
>> index 381ef4e..c978934 100644
>> --- a/src/gallium/targets/egl-static/SConscript
>> +++ b/src/gallium/targets/egl-static/SConscript
>> @@ -58,10 +58,18 @@ if env['platform'] == 'windows':
>>      env.Prepend(LIBS = [
>>          ws_gdi,
>>      ])
>> -else:
>> -    # OpenGL
>> -    env.Append(CPPDEFINES = ['FEATURE_GL=1'])
>> -    env.Prepend(LIBS = ['GL', 'talloc', glsl, mesa])
>> +
>> +# OpenGL ES and OpenGL
>> +if env['gles']:
>> +    env.Append(CPPDEFINES = [
>> +        'FEATURE_GL=1',
>> +        'FEATURE_ES1=1',
>> +        'FEATURE_ES2=1'
>> +    ])
>> +    env.Prepend(LIBPATH = [shared_glapi.dir])
>> +    # manually add LIBPREFIX on windows
>> +    glapi_name = 'glapi' if env['platform'] != 'windows' else 'libglapi'
>> +    env.Prepend(LIBS = [glapi_name, talloc, glsl, mesa])
>>
>>  # OpenVG
>>  if True:
>> diff --git a/src/gallium/targets/libgl-gdi/SConscript b/src/gallium/targets/libgl-gdi/SConscript
>> index 6fa0851..c088d4c 100644
>> --- a/src/gallium/targets/libgl-gdi/SConscript
>> +++ b/src/gallium/targets/libgl-gdi/SConscript
>> @@ -37,6 +37,12 @@ drivers += [trace, rbug]
>>
>>  env['no_import_lib'] = 1
>>
>> +# when GLES is enabled, gl* and _glapi_* belong to bridge_glapi and
>> +# shared_glapi respectively
>> +if env['gles']:
>> +    env.Prepend(LIBPATH = [shared_glapi.dir])
>> +    glapi = [bridge_glapi, 'libglapi']
>> +
>>  opengl32 = env.SharedLibrary(
>>      target ='opengl32',
>>      source = sources,
>> diff --git a/src/gallium/targets/libgl-xlib/SConscript b/src/gallium/targets/libgl-xlib/SConscript
>> index d932736..9bb0a56 100644
>> --- a/src/gallium/targets/libgl-xlib/SConscript
>> +++ b/src/gallium/targets/libgl-xlib/SConscript
>> @@ -16,6 +16,12 @@ env.Append(CPPDEFINES = ['USE_XSHM'])
>>
>>  env.Prepend(LIBS = env['X11_LIBS'])
>>
>> +# when GLES is enabled, gl* and _glapi_* belong to bridge_glapi and
>> +# shared_glapi respectively
>> +if env['gles']:
>> +    env.Prepend(LIBPATH = [shared_glapi.dir])
>> +    glapi = [bridge_glapi, 'glapi']
>> +
>>  env.Prepend(LIBS = [
>>      st_xlib,
>>      ws_xlib,
>> diff --git a/src/mapi/glapi/SConscript b/src/mapi/glapi/SConscript
>> index 4057991..276b216 100644
>> --- a/src/mapi/glapi/SConscript
>> +++ b/src/mapi/glapi/SConscript
>> @@ -17,6 +17,11 @@ if env['platform'] != 'winddk':
>>              '_GDI32_', # prevent gl* being declared __declspec(dllimport) in MS headers
>>              'BUILD_GL32', # declare gl* as __declspec(dllexport) in Mesa headers
>>          ])
>> +        if env['gles']:
>> +            env.Append(CPPDEFINES = ['_GLAPI_DLL_EXPORTS'])
>> +        else:
>> +            # prevent _glapi_* from being declared __declspec(dllimport)
>> +            env.Append(CPPDEFINES = ['_GLAPI_NO_EXPORTS'])
>>
>>      env.Append(CPPPATH = [
>>          '#/src/mapi',
>> diff --git a/src/mapi/glapi/glapi.h b/src/mapi/glapi/glapi.h
>> index 8cca504..e909cf8 100644
>> --- a/src/mapi/glapi/glapi.h
>> +++ b/src/mapi/glapi/glapi.h
>> @@ -45,11 +45,6 @@
>>  #define _GLAPI_H
>>
>>
>> -/* opengl.dll does not export _glapi_* */
>> -#if defined(_WIN32)
>> -#define _GLAPI_NO_EXPORTS
>> -#endif
>> -
>>  #ifdef _GLAPI_NO_EXPORTS
>>  #  define _GLAPI_EXPORT
>>  #else /* _GLAPI_NO_EXPORTS */
>> diff --git a/src/mapi/shared-glapi/SConscript b/src/mapi/shared-glapi/SConscript
>> new file mode 100644
>> index 0000000..b7c43a7
>> --- /dev/null
>> +++ b/src/mapi/shared-glapi/SConscript
>> @@ -0,0 +1,116 @@
>> +#######################################################################
>> +# SConscript for shared-glapi/es1api/es2api
>> +
>> +from sys import executable as python_cmd
>> +
>> +Import('*')
>> +
>> +def mapi_objects(env, printer, mode):
>> +    """Return mapi objects built for the given printer and mode."""
>> +    mapi_sources = {
>> +        'glapi': ['entry.c', 'mapi_glapi.c', 'stub.c', 'table.c',
>> +                  'u_current.c', 'u_execmem.c', 'u_thread.c'],
>> +        'bridge': ['entry.c'],
>> +    }
>> +    mapi_defines = {
>> +        'glapi': ['MAPI_MODE_GLAPI'],
>> +        'bridge': ['MAPI_MODE_BRIDGE'],
>> +    }
>> +
>> +    header_name = '%s-tmp.h' % (printer)
>> +
>> +    # generate ABI header
>> +    header = env.CodeGenerate(
>> +        target = header_name,
>> +        script = '../mapi/mapi_abi.py',
>> +        source = '../glapi/gen/gl_and_es_API.xml',
>> +        command = python_cmd + ' $SCRIPT ' + \
>> +                '--printer %s --mode lib $SOURCE > $TARGET' % (printer),
>> +    )
>> +
>> +    cpppath = [
>> +        header[0].dir,
>> +        '#/include',
>> +        '#/src/mapi',
>> +    ]
>> +
>> +    cppdefines = mapi_defines[mode] + [
>> +        'MAPI_ABI_HEADER=\\"%s\\"' % (header_name),
>> +    ]
>> +
>> +    if env['platform'] == 'windows':
>> +        if mode == 'glapi':
>> +            cppdefines += [
>> +                '_GLAPI_DLL_EXPORTS', # declare _glapi_* as __declspec(dllexport) in glapi.h
>> +            ]
>> +        else:
>> +            cppdefines += [
>> +                '_GDI32_', # prevent gl* being declared __declspec(dllimport) in MS headers
>> +                'BUILD_GL32', # declare gl* as __declspec(dllexport) in Mesa headers
>> +            ]
>> +
>> +    objects = []
>> +    for s in mapi_sources[mode]:
>> +        o = env.SharedObject(
>> +            target = '%s-%s' % (printer, s[:-2]),
>> +            source = '../mapi/' + s,
>> +            CPPPATH = cpppath,
>> +            CPPDEFINES = cppdefines,
>> +        )
>> +        objects.append(o[0])
>> +
>> +    env.Depends(objects, header)
>> +
>> +    return objects
>> +
>> +if env['platform'] != 'winddk':
>> +    env = env.Clone()
>> +
>> +    env['SHLIBPREFIX'] = 'lib'
>> +    env['LIBPREFIX'] = 'lib'
>> +
>> +    shared_glapi_objects = mapi_objects(env, 'shared-glapi', 'glapi')
>> +    shared_glapi = env.SharedLibrary(
>> +        target = 'glapi',
>> +        source = shared_glapi_objects,
>> +    )
>> +
>> +    # manually add LIBPREFIX on windows
>> +    if env['platform'] == 'windows':
>> +        libs = ['libglapi']
>> +    else:
>> +        libs = ['glapi']
>> +
>> +    es1api_objects = mapi_objects(env, 'es1api', 'bridge')
>> +    es1api = env.SharedLibrary(
>> +        target = 'GLESv1_CM',
>> +        source = es1api_objects,
>> +        LIBPATH = ['.'],
>> +        LIBS = libs,
>> +    )
>> +
>> +    es2api_objects = mapi_objects(env, 'es2api', 'bridge')
>> +    es2api = env.SharedLibrary(
>> +        target = 'GLESv2',
>> +        source = es2api_objects,
>> +        LIBPATH = ['.'],
>> +        LIBS = libs,
>> +    )
>> +
>> +    env.InstallSharedLibrary(shared_glapi, version=(0, 0, 0))
>> +    env.InstallSharedLibrary(es1api, version=(1, 0, 0))
>> +    env.InstallSharedLibrary(es2api, version=(2, 0, 0))
>> +
>> +    if env['platform'] == 'windows':
>> +        shared_glapi = env.FindIxes(shared_glapi, 'LIBPREFIX', 'LIBSUFFIX')
>> +    else:
>> +        shared_glapi = env.FindIxes(shared_glapi, 'SHLIBPREFIX', 'SHLIBSUFFIX')
>> +
>> +    # build glapi bridge as a convenience libarary for libgl-xlib/libgl-gdi
>> +    bridge_glapi_objects = mapi_objects(env, 'glapi', 'bridge')
>> +    bridge_glapi = env.ConvenienceLibrary(
>> +        target = 'glapi_bridge',
>> +        source = bridge_glapi_objects,
>> +    )
>> +
>> +    Export(['shared_glapi', 'bridge_glapi'])
>> diff --git a/src/mesa/SConscript b/src/mesa/SConscript
>> index cc4ad09..7c7c7c3 100644
>> --- a/src/mesa/SConscript
>> +++ b/src/mesa/SConscript
>> @@ -12,11 +12,19 @@ env.Append(CPPPATH = [
>>      '#/src/mesa',
>>  ])
>>
>> +env.Append(CPPDEFINES = [
>> +    'FEATURE_GL=1',
>> +])
>> +
>>  if env['platform'] == 'windows':
>>      env.Append(CPPDEFINES = [
>>          '_GDI32_', # prevent gl* being declared __declspec(dllimport) in MS headers
>>          'BUILD_GL32', # declare gl* as __declspec(dllexport) in Mesa headers
>>      ])
>> +    if not env['gles']:
>> +        # prevent _glapi_* from being declared __declspec(dllimport)
>> +        env.Append(CPPDEFINES = ['_GLAPI_NO_EXPORTS'])
>> +
>>      env.Prepend(CPPPATH = ['#src/talloc'])
>>  else:
>>      env.Append(CPPDEFINES = [
>> @@ -240,6 +248,61 @@ mesa_sources = (
>>      statetracker_sources
>>  )
>>
>> +if env['gles']:
>> +    from sys import executable as python_cmd
>> +
>> +    env.Append(CPPDEFINES = ['FEATURE_ES1=1', 'FEATURE_ES2=1'])
>> +
>> +    # generate GLES sources
>> +    gles_sources = []
>> +    gles_sources += env.CodeGenerate(
>> +        target = 'main/api_exec_es1.c',
>> +        script = 'main/es_generator.py',
>> +        source = 'main/APIspec.xml',
>> +        command = python_cmd + ' $SCRIPT -S $SOURCE -V GLES1.1 > $TARGET'
>> +    )
>> +    gles_sources += env.CodeGenerate(
>> +        target = 'main/api_exec_es2.c',
>> +        script = 'main/es_generator.py',
>> +        source = 'main/APIspec.xml',
>> +        command = python_cmd + ' $SCRIPT -S $SOURCE -V GLES2.0 > $TARGET'
>> +    )
>> +
>> +    # generate GLES headers
>> +    GLAPI = '#src/mapi/glapi/'
>> +    gles_headers = []
>> +    gles_headers += env.CodeGenerate(
>> +        target = 'es1api/main/glapidispatch.h',
>> +        script = GLAPI + 'gen/gl_table.py',
>> +        source = GLAPI + 'gen-es/es1_API.xml',
>> +        command = python_cmd + ' $SCRIPT -c -m remap_table -f $SOURCE > $TARGET',
>> +    )
>> +    gles_headers += env.CodeGenerate(
>> +        target = 'es1api/main/remap_helper.h',
>> +        script = GLAPI + 'gen/remap_helper.py',
>> +        source = GLAPI + 'gen-es/es1_API.xml',
>> +        command = python_cmd + ' $SCRIPT -f $SOURCE > $TARGET',
>> +    )
>> +    gles_headers += env.CodeGenerate(
>> +        target = 'es2api/main/glapidispatch.h',
>> +        script = GLAPI + 'gen/gl_table.py',
>> +        source = GLAPI + 'gen-es/es2_API.xml',
>> +        command = python_cmd + ' $SCRIPT -c -m remap_table -f $SOURCE > $TARGET',
>> +    )
>> +    gles_headers += env.CodeGenerate(
>> +        target = 'es2api/main/remap_helper.h',
>> +        script = GLAPI + 'gen/remap_helper.py',
>> +        source = GLAPI + 'gen-es/es2_API.xml',
>> +        command = python_cmd + ' $SCRIPT -f $SOURCE > $TARGET',
>> +    )
>> +
>> +    env.Depends(gles_sources, gles_headers)
>> +
>> +    # gles_sources #include gles_headers with full path
>> +    env.Append(CPPPATH = [gles_headers[0].dir.up().up()])
>> +
>> +    mesa_sources += gles_sources
>> +
>>  #
>>  # Assembly sources
>>  #
>> --
>> 1.7.2.3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
>
>



-- 
olv at LunarG.com


More information about the mesa-dev mailing list