1 #include "evas_common.h" /* Also includes international specific stuff */
2 #include "evas_engine.h"
5 # include <dlfcn.h> /* dlopen,dlclose,etc */
7 # error gl_x11 should not get compiled if dlsym is not found on the system!
10 #define EVAS_GL_NO_GL_H_CHECK 1
13 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
15 # if defined(GLES_VARIETY_S3C6410)
16 # elif defined(GLES_VARIETY_SGX)
22 typedef struct _Render_Engine Render_Engine;
23 typedef struct _Render_Engine_GL_Surface Render_Engine_GL_Surface;
24 typedef struct _Render_Engine_GL_Context Render_Engine_GL_Context;
25 typedef struct _Render_Engine_GL_Resource Render_Engine_GL_Resource;
26 typedef struct _Extension_Entry Extension_Entry;
30 Evas_GL_X11_Window *win;
31 Evas_Engine_Info_GL_X11 *info;
36 XrmDatabase xrdb; // xres - dpi
37 struct { // xres - dpi
38 int dpi; // xres - dpi
44 // GL Surface Capability
65 int depth_24_stencil_8[4];
71 struct _Render_Engine_GL_Surface
82 // Render target Texture/Buffers
83 GLint rt_msaa_samples;
86 GLint rt_internal_fmt;
91 GLenum rb_stencil_fmt;
92 GLuint rb_depth_stencil;
93 GLenum rb_depth_stencil_fmt;
95 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
96 EGLSurface direct_sfc;
101 Render_Engine_GL_Context *current_ctx;
104 struct _Render_Engine_GL_Context
107 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
118 Render_Engine_GL_Surface *current_sfc;
121 // Resources used per thread
122 struct _Render_Engine_GL_Resource
124 // Resource context/surface per Thread in TLS for evasgl use
125 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
133 // Extension Handling
134 struct _Extension_Entry
137 const char *real_name;
141 static int initted = 0;
142 static int gl_wins = 0;
143 static int gl_direct_override = 0;
144 static int gl_direct_enabled = 0;
145 static Render_Engine_GL_Context *current_evgl_ctx = NULL;
146 static Render_Engine *current_engine = NULL;
147 static Evas_Object *gl_direct_img_obj = NULL;
149 static char _gl_ext_string[1024];
150 static char _evasgl_ext_string[1024];
152 // Resource context/surface per Thread in TLS for evasgl use
153 static Eina_TLS resource_key;
154 static Eina_List *resource_list;
157 typedef void (*_eng_fn) (void);
158 typedef _eng_fn (*glsym_func_eng_fn) ();
159 typedef void (*glsym_func_void) ();
160 typedef void *(*glsym_func_void_ptr) ();
161 typedef int (*glsym_func_int) ();
162 typedef unsigned int (*glsym_func_uint) ();
163 typedef unsigned char (*glsym_func_uchar) ();
164 typedef unsigned char *(*glsym_func_uchar_ptr) ();
165 typedef const char *(*glsym_func_const_char_ptr) ();
167 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
169 #ifndef EGL_NATIVE_PIXMAP_KHR
170 # define EGL_NATIVE_PIXMAP_KHR 0x30b0
172 _eng_fn (*glsym_eglGetProcAddress) (const char *a) = NULL;
173 void (*glsym_eglBindTexImage) (EGLDisplay a, EGLSurface b, int c) = NULL;
174 void (*glsym_eglReleaseTexImage) (EGLDisplay a, EGLSurface b, int c) = NULL;
175 void *(*glsym_eglCreateImage) (EGLDisplay a, EGLContext b, EGLenum c, EGLClientBuffer d, const int *e) = NULL;
176 void (*glsym_eglDestroyImage) (EGLDisplay a, void *b) = NULL;
177 void (*glsym_glEGLImageTargetTexture2DOES) (int a, void *b) = NULL;
178 void (*glsym_glEGLImageTargetRenderbufferStorageOES) (int a, void *b) = NULL;
179 void *(*glsym_eglMapImageSEC) (void *a, void *b) = NULL;
180 unsigned int (*glsym_eglUnmapImageSEC) (void *a, void *b) = NULL;
181 const char *(*glsym_eglQueryString) (EGLDisplay a, int name) = NULL;
183 unsigned int (*glsym_eglLockSurface) (EGLDisplay a, EGLSurface b, const int *attrib_list) = NULL;
184 unsigned int (*glsym_eglUnlockSurface) (EGLDisplay a, EGLSurface b) = NULL;
187 typedef XID (*glsym_func_xid) ();
189 _eng_fn (*glsym_glXGetProcAddress) (const char *a) = NULL;
190 void (*glsym_glXBindTexImage) (Display *a, GLXDrawable b, int c, int *d) = NULL;
191 void (*glsym_glXReleaseTexImage) (Display *a, GLXDrawable b, int c) = NULL;
192 int (*glsym_glXGetVideoSync) (unsigned int *a) = NULL;
193 int (*glsym_glXWaitVideoSync) (int a, int b, unsigned int *c) = NULL;
194 XID (*glsym_glXCreatePixmap) (Display *a, void *b, Pixmap c, const int *d) = NULL;
195 void (*glsym_glXDestroyPixmap) (Display *a, XID b) = NULL;
196 void (*glsym_glXQueryDrawable) (Display *a, XID b, int c, unsigned int *d) = NULL;
197 int (*glsym_glXSwapIntervalSGI) (int a) = NULL;
198 void (*glsym_glXSwapIntervalEXT) (Display *s, GLXDrawable b, int c) = NULL;
200 const char *(*glsym_glXQueryExtensionsString) (Display *a, int screen) = NULL;
204 void (*glsym_glGetProgramBinaryOES) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary) = NULL;
205 void (*glsym_glProgramBinaryOES) (GLuint program, GLenum binaryFormat, const void *binary, GLint length) = NULL;
206 void* (*glsym_glMapBufferOES) (GLenum target, GLenum access) = NULL;
207 unsigned char (*glsym_glUnmapBufferOES) (GLenum target) = NULL;
208 void (*glsym_glGetBufferPointervOES) (GLenum target, GLenum pname, void** params) = NULL;
209 void (*glsym_glTexImage3DOES) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) = NULL;
210 void (*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;
211 void (*glsym_glCopyTexSubImage3DOES) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
212 void (*glsym_glCompressedTexImage3DOES) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data) = NULL;
213 void (*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;
214 void (*glsym_glFramebufferTexture3DOES) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) = NULL;
215 void (*glsym_glGetPerfMonitorGroupsAMD) (GLint* numGroups, GLsizei groupsSize, GLuint* groups) = NULL;
216 void (*glsym_glGetPerfMonitorCountersAMD) (GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters) = NULL;
217 void (*glsym_glGetPerfMonitorGroupStringAMD) (GLuint group, GLsizei bufSize, GLsizei* length, char* groupString) = NULL;
218 void (*glsym_glGetPerfMonitorCounterStringAMD) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char* counterString) = NULL;
219 void (*glsym_glGetPerfMonitorCounterInfoAMD) (GLuint group, GLuint counter, GLenum pname, void* data) = NULL;
220 void (*glsym_glGenPerfMonitorsAMD) (GLsizei n, GLuint* monitors) = NULL;
221 void (*glsym_glDeletePerfMonitorsAMD) (GLsizei n, GLuint* monitors) = NULL;
222 void (*glsym_glSelectPerfMonitorCountersAMD) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList) = NULL;
223 void (*glsym_glBeginPerfMonitorAMD) (GLuint monitor) = NULL;
224 void (*glsym_glEndPerfMonitorAMD) (GLuint monitor) = NULL;
225 void (*glsym_glGetPerfMonitorCounterDataAMD) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten) = NULL;
226 void (*glsym_glDiscardFramebufferEXT) (GLenum target, GLsizei numAttachments, const GLenum* attachments) = NULL;
227 void (*glsym_glMultiDrawArraysEXT) (GLenum mode, GLint* first, GLsizei* count, GLsizei primcount) = NULL;
228 void (*glsym_glMultiDrawElementsEXT) (GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount) = NULL;
229 void (*glsym_glDeleteFencesNV) (GLsizei n, const GLuint* fences) = NULL;
230 void (*glsym_glGenFencesNV) (GLsizei n, GLuint* fences) = NULL;
231 unsigned char (*glsym_glIsFenceNV) (GLuint fence) = NULL;
232 unsigned char (*glsym_glTestFenceNV) (GLuint fence) = NULL;
233 void (*glsym_glGetFenceivNV) (GLuint fence, GLenum pname, GLint* params) = NULL;
234 void (*glsym_glFinishFenceNV) (GLuint fence) = NULL;
235 void (*glsym_glSetFenceNV) (GLuint, GLenum) = NULL;
236 void (*glsym_glRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
237 void (*glsym_glFramebufferTexture2DMultisample) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) = NULL;
238 void (*glsym_glGetDriverControlsQCOM) (GLint* num, GLsizei size, GLuint* driverControls) = NULL;
239 void (*glsym_glGetDriverControlStringQCOM) (GLuint driverControl, GLsizei bufSize, GLsizei* length, char* driverControlString) = NULL;
240 void (*glsym_glEnableDriverControlQCOM) (GLuint driverControl) = NULL;
241 void (*glsym_glDisableDriverControlQCOM) (GLuint driverControl) = NULL;
242 void (*glsym_glExtGetTexturesQCOM) (GLuint* textures, GLint maxTextures, GLint* numTextures) = NULL;
243 void (*glsym_glExtGetBuffersQCOM) (GLuint* buffers, GLint maxBuffers, GLint* numBuffers) = NULL;
244 void (*glsym_glExtGetRenderbuffersQCOM) (GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers) = NULL;
245 void (*glsym_glExtGetFramebuffersQCOM) (GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers) = NULL;
246 void (*glsym_glExtGetTexLevelParameterivQCOM) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params) = NULL;
247 void (*glsym_glExtTexObjectStateOverrideiQCOM) (GLenum target, GLenum pname, GLint param) = NULL;
248 void (*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;
249 void (*glsym_glExtGetBufferPointervQCOM) (GLenum target, void** params) = NULL;
250 void (*glsym_glExtGetShadersQCOM) (GLuint* shaders, GLint maxShaders, GLint* numShaders) = NULL;
251 void (*glsym_glExtGetProgramsQCOM) (GLuint* programs, GLint maxPrograms, GLint* numPrograms) = NULL;
252 unsigned char (*glsym_glExtIsProgramBinaryQCOM) (GLuint program) = NULL;
253 void (*glsym_glExtGetProgramBinarySourceQCOM) (GLuint program, GLenum shadertype, char* source, GLint* length) = NULL;
256 //------ GLES 2.0 Extensions supported in EvasGL -----//
257 static Extension_Entry _gl_ext_entries[] = {
258 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
259 //--- Function Extensions ---//
260 { "GL_OES_get_program_binary", "get_program_binary", 0 },
261 { "GL_OES_mapbuffer", "mapbuffer", 0 },
262 { "GL_OES_texture_3D", "texture_3D", 0 },
263 { "AMD_performance_monitor", "AMD_performance_monitor", 0 },
264 { "GL_EXT_discard_framebuffer", "discard_framebuffer", 0 },
265 { "GL_EXT_multi_draw_arrays", "multi_draw_arrays", 0 },
266 { "GL_NV_fence", "NV_fence", 0 },
267 { "GL_QCOM_driver_control", "QCOM_driver_control", 0 },
268 { "GL_QCOM_extended_get", "QCOM_extended_get", 0 },
269 { "GL_QCOM_extended_get2", "QCOM_extended_get2", 0 },
270 { "GL_IMG_multlisampled_render_to_texture", "multisampled_render_to_texture", 0 },
272 //--- Define Extensions ---//
273 { "GL_OES_compressed_ETC1_RGB8_texture", "compressed_ETC1_RGB8_texture", 0 },
274 { "GL_OES_compressed_paletted_texture", "compressed_paletted_texture", 0 },
275 { "GL_OES_depth24", "depth24", 0 },
276 { "GL_OES_depth32", "depth32", 0 },
277 { "GL_OES_EvasGL_image", "EGL_image", 0 },
278 { "GL_OES_packed_depth_stencil", "packed_depth_stencil", 0 },
279 { "GL_OES_rgb8_rgba8", "rgb8_rgba8", 0 },
280 { "GL_OES_standard_derivatives", "standard_derivatives", 0 },
281 { "GL_OES_stencil1", "stencil1", 0 },
282 { "GL_OES_stencil4", "stencil4", 0 },
283 { "GL_OES_texture_float", "texture_float", 0 },
284 { "GL_OES_texture_half_float", "texture_half_float", 0 },
285 { "GL_OES_texture_half_float_linear", "texture_half_float_linear", 0 },
286 { "GL_OES_texture_npot", "texture_npot", 0 },
287 { "GL_OES_vertex_half_float", "vertex_half_float", 0 },
288 { "GL_OES_vertex_type_10_10_10_2", "vertex_type_10_10_10_2", 0 },
289 { "GL_AMD_compressed_3DC_texture", "compressed_3DC_texture", 0 },
290 { "GL_AMD_compressed_ATC_texture", "compressed_ATC_texture", 0 },
291 { "GL_AMD_program_binary_Z400", "program_binary_Z400", 0 },
292 { "GL_EXT_blend_minmax", "blend_minmax", 0 },
293 { "GL_EXT_read_format_bgra", "read_format_bgra", 0 },
294 { "GL_EXT_texture_filter_anisotropic", "texture_filter_anisotrophic", 0 },
295 { "GL_EXT_texture_format_BGRA8888", "texture_format_BGRA8888", 0 },
296 { "GL_EXT_texture_type_2_10_10_10_REV", "texture_type_2_10_10_10_rev", 0 },
297 { "GL_IMG_program_binary", "IMG_program_binary", 0 },
298 { "GL_IMG_read_format", "IMG_read_format", 0 },
299 { "GL_IMG_shader_binary", "IMG_shader_binary", 0 },
300 { "GL_IMG_texture_compression_pvrtc", "IMG_texture_compression_pvrtc", 0 },
301 { "GL_QCOM_perfmon_global_mode", "QCOM_perfmon_global_mode", 0 },
302 { "GL_QCOM_writeonly_rendering", "QCOM_writeonly_rendering", 0 },
304 //--- Function Extensions ---//
305 { "GL_OES_get_program_binary", "get_program_binary", 0 },
306 { "GL_OES_mapbuffer", "mapbuffer", 0 },
307 { "GL_OES_texture_3D", "texture_3D", 0 },
308 { "AMD_performance_monitor", "AMD_performance_monitor", 0 },
309 { "GL_EXT_discard_framebuffer", "discard_framebuffer", 0 },
310 { "GL_EXT_multi_draw_arrays", "multi_draw_arrays", 0 },
311 { "GL_NV_fence", "NV_fence", 0 },
312 { "GL_QCOM_driver_control", "QCOM_driver_control", 0 },
313 { "GL_QCOM_extended_get", "QCOM_extended_get", 0 },
314 { "GL_QCOM_extended_get2", "QCOM_extended_get2", 0 },
315 { "GL_IMG_multlisampled_render_to_texture", "multisampled_render_to_texture", 0 },
317 //--- Define Extensions ---//
318 { "GL_OES_compressed_ETC1_RGB8_texture", "compressed_ETC1_RGB8_texture", 0 },
319 { "GL_OES_compressed_paletted_texture", "compressed_paletted_texture", 0 },
320 { "GL_OES_depth24", "depth24", 0 },
321 { "GL_OES_depth32", "depth32", 0 },
322 { "GL_OES_EvasGL_image", "EGL_image", 0 },
323 { "GL_OES_packed_depth_stencil", "packed_depth_stencil", 0 },
324 { "GL_OES_rgb8_rgba8", "rgb8_rgba8", 0 },
325 { "GL_OES_standard_derivatives", "standard_derivatives", 0 },
326 { "GL_OES_stencil1", "stencil1", 0 },
327 { "GL_OES_stencil4", "stencil4", 0 },
328 { "GL_OES_texture_float", "texture_float", 0 },
329 { "GL_OES_texture_half_float", "texture_half_float", 0 },
330 { "GL_OES_texture_half_float_linear", "texture_half_float_linear", 0 },
331 { "GL_OES_texture_npot", "texture_non_power_of_two", 0 }, // Desktop differs
332 { "GL_OES_vertex_half_float", "half_float_vertex", 0 }, // Desktop differs
333 { "GL_OES_vertex_type_10_10_10_2", "vertex_type_10_10_10_2", 0 },
334 { "GL_AMD_compressed_3DC_texture", "compressed_3DC_texture", 0 },
335 { "GL_AMD_compressed_ATC_texture", "compressed_ATC_texture", 0 },
336 { "GL_AMD_program_binary_Z400", "program_binary_Z400", 0 },
337 { "GL_EXT_blend_minmax", "blend_minmax", 0 },
338 { "GL_EXT_read_format_bgra", "bgra", 0 }, // Desktop differs
339 { "GL_EXT_texture_filter_anisotropic", "texture_filter_anisotrophic", 0 },
340 { "GL_EXT_texture_format_BGRA8888", "bgra", 0 }, // Desktop differs
341 { "GL_EXT_texture_type_2_10_10_10_REV", "vertex_type_2_10_10_10_rev", 0 }, // Desktop differs ???
342 { "GL_IMG_program_binary", "IMG_program_binary", 0 },
343 { "GL_IMG_read_format", "IMG_read_format", 0 },
344 { "GL_IMG_shader_binary", "IMG_shader_binary", 0 },
345 { "GL_IMG_texture_compression_pvrtc", "IMG_texture_compression_pvrtc", 0 },
346 { "GL_QCOM_perfmon_global_mode", "QCOM_perfmon_global_mode", 0 },
347 { "GL_QCOM_writeonly_rendering", "QCOM_writeonly_rendering", 0 },
353 //------ Extensions supported in EvasGL -----//
354 static Extension_Entry _evasgl_ext_entries[] = {
355 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
356 { "EvasGL_KHR_image", "EGL_KHR_image", 0 },
357 { "EvasGL_KHR_vg_parent_image", "EGL_KHR_vg_parent_image", 0 },
358 { "EvasGL_KHR_gl_texture_2D_image", "EGL_KHR_gl_texture_2D_image", 0 },
359 { "EvasGL_KHR_gl_texture_cubemap_image", "EGL_KHR_gl_texture_cubemap_image", 0 },
360 { "EvasGL_KHR_gl_texture_3D_image", "EGL_KHR_gl_texture_3D_image", 0 },
361 { "EvasGL_KHR_gl_renderbuffer_image", "EGL_KHR_gl_renderbuffer_image", 0 },
368 _gl_ext_sym_init(void)
374 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
375 #define FINDSYM(dst, sym, typ) \
376 if ((!dst) && (glsym_eglGetProcAddress)) dst = (typ)glsym_eglGetProcAddress(sym); \
377 if (!dst) dst = (typ)dlsym(RTLD_DEFAULT, sym)
379 FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddress", glsym_func_eng_fn);
380 FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressEXT", glsym_func_eng_fn);
381 FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressARB", glsym_func_eng_fn);
382 FINDSYM(glsym_eglGetProcAddress, "eglGetProcAddressKHR", glsym_func_eng_fn);
384 FINDSYM(glsym_eglBindTexImage, "eglBindTexImage", glsym_func_void);
385 FINDSYM(glsym_eglBindTexImage, "eglBindTexImageEXT", glsym_func_void);
386 FINDSYM(glsym_eglBindTexImage, "eglBindTexImageARB", glsym_func_void);
387 FINDSYM(glsym_eglBindTexImage, "eglBindTexImageKHR", glsym_func_void);
389 FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImage", glsym_func_void);
390 FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageEXT", glsym_func_void);
391 FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageARB", glsym_func_void);
392 FINDSYM(glsym_eglReleaseTexImage, "eglReleaseTexImageKHR", glsym_func_void);
394 FINDSYM(glsym_eglCreateImage, "eglCreateImage", glsym_func_void_ptr);
395 FINDSYM(glsym_eglCreateImage, "eglCreateImageEXT", glsym_func_void_ptr);
396 FINDSYM(glsym_eglCreateImage, "eglCreateImageARB", glsym_func_void_ptr);
397 FINDSYM(glsym_eglCreateImage, "eglCreateImageKHR", glsym_func_void_ptr);
399 FINDSYM(glsym_eglDestroyImage, "eglDestroyImage", glsym_func_void);
400 FINDSYM(glsym_eglDestroyImage, "eglDestroyImageEXT", glsym_func_void);
401 FINDSYM(glsym_eglDestroyImage, "eglDestroyImageARB", glsym_func_void);
402 FINDSYM(glsym_eglDestroyImage, "eglDestroyImageKHR", glsym_func_void);
404 FINDSYM(glsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES", glsym_func_void);
406 FINDSYM(glsym_glEGLImageTargetRenderbufferStorageOES, "glEGLImageTargetRenderbufferStorageOES", glsym_func_void);
408 FINDSYM(glsym_eglMapImageSEC, "eglMapImageSEC", glsym_func_void_ptr);
409 FINDSYM(glsym_eglUnmapImageSEC, "eglUnmapImageSEC", glsym_func_uint);
411 FINDSYM(glsym_eglQueryString, "eglQueryString", glsym_func_const_char_ptr);
413 FINDSYM(glsym_eglLockSurface, "eglLockSurface", glsym_func_uint);
414 FINDSYM(glsym_eglLockSurface, "eglLockSurfaceEXT", glsym_func_uint);
415 FINDSYM(glsym_eglLockSurface, "eglLockSurfaceARB", glsym_func_uint);
416 FINDSYM(glsym_eglLockSurface, "eglLockSurfaceKHR", glsym_func_uint);
418 FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurface", glsym_func_uint);
419 FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurfaceEXT", glsym_func_uint);
420 FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurfaceARB", glsym_func_uint);
421 FINDSYM(glsym_eglUnlockSurface, "eglUnlockSurfaceKHR", glsym_func_uint);
424 #define FINDSYM(dst, sym, typ) \
425 if ((!dst) && (glsym_glXGetProcAddress)) dst = (typ)glsym_glXGetProcAddress(sym); \
426 if (!dst) dst = (typ)dlsym(RTLD_DEFAULT, sym)
428 FINDSYM(glsym_glXGetProcAddress, "glXGetProcAddress", glsym_func_eng_fn);
429 FINDSYM(glsym_glXGetProcAddress, "glXGetProcAddressEXT", glsym_func_eng_fn);
430 FINDSYM(glsym_glXGetProcAddress, "glXGetProcAddressARB", glsym_func_eng_fn);
432 FINDSYM(glsym_glXBindTexImage, "glXBindTexImage", glsym_func_void);
433 FINDSYM(glsym_glXBindTexImage, "glXBindTexImageEXT", glsym_func_void);
434 FINDSYM(glsym_glXBindTexImage, "glXBindTexImageARB", glsym_func_void);
436 FINDSYM(glsym_glXReleaseTexImage, "glXReleaseTexImage", glsym_func_void);
437 FINDSYM(glsym_glXReleaseTexImage, "glXReleaseTexImageEXT", glsym_func_void);
438 FINDSYM(glsym_glXReleaseTexImage, "glXReleaseTexImageARB", glsym_func_void);
440 FINDSYM(glsym_glXGetVideoSync, "glXGetVideoSyncSGI", glsym_func_int);
442 FINDSYM(glsym_glXWaitVideoSync, "glXWaitVideoSyncSGI", glsym_func_int);
444 FINDSYM(glsym_glXCreatePixmap, "glXCreatePixmap", glsym_func_xid);
445 FINDSYM(glsym_glXCreatePixmap, "glXCreatePixmapEXT", glsym_func_xid);
446 FINDSYM(glsym_glXCreatePixmap, "glXCreatePixmapARB", glsym_func_xid);
448 FINDSYM(glsym_glXDestroyPixmap, "glXDestroyPixmap", glsym_func_void);
449 FINDSYM(glsym_glXDestroyPixmap, "glXDestroyPixmapEXT", glsym_func_void);
450 FINDSYM(glsym_glXDestroyPixmap, "glXDestroyPixmapARB", glsym_func_void);
452 FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawable", glsym_func_void);
453 FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawableEXT", glsym_func_void);
454 FINDSYM(glsym_glXQueryDrawable, "glXQueryDrawableARB", glsym_func_void);
456 FINDSYM(glsym_glXSwapIntervalSGI, "glXSwapIntervalMESA", glsym_func_int);
457 FINDSYM(glsym_glXSwapIntervalSGI, "glXSwapIntervalSGI", glsym_func_int);
459 FINDSYM(glsym_glXSwapIntervalEXT, "glXSwapIntervalEXT", glsym_func_void);
461 FINDSYM(glsym_glXQueryExtensionsString, "glXQueryExtensionsString", glsym_func_const_char_ptr);
464 //----------- GLES 2.0 Extensions ------------//
465 // If the symbol's not found, they get set to NULL
466 // If one of the functions in the extension exists, the extension in supported
468 /* GL_OES_get_program_binary */
469 FINDSYM(glsym_glGetProgramBinaryOES, "glGetProgramBinary", glsym_func_void);
470 FINDSYM(glsym_glGetProgramBinaryOES, "glGetProgramBinaryEXT", glsym_func_void);
471 FINDSYM(glsym_glGetProgramBinaryOES, "glGetProgramBinaryARB", glsym_func_void);
472 FINDSYM(glsym_glGetProgramBinaryOES, "glGetProgramBinaryOES", glsym_func_void);
474 FINDSYM(glsym_glProgramBinaryOES, "glProgramBinary", glsym_func_void);
475 FINDSYM(glsym_glProgramBinaryOES, "glProgramBinaryEXT", glsym_func_void);
476 FINDSYM(glsym_glProgramBinaryOES, "glProgramBinaryARB", glsym_func_void);
477 FINDSYM(glsym_glProgramBinaryOES, "glProgramBinaryOES", glsym_func_void);
479 // Check the first function to see if the extension is supported...
480 if (glsym_glGetProgramBinaryOES) _gl_ext_entries[0].supported = 1;
483 /* GL_OES_mapbuffer */
484 FINDSYM(glsym_glMapBufferOES, "glMapBuffer", glsym_func_void_ptr);
485 FINDSYM(glsym_glMapBufferOES, "glMapBufferEXT", glsym_func_void_ptr);
486 FINDSYM(glsym_glMapBufferOES, "glMapBufferARB", glsym_func_void_ptr);
487 FINDSYM(glsym_glMapBufferOES, "glMapBufferOES", glsym_func_void_ptr);
489 FINDSYM(glsym_glUnmapBufferOES, "glUnmapBuffer", glsym_func_uchar);
490 FINDSYM(glsym_glUnmapBufferOES, "glUnmapBufferEXT", glsym_func_uchar);
491 FINDSYM(glsym_glUnmapBufferOES, "glUnmapBufferARB", glsym_func_uchar);
492 FINDSYM(glsym_glUnmapBufferOES, "glUnmapBufferOES", glsym_func_uchar);
494 FINDSYM(glsym_glGetBufferPointervOES, "glGetBufferPointerv", glsym_func_void);
495 FINDSYM(glsym_glGetBufferPointervOES, "glGetBufferPointervEXT", glsym_func_void);
496 FINDSYM(glsym_glGetBufferPointervOES, "glGetBufferPointervARB", glsym_func_void);
497 FINDSYM(glsym_glGetBufferPointervOES, "glGetBufferPointervOES", glsym_func_void);
499 if (glsym_glMapBufferOES) _gl_ext_entries[1].supported = 1;
501 /* GL_OES_texture_3D */
502 FINDSYM(glsym_glTexImage3DOES, "glTexImage3D", glsym_func_void);
503 FINDSYM(glsym_glTexImage3DOES, "glTexImage3DEXT", glsym_func_void);
504 FINDSYM(glsym_glTexImage3DOES, "glTexImage3DARB", glsym_func_void);
505 FINDSYM(glsym_glTexImage3DOES, "glTexImage3DOES", glsym_func_void);
507 FINDSYM(glsym_glTexSubImage3DOES, "glTexSubImage3D", glsym_func_void);
508 FINDSYM(glsym_glTexSubImage3DOES, "glTexSubImage3DEXT", glsym_func_void);
509 FINDSYM(glsym_glTexSubImage3DOES, "glTexSubImage3DARB", glsym_func_void);
510 FINDSYM(glsym_glTexSubImage3DOES, "glTexSubImage3DOES", glsym_func_void);
512 FINDSYM(glsym_glCopyTexSubImage3DOES, "glCopyTexSubImage3D", glsym_func_void);
513 FINDSYM(glsym_glCopyTexSubImage3DOES, "glCopyTexSubImage3DARB", glsym_func_void);
514 FINDSYM(glsym_glCopyTexSubImage3DOES, "glCopyTexSubImage3DEXT", glsym_func_void);
515 FINDSYM(glsym_glCopyTexSubImage3DOES, "glCopyTexSubImage3DOES", glsym_func_void);
517 FINDSYM(glsym_glCompressedTexImage3DOES, "glCompressedTexImage3D", glsym_func_void);
518 FINDSYM(glsym_glCompressedTexImage3DOES, "glCompressedTexImage3DARB", glsym_func_void);
519 FINDSYM(glsym_glCompressedTexImage3DOES, "glCompressedTexImage3DEXT", glsym_func_void);
520 FINDSYM(glsym_glCompressedTexImage3DOES, "glCompressedTexImage3DOES", glsym_func_void);
522 FINDSYM(glsym_glCompressedTexSubImage3DOES, "glCompressedTexSubImage3D", glsym_func_void);
523 FINDSYM(glsym_glCompressedTexSubImage3DOES, "glCompressedTexSubImage3DARB", glsym_func_void);
524 FINDSYM(glsym_glCompressedTexSubImage3DOES, "glCompressedTexSubImage3DEXT", glsym_func_void);
525 FINDSYM(glsym_glCompressedTexSubImage3DOES, "glCompressedTexSubImage3DOES", glsym_func_void);
527 FINDSYM(glsym_glFramebufferTexture3DOES, "glFramebufferTexture3D", glsym_func_void);
528 FINDSYM(glsym_glFramebufferTexture3DOES, "glFramebufferTexture3DARB", glsym_func_void);
529 FINDSYM(glsym_glFramebufferTexture3DOES, "glFramebufferTexture3DEXT", glsym_func_void);
530 FINDSYM(glsym_glFramebufferTexture3DOES, "glFramebufferTexture3DOES", glsym_func_void);
532 if (glsym_glTexSubImage3DOES) _gl_ext_entries[2].supported = 1;
534 /* AMD_performance_monitor */
535 FINDSYM(glsym_glGetPerfMonitorGroupsAMD, "glGetPerfMonitorGroupsAMD", glsym_func_void);
536 FINDSYM(glsym_glGetPerfMonitorCountersAMD, "glGetPerfMonitorCountersAMD", glsym_func_void);
537 FINDSYM(glsym_glGetPerfMonitorGroupStringAMD, "glGetPerfMonitorGroupStringAMD", glsym_func_void);
538 FINDSYM(glsym_glGetPerfMonitorCounterStringAMD, "glGetPerfMonitorCounterStringAMD", glsym_func_void);
539 FINDSYM(glsym_glGetPerfMonitorCounterInfoAMD, "glGetPerfMonitorCounterInfoAMD", glsym_func_void);
540 FINDSYM(glsym_glGenPerfMonitorsAMD, "glGenPerfMonitorsAMD", glsym_func_void);
541 FINDSYM(glsym_glDeletePerfMonitorsAMD, "glDeletePerfMonitorsAMD", glsym_func_void);
542 FINDSYM(glsym_glSelectPerfMonitorCountersAMD, "glSelectPerfMonitorCountersAMD", glsym_func_void);
543 FINDSYM(glsym_glBeginPerfMonitorAMD, "glBeginPerfMonitorAMD", glsym_func_void);
544 FINDSYM(glsym_glEndPerfMonitorAMD, "glEndPerfMonitorAMD", glsym_func_void);
545 FINDSYM(glsym_glGetPerfMonitorCounterDataAMD, "glGetPerfMonitorCounterDataAMD", glsym_func_void);
547 if (glsym_glGetPerfMonitorGroupsAMD) _gl_ext_entries[3].supported = 1;
549 /* GL_EXT_discard_framebuffer */
550 FINDSYM(glsym_glDiscardFramebufferEXT, "glDiscardFramebuffer", glsym_func_void);
551 FINDSYM(glsym_glDiscardFramebufferEXT, "glDiscardFramebufferARB", glsym_func_void);
552 FINDSYM(glsym_glDiscardFramebufferEXT, "glDiscardFramebufferEXT", glsym_func_void);
554 if (glsym_glDiscardFramebufferEXT) _gl_ext_entries[4].supported = 1;
556 /* GL_EXT_multi_draw_arrays */
557 FINDSYM(glsym_glMultiDrawArraysEXT, "glMultiDrawArrays", glsym_func_void);
558 FINDSYM(glsym_glMultiDrawArraysEXT, "glMultiDrawArraysARB", glsym_func_void);
559 FINDSYM(glsym_glMultiDrawArraysEXT, "glMultiDrawArraysEXT", glsym_func_void);
561 FINDSYM(glsym_glMultiDrawElementsEXT, "glMultiDrawElements", glsym_func_void);
562 FINDSYM(glsym_glMultiDrawElementsEXT, "glMultiDrawElementsARB", glsym_func_void);
563 FINDSYM(glsym_glMultiDrawElementsEXT, "glMultiDrawElementsEXT", glsym_func_void);
565 if (glsym_glMultiDrawArraysEXT) _gl_ext_entries[5].supported = 1;
568 FINDSYM(glsym_glDeleteFencesNV, "glDeleteFencesNV", glsym_func_void);
569 FINDSYM(glsym_glGenFencesNV, "glGenFencesNV", glsym_func_void);
570 FINDSYM(glsym_glIsFenceNV, "glIsFenceNV", glsym_func_uchar);
571 FINDSYM(glsym_glTestFenceNV, "glTestFenceNV", glsym_func_uchar);
572 FINDSYM(glsym_glGetFenceivNV, "glGetFenceivNV", glsym_func_void);
573 FINDSYM(glsym_glFinishFenceNV, "glFinishFenceNV", glsym_func_void);
574 FINDSYM(glsym_glSetFenceNV, "glSetFenceNV", glsym_func_void);
576 if (glsym_glDeleteFencesNV) _gl_ext_entries[6].supported = 1;
578 /* GL_QCOM_driver_control */
579 FINDSYM(glsym_glGetDriverControlsQCOM, "glGetDriverControlsQCOM", glsym_func_void);
580 FINDSYM(glsym_glGetDriverControlStringQCOM, "glGetDriverControlStringQCOM", glsym_func_void);
581 FINDSYM(glsym_glEnableDriverControlQCOM, "glEnableDriverControlQCOM", glsym_func_void);
582 FINDSYM(glsym_glDisableDriverControlQCOM, "glDisableDriverControlQCOM", glsym_func_void);
584 if (glsym_glGetDriverControlsQCOM) _gl_ext_entries[7].supported = 1;
586 /* GL_QCOM_extended_get */
587 FINDSYM(glsym_glExtGetTexturesQCOM, "glExtGetTexturesQCOM", glsym_func_void);
588 FINDSYM(glsym_glExtGetBuffersQCOM, "glExtGetBuffersQCOM", glsym_func_void);
589 FINDSYM(glsym_glExtGetRenderbuffersQCOM, "glExtGetRenderbuffersQCOM", glsym_func_void);
590 FINDSYM(glsym_glExtGetFramebuffersQCOM, "glExtGetFramebuffersQCOM", glsym_func_void);
591 FINDSYM(glsym_glExtGetTexLevelParameterivQCOM, "glExtGetTexLevelParameterivQCOM", glsym_func_void);
592 FINDSYM(glsym_glExtTexObjectStateOverrideiQCOM, "glExtTexObjectStateOverrideiQCOM", glsym_func_void);
593 FINDSYM(glsym_glExtGetTexSubImageQCOM, "glExtGetTexSubImageQCOM", glsym_func_void);
594 FINDSYM(glsym_glExtGetBufferPointervQCOM, "glExtGetBufferPointervQCOM", glsym_func_void);
596 if (glsym_glExtGetTexturesQCOM) _gl_ext_entries[8].supported = 1;
598 /* GL_QCOM_extended_get2 */
599 FINDSYM(glsym_glExtGetShadersQCOM, "glExtGetShadersQCOM", glsym_func_void);
600 FINDSYM(glsym_glExtGetProgramsQCOM, "glExtGetProgramsQCOM", glsym_func_void);
601 FINDSYM(glsym_glExtIsProgramBinaryQCOM, "glExtIsProgramBinaryQCOM", glsym_func_uchar);
602 FINDSYM(glsym_glExtGetProgramBinarySourceQCOM, "glExtGetProgramBinarySourceQCOM", glsym_func_void);
604 if (glsym_glExtGetShadersQCOM) _gl_ext_entries[9].supported = 1;
606 /* GL_IMG_multisampled_render_to_texture */
607 FINDSYM(glsym_glRenderbufferStorageMultisample, "glRenderbufferStorageMultisampleIMG", glsym_func_void);
608 FINDSYM(glsym_glRenderbufferStorageMultisample, "glRenderbufferStorageMultisampleEXT", glsym_func_void);
609 FINDSYM(glsym_glFramebufferTexture2DMultisample, "glFramebufferTexture2DMultisampleIMG", glsym_func_void);
610 FINDSYM(glsym_glFramebufferTexture2DMultisample, "glFramebufferTexture2DMultisampleEXT", glsym_func_void);
615 _gl_ext_init(Render_Engine *re)
618 const char *glexts, *evasglexts;
620 memset(_gl_ext_string, 0, 1024);
621 memset(_evasgl_ext_string, 0, 1024);
623 // GLES 2.0 Extensions
624 glexts = (const char*)glGetString(GL_EXTENSIONS);
626 DBG("--------GLES 2.0 Extensions--------");
627 for (i = 0; _gl_ext_entries[i].name != NULL; i++)
629 if ( (strstr(glexts, _gl_ext_entries[i].name) != NULL) ||
630 (strstr(glexts, _gl_ext_entries[i].real_name) != NULL) )
632 _gl_ext_entries[i].supported = 1;
633 strcat(_gl_ext_string, _gl_ext_entries[i].name);
634 strcat(_gl_ext_string, " ");
635 DBG("\t%s", _gl_ext_entries[i].name);
641 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
643 if (glsym_eglQueryString)
645 evasglexts = glsym_eglQueryString(re->win->egl_disp, EGL_EXTENSIONS);
647 if (glsym_glXQueryExtensionsString)
649 evasglexts = glXQueryExtensionsString(re->info->info.display,
650 re->info->info.screen);
653 DBG("--------EvasGL Supported Extensions----------");
654 for (i = 0; _evasgl_ext_entries[i].name != NULL; i++)
656 if ( (strstr(evasglexts, _evasgl_ext_entries[i].name) != NULL) ||
657 (strstr(evasglexts, _evasgl_ext_entries[i].real_name) != NULL) )
659 _evasgl_ext_entries[i].supported = 1;
660 strcat(_evasgl_ext_string, _evasgl_ext_entries[i].name);
661 strcat(_evasgl_ext_string, " ");
662 DBG("\t%s", _evasgl_ext_entries[i].name);
669 int _evas_engine_GL_X11_log_dom = -1;
670 /* function tables - filled in later (func and parent func) */
671 static Evas_Func func, pfunc;
673 /* Function table for GL APIs */
674 static Evas_GL_API gl_funcs;
682 static struct xrdb_user xrdb_user = {0, 0, NULL};
685 xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val)
687 time_t last = xrdb_user.last_stat, now = time(NULL);
689 xrdb_user.last_stat = now;
690 if (last != now) // don't stat() more than once every second
693 const char *home = getenv("HOME");
696 if (!home) goto failed;
697 snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
698 if (stat(tmp, &st) != 0) goto failed;
699 if (xrdb_user.last_mtime != st.st_mtime)
701 if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db);
702 xrdb_user.db = XrmGetFileDatabase(tmp);
703 if (!xrdb_user.db) goto failed;
704 xrdb_user.last_mtime = st.st_mtime;
708 if (!xrdb_user.db) return EINA_FALSE;
709 return XrmGetResource(xrdb_user.db, name, cls, type, val);
714 XrmDestroyDatabase(xrdb_user.db);
717 xrdb_user.last_mtime = 0;
725 Evas_Engine_Info_GL_X11 *info;
727 info = calloc(1, sizeof(Evas_Engine_Info_GL_X11));
728 info->magic.magic = rand();
729 info->func.best_visual_get = eng_best_visual_get;
730 info->func.best_colormap_get = eng_best_colormap_get;
731 info->func.best_depth_get = eng_best_depth_get;
732 info->render_mode = EVAS_RENDER_MODE_BLOCKING;
738 eng_info_free(Evas *e __UNUSED__, void *info)
740 Evas_Engine_Info_GL_X11 *in;
741 // dont free! why bother? its not worth it
742 // eina_log_domain_unregister(_evas_engine_GL_X11_log_dom);
743 in = (Evas_Engine_Info_GL_X11 *)info;
748 _re_wincheck(Render_Engine *re)
750 if (re->win->surf) return 1;
751 eng_window_resurf(re->win);
754 ERR("GL engine can't re-create window surface!");
760 _re_winfree(Render_Engine *re)
762 if (!re->win->surf) return;
763 eng_window_unsurf(re->win);
766 static Render_Engine_GL_Resource *
767 _create_internal_glue_resources(void *data)
769 Render_Engine *re = (Render_Engine *)data;
770 Render_Engine_GL_Resource *rsc;
772 rsc = calloc(1, sizeof(Render_Engine_GL_Resource));
774 if (!rsc) return NULL;
776 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
778 int context_attrs[3];
779 context_attrs[0] = EGL_CONTEXT_CLIENT_VERSION;
780 context_attrs[1] = 2;
781 context_attrs[2] = EGL_NONE;
783 if (eina_main_loop_is())
785 rsc->surface = re->win->egl_surface[0];
789 // Create resource surface for EGL
790 rsc->surface = eglCreateWindowSurface(re->win->egl_disp,
792 (EGLNativeWindowType)DefaultRootWindow(re->info->info.display),
796 ERR("Creating internal resource surface failed.");
802 // Create a resource context for EGL
803 rsc->context = eglCreateContext(re->win->egl_disp,
805 re->win->egl_context[0], // Evas' GL Context
809 ERR("Internal Resource Context Creations Failed.");
814 // Add to the resource resource list for cleanup
816 resource_list = eina_list_prepend(resource_list, rsc);
819 // Set the resource in TLS
820 if (eina_tls_set(resource_key, (void*)rsc) == EINA_FALSE)
822 ERR("Failed setting TLS Resource");
829 rsc->context = glXCreateContext(re->info->info.display,
831 re->win->context, // Evas' GL Context
835 ERR("Internal Resource Context Creations Failed.");
840 // Add to the resource resource list for cleanup
842 resource_list = eina_list_prepend(resource_list, rsc);
845 // Set the resource in TLS
846 if (eina_tls_set(resource_key, (void*)rsc) == EINA_FALSE)
848 ERR("Failed setting TLS Resource");
860 _destroy_internal_glue_resources(void *data)
862 Render_Engine *re = (Render_Engine *)data;
864 Render_Engine_GL_Resource *rsc;
866 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
868 // Delete the Resources
870 EINA_LIST_FOREACH(resource_list, l, rsc)
872 if ((rsc->surface) && (rsc->surface != re->win->egl_surface[0]))
873 eglDestroySurface(re->win->egl_disp, rsc->surface);
875 eglDestroyContext(re->win->egl_disp, rsc->context);
878 eina_list_free(resource_list);
882 eina_tls_free(resource_key);
885 // Delete the Resources
887 EINA_LIST_FOREACH(resource_list, l, rsc)
891 glXDestroyContext(re->info->info.display, rsc->context);
895 eina_list_free(resource_list);
899 eina_tls_free(resource_key);
908 eng_setup(Evas *e, void *in)
911 Evas_Engine_Info_GL_X11 *info;
913 info = (Evas_Engine_Info_GL_X11 *)in;
914 if (!e->engine.data.output)
916 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
920 if (!glXQueryExtension(info->info.display, &eb, &evb)) return 0;
922 re = calloc(1, sizeof(Render_Engine));
926 e->engine.data.output = re;
929 re->win = eng_window_new(re->info->info.display,
930 re->info->info.drawable,
931 re->info->info.screen,
932 re->info->info.visual,
933 re->info->info.colormap,
934 re->info->info.depth,
938 re->info->info.destination_alpha,
939 re->info->info.rotation);
943 e->engine.data.output = NULL;
954 re->xr.dpi = 75000; // dpy * 1000
956 status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val);
957 if ((!status) || (!type))
959 if (!re->xrdb) re->xrdb = XrmGetDatabase(re->info->info.display);
961 status = XrmGetResource(re->xrdb,
962 "Xft.dpi", "Xft.Dpi", &type, &val);
965 if ((status) && (type))
967 if (!strcmp(type, "String"))
969 const char *str, *dp;
972 dp = strchr(str, '.');
973 if (!dp) dp = strchr(str, ',');
980 buf = alloca(dp - str + 1);
981 strncpy(buf, str, dp - str);
983 len = strlen(dp + 1);
984 subdpi = atoi(dp + 1);
988 for (i = len; i < 3; i++) subdpi *= 10;
992 for (i = len; i > 3; i--) subdpi /= 10;
994 re->xr.dpi = atoi(buf) * 1000;
997 re->xr.dpi = atoi(str) * 1000;
998 evas_common_font_dpi_set(re->xr.dpi / 1000);
1005 evas_common_cpu_init();
1007 evas_common_blend_init();
1008 evas_common_image_init();
1009 evas_common_convert_init();
1010 evas_common_scale_init();
1011 evas_common_rectangle_init();
1012 evas_common_polygon_init();
1013 evas_common_line_init();
1014 evas_common_font_init();
1015 evas_common_draw_init();
1016 evas_common_tilebuf_init();
1019 if (eina_tls_new(&resource_key) == EINA_FALSE)
1020 ERR("Error creating tls key");
1021 DBG("TLS KEY create... %d", resource_key);
1028 re = e->engine.data.output;
1029 if (_re_wincheck(re))
1031 if ((re->info->info.display != re->win->disp) ||
1032 (re->info->info.drawable != re->win->win) ||
1033 (re->info->info.screen != re->win->screen) ||
1034 (re->info->info.visual != re->win->visual) ||
1035 (re->info->info.colormap != re->win->colormap) ||
1036 (re->info->info.depth != re->win->depth) ||
1037 (re->info->info.destination_alpha != re->win->alpha) ||
1038 (re->info->info.rotation != re->win->rot))
1044 re->win->gl_context->references++;
1045 eng_window_free(re->win);
1049 re->w = e->output.w;
1050 re->h = e->output.h;
1051 re->win = eng_window_new(re->info->info.display,
1052 re->info->info.drawable,
1053 re->info->info.screen,
1054 re->info->info.visual,
1055 re->info->info.colormap,
1056 re->info->info.depth,
1060 re->info->info.destination_alpha,
1061 re->info->info.rotation);
1062 eng_window_use(re->win);
1063 if (re->win) gl_wins++;
1064 if ((re->win) && (inc))
1065 re->win->gl_context->references--;
1067 else if ((re->win->w != e->output.w) ||
1068 (re->win->h != e->output.h))
1070 re->w = e->output.w;
1071 re->h = e->output.h;
1072 re->win->w = e->output.w;
1073 re->win->h = e->output.h;
1074 eng_window_use(re->win);
1075 evas_gl_common_context_resize(re->win->gl_context, re->win->w, re->win->h, re->win->rot);
1085 if (!e->engine.data.output)
1089 eng_window_free(re->win);
1095 re->tb = evas_common_tilebuf_new(re->win->w, re->win->h);
1100 eng_window_free(re->win);
1106 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
1108 if (!e->engine.data.context)
1109 e->engine.data.context =
1110 e->engine.func->context_new(e->engine.data.output);
1111 eng_window_use(re->win);
1121 eng_output_free(void *data)
1125 re = (Render_Engine *)data;
1129 // NOTE: XrmGetDatabase() result is shared per connection, do not free it.
1130 // if (re->xrdb) XrmDestroyDatabase(re->xrdb);
1133 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
1134 // Destroy the resource surface
1135 // Only required for EGL case
1137 eglDestroySurface(re->win->egl_disp, re->surface);
1140 // Destroy the resource context
1141 _destroy_internal_context(re, context);
1145 if ((initted == 1) && (gl_wins == 1))
1146 _destroy_internal_glue_resources(re);
1147 eng_window_free(re->win);
1150 evas_common_tilebuf_free(re->tb);
1153 if ((initted == 1) && (gl_wins == 0))
1155 evas_common_image_shutdown();
1156 evas_common_font_shutdown();
1162 eng_output_resize(void *data, int w, int h)
1166 re = (Render_Engine *)data;
1169 eng_window_use(re->win);
1170 evas_gl_common_context_resize(re->win->gl_context, w, h, re->win->rot);
1171 evas_common_tilebuf_free(re->tb);
1172 re->tb = evas_common_tilebuf_new(w, h);
1174 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
1178 eng_output_tile_size_set(void *data, int w, int h)
1182 re = (Render_Engine *)data;
1183 evas_common_tilebuf_set_tile_size(re->tb, w, h);
1187 eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
1191 re = (Render_Engine *)data;
1192 eng_window_use(re->win);
1193 evas_gl_common_context_resize(re->win->gl_context, re->win->w, re->win->h, re->win->rot);
1194 evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
1196 RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, re->win->w, re->win->h);
1197 if ((w <= 0) || (h <= 0)) return;
1198 if (!re->win->draw.redraw)
1201 re->win->draw.x1 = x;
1202 re->win->draw.y1 = y;
1203 re->win->draw.x2 = x + w - 1;
1204 re->win->draw.y2 = y + h - 1;
1206 re->win->draw.x1 = 0;
1207 re->win->draw.y1 = 0;
1208 re->win->draw.x2 = re->win->w - 1;
1209 re->win->draw.y2 = re->win->h - 1;
1214 if (x < re->win->draw.x1) re->win->draw.x1 = x;
1215 if (y < re->win->draw.y1) re->win->draw.y1 = y;
1216 if ((x + w - 1) > re->win->draw.x2) re->win->draw.x2 = x + w - 1;
1217 if ((y + h - 1) > re->win->draw.y2) re->win->draw.y2 = y + h - 1;
1219 re->win->draw.redraw = 1;
1223 eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
1227 re = (Render_Engine *)data;
1228 evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
1232 eng_output_redraws_clear(void *data)
1236 re = (Render_Engine *)data;
1237 evas_common_tilebuf_clear(re->tb);
1238 /* re->win->draw.redraw = 0;*/
1239 // INF("GL: finish update cycle!");
1242 /* vsync games - not for now though */
1243 #define VSYNC_TO_SCREEN 1
1246 eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
1249 Tilebuf_Rect *rects;
1251 re = (Render_Engine *)data;
1252 /* get the upate rect surface - return engine data as dummy */
1253 rects = evas_common_tilebuf_get_render_rects(re->tb);
1259 printf("REAAAAACCTS\n");
1260 EINA_INLIST_FOREACH(EINA_INLIST_GET(rects), r)
1262 printf(" %i %i %ix%i\n", r->x, r->y, r->w, r->h);
1265 evas_common_tilebuf_free_render_rects(rects);
1266 evas_common_tilebuf_clear(re->tb);
1267 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
1268 // dont need to for egl - eng_window_use() can check for other ctxt's
1270 eng_window_use(NULL);
1272 eng_window_use(re->win);
1273 if (!_re_wincheck(re)) return NULL;
1274 evas_gl_common_context_flush(re->win->gl_context);
1275 evas_gl_common_context_newframe(re->win->gl_context);
1278 if (w) *w = re->win->w;
1279 if (h) *h = re->win->h;
1282 if (cw) *cw = re->win->w;
1283 if (ch) *ch = re->win->h;
1284 return re->win->gl_context->def_surface;
1288 if (!re->win->draw.redraw) return NULL;
1289 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
1290 // dont need to for egl - eng_window_use() can check for other ctxt's
1292 eng_window_use(NULL);
1294 eng_window_use(re->win);
1295 if (!_re_wincheck(re)) return NULL;
1296 evas_gl_common_context_flush(re->win->gl_context);
1297 evas_gl_common_context_newframe(re->win->gl_context);
1298 if (x) *x = re->win->draw.x1;
1299 if (y) *y = re->win->draw.y1;
1300 if (w) *w = re->win->draw.x2 - re->win->draw.x1 + 1;
1301 if (h) *h = re->win->draw.y2 - re->win->draw.y1 + 1;
1302 if (cx) *cx = re->win->draw.x1;
1303 if (cy) *cy = re->win->draw.y1;
1304 if (cw) *cw = re->win->draw.x2 - re->win->draw.x1 + 1;
1305 if (ch) *ch = re->win->draw.y2 - re->win->draw.y1 + 1;
1306 return re->win->gl_context->def_surface;
1310 //#define FRAMECOUNT 1
1316 struct timeval timev;
1318 gettimeofday(&timev, NULL);
1319 return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
1323 static int safe_native = -1;
1326 eng_output_redraws_next_update_push(void *data, void *surface __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
1330 static double pt = 0.0;
1334 re = (Render_Engine *)data;
1335 /* put back update surface.. in this case just unflag redraw */
1336 if (!_re_wincheck(re)) return;
1337 re->win->draw.redraw = 0;
1338 re->win->draw.drew = 1;
1339 evas_gl_common_context_flush(re->win->gl_context);
1340 if (safe_native == -1)
1342 const char *s = getenv("EVAS_GL_SAFE_NATIVE");
1344 if (s) safe_native = atoi(s);
1347 s = (const char *)glGetString(GL_RENDERER);
1350 if (strstr(s, "PowerVR SGX 540") ||
1351 strstr(s, "Mali-400 MP"))
1356 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
1357 // this is needed to make sure all previous rendering is flushed to
1360 double t0 = get_time();
1364 // previous rendering should be done and swapped
1365 if (!safe_native) eglWaitNative(EGL_CORE_NATIVE_ENGINE);
1367 double t1 = get_time();
1369 printf("... %1.5f -> %1.5f | ", ta, tb);
1371 // if (eglGetError() != EGL_SUCCESS)
1373 // printf("Error: eglWaitNative(EGL_CORE_NATIVE_ENGINE) fail.\n");
1376 // previous rendering should be done and swapped
1377 if (!safe_native) glXWaitX();
1379 //x// printf("frame -> push\n");
1383 eng_output_flush(void *data)
1387 re = (Render_Engine *)data;
1388 if (!_re_wincheck(re)) return;
1389 if (!re->win->draw.drew) return;
1390 //x// printf("frame -> flush\n");
1391 re->win->draw.drew = 0;
1392 eng_window_use(re->win);
1394 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
1396 double t0 = get_time();
1400 if (re->info->vsync) eglSwapInterval(re->win->egl_disp, 1);
1401 else eglSwapInterval(re->win->egl_disp, 0);
1404 if (re->info->callback.pre_swap)
1406 re->info->callback.pre_swap(re->info->callback.data, re->evas);
1408 eglSwapBuffers(re->win->egl_disp, re->win->egl_surface[0]);
1409 if (!safe_native) eglWaitGL();
1410 if (re->info->callback.post_swap)
1412 re->info->callback.post_swap(re->info->callback.data, re->evas);
1415 double t1 = get_time();
1416 printf("%1.5f\n", t1 - t0);
1418 // if (eglGetError() != EGL_SUCCESS)
1420 // printf("Error: eglSwapBuffers() fail.\n");
1423 #ifdef VSYNC_TO_SCREEN
1424 if ((re->info->vsync)/* || (1)*/)
1426 if (glsym_glXSwapIntervalEXT)
1430 if (re->info->vsync) glsym_glXSwapIntervalEXT(re->win->disp, re->win->win, 1);
1431 else glsym_glXSwapIntervalEXT(re->win->disp, re->win->win, 0);
1435 if (glsym_glXSwapIntervalSGI)
1439 if (re->info->vsync) glsym_glXSwapIntervalSGI(1);
1440 else glsym_glXSwapIntervalSGI(0);
1446 if ((glsym_glXGetVideoSync) && (glsym_glXWaitVideoSync))
1450 glsym_glXGetVideoSync(&rc);
1451 glsym_glXWaitVideoSync(1, 0, &rc);
1456 if (re->info->callback.pre_swap)
1458 re->info->callback.pre_swap(re->info->callback.data, re->evas);
1463 if ((re->win->draw.x1 == 0) && (re->win->draw.y1 == 0) && (re->win->draw.x2 == (re->win->w - 1)) && (re->win->draw.y2 == (re->win->h - 1)))
1466 // double t, t2 = 0.0;
1468 glXSwapBuffers(re->win->disp, re->win->win);
1469 // t = get_time() - t;
1470 // if (!safe_native)
1474 // t2 = get_time() - t2;
1476 // printf("swap: %3.5f (%3.5fms), x wait gl: %3.5f (%3.5fms)\n",
1477 // t, t * 1000.0, t2, t2 * 1000.0);
1481 // FIXME: this doesn't work.. why oh why?
1484 sx = re->win->draw.x1;
1485 sy = re->win->draw.y1;
1486 sw = (re->win->draw.x2 - re->win->draw.x1) + 1;
1487 sh = (re->win->draw.y2 - re->win->draw.y1) + 1;
1488 sy = re->win->h - sy - sh;
1490 glBitmap(0, 0, 0, 0, sx, re->win->h - sy, NULL);
1491 glEnable(GL_SCISSOR_TEST);
1492 glScissor(sx, sy, sw, sh);
1493 glDrawBuffer(GL_FRONT);
1494 glCopyPixels(sx, sy, sw, sh, GL_COLOR);
1495 glDrawBuffer(GL_BACK);
1496 glDisable(GL_SCISSOR_TEST);
1497 glBitmap(0, 0, 0, 0, 0, 0, NULL);
1500 if (re->info->callback.post_swap)
1502 re->info->callback.post_swap(re->info->callback.data, re->evas);
1508 eng_output_idle_flush(void *data)
1512 re = (Render_Engine *)data;
1516 eng_output_dump(void *data)
1520 re = (Render_Engine *)data;
1521 evas_common_image_image_all_unload();
1522 evas_common_font_font_all_unload();
1523 evas_gl_common_image_all_unload(re->win->gl_context);
1528 eng_context_cutout_add(void *data __UNUSED__, void *context, int x, int y, int w, int h)
1530 // Render_Engine *re;
1532 // re = (Render_Engine *)data;
1533 // re->win->gl_context->dc = context;
1534 evas_common_draw_context_add_cutout(context, x, y, w, h);
1538 eng_context_cutout_clear(void *data __UNUSED__, void *context)
1540 // Render_Engine *re;
1542 // re = (Render_Engine *)data;
1543 // re->win->gl_context->dc = context;
1544 evas_common_draw_context_clear_cutouts(context);
1548 eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
1552 re = (Render_Engine *)data;
1553 eng_window_use(re->win);
1554 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
1555 re->win->gl_context->dc = context;
1556 evas_gl_common_rect_draw(re->win->gl_context, x, y, w, h);
1560 eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
1564 re = (Render_Engine *)data;
1565 eng_window_use(re->win);
1566 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
1567 re->win->gl_context->dc = context;
1568 evas_gl_common_line_draw(re->win->gl_context, x1, y1, x2, y2);
1572 eng_polygon_point_add(void *data, void *context __UNUSED__, void *polygon, int x, int y)
1576 re = (Render_Engine *)data;
1577 return evas_gl_common_poly_point_add(polygon, x, y);
1581 eng_polygon_points_clear(void *data, void *context __UNUSED__, void *polygon)
1585 re = (Render_Engine *)data;
1586 return evas_gl_common_poly_points_clear(polygon);
1590 eng_polygon_draw(void *data, void *context, void *surface __UNUSED__, void *polygon, int x, int y)
1594 re = (Render_Engine *)data;
1595 eng_window_use(re->win);
1596 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
1597 re->win->gl_context->dc = context;
1598 evas_gl_common_poly_draw(re->win->gl_context, polygon, x, y);
1602 eng_image_alpha_get(void *data __UNUSED__, void *image)
1604 // Render_Engine *re;
1607 // re = (Render_Engine *)data;
1608 if (!image) return 1;
1614 eng_image_colorspace_get(void *data __UNUSED__, void *image)
1616 // Render_Engine *re;
1619 // re = (Render_Engine *)data;
1620 if (!image) return EVAS_COLORSPACE_ARGB8888;
1622 return im->cs.space;
1626 eng_image_mask_create(void *data __UNUSED__, void *image)
1632 if (!im->im->image.data)
1633 evas_cache_image_load_data(&im->im->cache_entry);
1635 im->tex = evas_gl_common_texture_new(im->gc, im->im);
1640 eng_image_alpha_set(void *data, void *image, int has_alpha)
1645 re = (Render_Engine *)data;
1646 if (!image) return NULL;
1648 if (im->alpha == has_alpha) return image;
1649 if (im->native.data)
1651 im->alpha = has_alpha;
1654 eng_window_use(re->win);
1655 if ((im->tex) && (im->tex->pt->dyn.img))
1657 im->alpha = has_alpha;
1658 im->tex->alpha = im->alpha;
1661 /* FIXME: can move to gl_common */
1662 if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im;
1663 if ((has_alpha) && (im->im->cache_entry.flags.alpha)) return image;
1664 else if ((!has_alpha) && (!im->im->cache_entry.flags.alpha)) return image;
1665 if (im->references > 1)
1667 Evas_GL_Image *im_new;
1669 im_new = evas_gl_common_image_new_from_copied_data
1670 (im->gc, im->im->cache_entry.w, im->im->cache_entry.h,
1672 eng_image_alpha_get(data, image),
1673 eng_image_colorspace_get(data, image));
1674 if (!im_new) return im;
1675 evas_gl_common_image_free(im);
1679 evas_gl_common_image_dirty(im, 0, 0, 0, 0);
1680 return evas_gl_common_image_alpha_set(im, has_alpha ? 1 : 0);
1681 // im->im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
1686 eng_image_border_set(void *data __UNUSED__, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
1688 // Render_Engine *re;
1690 // re = (Render_Engine *)data;
1695 eng_image_border_get(void *data __UNUSED__, void *image __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
1697 // Render_Engine *re;
1699 // re = (Render_Engine *)data;
1703 eng_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__)
1705 // Render_Engine *re;
1708 // re = (Render_Engine *)data;
1709 if (!image) return NULL;
1711 if (!im->im) return NULL;
1712 return im->im->info.comment;
1716 eng_image_format_get(void *data __UNUSED__, void *image)
1718 // Render_Engine *re;
1721 // re = (Render_Engine *)data;
1727 eng_image_colorspace_set(void *data, void *image, int cspace)
1732 re = (Render_Engine *)data;
1735 if (im->native.data) return;
1736 /* FIXME: can move to gl_common */
1737 if (im->cs.space == cspace) return;
1738 eng_window_use(re->win);
1739 evas_cache_image_colorspace(&im->im->cache_entry, cspace);
1742 case EVAS_COLORSPACE_ARGB8888:
1745 if (!im->cs.no_free) free(im->cs.data);
1750 case EVAS_COLORSPACE_YCBCR422P601_PL:
1751 case EVAS_COLORSPACE_YCBCR422P709_PL:
1752 case EVAS_COLORSPACE_YCBCR422601_PL:
1753 case EVAS_COLORSPACE_YCBCR420NV12601_PL:
1754 case EVAS_COLORSPACE_YCBCR420TM12601_PL:
1755 if (im->tex) evas_gl_common_texture_free(im->tex);
1759 if (!im->cs.no_free) free(im->cs.data);
1761 if (im->im->cache_entry.h > 0)
1763 calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2);
1772 im->cs.space = cspace;
1775 /////////////////////////////////////////////////////////////////////////
1778 typedef struct _Native Native;
1782 Evas_Native_Surface ns;
1786 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
1794 // FIXME: this is enabled so updates happen - but its SLOOOOOOOOOOOOOOOW
1795 // (i am sure this is the reason) not to mention seemingly superfluous. but
1796 // i need to enable it for it to work on fglrx at least. havent tried nvidia.
1798 // why is this the case? does anyone know? has anyone tried it on other gfx
1801 //#define GLX_TEX_PIXMAP_RECREATE 1
1804 _native_bind_cb(void *data, void *image)
1806 Evas_GL_Image *im = image;
1807 Native *n = im->native.data;
1809 if (n->ns.type == EVAS_NATIVE_SURFACE_X11)
1811 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
1814 if (glsym_glEGLImageTargetTexture2DOES)
1816 glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, n->egl_surface);
1817 if (eglGetError() != EGL_SUCCESS)
1818 ERR("glEGLImageTargetTexture2DOES() failed.");
1821 ERR("Try glEGLImageTargetTexture2DOES on EGL with no support");
1824 # ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
1825 Render_Engine *re = data;
1827 if (glsym_glXBindTexImage)
1829 glsym_glXBindTexImage(re->win->disp, n->glx_pixmap,
1830 GLX_FRONT_LEFT_EXT, NULL);
1831 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1834 ERR("Try glXBindTexImage on GLX with no support");
1838 else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
1840 glBindTexture(GL_TEXTURE_2D, n->ns.data.opengl.texture_id);
1841 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1848 _native_unbind_cb(void *data, void *image)
1850 Evas_GL_Image *im = image;
1851 Native *n = im->native.data;
1853 if (n->ns.type == EVAS_NATIVE_SURFACE_X11)
1855 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
1858 # ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
1859 Render_Engine *re = data;
1861 if (glsym_glXReleaseTexImage)
1863 glsym_glXReleaseTexImage(re->win->disp, n->glx_pixmap,
1864 GLX_FRONT_LEFT_EXT);
1865 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1868 ERR("Try glXReleaseTexImage on GLX with no support");
1872 else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
1874 glBindTexture(GL_TEXTURE_2D, 0);
1875 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1882 _native_free_cb(void *data, void *image)
1884 Render_Engine *re = data;
1885 Evas_GL_Image *im = image;
1886 Native *n = im->native.data;
1887 uint32_t pmid, texid;
1889 if (n->ns.type == EVAS_NATIVE_SURFACE_X11)
1892 eina_hash_del(re->win->gl_context->shared->native_pm_hash, &pmid, im);
1893 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
1896 if (glsym_eglDestroyImage)
1898 glsym_eglDestroyImage(re->win->egl_disp,
1900 if (eglGetError() != EGL_SUCCESS)
1901 ERR("eglDestroyImage() failed.");
1904 ERR("Try eglDestroyImage on EGL with no support");
1907 # ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
1910 if (im->native.loose)
1912 if (glsym_glXReleaseTexImage)
1914 glsym_glXReleaseTexImage(re->win->disp, n->glx_pixmap,
1915 GLX_FRONT_LEFT_EXT);
1916 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1919 ERR("Try glXReleaseTexImage on GLX with no support");
1921 if (glsym_glXDestroyPixmap)
1923 glsym_glXDestroyPixmap(re->win->disp, n->glx_pixmap);
1924 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
1927 ERR("Try glXDestroyPixmap on GLX with no support");
1933 else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
1935 texid = n->ns.data.opengl.texture_id;
1936 eina_hash_del(re->win->gl_context->shared->native_tex_hash, &texid, im);
1938 im->native.data = NULL;
1939 im->native.func.data = NULL;
1940 im->native.func.bind = NULL;
1941 im->native.func.unbind = NULL;
1942 im->native.func.free = NULL;
1947 eng_image_native_set(void *data, void *image, void *native)
1949 Render_Engine *re = (Render_Engine *)data;
1950 Evas_Native_Surface *ns = native;
1951 Evas_GL_Image *im = image, *im2 = NULL;
1955 uint32_t pmid, texid;
1956 unsigned int tex = 0;
1957 unsigned int fbo = 0;
1961 if ((!ns) && (ns->type == EVAS_NATIVE_SURFACE_OPENGL))
1963 im = evas_gl_common_image_new_from_data(re->win->gl_context,
1967 EVAS_COLORSPACE_ARGB8888);
1975 if (ns->type == EVAS_NATIVE_SURFACE_X11)
1977 vis = ns->data.x11.visual;
1978 pm = ns->data.x11.pixmap;
1979 if (im->native.data)
1981 Evas_Native_Surface *ens = im->native.data;
1982 if ((ens->data.x11.visual == vis) &&
1983 (ens->data.x11.pixmap == pm))
1987 else if (ns->type == EVAS_NATIVE_SURFACE_OPENGL)
1989 tex = ns->data.opengl.texture_id;
1990 fbo = ns->data.opengl.framebuffer_id;
1991 if (im->native.data)
1993 Evas_Native_Surface *ens = im->native.data;
1994 if ((ens->data.opengl.texture_id == tex) &&
1995 (ens->data.opengl.framebuffer_id == fbo))
2000 if ((!ns) && (!im->native.data)) return im;
2002 eng_window_use(re->win);
2004 if (im->native.data)
2006 if (im->native.func.free)
2007 im->native.func.free(im->native.func.data, im);
2008 evas_gl_common_image_native_disable(im);
2013 if (ns->type == EVAS_NATIVE_SURFACE_X11)
2016 im2 = eina_hash_find(re->win->gl_context->shared->native_pm_hash, &pmid);
2017 if (im2 == im) return im;
2020 n = im2->native.data;
2023 evas_gl_common_image_ref(im2);
2024 evas_gl_common_image_free(im);
2029 else if (ns->type == EVAS_NATIVE_SURFACE_OPENGL)
2032 im2 = eina_hash_find(re->win->gl_context->shared->native_tex_hash, &texid);
2033 if (im2 == im) return im;
2036 n = im2->native.data;
2039 evas_gl_common_image_ref(im2);
2040 evas_gl_common_image_free(im);
2046 im2 = evas_gl_common_image_new_from_data(re->win->gl_context,
2047 im->w, im->h, NULL, im->alpha,
2048 EVAS_COLORSPACE_ARGB8888);
2049 evas_gl_common_image_free(im);
2051 if (ns->type == EVAS_NATIVE_SURFACE_X11)
2053 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
2056 n = calloc(1, sizeof(Native));
2059 EGLConfig egl_config;
2060 int config_attrs[20];
2061 int num_config, i = 0;
2063 eina_hash_add(re->win->gl_context->shared->native_pm_hash, &pmid, im);
2065 config_attrs[i++] = EGL_RED_SIZE;
2066 config_attrs[i++] = 8;
2067 config_attrs[i++] = EGL_GREEN_SIZE;
2068 config_attrs[i++] = 8;
2069 config_attrs[i++] = EGL_BLUE_SIZE;
2070 config_attrs[i++] = 8;
2071 config_attrs[i++] = EGL_ALPHA_SIZE;
2072 config_attrs[i++] = 8;
2073 config_attrs[i++] = EGL_DEPTH_SIZE;
2074 config_attrs[i++] = 0;
2075 config_attrs[i++] = EGL_STENCIL_SIZE;
2076 config_attrs[i++] = 0;
2077 config_attrs[i++] = EGL_RENDERABLE_TYPE;
2078 config_attrs[i++] = EGL_OPENGL_ES2_BIT;
2079 config_attrs[i++] = EGL_SURFACE_TYPE;
2080 config_attrs[i++] = EGL_PIXMAP_BIT;
2081 config_attrs[i++] = EGL_NONE;
2083 if (!eglChooseConfig(re->win->egl_disp, config_attrs,
2084 &egl_config, 1, &num_config))
2085 ERR("eglChooseConfig() failed for pixmap 0x%x, num_config = %i", (unsigned int)pm, num_config);
2086 memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface));
2089 if (glsym_eglCreateImage)
2090 n->egl_surface = glsym_eglCreateImage(re->win->egl_disp,
2092 EGL_NATIVE_PIXMAP_KHR,
2096 ERR("Try eglCreateImage on EGL with no support");
2097 if (!n->egl_surface)
2098 ERR("eglCreatePixmapSurface() for 0x%x failed", (unsigned int)pm);
2099 im->native.yinvert = 1;
2100 im->native.loose = 0;
2101 im->native.data = n;
2102 im->native.func.data = re;
2103 im->native.func.bind = _native_bind_cb;
2104 im->native.func.unbind = _native_unbind_cb;
2105 im->native.func.free = _native_free_cb;
2106 im->native.target = GL_TEXTURE_2D;
2107 im->native.mipmap = 0;
2108 evas_gl_common_image_native_enable(im);
2112 # ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
2116 unsigned int w, h, depth = 32, border;
2119 // fixme: round trip :(
2120 XGetGeometry(re->win->disp, pm, &wdummy, &dummy, &dummy,
2121 &w, &h, &border, &depth);
2122 n = calloc(1, sizeof(Native));
2126 unsigned int target = 0;
2129 eina_hash_add(re->win->gl_context->shared->native_pm_hash, &pmid, im);
2130 if ((re->win->depth_cfg[depth].tex_target &
2131 GLX_TEXTURE_2D_BIT_EXT)
2132 // && (1) // we assume npo2 for now
2133 // size is pow2 || mnpo2 supported
2135 target = GLX_TEXTURE_2D_EXT;
2136 else if ((re->win->depth_cfg[depth].tex_target &
2137 GLX_TEXTURE_RECTANGLE_BIT_EXT))
2139 ERR("rect!!! (not handled)");
2140 target = GLX_TEXTURE_RECTANGLE_EXT;
2144 ERR("broken text-from-pixmap");
2145 if (!(re->win->depth_cfg[depth].tex_target &
2146 GLX_TEXTURE_2D_BIT_EXT))
2147 target = GLX_TEXTURE_RECTANGLE_EXT;
2148 else if (!(re->win->depth_cfg[depth].tex_target &
2149 GLX_TEXTURE_RECTANGLE_BIT_EXT))
2150 target = GLX_TEXTURE_2D_EXT;
2154 pixmap_att[i++] = GLX_TEXTURE_FORMAT_EXT;
2155 pixmap_att[i++] = re->win->depth_cfg[depth].tex_format;
2156 pixmap_att[i++] = GLX_MIPMAP_TEXTURE_EXT;
2157 pixmap_att[i++] = re->win->depth_cfg[depth].mipmap;
2161 pixmap_att[i++] = GLX_TEXTURE_TARGET_EXT;
2162 pixmap_att[i++] = target;
2165 pixmap_att[i++] = 0;
2167 memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface));
2170 n->fbc = re->win->depth_cfg[depth].fbc;
2171 if (glsym_glXCreatePixmap)
2172 n->glx_pixmap = glsym_glXCreatePixmap(re->win->disp,
2177 ERR("Try glXCreatePixmap on GLX with no support");
2180 // printf("%p: new native texture for %x | %4i x %4i @ %2i = %p\n",
2181 // n, pm, w, h, depth, n->glx_pixmap);
2184 ERR("no target :(");
2185 if (glsym_glXQueryDrawable)
2186 glsym_glXQueryDrawable(re->win->disp,
2188 GLX_TEXTURE_TARGET_EXT,
2191 if (target == GLX_TEXTURE_2D_EXT)
2193 im->native.target = GL_TEXTURE_2D;
2194 im->native.mipmap = re->win->depth_cfg[depth].mipmap;
2196 # ifdef GL_TEXTURE_RECTANGLE_ARB
2197 else if (target == GLX_TEXTURE_RECTANGLE_EXT)
2199 im->native.target = GL_TEXTURE_RECTANGLE_ARB;
2200 im->native.mipmap = 0;
2205 im->native.target = GL_TEXTURE_2D;
2206 im->native.mipmap = 0;
2207 ERR("still unknown target");
2211 ERR("GLX Pixmap create fail");
2212 im->native.yinvert = re->win->depth_cfg[depth].yinvert;
2213 im->native.loose = re->win->detected.loose_binding;
2214 im->native.data = n;
2215 im->native.func.data = re;
2216 im->native.func.bind = _native_bind_cb;
2217 im->native.func.unbind = _native_unbind_cb;
2218 im->native.func.free = _native_free_cb;
2220 evas_gl_common_image_native_enable(im);
2226 else if (ns->type == EVAS_NATIVE_SURFACE_OPENGL)
2230 n = calloc(1, sizeof(Native));
2233 memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface));
2235 eina_hash_add(re->win->gl_context->shared->native_tex_hash, &texid, im);
2239 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
2246 im->native.yinvert = 0;
2247 im->native.loose = 0;
2248 im->native.data = n;
2249 im->native.func.data = re;
2250 im->native.func.bind = _native_bind_cb;
2251 im->native.func.unbind = _native_unbind_cb;
2252 im->native.func.free = _native_free_cb;
2253 im->native.target = GL_TEXTURE_2D;
2254 im->native.mipmap = 0;
2256 // FIXME: need to implement mapping sub texture regions
2257 // x, y, w, h for possible texture atlasing
2259 evas_gl_common_image_native_enable(im);
2268 eng_image_native_get(void *data __UNUSED__, void *image)
2270 Evas_GL_Image *im = image;
2272 if (!im) return NULL;
2273 n = im->native.data;
2274 if (!n) return NULL;
2278 #if 0 // filtering disabled
2280 eng_image_draw_filtered(void *data, void *context, void *surface,
2281 void *image, Evas_Filter_Info *filter)
2283 Render_Engine *re = data;
2286 eng_window_use(re->win);
2287 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
2288 re->win->gl_context->dc = context;
2290 evas_gl_common_filter_draw(re->win->gl_context, image, filter);
2293 static Filtered_Image *
2294 eng_image_filtered_get(void *im, uint8_t *key, size_t keylen)
2296 return evas_gl_common_image_filtered_get(im, key, keylen);
2299 static Filtered_Image *
2300 eng_image_filtered_save(void *im, void *fim, uint8_t *key, size_t keylen)
2302 return evas_gl_common_image_filtered_save(im, fim, key, keylen);
2306 eng_image_filtered_free(void *im, Filtered_Image *fim)
2308 evas_gl_common_image_filtered_free(im, fim);
2315 /////////////////////////////////////////////////////////////////////////
2318 eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
2322 re = (Render_Engine *)data;
2323 *error = EVAS_LOAD_ERROR_NONE;
2324 eng_window_use(re->win);
2325 return evas_gl_common_image_load(re->win->gl_context, file, key, lo, error);
2329 eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
2333 re = (Render_Engine *)data;
2334 eng_window_use(re->win);
2335 return evas_gl_common_image_new_from_data(re->win->gl_context, w, h, image_data, alpha, cspace);
2339 eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
2343 re = (Render_Engine *)data;
2344 eng_window_use(re->win);
2345 return evas_gl_common_image_new_from_copied_data(re->win->gl_context, w, h, image_data, alpha, cspace);
2349 eng_image_free(void *data, void *image)
2353 re = (Render_Engine *)data;
2355 eng_window_use(re->win);
2356 evas_gl_common_image_free(image);
2360 eng_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
2368 if (w) *w = ((Evas_GL_Image *)image)->w;
2369 if (h) *h = ((Evas_GL_Image *)image)->h;
2373 eng_image_size_set(void *data, void *image, int w, int h)
2376 Evas_GL_Image *im = image;
2377 Evas_GL_Image *im_old;
2379 re = (Render_Engine *)data;
2380 if (!im) return NULL;
2381 if (im->native.data)
2387 eng_window_use(re->win);
2388 if ((im->tex) && (im->tex->pt->dyn.img))
2390 evas_gl_common_texture_free(im->tex);
2394 im->tex = evas_gl_common_texture_dynamic_new(im->gc, im);
2399 switch (eng_image_colorspace_get(data, image))
2401 case EVAS_COLORSPACE_YCBCR422P601_PL:
2402 case EVAS_COLORSPACE_YCBCR422P709_PL:
2403 case EVAS_COLORSPACE_YCBCR422601_PL:
2404 case EVAS_COLORSPACE_YCBCR420NV12601_PL:
2405 case EVAS_COLORSPACE_YCBCR420TM12601_PL:
2411 ((int)im_old->im->cache_entry.w == w) &&
2412 ((int)im_old->im->cache_entry.h == h))
2416 im = evas_gl_common_image_new(re->win->gl_context, w, h,
2417 eng_image_alpha_get(data, image),
2418 eng_image_colorspace_get(data, image));
2420 evas_common_load_image_data_from_file(im_old->im);
2421 if (im_old->im->image->data)
2423 evas_common_blit_rectangle(im_old->im, im->im, 0, 0, w, h, 0, 0);
2424 evas_common_cpu_end_opt();
2427 evas_gl_common_image_free(im_old);
2430 im = evas_gl_common_image_new(re->win->gl_context, w, h, 1, EVAS_COLORSPACE_ARGB8888);
2435 eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
2438 Evas_GL_Image *im = image;
2440 re = (Render_Engine *)data;
2441 if (!image) return NULL;
2442 if (im->native.data) return image;
2443 eng_window_use(re->win);
2444 evas_gl_common_image_dirty(image, x, y, w, h);
2449 eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data, int *err)
2455 re = (Render_Engine *)data;
2459 if (err) *err = EVAS_LOAD_ERROR_GENERIC;
2463 if (im->native.data)
2466 if (err) *err = EVAS_LOAD_ERROR_NONE;
2470 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
2471 eng_window_use(re->win);
2473 if ((im->tex) && (im->tex->pt) && (im->tex->pt->dyn.img) && (im->cs.space == EVAS_COLORSPACE_ARGB8888))
2475 if (im->tex->pt->dyn.checked_out > 0)
2477 im->tex->pt->dyn.checked_out++;
2478 *image_data = im->tex->pt->dyn.data;
2479 if (err) *err = EVAS_LOAD_ERROR_NONE;
2482 *image_data = im->tex->pt->dyn.data = glsym_eglMapImageSEC(re->win->egl_disp, im->tex->pt->dyn.img);
2484 if (!im->tex->pt->dyn.data)
2486 if (err) *err = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
2487 GLERR(__FUNCTION__, __FILE__, __LINE__, "");
2490 im->tex->pt->dyn.checked_out++;
2492 if (err) *err = EVAS_LOAD_ERROR_NONE;
2496 if ((im->tex) && (im->tex->pt) && (im->tex->pt->dyn.data))
2498 *image_data = im->tex->pt->dyn.data;
2499 if (err) *err = EVAS_LOAD_ERROR_NONE;
2503 eng_window_use(re->win);
2506 /* Engine can be fail to create texture after cache drop like eng_image_content_hint_set function,
2507 so it is need to add code which check im->im's NULL value*/
2512 if (err) *err = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
2516 error = evas_cache_image_load_data(&im->im->cache_entry);
2517 switch (im->cs.space)
2519 case EVAS_COLORSPACE_ARGB8888:
2522 if (im->references > 1)
2524 Evas_GL_Image *im_new;
2526 im_new = evas_gl_common_image_new_from_copied_data
2527 (im->gc, im->im->cache_entry.w, im->im->cache_entry.h,
2529 eng_image_alpha_get(data, image),
2530 eng_image_colorspace_get(data, image));
2534 if (err) *err = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
2537 evas_gl_common_image_free(im);
2541 evas_gl_common_image_dirty(im, 0, 0, 0, 0);
2543 *image_data = im->im->image.data;
2545 case EVAS_COLORSPACE_YCBCR422P601_PL:
2546 case EVAS_COLORSPACE_YCBCR422P709_PL:
2547 case EVAS_COLORSPACE_YCBCR422601_PL:
2548 case EVAS_COLORSPACE_YCBCR420NV12601_PL:
2549 case EVAS_COLORSPACE_YCBCR420TM12601_PL:
2550 *image_data = im->cs.data;
2556 if (err) *err = error;
2561 eng_image_data_put(void *data, void *image, DATA32 *image_data)
2564 Evas_GL_Image *im, *im2;
2566 re = (Render_Engine *)data;
2567 if (!image) return NULL;
2569 if (im->native.data) return image;
2570 eng_window_use(re->win);
2571 if ((im->tex) && (im->tex->pt)
2572 && (im->tex->pt->dyn.data)
2573 && (im->cs.space == EVAS_COLORSPACE_ARGB8888))
2577 if (im->tex->pt->dyn.data == image_data)
2579 if (im->tex->pt->dyn.checked_out > 0)
2581 im->tex->pt->dyn.checked_out--;
2582 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
2583 if (im->tex->pt->dyn.checked_out == 0)
2584 glsym_eglUnmapImageSEC(re->win->egl_disp, im->tex->pt->dyn.img);
2591 w = im->im->cache_entry.w;
2592 h = im->im->cache_entry.h;
2593 im2 = eng_image_new_from_data(data, w, h, image_data,
2594 eng_image_alpha_get(data, image),
2595 eng_image_colorspace_get(data, image));
2596 if (!im2) return im;
2597 evas_gl_common_image_free(im);
2599 evas_gl_common_image_dirty(im, 0, 0, 0, 0);
2602 switch (im->cs.space)
2604 case EVAS_COLORSPACE_ARGB8888:
2605 if (image_data != im->im->image.data)
2609 w = im->im->cache_entry.w;
2610 h = im->im->cache_entry.h;
2611 im2 = eng_image_new_from_data(data, w, h, image_data,
2612 eng_image_alpha_get(data, image),
2613 eng_image_colorspace_get(data, image));
2614 if (!im2) return im;
2615 evas_gl_common_image_free(im);
2619 case EVAS_COLORSPACE_YCBCR422P601_PL:
2620 case EVAS_COLORSPACE_YCBCR422P709_PL:
2621 case EVAS_COLORSPACE_YCBCR422601_PL:
2622 case EVAS_COLORSPACE_YCBCR420NV12601_PL:
2623 case EVAS_COLORSPACE_YCBCR420TM12601_PL:
2624 if (image_data != im->cs.data)
2628 if (!im->cs.no_free) free(im->cs.data);
2630 im->cs.data = image_data;
2632 evas_gl_common_image_dirty(im, 0, 0, 0, 0);
2642 eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
2644 Evas_GL_Image *gim = image;
2648 if (gim->native.data) return;
2649 im = (RGBA_Image *)gim->im;
2651 evas_cache_image_preload_data(&im->cache_entry, target);
2655 eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
2657 Evas_GL_Image *gim = image;
2661 if (gim->native.data) return;
2662 im = (RGBA_Image *)gim->im;
2664 evas_cache_image_preload_cancel(&im->cache_entry, target);
2668 eng_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)
2672 re = (Render_Engine *)data;
2675 if ((gl_direct_img_obj) && (gl_direct_enabled))
2677 DBG("Rendering Directly to the window");
2678 evas_object_image_pixels_dirty_set(gl_direct_img_obj, EINA_TRUE);
2682 eng_window_use(re->win);
2683 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
2684 re->win->gl_context->dc = context;
2685 evas_gl_common_image_draw(re->win->gl_context, image,
2686 src_x, src_y, src_w, src_h,
2687 dst_x, dst_y, dst_w, dst_h,
2693 eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
2695 if (image) evas_gl_common_image_scale_hint_set(image, hint);
2699 eng_image_scale_hint_get(void *data __UNUSED__, void *image)
2701 Evas_GL_Image *gim = image;
2702 if (!gim) return EVAS_IMAGE_SCALE_HINT_NONE;
2703 return gim->scale_hint;
2707 eng_image_map_draw(void *data, void *context, void *surface, void *image, int npoints, RGBA_Map_Point *p, int smooth, int level)
2709 Evas_GL_Image *gim = image;
2712 re = (Render_Engine *)data;
2714 eng_window_use(re->win);
2715 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
2716 re->win->gl_context->dc = context;
2719 // FIXME: nash - you didn't fix this
2722 if ((p[0].x == p[3].x) &&
2723 (p[1].x == p[2].x) &&
2724 (p[0].y == p[1].y) &&
2725 (p[3].y == p[2].y) &&
2726 (p[0].x <= p[1].x) &&
2727 (p[0].y <= p[2].y) &&
2730 (p[1].u == (gim->w << FP)) &&
2732 (p[2].u == (gim->w << FP)) &&
2733 (p[2].v == (gim->h << FP)) &&
2735 (p[3].v == (gim->h << FP)) &&
2736 (p[0].col == 0xffffffff) &&
2737 (p[1].col == 0xffffffff) &&
2738 (p[2].col == 0xffffffff) &&
2739 (p[3].col == 0xffffffff))
2745 dw = (p[2].x >> FP) - dx;
2746 dh = (p[2].y >> FP) - dy;
2747 eng_image_draw(data, context, surface, image,
2748 0, 0, gim->w, gim->h, dx, dy, dw, dh, smooth);
2752 evas_gl_common_image_map_draw(re->win->gl_context, image, npoints, p,
2758 eng_image_map_surface_new(void *data, int w, int h, int alpha)
2762 re = (Render_Engine *)data;
2763 return evas_gl_common_image_surface_new(re->win->gl_context, w, h, alpha);
2767 eng_image_map_surface_free(void *data __UNUSED__, void *surface)
2769 evas_gl_common_image_free(surface);
2773 eng_image_content_hint_set(void *data __UNUSED__, void *image, int hint)
2775 if (image) evas_gl_common_image_content_hint_set(image, hint);
2779 eng_image_content_hint_get(void *data __UNUSED__, void *image)
2781 Evas_GL_Image *gim = image;
2782 if (!gim) return EVAS_IMAGE_CONTENT_HINT_NONE;
2783 return gim->content_hint;
2787 eng_image_cache_flush(void *data)
2792 re = (Render_Engine *)data;
2794 tmp_size = evas_common_image_get_cache();
2795 evas_common_image_set_cache(0);
2796 evas_common_rgba_image_scalecache_flush();
2797 evas_gl_common_image_cache_flush(re->win->gl_context);
2798 evas_common_image_set_cache(tmp_size);
2802 eng_image_cache_set(void *data, int bytes)
2806 re = (Render_Engine *)data;
2807 evas_common_image_set_cache(bytes);
2808 evas_common_rgba_image_scalecache_size_set(bytes);
2809 evas_gl_common_image_cache_flush(re->win->gl_context);
2813 eng_image_cache_get(void *data __UNUSED__)
2815 return evas_common_image_get_cache();
2819 eng_image_stride_get(void *data __UNUSED__, void *image, int *stride)
2821 Evas_GL_Image *im = image;
2823 if ((im->tex) && (im->tex->pt->dyn.img))
2824 *stride = im->tex->pt->dyn.stride;
2826 *stride = im->w * 4;
2830 eng_font_draw(void *data, void *context, void *surface, Evas_Font_Set *font __UNUSED__, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, Evas_Text_Props *intl_props)
2834 re = (Render_Engine *)data;
2835 eng_window_use(re->win);
2836 evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
2837 re->win->gl_context->dc = context;
2839 // FIXME: put im into context so we can free it
2840 static RGBA_Image *im = NULL;
2843 im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
2844 im->cache_entry.w = re->win->w;
2845 im->cache_entry.h = re->win->h;
2846 evas_common_draw_context_font_ext_set(context,
2847 re->win->gl_context,
2848 evas_gl_font_texture_new,
2849 evas_gl_font_texture_free,
2850 evas_gl_font_texture_draw);
2851 evas_common_font_draw_prepare(intl_props);
2852 evas_common_font_draw(im, context, x, y, intl_props);
2853 evas_common_draw_context_font_ext_set(context,
2862 eng_canvas_alpha_get(void *data, void *info __UNUSED__)
2864 Render_Engine *re = (Render_Engine *)data;
2865 return re->win->alpha;
2869 // Unfortunately, there is no query function to figure out which surface formats work.
2870 // So, this is one way to test for surface config capability.
2872 _check_gl_surface_format(GLint int_fmt, GLenum fmt, GLenum attachment, GLenum attach_fmt, int mult_samples)
2874 GLuint fbo, tex, rb, ds_tex;
2875 int w, h, fb_status;
2877 // Width/Heith for test purposes
2881 glGenFramebuffers(1, &fbo);
2882 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2884 // Render Target Texture
2887 glGenTextures(1, &tex);
2888 glBindTexture(GL_TEXTURE_2D, tex );
2889 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2890 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2891 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2892 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2893 glTexImage2D(GL_TEXTURE_2D, 0, int_fmt, w, h, 0, fmt, GL_UNSIGNED_BYTE, NULL);
2894 glBindTexture(GL_TEXTURE_2D, 0);
2897 glsym_glFramebufferTexture2DMultisample(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0, mult_samples);
2899 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
2902 // Render Target Attachment (Stencil or Depth)
2905 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
2906 // This is a little hacky but this is how we'll have to do for now.
2907 if (attach_fmt == GL_DEPTH_STENCIL_OES)
2909 glGenTextures(1, &ds_tex);
2910 glBindTexture(GL_TEXTURE_2D, ds_tex);
2911 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2912 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2913 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2914 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2915 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_OES, w, h,
2916 0, GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, NULL);
2919 glsym_glFramebufferTexture2DMultisample(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
2920 GL_TEXTURE_2D, ds_tex, 0, mult_samples);
2921 glsym_glFramebufferTexture2DMultisample(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
2922 GL_TEXTURE_2D, ds_tex, 0, mult_samples);
2926 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
2927 GL_TEXTURE_2D, ds_tex, 0);
2928 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
2929 GL_TEXTURE_2D, ds_tex, 0);
2931 glBindTexture(GL_TEXTURE_2D, 0);
2936 glGenRenderbuffers(1, &rb);
2937 glBindRenderbuffer(GL_RENDERBUFFER, rb);
2939 glsym_glRenderbufferStorageMultisample(GL_RENDERBUFFER, mult_samples, attach_fmt, w, h);
2941 glRenderbufferStorage(GL_RENDERBUFFER, attach_fmt, w, h);
2942 glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, rb);
2943 glBindRenderbuffer(GL_RENDERBUFFER, 0);
2948 // Check FBO for completeness
2949 fb_status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
2952 // Delete Created Resources
2953 glBindFramebuffer(GL_FRAMEBUFFER, 0);
2954 glDeleteFramebuffers(1, &fbo);
2955 if (tex) glDeleteTextures(1, &tex);
2956 if (ds_tex) glDeleteTextures(1, &ds_tex);
2957 if (rb) glDeleteRenderbuffers(1, &rb);
2959 if (fb_status != GL_FRAMEBUFFER_COMPLETE)
2963 if ((attachment) && (!mult_samples))
2971 _print_gl_surface_cap(Render_Engine *re, int error)
2973 #define PRINT_LOG(...) \
2979 PRINT_LOG("----------------------------------------------------");
2980 PRINT_LOG(" EvasGL Supported Surface Format ");
2982 PRINT_LOG(" [Max Renderbuffer Size] : %d", re->gl_cap.max_rb_size);
2983 PRINT_LOG(" [Multisample Support ] : %d", re->gl_cap.msaa_support);
2984 PRINT_LOG(" [Low Samples] : %d", re->gl_cap.msaa_samples[1]);
2985 PRINT_LOG(" [Med Samples] : %d", re->gl_cap.msaa_samples[2]);
2986 PRINT_LOG(" [High Samples] : %d", re->gl_cap.msaa_samples[3]);
2987 PRINT_LOG(" [--Multisamples--] ");
2988 PRINT_LOG(" [Norm] [Low] [Med] [High]");
2989 PRINT_LOG(" [RGB Format] : %4x %d %d %d", re->gl_cap.rgb_888[0], re->gl_cap.rgb_888[1], re->gl_cap.rgb_888[2], re->gl_cap.rgb_888[3]);
2990 PRINT_LOG(" [RGBA Format] : %4x %d %d %d", re->gl_cap.rgba_8888[0], re->gl_cap.rgba_8888[1], re->gl_cap.rgba_8888[2], re->gl_cap.rgba_8888[3]);
2991 PRINT_LOG(" [Depth 8 Bits] : %4x %d %d %d", re->gl_cap.depth_8[0], re->gl_cap.depth_8[1], re->gl_cap.depth_8[2], re->gl_cap.depth_8[3]);
2992 PRINT_LOG(" [Depth 16 Bits] : %4x %d %d %d", re->gl_cap.depth_16[0], re->gl_cap.depth_16[1], re->gl_cap.depth_16[2], re->gl_cap.depth_16[3]);
2993 PRINT_LOG(" [Depth 24 Bits] : %4x %d %d %d", re->gl_cap.depth_24[0], re->gl_cap.depth_24[1], re->gl_cap.depth_24[2], re->gl_cap.depth_24[3]);
2994 PRINT_LOG(" [Depth 32 Bits] : %4x %d %d %d", re->gl_cap.depth_32[0], re->gl_cap.depth_32[1], re->gl_cap.depth_32[2], re->gl_cap.depth_32[3]);
2995 PRINT_LOG(" [Stencil 1 Bits] : %4x %d %d %d", re->gl_cap.stencil_1[0], re->gl_cap.stencil_1[1], re->gl_cap.stencil_1[2], re->gl_cap.stencil_1[3]);
2996 PRINT_LOG(" [Stencil 2 Bits] : %4x %d %d %d", re->gl_cap.stencil_2[0], re->gl_cap.stencil_2[1], re->gl_cap.stencil_2[2], re->gl_cap.stencil_2[3]);
2997 PRINT_LOG(" [Stencil 4 Bits] : %4x %d %d %d", re->gl_cap.stencil_4[0], re->gl_cap.stencil_4[1], re->gl_cap.stencil_4[2], re->gl_cap.stencil_4[3]);
2998 PRINT_LOG(" [Stencil 8 Bits] : %4x %d %d %d", re->gl_cap.stencil_8[0], re->gl_cap.stencil_8[1], re->gl_cap.stencil_8[2], re->gl_cap.stencil_8[3]);
2999 PRINT_LOG(" [Stencil 16 Bits] : %4x %d %d %d", re->gl_cap.stencil_16[0], re->gl_cap.stencil_16[1], re->gl_cap.stencil_16[2], re->gl_cap.stencil_16[3]);
3000 PRINT_LOG(" [Depth 24 Stencil 8 Bits]: %4x %d %d %d", re->gl_cap.depth_24_stencil_8[0], re->gl_cap.depth_24_stencil_8[1], re->gl_cap.depth_24_stencil_8[2], re->gl_cap.depth_24_stencil_8[3]);
3001 PRINT_LOG("----------------------------------------------------");
3006 _set_gl_surface_cap(Render_Engine *re)
3008 GLuint fbo, tex, depth, stencil;
3014 if (re->gl_cap_initted) return;
3016 // Width/Heith for test purposes
3019 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3020 int max_samples = 0;
3022 glGetIntegerv(GL_MAX_SAMPLES_IMG, &max_samples);
3024 // Check if msaa_support is supported
3026 (glsym_glFramebufferTexture2DMultisample) &&
3027 (glsym_glRenderbufferStorageMultisample))
3029 re->gl_cap.msaa_support = 1;
3031 re->gl_cap.msaa_samples[3] = max_samples;
3032 re->gl_cap.msaa_samples[2] = max_samples/2;
3033 re->gl_cap.msaa_samples[1] = max_samples/4;
3034 re->gl_cap.msaa_samples[0] = 0;
3036 if (!re->gl_cap.msaa_samples[2]) re->gl_cap.msaa_samples[3];
3037 if (!re->gl_cap.msaa_samples[1]) re->gl_cap.msaa_samples[2];
3041 re->gl_cap.msaa_support = 0;
3046 glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &re->gl_cap.max_rb_size);
3048 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3049 count = (re->gl_cap.msaa_support) ? 4 : 1;
3051 for (i = 0; i < count; i++)
3053 re->gl_cap.rgb_888[i] = _check_gl_surface_format(GL_RGB, GL_RGB, 0, 0, re->gl_cap.msaa_samples[i]);
3054 re->gl_cap.rgba_8888[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, 0, 0, re->gl_cap.msaa_samples[i]);
3056 re->gl_cap.depth_8[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT, re->gl_cap.msaa_samples[i]);
3057 re->gl_cap.depth_16[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT16, re->gl_cap.msaa_samples[i]);
3058 re->gl_cap.depth_24[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT24_OES, re->gl_cap.msaa_samples[i]);
3059 re->gl_cap.depth_32[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT32_OES, re->gl_cap.msaa_samples[i]);
3061 re->gl_cap.stencil_1[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_STENCIL_ATTACHMENT, GL_STENCIL_INDEX1_OES, re->gl_cap.msaa_samples[i]);
3062 re->gl_cap.stencil_4[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_STENCIL_ATTACHMENT, GL_STENCIL_INDEX4_OES, re->gl_cap.msaa_samples[i]);
3063 re->gl_cap.stencil_8[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_STENCIL_ATTACHMENT, GL_STENCIL_INDEX8, re->gl_cap.msaa_samples[i]);
3065 re->gl_cap.depth_24_stencil_8[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_DEPTH_STENCIL_OES, GL_DEPTH_STENCIL_OES, re->gl_cap.msaa_samples[i]);
3069 count = (re->gl_cap.msaa_support) ? 4 : 1;
3071 for (i = 0; i < count; i++)
3073 re->gl_cap.rgb_888[i] = _check_gl_surface_format(GL_RGB, GL_RGB, 0, 0, re->gl_cap.msaa_samples[i]);
3074 re->gl_cap.rgba_8888[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, 0, 0, re->gl_cap.msaa_samples[i]);
3076 re->gl_cap.depth_8[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT, re->gl_cap.msaa_samples[i]);
3077 re->gl_cap.depth_16[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT16, re->gl_cap.msaa_samples[i]);
3078 re->gl_cap.depth_24[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT24, re->gl_cap.msaa_samples[i]);
3079 re->gl_cap.depth_32[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT32, re->gl_cap.msaa_samples[i]);
3081 re->gl_cap.stencil_1[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_STENCIL_ATTACHMENT, GL_STENCIL_INDEX1, re->gl_cap.msaa_samples[i]);
3082 re->gl_cap.stencil_4[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_STENCIL_ATTACHMENT, GL_STENCIL_INDEX4, re->gl_cap.msaa_samples[i]);
3083 re->gl_cap.stencil_8[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_STENCIL_ATTACHMENT, GL_STENCIL_INDEX8, re->gl_cap.msaa_samples[i]);
3085 re->gl_cap.depth_24_stencil_8[i] = _check_gl_surface_format(GL_RGBA, GL_RGBA, GL_DEPTH_STENCIL_ATTACHMENT, GL_DEPTH24_STENCIL8, re->gl_cap.msaa_samples[i]);
3089 _print_gl_surface_cap(re, 0);
3091 re->gl_cap_initted = 1;
3095 _set_internal_config(Render_Engine *re, Render_Engine_GL_Surface *sfc, Evas_GL_Config *cfg)
3097 // Check if color formats are supported
3098 switch((int)cfg->color_format)
3100 case EVAS_GL_RGB_888:
3101 if (re->gl_cap.rgb_888[0])
3103 sfc->rt_fmt = GL_RGB;
3104 sfc->rt_internal_fmt = GL_RGB;
3107 case EVAS_GL_RGBA_8888:
3108 if (re->gl_cap.rgba_8888[0])
3110 sfc->rt_fmt = GL_RGBA;
3111 sfc->rt_internal_fmt = GL_RGBA;
3112 cfg->color_format = EVAS_GL_RGBA_8888;
3116 ERR("Color Format Not Supported: %d", cfg->color_format);
3117 _print_gl_surface_cap(re, 1);
3121 switch((int)cfg->depth_bits)
3123 case EVAS_GL_DEPTH_NONE:
3125 case EVAS_GL_DEPTH_BIT_8:
3126 if (re->gl_cap.depth_8[0])
3128 sfc->rb_depth_fmt = re->gl_cap.depth_8[0];
3129 cfg->depth_bits = EVAS_GL_DEPTH_BIT_8;
3132 case EVAS_GL_DEPTH_BIT_16:
3133 if (re->gl_cap.depth_16[0])
3135 sfc->rb_depth_fmt = re->gl_cap.depth_16[0];
3136 cfg->depth_bits = EVAS_GL_DEPTH_BIT_16;
3139 case EVAS_GL_DEPTH_BIT_24:
3140 if (re->gl_cap.depth_24[0])
3142 sfc->rb_depth_fmt = re->gl_cap.depth_24[0];
3143 cfg->depth_bits = EVAS_GL_DEPTH_BIT_24;
3146 else if (re->gl_cap.depth_24_stencil_8[0])
3148 sfc->rb_depth_stencil_fmt = re->gl_cap.depth_24_stencil_8[0];
3149 sfc->rb_depth_fmt = re->gl_cap.depth_24_stencil_8[0];
3150 cfg->depth_bits = EVAS_GL_DEPTH_BIT_24;
3153 case EVAS_GL_DEPTH_BIT_32:
3154 if (re->gl_cap.depth_32[0])
3156 sfc->rb_depth_fmt = re->gl_cap.depth_32[0];
3157 cfg->depth_bits = EVAS_GL_DEPTH_BIT_32;
3161 ERR("Unsupported Depth Bits Format: %d", cfg->depth_bits);
3162 _print_gl_surface_cap(re, 1);
3166 switch((int)cfg->stencil_bits)
3168 case EVAS_GL_STENCIL_NONE:
3170 case EVAS_GL_STENCIL_BIT_1:
3171 if (re->gl_cap.stencil_1[0])
3173 sfc->rb_stencil_fmt = re->gl_cap.stencil_1[0];
3174 cfg->stencil_bits = EVAS_GL_STENCIL_BIT_1;
3177 case EVAS_GL_STENCIL_BIT_2:
3178 if (re->gl_cap.stencil_2[0])
3180 sfc->rb_stencil_fmt = re->gl_cap.stencil_2[0];
3181 cfg->stencil_bits = EVAS_GL_STENCIL_BIT_2;
3184 case EVAS_GL_STENCIL_BIT_4:
3185 if (re->gl_cap.stencil_4[0])
3187 sfc->rb_stencil_fmt = re->gl_cap.stencil_4[0];
3188 cfg->stencil_bits = EVAS_GL_STENCIL_BIT_4;
3191 case EVAS_GL_STENCIL_BIT_8:
3192 if ((sfc->rb_depth_fmt == re->gl_cap.depth_24_stencil_8[0]) ||
3193 (!(re->gl_cap.stencil_8[0]) && (re->gl_cap.depth_24_stencil_8[0])))
3195 sfc->rb_depth_stencil_fmt = re->gl_cap.depth_24_stencil_8[0];
3196 sfc->rb_stencil_fmt = re->gl_cap.depth_24_stencil_8[0];
3197 cfg->stencil_bits = EVAS_GL_STENCIL_BIT_8;
3200 else if (re->gl_cap.stencil_8[0])
3202 sfc->rb_stencil_fmt = re->gl_cap.stencil_8[0];
3203 cfg->stencil_bits = EVAS_GL_STENCIL_BIT_8;
3206 case EVAS_GL_STENCIL_BIT_16:
3207 if (re->gl_cap.stencil_16[0])
3209 sfc->rb_stencil_fmt = re->gl_cap.stencil_16[0];
3210 cfg->stencil_bits = EVAS_GL_STENCIL_BIT_16;
3214 ERR("Unsupported Stencil Bits Format: %d", cfg->stencil_bits);
3215 _print_gl_surface_cap(re, 1);
3219 if (cfg->options_bits)
3221 if (cfg->options_bits & EVAS_GL_OPTIONS_DIRECT)
3223 sfc->direct_fb_opt = 1;
3224 DBG("########################################################");
3225 DBG("######### [Evas] Direct option bit is enabled ##########");
3226 DBG("########################################################");
3228 // Add other options here...
3232 if (re->gl_cap.msaa_support)
3234 if ( ((int)(cfg->multisample_bits) > (int)EVAS_GL_MULTISAMPLE_HIGH) ||
3235 ((int)(cfg->multisample_bits) < 0) )
3237 ERR("Unsupported Multisample Bits Format!");
3238 _print_gl_surface_cap(re, 1);
3243 sfc->rt_msaa_samples = re->gl_cap.msaa_samples[(int)cfg->multisample_bits];
3251 _create_rt_buffers(Render_Engine *data __UNUSED__,
3252 Render_Engine_GL_Surface *sfc)
3254 // Render Target texture
3257 glGenTextures(1, &sfc->rt_tex);
3260 // First check if packed buffer is to be used.
3261 if (sfc->rb_depth_stencil_fmt)
3263 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3264 glGenTextures(1, &sfc->rb_depth_stencil);
3266 glGenRenderbuffers(1, &sfc->rb_depth_stencil);
3271 // Depth RenderBuffer - Create storage here...
3272 if (sfc->rb_depth_fmt)
3273 glGenRenderbuffers(1, &sfc->rb_depth);
3275 // Stencil RenderBuffer - Create Storage here...
3276 if (sfc->rb_stencil_fmt)
3277 glGenRenderbuffers(1, &sfc->rb_stencil);
3281 _attach_fbo_surface(Render_Engine *data __UNUSED__,
3282 Render_Engine_GL_Surface *sfc,
3283 Render_Engine_GL_Context *ctx)
3287 glBindFramebuffer(GL_FRAMEBUFFER, ctx->context_fbo);
3289 // Render Target Texture
3292 glBindTexture(GL_TEXTURE_2D, sfc->rt_tex );
3293 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3294 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3295 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3296 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3297 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sfc->w, sfc->h, 0,
3298 GL_RGBA, GL_UNSIGNED_BYTE, NULL);
3299 glBindTexture(GL_TEXTURE_2D, 0);
3301 if (sfc->rt_msaa_samples)
3302 glsym_glFramebufferTexture2DMultisample(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sfc->rt_tex, 0, sfc->rt_msaa_samples);
3304 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
3305 GL_TEXTURE_2D, sfc->rt_tex, 0);
3311 // Depth Stencil RenderBuffer - Attach it to FBO
3312 if (sfc->rb_depth_stencil)
3314 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3315 glBindTexture(GL_TEXTURE_2D, sfc->rb_depth_stencil);
3316 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3317 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3318 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3319 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3320 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_OES, sfc->w, sfc->h,
3321 0, GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, NULL);
3322 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
3323 GL_TEXTURE_2D, sfc->rb_depth_stencil, 0);
3324 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
3325 GL_TEXTURE_2D, sfc->rb_depth_stencil, 0);
3326 glBindTexture(GL_TEXTURE_2D, 0);
3329 glBindRenderbuffer(GL_RENDERBUFFER, sfc->rb_depth_stencil);
3330 glRenderbufferStorage(GL_RENDERBUFFER, sfc->rb_depth_stencil_fmt,
3332 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
3333 GL_RENDERBUFFER, sfc->rb_depth_stencil);
3334 glBindRenderbuffer(GL_RENDERBUFFER, 0);
3338 // Depth RenderBuffer - Attach it to FBO
3341 glBindRenderbuffer(GL_RENDERBUFFER, sfc->rb_depth);
3343 if (sfc->rt_msaa_samples)
3344 glsym_glRenderbufferStorageMultisample(GL_RENDERBUFFER,
3345 sfc->rt_msaa_samples,
3349 glRenderbufferStorage(GL_RENDERBUFFER, sfc->rb_depth_fmt,
3351 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
3352 GL_RENDERBUFFER, sfc->rb_depth);
3353 glBindRenderbuffer(GL_RENDERBUFFER, 0);
3356 // Stencil RenderBuffer - Attach it to FBO
3357 if (sfc->rb_stencil)
3359 glBindRenderbuffer(GL_RENDERBUFFER, sfc->rb_stencil);
3361 if (sfc->rt_msaa_samples)
3362 glsym_glRenderbufferStorageMultisample(GL_RENDERBUFFER,
3363 sfc->rt_msaa_samples,
3364 sfc->rb_stencil_fmt,
3367 glRenderbufferStorage(GL_RENDERBUFFER, sfc->rb_stencil_fmt,
3369 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
3370 GL_RENDERBUFFER, sfc->rb_stencil);
3371 glBindRenderbuffer(GL_RENDERBUFFER, 0);
3374 // Check FBO for completeness
3375 fb_status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
3376 if (fb_status != GL_FRAMEBUFFER_COMPLETE)
3378 ERR("FBO not complete!");
3387 eng_gl_surface_create(void *data, void *config, int w, int h)
3390 Render_Engine_GL_Surface *sfc;
3391 Render_Engine_GL_Resource *rsc;
3392 Evas_GL_Config *cfg;
3396 re = (Render_Engine *)data;
3397 cfg = (Evas_GL_Config *)config;
3399 // Allocate surface and fill in values
3400 sfc = calloc(1, sizeof(Render_Engine_GL_Surface));
3403 ERR("Surface allocation failed.");
3409 sfc->depth_bits = cfg->depth_bits;
3410 sfc->stencil_bits = cfg->stencil_bits;
3412 // Allow alpha for evas gl direct rendering override
3413 // FIXME!!!: A little out of place but for now...
3414 if (!gl_direct_override)
3415 if (getenv("EVAS_GL_DIRECT_OVERRIDE")) gl_direct_override = 1;
3417 // Set the internal format based on the config
3418 if (cfg->options_bits & EVAS_GL_OPTIONS_DIRECT)
3420 DBG("Enabling Direct rendering to the Evas' window.");
3421 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3422 sfc->direct_sfc = re->win->egl_surface[0];
3424 sfc->direct_sfc = re->win->win;
3428 // Create internal resource context if it hasn't been created already
3429 if ((rsc = eina_tls_get(resource_key)) == NULL)
3431 if ((rsc = _create_internal_glue_resources(re)) == NULL)
3433 ERR("Error creating internal resources.");
3438 // Use resource surface/context to create surface resrouces
3439 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3440 res = eglMakeCurrent(re->win->egl_disp, rsc->surface, rsc->surface, rsc->context);
3442 res = glXMakeCurrent(re->info->info.display, re->win->win, rsc->context);
3446 ERR("xxxMakeCurrent() finish!");
3450 // Set the engine surface capability first if it hasn't been set
3451 if (!re->gl_cap_initted) _set_gl_surface_cap(re);
3453 // Check the size of the surface
3454 if ( (w > re->gl_cap.max_rb_size) || (h > re->gl_cap.max_rb_size) )
3456 ERR("Surface size greater than the supported size. Max Surface Size: %d", re->gl_cap.max_rb_size);
3460 // Set the internal config value
3461 if (!_set_internal_config(re, sfc, cfg))
3463 ERR("Unsupported Format!");
3467 // Create Render texture
3468 _create_rt_buffers(re, sfc);
3470 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3471 res = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
3473 res = glXMakeCurrent(re->info->info.display, None, NULL);
3477 ERR("xxxMakeCurrent() finish!");
3493 eng_gl_surface_destroy(void *data, void *surface)
3496 Render_Engine_GL_Surface *sfc;
3497 Render_Engine_GL_Resource *rsc;
3500 re = (Render_Engine *)data;
3501 sfc = (Render_Engine_GL_Surface*)surface;
3505 if ((rsc = eina_tls_get(resource_key)) == EINA_FALSE) return 0;
3507 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3508 ret = eglMakeCurrent(re->win->egl_disp, rsc->surface, rsc->surface, rsc->context);
3510 ret = glXMakeCurrent(re->info->info.display, re->win->win, rsc->context);
3514 ERR("xxxMakeCurrent() failed!");
3518 // Reset the Framebuffer binding point
3519 if ((current_evgl_ctx) && (current_evgl_ctx->current_fbo == current_evgl_ctx->context_fbo))
3521 //glBindFramebuffer(GL_FRAMEBUFFER, 0);
3522 current_evgl_ctx->current_fbo = 0;
3523 current_evgl_ctx->current_sfc = NULL;
3526 // Clear direct rendering flag
3527 gl_direct_enabled = 0;
3529 // Delete FBO/RBO and Texture here
3531 glDeleteTextures(1, &sfc->rt_tex);
3534 glDeleteRenderbuffers(1, &sfc->rb_depth);
3536 if (sfc->rb_stencil)
3537 glDeleteRenderbuffers(1, &sfc->rb_stencil);
3539 if (sfc->rb_depth_stencil)
3541 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3542 glDeleteTextures(1, &sfc->rb_depth_stencil);
3544 glDeleteRenderbuffers(1, &sfc->rb_depth_stencil);
3549 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3550 ret = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
3552 ret = glXMakeCurrent(re->info->info.display, None, NULL);
3556 ERR("xxxMakeCurrent() failed!");
3568 eng_gl_context_create(void *data, void *share_context)
3571 Render_Engine_GL_Context *ctx;
3572 Render_Engine_GL_Context *share_ctx;
3573 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3574 int context_attrs[3];
3577 ctx = calloc(1, sizeof(Render_Engine_GL_Context));
3579 if (!ctx) return NULL;
3581 re = (Render_Engine *)data;
3582 share_ctx = (Render_Engine_GL_Context *)share_context;
3584 // Set the share context to Evas' GL context if share_context is NULL.
3585 // Otherwise set it to the given share_context.
3586 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3588 context_attrs[0] = EGL_CONTEXT_CLIENT_VERSION;
3589 context_attrs[1] = 2;
3590 context_attrs[2] = EGL_NONE;
3594 ctx->context = eglCreateContext(re->win->egl_disp,
3595 re->win->egl_config,
3596 share_ctx->context, // Share Context
3601 ctx->context = eglCreateContext(re->win->egl_disp,
3602 re->win->egl_config,
3603 re->win->egl_context[0], // Evas' GL Context
3609 ERR("eglCreateContext() fail. code=%#x", eglGetError());
3616 ctx->context = glXCreateContext(re->info->info.display,
3617 re->win->visualinfo,
3618 share_ctx->context, // Share Context
3623 ctx->context = glXCreateContext(re->info->info.display,
3624 re->win->visualinfo,
3625 re->win->context, // Evas' GL Context
3631 ERR("glXCreateContext() fail.");
3636 ctx->initialized = 0;
3637 ctx->context_fbo = 0;
3638 ctx->current_sfc = NULL;
3644 eng_gl_context_destroy(void *data, void *context)
3647 Render_Engine_GL_Context *ctx;
3648 Render_Engine_GL_Resource *rsc;
3651 re = (Render_Engine *)data;
3652 ctx = (Render_Engine_GL_Context*)context;
3656 if ((rsc = eina_tls_get(resource_key)) == EINA_FALSE) return 0;
3658 // Do a make current with the given context
3659 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3660 ret = eglMakeCurrent(re->win->egl_disp, rsc->surface,
3661 rsc->surface, ctx->context);
3663 ret = glXMakeCurrent(re->info->info.display, re->win->win,
3668 ERR("xxxMakeCurrent() failed!");
3673 if (ctx->context_fbo)
3674 glDeleteFramebuffers(1, &ctx->context_fbo);
3676 // Destroy the Context
3677 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3678 eglDestroyContext(re->win->egl_disp, ctx->context);
3680 ctx->context = EGL_NO_CONTEXT;
3682 ret = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE,
3683 EGL_NO_SURFACE, EGL_NO_CONTEXT);
3685 glXDestroyContext(re->info->info.display, ctx->context);
3689 ret = glXMakeCurrent(re->info->info.display, None, NULL);
3693 ERR("xxxMakeCurrent() failed!");
3704 eng_gl_make_current(void *data __UNUSED__, void *surface, void *context)
3707 Render_Engine_GL_Surface *sfc;
3708 Render_Engine_GL_Context *ctx;
3710 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3711 Render_Engine_GL_Resource *rsc;
3714 re = (Render_Engine *)data;
3715 sfc = (Render_Engine_GL_Surface*)surface;
3716 ctx = (Render_Engine_GL_Context*)context;
3718 current_engine = re;
3720 // Unset surface/context
3721 if ((!sfc) || (!ctx))
3723 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3724 ret = eglMakeCurrent(re->win->egl_disp, EGL_NO_SURFACE,
3725 EGL_NO_SURFACE, EGL_NO_CONTEXT);
3727 ret = glXMakeCurrent(re->info->info.display, None, NULL);
3731 ERR("xxxMakeCurrent() failed!");
3735 if (ctx) ctx->current_sfc = NULL;
3736 if (sfc) sfc->current_ctx = NULL;
3737 current_evgl_ctx = NULL;
3741 // Check if direct rendering is possible:
3742 // It's possible when direct_fb_opt is on and either current image
3743 // object is valid or gl_direct_override is on. Override allows
3744 // rendering outside of pixel getter but it doesn't guarantee
3745 // correct rendering.
3746 if ((sfc->direct_fb_opt) && (gl_direct_img_obj || gl_direct_override))
3747 gl_direct_enabled = 1;
3749 gl_direct_enabled = 0;
3751 if (gl_direct_enabled)
3755 // Do a make current only if it's not already current
3756 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3757 if ((eglGetCurrentContext() != ctx->context) ||
3758 (eglGetCurrentSurface(EGL_READ) != sfc->direct_sfc) ||
3759 (eglGetCurrentSurface(EGL_DRAW) != sfc->direct_sfc) )
3761 DBG("Rendering Directly to the window\n");
3763 // Flush remainder of what's in Evas' pipeline
3764 eng_window_use(NULL);
3766 // Do a make current
3767 ret = eglMakeCurrent(re->win->egl_disp, sfc->direct_sfc,
3768 sfc->direct_sfc, ctx->context);
3771 ERR("xxxMakeCurrent() failed! code=%#x", eglGetError());
3772 //ERR("xxxMakeCurrent() failed!");
3777 if ((glXGetCurrentContext() != ctx->context))
3779 // Flush remainder of what's in Evas' pipeline
3780 eng_window_use(NULL);
3782 // Do a make current
3783 ret = glXMakeCurrent(re->info->info.display, sfc->direct_sfc, ctx->context);
3786 ERR("xxxMakeCurrent() failed!");
3791 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &curr_fbo);
3792 if (ctx->context_fbo == curr_fbo)
3794 ctx->current_fbo = 0;
3795 glBindFramebuffer(GL_FRAMEBUFFER, 0);
3801 // Do a make current only if it's not already current
3802 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3803 if (eina_main_loop_is())
3805 if ((eglGetCurrentContext() != ctx->context) ||
3806 (eglGetCurrentSurface(EGL_READ) != re->win->egl_surface[0]) ||
3807 (eglGetCurrentSurface(EGL_DRAW) != re->win->egl_surface[0]) )
3810 // Flush remainder of what's in Evas' pipeline
3811 eng_window_use(NULL);
3813 // Do a make current
3814 ret = eglMakeCurrent(re->win->egl_disp, re->win->egl_surface[0],
3815 re->win->egl_surface[0], ctx->context);
3818 ERR("xxxMakeCurrent() failed! code=%#x", eglGetError());
3825 if ((rsc = eina_tls_get(resource_key)) == EINA_FALSE) return 0;
3827 if ((eglGetCurrentContext() != ctx->context) ||
3828 (eglGetCurrentSurface(EGL_READ) != rsc->surface) ||
3829 (eglGetCurrentSurface(EGL_DRAW) != rsc->surface) )
3831 // Flush remainder of what's in Evas' pipeline
3832 eng_window_use(NULL);
3834 // Do a make current
3835 ret = eglMakeCurrent(re->win->egl_disp, rsc->surface,
3836 rsc->surface, ctx->context);
3839 ERR("xxxMakeCurrent() failed!");
3845 if ((glXGetCurrentContext() != ctx->context) ||
3846 (glXGetCurrentDrawable() != re->win->win) )
3848 // Flush remainder of what's in Evas' pipeline
3849 eng_window_use(NULL);
3851 // Do a make current
3852 ret = glXMakeCurrent(re->info->info.display, re->win->win, ctx->context);
3855 ERR("xxxMakeCurrent() failed!");
3861 // Create FBO if not already created
3862 if (!ctx->initialized)
3864 glGenFramebuffers(1, &ctx->context_fbo);
3865 ctx->initialized = 1;
3868 // Attach FBO if it hasn't been attached or if surface changed
3869 if ((!sfc->fbo_attached) || (ctx->current_sfc != sfc))
3871 if (!_attach_fbo_surface(re, sfc, ctx))
3873 ERR("_attach_fbo_surface() failed.");
3877 if (ctx->current_fbo)
3878 // Bind to the previously bound buffer
3879 glBindFramebuffer(GL_FRAMEBUFFER, ctx->current_fbo);
3882 glBindFramebuffer(GL_FRAMEBUFFER, ctx->context_fbo);
3884 sfc->fbo_attached = 1;
3888 // Set the current surface/context
3889 ctx->current_sfc = sfc;
3890 sfc->current_ctx = ctx;
3891 current_evgl_ctx = ctx;
3892 current_engine = re;
3898 eng_gl_string_query(void *data __UNUSED__, int name)
3902 case EVAS_GL_EXTENSIONS:
3903 return (void*)_evasgl_ext_string;
3910 eng_gl_proc_address_get(void *data __UNUSED__, const char *name)
3912 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
3913 if (glsym_eglGetProcAddress) return glsym_eglGetProcAddress(name);
3914 return dlsym(RTLD_DEFAULT, name);
3916 if (glsym_glXGetProcAddress) return glsym_glXGetProcAddress(name);
3917 return dlsym(RTLD_DEFAULT, name);
3922 eng_gl_native_surface_get(void *data __UNUSED__, void *surface, void *native_surface)
3924 Render_Engine_GL_Surface *sfc;
3925 Evas_Native_Surface *ns;
3927 sfc = (Render_Engine_GL_Surface*)surface;
3928 ns = (Evas_Native_Surface*)native_surface;
3930 if (sfc->direct_fb_opt)
3932 ns->type = EVAS_NATIVE_SURFACE_OPENGL;
3933 ns->version = EVAS_NATIVE_SURFACE_VERSION;
3934 ns->data.opengl.texture_id = sfc->rt_tex;
3935 ns->data.opengl.framebuffer_id = 0;
3936 ns->data.opengl.x = 0;
3937 ns->data.opengl.y = 0;
3938 ns->data.opengl.w = sfc->w;
3939 ns->data.opengl.h = sfc->h;
3943 ns->type = EVAS_NATIVE_SURFACE_OPENGL;
3944 ns->version = EVAS_NATIVE_SURFACE_VERSION;
3945 ns->data.opengl.texture_id = sfc->rt_tex;
3946 ns->data.opengl.framebuffer_id = sfc->rt_tex;
3947 ns->data.opengl.x = 0;
3948 ns->data.opengl.y = 0;
3949 ns->data.opengl.w = sfc->w;
3950 ns->data.opengl.h = sfc->h;
3957 static const GLubyte *
3958 evgl_glGetString(GLenum name)
3960 if (name == GL_EXTENSIONS)
3961 return (GLubyte *)_gl_ext_string; //glGetString(GL_EXTENSIONS);
3963 return glGetString(name);
3967 evgl_glBindFramebuffer(GLenum target, GLuint framebuffer)
3969 Render_Engine_GL_Context *ctx = current_evgl_ctx;
3973 ERR("No current context set.");
3977 // Take care of BindFramebuffer 0 issue
3980 if (gl_direct_enabled)
3981 glBindFramebuffer(target, 0);
3983 glBindFramebuffer(target, ctx->context_fbo);
3984 ctx->current_fbo = 0;
3988 glBindFramebuffer(target, framebuffer);
3990 // Save this for restore when doing make current
3991 ctx->current_fbo = framebuffer;
3996 evgl_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
3998 // Add logic to take care when renderbuffer=0
3999 // On a second thought we don't need this
4000 glBindRenderbuffer(target, renderbuffer);
4003 // Transform from Evas Coordinat to GL Coordinate
4004 // returns: oc[4] original image object dimension in gl coord
4005 // returns: nc[4] tranformed (x, y, width, heigth) in gl coord
4007 compute_gl_coordinates(Evas_Object *obj, int rot, int clip,
4008 int x, int y, int width, int height,
4009 int imgc[4], int objc[4])
4013 // oringinal image object coordinate in gl coordinate
4014 imgc[0] = obj->cur.geometry.x;
4015 imgc[1] = obj->layer->evas->output.h - obj->cur.geometry.y - obj->cur.geometry.h;
4016 imgc[2] = imgc[0] + obj->cur.geometry.w;
4017 imgc[3] = imgc[1] + obj->cur.geometry.h;
4019 // transformed (x,y,width,height) in gl coordinate
4020 objc[0] = imgc[0] + x;
4021 objc[1] = imgc[1] + y;
4022 objc[2] = objc[0] + width;
4023 objc[3] = objc[1] + height;
4025 else if (rot == 180)
4027 // oringinal image object coordinate in gl coordinate
4028 imgc[0] = obj->layer->evas->output.w - obj->cur.geometry.x - obj->cur.geometry.w;
4029 imgc[1] = obj->cur.geometry.y;
4030 imgc[2] = imgc[0] + obj->cur.geometry.w;
4031 imgc[3] = imgc[1] + obj->cur.geometry.h;
4033 // transformed (x,y,width,height) in gl coordinate
4034 objc[0] = imgc[0] + obj->cur.geometry.w - x - width;
4035 objc[1] = imgc[1] + obj->cur.geometry.h - y - height;
4036 objc[2] = objc[0] + width;
4037 objc[3] = objc[1] + height;
4042 // oringinal image object coordinate in gl coordinate
4043 imgc[0] = obj->cur.geometry.y;
4044 imgc[1] = obj->cur.geometry.x;
4045 imgc[2] = imgc[0] + obj->cur.geometry.h;
4046 imgc[3] = imgc[1] + obj->cur.geometry.w;
4048 // transformed (x,y,width,height) in gl coordinate
4049 objc[0] = imgc[0] + obj->cur.geometry.h - y - height;
4050 objc[1] = imgc[1] + x;
4051 objc[2] = objc[0] + height;
4052 objc[3] = objc[1] + width;
4054 else if (rot == 270)
4056 // oringinal image object coordinate in gl coordinate
4057 imgc[0] = obj->layer->evas->output.h - obj->cur.geometry.y - obj->cur.geometry.h;
4058 imgc[1] = obj->layer->evas->output.w - obj->cur.geometry.x - obj->cur.geometry.w;
4059 imgc[2] = imgc[0] + obj->cur.geometry.h;
4060 imgc[3] = imgc[1] + obj->cur.geometry.w;
4062 // transformed (x,y,width,height) in gl coordinate
4063 objc[0] = imgc[0] + y;
4064 objc[1] = imgc[1] + obj->cur.geometry.w - x - width;
4065 objc[2] = objc[0] + height;
4066 objc[3] = objc[1] + width;
4070 ERR("Invalid rotation angle %d.", rot);
4076 // Clip against original image object
4077 if (objc[0] < imgc[0]) objc[0] = imgc[0];
4078 if (objc[0] > imgc[2]) objc[0] = 0;
4080 if (objc[1] < imgc[1]) objc[1] = imgc[1];
4081 if (objc[1] > imgc[3]) objc[1] = 0;
4083 if (objc[2] < imgc[0]) objc[0] = 0;
4084 if (objc[2] > imgc[2]) objc[2] = imgc[2];
4086 if (objc[3] < imgc[1]) objc[1] = 0;
4087 if (objc[3] > imgc[3]) objc[3] = imgc[3];
4090 imgc[2] = imgc[2]-imgc[0]; // width
4091 imgc[3] = imgc[3]-imgc[1]; // height
4093 objc[2] = objc[2]-objc[0]; // width
4094 objc[3] = objc[3]-objc[1]; // height
4098 evgl_glClear(GLbitfield mask)
4100 Render_Engine_GL_Context *ctx = current_evgl_ctx;
4104 if ((gl_direct_img_obj) && (gl_direct_enabled) && (ctx) && (!ctx->current_fbo))
4106 if ((current_engine) && (current_engine->win) && (current_engine->win->gl_context))
4107 rot = current_engine->win->gl_context->rot;
4109 ERR("Unable to retrieve rotation angle: %d", rot);
4111 compute_gl_coordinates(gl_direct_img_obj, rot, 0, 0, 0, 0, 0, oc, nc);
4112 glScissor(oc[0], oc[1], oc[2], oc[3]);
4120 evgl_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
4122 glClearColor(red, green, blue, alpha);
4126 evgl_glEnable(GLenum cap)
4128 Render_Engine_GL_Context *ctx = current_evgl_ctx;
4130 if (cap == GL_SCISSOR_TEST)
4131 if (ctx) ctx->scissor_enabled = 1;
4136 evgl_glDisable(GLenum cap)
4138 Render_Engine_GL_Context *ctx = current_evgl_ctx;
4140 if (cap == GL_SCISSOR_TEST)
4141 if (ctx) ctx->scissor_enabled = 0;
4147 evgl_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
4149 Render_Engine_GL_Context *ctx = current_evgl_ctx;
4153 if ((gl_direct_img_obj) && (gl_direct_enabled) && (ctx) && (!ctx->current_fbo))
4155 if ((current_engine) && (current_engine->win) && (current_engine->win->gl_context))
4156 rot = current_engine->win->gl_context->rot;
4158 ERR("Unable to retrieve rotation angle: %d", rot);
4160 compute_gl_coordinates(gl_direct_img_obj, rot, 1, x, y, width, height, oc, nc);
4161 glReadPixels(nc[0], nc[1], nc[2], nc[3], format, type, pixels);
4164 glReadPixels(x, y, width, height, format, type, pixels);
4168 evgl_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4170 Render_Engine_GL_Context *ctx = current_evgl_ctx;
4174 if ((gl_direct_img_obj) && (gl_direct_enabled) && (ctx) && (!ctx->current_fbo))
4176 if ((current_engine) && (current_engine->win) && (current_engine->win->gl_context))
4177 rot = current_engine->win->gl_context->rot;
4179 ERR("Unable to retrieve rotation angle: %d", rot);
4181 compute_gl_coordinates(gl_direct_img_obj, rot, 1, x, y, width, height, oc, nc);
4182 glScissor(nc[0], nc[1], nc[2], nc[3]);
4183 ctx->scissor_upated = 1;
4186 glScissor(x, y, width, height);
4190 evgl_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
4192 Render_Engine_GL_Context *ctx = current_evgl_ctx;
4196 if ((gl_direct_img_obj) && (gl_direct_enabled) && (ctx) && (!ctx->current_fbo))
4198 if ((current_engine) && (current_engine->win) && (current_engine->win->gl_context))
4199 rot = current_engine->win->gl_context->rot;
4201 ERR("Unable to retrieve rotation angle: %d", rot);
4203 compute_gl_coordinates(gl_direct_img_obj, rot, 0, x, y, width, height, oc, nc);
4204 glEnable(GL_SCISSOR_TEST);
4205 glScissor(oc[0], oc[1], oc[2], oc[3]);
4206 glViewport(nc[0], nc[1], nc[2], nc[3]);
4209 glViewport(x, y, width, height);
4214 //----------------------------------------------//
4217 evgl_glClearDepthf(GLclampf depth)
4219 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
4220 glClearDepthf(depth);
4222 glClearDepth(depth);
4227 evgl_glDepthRangef(GLclampf zNear, GLclampf zFar)
4229 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
4230 glDepthRangef(zNear, zFar);
4232 glDepthRange(zNear, zFar);
4237 evgl_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4239 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
4240 glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
4244 range[0] = -126; // floor(log2(FLT_MIN))
4245 range[1] = 127; // floor(log2(FLT_MAX))
4249 precision[0] = 24; // floor(-log2((1.0/16777218.0)));
4256 evgl_glReleaseShaderCompiler(void)
4258 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
4259 glReleaseShaderCompiler();
4265 evgl_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
4267 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
4268 glShaderBinary(n, shaders, binaryformat, binary, length);
4270 // FIXME: need to dlsym/getprocaddress for this
4272 n = binaryformat = length = 0;
4273 shaders = binary = 0;
4277 //--------------------------------//
4278 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
4281 evgl_evasglCreateImage(int target, void* buffer, int *attrib_list)
4285 return glsym_eglCreateImage(current_engine->win->egl_disp,
4293 ERR("Invalid Engine... (Can't acccess EGL Display)\n");
4299 evgl_evasglDestroyImage(EvasGLImage image)
4302 glsym_eglDestroyImage(current_engine->win->egl_disp, image);
4304 ERR("Invalid Engine... (Can't acccess EGL Display)\n");
4308 evgl_glEvasGLImageTargetTexture2DOES(GLenum target, EvasGLImage image)
4310 glsym_glEGLImageTargetTexture2DOES(target, image);
4314 evgl_glEvasGLImageTargetRenderbufferStorageOES(GLenum target, EvasGLImage image)
4316 glsym_glEGLImageTargetTexture2DOES(target, image);
4321 //--------------------------------//
4325 eng_gl_api_get(void *data)
4329 re = (Render_Engine *)data;
4331 gl_funcs.version = EVAS_GL_API_VERSION;
4333 #define ORD(f) EVAS_API_OVERRIDE(f, &gl_funcs, )
4335 ORD(glActiveTexture);
4336 ORD(glAttachShader);
4337 ORD(glBindAttribLocation);
4341 ORD(glBlendEquation);
4342 ORD(glBlendEquationSeparate);
4344 ORD(glBlendFuncSeparate);
4346 ORD(glBufferSubData);
4347 ORD(glCheckFramebufferStatus);
4349 // ORD(glClearColor);
4350 // ORD(glClearDepthf);
4351 ORD(glClearStencil);
4353 ORD(glCompileShader);
4354 ORD(glCompressedTexImage2D);
4355 ORD(glCompressedTexSubImage2D);
4356 ORD(glCopyTexImage2D);
4357 ORD(glCopyTexSubImage2D);
4358 ORD(glCreateProgram);
4359 ORD(glCreateShader);
4361 ORD(glDeleteBuffers);
4362 ORD(glDeleteFramebuffers);
4363 ORD(glDeleteProgram);
4364 ORD(glDeleteRenderbuffers);
4365 ORD(glDeleteShader);
4366 ORD(glDeleteTextures);
4369 // ORD(glDepthRangef);
4370 ORD(glDetachShader);
4372 ORD(glDisableVertexAttribArray);
4374 ORD(glDrawElements);
4376 ORD(glEnableVertexAttribArray);
4379 ORD(glFramebufferRenderbuffer);
4380 ORD(glFramebufferTexture2D);
4383 ORD(glGenerateMipmap);
4384 ORD(glGenFramebuffers);
4385 ORD(glGenRenderbuffers);
4387 ORD(glGetActiveAttrib);
4388 ORD(glGetActiveUniform);
4389 ORD(glGetAttachedShaders);
4390 ORD(glGetAttribLocation);
4392 ORD(glGetBufferParameteriv);
4395 ORD(glGetFramebufferAttachmentParameteriv);
4397 ORD(glGetProgramiv);
4398 ORD(glGetProgramInfoLog);
4399 ORD(glGetRenderbufferParameteriv);
4401 ORD(glGetShaderInfoLog);
4402 // ORD(glGetShaderPrecisionFormat);
4403 ORD(glGetShaderSource);
4404 // ORD(glGetString);
4405 ORD(glGetTexParameterfv);
4406 ORD(glGetTexParameteriv);
4407 ORD(glGetUniformfv);
4408 ORD(glGetUniformiv);
4409 ORD(glGetUniformLocation);
4410 ORD(glGetVertexAttribfv);
4411 ORD(glGetVertexAttribiv);
4412 ORD(glGetVertexAttribPointerv);
4416 ORD(glIsFramebuffer);
4418 ORD(glIsRenderbuffer);
4424 ORD(glPolygonOffset);
4426 // ORD(glReleaseShaderCompiler);
4427 ORD(glRenderbufferStorage);
4428 ORD(glSampleCoverage);
4430 // ORD(glShaderBinary);
4431 ORD(glShaderSource);
4433 ORD(glStencilFuncSeparate);
4435 ORD(glStencilMaskSeparate);
4437 ORD(glStencilOpSeparate);
4439 ORD(glTexParameterf);
4440 ORD(glTexParameterfv);
4441 ORD(glTexParameteri);
4442 ORD(glTexParameteriv);
4443 ORD(glTexSubImage2D);
4460 ORD(glUniformMatrix2fv);
4461 ORD(glUniformMatrix3fv);
4462 ORD(glUniformMatrix4fv);
4464 ORD(glValidateProgram);
4465 ORD(glVertexAttrib1f);
4466 ORD(glVertexAttrib1fv);
4467 ORD(glVertexAttrib2f);
4468 ORD(glVertexAttrib2fv);
4469 ORD(glVertexAttrib3f);
4470 ORD(glVertexAttrib3fv);
4471 ORD(glVertexAttrib4f);
4472 ORD(glVertexAttrib4fv);
4473 ORD(glVertexAttribPointer);
4477 #define ORD(f) EVAS_API_OVERRIDE(f, &gl_funcs, glsym_)
4479 ORD(glGetProgramBinaryOES);
4480 ORD(glProgramBinaryOES);
4481 ORD(glMapBufferOES);
4482 ORD(glUnmapBufferOES);
4483 ORD(glGetBufferPointervOES);
4484 ORD(glTexImage3DOES);
4485 ORD(glTexSubImage3DOES);
4486 ORD(glCopyTexSubImage3DOES);
4487 ORD(glCompressedTexImage3DOES);
4488 ORD(glCompressedTexSubImage3DOES);
4489 ORD(glFramebufferTexture3DOES);
4490 ORD(glGetPerfMonitorGroupsAMD);
4491 ORD(glGetPerfMonitorCountersAMD);
4492 ORD(glGetPerfMonitorGroupStringAMD);
4493 ORD(glGetPerfMonitorCounterStringAMD);
4494 ORD(glGetPerfMonitorCounterInfoAMD);
4495 ORD(glGenPerfMonitorsAMD);
4496 ORD(glDeletePerfMonitorsAMD);
4497 ORD(glSelectPerfMonitorCountersAMD);
4498 ORD(glBeginPerfMonitorAMD);
4499 ORD(glEndPerfMonitorAMD);
4500 ORD(glGetPerfMonitorCounterDataAMD);
4501 ORD(glDiscardFramebufferEXT);
4502 ORD(glMultiDrawArraysEXT);
4503 ORD(glMultiDrawElementsEXT);
4504 ORD(glDeleteFencesNV);
4508 ORD(glGetFenceivNV);
4509 ORD(glFinishFenceNV);
4511 ORD(glGetDriverControlsQCOM);
4512 ORD(glGetDriverControlStringQCOM);
4513 ORD(glEnableDriverControlQCOM);
4514 ORD(glDisableDriverControlQCOM);
4515 ORD(glExtGetTexturesQCOM);
4516 ORD(glExtGetBuffersQCOM);
4517 ORD(glExtGetRenderbuffersQCOM);
4518 ORD(glExtGetFramebuffersQCOM);
4519 ORD(glExtGetTexLevelParameterivQCOM);
4520 ORD(glExtTexObjectStateOverrideiQCOM);
4521 ORD(glExtGetTexSubImageQCOM);
4522 ORD(glExtGetBufferPointervQCOM);
4523 ORD(glExtGetShadersQCOM);
4524 ORD(glExtGetProgramsQCOM);
4525 ORD(glExtIsProgramBinaryQCOM);
4526 ORD(glExtGetProgramBinarySourceQCOM);
4529 // Override functions wrapped by Evas_GL
4530 #define ORD(f) EVAS_API_OVERRIDE(f, &gl_funcs, evgl_)
4531 ORD(glBindFramebuffer);
4532 ORD(glBindRenderbuffer);
4542 // GLES2.0 API compat on top of desktop gl
4545 ORD(glGetShaderPrecisionFormat);
4546 ORD(glReleaseShaderCompiler);
4547 ORD(glShaderBinary);
4551 #if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
4552 // GLES 2.0 Extensions that needs wrapping
4553 ORD(evasglCreateImage);
4554 ORD(evasglDestroyImage);
4555 ORD(glEvasGLImageTargetTexture2DOES);
4556 ORD(glEvasGLImageTargetRenderbufferStorageOES);
4565 eng_gl_img_obj_set(void *data, void *image, int has_alpha)
4567 Render_Engine *re = (Render_Engine *)data;
4569 gl_direct_img_obj = NULL;
4571 // Normally direct rendering isn't allowed if alpha is on and
4572 // rotation is not 0. BUT, if override is on, allow it.
4573 if ((has_alpha) || (re->win->gl_context->rot!=0))
4575 if (gl_direct_override)
4576 gl_direct_img_obj = image;
4579 gl_direct_img_obj = image;
4583 eng_image_load_error_get(void *data __UNUSED__, void *image)
4587 if (!image) return EVAS_LOAD_ERROR_NONE;
4589 return im->im->cache_entry.load_error;
4593 eng_image_animated_get(void *data __UNUSED__, void *image)
4595 Evas_GL_Image *gim = image;
4598 if (!gim) return EINA_FALSE;
4599 im = (Image_Entry *)gim->im;
4600 if (!im) return EINA_FALSE;
4602 return im->flags.animated;
4606 eng_image_animated_frame_count_get(void *data __UNUSED__, void *image)
4608 Evas_GL_Image *gim = image;
4611 if (!gim) return -1;
4612 im = (Image_Entry *)gim->im;
4615 if (!im->flags.animated) return -1;
4616 return im->frame_count;
4619 static Evas_Image_Animated_Loop_Hint
4620 eng_image_animated_loop_type_get(void *data __UNUSED__, void *image)
4622 Evas_GL_Image *gim = image;
4625 if (!gim) return EVAS_IMAGE_ANIMATED_HINT_NONE;
4626 im = (Image_Entry *)gim->im;
4627 if (!im) return EVAS_IMAGE_ANIMATED_HINT_NONE;
4629 if (!im->flags.animated) return EVAS_IMAGE_ANIMATED_HINT_NONE;
4630 return im->loop_hint;
4634 eng_image_animated_loop_count_get(void *data __UNUSED__, void *image)
4636 Evas_GL_Image *gim = image;
4639 if (!gim) return -1;
4640 im = (Image_Entry *)gim->im;
4643 if (!im->flags.animated) return -1;
4644 return im->loop_count;
4648 eng_image_animated_frame_duration_get(void *data __UNUSED__, void *image, int start_frame, int frame_num)
4650 Evas_GL_Image *gim = image;
4653 if (!gim) return -1;
4654 im = (Image_Entry *)gim->im;
4657 if (!im->flags.animated) return -1;
4658 return evas_common_load_rgba_image_frame_duration_from_file(im, start_frame, frame_num);
4662 eng_image_animated_frame_set(void *data __UNUSED__, void *image, int frame_index)
4664 Evas_GL_Image *gim = image;
4667 if (!gim) return EINA_FALSE;
4668 im = (Image_Entry *)gim->im;
4669 if (!im) return EINA_FALSE;
4671 if (!im->flags.animated) return EINA_FALSE;
4672 if (im->cur_frame == frame_index) return EINA_FALSE;
4674 im->cur_frame = frame_index;
4679 eng_image_can_region_get(void *data __UNUSED__, void *image)
4681 Evas_GL_Image *gim = image;
4683 if (!gim) return EINA_FALSE;
4684 im = (Image_Entry *)gim->im;
4685 if (!im) return EINA_FALSE;
4686 return ((Evas_Image_Load_Func*) im->info.loader)->do_region;
4691 eng_image_max_size_get(void *data, int *maxw, int *maxh)
4693 Render_Engine *re = (Render_Engine *)data;
4694 if (maxw) *maxw = re->win->gl_context->shared->info.max_texture_size;
4695 if (maxh) *maxh = re->win->gl_context->shared->info.max_texture_size;
4699 module_open(Evas_Module *em)
4701 static Eina_Bool xrm_inited = EINA_FALSE;
4704 xrm_inited = EINA_TRUE;
4709 if (!evas_gl_common_module_open()) return 0;
4710 /* get whatever engine module we inherit from */
4711 if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
4712 if (_evas_engine_GL_X11_log_dom < 0)
4713 _evas_engine_GL_X11_log_dom = eina_log_domain_register
4714 ("evas-gl_x11", EVAS_DEFAULT_LOG_COLOR);
4715 if (_evas_engine_GL_X11_log_dom < 0)
4717 EINA_LOG_ERR("Can not create a module log domain.");
4722 /* Allow alpha for evas gl direct rendering */
4723 if (getenv("EVAS_GL_DIRECT_OVERRIDE"))
4725 gl_direct_override = 1;
4726 DBG("########################################################");
4727 DBG("######### [Evas] Direct overriding is enabled ##########");
4728 DBG("########################################################");
4731 /* store it for later use */
4733 /* now to override methods */
4734 #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
4738 ORD(canvas_alpha_get);
4741 ORD(output_tile_size_set);
4742 ORD(output_redraws_rect_add);
4743 ORD(output_redraws_rect_del);
4744 ORD(output_redraws_clear);
4745 ORD(output_redraws_next_update_get);
4746 ORD(output_redraws_next_update_push);
4747 ORD(context_cutout_add);
4748 ORD(context_cutout_clear);
4750 ORD(output_idle_flush);
4752 ORD(rectangle_draw);
4754 ORD(polygon_point_add);
4755 ORD(polygon_points_clear);
4759 ORD(image_new_from_data);
4760 ORD(image_new_from_copied_data);
4762 ORD(image_size_get);
4763 ORD(image_size_set);
4764 ORD(image_dirty_region);
4765 ORD(image_data_get);
4766 ORD(image_data_put);
4767 ORD(image_data_preload_request);
4768 ORD(image_data_preload_cancel);
4769 ORD(image_alpha_set);
4770 ORD(image_alpha_get);
4771 ORD(image_border_set);
4772 ORD(image_border_get);
4774 ORD(image_comment_get);
4775 ORD(image_format_get);
4776 ORD(image_colorspace_set);
4777 ORD(image_colorspace_get);
4778 ORD(image_can_region_get);
4779 ORD(image_mask_create);
4780 ORD(image_native_set);
4781 ORD(image_native_get);
4782 #if 0 // filtering disabled
4783 ORD(image_draw_filtered);
4784 ORD(image_filtered_get);
4785 ORD(image_filtered_save);
4786 ORD(image_filtered_free);
4791 ORD(image_scale_hint_set);
4792 ORD(image_scale_hint_get);
4793 ORD(image_stride_get);
4795 ORD(image_map_draw);
4796 ORD(image_map_surface_new);
4797 ORD(image_map_surface_free);
4799 ORD(image_content_hint_set);
4800 ORD(image_content_hint_get);
4802 ORD(image_cache_flush);
4803 ORD(image_cache_set);
4804 ORD(image_cache_get);
4806 ORD(gl_surface_create);
4807 ORD(gl_surface_destroy);
4808 ORD(gl_context_create);
4809 ORD(gl_context_destroy);
4810 ORD(gl_make_current);
4811 ORD(gl_string_query);
4812 ORD(gl_proc_address_get);
4813 ORD(gl_native_surface_get);
4815 ORD(gl_img_obj_set);
4817 ORD(image_load_error_get);
4819 /* now advertise out own api */
4820 ORD(image_animated_get);
4821 ORD(image_animated_frame_count_get);
4822 ORD(image_animated_loop_type_get);
4823 ORD(image_animated_loop_count_get);
4824 ORD(image_animated_frame_duration_get);
4825 ORD(image_animated_frame_set);
4827 ORD(image_max_size_get);
4829 /* now advertise out own api */
4830 em->functions = (void *)(&func);
4835 module_close(Evas_Module *em __UNUSED__)
4837 eina_log_domain_unregister(_evas_engine_GL_X11_log_dom);
4841 XrmDestroyDatabase(xrdb_user.db);
4842 xrdb_user.last_stat = 0;
4843 xrdb_user.last_mtime = 0;
4844 xrdb_user.db = NULL;
4847 evas_gl_common_module_close();
4850 static Evas_Module_Api evas_modapi =
4852 EVAS_MODULE_API_VERSION,
4861 EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, gl_x11);
4863 #ifndef EVAS_STATIC_BUILD_GL_XLIB
4864 EVAS_EINA_MODULE_DEFINE(engine, gl_x11);
4867 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/