On Fri, Jan 21, 2011 at 12:18 AM, José Fonseca <[email protected]> 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 <[email protected]> >> >> 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 >> [email protected] >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev > > >
-- [email protected] _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
