forked from enlightenment/efl
evas: evas_gl - Got rid of resource pool in favor of creation on demand.
Resource contexts/surfaces are used for creating resources within Evas_GL. In oder to handle Evas_GL runnig from different thread than the main one, a resource context/surface pool was used. This turned out to be unnecssary as they are not used very frequently. So, I got rid of the pool and made the resources create as needed.
This commit is contained in:
parent
2b191fd835
commit
64aa5a2670
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,10 @@
|
||||||
|
2013-03-04 Sung W. Park (sung_)
|
||||||
|
|
||||||
|
* Evas Evas_GL: removed resource surface/context pool in favor of
|
||||||
|
creating on-demand. resource surface/contexts are used for creating
|
||||||
|
GL resources for Evas_GL.
|
||||||
|
|
||||||
|
|
||||||
2013-02-28 Tom Hacohen (TAsn)
|
2013-02-28 Tom Hacohen (TAsn)
|
||||||
|
|
||||||
* Evas textblock: Added proper size adjustments for
|
* Evas textblock: Added proper size adjustments for
|
||||||
|
@ -5,8 +12,8 @@
|
||||||
|
|
||||||
2013-02-28 Mike Blumenkrantz
|
2013-02-28 Mike Blumenkrantz
|
||||||
|
|
||||||
* fix custom states for edje SPACER parts
|
* fix custom states for edje SPACER parts
|
||||||
* fix edje program filters
|
* fix edje program filters
|
||||||
|
|
||||||
2013-02-28 Cedric Bail
|
2013-02-28 Cedric Bail
|
||||||
|
|
||||||
|
|
|
@ -22,105 +22,6 @@ static void _surface_context_list_print(EVGL_Engine *ee);
|
||||||
// Internal Resources:
|
// Internal Resources:
|
||||||
// - Surface and Context used for internal buffer creation
|
// - Surface and Context used for internal buffer creation
|
||||||
//---------------------------------------------------------------//
|
//---------------------------------------------------------------//
|
||||||
static int
|
|
||||||
_native_surface_pool_create(EVGL_Engine *ee)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
int pool_num = 0;
|
|
||||||
char *s = NULL;
|
|
||||||
void *sfc = NULL, *win = NULL;
|
|
||||||
|
|
||||||
// Check if engine is valid
|
|
||||||
if (!ee)
|
|
||||||
{
|
|
||||||
ERR("EVGL Engine not initialized!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for evn var. Otherwise default max is 8
|
|
||||||
s = getenv("EVAS_GL_CONTEXT_POOL_COUNT");
|
|
||||||
if (s) pool_num = atoi(s);
|
|
||||||
if (pool_num <= 0) pool_num = 8;
|
|
||||||
ee->pool_num = pool_num;
|
|
||||||
|
|
||||||
// Allocate surface pool
|
|
||||||
ee->surface_pool = calloc(1, sizeof(Native_Surface)*pool_num);
|
|
||||||
|
|
||||||
if (!ee->surface_pool)
|
|
||||||
{
|
|
||||||
ERR("Error allocating native surface pool.");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < pool_num; ++i)
|
|
||||||
{
|
|
||||||
sfc = win = NULL;
|
|
||||||
|
|
||||||
win = ee->funcs->native_window_create(ee->engine_data);
|
|
||||||
if (!win)
|
|
||||||
{
|
|
||||||
ERR("Error creating native window");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
sfc = ee->funcs->surface_create(ee->engine_data, win);
|
|
||||||
if (!sfc)
|
|
||||||
{
|
|
||||||
ERR("Error creating native surface");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
ee->surface_pool[i].window = win;
|
|
||||||
ee->surface_pool[i].surface = sfc;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
error:
|
|
||||||
for (i = 0; i < ee->pool_num; ++i)
|
|
||||||
{
|
|
||||||
win = ee->surface_pool[i].window;
|
|
||||||
sfc = ee->surface_pool[i].surface;
|
|
||||||
|
|
||||||
if (win)
|
|
||||||
ee->funcs->native_window_destroy(ee->engine_data, win);
|
|
||||||
if (sfc)
|
|
||||||
ee->funcs->surface_destroy(ee->engine_data, sfc);
|
|
||||||
}
|
|
||||||
if (!ee->surface_pool) free(ee->surface_pool);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
_native_surface_pool_destroy(EVGL_Engine *ee)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
void *sfc = NULL, *win = NULL;
|
|
||||||
|
|
||||||
// Check if engine is valid
|
|
||||||
if (!ee)
|
|
||||||
{
|
|
||||||
ERR("EVGL Engine not initialized!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < ee->pool_num; ++i)
|
|
||||||
{
|
|
||||||
win = ee->surface_pool[i].window;
|
|
||||||
sfc = ee->surface_pool[i].surface;
|
|
||||||
|
|
||||||
if (win)
|
|
||||||
ee->funcs->native_window_destroy(ee->engine_data, win);
|
|
||||||
if (sfc)
|
|
||||||
ee->funcs->surface_destroy(ee->engine_data, sfc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ee->surface_pool) free(ee->surface_pool);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
_internal_resources_create(EVGL_Engine *ee)
|
_internal_resources_create(EVGL_Engine *ee)
|
||||||
{
|
{
|
||||||
|
@ -152,16 +53,21 @@ _internal_resources_create(EVGL_Engine *ee)
|
||||||
if (rsc->id == ee->main_tid)
|
if (rsc->id == ee->main_tid)
|
||||||
rsc->surface = ee->funcs->evas_surface_get(ee->engine_data);
|
rsc->surface = ee->funcs->evas_surface_get(ee->engine_data);
|
||||||
else
|
else
|
||||||
if (rsc->id <= ee->pool_num)
|
{
|
||||||
{
|
rsc->window = ee->funcs->native_window_create(ee->engine_data);
|
||||||
rsc->surface = ee->surface_pool[rsc->id-1].surface;
|
if (!rsc->window)
|
||||||
ERR("Surface Pool[%d]: %p", (rsc->id-1), rsc->surface);
|
{
|
||||||
}
|
ERR("Error creating native window");
|
||||||
else
|
goto error;
|
||||||
{
|
}
|
||||||
ERR("Too many threads using EvasGL.");
|
|
||||||
goto error;
|
rsc->surface = ee->funcs->surface_create(ee->engine_data, rsc->window);
|
||||||
}
|
if (!rsc->surface)
|
||||||
|
{
|
||||||
|
ERR("Error creating native surface");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!rsc->surface)
|
if (!rsc->surface)
|
||||||
{
|
{
|
||||||
|
@ -192,6 +98,9 @@ error:
|
||||||
if (rsc->surface)
|
if (rsc->surface)
|
||||||
if (rsc->id != ee->main_tid) // 0 is the main thread
|
if (rsc->id != ee->main_tid) // 0 is the main thread
|
||||||
ee->funcs->surface_destroy(ee->engine_data, rsc->surface);
|
ee->funcs->surface_destroy(ee->engine_data, rsc->surface);
|
||||||
|
if (rsc->window)
|
||||||
|
if (rsc->id != ee->main_tid) // 0 is the main thread
|
||||||
|
ee->funcs->native_window_destroy(ee->engine_data, rsc->window);
|
||||||
|
|
||||||
if (rsc) free(rsc);
|
if (rsc) free(rsc);
|
||||||
|
|
||||||
|
@ -218,6 +127,12 @@ _internal_resources_destroy(EVGL_Engine *ee)
|
||||||
// Only delete contexts here.
|
// Only delete contexts here.
|
||||||
if (rsc->context)
|
if (rsc->context)
|
||||||
ee->funcs->context_destroy(ee->engine_data, rsc->context);
|
ee->funcs->context_destroy(ee->engine_data, rsc->context);
|
||||||
|
if (rsc->window)
|
||||||
|
if (rsc->id != ee->main_tid) // 0 is the main thread
|
||||||
|
ee->funcs->native_window_destroy(ee->engine_data, rsc->window);
|
||||||
|
if (rsc->surface)
|
||||||
|
if (rsc->id != ee->main_tid) // 0 is the main thread
|
||||||
|
ee->funcs->surface_destroy(ee->engine_data, rsc->surface);
|
||||||
free(rsc);
|
free(rsc);
|
||||||
}
|
}
|
||||||
eina_list_free(ee->resource_list);
|
eina_list_free(ee->resource_list);
|
||||||
|
@ -1368,13 +1283,6 @@ evgl_engine_create(EVGL_Interface *efunc, void *engine_data)
|
||||||
evgl_engine->funcs = efunc;
|
evgl_engine->funcs = efunc;
|
||||||
evgl_engine->engine_data = engine_data;
|
evgl_engine->engine_data = engine_data;
|
||||||
|
|
||||||
// Create a surface pool
|
|
||||||
if (!_native_surface_pool_create(evgl_engine))
|
|
||||||
{
|
|
||||||
ERR("Error createing native surface pool");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize Resource TLS
|
// Initialize Resource TLS
|
||||||
if (eina_tls_new(&evgl_engine->resource_key) == EINA_FALSE)
|
if (eina_tls_new(&evgl_engine->resource_key) == EINA_FALSE)
|
||||||
{
|
{
|
||||||
|
@ -1455,9 +1363,6 @@ int evgl_engine_destroy(EVGL_Engine *ee)
|
||||||
// Destroy internal resources
|
// Destroy internal resources
|
||||||
_internal_resources_destroy(ee);
|
_internal_resources_destroy(ee);
|
||||||
|
|
||||||
// Destroy surface pool
|
|
||||||
_native_surface_pool_destroy(ee);
|
|
||||||
|
|
||||||
// Destroy TLS
|
// Destroy TLS
|
||||||
if (ee->resource_key)
|
if (ee->resource_key)
|
||||||
eina_tls_free(ee->resource_key);
|
eina_tls_free(ee->resource_key);
|
||||||
|
|
|
@ -4,18 +4,18 @@
|
||||||
#include "Evas_GL.h"
|
#include "Evas_GL.h"
|
||||||
|
|
||||||
typedef void *EVGLNative_Display;
|
typedef void *EVGLNative_Display;
|
||||||
|
typedef void *EVGLNative_Window;
|
||||||
typedef void *EVGLNative_Surface;
|
typedef void *EVGLNative_Surface;
|
||||||
typedef void *EVGLNative_Context;
|
typedef void *EVGLNative_Context;
|
||||||
typedef struct _EVGL_Engine EVGL_Engine;
|
typedef struct _EVGL_Engine EVGL_Engine;
|
||||||
typedef struct _EVGL_Interface EVGL_Interface;
|
typedef struct _EVGL_Interface EVGL_Interface;
|
||||||
typedef struct _EVGL_Surface EVGL_Surface;
|
typedef struct _EVGL_Surface EVGL_Surface;
|
||||||
typedef struct _EVGL_Native_Surface EVGL_Native_Surface;
|
typedef struct _EVGL_Native_Window EVGL_Native_Window;
|
||||||
typedef struct _EVGL_Context EVGL_Context;
|
typedef struct _EVGL_Context EVGL_Context;
|
||||||
typedef struct _EVGL_Resource EVGL_Resource;
|
typedef struct _EVGL_Resource EVGL_Resource;
|
||||||
typedef struct _EVGL_Cap EVGL_Cap;
|
typedef struct _EVGL_Cap EVGL_Cap;
|
||||||
typedef struct _EVGL_Surface_Cap EVGL_Surface_Cap;
|
typedef struct _EVGL_Surface_Cap EVGL_Surface_Cap;
|
||||||
typedef struct _EVGL_Surface_Format EVGL_Surface_Format;
|
typedef struct _EVGL_Surface_Format EVGL_Surface_Format;
|
||||||
typedef struct _Native_Surface Native_Surface;
|
|
||||||
|
|
||||||
|
|
||||||
extern EVGL_Engine *evgl_engine_create(EVGL_Interface *efunc, void *engine_data);
|
extern EVGL_Engine *evgl_engine_create(EVGL_Interface *efunc, void *engine_data);
|
||||||
|
|
|
@ -204,6 +204,7 @@ struct _EVGL_Resource
|
||||||
|
|
||||||
EVGLNative_Display display;
|
EVGLNative_Display display;
|
||||||
EVGLNative_Context context;
|
EVGLNative_Context context;
|
||||||
|
EVGLNative_Window window;
|
||||||
EVGLNative_Surface surface;
|
EVGLNative_Surface surface;
|
||||||
|
|
||||||
EVGL_Context *current_ctx;
|
EVGL_Context *current_ctx;
|
||||||
|
@ -212,12 +213,6 @@ struct _EVGL_Resource
|
||||||
Evas_Object *direct_img_obj;
|
Evas_Object *direct_img_obj;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _Native_Surface
|
|
||||||
{
|
|
||||||
void *surface;
|
|
||||||
void *window;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _EVGL_Engine
|
struct _EVGL_Engine
|
||||||
{
|
{
|
||||||
int initted;
|
int initted;
|
||||||
|
@ -235,9 +230,6 @@ struct _EVGL_Engine
|
||||||
Eina_List *resource_list;
|
Eina_List *resource_list;
|
||||||
int resource_count;
|
int resource_count;
|
||||||
int main_tid;
|
int main_tid;
|
||||||
int pool_num;
|
|
||||||
Native_Surface *surface_pool;
|
|
||||||
|
|
||||||
|
|
||||||
int direct_override;
|
int direct_override;
|
||||||
int direct_mem_opt;
|
int direct_mem_opt;
|
||||||
|
|
Loading…
Reference in New Issue