API add: From <dunamis.park@samsung.com> - sungwoo
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 4 Apr 2011 11:48:36 +0000 (11:48 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 4 Apr 2011 11:48:36 +0000 (11:48 +0000)
    start of evas gl api (with compile warning fixes). (part 2)

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@58321 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/Evas_GL.h [new file with mode: 0644]
src/lib/canvas/evas_gl.c [new file with mode: 0644]

diff --git a/src/lib/Evas_GL.h b/src/lib/Evas_GL.h
new file mode 100644 (file)
index 0000000..0eb3720
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef _EVAS_GL_H
+#define _EVAS_GL_H
+
+#include <Evas.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _Evas_GL               Evas_GL;
+typedef struct _Evas_GL_Surface       Evas_GL_Surface;
+typedef struct _Evas_GL_Context       Evas_GL_Context;
+typedef struct _Evas_GL_Config        Evas_GL_Config;
+typedef void*                         Evas_GL_Func;
+
+typedef enum _Evas_GL_Color_Format
+{
+    EVAS_GL_RGB_8,      // 8 bits per channel
+    EVAS_GL_RGBA_8,
+    EVAS_GL_RGB_32,     // 32-bits per channel
+    EVAS_GL_RGBA_32,
+} Evas_GL_Color_Format;
+
+typedef enum _Evas_GL_Depth_Bits
+{
+    EVAS_GL_DEPTH_BIT_8,
+    EVAS_GL_DEPTH_BIT_16,
+    EVAS_GL_DEPTH_BIT_24,
+    EVAS_GL_DEPTH_BIT_32,
+    EVAS_GL_DEPTH_NONE
+} Evas_GL_Depth_Bits;
+
+typedef enum _Evas_GL_Stencil_Bits
+{
+    EVAS_GL_STENCIL_BIT_1,
+    EVAS_GL_STENCIL_BIT_2,
+    EVAS_GL_STENCIL_BIT_4,
+    EVAS_GL_STENCIL_BIT_8,
+    EVAS_GL_STENCIL_BIT_16,
+    EVAS_GL_STENCIL_NONE
+} Evas_GL_Stencil_Bits;
+
+struct _Evas_GL_Config
+{
+    Evas_GL_Color_Format     color_format;
+    Evas_GL_Depth_Bits       depth_bits;
+    Evas_GL_Stencil_Bits     stencil_bits;
+};
+
+/**
+ * @defgroup Evas_GL group for rendering GL on Evas
+ *
+ * Functions that are used to do GL rendering on Evas.
+ *
+ * @ingroup Evas_Canvas
+ */
+
+   EAPI Evas_GL                 *evas_gl_new                (Evas *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
+   EAPI void                     evas_gl_free               (Evas_GL *evas_gl) EINA_ARG_NONNULL(1, 2);;
+   EAPI Evas_GL_Surface         *evas_gl_surface_create     (Evas_GL *evas_gl, Evas_GL_Config *cfg, int w, int h) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1,2);
+   EAPI void                     evas_gl_surface_destroy    (Evas_GL *evas_gl, Evas_GL_Surface *surf) EINA_ARG_NONNULL(1,2); 
+   EAPI Evas_GL_Context         *evas_gl_context_create     (Evas_GL *evas_gl, Evas_GL_Context *share_ctx) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1); 
+   EAPI void                     evas_gl_context_destroy    (Evas_GL *evas_gl, Evas_GL_Context *ctx) EINA_ARG_NONNULL(1,2); 
+   EAPI Eina_Bool                evas_gl_make_current       (Evas_GL *evas_gl, Evas_GL_Surface *surf, Evas_GL_Context *ctx) EINA_ARG_NONNULL(1,2);
+   EAPI Evas_GL_Func             evas_gl_proc_address_get   (Evas_GL *evas_gl, const char *name) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1,2) EINA_PURE;
+
+   EAPI Eina_Bool                evas_gl_native_surface_get (Evas_GL *evas_gl, Evas_GL_Surface *surf, Evas_Native_Surface *ns) EINA_ARG_NONNULL(1,2,3);
+//   EAPI Evas_GL                 *evas_gl_api_get            (Evas *e, Evas_GL_API *glapi) EINA_ARG_NONNULL(1, 2);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lib/canvas/evas_gl.c b/src/lib/canvas/evas_gl.c
new file mode 100644 (file)
index 0000000..4fb9091
--- /dev/null
@@ -0,0 +1,287 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "Evas_GL.h"
+
+struct _Evas_GL
+{
+   int         magic;
+   Evas       *evas;
+
+   Eina_List  *contexts;
+   Eina_List  *surfaces;
+};
+
+struct _Evas_GL_Context
+{
+   void    *data;
+};
+
+struct _Evas_GL_Surface
+{
+   void    *data;
+};
+
+
+/**
+ * @addtogroup Evas_GL
+ * @{
+ */
+
+/**
+ * Creates a new Evas_GL object and returns a handle for gl rendering on efl.
+ *
+ * @param e The given evas.
+ * @return The created evas_gl object.
+ */
+EAPI Evas_GL *
+evas_gl_new(Evas *e)
+{
+   Evas_GL *evas_gl;
+
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   evas_gl = calloc(1, sizeof(Evas_GL));
+   if (!evas_gl) return NULL;
+
+   evas_gl->magic = MAGIC_EVAS_GL;
+   evas_gl->evas = e;
+
+   return evas_gl;
+}
+
+/**
+ * Frees the created Evas_GL object.
+ *
+ * @param evas_gl The given Evas_GL object.
+ */
+EAPI void
+evas_gl_free(Evas_GL *evas_gl)
+{
+   MAGIC_CHECK(evas_gl, Evas_GL, MAGIC_EVAS_GL);
+   return;
+   MAGIC_CHECK_END();
+
+
+   // Delete undeleted surfaces
+   while (evas_gl->surfaces)
+      evas_gl_surface_destroy(evas_gl, evas_gl->surfaces->data);
+
+   // Delete undeleted contexts
+   while (evas_gl->contexts)
+      evas_gl_context_destroy(evas_gl, evas_gl->contexts->data);
+
+   free(evas_gl);
+   evas_gl = NULL;
+}
+
+/**
+ * Creates and returns new Evas_GL_Surface object for GL Rendering.
+ *
+ * @param evas_gl The given Evas_GL object.
+ * @param config The pixel format and configuration of the rendering surface.
+ * @param width The width of the surface.
+ * @param height The height of the surface.
+ * @return The created GL surface object.
+ */
+EAPI Evas_GL_Surface *
+evas_gl_surface_create(Evas_GL *evas_gl, Evas_GL_Config *config, int width, int height)
+{
+   Evas_GL_Surface *surf;
+
+   MAGIC_CHECK(evas_gl, Evas_GL, MAGIC_EVAS_GL);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   surf = calloc(1, sizeof(Evas_GL_Surface));
+
+   surf->data = evas_gl->evas->engine.func->gl_surface_create(evas_gl->evas->engine.data.output, config, width, height); 
+
+   if (!surf->data) 
+     {
+        ERR("Failed creating a surface from the engine\n");
+        free(surf);
+        return NULL;
+     }
+
+   // Keep track of the surface creations
+   evas_gl->surfaces = eina_list_prepend(evas_gl->surfaces, surf);
+
+   return surf;
+}
+
+/**
+ * Destroys the created Evas GL Surface.
+ *
+ * @param evas_gl The given Evas_GL object.
+ * @param surf The given GL surface object.
+ */
+EAPI void 
+evas_gl_surface_destroy(Evas_GL *evas_gl, Evas_GL_Surface *surf)
+{
+   // Magic
+   MAGIC_CHECK(evas_gl, Evas_GL, MAGIC_EVAS_GL);
+   return;
+   MAGIC_CHECK_END();
+
+   if (!surf)
+     {
+       ERR("Trying to destroy a NULL surface pointer!\n");
+        return;
+     }
+
+   // Call Engine's Surface Destroy
+   evas_gl->evas->engine.func->gl_surface_destroy(evas_gl->evas->engine.data.output, surf->data);
+
+   // Remove it from the list
+   evas_gl->surfaces = eina_list_remove(evas_gl->surfaces, surf);
+
+   // Delete the object
+   free(surf);
+   surf = NULL;
+}
+
+/**
+ * Creates and returns a new Evas GL context object
+ *
+ * @param evas_gl The given Evas_GL object.
+ */
+EAPI Evas_GL_Context *
+evas_gl_context_create(Evas_GL *evas_gl, Evas_GL_Context *share_ctx)
+{
+   Evas_GL_Context *ctx;
+
+   // Magic
+   MAGIC_CHECK(evas_gl, Evas_GL, MAGIC_EVAS_GL);
+   return NULL;
+   MAGIC_CHECK_END();
+
+   // Allocate a context object
+   ctx = calloc(1, sizeof(Evas_GL_Context));
+   if (!ctx) 
+     {
+        ERR("Unable to create a Evas_GL_Context object\n");
+        return NULL;
+     }
+
+   // Call engine->gl_create_context
+   if (share_ctx)
+     {
+        ctx->data = evas_gl->evas->engine.func->gl_context_create(evas_gl->evas->engine.data.output, share_ctx->data); 
+     }
+   else 
+     {
+        ctx->data = evas_gl->evas->engine.func->gl_context_create(evas_gl->evas->engine.data.output, NULL); 
+     }
+
+   // Set a few variables
+   if (!ctx->data) 
+     {
+        ERR("Failed creating a context from the engine\n");
+        free(ctx);
+        return NULL;
+     }
+
+   // Keep track of the context creations
+   evas_gl->contexts = eina_list_prepend(evas_gl->contexts, ctx);
+
+   return ctx;
+
+}
+
+/**
+ * Destroys the given Evas GL context object
+ *
+ * @param evas_gl The given Evas_GL object.
+ * @param ctx The given Evas GL context.
+ */
+EAPI void
+evas_gl_context_destroy(Evas_GL *evas_gl, Evas_GL_Context *ctx)
+{
+
+   MAGIC_CHECK(evas_gl, Evas_GL, MAGIC_EVAS_GL);
+   return;
+   MAGIC_CHECK_END();
+
+   if (!ctx)
+     {
+       ERR("Trying to destroy a NULL context pointer!\n");
+        return;
+     }
+
+   // Call Engine's destroy
+   evas_gl->evas->engine.func->gl_context_destroy(evas_gl->evas->engine.data.output, ctx->data); 
+
+   // Remove it from the list
+   evas_gl->contexts = eina_list_remove(evas_gl->contexts, ctx);
+
+   // Delete the object
+   free(ctx);
+   ctx = NULL;
+}
+
+/**
+ * Sets the given context as a current context for the given surface
+ *
+ * @param evas_gl The given Evas_GL object.
+ * @param surf The given Evas GL surface.
+ * @param ctx The given Evas GL context.
+ */
+EAPI Eina_Bool
+evas_gl_make_current(Evas_GL *evas_gl, Evas_GL_Surface *surf, Evas_GL_Context *ctx)
+{
+   Eina_Bool ret;
+
+   MAGIC_CHECK(evas_gl, Evas_GL, MAGIC_EVAS_GL);
+   return EINA_FALSE;
+   MAGIC_CHECK_END(); 
+
+   if ((!surf) || (!ctx))
+      ret = (Eina_Bool)evas_gl->evas->engine.func->gl_make_current(evas_gl->evas->engine.data.output, NULL, NULL); 
+   else 
+      ret = (Eina_Bool)evas_gl->evas->engine.func->gl_make_current(evas_gl->evas->engine.data.output, surf->data, ctx->data); 
+   
+   return ret;
+}
+
+/**
+ * Returns a GL or the Glue Layer's extension function.
+ *
+ * @param evas_gl The given Evas_GL object.
+ * @param name The name of the function to return.
+ */
+EAPI Evas_GL_Func
+evas_gl_proc_address_get(Evas_GL *evas_gl, const char *name)
+{
+   MAGIC_CHECK(evas_gl, Evas_GL, MAGIC_EVAS_GL);
+   return EINA_FALSE;
+   MAGIC_CHECK_END();
+
+   return (Evas_GL_Func)evas_gl->evas->engine.func->gl_proc_address_get(evas_gl->evas->engine.data.output, name); 
+}
+
+/**
+ * Fills in the Native Surface information from the given Evas GL surface.
+ *
+ * @param evas_gl The given Evas_GL object.
+ * @param surf The given Evas GL surface to retrieve the Native Surface info from.
+ * @param ns The native surface structure that the function fills in.
+ */
+EAPI Eina_Bool
+evas_gl_native_surface_get (Evas_GL *evas_gl, Evas_GL_Surface *surf, Evas_Native_Surface *ns)
+{
+
+   MAGIC_CHECK(evas_gl, Evas_GL, MAGIC_EVAS_GL);
+   return EINA_FALSE;
+   MAGIC_CHECK_END();
+
+   return (Eina_Bool)evas_gl->evas->engine.func->gl_native_surface_get(evas_gl->evas->engine.data.output, surf->data, ns); 
+}
+
+/**
+ * @}
+ */
+
+
+/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/