Evas GL: Add evas_gl_surface_query

When using EGL, this function should return the properties of
a surface. Limited to a subset of known attributes.

Right now, this function will only work fine with EGL.
GLX support or any other engine is not implemented.

@feature
This commit is contained in:
Jean-Philippe Andre 2014-09-19 15:17:08 +09:00
parent 81bf993c6c
commit 29e7f54ea0
5 changed files with 164 additions and 1 deletions

View File

@ -604,6 +604,26 @@ EAPI Evas_GL_API *evas_gl_api_get (Evas_GL *evas_gl) EINA
*/
EAPI int evas_gl_rotation_get (Evas_GL *evas_gl) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT;
/**
* @brief Query a surface for its properties
*
* @param[in] evas_gl The current Evas_GL object
* @param[in] surface An Evas_GL_Surface surface to query
* @param[in] attribute Specifies the attribute to query.
* @param[out] value Returns the requested value (usually an int)
*
* The currently accepted attributes are the following:
* @li @ref EVAS_GL_WIDTH,
* @li @ref EVAS_GL_HEIGHT,
* @li @ref EVAS_GL_TEXTURE_FORMAT,
* @li @ref EVAS_GL_TEXTURE_TARGET
*
* @return EINA_TRUE in case of success, EINA_FALSE in case of error.
*
* @since_tizen 2.3
*/
EAPI Eina_Bool evas_gl_surface_query (Evas_GL *evas_gl, Evas_GL_Surface *surface, int attribute, void *value) EINA_ARG_NONNULL(1,2);
/**
* @brief Returns the last error of any evas_gl function called in the current thread.
* Initially, the error is set to @ref EVAS_GL_SUCCESS. A call to @ref evas_gl_error_get
@ -1522,6 +1542,17 @@ typedef unsigned long long EvasGLTime;
#define EVAS_GL_NO_SYNC ((EvasGLSync) NULL) /**< @brief Empty sync object, see @ref evasglCreateSync */
/** @} */
/**
* @name Surface attributes
* The attributes can be queried using @ref evas_gl_surface_query
* @{
*/
#define EVAS_GL_HEIGHT 0x3056 /**< Attribute for @ref evas_gl_surface_query, returns the surface width in pixels (@c value should be an @c int) */
#define EVAS_GL_WIDTH 0x3057 /**< Attribute for @ref evas_gl_surface_query, returns the surface width in pixels (@c value should be an @c int) */
#define EVAS_GL_TEXTURE_FORMAT 0x3080 /**< Attribute for @ref evas_gl_surface_query, returns an @ref Evas_GL_Color_Format */
#define EVAS_GL_TEXTURE_TARGET 0x3081 /**< Attribute for @ref evas_gl_surface_query, returns @ref EVAS_GL_TEXTURE_2D (if format is @c EVAS_GL_RGB_888 or @c EVAS_GL_RGBA_8888) or 0 (meaning @c NO_TEXTURE, from @c EVAS_GL_NO_FBO) (@c value should be an @c int) */
/** @} */
#define EVAS_GL_API_VERSION 1
/**

View File

@ -531,3 +531,29 @@ end:
_evas_gl_internal_error_set(evas_gl, EVAS_GL_SUCCESS);
return err;
}
EAPI Eina_Bool
evas_gl_surface_query(Evas_GL *evas_gl, Evas_GL_Surface *surface, int attribute, void *value)
{
if (!evas_gl) return EINA_FALSE;
if (!surface)
{
_evas_gl_internal_error_set(evas_gl, EVAS_GL_BAD_SURFACE);
return EINA_FALSE;
}
if (!evas_gl->evas->engine.func->gl_surface_query)
{
_evas_gl_internal_error_set(evas_gl, EVAS_GL_NOT_INITIALIZED);
return EINA_FALSE;
}
if (!value)
{
_evas_gl_internal_error_set(evas_gl, EVAS_GL_BAD_PARAMETER);
return EINA_FALSE;
}
return evas_gl->evas->engine.func->gl_surface_query
(evas_gl->evas->engine.data.output, surface->data, attribute, value);
}

View File

@ -1248,6 +1248,7 @@ struct _Evas_Func
void *(*gl_current_context_get) (void *data);
void *(*gl_current_surface_get) (void *data);
int (*gl_rotation_angle_get) (void *data);
Eina_Bool (*gl_surface_query) (void *data, void *surface, int attr, void *value);
int (*image_load_error_get) (void *data, void *image);
int (*font_run_end_get) (void *data, Evas_Font_Set *font, Evas_Font_Instance **script_fi, Evas_Font_Instance **cur_fi, Evas_Script_Type script, const Eina_Unicode *text, int run_len);

View File

@ -1327,6 +1327,110 @@ eng_gl_surface_read_pixels(void *data, void *surface,
return EINA_TRUE;
}
static Eina_Bool
eng_gl_surface_query(void *data, void *surface, int attr, void *value)
{
Render_Engine_GL_Generic *re = data;
EVGL_Surface *sfc = surface;
#ifdef GL_GLES
if (sfc->pbuffer.is_pbuffer)
{
// This is a real EGL surface, let's just call EGL directly
int val;
Eina_Bool ok;
ok = eglQuerySurface(re->win->egl_disp, sfc->pbuffer.native_surface, attr, &val);
if (!ok) return EINA_FALSE;
switch (attr)
{
case EVAS_GL_TEXTURE_FORMAT:
if (val == EGL_TEXTURE_RGB)
*((int *) value) = EVAS_GL_RGB_888;
else if (val == EGL_TEXTURE_RGBA)
*((int *) value) = EVAS_GL_RGBA_8888;
else // if (val == EGL_NO_TEXTURE)
*((int *) value) = EVAS_GL_NO_FBO;
break;
case EVAS_GL_TEXTURE_TARGET:
if (val == EGL_TEXTURE_2D)
*((int *) value) = val;
else
*((int *) value) = 0;
break;
default:
*((int *) value) = val;
break;
}
return EINA_TRUE;
}
else
{
// Since this is a fake surface (shared with evas), we must filter the
// queries...
switch (attr)
{
// TODO: Add support for whole config get
/*
case EVAS_GL_CONFIG_ID:
*((int *) value) = sfc->cfg_index;
return EINA_TRUE;
*/
case EVAS_GL_WIDTH:
*((int *) value) = sfc->w;
return EINA_TRUE;
case EVAS_GL_HEIGHT:
*((int *) value) = sfc->h;
return EINA_TRUE;
case EVAS_GL_TEXTURE_FORMAT:
// FIXME: Check the possible color formats
if (sfc->color_buf)
{
if ((sfc->color_fmt == GL_RGBA) || (sfc->color_fmt == GL_BGRA))
{
*((Evas_GL_Color_Format *) value) = EVAS_GL_RGBA_8888;
return EINA_TRUE;
}
else if (sfc->color_fmt == GL_RGB)
{
*((Evas_GL_Color_Format *) value) = EVAS_GL_RGB_888;
return EINA_TRUE;
}
}
*((Evas_GL_Color_Format *) value) = EVAS_GL_NO_FBO;
return EINA_TRUE;
case EVAS_GL_TEXTURE_TARGET:
if (sfc->color_buf)
*((int *) value) = EVAS_GL_TEXTURE_2D;
else
*((int *) value) = 0;
return EINA_TRUE;
// TODO: Add support for this:
/*
case EVAS_GL_MULTISAMPLE_RESOLVE:
*((int *) value) = sfc->msaa_samples;
return EINA_TRUE;
*/
// TODO: Add support for mipmaps
/*
case EVAS_GL_MIPMAP_TEXTURE:
case EVAS_GL_MIPMAP_LEVEL:
return eglQuerySurface(re->win->egl_disp, re->win->egl_surface[0],
attr, (int *) value);
*/
default: break;
}
_evgl_error_set(EVAS_GL_BAD_ATTRIBUTE);
return EINA_FALSE;
}
#else
(void) re; (void) sfc; (void) attr; (void) value;
ERR("GLX support for surface_query is not implemented!");
return EINA_FALSE;
#endif
}
//--------------------------------//
static int
@ -1807,7 +1911,7 @@ module_open(Evas_Module *em)
ORD(gl_surface_read_pixels);
ORD(gl_surface_unlock);
//ORD(gl_error_get);
//ORD(gl_surface_query);
ORD(gl_surface_query);
// gl_current_context_get is in engine
ORD(gl_current_surface_get);
ORD(gl_rotation_angle_get);

View File

@ -3079,6 +3079,7 @@ static Evas_Func func =
NULL, // need software mesa for gl rendering <- gl_current_context_get
NULL, // need software mesa for gl rendering <- gl_current_surface_get
NULL, // need software mesa for gl rendering <- gl_rotation_angle_get
NULL, // need software mesa for gl rendering <- gl_surface_query
eng_image_load_error_get,
eng_font_run_font_end_get,
eng_image_animated_get,