Hi,
This patch series is against opengl-es-v2 branch. It consists of the
patches that are missing due to merge conflicts, and some updates to the
build system to make this branch easier to be tested. After it is
merged, I would like talk the internals of the work to encourage more
testings.
With this patch series, one may
$ make linux-opengl-es
$ make install
in the top directory of mesa. It will install EGL, an EGL driver, and
OpenGL ES state trackers. There are some demos for OpenGL ES that can
be found in progs/es1/xegl/ and progs/es2/xegl/.
--
Regards,
olv
>From 25939c07dda9e64d4be89b8109f27dea18cebedf Mon Sep 17 00:00:00 2001
From: Chia-I Wu <olva...@gmail.com>
Date: Thu, 3 Sep 2009 11:05:06 +0800
Subject: [PATCH 1/6] glapi: Add OpenGL ES compatibility mode to scripts.
When the mode is on, the scripts would generate headers that are
suitable for OpenGL ES. There are two differences. One is that they
will generate function prototypes for OpenGL ES specific functions. The
other is that, when a function has multiple names, SET/GET/CALL macros
would be generated for each of names.
Signed-off-by: Chia-I Wu <olva...@gmail.com>
---
src/mesa/glapi/gl_apitemp.py | 21 ++++++++++++++++---
src/mesa/glapi/gl_offsets.py | 25 ++++++++++++++++++++---
src/mesa/glapi/gl_procs.py | 37 ++++++++++++++++++++++++++++++----
src/mesa/glapi/gl_table.py | 44 ++++++++++++++++++++++++++++++++++++-----
4 files changed, 108 insertions(+), 19 deletions(-)
diff --git a/src/mesa/glapi/gl_apitemp.py b/src/mesa/glapi/gl_apitemp.py
index d4f8b1d..09b0d36 100644
--- a/src/mesa/glapi/gl_apitemp.py
+++ b/src/mesa/glapi/gl_apitemp.py
@@ -30,7 +30,7 @@ import license
import sys, getopt
class PrintGlOffsets(gl_XML.gl_print_base):
- def __init__(self):
+ def __init__(self, es=False):
gl_XML.gl_print_base.__init__(self)
self.name = "gl_apitemp.py (from Mesa)"
@@ -38,6 +38,8 @@ class PrintGlOffsets(gl_XML.gl_print_base):
"""Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
(C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
+ self.es = es
+
self.undef_list.append( "KEYWORD1" )
self.undef_list.append( "KEYWORD1_ALT" )
self.undef_list.append( "KEYWORD2" )
@@ -82,7 +84,14 @@ class PrintGlOffsets(gl_XML.gl_print_base):
else:
dispatch = "DISPATCH"
+ need_proto = False
if not f.is_static_entry_point(name):
+ need_proto = True
+ elif self.es:
+ cat, num = api.get_category_for_name(name)
+ if (cat.startswith("es") or cat.startswith("GL_OES")):
+ need_proto = True
+ if need_proto:
print '%s %s KEYWORD2 NAME(%s)(%s);' % (keyword, f.return_type, n, f.get_parameter_string(name))
print ''
@@ -286,22 +295,26 @@ static _glapi_proc UNUSED_TABLE_NAME[] = {"""
def show_usage():
- print "Usage: %s [-f input_file_name]" % sys.argv[0]
+ print "Usage: %s [-f input_file_name] [-c]" % sys.argv[0]
+ print "-c Enable compatibility with OpenGL ES."
sys.exit(1)
if __name__ == '__main__':
file_name = "gl_API.xml"
try:
- (args, trail) = getopt.getopt(sys.argv[1:], "f:")
+ (args, trail) = getopt.getopt(sys.argv[1:], "f:c")
except Exception,e:
show_usage()
+ es = False
for (arg,val) in args:
if arg == "-f":
file_name = val
+ elif arg == "-c":
+ es = True
api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
- printer = PrintGlOffsets()
+ printer = PrintGlOffsets(es)
printer.Print(api)
diff --git a/src/mesa/glapi/gl_offsets.py b/src/mesa/glapi/gl_offsets.py
index b8b509d..54867b3 100644
--- a/src/mesa/glapi/gl_offsets.py
+++ b/src/mesa/glapi/gl_offsets.py
@@ -30,9 +30,10 @@ import license
import sys, getopt
class PrintGlOffsets(gl_XML.gl_print_base):
- def __init__(self):
+ def __init__(self, es=False):
gl_XML.gl_print_base.__init__(self)
+ self.es = es
self.name = "gl_offsets.py (from Mesa)"
self.header_tag = '_GLAPI_OFFSETS_H_'
self.license = license.bsd_license_template % ( \
@@ -46,6 +47,7 @@ class PrintGlOffsets(gl_XML.gl_print_base):
functions = []
abi_functions = []
+ alias_functions = []
count = 0
for f in api.functionIterateByOffset():
if not f.is_abi():
@@ -54,6 +56,10 @@ class PrintGlOffsets(gl_XML.gl_print_base):
else:
abi_functions.append( f )
+ if self.es:
+ # remember functions with aliases
+ if len(f.entry_points) > 1:
+ alias_functions.append(f)
for f in abi_functions:
print '#define _gloffset_%s %d' % (f.name, f.offset)
@@ -78,26 +84,37 @@ class PrintGlOffsets(gl_XML.gl_print_base):
print ''
print '#endif /* !defined(_GLAPI_USE_REMAP_TABLE) */'
+ if alias_functions:
+ print ''
+ print '/* define aliases for compatibility */'
+ for f in alias_functions:
+ for name in f.entry_points:
+ if name != f.name:
+ print '#define _gloffset_%s _gloffset_%s' % (name, f.name)
return
def show_usage():
- print "Usage: %s [-f input_file_name]" % sys.argv[0]
+ print "Usage: %s [-f input_file_name] [-c]" % sys.argv[0]
+ print " -c Enable compatibility with OpenGL ES."
sys.exit(1)
if __name__ == '__main__':
file_name = "gl_API.xml"
try:
- (args, trail) = getopt.getopt(sys.argv[1:], "f:")
+ (args, trail) = getopt.getopt(sys.argv[1:], "f:c")
except Exception,e:
show_usage()
+ es = False
for (arg,val) in args:
if arg == "-f":
file_name = val
+ elif arg == "-c":
+ es = True
api = gl_XML.parse_GL_API( file_name )
- printer = PrintGlOffsets()
+ printer = PrintGlOffsets(es)
printer.Print( api )
diff --git a/src/mesa/glapi/gl_procs.py b/src/mesa/glapi/gl_procs.py
index cd1a68c..5de61fb 100644
--- a/src/mesa/glapi/gl_procs.py
+++ b/src/mesa/glapi/gl_procs.py
@@ -30,9 +30,10 @@ import gl_XML, glX_XML
import sys, getopt
class PrintGlProcs(gl_XML.gl_print_base):
- def __init__(self, long_strings):
+ def __init__(self, long_strings, es=False):
gl_XML.gl_print_base.__init__(self)
+ self.es = es
self.long_strings = long_strings
self.name = "gl_procs.py (from Mesa)"
self.license = license.bsd_license_template % ( \
@@ -141,6 +142,28 @@ typedef struct {
print '%s GLAPIENTRY gl_dispatch_stub_%u(%s);' % (func.return_type, func.offset, func.get_parameter_string())
break
+ if self.es:
+ categories = {}
+ for func in api.functionIterateByOffset():
+ for n in func.entry_points:
+ cat, num = api.get_category_for_name(n)
+ if (cat.startswith("es") or cat.startswith("GL_OES")):
+ if not categories.has_key(cat):
+ categories[cat] = []
+ proto = 'GLAPI %s GLAPIENTRY %s(%s);' \
+ % (func.return_type, "gl" + n, func.get_parameter_string(n))
+ categories[cat].append(proto)
+ if categories:
+ print ''
+ print '/* OpenGL ES specific prototypes */'
+ print ''
+ keys = categories.keys()
+ keys.sort()
+ for key in keys:
+ print '/* category %s */' % key
+ print "\n".join(categories[key])
+ print ''
+
print '#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */'
print ''
@@ -155,8 +178,9 @@ typedef struct {
def show_usage():
- print "Usage: %s [-f input_file_name] [-m mode]" % sys.argv[0]
- print "mode can be one of:"
+ print "Usage: %s [-f input_file_name] [-m mode] [-c]" % sys.argv[0]
+ print "-c Enable compatibility with OpenGL ES."
+ print "-m mode mode can be one of:"
print " long - Create code for compilers that can handle very"
print " long string constants. (default)"
print " short - Create code for compilers that can only handle"
@@ -167,11 +191,12 @@ if __name__ == '__main__':
file_name = "gl_API.xml"
try:
- (args, trail) = getopt.getopt(sys.argv[1:], "f:m:")
+ (args, trail) = getopt.getopt(sys.argv[1:], "f:m:c")
except Exception,e:
show_usage()
long_string = 1
+ es = False
for (arg,val) in args:
if arg == "-f":
file_name = val
@@ -182,7 +207,9 @@ if __name__ == '__main__':
long_string = 1
else:
show_usage()
+ elif arg == "-c":
+ es = True
api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
- printer = PrintGlProcs(long_string)
+ printer = PrintGlProcs(long_string, es)
printer.Print(api)
diff --git a/src/mesa/glapi/gl_table.py b/src/mesa/glapi/gl_table.py
index 698795f..3bd7569 100644
--- a/src/mesa/glapi/gl_table.py
+++ b/src/mesa/glapi/gl_table.py
@@ -30,9 +30,10 @@ import license
import sys, getopt
class PrintGlTable(gl_XML.gl_print_base):
- def __init__(self):
+ def __init__(self, es=False):
gl_XML.gl_print_base.__init__(self)
+ self.es = es
self.header_tag = '_GLAPI_TABLE_H_'
self.name = "gl_table.py (from Mesa)"
self.license = license.bsd_license_template % ( \
@@ -68,9 +69,10 @@ class PrintGlTable(gl_XML.gl_print_base):
class PrintRemapTable(gl_XML.gl_print_base):
- def __init__(self):
+ def __init__(self, es=False):
gl_XML.gl_print_base.__init__(self)
+ self.es = es
self.header_tag = '_GLAPI_DISPATCH_H_'
self.name = "gl_table.py (from Mesa)"
self.license = license.bsd_license_template % ("(C) Copyright IBM Corporation 2005", "IBM")
@@ -115,6 +117,7 @@ class PrintRemapTable(gl_XML.gl_print_base):
functions = []
abi_functions = []
+ alias_functions = []
count = 0
for f in api.functionIterateByOffset():
if not f.is_abi():
@@ -123,6 +126,11 @@ class PrintRemapTable(gl_XML.gl_print_base):
else:
abi_functions.append( f )
+ if self.es:
+ # remember functions with aliases
+ if len(f.entry_points) > 1:
+ alias_functions.append(f)
+
for f in abi_functions:
print '#define CALL_%s(disp, parameters) (*((disp)->%s)) parameters' % (f.name, f.name)
@@ -162,33 +170,57 @@ class PrintRemapTable(gl_XML.gl_print_base):
print ''
print '#endif /* !defined(_GLAPI_USE_REMAP_TABLE) */'
+
+ if alias_functions:
+ print ''
+ print '/* define aliases for compatibility */'
+ for f in alias_functions:
+ for name in f.entry_points:
+ if name != f.name:
+ print '#define CALL_%s(disp, parameters) CALL_%s(disp, parameters)' % (name, f.name)
+ print '#define GET_%s(disp) GET_%s(disp)' % (name, f.name)
+ print '#define SET_%s(disp, fn) SET_%s(disp, fn)' % (name, f.name)
+ print ''
+
+ print '#if defined(_GLAPI_USE_REMAP_TABLE)'
+ for f in alias_functions:
+ for name in f.entry_points:
+ if name != f.name:
+ print '#define %s_remap_index %s_remap_index' % (name, f.name)
+ print '#endif /* defined(_GLAPI_USE_REMAP_TABLE) */'
+ print ''
+
return
def show_usage():
- print "Usage: %s [-f input_file_name] [-m mode]" % sys.argv[0]
+ print "Usage: %s [-f input_file_name] [-m mode] [-c]" % sys.argv[0]
print " -m mode Mode can be 'table' or 'remap_table'."
+ print " -c Enable compatibility with OpenGL ES."
sys.exit(1)
if __name__ == '__main__':
file_name = "gl_API.xml"
try:
- (args, trail) = getopt.getopt(sys.argv[1:], "f:m:")
+ (args, trail) = getopt.getopt(sys.argv[1:], "f:m:c")
except Exception,e:
show_usage()
mode = "table"
+ es = False
for (arg,val) in args:
if arg == "-f":
file_name = val
elif arg == "-m":
mode = val
+ elif arg == "-c":
+ es = True
if mode == "table":
- printer = PrintGlTable()
+ printer = PrintGlTable(es)
elif mode == "remap_table":
- printer = PrintRemapTable()
+ printer = PrintRemapTable(es)
else:
show_usage()
--
1.6.5
>From e792420ca8357cab76ca82fe0f6ee63f304b233e Mon Sep 17 00:00:00 2001
From: Chia-I Wu <olva...@gmail.com>
Date: Fri, 6 Nov 2009 16:49:04 +0800
Subject: [PATCH 2/6] mesa/es: Fix symbol conflicts and warnings.
drawtex.c was listed in LOCAL_ES1_SOURCES twice. My mistake when
merging the patches.
Also, run gl_apitemp.py with -c to silence warnings and add target
"install".
Signed-off-by: Chia-I Wu <olva...@gmail.com>
---
src/mesa/es/Makefile | 3 +++
src/mesa/es/glapi/Makefile | 2 +-
src/mesa/es/sources.mak | 1 -
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/mesa/es/Makefile b/src/mesa/es/Makefile
index 42347d0..48b11a6 100644
--- a/src/mesa/es/Makefile
+++ b/src/mesa/es/Makefile
@@ -107,6 +107,9 @@ clean:
-rm -f depend
-rm -f *~
+# nothing to install
+install:
+
subdirs:
make -C glapi
make -C $(MESA) asm_subdirs
diff --git a/src/mesa/es/glapi/Makefile b/src/mesa/es/glapi/Makefile
index 5f2aa82..1e32af8 100644
--- a/src/mesa/es/glapi/Makefile
+++ b/src/mesa/es/glapi/Makefile
@@ -52,7 +52,7 @@ endef
$(call gen-glapi,-c)
%/glapitemp.h: $(GLAPI)/gl_apitemp.py $(COMMON)
- $(call gen-glapi)
+ $(call gen-glapi,-c)
%/glprocs.h: $(GLAPI)/gl_procs.py $(COMMON)
$(call gen-glapi,-c)
diff --git a/src/mesa/es/sources.mak b/src/mesa/es/sources.mak
index 11f735d..f00e41b 100644
--- a/src/mesa/es/sources.mak
+++ b/src/mesa/es/sources.mak
@@ -4,7 +4,6 @@ include $(MESA)/sources.mak
LOCAL_ES1_SOURCES := \
main/api_exec_es1.c \
- main/drawtex.c \
main/get_es1.c \
main/specials_es1.c \
main/drawtex.c \
--
1.6.5
>From 9a3059dc2b64b24e9524fad730de8f75cee06d6d Mon Sep 17 00:00:00 2001
From: Chia-I Wu <olva...@gmail.com>
Date: Fri, 6 Nov 2009 15:17:15 +0800
Subject: [PATCH 3/6] mesa/es: Improve support for parallel execution of make.
Running make with -j for the first time might fail because glapi headers
haven't been generated. This commit should make it more reliable.
Signed-off-by: Chia-I Wu <olva...@gmail.com>
---
src/mesa/es/Makefile | 14 ++++++++++----
src/mesa/es/glapi/Makefile | 6 +++++-
2 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/src/mesa/es/Makefile b/src/mesa/es/Makefile
index 48b11a6..8cf2eac 100644
--- a/src/mesa/es/Makefile
+++ b/src/mesa/es/Makefile
@@ -110,11 +110,17 @@ clean:
# nothing to install
install:
-subdirs:
- make -C glapi
- make -C $(MESA) asm_subdirs
+glapi/glapi-stamp:
+ $(MAKE) -C glapi
-depend: $(ES1_ALL_SOURCES) $(ES2_ALL_SOURCES)
+subdirs: glapi/glapi-stamp
+ $(MAKE) -C $(MESA) asm_subdirs
+
+# remove generated sources because "depend" is checked even when "make clean"
+DEPEND_SOURCES := $(filter-out $(GENERATED_SOURCES), $(ES1_ALL_SOURCES) $(ES2_ALL_SOURCES))
+DEPEND_SOURCES := $(filter-out glapi/%, $(DEPEND_SOURCES))
+
+depend: glapi/glapi-stamp $(DEPEND_SOURCES)
@echo "running $(MKDEP)"
@touch depend
@# MESA is "..", but luckily, directories are longer than 2 characters
diff --git a/src/mesa/es/glapi/Makefile b/src/mesa/es/glapi/Makefile
index 1e32af8..1256be9 100644
--- a/src/mesa/es/glapi/Makefile
+++ b/src/mesa/es/glapi/Makefile
@@ -30,7 +30,10 @@ ES2_DEPS = $(ES2_APIXML) base2_API.xml es2_EXT.xml es_EXT.xml \
ES1_OUTPUTS := $(addprefix $(ES1_OUTPUT_DIR)/, $(OUTPUTS))
ES2_OUTPUTS := $(addprefix $(ES2_OUTPUT_DIR)/, $(OUTPUTS))
-all: $(ES1_OUTPUTS) $(ES2_OUTPUTS)
+all: glapi-stamp
+
+glapi-stamp: $(ES1_OUTPUTS) $(ES2_OUTPUTS)
+ @touch glapi-stamp
$(ES1_OUTPUTS): APIXML := $(ES1_APIXML)
$(ES2_OUTPUTS): APIXML := $(ES2_APIXML)
@@ -86,5 +89,6 @@ verify_xml:
@rm -f tmp.xml
clean:
+ -rm -f glapi-stamp
-rm -rf $(ES1_OUTPUT_DIR) $(ES2_OUTPUT_DIR)
-rm -f *~ *.pyc *.pyo
--
1.6.5
>From ba933d76fabca1ece79f920a2615c752246584d7 Mon Sep 17 00:00:00 2001
From: Chia-I Wu <olva...@gmail.com>
Date: Fri, 30 Oct 2009 14:09:09 +0800
Subject: [PATCH 4/6] mesa/main: linear_to_nonlinear is not always available.
Signed-off-by: Chia-I Wu <olva...@gmail.com>
---
src/mesa/main/texgetimage.c | 62 ++++++++++++++++++++++++++----------------
1 files changed, 38 insertions(+), 24 deletions(-)
diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c
index 2f88718..4b0915b 100644
--- a/src/mesa/main/texgetimage.c
+++ b/src/mesa/main/texgetimage.c
@@ -42,30 +42,6 @@
-#if FEATURE_EXT_texture_sRGB
-
-/**
- * Convert a float value from linear space to a
- * non-linear sRGB value in [0, 255].
- * Not terribly efficient.
- */
-static INLINE GLfloat
-linear_to_nonlinear(GLfloat cl)
-{
- /* can't have values outside [0, 1] */
- GLfloat cs;
- if (cl < 0.0031308f) {
- cs = 12.92f * cl;
- }
- else {
- cs = (GLfloat)(1.055 * _mesa_pow(cl, 0.41666) - 0.055);
- }
- return cs;
-}
-
-#endif /* FEATURE_EXT_texture_sRGB */
-
-
/**
* Can the given type represent negative values?
*/
@@ -233,6 +209,29 @@ get_tex_ycbcr(GLcontext *ctx, GLuint dimensions,
}
+#if FEATURE_EXT_texture_sRGB
+
+
+/**
+ * Convert a float value from linear space to a
+ * non-linear sRGB value in [0, 255].
+ * Not terribly efficient.
+ */
+static INLINE GLfloat
+linear_to_nonlinear(GLfloat cl)
+{
+ /* can't have values outside [0, 1] */
+ GLfloat cs;
+ if (cl < 0.0031308f) {
+ cs = 12.92f * cl;
+ }
+ else {
+ cs = (GLfloat)(1.055 * _mesa_pow(cl, 0.41666) - 0.055);
+ }
+ return cs;
+}
+
+
/**
* glGetTexImagefor sRGB pixels;
*/
@@ -284,6 +283,21 @@ get_tex_srgb(GLcontext *ctx, GLuint dimensions,
}
+#else /* FEATURE_EXT_texture_sRGB */
+
+
+static INLINE void
+get_tex_srgb(GLcontext *ctx, GLuint dimensions,
+ GLenum format, GLenum type, GLvoid *pixels,
+ const struct gl_texture_image *texImage)
+{
+ ASSERT_NO_FEATURE();
+}
+
+
+#endif /* FEATURE_EXT_texture_sRGB */
+
+
/**
* glGetTexImagefor RGBA, Luminance, etc. pixels.
* This is the slow way since we use texture sampling.
--
1.6.5
>From 6fcc98e43fade280b17477798af906a65086d002 Mon Sep 17 00:00:00 2001
From: Chia-I Wu <olva...@gmail.com>
Date: Fri, 6 Nov 2009 17:11:43 +0800
Subject: [PATCH 5/6] gallium: Allow state trackers to install files.
State trackers like es or vega need to install their libraries.
Signed-off-by: Chia-I Wu <olva...@gmail.com>
---
src/gallium/state_trackers/Makefile | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/src/gallium/state_trackers/Makefile b/src/gallium/state_trackers/Makefile
index 265ca46..0900efc 100644
--- a/src/gallium/state_trackers/Makefile
+++ b/src/gallium/state_trackers/Makefile
@@ -21,5 +21,9 @@ clean:
rm -f `find . -name depend`
-# Dummy install target
install:
+ @for dir in $(SUBDIRS) ; do \
+ if [ -d $$dir ] ; then \
+ (cd $$dir && $(MAKE) $@) || exit 1 ; \
+ fi \
+ done
--
1.6.5
>From bba48406d95cbf824e7e7b9ac8cf3d61d23fffc2 Mon Sep 17 00:00:00 2001
From: Chia-I Wu <olva...@gmail.com>
Date: Fri, 6 Nov 2009 16:27:19 +0800
Subject: [PATCH 6/6] Add new config for OpenGL ES.
Signed-off-by: Chia-I Wu <olva...@gmail.com>
---
Makefile | 1 +
configs/linux-opengl-es | 21 +++++++++++++++++++++
2 files changed, 22 insertions(+), 0 deletions(-)
create mode 100644 configs/linux-opengl-es
diff --git a/Makefile b/Makefile
index 4c4aba0..5029f72 100644
--- a/Makefile
+++ b/Makefile
@@ -126,6 +126,7 @@ linux-ia64-icc-static \
linux-icc \
linux-icc-static \
linux-llvm \
+linux-opengl-es \
linux-osmesa \
linux-osmesa-static \
linux-osmesa16 \
diff --git a/configs/linux-opengl-es b/configs/linux-opengl-es
new file mode 100644
index 0000000..2ba94b6
--- /dev/null
+++ b/configs/linux-opengl-es
@@ -0,0 +1,21 @@
+# Configuration for OpenGL ES on Linux
+
+include $(TOP)/configs/linux
+
+CONFIG_NAME = linux-opengl-es
+
+# Directories to build
+LIB_DIR = lib
+SRC_DIRS = egl mesa/es gallium gallium/winsys
+PROGRAM_DIRS = es1/xegl es2/xegl
+
+# no mesa or egl drivers
+DRIVER_DIRS =
+EGL_DRIVERS_DIRS =
+
+GALLIUM_DRIVERS_DIRS = softpipe
+
+# build egl_softpipe.so
+GALLIUM_WINSYS_DIRS = egl_xlib
+# and libGLES*.so
+GALLIUM_STATE_TRACKERS_DIRS = es
--
1.6.5
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev