forked from enlightenment/efl
API add: From <dunamis.park@samsung.com> - sungwoo
start of evas gl api (with compile warning fixes). (part 2) SVN revision: 58321
This commit is contained in:
parent
32b352dde9
commit
7bbeca7dcd
|
@ -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
|
|
@ -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 :*/
|
Loading…
Reference in New Issue