aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/modules/engines/wayland_egl
diff options
context:
space:
mode:
authorDavid Walter Seikel2012-01-23 23:30:42 +1000
committerDavid Walter Seikel2012-01-23 23:30:42 +1000
commit825a3d837a33f226c879cd02ad15c3fba57e8b2c (patch)
tree75f57bd9c4253508d338dc79ba8e57a7abc42255 /libraries/evas/src/modules/engines/wayland_egl
parentAdd ability to disable the test harness, or the Lua compile test. (diff)
downloadSledjHamr-825a3d837a33f226c879cd02ad15c3fba57e8b2c.zip
SledjHamr-825a3d837a33f226c879cd02ad15c3fba57e8b2c.tar.gz
SledjHamr-825a3d837a33f226c879cd02ad15c3fba57e8b2c.tar.bz2
SledjHamr-825a3d837a33f226c879cd02ad15c3fba57e8b2c.tar.xz
Update the EFL to what I'm actually using, coz I'm using some stuff not yet released.
Diffstat (limited to 'libraries/evas/src/modules/engines/wayland_egl')
-rw-r--r--libraries/evas/src/modules/engines/wayland_egl/Evas_Engine_Wayland_Egl.h42
-rw-r--r--libraries/evas/src/modules/engines/wayland_egl/Makefile.am47
-rw-r--r--libraries/evas/src/modules/engines/wayland_egl/Makefile.in816
-rw-r--r--libraries/evas/src/modules/engines/wayland_egl/evas_engine.c3174
-rw-r--r--libraries/evas/src/modules/engines/wayland_egl/evas_engine.h82
-rw-r--r--libraries/evas/src/modules/engines/wayland_egl/evas_wl_main.c323
6 files changed, 4484 insertions, 0 deletions
diff --git a/libraries/evas/src/modules/engines/wayland_egl/Evas_Engine_Wayland_Egl.h b/libraries/evas/src/modules/engines/wayland_egl/Evas_Engine_Wayland_Egl.h
new file mode 100644
index 0000000..92ffe25
--- /dev/null
+++ b/libraries/evas/src/modules/engines/wayland_egl/Evas_Engine_Wayland_Egl.h
@@ -0,0 +1,42 @@
1#ifndef _EVAS_ENGINE_WAYLAND_EGL_H
2#define _EVAS_ENGINE_WAYLAND_EGL_H
3
4#include <wayland-client.h>
5
6typedef struct _Evas_Engine_Info_Wayland_Egl Evas_Engine_Info_Wayland_Egl;
7
8struct _Evas_Engine_Info_Wayland_Egl
9{
10 /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
11 /* at you and make nasty noises */
12 Evas_Engine_Info magic;
13
14 /* engine specific data & parameters it needs to set up */
15 struct {
16 struct wl_display *display;
17 struct wl_surface *surface;
18 int depth;
19 int screen;
20 int rotation;
21 unsigned int destination_alpha : 1;
22 } info;
23 /* engine specific function calls to query stuff about the destination */
24 /* engine (what visual & colormap & depth to use, performance info etc. */
25 struct {
26 int (*best_depth_get) (Evas_Engine_Info_Wayland_Egl *einfo);
27 } func;
28
29 struct {
30 void (*pre_swap) (void *data, Evas *e);
31 void (*post_swap) (void *data, Evas *e);
32
33 void *data; // data for callback calls
34 } callback;
35
36 /* non-blocking or blocking mode */
37 Evas_Engine_Render_Mode render_mode;
38
39 unsigned char vsync : 1; // does nothing right now
40 unsigned char indirect : 1; // use indirect rendering
41};
42#endif
diff --git a/libraries/evas/src/modules/engines/wayland_egl/Makefile.am b/libraries/evas/src/modules/engines/wayland_egl/Makefile.am
new file mode 100644
index 0000000..100614f
--- /dev/null
+++ b/libraries/evas/src/modules/engines/wayland_egl/Makefile.am
@@ -0,0 +1,47 @@
1
2MAINTAINERCLEANFILES = Makefile.in
3
4AM_CPPFLAGS = \
5-I. \
6-I$(top_srcdir)/src/lib \
7-I$(top_srcdir)/src/lib/include \
8-I$(top_srcdir)/src/modules/engines/gl_common \
9@FREETYPE_CFLAGS@ \
10@PIXMAN_CFLAGS@ \
11@EINA_CFLAGS@ \
12@GL_EET_CFLAGS@ \
13@evas_engine_wayland_egl_cflags@
14
15if BUILD_ENGINE_WAYLAND_EGL
16
17WAYLAND_EGL_SOURCES = \
18evas_engine.c \
19evas_wl_main.c
20
21WAYLAND_EGL_LIBADD = @FREETYPE_LIBS@ @GL_EET_LIBS@ @EINA_LIBS@ @evas_engine_wayland_egl_libs@ $(top_builddir)/src/modules/engines/gl_common/libevas_engine_gl_common.la
22
23includes_HEADERS = Evas_Engine_Wayland_Egl.h
24includesdir = $(includedir)/evas-@VMAJ@
25
26if !EVAS_STATIC_BUILD_WAYLAND_EGL
27
28pkgdir = $(libdir)/evas/modules/engines/wayland_egl/$(MODULE_ARCH)
29pkg_LTLIBRARIES = module.la
30
31module_la_SOURCES = $(WAYLAND_EGL_SOURCES)
32module_la_LIBADD = $(WAYLAND_EGL_LIBADD) $(top_builddir)/src/lib/libevas.la
33module_la_LDFLAGS = -no-undefined -module -avoid-version
34module_la_LIBTOOLFLAGS = --tag=disable-static
35
36
37else
38
39noinst_LTLIBRARIES = libevas_engine_wayland_egl.la
40
41libevas_engine_wayland_egl_la_SOURCES = $(WAYLAND_EGL_SOURCES)
42libevas_engine_wayland_egl_la_LIBADD = $(WAYLAND_EGL_LIBADD)
43
44endif
45endif
46
47EXTRA_DIST = evas_engine.h
diff --git a/libraries/evas/src/modules/engines/wayland_egl/Makefile.in b/libraries/evas/src/modules/engines/wayland_egl/Makefile.in
new file mode 100644
index 0000000..0df0c63
--- /dev/null
+++ b/libraries/evas/src/modules/engines/wayland_egl/Makefile.in
@@ -0,0 +1,816 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/modules/engines/wayland_egl
39DIST_COMMON = $(am__includes_HEADERS_DIST) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \
43 $(top_srcdir)/m4/efl_coverage.m4 \
44 $(top_srcdir)/m4/efl_doxygen.m4 \
45 $(top_srcdir)/m4/efl_fnmatch.m4 \
46 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
47 $(top_srcdir)/m4/evas_check_engine.m4 \
48 $(top_srcdir)/m4/evas_check_loader.m4 \
49 $(top_srcdir)/m4/evas_converter.m4 \
50 $(top_srcdir)/m4/evas_dither.m4 \
51 $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \
52 $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
53 $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
54 $(top_srcdir)/configure.ac
55am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
56 $(ACLOCAL_M4)
57mkinstalldirs = $(install_sh) -d
58CONFIG_HEADER = $(top_builddir)/config.h
59CONFIG_CLEAN_FILES =
60CONFIG_CLEAN_VPATH_FILES =
61am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
62am__vpath_adj = case $$p in \
63 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
64 *) f=$$p;; \
65 esac;
66am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
67am__install_max = 40
68am__nobase_strip_setup = \
69 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
70am__nobase_strip = \
71 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
72am__nobase_list = $(am__nobase_strip_setup); \
73 for p in $$list; do echo "$$p $$p"; done | \
74 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
75 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
76 if (++n[$$2] == $(am__install_max)) \
77 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
78 END { for (dir in files) print dir, files[dir] }'
79am__base_list = \
80 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
81 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
82am__installdirs = "$(DESTDIR)$(pkgdir)" "$(DESTDIR)$(includesdir)"
83LTLIBRARIES = $(noinst_LTLIBRARIES) $(pkg_LTLIBRARIES)
84@BUILD_ENGINE_WAYLAND_EGL_TRUE@am__DEPENDENCIES_1 = $(top_builddir)/src/modules/engines/gl_common/libevas_engine_gl_common.la
85@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_TRUE@libevas_engine_wayland_egl_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
86am__libevas_engine_wayland_egl_la_SOURCES_DIST = evas_engine.c \
87 evas_wl_main.c
88@BUILD_ENGINE_WAYLAND_EGL_TRUE@am__objects_1 = evas_engine.lo \
89@BUILD_ENGINE_WAYLAND_EGL_TRUE@ evas_wl_main.lo
90@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_TRUE@am_libevas_engine_wayland_egl_la_OBJECTS = $(am__objects_1)
91libevas_engine_wayland_egl_la_OBJECTS = \
92 $(am_libevas_engine_wayland_egl_la_OBJECTS)
93AM_V_lt = $(am__v_lt_$(V))
94am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
95am__v_lt_0 = --silent
96@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_TRUE@am_libevas_engine_wayland_egl_la_rpath =
97@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_FALSE@module_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
98@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_FALSE@ $(top_builddir)/src/lib/libevas.la
99am__module_la_SOURCES_DIST = evas_engine.c evas_wl_main.c
100@BUILD_ENGINE_WAYLAND_EGL_TRUE@am__objects_2 = \
101@BUILD_ENGINE_WAYLAND_EGL_TRUE@ module_la-evas_engine.lo \
102@BUILD_ENGINE_WAYLAND_EGL_TRUE@ module_la-evas_wl_main.lo
103@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_FALSE@am_module_la_OBJECTS = $(am__objects_2)
104module_la_OBJECTS = $(am_module_la_OBJECTS)
105module_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
106 $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
107 $(AM_CFLAGS) $(CFLAGS) $(module_la_LDFLAGS) $(LDFLAGS) -o $@
108@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_FALSE@am_module_la_rpath = -rpath \
109@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_FALSE@ $(pkgdir)
110DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
111depcomp = $(SHELL) $(top_srcdir)/depcomp
112am__depfiles_maybe = depfiles
113am__mv = mv -f
114COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
115 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
116LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
117 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
118 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
119 $(AM_CFLAGS) $(CFLAGS)
120AM_V_CC = $(am__v_CC_$(V))
121am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
122am__v_CC_0 = @echo " CC " $@;
123AM_V_at = $(am__v_at_$(V))
124am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
125am__v_at_0 = @
126CCLD = $(CC)
127LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
128 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
129 $(AM_LDFLAGS) $(LDFLAGS) -o $@
130AM_V_CCLD = $(am__v_CCLD_$(V))
131am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
132am__v_CCLD_0 = @echo " CCLD " $@;
133AM_V_GEN = $(am__v_GEN_$(V))
134am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
135am__v_GEN_0 = @echo " GEN " $@;
136SOURCES = $(libevas_engine_wayland_egl_la_SOURCES) \
137 $(module_la_SOURCES)
138DIST_SOURCES = $(am__libevas_engine_wayland_egl_la_SOURCES_DIST) \
139 $(am__module_la_SOURCES_DIST)
140am__includes_HEADERS_DIST = Evas_Engine_Wayland_Egl.h
141HEADERS = $(includes_HEADERS)
142ETAGS = etags
143CTAGS = ctags
144DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
145ACLOCAL = @ACLOCAL@
146ALLOCA = @ALLOCA@
147AMTAR = @AMTAR@
148AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
149AR = @AR@
150AS = @AS@
151AUTOCONF = @AUTOCONF@
152AUTOHEADER = @AUTOHEADER@
153AUTOMAKE = @AUTOMAKE@
154AWK = @AWK@
155CC = @CC@
156CCDEPMODE = @CCDEPMODE@
157CFLAGS = @CFLAGS@
158CHECK_CFLAGS = @CHECK_CFLAGS@
159CHECK_LIBS = @CHECK_LIBS@
160CPP = @CPP@
161CPPFLAGS = @CPPFLAGS@
162CXX = @CXX@
163CXXCPP = @CXXCPP@
164CXXDEPMODE = @CXXDEPMODE@
165CXXFLAGS = @CXXFLAGS@
166CYGPATH_W = @CYGPATH_W@
167DEFS = @DEFS@
168DEPDIR = @DEPDIR@
169DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
170DIRECTFB_LIBS = @DIRECTFB_LIBS@
171DLLTOOL = @DLLTOOL@
172DSYMUTIL = @DSYMUTIL@
173DUMPBIN = @DUMPBIN@
174ECHO_C = @ECHO_C@
175ECHO_N = @ECHO_N@
176ECHO_T = @ECHO_T@
177ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@
178ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@
179EDB_CFLAGS = @EDB_CFLAGS@
180EDB_LIBS = @EDB_LIBS@
181EDJE_CFLAGS = @EDJE_CFLAGS@
182EDJE_LIBS = @EDJE_LIBS@
183EET_CFLAGS = @EET_CFLAGS@
184EET_LIBS = @EET_LIBS@
185EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@
186EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@
187EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@
188EGREP = @EGREP@
189EINA_CFLAGS = @EINA_CFLAGS@
190EINA_LIBS = @EINA_LIBS@
191EVAS_CFLAGS = @EVAS_CFLAGS@
192EVAS_LIBS = @EVAS_LIBS@
193EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@
194EVIL_CFLAGS = @EVIL_CFLAGS@
195EVIL_LIBS = @EVIL_LIBS@
196EXEEXT = @EXEEXT@
197FGREP = @FGREP@
198FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
199FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
200FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
201FREETYPE_LIBS = @FREETYPE_LIBS@
202FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@
203FRIBIDI_LIBS = @FRIBIDI_LIBS@
204GL_EET_CFLAGS = @GL_EET_CFLAGS@
205GL_EET_LIBS = @GL_EET_LIBS@
206GREP = @GREP@
207HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@
208HARFBUZZ_LIBS = @HARFBUZZ_LIBS@
209INSTALL = @INSTALL@
210INSTALL_DATA = @INSTALL_DATA@
211INSTALL_PROGRAM = @INSTALL_PROGRAM@
212INSTALL_SCRIPT = @INSTALL_SCRIPT@
213INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
214LD = @LD@
215LDFLAGS = @LDFLAGS@
216LIBOBJS = @LIBOBJS@
217LIBS = @LIBS@
218LIBTOOL = @LIBTOOL@
219LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@
220LINEBREAK_LIBS = @LINEBREAK_LIBS@
221LIPO = @LIPO@
222LN_S = @LN_S@
223LTLIBOBJS = @LTLIBOBJS@
224MAKEINFO = @MAKEINFO@
225MKDIR_P = @MKDIR_P@
226MODULE_ARCH = @MODULE_ARCH@
227NM = @NM@
228NMEDIT = @NMEDIT@
229OBJC = @OBJC@
230OBJCDEPMODE = @OBJCDEPMODE@
231OBJCFLAGS = @OBJCFLAGS@
232OBJDUMP = @OBJDUMP@
233OBJEXT = @OBJEXT@
234OTOOL = @OTOOL@
235OTOOL64 = @OTOOL64@
236PACKAGE = @PACKAGE@
237PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
238PACKAGE_NAME = @PACKAGE_NAME@
239PACKAGE_STRING = @PACKAGE_STRING@
240PACKAGE_TARNAME = @PACKAGE_TARNAME@
241PACKAGE_URL = @PACKAGE_URL@
242PACKAGE_VERSION = @PACKAGE_VERSION@
243PATH_SEPARATOR = @PATH_SEPARATOR@
244PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
245PIXMAN_LIBS = @PIXMAN_LIBS@
246PKG_CONFIG = @PKG_CONFIG@
247PNG_CFLAGS = @PNG_CFLAGS@
248PNG_LIBS = @PNG_LIBS@
249RANLIB = @RANLIB@
250SDL_CFLAGS = @SDL_CFLAGS@
251SDL_LIBS = @SDL_LIBS@
252SED = @SED@
253SET_MAKE = @SET_MAKE@
254SHELL = @SHELL@
255SHM_OPEN_LINK = @SHM_OPEN_LINK@
256STRIP = @STRIP@
257SVG_CFLAGS = @SVG_CFLAGS@
258SVG_LIBS = @SVG_LIBS@
259VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
260VALGRIND_LIBS = @VALGRIND_LIBS@
261VERSION = @VERSION@
262VMAJ = @VMAJ@
263WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
264WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
265WIN32_CFLAGS = @WIN32_CFLAGS@
266WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
267XCB_CFLAGS = @XCB_CFLAGS@
268XCB_GL_CFLAGS = @XCB_GL_CFLAGS@
269XCB_GL_LIBS = @XCB_GL_LIBS@
270XCB_LIBS = @XCB_LIBS@
271XEXT_CFLAGS = @XEXT_CFLAGS@
272XEXT_LIBS = @XEXT_LIBS@
273XMKMF = @XMKMF@
274X_CFLAGS = @X_CFLAGS@
275X_EXTRA_LIBS = @X_EXTRA_LIBS@
276X_LIBS = @X_LIBS@
277X_PRE_LIBS = @X_PRE_LIBS@
278abs_builddir = @abs_builddir@
279abs_srcdir = @abs_srcdir@
280abs_top_builddir = @abs_top_builddir@
281abs_top_srcdir = @abs_top_srcdir@
282ac_ct_CC = @ac_ct_CC@
283ac_ct_CXX = @ac_ct_CXX@
284ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
285ac_ct_OBJC = @ac_ct_OBJC@
286altivec_cflags = @altivec_cflags@
287am__include = @am__include@
288am__leading_dot = @am__leading_dot@
289am__quote = @am__quote@
290am__tar = @am__tar@
291am__untar = @am__untar@
292bindir = @bindir@
293build = @build@
294build_alias = @build_alias@
295build_cpu = @build_cpu@
296build_os = @build_os@
297build_vendor = @build_vendor@
298builddir = @builddir@
299datadir = @datadir@
300datarootdir = @datarootdir@
301dlopen_libs = @dlopen_libs@
302docdir = @docdir@
303dvidir = @dvidir@
304edje_cc = @edje_cc@
305efl_doxygen = @efl_doxygen@
306efl_have_doxygen = @efl_have_doxygen@
307evas_engine_buffer_cflags = @evas_engine_buffer_cflags@
308evas_engine_buffer_libs = @evas_engine_buffer_libs@
309evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@
310evas_engine_direct3d_libs = @evas_engine_direct3d_libs@
311evas_engine_directfb_cflags = @evas_engine_directfb_cflags@
312evas_engine_directfb_libs = @evas_engine_directfb_libs@
313evas_engine_fb_cflags = @evas_engine_fb_cflags@
314evas_engine_fb_libs = @evas_engine_fb_libs@
315evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@
316evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@
317evas_engine_gl_common_libs = @evas_engine_gl_common_libs@
318evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@
319evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@
320evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@
321evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@
322evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@
323evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@
324evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@
325evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@
326evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@
327evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@
328evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@
329evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@
330evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@
331evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@
332evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
333evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
334evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@
335evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@
336evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
337evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
338evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
339evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
340evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
341evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
342evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@
343evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@
344evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@
345evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@
346evas_engine_wayland_egl_cflags = @evas_engine_wayland_egl_cflags@
347evas_engine_wayland_egl_libs = @evas_engine_wayland_egl_libs@
348evas_engine_wayland_shm_cflags = @evas_engine_wayland_shm_cflags@
349evas_engine_wayland_shm_libs = @evas_engine_wayland_shm_libs@
350evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@
351evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@
352evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@
353evas_image_loader_edb_libs = @evas_image_loader_edb_libs@
354evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@
355evas_image_loader_eet_libs = @evas_image_loader_eet_libs@
356evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@
357evas_image_loader_generic_libs = @evas_image_loader_generic_libs@
358evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@
359evas_image_loader_gif_libs = @evas_image_loader_gif_libs@
360evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@
361evas_image_loader_ico_libs = @evas_image_loader_ico_libs@
362evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@
363evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@
364evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@
365evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@
366evas_image_loader_png_cflags = @evas_image_loader_png_cflags@
367evas_image_loader_png_libs = @evas_image_loader_png_libs@
368evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@
369evas_image_loader_psd_libs = @evas_image_loader_psd_libs@
370evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@
371evas_image_loader_svg_libs = @evas_image_loader_svg_libs@
372evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@
373evas_image_loader_tga_libs = @evas_image_loader_tga_libs@
374evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@
375evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@
376evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@
377evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@
378evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@
379evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@
380exec_prefix = @exec_prefix@
381have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@
382have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@
383have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@
384have_evas_engine_software_x11 = @have_evas_engine_software_x11@
385have_evas_engine_software_xcb = @have_evas_engine_software_xcb@
386have_evas_engine_software_xlib = @have_evas_engine_software_xlib@
387have_lcov = @have_lcov@
388host = @host@
389host_alias = @host_alias@
390host_cpu = @host_cpu@
391host_os = @host_os@
392host_vendor = @host_vendor@
393htmldir = @htmldir@
394includedir = @includedir@
395infodir = @infodir@
396install_sh = @install_sh@
397libdir = @libdir@
398libexecdir = @libexecdir@
399localedir = @localedir@
400localstatedir = @localstatedir@
401lt_ECHO = @lt_ECHO@
402lt_enable_auto_import = @lt_enable_auto_import@
403mandir = @mandir@
404mkdir_p = @mkdir_p@
405oldincludedir = @oldincludedir@
406pdfdir = @pdfdir@
407pkgconfig_requires_private = @pkgconfig_requires_private@
408prefix = @prefix@
409program_transform_name = @program_transform_name@
410psdir = @psdir@
411pthread_cflags = @pthread_cflags@
412pthread_libs = @pthread_libs@
413release_info = @release_info@
414requirement_evas = @requirement_evas@
415sbindir = @sbindir@
416sharedstatedir = @sharedstatedir@
417srcdir = @srcdir@
418sysconfdir = @sysconfdir@
419target_alias = @target_alias@
420top_build_prefix = @top_build_prefix@
421top_builddir = @top_builddir@
422top_srcdir = @top_srcdir@
423version_info = @version_info@
424MAINTAINERCLEANFILES = Makefile.in
425AM_CPPFLAGS = \
426-I. \
427-I$(top_srcdir)/src/lib \
428-I$(top_srcdir)/src/lib/include \
429-I$(top_srcdir)/src/modules/engines/gl_common \
430@FREETYPE_CFLAGS@ \
431@PIXMAN_CFLAGS@ \
432@EINA_CFLAGS@ \
433@GL_EET_CFLAGS@ \
434@evas_engine_wayland_egl_cflags@
435
436@BUILD_ENGINE_WAYLAND_EGL_TRUE@WAYLAND_EGL_SOURCES = \
437@BUILD_ENGINE_WAYLAND_EGL_TRUE@evas_engine.c \
438@BUILD_ENGINE_WAYLAND_EGL_TRUE@evas_wl_main.c
439
440@BUILD_ENGINE_WAYLAND_EGL_TRUE@WAYLAND_EGL_LIBADD = @FREETYPE_LIBS@ @GL_EET_LIBS@ @EINA_LIBS@ @evas_engine_wayland_egl_libs@ $(top_builddir)/src/modules/engines/gl_common/libevas_engine_gl_common.la
441@BUILD_ENGINE_WAYLAND_EGL_TRUE@includes_HEADERS = Evas_Engine_Wayland_Egl.h
442@BUILD_ENGINE_WAYLAND_EGL_TRUE@includesdir = $(includedir)/evas-@VMAJ@
443@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_FALSE@pkgdir = $(libdir)/evas/modules/engines/wayland_egl/$(MODULE_ARCH)
444@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_FALSE@pkg_LTLIBRARIES = module.la
445@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_FALSE@module_la_SOURCES = $(WAYLAND_EGL_SOURCES)
446@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_FALSE@module_la_LIBADD = $(WAYLAND_EGL_LIBADD) $(top_builddir)/src/lib/libevas.la
447@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_FALSE@module_la_LDFLAGS = -no-undefined -module -avoid-version
448@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_FALSE@module_la_LIBTOOLFLAGS = --tag=disable-static
449@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_TRUE@noinst_LTLIBRARIES = libevas_engine_wayland_egl.la
450@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_TRUE@libevas_engine_wayland_egl_la_SOURCES = $(WAYLAND_EGL_SOURCES)
451@BUILD_ENGINE_WAYLAND_EGL_TRUE@@EVAS_STATIC_BUILD_WAYLAND_EGL_TRUE@libevas_engine_wayland_egl_la_LIBADD = $(WAYLAND_EGL_LIBADD)
452EXTRA_DIST = evas_engine.h
453all: all-am
454
455.SUFFIXES:
456.SUFFIXES: .c .lo .o .obj
457$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
458 @for dep in $?; do \
459 case '$(am__configure_deps)' in \
460 *$$dep*) \
461 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
462 && { if test -f $@; then exit 0; else break; fi; }; \
463 exit 1;; \
464 esac; \
465 done; \
466 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/modules/engines/wayland_egl/Makefile'; \
467 $(am__cd) $(top_srcdir) && \
468 $(AUTOMAKE) --gnu src/modules/engines/wayland_egl/Makefile
469.PRECIOUS: Makefile
470Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
471 @case '$?' in \
472 *config.status*) \
473 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
474 *) \
475 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
476 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
477 esac;
478
479$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
480 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
481
482$(top_srcdir)/configure: $(am__configure_deps)
483 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
484$(ACLOCAL_M4): $(am__aclocal_m4_deps)
485 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
486$(am__aclocal_m4_deps):
487
488clean-noinstLTLIBRARIES:
489 -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
490 @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
491 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
492 test "$$dir" != "$$p" || dir=.; \
493 echo "rm -f \"$${dir}/so_locations\""; \
494 rm -f "$${dir}/so_locations"; \
495 done
496install-pkgLTLIBRARIES: $(pkg_LTLIBRARIES)
497 @$(NORMAL_INSTALL)
498 test -z "$(pkgdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdir)"
499 @list='$(pkg_LTLIBRARIES)'; test -n "$(pkgdir)" || list=; \
500 list2=; for p in $$list; do \
501 if test -f $$p; then \
502 list2="$$list2 $$p"; \
503 else :; fi; \
504 done; \
505 test -z "$$list2" || { \
506 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkgdir)'"; \
507 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkgdir)"; \
508 }
509
510uninstall-pkgLTLIBRARIES:
511 @$(NORMAL_UNINSTALL)
512 @list='$(pkg_LTLIBRARIES)'; test -n "$(pkgdir)" || list=; \
513 for p in $$list; do \
514 $(am__strip_dir) \
515 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkgdir)/$$f'"; \
516 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkgdir)/$$f"; \
517 done
518
519clean-pkgLTLIBRARIES:
520 -test -z "$(pkg_LTLIBRARIES)" || rm -f $(pkg_LTLIBRARIES)
521 @list='$(pkg_LTLIBRARIES)'; for p in $$list; do \
522 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
523 test "$$dir" != "$$p" || dir=.; \
524 echo "rm -f \"$${dir}/so_locations\""; \
525 rm -f "$${dir}/so_locations"; \
526 done
527libevas_engine_wayland_egl.la: $(libevas_engine_wayland_egl_la_OBJECTS) $(libevas_engine_wayland_egl_la_DEPENDENCIES)
528 $(AM_V_CCLD)$(LINK) $(am_libevas_engine_wayland_egl_la_rpath) $(libevas_engine_wayland_egl_la_OBJECTS) $(libevas_engine_wayland_egl_la_LIBADD) $(LIBS)
529module.la: $(module_la_OBJECTS) $(module_la_DEPENDENCIES)
530 $(AM_V_CCLD)$(module_la_LINK) $(am_module_la_rpath) $(module_la_OBJECTS) $(module_la_LIBADD) $(LIBS)
531
532mostlyclean-compile:
533 -rm -f *.$(OBJEXT)
534
535distclean-compile:
536 -rm -f *.tab.c
537
538@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_engine.Plo@am__quote@
539@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_wl_main.Plo@am__quote@
540@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_engine.Plo@am__quote@
541@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_wl_main.Plo@am__quote@
542
543.c.o:
544@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
545@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
546@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
547@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
548@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
549@am__fastdepCC_FALSE@ $(COMPILE) -c $<
550
551.c.obj:
552@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
553@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
554@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
555@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
556@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
557@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
558
559.c.lo:
560@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
561@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
562@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
563@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
564@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
565@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
566
567module_la-evas_engine.lo: evas_engine.c
568@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_engine.lo -MD -MP -MF $(DEPDIR)/module_la-evas_engine.Tpo -c -o module_la-evas_engine.lo `test -f 'evas_engine.c' || echo '$(srcdir)/'`evas_engine.c
569@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_engine.Tpo $(DEPDIR)/module_la-evas_engine.Plo
570@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
571@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_engine.c' object='module_la-evas_engine.lo' libtool=yes @AMDEPBACKSLASH@
572@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
573@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_engine.lo `test -f 'evas_engine.c' || echo '$(srcdir)/'`evas_engine.c
574
575module_la-evas_wl_main.lo: evas_wl_main.c
576@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_wl_main.lo -MD -MP -MF $(DEPDIR)/module_la-evas_wl_main.Tpo -c -o module_la-evas_wl_main.lo `test -f 'evas_wl_main.c' || echo '$(srcdir)/'`evas_wl_main.c
577@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_wl_main.Tpo $(DEPDIR)/module_la-evas_wl_main.Plo
578@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
579@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_wl_main.c' object='module_la-evas_wl_main.lo' libtool=yes @AMDEPBACKSLASH@
580@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
581@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_wl_main.lo `test -f 'evas_wl_main.c' || echo '$(srcdir)/'`evas_wl_main.c
582
583mostlyclean-libtool:
584 -rm -f *.lo
585
586clean-libtool:
587 -rm -rf .libs _libs
588install-includesHEADERS: $(includes_HEADERS)
589 @$(NORMAL_INSTALL)
590 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
591 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
592 for p in $$list; do \
593 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
594 echo "$$d$$p"; \
595 done | $(am__base_list) | \
596 while read files; do \
597 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
598 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
599 done
600
601uninstall-includesHEADERS:
602 @$(NORMAL_UNINSTALL)
603 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
604 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
605 test -n "$$files" || exit 0; \
606 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
607 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
608
609ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
610 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
611 unique=`for i in $$list; do \
612 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
613 done | \
614 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
615 END { if (nonempty) { for (i in files) print i; }; }'`; \
616 mkid -fID $$unique
617tags: TAGS
618
619TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
620 $(TAGS_FILES) $(LISP)
621 set x; \
622 here=`pwd`; \
623 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
624 unique=`for i in $$list; do \
625 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
626 done | \
627 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
628 END { if (nonempty) { for (i in files) print i; }; }'`; \
629 shift; \
630 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
631 test -n "$$unique" || unique=$$empty_fix; \
632 if test $$# -gt 0; then \
633 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
634 "$$@" $$unique; \
635 else \
636 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
637 $$unique; \
638 fi; \
639 fi
640ctags: CTAGS
641CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
642 $(TAGS_FILES) $(LISP)
643 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
644 unique=`for i in $$list; do \
645 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
646 done | \
647 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
648 END { if (nonempty) { for (i in files) print i; }; }'`; \
649 test -z "$(CTAGS_ARGS)$$unique" \
650 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
651 $$unique
652
653GTAGS:
654 here=`$(am__cd) $(top_builddir) && pwd` \
655 && $(am__cd) $(top_srcdir) \
656 && gtags -i $(GTAGS_ARGS) "$$here"
657
658distclean-tags:
659 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
660
661distdir: $(DISTFILES)
662 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
663 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
664 list='$(DISTFILES)'; \
665 dist_files=`for file in $$list; do echo $$file; done | \
666 sed -e "s|^$$srcdirstrip/||;t" \
667 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
668 case $$dist_files in \
669 */*) $(MKDIR_P) `echo "$$dist_files" | \
670 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
671 sort -u` ;; \
672 esac; \
673 for file in $$dist_files; do \
674 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
675 if test -d $$d/$$file; then \
676 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
677 if test -d "$(distdir)/$$file"; then \
678 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
679 fi; \
680 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
681 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
682 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
683 fi; \
684 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
685 else \
686 test -f "$(distdir)/$$file" \
687 || cp -p $$d/$$file "$(distdir)/$$file" \
688 || exit 1; \
689 fi; \
690 done
691check-am: all-am
692check: check-am
693all-am: Makefile $(LTLIBRARIES) $(HEADERS)
694installdirs:
695 for dir in "$(DESTDIR)$(pkgdir)" "$(DESTDIR)$(includesdir)"; do \
696 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
697 done
698install: install-am
699install-exec: install-exec-am
700install-data: install-data-am
701uninstall: uninstall-am
702
703install-am: all-am
704 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
705
706installcheck: installcheck-am
707install-strip:
708 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
709 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
710 `test -z '$(STRIP)' || \
711 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
712mostlyclean-generic:
713
714clean-generic:
715
716distclean-generic:
717 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
718 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
719
720maintainer-clean-generic:
721 @echo "This command is intended for maintainers to use"
722 @echo "it deletes files that may require special tools to rebuild."
723 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
724clean: clean-am
725
726clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
727 clean-pkgLTLIBRARIES mostlyclean-am
728
729distclean: distclean-am
730 -rm -rf ./$(DEPDIR)
731 -rm -f Makefile
732distclean-am: clean-am distclean-compile distclean-generic \
733 distclean-tags
734
735dvi: dvi-am
736
737dvi-am:
738
739html: html-am
740
741html-am:
742
743info: info-am
744
745info-am:
746
747install-data-am: install-includesHEADERS install-pkgLTLIBRARIES
748
749install-dvi: install-dvi-am
750
751install-dvi-am:
752
753install-exec-am:
754
755install-html: install-html-am
756
757install-html-am:
758
759install-info: install-info-am
760
761install-info-am:
762
763install-man:
764
765install-pdf: install-pdf-am
766
767install-pdf-am:
768
769install-ps: install-ps-am
770
771install-ps-am:
772
773installcheck-am:
774
775maintainer-clean: maintainer-clean-am
776 -rm -rf ./$(DEPDIR)
777 -rm -f Makefile
778maintainer-clean-am: distclean-am maintainer-clean-generic
779
780mostlyclean: mostlyclean-am
781
782mostlyclean-am: mostlyclean-compile mostlyclean-generic \
783 mostlyclean-libtool
784
785pdf: pdf-am
786
787pdf-am:
788
789ps: ps-am
790
791ps-am:
792
793uninstall-am: uninstall-includesHEADERS uninstall-pkgLTLIBRARIES
794
795.MAKE: install-am install-strip
796
797.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
798 clean-libtool clean-noinstLTLIBRARIES clean-pkgLTLIBRARIES \
799 ctags distclean distclean-compile distclean-generic \
800 distclean-libtool distclean-tags distdir dvi dvi-am html \
801 html-am info info-am install install-am install-data \
802 install-data-am install-dvi install-dvi-am install-exec \
803 install-exec-am install-html install-html-am \
804 install-includesHEADERS install-info install-info-am \
805 install-man install-pdf install-pdf-am install-pkgLTLIBRARIES \
806 install-ps install-ps-am install-strip installcheck \
807 installcheck-am installdirs maintainer-clean \
808 maintainer-clean-generic mostlyclean mostlyclean-compile \
809 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
810 tags uninstall uninstall-am uninstall-includesHEADERS \
811 uninstall-pkgLTLIBRARIES
812
813
814# Tell versions [3.59,3.63) of GNU make to not export all variables.
815# Otherwise a system limit (for SysV at least) may be exceeded.
816.NOEXPORT:
diff --git a/libraries/evas/src/modules/engines/wayland_egl/evas_engine.c b/libraries/evas/src/modules/engines/wayland_egl/evas_engine.c
new file mode 100644
index 0000000..d2a6a0d
--- /dev/null
+++ b/libraries/evas/src/modules/engines/wayland_egl/evas_engine.c
@@ -0,0 +1,3174 @@
1#include "evas_common.h" /* Also includes international specific stuff */
2#include "evas_engine.h"
3
4#ifdef HAVE_DLSYM
5# include <dlfcn.h> /* dlopen,dlclose,etc */
6#else
7# error gl_x11 should not get compiled if dlsym is not found on the system!
8#endif
9
10#define EVAS_GL_NO_GL_H_CHECK 1
11#include "Evas_GL.h"
12
13typedef struct _Render_Engine Render_Engine;
14typedef struct _Render_Engine_GL_Surface Render_Engine_GL_Surface;
15typedef struct _Render_Engine_GL_Context Render_Engine_GL_Context;
16typedef struct _Render_Engine_GL_Resource Render_Engine_GL_Resource;
17typedef struct _Extension_Entry Extension_Entry;
18
19struct _Render_Engine
20{
21 Evas_GL_Wl_Window *win;
22 Evas_Engine_Info_Wayland_Egl *info;
23 Evas *evas;
24 Tilebuf *tb;
25 int end;
26 int w, h;
27 int vsync;
28
29};
30
31struct _Render_Engine_GL_Surface
32{
33 int initialized;
34 int fbo_attached;
35 int w, h;
36 int depth_bits;
37 int stencil_bits;
38
39 // Render target texture/buffers
40 GLuint rt_tex;
41 GLint rt_internal_fmt;
42 GLenum rt_fmt;
43 GLuint rb_depth;
44 GLenum rb_depth_fmt;
45 GLuint rb_stencil;
46 GLenum rb_stencil_fmt;
47
48 Render_Engine_GL_Context *current_ctx;
49};
50
51struct _Render_Engine_GL_Context
52{
53 int initialized;
54 EGLContext context;
55 GLuint context_fbo;
56 GLuint current_fbo;
57
58 Render_Engine_GL_Surface *current_sfc;
59};
60
61// Resources used per thread
62struct _Render_Engine_GL_Resource
63{
64 // Resource context/surface per Thread in TLS for evasgl use
65 EGLContext context;
66 EGLSurface surface;
67};
68
69// Extension Handling
70struct _Extension_Entry
71{
72 const char *name;
73 const char *real_name;
74 int supported;
75};
76
77static int initted = 0;
78static int gl_wins = 0;
79static Render_Engine_GL_Context *current_evgl_ctx;
80static Render_Engine *current_engine;
81
82static char _gl_ext_string[1024];
83static char _evasgl_ext_string[1024];
84
85// Resource context/surface per Thread in TLS for evasgl use
86static Eina_TLS resource_key;
87static Eina_List *resource_list;
88LK(resource_lock);
89
90typedef void (*_eng_fn) (void);
91typedef _eng_fn (*glsym_func_eng_fn) ();
92typedef void (*glsym_func_void) ();
93typedef void *(*glsym_func_void_ptr) ();
94typedef int (*glsym_func_int) ();
95typedef unsigned int (*glsym_func_uint) ();
96typedef unsigned char (*glsym_func_uchar) ();
97typedef unsigned char *(*glsym_func_uchar_ptr) ();
98typedef const char *(*glsym_func_const_char_ptr) ();
99
100#ifndef EGL_NATIVE_PIXMAP_KHR
101# define EGL_NATIVE_PIXMAP_KHR 0x30b0
102#endif
103_eng_fn (*glsym_eglGetProcAddress) (const char *a) = NULL;
104void (*glsym_eglBindTexImage) (EGLDisplay a, EGLSurface b, int c) = NULL;
105void (*glsym_eglReleaseTexImage) (EGLDisplay a, EGLSurface b, int c) = NULL;
106void *(*glsym_eglCreateImage) (EGLDisplay a, EGLContext b, EGLenum c, EGLClientBuffer d, const int *e) = NULL;
107void (*glsym_eglDestroyImage) (EGLDisplay a, void *b) = NULL;
108void (*glsym_glEGLImageTargetTexture2DOES) (int a, void *b) = NULL;
109void (*glsym_glEGLImageTargetRenderbufferStorageOES) (int a, void *b) = NULL;
110void *(*glsym_eglMapImageSEC) (void *a, void *b) = NULL;
111unsigned int (*glsym_eglUnmapImageSEC) (void *a, void *b) = NULL;
112const char *(*glsym_eglQueryString) (EGLDisplay a, int name) = NULL;
113
114unsigned int (*glsym_eglLockSurface) (EGLDisplay a, EGLSurface b, const int *attrib_list) = NULL;
115unsigned int (*glsym_eglUnlockSurface) (EGLDisplay a, EGLSurface b) = NULL;
116
117// GLES2 Extensions
118void (*glsym_glGetProgramBinaryOES) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary) = NULL;
119void (*glsym_glProgramBinaryOES) (GLuint program, GLenum binaryFormat, const void *binary, GLint length) = NULL;
120void* (*glsym_glMapBufferOES) (GLenum target, GLenum access) = NULL;
121unsigned char (*glsym_glUnmapBufferOES) (GLenum target) = NULL;
122void (*glsym_glGetBufferPointervOES) (GLenum target, GLenum pname, void** params) = NULL;
123void (*glsym_glTexImage3DOES) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) = NULL;
124void (*glsym_glTexSubImage3DOES) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) = NULL;
125void (*glsym_glCopyTexSubImage3DOES) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
126void (*glsym_glCompressedTexImage3DOES) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data) = NULL;
127void (*glsym_glCompressedTexSubImage3DOES) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) = NULL;
128void (*glsym_glFramebufferTexture3DOES) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) = NULL;
129void (*glsym_glGetPerfMonitorGroupsAMD) (GLint* numGroups, GLsizei groupsSize, GLuint* groups) = NULL;
130void (*glsym_glGetPerfMonitorCountersAMD) (GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters) = NULL;
131void (*glsym_glGetPerfMonitorGroupStringAMD) (GLuint group, GLsizei bufSize, GLsizei* length, char* groupString) = NULL;
132void (*glsym_glGetPerfMonitorCounterStringAMD) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString) = NULL;
133void (*glsym_glGetPerfMonitorCounterInfoAMD) (GLuint group, GLuint counter, GLenum pname, void* data) = NULL;
134void (*glsym_glGenPerfMonitorsAMD) (GLsizei n, GLuint* monitors) = NULL;
135void (*glsym_glDeletePerfMonitorsAMD) (GLsizei n, GLuint* monitors) = NULL;
136void (*glsym_glSelectPerfMonitorCountersAMD) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList) = NULL;
137void (*glsym_glBeginPerfMonitorAMD) (GLuint monitor) = NULL;
138void (*glsym_glEndPerfMonitorAMD) (GLuint monitor) = NULL;
139void (*glsym_glGetPerfMonitorCounterDataAMD) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten) = NULL;
140void (*glsym_glDiscardFramebufferEXT) (GLenum target, GLsizei numAttachments, const GLenum* attachments) = NULL;
141void (*glsym_glMultiDrawArraysEXT) (GLenum mode, GLint* first, GLsizei* count, GLsizei primcount) = NULL;
142void (*glsym_glMultiDrawElementsEXT) (GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount) = NULL;
143void (*glsym_glDeleteFencesNV) (GLsizei n, const GLuint* fences) = NULL;
144void (*glsym_glGenFencesNV) (GLsizei n, GLuint* fences) = NULL;
145unsigned char (*glsym_glIsFenceNV) (GLuint fence) = NULL;
146unsigned char (*glsym_glTestFenceNV) (GLuint fence) = NULL;
147void (*glsym_glGetFenceivNV) (GLuint fence, GLenum pname, GLint* params) = NULL;
148void (*glsym_glFinishFenceNV) (GLuint fence) = NULL;
149void (*glsym_glSetFenceNV) (GLuint, GLenum) = NULL;
150void (*glsym_glGetDriverControlsQCOM) (GLint* num, GLsizei size, GLuint* driverControls) = NULL;
151void (*glsym_glGetDriverControlStringQCOM) (GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString) = NULL;
152void (*glsym_glEnableDriverControlQCOM) (GLuint driverControl) = NULL;
153void (*glsym_glDisableDriverControlQCOM) (GLuint driverControl) = NULL;
154void (*glsym_glExtGetTexturesQCOM) (GLuint* textures, GLint maxTextures, GLint* numTextures) = NULL;
155void (*glsym_glExtGetBuffersQCOM) (GLuint* buffers, GLint maxBuffers, GLint* numBuffers) = NULL;
156void (*glsym_glExtGetRenderbuffersQCOM) (GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers) = NULL;
157void (*glsym_glExtGetFramebuffersQCOM) (GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers) = NULL;
158void (*glsym_glExtGetTexLevelParameterivQCOM) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params) = NULL;
159void (*glsym_glExtTexObjectStateOverrideiQCOM) (GLenum target, GLenum pname, GLint param) = NULL;
160void (*glsym_glExtGetTexSubImageQCOM) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels) = NULL;
161void (*glsym_glExtGetBufferPointervQCOM) (GLenum target, void** params) = NULL;
162void (*glsym_glExtGetShadersQCOM) (GLuint* shaders, GLint maxShaders, GLint* numShaders) = NULL;
163void (*glsym_glExtGetProgramsQCOM) (GLuint* programs, GLint maxPrograms, GLint* numPrograms) = NULL;
164unsigned char (*glsym_glExtIsProgramBinaryQCOM) (GLuint program) = NULL;
165void (*glsym_glExtGetProgramBinarySourceQCOM) (GLuint program, GLenum shadertype, char* source, GLint* length) = NULL;
166
167
168//------ GLES 2.0 Extensions supported in EvasGL -----//
169static Extension_Entry _gl_ext_entries[] = {
170 //--- Function Extensions ---//
171 { "GL_OES_get_program_binary", "get_program_binary", 0 },
172 { "GL_OES_mapbuffer", "mapbuffer", 0 },
173 { "GL_OES_texture_3D", "texture_3D", 0 },
174 { "AMD_performance_monitor", "AMD_performance_monitor", 0 },
175 { "GL_EXT_discard_framebuffer", "discard_framebuffer", 0 },
176 { "GL_EXT_multi_draw_arrays", "multi_draw_arrays", 0 },
177 { "GL_NV_fence", "NV_fence", 0 },
178 { "GL_QCOM_driver_control", "QCOM_driver_control", 0 },
179 { "GL_QCOM_extended_get", "QCOM_extended_get", 0 },
180 { "GL_QCOM_extended_get2", "QCOM_extended_get2", 0 },
181
182 //--- Define Extensions ---//
183 { "GL_OES_compressed_ETC1_RGB8_texture", "compressed_ETC1_RGB8_texture", 0 },
184 { "GL_OES_compressed_paletted_texture", "compressed_paletted_texture", 0 },
185 { "GL_OES_depth24", "depth24", 0 },
186 { "GL_OES_depth32", "depth32", 0 },
187 { "GL_OES_EvasGL_image", "EGL_image", 0 },
188 { "GL_OES_packed_depth_stencil", "packed_depth_stencil", 0 },
189 { "GL_OES_rgb8_rgba8", "rgb8_rgba8", 0 },
190 { "GL_OES_standard_derivatives", "standard_derivatives", 0 },
191 { "GL_OES_stencil1", "stencil1", 0 },
192 { "GL_OES_stencil4", "stencil4", 0 },
193 { "GL_OES_texture_float", "texture_float", 0 },
194 { "GL_OES_texture_half_float", "texture_half_float", 0 },
195 { "GL_OES_texture_half_float_linear", "texture_half_float_linear", 0 },
196 { "GL_OES_texture_npot", "texture_npot", 0 },
197 { "GL_OES_vertex_half_float", "vertex_half_float", 0 },
198 { "GL_OES_vertex_type_10_10_10_2", "vertex_type_10_10_10_2", 0 },
199 { "GL_AMD_compressed_3DC_texture", "compressed_3DC_texture", 0 },
200 { "GL_AMD_compressed_ATC_texture", "compressed_ATC_texture", 0 },
201 { "GL_AMD_program_binary_Z400", "program_binary_Z400", 0 },
202 { "GL_EXT_blend_minmax", "blend_minmax", 0 },
203 { "GL_EXT_read_format_bgra", "read_format_bgra", 0 },
204 { "GL_EXT_texture_filter_anisotropic", "texture_filter_anisotrophic", 0 },
205 { "GL_EXT_texture_format_BGRA8888", "texture_format_BGRA8888", 0 },
206 { "GL_EXT_texture_type_2_10_10_10_REV", "texture_type_2_10_10_10_rev", 0 },
207 { "GL_IMG_program_binary", "IMG_program_binary", 0 },
208 { "GL_IMG_read_format", "IMG_read_format", 0 },
209 { "GL_IMG_shader_binary", "IMG_shader_binary", 0 },
210 { "GL_IMG_texture_compression_pvrtc", "IMG_texture_compression_pvrtc", 0 },
211 { "GL_QCOM_perfmon_global_mode", "QCOM_perfmon_global_mode", 0 },
212 { "GL_QCOM_writeonly_rendering", "QCOM_writeonly_rendering", 0 },
213 { NULL, NULL, 0}
214};
215
216//------ Extensions supported in EvasGL -----//
217static Extension_Entry _evasgl_ext_entries[] = {
218 { "EvasGL_KHR_image", "EGL_KHR_image", 0 },
219 { "EvasGL_KHR_vg_parent_image", "EGL_KHR_vg_parent_image", 0 },
220 { "EvasGL_KHR_gl_texture_2D_image", "EGL_KHR_gl_texture_2D_image", 0 },
221 { "EvasGL_KHR_gl_texture_cubemap_image", "EGL_KHR_gl_texture_cubemap_image", 0 },
222 { "EvasGL_KHR_gl_texture_3D_image", "EGL_KHR_gl_texture_3D_image", 0 },
223 { "EvasGL_KHR_gl_renderbuffer_image", "EGL_KHR_gl_renderbuffer_image", 0 },
224 { NULL, NULL, 0 }
225};
226
227static void
228_sym_init(void)
229{
230 static int done = 0;
231
232 if (done) return;
233
234#define FINDSYM(dst, sym, typ) \
235 if ((!dst) && (glsym_eglGetProcAddress)) dst = (typ)glsym_eglGetProcAddress(sym); \
236 if (!dst) dst = (typ)dlsym(RTLD_DEFAULT, sym)
237
238 FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddress", glsym_func_eng_fn);
239 FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressEXT", glsym_func_eng_fn);
240 FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressARB", glsym_func_eng_fn);
241 FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressKHR", glsym_func_eng_fn);
242
243 FINDSYM(glsym_eglBindTexImage, "eglBindTexImage", glsym_func_void);
244 FINDSYM(glsym_eglBindTexImage, "eglBindTexImageEXT", glsym_func_void);
245 FINDSYM(glsym_eglBindTexImage, "eglBindTexImageARB", glsym_func_void);
246 FINDSYM(glsym_eglBindTexImage, "eglBindTexImageKHR", glsym_func_void);
247
248 FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImage", glsym_func_void);
249 FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageEXT", glsym_func_void);
250 FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageARB", glsym_func_void);
251 FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageKHR", glsym_func_void);
252
253 FINDSYM(glsym_eglCreateImage, "eglCreateImage", glsym_func_void_ptr);
254 FINDSYM(glsym_eglCreateImage, "eglCreateImageEXT", glsym_func_void_ptr);
255 FINDSYM(glsym_eglCreateImage, "eglCreateImageARB", glsym_func_void_ptr);
256 FINDSYM(glsym_eglCreateImage, "eglCreateImageKHR", glsym_func_void_ptr);
257
258 FINDSYM(glsym_eglDestroyImage, "eglDestroyImage", glsym_func_void);
259 FINDSYM(glsym_eglDestroyImage, "eglDestroyImageEXT", glsym_func_void);
260 FINDSYM(glsym_eglDestroyImage, "eglDestroyImageARB", glsym_func_void);
261 FINDSYM(glsym_eglDestroyImage, "eglDestroyImageKHR", glsym_func_void);
262
263 FINDSYM(glsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES", glsym_func_void);
264
265 FINDSYM(glsym_glEGLImageTargetRenderbufferStorageOES, "glEGLImageTargetRenderbufferStorageOES", glsym_func_void);
266
267 FINDSYM(glsym_eglMapImageSEC, "eglMapImageSEC", glsym_func_void_ptr);
268 FINDSYM(glsym_eglUnmapImageSEC, "eglUnmapImageSEC", glsym_func_uint);
269
270 FINDSYM(glsym_eglQueryString, "eglQueryString", glsym_func_const_char_ptr);
271
272 FINDSYM(glsym_eglLockSurface, "eglLockSurface", glsym_func_uint);
273 FINDSYM(glsym_eglLockSurface, "eglLockSurfaceEXT", glsym_func_uint);
274 FINDSYM(glsym_eglLockSurface, "eglLockSurfaceARB", glsym_func_uint);
275 FINDSYM(glsym_eglLockSurface, "eglLockSurfaceKHR", glsym_func_uint);
276
277 FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurface", glsym_func_uint);
278 FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurfaceEXT", glsym_func_uint);
279 FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurfaceARB", glsym_func_uint);
280 FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurfaceKHR", glsym_func_uint);
281
282 //----------- GLES 2.0 Extensions ------------//
283 // If the symbol's not found, they get set to NULL
284 // If one of the functions in the extension exists, the extension in supported
285 /* GL_OES_get_program_binary */
286 FINDSYM(glsym_glGetProgramBinaryOES, "glGetProgramBinary", glsym_func_void);
287 FINDSYM(glsym_glGetProgramBinaryOES, "glGetProgramBinaryEXT", glsym_func_void);
288 FINDSYM(glsym_glGetProgramBinaryOES, "glGetProgramBinaryARB", glsym_func_void);
289 FINDSYM(glsym_glGetProgramBinaryOES, "glGetProgramBinaryOES", glsym_func_void);
290
291 FINDSYM(glsym_glProgramBinaryOES, "glProgramBinary", glsym_func_void);
292 FINDSYM(glsym_glProgramBinaryOES, "glProgramBinaryEXT", glsym_func_void);
293 FINDSYM(glsym_glProgramBinaryOES, "glProgramBinaryARB", glsym_func_void);
294 FINDSYM(glsym_glProgramBinaryOES, "glProgramBinaryOES", glsym_func_void);
295
296 // Check the first function to see if the extension is supported...
297 if (glsym_glGetProgramBinaryOES) _gl_ext_entries[0].supported = 1;
298
299 /* GL_OES_mapbuffer */
300 FINDSYM(glsym_glMapBufferOES, "glMapBuffer", glsym_func_void_ptr);
301 FINDSYM(glsym_glMapBufferOES, "glMapBufferEXT", glsym_func_void_ptr);
302 FINDSYM(glsym_glMapBufferOES, "glMapBufferARB", glsym_func_void_ptr);
303 FINDSYM(glsym_glMapBufferOES, "glMapBufferOES", glsym_func_void_ptr);
304
305 FINDSYM(glsym_glUnmapBufferOES, "glUnmapBuffer", glsym_func_uchar);
306 FINDSYM(glsym_glUnmapBufferOES, "glUnmapBufferEXT", glsym_func_uchar);
307 FINDSYM(glsym_glUnmapBufferOES, "glUnmapBufferARB", glsym_func_uchar);
308 FINDSYM(glsym_glUnmapBufferOES, "glUnmapBufferOES", glsym_func_uchar);
309
310 FINDSYM(glsym_glGetBufferPointervOES, "glGetBufferPointerv", glsym_func_void);
311 FINDSYM(glsym_glGetBufferPointervOES, "glGetBufferPointervEXT", glsym_func_void);
312 FINDSYM(glsym_glGetBufferPointervOES, "glGetBufferPointervARB", glsym_func_void);
313 FINDSYM(glsym_glGetBufferPointervOES, "glGetBufferPointervOES", glsym_func_void);
314
315 if (glsym_glMapBufferOES) _gl_ext_entries[1].supported = 1;
316
317 /* GL_OES_texture_3D */
318 FINDSYM(glsym_glTexImage3DOES, "glTexImage3D", glsym_func_void);
319 FINDSYM(glsym_glTexImage3DOES, "glTexImage3DEXT", glsym_func_void);
320 FINDSYM(glsym_glTexImage3DOES, "glTexImage3DARB", glsym_func_void);
321 FINDSYM(glsym_glTexImage3DOES, "glTexImage3DOES", glsym_func_void);
322
323 FINDSYM(glsym_glTexSubImage3DOES, "glTexSubImage3D", glsym_func_void);
324 FINDSYM(glsym_glTexSubImage3DOES, "glTexSubImage3DEXT", glsym_func_void);
325 FINDSYM(glsym_glTexSubImage3DOES, "glTexSubImage3DARB", glsym_func_void);
326 FINDSYM(glsym_glTexSubImage3DOES, "glTexSubImage3DOES", glsym_func_void);
327
328 FINDSYM(glsym_glCopyTexSubImage3DOES, "glCopyTexSubImage3D", glsym_func_void);
329 FINDSYM(glsym_glCopyTexSubImage3DOES, "glCopyTexSubImage3DARB", glsym_func_void);
330 FINDSYM(glsym_glCopyTexSubImage3DOES, "glCopyTexSubImage3DEXT", glsym_func_void);
331 FINDSYM(glsym_glCopyTexSubImage3DOES, "glCopyTexSubImage3DOES", glsym_func_void);
332
333 FINDSYM(glsym_glCompressedTexImage3DOES, "glCompressedTexImage3D", glsym_func_void);
334 FINDSYM(glsym_glCompressedTexImage3DOES, "glCompressedTexImage3DARB", glsym_func_void);
335 FINDSYM(glsym_glCompressedTexImage3DOES, "glCompressedTexImage3DEXT", glsym_func_void);
336 FINDSYM(glsym_glCompressedTexImage3DOES, "glCompressedTexImage3DOES", glsym_func_void);
337
338 FINDSYM(glsym_glCompressedTexSubImage3DOES, "glCompressedTexSubImage3D", glsym_func_void);
339 FINDSYM(glsym_glCompressedTexSubImage3DOES, "glCompressedTexSubImage3DARB", glsym_func_void);
340 FINDSYM(glsym_glCompressedTexSubImage3DOES, "glCompressedTexSubImage3DEXT", glsym_func_void);
341 FINDSYM(glsym_glCompressedTexSubImage3DOES, "glCompressedTexSubImage3DOES", glsym_func_void);
342
343 FINDSYM(glsym_glFramebufferTexture3DOES, "glFramebufferTexture3D", glsym_func_void);
344 FINDSYM(glsym_glFramebufferTexture3DOES, "glFramebufferTexture3DARB", glsym_func_void);
345 FINDSYM(glsym_glFramebufferTexture3DOES, "glFramebufferTexture3DEXT", glsym_func_void);
346 FINDSYM(glsym_glFramebufferTexture3DOES, "glFramebufferTexture3DOES", glsym_func_void);
347
348 if (glsym_glTexSubImage3DOES) _gl_ext_entries[2].supported = 1;
349
350 /* AMD_performance_monitor */
351 FINDSYM(glsym_glGetPerfMonitorGroupsAMD, "glGetPerfMonitorGroupsAMD", glsym_func_void);
352 FINDSYM(glsym_glGetPerfMonitorCountersAMD, "glGetPerfMonitorCountersAMD", glsym_func_void);
353 FINDSYM(glsym_glGetPerfMonitorGroupStringAMD, "glGetPerfMonitorGroupStringAMD", glsym_func_void);
354 FINDSYM(glsym_glGetPerfMonitorCounterStringAMD, "glGetPerfMonitorCounterStringAMD", glsym_func_void);
355 FINDSYM(glsym_glGetPerfMonitorCounterInfoAMD, "glGetPerfMonitorCounterInfoAMD", glsym_func_void);
356 FINDSYM(glsym_glGenPerfMonitorsAMD, "glGenPerfMonitorsAMD", glsym_func_void);
357 FINDSYM(glsym_glDeletePerfMonitorsAMD, "glDeletePerfMonitorsAMD", glsym_func_void);
358 FINDSYM(glsym_glSelectPerfMonitorCountersAMD, "glSelectPerfMonitorCountersAMD", glsym_func_void);
359 FINDSYM(glsym_glBeginPerfMonitorAMD, "glBeginPerfMonitorAMD", glsym_func_void);
360 FINDSYM(glsym_glEndPerfMonitorAMD, "glEndPerfMonitorAMD", glsym_func_void);
361 FINDSYM(glsym_glGetPerfMonitorCounterDataAMD, "glGetPerfMonitorCounterDataAMD", glsym_func_void);
362
363 if (glsym_glGetPerfMonitorGroupsAMD) _gl_ext_entries[3].supported = 1;
364
365 /* GL_EXT_discard_framebuffer */
366 FINDSYM(glsym_glDiscardFramebufferEXT, "glDiscardFramebuffer", glsym_func_void);
367 FINDSYM(glsym_glDiscardFramebufferEXT, "glDiscardFramebufferARB", glsym_func_void);
368 FINDSYM(glsym_glDiscardFramebufferEXT, "glDiscardFramebufferEXT", glsym_func_void);
369
370 if (glsym_glDiscardFramebufferEXT) _gl_ext_entries[4].supported = 1;
371
372 /* GL_EXT_multi_draw_arrays */
373 FINDSYM(glsym_glMultiDrawArraysEXT, "glMultiDrawArrays", glsym_func_void);
374 FINDSYM(glsym_glMultiDrawArraysEXT, "glMultiDrawArraysARB", glsym_func_void);
375 FINDSYM(glsym_glMultiDrawArraysEXT, "glMultiDrawArraysEXT", glsym_func_void);
376
377 FINDSYM(glsym_glMultiDrawElementsEXT, "glMultiDrawElements", glsym_func_void);
378 FINDSYM(glsym_glMultiDrawElementsEXT, "glMultiDrawElementsARB", glsym_func_void);
379 FINDSYM(glsym_glMultiDrawElementsEXT, "glMultiDrawElementsEXT", glsym_func_void);
380
381 if (glsym_glMultiDrawArraysEXT) _gl_ext_entries[5].supported = 1;
382
383 /* GL_NV_fence */
384 FINDSYM(glsym_glDeleteFencesNV, "glDeleteFencesNV", glsym_func_void);
385 FINDSYM(glsym_glGenFencesNV, "glGenFencesNV", glsym_func_void);
386 FINDSYM(glsym_glIsFenceNV, "glIsFenceNV", glsym_func_uchar);
387 FINDSYM(glsym_glTestFenceNV, "glTestFenceNV", glsym_func_uchar);
388 FINDSYM(glsym_glGetFenceivNV, "glGetFenceivNV", glsym_func_void);
389 FINDSYM(glsym_glFinishFenceNV, "glFinishFenceNV", glsym_func_void);
390 FINDSYM(glsym_glSetFenceNV, "glSetFenceNV", glsym_func_void);
391
392 if (glsym_glDeleteFencesNV) _gl_ext_entries[6].supported = 1;
393
394 /* GL_QCOM_driver_control */
395 FINDSYM(glsym_glGetDriverControlsQCOM, "glGetDriverControlsQCOM", glsym_func_void);
396 FINDSYM(glsym_glGetDriverControlStringQCOM, "glGetDriverControlStringQCOM", glsym_func_void);
397 FINDSYM(glsym_glEnableDriverControlQCOM, "glEnableDriverControlQCOM", glsym_func_void);
398 FINDSYM(glsym_glDisableDriverControlQCOM, "glDisableDriverControlQCOM", glsym_func_void);
399
400 if (glsym_glGetDriverControlsQCOM) _gl_ext_entries[7].supported = 1;
401
402 /* GL_QCOM_extended_get */
403 FINDSYM(glsym_glExtGetTexturesQCOM, "glExtGetTexturesQCOM", glsym_func_void);
404 FINDSYM(glsym_glExtGetBuffersQCOM, "glExtGetBuffersQCOM", glsym_func_void);
405 FINDSYM(glsym_glExtGetRenderbuffersQCOM, "glExtGetRenderbuffersQCOM", glsym_func_void);
406 FINDSYM(glsym_glExtGetFramebuffersQCOM, "glExtGetFramebuffersQCOM", glsym_func_void);
407 FINDSYM(glsym_glExtGetTexLevelParameterivQCOM, "glExtGetTexLevelParameterivQCOM", glsym_func_void);
408 FINDSYM(glsym_glExtTexObjectStateOverrideiQCOM, "glExtTexObjectStateOverrideiQCOM", glsym_func_void);
409 FINDSYM(glsym_glExtGetTexSubImageQCOM, "glExtGetTexSubImageQCOM", glsym_func_void);
410 FINDSYM(glsym_glExtGetBufferPointervQCOM, "glExtGetBufferPointervQCOM", glsym_func_void);
411
412 if (glsym_glExtGetTexturesQCOM) _gl_ext_entries[8].supported = 1;
413
414 /* GL_QCOM_extended_get2 */
415 FINDSYM(glsym_glExtGetShadersQCOM, "glExtGetShadersQCOM", glsym_func_void);
416 FINDSYM(glsym_glExtGetProgramsQCOM, "glExtGetProgramsQCOM", glsym_func_void);
417 FINDSYM(glsym_glExtIsProgramBinaryQCOM, "glExtIsProgramBinaryQCOM", glsym_func_uchar);
418 FINDSYM(glsym_glExtGetProgramBinarySourceQCOM, "glExtGetProgramBinarySourceQCOM", glsym_func_void);
419
420 if (glsym_glExtGetShadersQCOM) _gl_ext_entries[9].supported = 1;
421}
422
423static void
424_extensions_init(Render_Engine *re)
425{
426 int i;
427 const char *glexts, *evasglexts;
428
429 memset(_gl_ext_string, 0, 1024);
430 memset(_evasgl_ext_string, 0, 1024);
431
432 // GLES 2.0 Extensions
433 glexts = (const char*)glGetString(GL_EXTENSIONS);
434
435 DBG("--------GLES 2.0 Extensions--------");
436 for (i = 0; _gl_ext_entries[i].name != NULL; i++)
437 {
438 if ( (strstr(glexts, _gl_ext_entries[i].name) != NULL) ||
439 (strstr(glexts, _gl_ext_entries[i].real_name) != NULL) )
440 {
441 _gl_ext_entries[i].supported = 1;
442 strcat(_gl_ext_string, _gl_ext_entries[i].name);
443 strcat(_gl_ext_string, " ");
444 DBG("\t%s", _gl_ext_entries[i].name);
445 }
446
447 }
448 DBG(" ");
449
450 // EGL Extensions
451 evasglexts = glsym_eglQueryString(re->win->egl_disp, EGL_EXTENSIONS);
452
453 DBG("--------EvasGL Extensions----------");
454 for (i = 0; _evasgl_ext_entries[i].name != NULL; i++)
455 {
456 if ( (strstr(evasglexts, _evasgl_ext_entries[i].name) != NULL) ||
457 (strstr(evasglexts, _evasgl_ext_entries[i].real_name) != NULL) )
458 {
459 _evasgl_ext_entries[i].supported = 1;
460 strcat(_evasgl_ext_string, _evasgl_ext_entries[i].name);
461 strcat(_evasgl_ext_string, " ");
462 DBG("\t%s", _evasgl_ext_entries[i].name);
463 }
464 }
465 DBG(" ");
466}
467
468int _evas_engine_wl_egl_log_dom = -1;
469
470/* function tables - filled in later (func and parent func) */
471static Evas_Func func, pfunc;
472
473/* Function table for GL APIs */
474static Evas_GL_API gl_funcs;
475
476static void *
477eng_info(Evas *e)
478{
479 Evas_Engine_Info_Wayland_Egl *info;
480
481 info = calloc(1, sizeof(Evas_Engine_Info_Wayland_Egl));
482 info->magic.magic = rand();
483 info->func.best_depth_get = eng_best_depth_get;
484 info->render_mode = EVAS_RENDER_MODE_BLOCKING;
485 return info;
486 e = NULL;
487}
488
489static void
490eng_info_free(Evas *e __UNUSED__, void *info)
491{
492 Evas_Engine_Info_Wayland_Egl *in;
493// dont free! why bother? its not worth it
494// eina_log_domain_unregister(_evas_engine_GL_X11_log_dom);
495 in = (Evas_Engine_Info_Wayland_Egl *)info;
496 free(in);
497}
498
499static int
500_re_wincheck(Render_Engine *re)
501{
502 if (!re) return 0;
503 if (re->win->surf) return 1;
504 eng_window_resurf(re->win);
505 if (!re->win->surf)
506 {
507 ERR("GL engine can't re-create window surface!");
508 }
509 return 0;
510}
511
512static void
513_re_winfree(Render_Engine *re)
514{
515 if (!re->win->surf) return;
516 eng_window_unsurf(re->win);
517}
518
519static Render_Engine_GL_Resource *
520_create_internal_glue_resources(void *data)
521{
522 Render_Engine *re;
523 Render_Engine_GL_Resource *rsc;
524
525 if (!(re = (Render_Engine *)data)) return NULL;
526
527 rsc = calloc(1, sizeof(Render_Engine_GL_Resource));
528 if (!rsc) return NULL;
529
530 // EGL
531 int context_attrs[3];
532 context_attrs[0] = EGL_CONTEXT_CLIENT_VERSION;
533 context_attrs[1] = 2;
534 context_attrs[2] = EGL_NONE;
535
536 // Create resource surface for EGL
537 rsc->surface =
538 eglCreateWindowSurface(re->win->egl_disp, re->win->egl_config,
539 (EGLNativeWindowType)re->win->win, NULL);
540 if (!rsc->surface)
541 {
542 ERR("Creating internal resource surface failed.");
543 free(rsc);
544 return NULL;
545 }
546
547 // Create a resource context for EGL
548 rsc->context =
549 eglCreateContext(re->win->egl_disp, re->win->egl_config,
550 re->win->egl_context[0], context_attrs);
551 if (!rsc->context)
552 {
553 ERR("Internal Resource Context Creations Failed.");
554 free(rsc);
555 return NULL;
556 }
557
558 // Add to the resource resource list for cleanup
559 LKL(resource_lock);
560 resource_list = eina_list_prepend(resource_list, rsc);
561 LKU(resource_lock);
562
563 // Set the resource in TLS
564 if (eina_tls_set(resource_key, (void*)rsc) == EINA_FALSE)
565 {
566 ERR("Failed setting TLS Resource");
567 free(rsc);
568 return NULL;
569 }
570
571 return rsc;
572}
573
574static int
575_destroy_internal_glue_resources(void *data)
576{
577 Render_Engine *re = (Render_Engine *)data;
578 Eina_List *l;
579 Render_Engine_GL_Resource *rsc;
580
581 // EGL
582 // Delete the Resources
583 LKL(resource_lock);
584 EINA_LIST_FOREACH(resource_list, l, rsc)
585 {
586 if (rsc->surface) eglDestroySurface(re->win->egl_disp, rsc->surface);
587 if (rsc->context) eglDestroyContext(re->win->egl_disp, rsc->context);
588 free(rsc);
589 }
590 eina_list_free(resource_list);
591 LKU(resource_lock);
592
593 // Destroy TLS
594 eina_tls_free(resource_key);
595
596 return 1;
597}
598
599static int
600eng_setup(Evas *e, void *in)
601{
602 Render_Engine *re;
603 Evas_Engine_Info_Wayland_Egl *info;
604
605 info = (Evas_Engine_Info_Wayland_Egl *)in;
606 if (!e->engine.data.output)
607 {
608 re = calloc(1, sizeof(Render_Engine));
609 if (!re) return 0;
610 re->info = info;
611 re->evas = e;
612 e->engine.data.output = re;
613 re->w = e->output.w;
614 re->h = e->output.h;
615
616 re->win = eng_window_new(re->info->info.display,
617 re->info->info.surface,
618 re->info->info.screen,
619 re->info->info.depth, re->w, re->h,
620 re->info->indirect,
621 re->info->info.destination_alpha,
622 re->info->info.rotation);
623 if (!re->win)
624 {
625 free(re);
626 e->engine.data.output = NULL;
627 return 0;
628 }
629
630 gl_wins++;
631 if (!initted)
632 {
633 evas_common_cpu_init();
634 evas_common_blend_init();
635 evas_common_image_init();
636 evas_common_convert_init();
637 evas_common_scale_init();
638 evas_common_rectangle_init();
639 evas_common_polygon_init();
640 evas_common_line_init();
641 evas_common_font_init();
642 evas_common_draw_init();
643 evas_common_tilebuf_init();
644
645 // Initialize TLS
646 if (eina_tls_new(&resource_key) == EINA_FALSE)
647 ERR("Error creating tls key");
648
649 DBG("TLS KEY create... %d", resource_key);
650
651 initted = 1;
652 }
653 }
654 else
655 {
656 if (!(re = e->engine.data.output)) return 0;
657 if (_re_wincheck(re))
658 {
659 if ((re->info->info.display != re->win->disp) ||
660 (re->info->info.surface != re->win->surface) ||
661 (re->info->info.screen != re->win->screen) ||
662 (re->info->info.depth != re->win->depth) ||
663 (re->info->info.destination_alpha != re->win->alpha) ||
664 (re->info->info.rotation != re->win->rot))
665 {
666 int inc = 0;
667
668 /* if we already have a window surface, check for NULL input surface.
669 * this will mean we are hiding the window and should destroy
670 * things properly */
671 if ((re->win->surface) && (re->info->info.surface = NULL))
672 {
673 if (re->win)
674 {
675 eng_window_free(re->win);
676 gl_wins--;
677 }
678 free(re);
679 e->engine.data.output = NULL;
680 return 0;
681 }
682
683 if (re->win)
684 {
685 re->win->gl_context->references++;
686 eng_window_free(re->win);
687 inc = 1;
688 gl_wins--;
689 }
690 re->w = e->output.w;
691 re->h = e->output.h;
692 re->win = eng_window_new(re->info->info.display,
693 re->info->info.surface,
694 re->info->info.screen,
695 re->info->info.depth,
696 re->w, re->h,
697 re->info->indirect,
698 re->info->info.destination_alpha,
699 re->info->info.rotation);
700 eng_window_use(re->win);
701 if (re->win) gl_wins++;
702 if ((re->win) && (inc))
703 re->win->gl_context->references--;
704 }
705 else if ((re->win->w != e->output.w) ||
706 (re->win->h != e->output.h))
707 {
708 re->w = e->output.w;
709 re->h = e->output.h;
710 re->win->w = e->output.w;
711 re->win->h = e->output.h;
712 eng_window_use(re->win);
713 evas_gl_common_context_resize(re->win->gl_context,
714 re->win->w, re->win->h,
715 re->win->rot);
716 }
717 }
718 }
719
720 if (!re->win)
721 {
722 free(re);
723 e->engine.data.output = NULL;
724 return 0;
725 }
726
727 if (!e->engine.data.output)
728 {
729 if (re->win)
730 {
731 eng_window_free(re->win);
732 gl_wins--;
733 }
734 free(re);
735 e->engine.data.output = NULL;
736 return 0;
737 }
738 re->tb = evas_common_tilebuf_new(re->win->w, re->win->h);
739 if (!re->tb)
740 {
741 if (re->win)
742 {
743 eng_window_free(re->win);
744 gl_wins--;
745 }
746 free(re);
747 e->engine.data.output = NULL;
748 return 0;
749 }
750 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
751
752 if (!e->engine.data.context)
753 {
754 e->engine.data.context =
755 e->engine.func->context_new(e->engine.data.output);
756 }
757
758 eng_window_use(re->win);
759
760 re->vsync = 0;
761 _sym_init();
762 _extensions_init(re);
763
764 // This is used in extensions. Not pretty but can't get display otherwise.
765 current_engine = re;
766
767 return 1;
768}
769
770static void
771eng_output_free(void *data)
772{
773 Render_Engine *re;
774
775 re = (Render_Engine *)data;
776
777 if (re)
778 {
779#if 0
780 // Destroy the resource surface
781 // Only required for EGL case
782 if (re->surface)
783 eglDestroySurface(re->win->egl_disp, re->surface);
784
785 // Destroy the resource context
786 _destroy_internal_context(re, context);
787#endif
788 if (re->win)
789 {
790 if ((initted == 1) && (gl_wins == 1))
791 _destroy_internal_glue_resources(re);
792 eng_window_free(re->win);
793 gl_wins--;
794 }
795 evas_common_tilebuf_free(re->tb);
796 free(re);
797 }
798 if ((initted == 1) && (gl_wins == 0))
799 {
800 evas_common_image_shutdown();
801 evas_common_font_shutdown();
802 initted = 0;
803 }
804}
805
806static void
807eng_output_resize(void *data, int w, int h)
808{
809 Render_Engine *re;
810
811 re = (Render_Engine *)data;
812 re->win->w = w;
813 re->win->h = h;
814 eng_window_use(re->win);
815
816 if (re->win->win)
817 wl_egl_window_resize(re->win->win, w, h, 0, 0);
818
819 evas_gl_common_context_resize(re->win->gl_context, w, h, re->win->rot);
820 evas_common_tilebuf_free(re->tb);
821 re->tb = evas_common_tilebuf_new(w, h);
822 if (re->tb)
823 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
824}
825
826static void
827eng_output_tile_size_set(void *data, int w, int h)
828{
829 Render_Engine *re;
830
831 re = (Render_Engine *)data;
832 evas_common_tilebuf_set_tile_size(re->tb, w, h);
833}
834
835static void
836eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
837{
838 Render_Engine *re;
839
840 re = (Render_Engine *)data;
841 eng_window_use(re->win);
842 evas_gl_common_context_resize(re->win->gl_context, re->win->w, re->win->h, re->win->rot);
843 evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
844
845 RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, re->win->w, re->win->h);
846 if ((w <= 0) || (h <= 0)) return;
847 if (!re->win->draw.redraw)
848 {
849#if 1
850 re->win->draw.x1 = x;
851 re->win->draw.y1 = y;
852 re->win->draw.x2 = x + w - 1;
853 re->win->draw.y2 = y + h - 1;
854#else
855 re->win->draw.x1 = 0;
856 re->win->draw.y1 = 0;
857 re->win->draw.x2 = re->win->w - 1;
858 re->win->draw.y2 = re->win->h - 1;
859#endif
860 }
861 else
862 {
863 if (x < re->win->draw.x1) re->win->draw.x1 = x;
864 if (y < re->win->draw.y1) re->win->draw.y1 = y;
865 if ((x + w - 1) > re->win->draw.x2) re->win->draw.x2 = x + w - 1;
866 if ((y + h - 1) > re->win->draw.y2) re->win->draw.y2 = y + h - 1;
867 }
868 re->win->draw.redraw = 1;
869}
870
871static void
872eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
873{
874 Render_Engine *re;
875
876 re = (Render_Engine *)data;
877 evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
878}
879
880static void
881eng_output_redraws_clear(void *data)
882{
883 Render_Engine *re;
884
885 re = (Render_Engine *)data;
886 evas_common_tilebuf_clear(re->tb);
887/* re->win->draw.redraw = 0;*/
888// INF("GL: finish update cycle!");
889}
890
891/* vsync games - not for now though */
892#define VSYNC_TO_SCREEN 1
893
894static void *
895eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
896{
897 Render_Engine *re;
898 Tilebuf_Rect *rects;
899
900 re = (Render_Engine *)data;
901 /* get the upate rect surface - return engine data as dummy */
902 rects = evas_common_tilebuf_get_render_rects(re->tb);
903 if (rects)
904 {
905 evas_common_tilebuf_free_render_rects(rects);
906 evas_common_tilebuf_clear(re->tb);
907 eng_window_use(re->win);
908 if (!_re_wincheck(re)) return NULL;
909 evas_gl_common_context_flush(re->win->gl_context);
910 evas_gl_common_context_newframe(re->win->gl_context);
911 if (x) *x = 0;
912 if (y) *y = 0;
913 if (w) *w = re->win->w;
914 if (h) *h = re->win->h;
915 if (cx) *cx = 0;
916 if (cy) *cy = 0;
917 if (cw) *cw = re->win->w;
918 if (ch) *ch = re->win->h;
919 return re->win->gl_context->def_surface;
920 }
921 return NULL;
922}
923
924//#define FRAMECOUNT 1
925
926#ifdef FRAMECOUNT
927static double
928get_time(void)
929{
930 struct timeval timev;
931
932 gettimeofday(&timev, NULL);
933 return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
934}
935#endif
936
937static int safe_native = -1;
938
939static void
940eng_output_redraws_next_update_push(void *data, void *surface __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
941{
942 Render_Engine *re;
943#ifdef FRAMECOUNT
944 static double pt = 0.0;
945 double ta, tb;
946#endif
947
948 re = (Render_Engine *)data;
949 /* put back update surface.. in this case just unflag redraw */
950 if (!_re_wincheck(re)) return;
951 re->win->draw.redraw = 0;
952 re->win->draw.drew = 1;
953 evas_gl_common_context_flush(re->win->gl_context);
954 if (safe_native == -1)
955 {
956 const char *s;
957
958 s = getenv("EVAS_GL_SAFE_NATIVE");
959 safe_native = 0;
960 if (s)
961 safe_native = atoi(s);
962 else
963 {
964 s = (const char *)glGetString(GL_RENDERER);
965 if (s)
966 {
967 if (strstr(s, "PowerVR SGX 540") || strstr(s, "Mali-400 MP"))
968 safe_native = 1;
969 }
970 }
971 }
972 // this is needed to make sure all previous rendering is flushed to
973 // buffers/surfaces
974# ifdef FRAMECOUNT
975 double t0 = get_time();
976 ta = t0 - pt;
977 pt = t0;
978# endif
979 // previous rendering should be done and swapped
980 if (!safe_native) eglWaitNative(EGL_CORE_NATIVE_ENGINE);
981# ifdef FRAMECOUNT
982 double t1 = get_time();
983 tb = t1 - t0;
984 printf("... %1.5f -> %1.5f | ", ta, tb);
985# endif
986 if (eglGetError() != EGL_SUCCESS)
987 {
988 printf("Error: eglWaitNative(EGL_CORE_NATIVE_ENGINE) fail.\n");
989 }
990}
991
992static void
993eng_output_flush(void *data)
994{
995 Render_Engine *re;
996
997 re = (Render_Engine *)data;
998 if (!_re_wincheck(re)) return;
999 if (!re->win->draw.drew) return;
1000//x// printf("frame -> flush\n");
1001 re->win->draw.drew = 0;
1002 eng_window_use(re->win);
1003
1004# ifdef FRAMECOUNT
1005 double t0 = get_time();
1006# endif
1007
1008 if (!re->vsync)
1009 {
1010 if (re->info->vsync) eglSwapInterval(re->win->egl_disp, 1);
1011 else eglSwapInterval(re->win->egl_disp, 0);
1012 re->vsync = 1;
1013 }
1014
1015 if (re->info->callback.pre_swap)
1016 re->info->callback.pre_swap(re->info->callback.data, re->evas);
1017
1018 eglSwapBuffers(re->win->egl_disp, re->win->egl_surface[0]);
1019 if (!safe_native) eglWaitGL();
1020
1021 if (re->info->callback.post_swap)
1022 re->info->callback.post_swap(re->info->callback.data, re->evas);
1023
1024 if (eglGetError() != EGL_SUCCESS)
1025 printf("Error: eglSwapBuffers() fail.\n");
1026
1027# ifdef FRAMECOUNT
1028 double t1 = get_time();
1029 printf("%1.5f\n", t1 - t0);
1030# endif
1031}
1032
1033static void
1034eng_output_idle_flush(void *data)
1035{
1036 Render_Engine *re;
1037
1038 re = (Render_Engine *)data;
1039}
1040
1041static void
1042eng_output_dump(void *data)
1043{
1044 Render_Engine *re;
1045
1046 re = (Render_Engine *)data;
1047 evas_common_image_image_all_unload();
1048 evas_common_font_font_all_unload();
1049 evas_gl_common_image_all_unload(re->win->gl_context);
1050 _re_winfree(re);
1051}
1052
1053static void
1054eng_context_cutout_add(void *data __UNUSED__, void *context, int x, int y, int w, int h)
1055{
1056// Render_Engine *re;
1057//
1058// re = (Render_Engine *)data;
1059// re->win->gl_context->dc = context;
1060 evas_common_draw_context_add_cutout(context, x, y, w, h);
1061}
1062
1063static void
1064eng_context_cutout_clear(void *data __UNUSED__, void *context)
1065{
1066// Render_Engine *re;
1067//
1068// re = (Render_Engine *)data;
1069// re->win->gl_context->dc = context;
1070 evas_common_draw_context_clear_cutouts(context);
1071}
1072
1073static void
1074eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
1075{
1076 Render_Engine *re;
1077
1078 re = (Render_Engine *)data;
1079 eng_window_use(re->win);
1080 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
1081 re->win->gl_context->dc = context;
1082 evas_gl_common_rect_draw(re->win->gl_context, x, y, w, h);
1083}
1084
1085static void
1086eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
1087{
1088 Render_Engine *re;
1089
1090 re = (Render_Engine *)data;
1091 eng_window_use(re->win);
1092 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
1093 re->win->gl_context->dc = context;
1094 evas_gl_common_line_draw(re->win->gl_context, x1, y1, x2, y2);
1095}
1096
1097static void *
1098eng_polygon_point_add(void *data, void *context __UNUSED__, void *polygon, int x, int y)
1099{
1100 Render_Engine *re;
1101
1102 re = (Render_Engine *)data;
1103 return evas_gl_common_poly_point_add(polygon, x, y);
1104}
1105
1106static void *
1107eng_polygon_points_clear(void *data, void *context __UNUSED__, void *polygon)
1108{
1109 Render_Engine *re;
1110
1111 re = (Render_Engine *)data;
1112 return evas_gl_common_poly_points_clear(polygon);
1113}
1114
1115static void
1116eng_polygon_draw(void *data, void *context, void *surface __UNUSED__, void *polygon, int x, int y)
1117{
1118 Render_Engine *re;
1119
1120 re = (Render_Engine *)data;
1121 eng_window_use(re->win);
1122 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
1123 re->win->gl_context->dc = context;
1124 evas_gl_common_poly_draw(re->win->gl_context, polygon, x, y);
1125}
1126
1127static int
1128eng_image_alpha_get(void *data __UNUSED__, void *image)
1129{
1130// Render_Engine *re;
1131 Evas_GL_Image *im;
1132
1133// re = (Render_Engine *)data;
1134 if (!image) return 1;
1135 im = image;
1136 return im->alpha;
1137}
1138
1139static int
1140eng_image_colorspace_get(void *data __UNUSED__, void *image)
1141{
1142// Render_Engine *re;
1143 Evas_GL_Image *im;
1144
1145// re = (Render_Engine *)data;
1146 if (!image) return EVAS_COLORSPACE_ARGB8888;
1147 im = image;
1148 return im->cs.space;
1149}
1150
1151static void
1152eng_image_mask_create(void *data __UNUSED__, void *image)
1153{
1154 Evas_GL_Image *im;
1155
1156 if (!image) return;
1157 im = image;
1158 if (!im->im->image.data)
1159 evas_cache_image_load_data(&im->im->cache_entry);
1160 if (!im->tex)
1161 im->tex = evas_gl_common_texture_new(im->gc, im->im);
1162}
1163
1164
1165static void *
1166eng_image_alpha_set(void *data, void *image, int has_alpha)
1167{
1168 Render_Engine *re;
1169 Evas_GL_Image *im;
1170
1171 re = (Render_Engine *)data;
1172 if (!image) return NULL;
1173 im = image;
1174 if (im->alpha == has_alpha) return image;
1175 if (im->native.data)
1176 {
1177 im->alpha = has_alpha;
1178 return image;
1179 }
1180 eng_window_use(re->win);
1181 if ((im->tex) && (im->tex->pt->dyn.img))
1182 {
1183 im->alpha = has_alpha;
1184 im->tex->alpha = im->alpha;
1185 return image;
1186 }
1187 /* FIXME: can move to gl_common */
1188 if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im;
1189 if ((has_alpha) && (im->im->cache_entry.flags.alpha)) return image;
1190 else if ((!has_alpha) && (!im->im->cache_entry.flags.alpha)) return image;
1191 if (im->references > 1)
1192 {
1193 Evas_GL_Image *im_new;
1194
1195 im_new = evas_gl_common_image_new_from_copied_data
1196 (im->gc, im->im->cache_entry.w, im->im->cache_entry.h,
1197 im->im->image.data,
1198 eng_image_alpha_get(data, image),
1199 eng_image_colorspace_get(data, image));
1200 if (!im_new) return im;
1201 evas_gl_common_image_free(im);
1202 im = im_new;
1203 }
1204 else
1205 evas_gl_common_image_dirty(im, 0, 0, 0, 0);
1206 return evas_gl_common_image_alpha_set(im, has_alpha ? 1 : 0);
1207// im->im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
1208// return image;
1209}
1210
1211static void *
1212eng_image_border_set(void *data __UNUSED__, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
1213{
1214// Render_Engine *re;
1215//
1216// re = (Render_Engine *)data;
1217 return image;
1218}
1219
1220static void
1221eng_image_border_get(void *data __UNUSED__, void *image __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
1222{
1223// Render_Engine *re;
1224//
1225// re = (Render_Engine *)data;
1226}
1227
1228static char *
1229eng_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__)
1230{
1231// Render_Engine *re;
1232 Evas_GL_Image *im;
1233
1234// re = (Render_Engine *)data;
1235 if (!image) return NULL;
1236 im = image;
1237 if (!im->im) return NULL;
1238 return im->im->info.comment;
1239}
1240
1241static char *
1242eng_image_format_get(void *data __UNUSED__, void *image)
1243{
1244// Render_Engine *re;
1245 Evas_GL_Image *im;
1246
1247// re = (Render_Engine *)data;
1248 im = image;
1249 return NULL;
1250}
1251
1252static void
1253eng_image_colorspace_set(void *data, void *image, int cspace)
1254{
1255 Render_Engine *re;
1256 Evas_GL_Image *im;
1257
1258 re = (Render_Engine *)data;
1259 if (!image) return;
1260 im = image;
1261 if (im->native.data) return;
1262 /* FIXME: can move to gl_common */
1263 if (im->cs.space == cspace) return;
1264 eng_window_use(re->win);
1265 evas_cache_image_colorspace(&im->im->cache_entry, cspace);
1266 switch (cspace)
1267 {
1268 case EVAS_COLORSPACE_ARGB8888:
1269 if (im->cs.data)
1270 {
1271 if (!im->cs.no_free) free(im->cs.data);
1272 im->cs.data = NULL;
1273 im->cs.no_free = 0;
1274 }
1275 break;
1276 case EVAS_COLORSPACE_YCBCR422P601_PL:
1277 case EVAS_COLORSPACE_YCBCR422P709_PL:
1278 case EVAS_COLORSPACE_YCBCR422601_PL:
1279 case EVAS_COLORSPACE_YCBCR420NV12601_PL:
1280 case EVAS_COLORSPACE_YCBCR420TM12601_PL:
1281 if (im->tex) evas_gl_common_texture_free(im->tex);
1282 im->tex = NULL;
1283 if (im->cs.data)
1284 {
1285 if (!im->cs.no_free) free(im->cs.data);
1286 }
1287 if (im->im->cache_entry.h > 0)
1288 im->cs.data =
1289 calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2);
1290 else
1291 im->cs.data = NULL;
1292 im->cs.no_free = 0;
1293 break;
1294 default:
1295 abort();
1296 break;
1297 }
1298 im->cs.space = cspace;
1299}
1300
1301/////////////////////////////////////////////////////////////////////////
1302//
1303//
1304typedef struct _Native Native;
1305
1306struct _Native
1307{
1308 Evas_Native_Surface ns;
1309 struct wl_egl_pixmap *pixmap;
1310
1311 void *egl_surface;
1312};
1313
1314// FIXME: this is enabled so updates happen - but its SLOOOOOOOOOOOOOOOW
1315// (i am sure this is the reason) not to mention seemingly superfluous. but
1316// i need to enable it for it to work on fglrx at least. havent tried nvidia.
1317//
1318// why is this the case? does anyone know? has anyone tried it on other gfx
1319// drivers?
1320//
1321//#define GLX_TEX_PIXMAP_RECREATE 1
1322
1323static void
1324_native_bind_cb(void *data, void *image)
1325{
1326 Evas_GL_Image *im = image;
1327 Native *n = im->native.data;
1328
1329 if (n->egl_surface)
1330 {
1331 if (glsym_glEGLImageTargetTexture2DOES)
1332 {
1333 glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, n->egl_surface);
1334 if (eglGetError() != EGL_SUCCESS)
1335 ERR("glEGLImageTargetTexture2DOES() failed.");
1336 }
1337 else
1338 ERR("Try glEGLImageTargetTexture2DOES on EGL with no support");
1339 }
1340 return;
1341 data = NULL;
1342}
1343
1344static void
1345_native_unbind_cb(void *data, void *image)
1346{
1347 Evas_GL_Image *im = image;
1348 /* Native *n = im->native.data; */
1349
1350 /* if (n->ns.type == EVAS_NATIVE_SURFACE_X11) */
1351 /* { */
1352 /* // nothing */
1353 /* } */
1354 /* else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL) */
1355 /* { */
1356 /* glBindTexture(GL_TEXTURE_2D, 0); */
1357 /* GLERR(__FUNCTION__, __FILE__, __LINE__, ""); */
1358 /* } */
1359 return;
1360 data = NULL;
1361}
1362
1363static void
1364_native_free_cb(void *data, void *image)
1365{
1366 Render_Engine *re = data;
1367 Evas_GL_Image *im = image;
1368 Native *n = im->native.data;
1369 uint32_t texid;
1370// uint32_t pmid, texid;
1371
1372 /* eina_hash_del(re->win->gl_context->shared->native_pm_hash, &pmid, im); */
1373 if (n->egl_surface)
1374 {
1375 if (glsym_eglDestroyImage)
1376 {
1377 glsym_eglDestroyImage(re->win->egl_disp, n->egl_surface);
1378 if (eglGetError() != EGL_SUCCESS)
1379 ERR("eglDestroyImage() failed.");
1380 }
1381 else
1382 ERR("Try eglDestroyImage on EGL with no support");
1383 }
1384
1385 im->native.data = NULL;
1386 im->native.func.data = NULL;
1387 im->native.func.bind = NULL;
1388 im->native.func.unbind = NULL;
1389 im->native.func.free = NULL;
1390 free(n);
1391}
1392
1393static void *
1394eng_image_native_set(void *data, void *image, void *native)
1395{
1396 Render_Engine *re = (Render_Engine *)data;
1397 Evas_Native_Surface *ns = native;
1398 Evas_GL_Image *im = image, *im2 = NULL;
1399 Native *n = NULL;
1400// uint32_t pmid;
1401// uint32_t texid;
1402 unsigned int tex = 0;
1403 unsigned int fbo = 0;
1404
1405 if (!im)
1406 {
1407 if ((!ns) && (ns->type == EVAS_NATIVE_SURFACE_OPENGL))
1408 {
1409 im = evas_gl_common_image_new_from_data(re->win->gl_context,
1410 ns->data.opengl.w,
1411 ns->data.opengl.h,
1412 NULL, 1,
1413 EVAS_COLORSPACE_ARGB8888);
1414 }
1415 else
1416 return NULL;
1417 }
1418
1419 if (ns)
1420 {
1421 /* vis = ns->data.x11.visual; */
1422 /* pm = ns->data.x11.pixmap; */
1423 if (im->native.data)
1424 {
1425 Evas_Native_Surface *ens = im->native.data;
1426 /* if ((ens->data.x11.visual == vis) && */
1427 /* (ens->data.x11.pixmap == pm)) */
1428 return im;
1429 }
1430 }
1431 if ((!ns) && (!im->native.data)) return im;
1432
1433 eng_window_use(re->win);
1434
1435 if (im->native.data)
1436 {
1437 if (im->native.func.free)
1438 im->native.func.free(im->native.func.data, im);
1439 evas_gl_common_image_native_disable(im);
1440 }
1441
1442 if (!ns) return im;
1443
1444 /* if (ns->type == EVAS_NATIVE_SURFACE_X11) */
1445 /* { */
1446 /* pmid = pm; */
1447 /* im2 = eina_hash_find(re->win->gl_context->shared->native_pm_hash, &pmid); */
1448 if (im2 == im) return im;
1449 if (im2)
1450 {
1451 n = im2->native.data;
1452 if (n)
1453 {
1454 evas_gl_common_image_ref(im2);
1455 evas_gl_common_image_free(im);
1456 return im2;
1457 }
1458 }
1459
1460 im2 = evas_gl_common_image_new_from_data(re->win->gl_context,
1461 im->w, im->h, NULL, im->alpha,
1462 EVAS_COLORSPACE_ARGB8888);
1463 evas_gl_common_image_free(im);
1464 im = im2;
1465 /* if (native) */
1466 /* { */
1467 /* n = calloc(1, sizeof(Native)); */
1468 /* if (n) */
1469 /* { */
1470 /* EGLConfig egl_config; */
1471 /* int config_attrs[20]; */
1472 /* int num_config, i = 0; */
1473
1474 /* eina_hash_add(re->win->gl_context->shared->native_pm_hash, &pmid, im); */
1475
1476 /* config_attrs[i++] = EGL_RED_SIZE; */
1477 /* config_attrs[i++] = 8; */
1478 /* config_attrs[i++] = EGL_GREEN_SIZE; */
1479 /* config_attrs[i++] = 8; */
1480 /* config_attrs[i++] = EGL_BLUE_SIZE; */
1481 /* config_attrs[i++] = 8; */
1482 /* config_attrs[i++] = EGL_ALPHA_SIZE; */
1483 /* config_attrs[i++] = 8; */
1484 /* config_attrs[i++] = EGL_DEPTH_SIZE; */
1485 /* config_attrs[i++] = 0; */
1486 /* config_attrs[i++] = EGL_STENCIL_SIZE; */
1487 /* config_attrs[i++] = 0; */
1488 /* config_attrs[i++] = EGL_RENDERABLE_TYPE; */
1489 /* config_attrs[i++] = EGL_OPENGL_ES2_BIT; */
1490 /* config_attrs[i++] = EGL_SURFACE_TYPE; */
1491 /* config_attrs[i++] = EGL_PIXMAP_BIT; */
1492 /* config_attrs[i++] = EGL_NONE; */
1493
1494 /* if (!eglChooseConfig(re->win->egl_disp, config_attrs, */
1495 /* &egl_config, 1, &num_config)) */
1496 /* ERR("eglChooseConfig() failed for, num_config = %i", num_config); */
1497 /* memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface)); */
1498 /* n->pixmap = pm; */
1499 /* if (glsym_eglCreateImage) */
1500 /* n->egl_surface = glsym_eglCreateImage(re->win->egl_disp, */
1501 /* EGL_NO_CONTEXT, */
1502 /* EGL_NATIVE_PIXMAP_KHR, */
1503 /* (void *)pm, */
1504 /* NULL); */
1505 /* else */
1506 /* ERR("Try eglCreateImage on EGL with no support"); */
1507 /* if (!n->egl_surface) */
1508 /* ERR("eglCreatePixmapSurface() for 0x%x failed", (unsigned int)pm); */
1509 /* im->native.yinvert = 1; */
1510 /* im->native.loose = 0; */
1511 /* im->native.data = n; */
1512 /* im->native.func.data = re; */
1513 /* im->native.func.bind = _native_bind_cb; */
1514 /* im->native.func.unbind = _native_unbind_cb; */
1515 /* im->native.func.free = _native_free_cb; */
1516 /* im->native.target = GL_TEXTURE_2D; */
1517 /* im->native.mipmap = 0; */
1518 /* evas_gl_common_image_native_enable(im); */
1519 /* } */
1520 /* } */
1521 return im;
1522}
1523
1524static void *
1525eng_image_native_get(void *data __UNUSED__, void *image)
1526{
1527 Evas_GL_Image *im = image;
1528 Native *n;
1529 if (!im) return NULL;
1530 n = im->native.data;
1531 if (!n) return NULL;
1532 return &(n->ns);
1533}
1534
1535#if 0 // filtering disabled
1536static void
1537eng_image_draw_filtered(void *data, void *context, void *surface,
1538 void *image, Evas_Filter_Info *filter)
1539{
1540 Render_Engine *re = data;
1541
1542 if (!image) return;
1543 eng_window_use(re->win);
1544 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
1545 re->win->gl_context->dc = context;
1546
1547 evas_gl_common_filter_draw(re->win->gl_context, image, filter);
1548}
1549
1550static Filtered_Image *
1551eng_image_filtered_get(void *im, uint8_t *key, size_t keylen)
1552{
1553 return evas_gl_common_image_filtered_get(im, key, keylen);
1554}
1555
1556static Filtered_Image *
1557eng_image_filtered_save(void *im, void *fim, uint8_t *key, size_t keylen)
1558{
1559 return evas_gl_common_image_filtered_save(im, fim, key, keylen);
1560}
1561
1562static void
1563eng_image_filtered_free(void *im, Filtered_Image *fim)
1564{
1565 evas_gl_common_image_filtered_free(im, fim);
1566}
1567#endif
1568
1569static void *
1570eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
1571{
1572 Render_Engine *re;
1573
1574 re = (Render_Engine *)data;
1575 *error = EVAS_LOAD_ERROR_NONE;
1576 eng_window_use(re->win);
1577 return evas_gl_common_image_load(re->win->gl_context, file, key, lo, error);
1578}
1579
1580static void *
1581eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
1582{
1583 Render_Engine *re;
1584
1585 re = (Render_Engine *)data;
1586 eng_window_use(re->win);
1587 return evas_gl_common_image_new_from_data(re->win->gl_context, w, h, image_data, alpha, cspace);
1588}
1589
1590static void *
1591eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
1592{
1593 Render_Engine *re;
1594
1595 re = (Render_Engine *)data;
1596 eng_window_use(re->win);
1597 return evas_gl_common_image_new_from_copied_data(re->win->gl_context, w, h, image_data, alpha, cspace);
1598}
1599
1600static void
1601eng_image_free(void *data, void *image)
1602{
1603 Render_Engine *re;
1604
1605 re = (Render_Engine *)data;
1606 if (!image) return;
1607 eng_window_use(re->win);
1608 evas_gl_common_image_free(image);
1609}
1610
1611static void
1612eng_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
1613{
1614 if (!image)
1615 {
1616 *w = 0;
1617 *h = 0;
1618 return;
1619 }
1620 if (w) *w = ((Evas_GL_Image *)image)->w;
1621 if (h) *h = ((Evas_GL_Image *)image)->h;
1622}
1623
1624static void *
1625eng_image_size_set(void *data, void *image, int w, int h)
1626{
1627 Render_Engine *re;
1628 Evas_GL_Image *im = image;
1629 Evas_GL_Image *im_old;
1630
1631 re = (Render_Engine *)data;
1632 if (!im) return NULL;
1633 if (im->native.data)
1634 {
1635 im->w = w;
1636 im->h = h;
1637 return image;
1638 }
1639 eng_window_use(re->win);
1640 if ((im->tex) && (im->tex->pt->dyn.img))
1641 {
1642 evas_gl_common_texture_free(im->tex);
1643 im->tex = NULL;
1644 im->w = w;
1645 im->h = h;
1646 im->tex = evas_gl_common_texture_dynamic_new(im->gc, im);
1647 return image;
1648 }
1649 im_old = image;
1650
1651 switch (eng_image_colorspace_get(data, image))
1652 {
1653 case EVAS_COLORSPACE_YCBCR422P601_PL:
1654 case EVAS_COLORSPACE_YCBCR422P709_PL:
1655 case EVAS_COLORSPACE_YCBCR422601_PL:
1656 case EVAS_COLORSPACE_YCBCR420NV12601_PL:
1657 case EVAS_COLORSPACE_YCBCR420TM12601_PL:
1658 w &= ~0x1;
1659 break;
1660 }
1661
1662 if ((im_old) &&
1663 ((int)im_old->im->cache_entry.w == w) &&
1664 ((int)im_old->im->cache_entry.h == h))
1665 return image;
1666 if (im_old)
1667 {
1668 im = evas_gl_common_image_new(re->win->gl_context, w, h,
1669 eng_image_alpha_get(data, image),
1670 eng_image_colorspace_get(data, image));
1671 /*
1672 evas_common_load_image_data_from_file(im_old->im);
1673 if (im_old->im->image->data)
1674 {
1675 evas_common_blit_rectangle(im_old->im, im->im, 0, 0, w, h, 0, 0);
1676 evas_common_cpu_end_opt();
1677 }
1678 */
1679 evas_gl_common_image_free(im_old);
1680 }
1681 else
1682 im = evas_gl_common_image_new(re->win->gl_context, w, h, 1, EVAS_COLORSPACE_ARGB8888);
1683 return im;
1684}
1685
1686static void *
1687eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
1688{
1689 Render_Engine *re;
1690 Evas_GL_Image *im = image;
1691
1692 re = (Render_Engine *)data;
1693 if (!image) return NULL;
1694 if (im->native.data) return image;
1695 eng_window_use(re->win);
1696 evas_gl_common_image_dirty(image, x, y, w, h);
1697 return image;
1698}
1699
1700static void *
1701eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data, int *err)
1702{
1703 Render_Engine *re;
1704 Evas_GL_Image *im;
1705 int error;
1706
1707 re = (Render_Engine *)data;
1708 if (!image)
1709 {
1710 *image_data = NULL;
1711 if (err) *err = EVAS_LOAD_ERROR_GENERIC;
1712 return NULL;
1713 }
1714 im = image;
1715 if (im->native.data)
1716 {
1717 *image_data = NULL;
1718 if (err) *err = EVAS_LOAD_ERROR_NONE;
1719 return im;
1720 }
1721
1722 eng_window_use(re->win);
1723
1724 if ((im->tex) && (im->tex->pt) && (im->tex->pt->dyn.img) && (im->cs.space == EVAS_COLORSPACE_ARGB8888))
1725 {
1726 if (im->tex->pt->dyn.checked_out > 0)
1727 {
1728 im->tex->pt->dyn.checked_out++;
1729 *image_data = im->tex->pt->dyn.data;
1730 if (err) *err = EVAS_LOAD_ERROR_NONE;
1731 return im;
1732 }
1733 *image_data = im->tex->pt->dyn.data = glsym_eglMapImageSEC(re->win->egl_disp, im->tex->pt->dyn.img);
1734
1735 if (!im->tex->pt->dyn.data)
1736 {
1737 if (err) *err = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
1738 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1739 return im;
1740 }
1741 im->tex->pt->dyn.checked_out++;
1742
1743 if (err) *err = EVAS_LOAD_ERROR_NONE;
1744 return im;
1745 }
1746
1747 /* Engine can fail to create texture after cache drop like eng_image_content_hint_set function,
1748 so it is need to add code which check im->im's NULL value*/
1749
1750 if (!im->im)
1751 {
1752 *image_data = NULL;
1753 if (err) *err = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
1754 return NULL;
1755 }
1756
1757 error = evas_cache_image_load_data(&im->im->cache_entry);
1758 switch (im->cs.space)
1759 {
1760 case EVAS_COLORSPACE_ARGB8888:
1761 if (to_write)
1762 {
1763 if (im->references > 1)
1764 {
1765 Evas_GL_Image *im_new;
1766
1767 im_new = evas_gl_common_image_new_from_copied_data
1768 (im->gc, im->im->cache_entry.w, im->im->cache_entry.h,
1769 im->im->image.data,
1770 eng_image_alpha_get(data, image),
1771 eng_image_colorspace_get(data, image));
1772 if (!im_new)
1773 {
1774 *image_data = NULL;
1775 if (err) *err = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
1776 return NULL;
1777 }
1778 evas_gl_common_image_free(im);
1779 im = im_new;
1780 }
1781 else
1782 evas_gl_common_image_dirty(im, 0, 0, 0, 0);
1783 }
1784 *image_data = im->im->image.data;
1785 break;
1786 case EVAS_COLORSPACE_YCBCR422P601_PL:
1787 case EVAS_COLORSPACE_YCBCR422P709_PL:
1788 case EVAS_COLORSPACE_YCBCR422601_PL:
1789 case EVAS_COLORSPACE_YCBCR420NV12601_PL:
1790 case EVAS_COLORSPACE_YCBCR420TM12601_PL:
1791 *image_data = im->cs.data;
1792 break;
1793 default:
1794 abort();
1795 break;
1796 }
1797 if (err) *err = error;
1798 return im;
1799}
1800
1801static void *
1802eng_image_data_put(void *data, void *image, DATA32 *image_data)
1803{
1804 Render_Engine *re;
1805 Evas_GL_Image *im, *im2;
1806
1807 re = (Render_Engine *)data;
1808 if (!image) return NULL;
1809 im = image;
1810 if (im->native.data) return image;
1811 eng_window_use(re->win);
1812 if ((im->tex) && (im->tex->pt)
1813 && (im->tex->pt->dyn.data)
1814 && (im->cs.space == EVAS_COLORSPACE_ARGB8888))
1815 {
1816 int w, h;
1817
1818 if (im->tex->pt->dyn.data == image_data)
1819 {
1820 im->tex->pt->dyn.checked_out--;
1821 if (im->tex->pt->dyn.checked_out == 0)
1822 glsym_eglUnmapImageSEC(re->win->egl_disp, im->tex->pt->dyn.img);
1823 return image;
1824 }
1825
1826 w = im->im->cache_entry.w;
1827 h = im->im->cache_entry.h;
1828 im2 = eng_image_new_from_data(data, w, h, image_data,
1829 eng_image_alpha_get(data, image),
1830 eng_image_colorspace_get(data, image));
1831 if (!im2) return im;
1832 evas_gl_common_image_free(im);
1833 im = im2;
1834 evas_gl_common_image_dirty(im, 0, 0, 0, 0);
1835 return im;
1836 }
1837 switch (im->cs.space)
1838 {
1839 case EVAS_COLORSPACE_ARGB8888:
1840 if (image_data != im->im->image.data)
1841 {
1842 int w, h;
1843
1844 w = im->im->cache_entry.w;
1845 h = im->im->cache_entry.h;
1846 im2 = eng_image_new_from_data(data, w, h, image_data,
1847 eng_image_alpha_get(data, image),
1848 eng_image_colorspace_get(data, image));
1849 if (!im2) return im;
1850 evas_gl_common_image_free(im);
1851 im = im2;
1852 }
1853 break;
1854 case EVAS_COLORSPACE_YCBCR422P601_PL:
1855 case EVAS_COLORSPACE_YCBCR422P709_PL:
1856 case EVAS_COLORSPACE_YCBCR422601_PL:
1857 case EVAS_COLORSPACE_YCBCR420NV12601_PL:
1858 case EVAS_COLORSPACE_YCBCR420TM12601_PL:
1859 if (image_data != im->cs.data)
1860 {
1861 if (im->cs.data)
1862 {
1863 if (!im->cs.no_free) free(im->cs.data);
1864 }
1865 im->cs.data = image_data;
1866 }
1867 evas_gl_common_image_dirty(im, 0, 0, 0, 0);
1868 break;
1869 default:
1870 abort();
1871 break;
1872 }
1873 return im;
1874}
1875
1876static void
1877eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
1878{
1879 Evas_GL_Image *gim = image;
1880 RGBA_Image *im;
1881
1882 if (!gim) return;
1883 if (gim->native.data) return;
1884 im = (RGBA_Image *)gim->im;
1885 if (!im) return;
1886 evas_cache_image_preload_data(&im->cache_entry, target);
1887}
1888
1889static void
1890eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
1891{
1892 Evas_GL_Image *gim = image;
1893 RGBA_Image *im;
1894
1895 if (!gim) return;
1896 if (gim->native.data) return;
1897 im = (RGBA_Image *)gim->im;
1898 if (!im) return;
1899 evas_cache_image_preload_cancel(&im->cache_entry, target);
1900}
1901
1902static void
1903eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
1904{
1905 Render_Engine *re;
1906
1907 re = (Render_Engine *)data;
1908 if (!image) return;
1909 eng_window_use(re->win);
1910 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
1911 re->win->gl_context->dc = context;
1912 evas_gl_common_image_draw(re->win->gl_context, image,
1913 src_x, src_y, src_w, src_h,
1914 dst_x, dst_y, dst_w, dst_h,
1915 smooth);
1916}
1917
1918static void
1919eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
1920{
1921 if (image) evas_gl_common_image_scale_hint_set(image, hint);
1922}
1923
1924static int
1925eng_image_scale_hint_get(void *data __UNUSED__, void *image)
1926{
1927 Evas_GL_Image *gim = image;
1928 if (!gim) return EVAS_IMAGE_SCALE_HINT_NONE;
1929 return gim->scale_hint;
1930}
1931
1932static void
1933eng_image_map_draw(void *data, void *context, void *surface, void *image, int npoints, RGBA_Map_Point *p, int smooth, int level)
1934{
1935 Evas_GL_Image *gim = image;
1936 Render_Engine *re;
1937
1938 re = (Render_Engine *)data;
1939 if (!image) return;
1940 eng_window_use(re->win);
1941 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
1942 re->win->gl_context->dc = context;
1943 if (npoints != 4)
1944 {
1945 // FIXME: nash - you didn't fix this
1946 abort();
1947 }
1948 if ((p[0].x == p[3].x) &&
1949 (p[1].x == p[2].x) &&
1950 (p[0].y == p[1].y) &&
1951 (p[3].y == p[2].y) &&
1952 (p[0].x <= p[1].x) &&
1953 (p[0].y <= p[2].y) &&
1954 (p[0].u == 0) &&
1955 (p[0].v == 0) &&
1956 (p[1].u == (gim->w << FP)) &&
1957 (p[1].v == 0) &&
1958 (p[2].u == (gim->w << FP)) &&
1959 (p[2].v == (gim->h << FP)) &&
1960 (p[3].u == 0) &&
1961 (p[3].v == (gim->h << FP)) &&
1962 (p[0].col == 0xffffffff) &&
1963 (p[1].col == 0xffffffff) &&
1964 (p[2].col == 0xffffffff) &&
1965 (p[3].col == 0xffffffff))
1966 {
1967 int dx, dy, dw, dh;
1968
1969 dx = p[0].x >> FP;
1970 dy = p[0].y >> FP;
1971 dw = (p[2].x >> FP) - dx;
1972 dh = (p[2].y >> FP) - dy;
1973 eng_image_draw(data, context, surface, image,
1974 0, 0, gim->w, gim->h, dx, dy, dw, dh, smooth);
1975 }
1976 else
1977 {
1978 evas_gl_common_image_map_draw(re->win->gl_context, image, npoints, p,
1979 smooth, level);
1980 }
1981}
1982
1983static void *
1984eng_image_map_surface_new(void *data, int w, int h, int alpha)
1985{
1986 Render_Engine *re;
1987
1988 re = (Render_Engine *)data;
1989 return evas_gl_common_image_surface_new(re->win->gl_context, w, h, alpha);
1990}
1991
1992static void
1993eng_image_map_surface_free(void *data __UNUSED__, void *surface)
1994{
1995 evas_gl_common_image_free(surface);
1996}
1997
1998static void
1999eng_image_content_hint_set(void *data __UNUSED__, void *image, int hint)
2000{
2001 if (image) evas_gl_common_image_content_hint_set(image, hint);
2002}
2003
2004static int
2005eng_image_content_hint_get(void *data __UNUSED__, void *image)
2006{
2007 Evas_GL_Image *gim = image;
2008 if (!gim) return EVAS_IMAGE_CONTENT_HINT_NONE;
2009 return gim->content_hint;
2010}
2011
2012static void
2013eng_image_cache_flush(void *data)
2014{
2015 Render_Engine *re;
2016 int tmp_size;
2017
2018 re = (Render_Engine *)data;
2019
2020 tmp_size = evas_common_image_get_cache();
2021 evas_common_image_set_cache(0);
2022 evas_common_rgba_image_scalecache_flush();
2023 evas_gl_common_image_cache_flush(re->win->gl_context);
2024 evas_common_image_set_cache(tmp_size);
2025}
2026
2027static void
2028eng_image_cache_set(void *data, int bytes)
2029{
2030 Render_Engine *re;
2031
2032 re = (Render_Engine *)data;
2033 evas_common_image_set_cache(bytes);
2034 evas_common_rgba_image_scalecache_size_set(bytes);
2035 evas_gl_common_image_cache_flush(re->win->gl_context);
2036}
2037
2038static int
2039eng_image_cache_get(void *data __UNUSED__)
2040{
2041 return evas_common_image_get_cache();
2042}
2043
2044static void
2045eng_image_stride_get(void *data __UNUSED__, void *image, int *stride)
2046{
2047 Evas_GL_Image *im = image;
2048
2049 if ((im->tex) && (im->tex->pt->dyn.img))
2050 *stride = im->tex->pt->dyn.stride;
2051 else
2052 *stride = im->w * 4;
2053}
2054
2055static void
2056eng_font_draw(void *data, void *context, void *surface, Evas_Font_Set *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const Evas_Text_Props *intl_props)
2057{
2058 Render_Engine *re;
2059
2060 re = (Render_Engine *)data;
2061 eng_window_use(re->win);
2062 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
2063 re->win->gl_context->dc = context;
2064 {
2065 // FIXME: put im into context so we can free it
2066 static RGBA_Image *im = NULL;
2067
2068 if (!im)
2069 im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
2070 im->cache_entry.w = re->win->w;
2071 im->cache_entry.h = re->win->h;
2072 evas_common_draw_context_font_ext_set(context,
2073 re->win->gl_context,
2074 evas_gl_font_texture_new,
2075 evas_gl_font_texture_free,
2076 evas_gl_font_texture_draw);
2077 evas_common_font_draw(im, context, (RGBA_Font *) font, x, y,
2078 intl_props);
2079 evas_common_draw_context_font_ext_set(context, NULL, NULL, NULL, NULL);
2080 }
2081}
2082
2083static Eina_Bool
2084eng_canvas_alpha_get(void *data, void *info __UNUSED__)
2085{
2086 Render_Engine *re = (Render_Engine *)data;
2087 return re->win->alpha;
2088}
2089
2090static int
2091_set_internal_config(Render_Engine_GL_Surface *sfc, Evas_GL_Config *cfg)
2092{
2093 // Also initialize pixel format here as well...
2094 switch(cfg->color_format)
2095 {
2096 case EVAS_GL_RGB_888:
2097 sfc->rt_fmt = GL_RGB;
2098 sfc->rt_internal_fmt = GL_RGB;
2099 break;
2100 case EVAS_GL_RGBA_8888:
2101 sfc->rt_fmt = GL_RGBA;
2102 sfc->rt_internal_fmt = GL_RGBA;
2103 break;
2104 default:
2105 ERR("Invalid Color Format!");
2106 return 0;
2107 }
2108
2109 switch(cfg->depth_bits)
2110 {
2111 case EVAS_GL_DEPTH_NONE:
2112 break;
2113 case EVAS_GL_DEPTH_BIT_8:
2114 case EVAS_GL_DEPTH_BIT_16:
2115 case EVAS_GL_DEPTH_BIT_24:
2116 // 24 bit doesn't work... just cover it with 16 for now..
2117 sfc->rb_depth_fmt = GL_DEPTH_COMPONENT16;
2118 break;
2119 case EVAS_GL_DEPTH_BIT_32:
2120 default:
2121 ERR("Unsupported Depth Bits Format!");
2122 return 0;
2123 }
2124
2125 switch(cfg->stencil_bits)
2126 {
2127 case EVAS_GL_STENCIL_NONE:
2128 break;
2129 case EVAS_GL_STENCIL_BIT_1:
2130 case EVAS_GL_STENCIL_BIT_2:
2131 case EVAS_GL_STENCIL_BIT_4:
2132 case EVAS_GL_STENCIL_BIT_8:
2133 sfc->rb_stencil_fmt = GL_STENCIL_INDEX8;
2134 break;
2135 case EVAS_GL_STENCIL_BIT_16:
2136 default:
2137 ERR("Unsupported Stencil Bits Format!");
2138 return 0;
2139 }
2140
2141 // Do Packed Depth24_Stencil8 Later...
2142
2143 return 1;
2144}
2145
2146static int
2147_create_rt_buffers(Render_Engine *data __UNUSED__,
2148 Render_Engine_GL_Surface *sfc)
2149{
2150 // Render Target texture
2151 glGenTextures(1, &sfc->rt_tex );
2152
2153 // Depth RenderBuffer - Create storage here...
2154 if (sfc->depth_bits != EVAS_GL_DEPTH_NONE)
2155 glGenRenderbuffers(1, &sfc->rb_depth);
2156
2157 // Stencil RenderBuffer - Create Storage here...
2158 if (sfc->stencil_bits != EVAS_GL_STENCIL_NONE)
2159 glGenRenderbuffers(1, &sfc->rb_stencil);
2160
2161 return 1;
2162}
2163
2164static int
2165_attach_fbo_surface(Render_Engine *data __UNUSED__,
2166 Render_Engine_GL_Surface *sfc,
2167 Render_Engine_GL_Context *ctx)
2168{
2169 int fb_status;
2170
2171 // Initialize Texture
2172 glBindTexture(GL_TEXTURE_2D, sfc->rt_tex );
2173 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2174 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2175 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2176 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2177 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sfc->w, sfc->h, 0,
2178 GL_RGBA, GL_UNSIGNED_BYTE, NULL);
2179 glBindTexture(GL_TEXTURE_2D, 0);
2180
2181
2182 // Attach texture to FBO
2183 glBindFramebuffer(GL_FRAMEBUFFER, ctx->context_fbo);
2184 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
2185 GL_TEXTURE_2D, sfc->rt_tex, 0);
2186
2187 // Depth RenderBuffer - Attach it to FBO
2188 if (sfc->depth_bits != EVAS_GL_DEPTH_NONE)
2189 {
2190 glBindRenderbuffer(GL_RENDERBUFFER, sfc->rb_depth);
2191 glRenderbufferStorage(GL_RENDERBUFFER, sfc->rb_depth_fmt,
2192 sfc->w, sfc->h);
2193 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
2194 GL_RENDERBUFFER, sfc->rb_depth);
2195 glBindRenderbuffer(GL_RENDERBUFFER, 0);
2196 }
2197
2198 // Stencil RenderBuffer - Attach it to FBO
2199 if (sfc->stencil_bits != EVAS_GL_STENCIL_NONE)
2200 {
2201 glBindRenderbuffer(GL_RENDERBUFFER, sfc->rb_stencil);
2202 glRenderbufferStorage(GL_RENDERBUFFER, sfc->rb_stencil_fmt,
2203 sfc->w, sfc->h);
2204 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
2205 GL_RENDERBUFFER, sfc->rb_stencil);
2206 glBindRenderbuffer(GL_RENDERBUFFER, 0);
2207 }
2208
2209 // Check FBO for completeness
2210 fb_status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
2211 if (fb_status != GL_FRAMEBUFFER_COMPLETE)
2212 {
2213 ERR("FBO not complete!");
2214 return 0;
2215 }
2216
2217 return 1;
2218}
2219
2220
2221static void *
2222eng_gl_surface_create(void *data, void *config, int w, int h)
2223{
2224 Render_Engine *re;
2225 Render_Engine_GL_Surface *sfc;
2226 Render_Engine_GL_Resource *rsc;
2227 Evas_GL_Config *cfg;
2228 int ret;
2229
2230 sfc = calloc(1, sizeof(Render_Engine_GL_Surface));
2231 if (!sfc) return NULL;
2232
2233 re = (Render_Engine *)data;
2234 cfg = (Evas_GL_Config *)config;
2235
2236 sfc->initialized = 0;
2237 sfc->fbo_attached = 0;
2238 sfc->w = w;
2239 sfc->h = h;
2240 sfc->depth_bits = cfg->depth_bits;
2241 sfc->stencil_bits = cfg->stencil_bits;
2242 sfc->rt_tex = 0;
2243 sfc->rb_depth = 0;
2244 sfc->rb_stencil = 0;
2245
2246 // Set the internal format based on the config
2247 if (!_set_internal_config(sfc, cfg))
2248 {
2249 ERR("Unsupported Format!");
2250 free(sfc);
2251 return NULL;
2252 }
2253
2254 // Create internal resource context if it hasn't been created already
2255 if ((rsc = eina_tls_get(resource_key)) == NULL)
2256 {
2257 if ((rsc = _create_internal_glue_resources(re)) == NULL)
2258 {
2259 ERR("Error creating internal resources.");
2260 free(sfc);
2261 return NULL;
2262 }
2263 }
2264
2265 // I'm using evas's original context to create the render target texture
2266 // This is to prevent awkwardness in using native_surface_get() function
2267 // If the rt texture creation is deferred till the context is created and
2268 // make_current called, the user can't call native_surface_get() right
2269 // after the surface is created. hence this is done here using evas' context.
2270 ret = eglMakeCurrent(re->win->egl_disp, rsc->surface, rsc->surface, rsc->context);
2271 if (!ret)
2272 {
2273 ERR("xxxMakeCurrent() failed!");
2274 free(sfc);
2275 return NULL;
2276 }
2277
2278 // Create Render texture
2279 if (!_create_rt_buffers(re, sfc))
2280 {
2281 ERR("_create_rt_buffers() failed.");
2282 free(sfc);
2283 return NULL;
2284 }
2285
2286 ret = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2287 if (!ret)
2288 {
2289 ERR("xxxMakeCurrent() failed!");
2290 free(sfc);
2291 return NULL;
2292 }
2293
2294 return sfc;
2295}
2296
2297static int
2298eng_gl_surface_destroy(void *data, void *surface)
2299{
2300 Render_Engine *re;
2301 Render_Engine_GL_Surface *sfc;
2302 Render_Engine_GL_Resource *rsc;
2303 int ret;
2304
2305 re = (Render_Engine *)data;
2306 sfc = (Render_Engine_GL_Surface*)surface;
2307
2308 if (!sfc) return 0;
2309
2310 if ((rsc = eina_tls_get(resource_key)) == EINA_FALSE) return 0;
2311
2312 ret = eglMakeCurrent(re->win->egl_disp, rsc->surface, rsc->surface, rsc->context);
2313 if (!ret)
2314 {
2315 ERR("xxxMakeCurrent() failed!");
2316 return 0;
2317 }
2318
2319 // Delete FBO/RBO and Texture here
2320 if (sfc->rt_tex)
2321 glDeleteTextures(1, &sfc->rt_tex);
2322
2323 if (sfc->rb_depth)
2324 glDeleteRenderbuffers(1, &sfc->rb_depth);
2325
2326 if (sfc->rb_stencil)
2327 glDeleteRenderbuffers(1, &sfc->rb_stencil);
2328
2329 ret = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2330 if (!ret)
2331 {
2332 ERR("xxxMakeCurrent() failed!");
2333 free(sfc);
2334 return 0;
2335 }
2336
2337 free(sfc);
2338 surface = NULL;
2339
2340 return 1;
2341}
2342
2343static void *
2344eng_gl_context_create(void *data, void *share_context)
2345{
2346 Render_Engine *re;
2347 Render_Engine_GL_Context *ctx;
2348 Render_Engine_GL_Context *share_ctx;
2349 int context_attrs[3];
2350
2351 ctx = calloc(1, sizeof(Render_Engine_GL_Context));
2352
2353 if (!ctx) return NULL;
2354
2355 re = (Render_Engine *)data;
2356 share_ctx = (Render_Engine_GL_Context *)share_context;
2357
2358 // Set the share context to Evas' GL context if share_context is NULL.
2359 // Otherwise set it to the given share_context.
2360
2361 // EGL
2362 context_attrs[0] = EGL_CONTEXT_CLIENT_VERSION;
2363 context_attrs[1] = 2;
2364 context_attrs[2] = EGL_NONE;
2365
2366 if (share_ctx)
2367 {
2368 ctx->context = eglCreateContext(re->win->egl_disp,
2369 re->win->egl_config,
2370 share_ctx->context, // Share Context
2371 context_attrs);
2372 }
2373 else
2374 {
2375 ctx->context = eglCreateContext(re->win->egl_disp,
2376 re->win->egl_config,
2377 re->win->egl_context[0], // Evas' GL Context
2378 context_attrs);
2379 }
2380
2381 if (!ctx->context)
2382 {
2383 ERR("eglCreateContext() fail. code=%#x", eglGetError());
2384 return NULL;
2385 }
2386
2387 ctx->initialized = 0;
2388 ctx->context_fbo = 0;
2389 ctx->current_sfc = NULL;
2390
2391 return ctx;
2392}
2393
2394static int
2395eng_gl_context_destroy(void *data, void *context)
2396{
2397 Render_Engine *re;
2398 Render_Engine_GL_Context *ctx;
2399 Render_Engine_GL_Resource *rsc;
2400 int ret;
2401
2402 re = (Render_Engine *)data;
2403 ctx = (Render_Engine_GL_Context*)context;
2404
2405 if (!ctx) return 0;
2406
2407 if ((rsc = eina_tls_get(resource_key)) == EINA_FALSE) return 0;
2408
2409 // 1. Do a make current with the given context
2410 ret = eglMakeCurrent(re->win->egl_disp, rsc->surface,
2411 rsc->surface, ctx->context);
2412 if (!ret)
2413 {
2414 ERR("xxxMakeCurrent() failed!");
2415 return 0;
2416 }
2417
2418 // 2. Delete the FBO
2419 if (ctx->context_fbo)
2420 glDeleteFramebuffers(1, &ctx->context_fbo);
2421
2422 // 3. Destroy the Context
2423 eglDestroyContext(re->win->egl_disp, ctx->context);
2424
2425 ctx->context = EGL_NO_CONTEXT;
2426
2427 ret = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE,
2428 EGL_NO_SURFACE, EGL_NO_CONTEXT);
2429 if (!ret)
2430 {
2431 ERR("xxxMakeCurrent() failed!");
2432 return 0;
2433 }
2434
2435 free(ctx);
2436 context = NULL;
2437
2438 return 1;
2439}
2440
2441static int
2442eng_gl_make_current(void *data __UNUSED__, void *surface, void *context)
2443{
2444 Render_Engine *re;
2445 Render_Engine_GL_Surface *sfc;
2446 Render_Engine_GL_Context *ctx;
2447 int ret = 0;
2448 Render_Engine_GL_Resource *rsc;
2449
2450 re = (Render_Engine *)data;
2451 sfc = (Render_Engine_GL_Surface*)surface;
2452 ctx = (Render_Engine_GL_Context*)context;
2453
2454 // Unset surface/context
2455 if ((!sfc) || (!ctx))
2456 {
2457 ret = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE,
2458 EGL_NO_SURFACE, EGL_NO_CONTEXT);
2459 if (!ret)
2460 {
2461 ERR("xxxMakeCurrent() failed!");
2462 return 0;
2463 }
2464
2465 if (ctx) ctx->current_sfc = NULL;
2466 if (sfc) sfc->current_ctx = NULL;
2467 current_evgl_ctx = NULL;
2468 return 1;
2469 }
2470
2471 // Do a make current only if it's not already current
2472 if ((rsc = eina_tls_get(resource_key)) == EINA_FALSE) return 0;
2473
2474 if ((eglGetCurrentContext() != ctx->context) ||
2475 (eglGetCurrentSurface(EGL_READ) != rsc->surface) ||
2476 (eglGetCurrentSurface(EGL_DRAW) != rsc->surface) )
2477 {
2478 // Flush remainder of what's in Evas' pipeline
2479 if (re->win) eng_window_use(NULL);
2480
2481 // Do a make current
2482 ret = eglMakeCurrent(re->win->egl_disp, rsc->surface,
2483 rsc->surface, ctx->context);
2484 if (!ret)
2485 {
2486 ERR("xxxMakeCurrent() failed!");
2487 return 0;
2488 }
2489 }
2490
2491 // Create FBO if not already created
2492 if (!ctx->initialized)
2493 {
2494 glGenFramebuffers(1, &ctx->context_fbo);
2495 ctx->initialized = 1;
2496 }
2497
2498 // Attach FBO if it hasn't been attached or if surface changed
2499 if ((!sfc->fbo_attached) || (ctx->current_sfc != sfc))
2500 {
2501 if (!_attach_fbo_surface(re, sfc, ctx))
2502 {
2503 ERR("_attach_fbo_surface() failed.");
2504 return 0;
2505 }
2506
2507 if (ctx->current_fbo)
2508 // Bind to the previously bound buffer
2509 glBindFramebuffer(GL_FRAMEBUFFER, ctx->current_fbo);
2510 else
2511 // Bind FBO
2512 glBindFramebuffer(GL_FRAMEBUFFER, ctx->context_fbo);
2513
2514 sfc->fbo_attached = 1;
2515 }
2516
2517 // Set the current surface/context
2518 ctx->current_sfc = sfc;
2519 sfc->current_ctx = ctx;
2520 current_evgl_ctx = ctx;
2521
2522 return 1;
2523}
2524
2525static void *
2526eng_gl_string_query(void *data __UNUSED__, int name)
2527{
2528 switch(name)
2529 {
2530 case EVAS_GL_EXTENSIONS:
2531 return (void*)_evasgl_ext_string;
2532 default:
2533 return NULL;
2534 };
2535}
2536
2537static void *
2538eng_gl_proc_address_get(void *data __UNUSED__, const char *name)
2539{
2540 if (glsym_eglGetProcAddress) return glsym_eglGetProcAddress(name);
2541 return dlsym(RTLD_DEFAULT, name);
2542}
2543
2544static int
2545eng_gl_native_surface_get(void *data, void *surface, void *native_surface)
2546{
2547 Render_Engine *re;
2548 Render_Engine_GL_Surface *sfc;
2549 Evas_Native_Surface *ns;
2550
2551 re = (Render_Engine *)data;
2552 sfc = (Render_Engine_GL_Surface*)surface;
2553 ns = (Evas_Native_Surface*)native_surface;
2554
2555 ns->type = EVAS_NATIVE_SURFACE_OPENGL;
2556 ns->version = EVAS_NATIVE_SURFACE_VERSION;
2557 ns->data.opengl.texture_id = sfc->rt_tex;
2558 ns->data.opengl.x = 0;
2559 ns->data.opengl.y = 0;
2560 ns->data.opengl.w = sfc->w;
2561 ns->data.opengl.h = sfc->h;
2562
2563 return 1;
2564}
2565
2566
2567static const GLubyte *
2568evgl_glGetString(GLenum name)
2569{
2570 if (name == GL_EXTENSIONS)
2571 return (GLubyte *)_gl_ext_string; //glGetString(GL_EXTENSIONS);
2572 else
2573 return glGetString(name);
2574}
2575
2576static void
2577evgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
2578{
2579 Render_Engine_GL_Context *ctx = current_evgl_ctx;
2580
2581 // Take care of BindFramebuffer 0 issue
2582 if (framebuffer==0)
2583 {
2584 if (ctx)
2585 {
2586 glBindFramebuffer(target, ctx->context_fbo);
2587 ctx->current_fbo = 0;
2588 }
2589 }
2590 else
2591 {
2592 glBindFramebuffer(target, framebuffer);
2593
2594 // Save this for restore when doing make current
2595 if (ctx)
2596 ctx->current_fbo = framebuffer;
2597 }
2598}
2599
2600static void
2601evgl_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
2602{
2603 // Add logic to take care when renderbuffer=0
2604 // On a second thought we don't need this
2605 glBindRenderbuffer(target, renderbuffer);
2606}
2607
2608static void
2609evgl_glClearDepthf(GLclampf depth)
2610{
2611 glClearDepthf(depth);
2612}
2613
2614static void
2615evgl_glDepthRangef(GLclampf zNear, GLclampf zFar)
2616{
2617 glDepthRangef(zNear, zFar);
2618}
2619
2620static void
2621evgl_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
2622{
2623 glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
2624}
2625
2626static void
2627evgl_glReleaseShaderCompiler(void)
2628{
2629 glReleaseShaderCompiler();
2630}
2631
2632static void
2633evgl_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
2634{
2635 glShaderBinary(n, shaders, binaryformat, binary, length);
2636}
2637
2638//--------------------------------//
2639//#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
2640// EGL Extensions
2641static void *
2642evgl_evasglCreateImage(int target, void* buffer, int *attrib_list)
2643{
2644 if (current_engine)
2645 {
2646 return glsym_eglCreateImage(current_engine->win->egl_disp,
2647 EGL_NO_CONTEXT,
2648 target,
2649 buffer,
2650 attrib_list);
2651 }
2652 else
2653 {
2654 ERR("Invalid Engine... (Can't acccess EGL Display)\n");
2655 return NULL;
2656 }
2657}
2658
2659static void
2660evgl_evasglDestroyImage(EvasGLImage image)
2661{
2662 if (current_engine)
2663 glsym_eglDestroyImage(current_engine->win->egl_disp, image);
2664 else
2665 ERR("Invalid Engine... (Can't acccess EGL Display)\n");
2666}
2667
2668static void
2669evgl_glEvasGLImageTargetTexture2DOES(GLenum target, EvasGLImage image)
2670{
2671 glsym_glEGLImageTargetTexture2DOES(target, image);
2672}
2673
2674static void
2675evgl_glEvasGLImageTargetRenderbufferStorageOES(GLenum target, EvasGLImage image)
2676{
2677 glsym_glEGLImageTargetTexture2DOES(target, image);
2678}
2679
2680//--------------------------------//
2681
2682
2683static void *
2684eng_gl_api_get(void *data)
2685{
2686 Render_Engine *re;
2687
2688 re = (Render_Engine *)data;
2689
2690 gl_funcs.version = EVAS_GL_API_VERSION;
2691
2692#define ORD(f) EVAS_API_OVERRIDE(f, &gl_funcs, )
2693 // GLES 2.0
2694 ORD(glActiveTexture);
2695 ORD(glAttachShader);
2696 ORD(glBindAttribLocation);
2697 ORD(glBindBuffer);
2698 ORD(glBindTexture);
2699 ORD(glBlendColor);
2700 ORD(glBlendEquation);
2701 ORD(glBlendEquationSeparate);
2702 ORD(glBlendFunc);
2703 ORD(glBlendFuncSeparate);
2704 ORD(glBufferData);
2705 ORD(glBufferSubData);
2706 ORD(glCheckFramebufferStatus);
2707 ORD(glClear);
2708 ORD(glClearColor);
2709// ORD(glClearDepthf);
2710 ORD(glClearStencil);
2711 ORD(glColorMask);
2712 ORD(glCompileShader);
2713 ORD(glCompressedTexImage2D);
2714 ORD(glCompressedTexSubImage2D);
2715 ORD(glCopyTexImage2D);
2716 ORD(glCopyTexSubImage2D);
2717 ORD(glCreateProgram);
2718 ORD(glCreateShader);
2719 ORD(glCullFace);
2720 ORD(glDeleteBuffers);
2721 ORD(glDeleteFramebuffers);
2722 ORD(glDeleteProgram);
2723 ORD(glDeleteRenderbuffers);
2724 ORD(glDeleteShader);
2725 ORD(glDeleteTextures);
2726 ORD(glDepthFunc);
2727 ORD(glDepthMask);
2728// ORD(glDepthRangef);
2729 ORD(glDetachShader);
2730 ORD(glDisable);
2731 ORD(glDisableVertexAttribArray);
2732 ORD(glDrawArrays);
2733 ORD(glDrawElements);
2734 ORD(glEnable);
2735 ORD(glEnableVertexAttribArray);
2736 ORD(glFinish);
2737 ORD(glFlush);
2738 ORD(glFramebufferRenderbuffer);
2739 ORD(glFramebufferTexture2D);
2740 ORD(glFrontFace);
2741 ORD(glGenBuffers);
2742 ORD(glGenerateMipmap);
2743 ORD(glGenFramebuffers);
2744 ORD(glGenRenderbuffers);
2745 ORD(glGenTextures);
2746 ORD(glGetActiveAttrib);
2747 ORD(glGetActiveUniform);
2748 ORD(glGetAttachedShaders);
2749 ORD(glGetAttribLocation);
2750 ORD(glGetBooleanv);
2751 ORD(glGetBufferParameteriv);
2752 ORD(glGetError);
2753 ORD(glGetFloatv);
2754 ORD(glGetFramebufferAttachmentParameteriv);
2755 ORD(glGetIntegerv);
2756 ORD(glGetProgramiv);
2757 ORD(glGetProgramInfoLog);
2758 ORD(glGetRenderbufferParameteriv);
2759 ORD(glGetShaderiv);
2760 ORD(glGetShaderInfoLog);
2761// ORD(glGetShaderPrecisionFormat);
2762 ORD(glGetShaderSource);
2763// ORD(glGetString);
2764 ORD(glGetTexParameterfv);
2765 ORD(glGetTexParameteriv);
2766 ORD(glGetUniformfv);
2767 ORD(glGetUniformiv);
2768 ORD(glGetUniformLocation);
2769 ORD(glGetVertexAttribfv);
2770 ORD(glGetVertexAttribiv);
2771 ORD(glGetVertexAttribPointerv);
2772 ORD(glHint);
2773 ORD(glIsBuffer);
2774 ORD(glIsEnabled);
2775 ORD(glIsFramebuffer);
2776 ORD(glIsProgram);
2777 ORD(glIsRenderbuffer);
2778 ORD(glIsShader);
2779 ORD(glIsTexture);
2780 ORD(glLineWidth);
2781 ORD(glLinkProgram);
2782 ORD(glPixelStorei);
2783 ORD(glPolygonOffset);
2784 ORD(glReadPixels);
2785// ORD(glReleaseShaderCompiler);
2786 ORD(glRenderbufferStorage);
2787 ORD(glSampleCoverage);
2788 ORD(glScissor);
2789// ORD(glShaderBinary);
2790 ORD(glShaderSource);
2791 ORD(glStencilFunc);
2792 ORD(glStencilFuncSeparate);
2793 ORD(glStencilMask);
2794 ORD(glStencilMaskSeparate);
2795 ORD(glStencilOp);
2796 ORD(glStencilOpSeparate);
2797 ORD(glTexImage2D);
2798 ORD(glTexParameterf);
2799 ORD(glTexParameterfv);
2800 ORD(glTexParameteri);
2801 ORD(glTexParameteriv);
2802 ORD(glTexSubImage2D);
2803 ORD(glUniform1f);
2804 ORD(glUniform1fv);
2805 ORD(glUniform1i);
2806 ORD(glUniform1iv);
2807 ORD(glUniform2f);
2808 ORD(glUniform2fv);
2809 ORD(glUniform2i);
2810 ORD(glUniform2iv);
2811 ORD(glUniform3f);
2812 ORD(glUniform3fv);
2813 ORD(glUniform3i);
2814 ORD(glUniform3iv);
2815 ORD(glUniform4f);
2816 ORD(glUniform4fv);
2817 ORD(glUniform4i);
2818 ORD(glUniform4iv);
2819 ORD(glUniformMatrix2fv);
2820 ORD(glUniformMatrix3fv);
2821 ORD(glUniformMatrix4fv);
2822 ORD(glUseProgram);
2823 ORD(glValidateProgram);
2824 ORD(glVertexAttrib1f);
2825 ORD(glVertexAttrib1fv);
2826 ORD(glVertexAttrib2f);
2827 ORD(glVertexAttrib2fv);
2828 ORD(glVertexAttrib3f);
2829 ORD(glVertexAttrib3fv);
2830 ORD(glVertexAttrib4f);
2831 ORD(glVertexAttrib4fv);
2832 ORD(glVertexAttribPointer);
2833 ORD(glViewport);
2834#undef ORD
2835
2836#define ORD(f) EVAS_API_OVERRIDE(f, &gl_funcs, glsym_)
2837 // Extensions
2838 ORD(glGetProgramBinaryOES);
2839 ORD(glProgramBinaryOES);
2840 ORD(glMapBufferOES);
2841 ORD(glUnmapBufferOES);
2842 ORD(glGetBufferPointervOES);
2843 ORD(glTexImage3DOES);
2844 ORD(glTexSubImage3DOES);
2845 ORD(glCopyTexSubImage3DOES);
2846 ORD(glCompressedTexImage3DOES);
2847 ORD(glCompressedTexSubImage3DOES);
2848 ORD(glFramebufferTexture3DOES);
2849 ORD(glGetPerfMonitorGroupsAMD);
2850 ORD(glGetPerfMonitorCountersAMD);
2851 ORD(glGetPerfMonitorGroupStringAMD);
2852 ORD(glGetPerfMonitorCounterStringAMD);
2853 ORD(glGetPerfMonitorCounterInfoAMD);
2854 ORD(glGenPerfMonitorsAMD);
2855 ORD(glDeletePerfMonitorsAMD);
2856 ORD(glSelectPerfMonitorCountersAMD);
2857 ORD(glBeginPerfMonitorAMD);
2858 ORD(glEndPerfMonitorAMD);
2859 ORD(glGetPerfMonitorCounterDataAMD);
2860 ORD(glDiscardFramebufferEXT);
2861 ORD(glMultiDrawArraysEXT);
2862 ORD(glMultiDrawElementsEXT);
2863 ORD(glDeleteFencesNV);
2864 ORD(glGenFencesNV);
2865 ORD(glIsFenceNV);
2866 ORD(glTestFenceNV);
2867 ORD(glGetFenceivNV);
2868 ORD(glFinishFenceNV);
2869 ORD(glSetFenceNV);
2870 ORD(glGetDriverControlsQCOM);
2871 ORD(glGetDriverControlStringQCOM);
2872 ORD(glEnableDriverControlQCOM);
2873 ORD(glDisableDriverControlQCOM);
2874 ORD(glExtGetTexturesQCOM);
2875 ORD(glExtGetBuffersQCOM);
2876 ORD(glExtGetRenderbuffersQCOM);
2877 ORD(glExtGetFramebuffersQCOM);
2878 ORD(glExtGetTexLevelParameterivQCOM);
2879 ORD(glExtTexObjectStateOverrideiQCOM);
2880 ORD(glExtGetTexSubImageQCOM);
2881 ORD(glExtGetBufferPointervQCOM);
2882 ORD(glExtGetShadersQCOM);
2883 ORD(glExtGetProgramsQCOM);
2884 ORD(glExtIsProgramBinaryQCOM);
2885 ORD(glExtGetProgramBinarySourceQCOM);
2886#undef ORD
2887
2888// Override functions wrapped by Evas_GL
2889#define ORD(f) EVAS_API_OVERRIDE(f, &gl_funcs, evgl_)
2890 ORD(glBindFramebuffer);
2891 ORD(glBindRenderbuffer);
2892
2893 // GLES2.0 API compat on top of desktop gl
2894 ORD(glClearDepthf);
2895 ORD(glDepthRangef);
2896 ORD(glGetShaderPrecisionFormat);
2897 ORD(glReleaseShaderCompiler);
2898 ORD(glShaderBinary);
2899
2900 ORD(glGetString);
2901
2902 // GLES 2.0 Extensions that needs wrapping
2903 ORD(evasglCreateImage);
2904 ORD(evasglDestroyImage);
2905 ORD(glEvasGLImageTargetTexture2DOES);
2906 ORD(glEvasGLImageTargetRenderbufferStorageOES);
2907
2908#undef ORD
2909
2910 return &gl_funcs;
2911}
2912
2913static int
2914eng_image_load_error_get(void *data __UNUSED__, void *image)
2915{
2916 Evas_GL_Image *im;
2917
2918 if (!image) return EVAS_LOAD_ERROR_NONE;
2919 im = image;
2920 return im->im->cache_entry.load_error;
2921}
2922
2923static Eina_Bool
2924eng_image_animated_get(void *data __UNUSED__, void *image)
2925{
2926 Evas_GL_Image *gim = image;
2927 Image_Entry *im;
2928
2929 if (!gim) return EINA_FALSE;
2930 im = (Image_Entry *)gim->im;
2931 if (!im) return EINA_FALSE;
2932
2933 return im->flags.animated;
2934}
2935
2936static int
2937eng_image_animated_frame_count_get(void *data __UNUSED__, void *image)
2938{
2939 Evas_GL_Image *gim = image;
2940 Image_Entry *im;
2941
2942 if (!gim) return -1;
2943 im = (Image_Entry *)gim->im;
2944 if (!im) return -1;
2945
2946 if (!im->flags.animated) return -1;
2947 return im->frame_count;
2948}
2949
2950static Evas_Image_Animated_Loop_Hint
2951eng_image_animated_loop_type_get(void *data __UNUSED__, void *image)
2952{
2953 Evas_GL_Image *gim = image;
2954 Image_Entry *im;
2955
2956 if (!gim) return EVAS_IMAGE_ANIMATED_HINT_NONE;
2957 im = (Image_Entry *)gim->im;
2958 if (!im) return EVAS_IMAGE_ANIMATED_HINT_NONE;
2959
2960 if (!im->flags.animated) return EVAS_IMAGE_ANIMATED_HINT_NONE;
2961 return im->loop_hint;
2962}
2963
2964static int
2965eng_image_animated_loop_count_get(void *data __UNUSED__, void *image)
2966{
2967 Evas_GL_Image *gim = image;
2968 Image_Entry *im;
2969
2970 if (!gim) return -1;
2971 im = (Image_Entry *)gim->im;
2972 if (!im) return -1;
2973
2974 if (!im->flags.animated) return -1;
2975 return im->loop_count;
2976}
2977
2978static double
2979eng_image_animated_frame_duration_get(void *data __UNUSED__, void *image, int start_frame, int frame_num)
2980{
2981 Evas_GL_Image *gim = image;
2982 Image_Entry *im;
2983
2984 if (!gim) return -1;
2985 im = (Image_Entry *)gim->im;
2986 if (!im) return -1;
2987
2988 if (!im->flags.animated) return -1;
2989 return evas_common_load_rgba_image_frame_duration_from_file(im, start_frame, frame_num);
2990}
2991
2992static Eina_Bool
2993eng_image_animated_frame_set(void *data __UNUSED__, void *image, int frame_index)
2994{
2995 Evas_GL_Image *gim = image;
2996 Image_Entry *im;
2997
2998 if (!gim) return EINA_FALSE;
2999 im = (Image_Entry *)gim->im;
3000 if (!im) return EINA_FALSE;
3001
3002 if (!im->flags.animated) return EINA_FALSE;
3003 if (im->cur_frame == frame_index) return EINA_FALSE;
3004
3005 im->cur_frame = frame_index;
3006 return EINA_TRUE;
3007}
3008
3009static Eina_Bool
3010eng_image_can_region_get(void *data __UNUSED__, void *image)
3011{
3012 Evas_GL_Image *gim = image;
3013 Image_Entry *im;
3014 if (!gim) return EINA_FALSE;
3015 im = (Image_Entry *)gim->im;
3016 if (!im) return EINA_FALSE;
3017 return ((Evas_Image_Load_Func*) im->info.loader)->do_region;
3018}
3019
3020
3021static void
3022eng_image_max_size_get(void *data, int *maxw, int *maxh)
3023{
3024 Render_Engine *re = (Render_Engine *)data;
3025 if (maxw) *maxw = re->win->gl_context->shared->info.max_texture_size;
3026 if (maxh) *maxh = re->win->gl_context->shared->info.max_texture_size;
3027}
3028
3029static int
3030module_open(Evas_Module *em)
3031{
3032 static Eina_Bool xrm_inited = EINA_FALSE;
3033 if (!xrm_inited)
3034 {
3035 xrm_inited = EINA_TRUE;
3036 XrmInitialize();
3037 }
3038
3039 if (!em) return 0;
3040 if (!evas_gl_common_module_open()) return 0;
3041 /* get whatever engine module we inherit from */
3042 if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
3043 if (_evas_engine_wl_egl_log_dom < 0)
3044 {
3045 _evas_engine_wl_egl_log_dom =
3046 eina_log_domain_register("evas-gl_x11", EVAS_DEFAULT_LOG_COLOR);
3047 }
3048
3049 if (_evas_engine_wl_egl_log_dom < 0)
3050 {
3051 EINA_LOG_ERR("Can not create a module log domain.");
3052 return 0;
3053 }
3054 /* store it for later use */
3055 func = pfunc;
3056 /* now to override methods */
3057 #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
3058 ORD(info);
3059 ORD(info_free);
3060 ORD(setup);
3061 ORD(canvas_alpha_get);
3062 ORD(output_free);
3063 ORD(output_resize);
3064 ORD(output_tile_size_set);
3065 ORD(output_redraws_rect_add);
3066 ORD(output_redraws_rect_del);
3067 ORD(output_redraws_clear);
3068 ORD(output_redraws_next_update_get);
3069 ORD(output_redraws_next_update_push);
3070 ORD(context_cutout_add);
3071 ORD(context_cutout_clear);
3072 ORD(output_flush);
3073 ORD(output_idle_flush);
3074 ORD(output_dump);
3075 ORD(rectangle_draw);
3076 ORD(line_draw);
3077 ORD(polygon_point_add);
3078 ORD(polygon_points_clear);
3079 ORD(polygon_draw);
3080
3081 ORD(image_load);
3082 ORD(image_new_from_data);
3083 ORD(image_new_from_copied_data);
3084 ORD(image_free);
3085 ORD(image_size_get);
3086 ORD(image_size_set);
3087 ORD(image_dirty_region);
3088 ORD(image_data_get);
3089 ORD(image_data_put);
3090 ORD(image_data_preload_request);
3091 ORD(image_data_preload_cancel);
3092 ORD(image_alpha_set);
3093 ORD(image_alpha_get);
3094 ORD(image_border_set);
3095 ORD(image_border_get);
3096 ORD(image_draw);
3097 ORD(image_comment_get);
3098 ORD(image_format_get);
3099 ORD(image_colorspace_set);
3100 ORD(image_colorspace_get);
3101 ORD(image_can_region_get);
3102 ORD(image_mask_create);
3103 ORD(image_native_set);
3104 ORD(image_native_get);
3105#if 0 // filtering disabled
3106 ORD(image_draw_filtered);
3107 ORD(image_filtered_get);
3108 ORD(image_filtered_save);
3109 ORD(image_filtered_free);
3110#endif
3111
3112 ORD(font_draw);
3113
3114 ORD(image_scale_hint_set);
3115 ORD(image_scale_hint_get);
3116 ORD(image_stride_get);
3117
3118 ORD(image_map_draw);
3119 ORD(image_map_surface_new);
3120 ORD(image_map_surface_free);
3121
3122 ORD(image_content_hint_set);
3123 ORD(image_content_hint_get);
3124
3125 ORD(image_cache_flush);
3126 ORD(image_cache_set);
3127 ORD(image_cache_get);
3128
3129 ORD(gl_surface_create);
3130 ORD(gl_surface_destroy);
3131 ORD(gl_context_create);
3132 ORD(gl_context_destroy);
3133 ORD(gl_make_current);
3134 ORD(gl_string_query);
3135 ORD(gl_proc_address_get);
3136 ORD(gl_native_surface_get);
3137 ORD(gl_api_get);
3138
3139 ORD(image_load_error_get);
3140
3141 /* now advertise out own api */
3142 ORD(image_animated_get);
3143 ORD(image_animated_frame_count_get);
3144 ORD(image_animated_loop_type_get);
3145 ORD(image_animated_loop_count_get);
3146 ORD(image_animated_frame_duration_get);
3147 ORD(image_animated_frame_set);
3148
3149 ORD(image_max_size_get);
3150
3151 /* now advertise out own api */
3152 em->functions = (void *)(&func);
3153 return 1;
3154}
3155
3156static void
3157module_close(Evas_Module *em __UNUSED__)
3158{
3159 eina_log_domain_unregister(_evas_engine_wl_egl_log_dom);
3160 evas_gl_common_module_close();
3161}
3162
3163static Evas_Module_Api evas_modapi =
3164{
3165 EVAS_MODULE_API_VERSION, "wayland_egl", "none", {module_open, module_close}
3166};
3167
3168EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, gl_x11);
3169
3170#ifndef EVAS_STATIC_BUILD_GL_XLIB
3171EVAS_EINA_MODULE_DEFINE(engine, gl_x11);
3172#endif
3173
3174/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
diff --git a/libraries/evas/src/modules/engines/wayland_egl/evas_engine.h b/libraries/evas/src/modules/engines/wayland_egl/evas_engine.h
new file mode 100644
index 0000000..204d793
--- /dev/null
+++ b/libraries/evas/src/modules/engines/wayland_egl/evas_engine.h
@@ -0,0 +1,82 @@
1#ifndef EVAS_ENGINE_H
2#define EVAS_ENGINE_H
3
4#include "config.h"
5#include "evas_common.h"
6#include "evas_private.h"
7#include "evas_gl_common.h"
8#include "Evas.h"
9#include "Evas_Engine_Wayland_Egl.h"
10
11#define GL_GLEXT_PROTOTYPES
12
13#include <EGL/egl.h>
14#include <GLES2/gl2.h>
15#include <GLES2/gl2ext.h>
16#include <wayland-egl.h>
17
18extern int _evas_engine_wl_egl_log_dom;
19#ifdef ERR
20# undef ERR
21#endif
22#define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_wl_egl_log_dom, __VA_ARGS__)
23
24#ifdef DBG
25# undef DBG
26#endif
27#define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_wl_egl_log_dom, __VA_ARGS__)
28
29#ifdef INF
30# undef INF
31#endif
32#define INF(...) EINA_LOG_DOM_INFO(_evas_engine_wl_egl_log_dom, __VA_ARGS__)
33
34#ifdef WRN
35# undef WRN
36#endif
37#define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_wl_egl_log_dom, __VA_ARGS__)
38
39#ifdef CRIT
40# undef CRIT
41#endif
42#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_engine_wl_egl_log_dom, __VA_ARGS__)
43
44typedef struct _Evas_GL_Wl_Window Evas_GL_Wl_Window;
45
46struct _Evas_GL_Wl_Window
47{
48 struct wl_display *disp;
49 struct wl_egl_window *win;
50 struct wl_surface *surface;
51 int w, h;
52 int screen;
53// XVisualInfo *visualinfo;
54// Visual *visual;
55// Colormap colormap;
56 int depth;
57 int alpha;
58 int rot;
59 Evas_Engine_GL_Context *gl_context;
60 struct {
61 int redraw : 1;
62 int drew : 1;
63 int x1, y1, x2, y2;
64 } draw;
65 EGLContext egl_context[1];
66 EGLSurface egl_surface[1];
67 EGLConfig egl_config;
68 EGLDisplay egl_disp;
69 int surf : 1;
70};
71
72Evas_GL_Wl_Window *eng_window_new(struct wl_display *disp, struct wl_surface *surface, int screen,
73 int depth, int w, int h, int indirect,
74 int alpha, int rot);
75void eng_window_free(Evas_GL_Wl_Window *gw);
76void eng_window_use(Evas_GL_Wl_Window *gw);
77void eng_window_unsurf(Evas_GL_Wl_Window *gw);
78void eng_window_resurf(Evas_GL_Wl_Window *gw);
79
80int eng_best_depth_get(Evas_Engine_Info_Wayland_Egl *einfo);
81
82#endif
diff --git a/libraries/evas/src/modules/engines/wayland_egl/evas_wl_main.c b/libraries/evas/src/modules/engines/wayland_egl/evas_wl_main.c
new file mode 100644
index 0000000..537fcc6
--- /dev/null
+++ b/libraries/evas/src/modules/engines/wayland_egl/evas_wl_main.c
@@ -0,0 +1,323 @@
1#include "evas_engine.h"
2
3static Evas_GL_Wl_Window *_evas_gl_wl_window = NULL;
4
5static EGLContext context = EGL_NO_CONTEXT;
6
7// fixme: something is up/wrong here - dont know what tho...
8//#define NEWGL 1
9
10static int win_count = 0;
11
12Evas_GL_Wl_Window *
13eng_window_new(struct wl_display *disp, struct wl_surface *surface, int screen,
14 int depth, int w, int h, int indirect, int alpha, int rot)
15{
16 Evas_GL_Wl_Window *gw;
17 int context_attrs[3];
18 int config_attrs[40];
19 int major_version, minor_version;
20 int num_config, n = 0;
21 const GLubyte *vendor, *renderer, *version;
22
23 gw = calloc(1, sizeof(Evas_GL_Wl_Window));
24 if (!gw) return NULL;
25
26 win_count++;
27 gw->disp = disp;
28 gw->surface = surface;
29 gw->screen = screen;
30 gw->depth = depth;
31 gw->alpha = alpha;
32 gw->w = w;
33 gw->h = h;
34 gw->rot = rot;
35
36// EGL / GLES
37 context_attrs[0] = EGL_CONTEXT_CLIENT_VERSION;
38 context_attrs[1] = 2;
39 context_attrs[2] = EGL_NONE;
40
41#if defined(GLES_VARIETY_S3C6410)
42 if (gw->visualinfo->depth == 16) // 16bpp
43 {
44 config_attrs[n++] = EGL_SURFACE_TYPE;
45 config_attrs[n++] = EGL_WINDOW_BIT;
46 config_attrs[n++] = EGL_RENDERABLE_TYPE;
47 config_attrs[n++] = EGL_OPENGL_ES2_BIT;
48 config_attrs[n++] = EGL_RED_SIZE;
49 config_attrs[n++] = 5;
50 config_attrs[n++] = EGL_GREEN_SIZE;
51 config_attrs[n++] = 6;
52 config_attrs[n++] = EGL_BLUE_SIZE;
53 config_attrs[n++] = 5;
54 config_attrs[n++] = EGL_DEPTH_SIZE;
55 config_attrs[n++] = 0;
56 config_attrs[n++] = EGL_STENCIL_SIZE;
57 config_attrs[n++] = 0;
58 config_attrs[n++] = EGL_NONE;
59 }
60 else // 24/32bit. no one does 8bpp anymore. and 15bpp... dead
61 {
62 config_attrs[n++] = EGL_SURFACE_TYPE;
63 config_attrs[n++] = EGL_WINDOW_BIT;
64 config_attrs[n++] = EGL_RENDERABLE_TYPE;
65 config_attrs[n++] = EGL_OPENGL_ES2_BIT;
66 config_attrs[n++] = EGL_RED_SIZE;
67 config_attrs[n++] = 8;
68 config_attrs[n++] = EGL_GREEN_SIZE;
69 config_attrs[n++] = 8;
70 config_attrs[n++] = EGL_BLUE_SIZE;
71 config_attrs[n++] = 8;
72 config_attrs[n++] = EGL_DEPTH_SIZE;
73 config_attrs[n++] = 0;
74 config_attrs[n++] = EGL_STENCIL_SIZE;
75 config_attrs[n++] = 0;
76 config_attrs[n++] = EGL_NONE;
77 }
78#elif defined(GLES_VARIETY_SGX)
79 config_attrs[n++] = EGL_SURFACE_TYPE;
80 config_attrs[n++] = EGL_WINDOW_BIT;
81 config_attrs[n++] = EGL_RENDERABLE_TYPE;
82 config_attrs[n++] = EGL_OPENGL_ES2_BIT;
83# if 0
84// FIXME: n900 - omap3 sgx libs break here
85 config_attrs[n++] = EGL_RED_SIZE;
86 config_attrs[n++] = 1;
87 config_attrs[n++] = EGL_GREEN_SIZE;
88 config_attrs[n++] = 1;
89 config_attrs[n++] = EGL_BLUE_SIZE;
90 config_attrs[n++] = 1;
91// FIXME: end n900 breakage
92# endif
93 if (gw->alpha)
94 {
95 config_attrs[n++] = EGL_ALPHA_SIZE;
96 config_attrs[n++] = 1;
97 }
98 else
99 {
100 config_attrs[n++] = EGL_ALPHA_SIZE;
101 config_attrs[n++] = 0;
102 }
103 config_attrs[n++] = EGL_DEPTH_SIZE;
104 config_attrs[n++] = 0;
105 config_attrs[n++] = EGL_STENCIL_SIZE;
106 config_attrs[n++] = 0;
107 config_attrs[n++] = EGL_NONE;
108#endif
109
110 gw->egl_disp = eglGetDisplay((EGLNativeDisplayType)(gw->disp));
111 if (!gw->egl_disp)
112 {
113 ERR("eglGetDisplay() fail. code=%#x", eglGetError());
114 eng_window_free(gw);
115 return NULL;
116 }
117 if (!eglInitialize(gw->egl_disp, &major_version, &minor_version))
118 {
119 ERR("eglInitialize() fail. code=%#x", eglGetError());
120 eng_window_free(gw);
121 return NULL;
122 }
123 eglBindAPI(EGL_OPENGL_ES_API);
124 if (eglGetError() != EGL_SUCCESS)
125 {
126 ERR("eglBindAPI() fail. code=%#x", eglGetError());
127 eng_window_free(gw);
128 return NULL;
129 }
130
131 num_config = 0;
132 if (!eglChooseConfig(gw->egl_disp, config_attrs, &gw->egl_config,
133 1, &num_config) || (num_config != 1))
134 {
135 ERR("eglChooseConfig() fail. code=%#x", eglGetError());
136 eng_window_free(gw);
137 return NULL;
138 }
139
140 gw->win = wl_egl_window_create(gw->surface, gw->w, gw->h);
141
142 gw->egl_surface[0] = eglCreateWindowSurface(gw->egl_disp, gw->egl_config,
143 (EGLNativeWindowType)gw->win,
144 NULL);
145 if (gw->egl_surface[0] == EGL_NO_SURFACE)
146 {
147 ERR("eglCreateWindowSurface() fail for %#x. code=%#x",
148 (unsigned int)gw->win, eglGetError());
149 eng_window_free(gw);
150 return NULL;
151 }
152
153 if (context == EGL_NO_CONTEXT)
154 context = eglCreateContext(gw->egl_disp, gw->egl_config, NULL,
155 context_attrs);
156 gw->egl_context[0] = context;
157 if (gw->egl_context[0] == EGL_NO_CONTEXT)
158 {
159 ERR("eglCreateContext() fail. code=%#x", eglGetError());
160 eng_window_free(gw);
161 return NULL;
162 }
163
164 if (eglMakeCurrent(gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0],
165 gw->egl_context[0]) == EGL_FALSE)
166 {
167 ERR("eglMakeCurrent() fail. code=%#x", eglGetError());
168 eng_window_free(gw);
169 return NULL;
170 }
171
172 vendor = glGetString(GL_VENDOR);
173 renderer = glGetString(GL_RENDERER);
174 version = glGetString(GL_VERSION);
175 if (!vendor) vendor = (unsigned char *)"-UNKNOWN-";
176 if (!renderer) renderer = (unsigned char *)"-UNKNOWN-";
177 if (!version) version = (unsigned char *)"-UNKNOWN-";
178 if (getenv("EVAS_GL_INFO"))
179 {
180 fprintf(stderr, "vendor: %s\n", vendor);
181 fprintf(stderr, "renderer: %s\n", renderer);
182 fprintf(stderr, "version: %s\n", version);
183 }
184
185 gw->gl_context = evas_gl_common_context_new();
186 if (!gw->gl_context)
187 {
188 eng_window_free(gw);
189 return NULL;
190 }
191 gw->gl_context->egldisp = gw->egl_disp;
192 eng_window_use(gw);
193 evas_gl_common_context_resize(gw->gl_context, w, h, rot);
194 gw->surf = 1;
195 return gw;
196 indirect = 0;
197}
198
199void
200eng_window_free(Evas_GL_Wl_Window *gw)
201{
202 int ref = 0;
203
204 win_count--;
205 eng_window_use(gw);
206 if (gw == _evas_gl_wl_window) _evas_gl_wl_window = NULL;
207// if (gw->win) wl_egl_window_destroy(gw->win);
208 if (gw->gl_context)
209 {
210 ref = gw->gl_context->references - 1;
211 evas_gl_common_context_free(gw->gl_context);
212 }
213 if (gw->egl_surface[0] != EGL_NO_SURFACE)
214 eglDestroySurface(gw->egl_disp, gw->egl_surface[0]);
215 eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
216 if (ref == 0)
217 {
218 if (context) eglDestroyContext(gw->egl_disp, context);
219 context = EGL_NO_CONTEXT;
220 eglTerminate(gw->egl_disp);
221 eglReleaseThread();
222 }
223 free(gw);
224}
225
226void
227eng_window_use(Evas_GL_Wl_Window *gw)
228{
229 Eina_Bool force_use = EINA_FALSE;
230
231 if (_evas_gl_wl_window)
232 {
233 if ((eglGetCurrentContext() !=
234 _evas_gl_wl_window->egl_context[0]) ||
235 (eglGetCurrentSurface(EGL_READ) !=
236 _evas_gl_wl_window->egl_surface[0]) ||
237 (eglGetCurrentSurface(EGL_DRAW) !=
238 _evas_gl_wl_window->egl_surface[0]))
239 force_use = EINA_TRUE;
240 }
241 if ((_evas_gl_wl_window != gw) || (force_use))
242 {
243 if (_evas_gl_wl_window)
244 {
245 evas_gl_common_context_use(_evas_gl_wl_window->gl_context);
246 evas_gl_common_context_flush(_evas_gl_wl_window->gl_context);
247 }
248 _evas_gl_wl_window = gw;
249 if (gw)
250 {
251 // EGL / GLES
252 if (gw->egl_surface[0] != EGL_NO_SURFACE)
253 {
254 if (eglMakeCurrent(gw->egl_disp, gw->egl_surface[0],
255 gw->egl_surface[0],
256 gw->egl_context[0]) == EGL_FALSE)
257 {
258 ERR("eglMakeCurrent() failed!");
259 }
260 }
261 }
262 }
263 if (gw) evas_gl_common_context_use(gw->gl_context);
264}
265
266void
267eng_window_unsurf(Evas_GL_Wl_Window *gw)
268{
269 if (!gw->surf) return;
270 if (!getenv("EVAS_GL_WIN_RESURF")) return;
271 if (getenv("EVAS_GL_INFO")) printf("unsurf %p\n", gw);
272
273 if (_evas_gl_wl_window)
274 evas_gl_common_context_flush(_evas_gl_wl_window->gl_context);
275 if (_evas_gl_wl_window == gw)
276 {
277 eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
278 if (gw->egl_surface[0] != EGL_NO_SURFACE)
279 eglDestroySurface(gw->egl_disp, gw->egl_surface[0]);
280 gw->egl_surface[0] = EGL_NO_SURFACE;
281 _evas_gl_wl_window = NULL;
282 }
283 gw->surf = 0;
284}
285
286void
287eng_window_resurf(Evas_GL_Wl_Window *gw)
288{
289 if (gw->surf) return;
290 if (getenv("EVAS_GL_INFO")) printf("resurf %p\n", gw);
291
292 gw->egl_surface[0] =
293 eglCreateWindowSurface(gw->egl_disp, gw->egl_config,
294 (EGLNativeWindowType)gw->win, NULL);
295
296 if (gw->egl_surface[0] == EGL_NO_SURFACE)
297 {
298 ERR("eglCreateWindowSurface() fail for %#x. code=%#x",
299 (unsigned int)gw->win, eglGetError());
300 return;
301 }
302 if (eglMakeCurrent(gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0],
303 gw->egl_context[0]) == EGL_FALSE)
304 {
305 ERR("eglMakeCurrent() failed!");
306 }
307 gw->surf = 1;
308}
309
310int
311eng_best_depth_get(Evas_Engine_Info_Wayland_Egl *einfo)
312{
313 if (!einfo) return 0;
314 if (!einfo->info.display) return 0;
315 return 32;
316 /* if (!_evas_gl_x11_vi) eng_best_visual_get(einfo); */
317 /* if (!_evas_gl_x11_vi) return 0; */
318 /* if (einfo->info.destination_alpha) */
319 /* { */
320 /* if (_evas_gl_x11_rgba_vi) return _evas_gl_x11_rgba_vi->depth; */
321 /* } */
322 /* return _evas_gl_x11_vi->depth; */
323}