Hi, On Sun, Jan 06, 2013 at 10:16:18PM -0800, Enlightenment SVN wrote: > Log: > Pulled out evas gl backend binary shader file caching code from > evas_gl_shader.c file and made an internal generic caching api in > evas_gl_common.h for use in other places ie. evas_gl. > > Then implemented evas_gl surface cap. caching code in gl backend to > accelerate the engine creation. > > > > Author: sung > Date: 2013-01-06 22:16:18 -0800 (Sun, 06 Jan 2013) > New Revision: 82321 > Trac: http://trac.enlightenment.org/e/changeset/82321 > > Added: > trunk/efl/src/modules/evas/engines/gl_common/evas_gl_file_cache.c > Modified: > trunk/efl/ChangeLog trunk/efl/src/Makefile_Evas.am > trunk/efl/src/modules/evas/engines/gl_common/evas_gl_common.h > trunk/efl/src/modules/evas/engines/gl_common/evas_gl_core.c > trunk/efl/src/modules/evas/engines/gl_common/evas_gl_shader.c > > Modified: trunk/efl/ChangeLog > =================================================================== > --- trunk/efl/ChangeLog 2013-01-07 06:06:16 UTC (rev 82320) > +++ trunk/efl/ChangeLog 2013-01-07 06:16:18 UTC (rev 82321) > @@ -1,3 +1,12 @@ > +2013-01-07 Sung W. Park (sung_) > + > + * Pulled out evas gl backend binary shader file caching code from > + evas_gl_shader.c file and made an internal generic caching api in > + evas_gl_common.h for use in evas_gl code. > + * Implemented evas_gl surface cap. caching code in gl backend to > + accelerate the engine creation. > + > + > 2013-01-07 Thomas Petazzoni > > * Fix build of Evas XCB backend. > > Modified: trunk/efl/src/Makefile_Evas.am > =================================================================== > --- trunk/efl/src/Makefile_Evas.am 2013-01-07 06:06:16 UTC (rev 82320) > +++ trunk/efl/src/Makefile_Evas.am 2013-01-07 06:16:18 UTC (rev 82321) > @@ -448,6 +448,7 @@ > modules/evas/engines/gl_common/evas_gl_private.h \ > modules/evas/engines/gl_common/evas_gl_common.h \ > modules/evas/engines/gl_common/evas_gl_context.c \ > +modules/evas/engines/gl_common/evas_gl_file_cache.c \ > modules/evas/engines/gl_common/evas_gl_shader.c \ > modules/evas/engines/gl_common/evas_gl_rectangle.c \ > modules/evas/engines/gl_common/evas_gl_texture.c \ > > Modified: trunk/efl/src/modules/evas/engines/gl_common/evas_gl_common.h > =================================================================== > --- trunk/efl/src/modules/evas/engines/gl_common/evas_gl_common.h > 2013-01-07 06:06:16 UTC (rev 82320) > +++ trunk/efl/src/modules/evas/engines/gl_common/evas_gl_common.h > 2013-01-07 06:16:18 UTC (rev 82321) > @@ -555,6 +555,15 @@ > void evas_gl_common_shader_program_init_done(void); > void evas_gl_common_shader_program_shutdown(Evas_GL_Program *p); > > +Eina_Bool evas_gl_common_file_cache_is_dir(const char *file); > +Eina_Bool evas_gl_common_file_cache_mkdir(const char *dir); > +Eina_Bool evas_gl_common_file_cache_file_exists(const char *file); > +Eina_Bool evas_gl_common_file_cache_mkpath_if_not_exists(const char > *path); > +Eina_Bool evas_gl_common_file_cache_mkpath(const char *path); > +int evas_gl_common_file_cache_dir_check(char *cache_dir, int > num); > +int evas_gl_common_file_cache_file_check(const char > *cache_dir, const char *cache_name, char *cache_file, int dir_num); > +int evas_gl_common_file_cache_save(Evas_GL_Shared *shared); > +
I'm wondering if these caches are never invalidated.... > void evas_gl_common_rect_draw(Evas_Engine_GL_Context *gc, int > x, int y, int w, int h); > > void evas_gl_texture_pool_empty(Evas_GL_Texture_Pool *pt); > > Modified: trunk/efl/src/modules/evas/engines/gl_common/evas_gl_core.c > =================================================================== > --- trunk/efl/src/modules/evas/engines/gl_common/evas_gl_core.c > 2013-01-07 06:06:16 UTC (rev 82320) > +++ trunk/efl/src/modules/evas/engines/gl_common/evas_gl_core.c > 2013-01-07 06:16:18 UTC (rev 82321) > @@ -16,7 +16,7 @@ > static void _surface_cap_print(EVGL_Engine *ee, int error); > > //---------------------------------------------------------------// > -// Internal Resources: > +// Internal Resources: > // - Surface and Context used for internal buffer creation > //---------------------------------------------------------------// > static int > @@ -262,7 +262,7 @@ > } > > //---------------------------------------------------------------// > -// Surface Related Functions > +// Surface Related Functions > // - Texture/ Renderbuffer Creation/ Attachment to FBO > // - Surface capability check > // - Internal config choose function > @@ -364,7 +364,7 @@ > > // Check whether the given FBO surface config is supported by the driver > static int > -_fbo_surface_cap_test(GLint color_ifmt, GLenum color_fmt, > +_fbo_surface_cap_test(GLint color_ifmt, GLenum color_fmt, > GLenum depth_fmt, GLenum stencil_fmt, int mult_samples) > { > GLuint fbo = 0; > @@ -456,10 +456,10 @@ > if ( (depth->bit == DEPTH_STENCIL) && (stencil->bit != STENCIL_BIT_8)) > return 0; > > - ret = _fbo_surface_cap_test((GLint)color->fmt, > + ret = _fbo_surface_cap_test((GLint)color->fmt, > color->fmt, > - depth->fmt, > - stencil->fmt, samples); > + depth->fmt, > + stencil->fmt, samples); > if (ret) > { > fmt->color_bit = color->bit; > @@ -478,7 +478,7 @@ > } > else > { > - fmt->depth_stencil_fmt = 0; > + fmt->depth_stencil_fmt = 0; > fmt->depth_bit = depth->bit; > fmt->depth_fmt = depth->fmt; > fmt->stencil_bit = stencil->bit; > @@ -503,16 +503,16 @@ > }; > > #ifdef GL_GLES > - GL_Format depth[] = { > + GL_Format depth[] = { > { DEPTH_NONE, 0 }, > - { DEPTH_STENCIL, GL_DEPTH_STENCIL_OES }, > + { DEPTH_STENCIL, GL_DEPTH_STENCIL_OES }, > { DEPTH_BIT_8, GL_DEPTH_COMPONENT }, > { DEPTH_BIT_16, GL_DEPTH_COMPONENT16 }, > { DEPTH_BIT_24, GL_DEPTH_COMPONENT24_OES }, > { DEPTH_BIT_32, GL_DEPTH_COMPONENT32_OES }, > { -1, -1 }, > - }; > - GL_Format stencil[] = { > + }; > + GL_Format stencil[] = { > { STENCIL_NONE, 0 }, > { STENCIL_BIT_1, GL_STENCIL_INDEX1_OES }, > { STENCIL_BIT_4, GL_STENCIL_INDEX4_OES }, > @@ -520,7 +520,7 @@ > { -1, -1 }, > }; > #else > - GL_Format depth[] = { > + GL_Format depth[] = { > { DEPTH_NONE, 0 }, > { DEPTH_STENCIL, GL_DEPTH24_STENCIL8 }, > { DEPTH_BIT_8, GL_DEPTH_COMPONENT }, > @@ -528,7 +528,7 @@ > { DEPTH_BIT_24, GL_DEPTH_COMPONENT24 }, > { DEPTH_BIT_32, GL_DEPTH_COMPONENT32 }, > { -1, -1 }, > - }; > + }; > GL_Format stencil[] = { > { STENCIL_NONE, 0 }, > { STENCIL_BIT_1, GL_STENCIL_INDEX1 }, > @@ -563,10 +563,10 @@ > // Color Formats > i = 0; > while ( color[i].bit >= 0 ) > - { > + { > j = 0; > // Depth Formats > - while ( depth[j].bit >= 0 ) > + while ( depth[j].bit >= 0 ) > { > k = 0; > // Stencil Formats > @@ -587,6 +587,156 @@ > } > > static int > +_surface_cap_load(EVGL_Engine *ee, Eet_File *ef) > +{ > + int res = 0, i = 0, length = 0; > + char tag[80]; > + void *data = 0; > + > + data = eet_read(ef, "num_fbo_fmts", &length); > + if ((!data) || (length <= 0)) goto finish; > + ee->caps.num_fbo_fmts = atoi(data); > + free(data); > + data = 0; > + > + // !!!FIXME > + // Should use eet functionality instead of just reading using sscanfs... > + for (i = 0; i < ee->caps.num_fbo_fmts; ++i) > + { > + EVGL_Surface_Format *fmt = &ee->caps.fbo_fmts[i]; > + > + snprintf(tag, sizeof(tag), "fbo_%d", i); > + data = eet_read(ef, tag, &length); > + if ((!data) || (length <= 0)) goto finish; > + sscanf(data, "%d%d%d%d%d%d%d%d%d%d", > + &(fmt->index), > + (int*)(&(fmt->color_bit)), &(fmt->color_ifmt), > &(fmt->color_fmt), > + (int*)(&(fmt->depth_bit)), &(fmt->depth_fmt), > + (int*)(&(fmt->stencil_bit)), &(fmt->stencil_fmt), > + &(fmt->depth_stencil_fmt), > + &(fmt->samples)); > + free(data); > + data = 0; > + } > + > + res = 1; > + goto finish; > + > +finish: > + if (data) free(data); > + return res; > +} > + > +static int > +_surface_cap_save(EVGL_Engine *ee, Eet_File *ef) > +{ > + int i = 0; > + char tag[80], data[80];; > + > + snprintf(data, sizeof(data), "%d", ee->caps.num_fbo_fmts); > + if (eet_write(ef, "num_fbo_fmts", data, sizeof(data), 1) < 0) > + return 0; > + > + // !!!FIXME > + // Should use eet functionality instead of just writing out using > snprintfs... > + for (i = 0; i < ee->caps.num_fbo_fmts; ++i) > + { > + EVGL_Surface_Format *fmt = &ee->caps.fbo_fmts[i]; > + > + snprintf(tag, sizeof(tag), "fbo_%d", i); > + snprintf(data, sizeof(data), "%d %d %d %d %d %d %d %d %d %d", > + fmt->index, > + fmt->color_bit, fmt->color_ifmt, fmt->color_fmt, > + fmt->depth_bit, fmt->depth_fmt, > + fmt->stencil_bit, fmt->stencil_fmt, > + fmt->depth_stencil_fmt, > + fmt->samples); > + if (eet_write(ef, tag, data, sizeof(data), 1) < 0) return 0; > + } > + > + return 1; > +} > + > +static int > +_surface_cap_cache_load(EVGL_Engine *ee) > +{ > + /* check eet */ > + Eet_File *et = NULL; > + char cap_dir_path[PATH_MAX]; > + char cap_file_path[PATH_MAX]; > + > + if (!evas_gl_common_file_cache_dir_check(cap_dir_path, > sizeof(cap_dir_path))) > + return 0; > + > + if (!evas_gl_common_file_cache_file_check(cap_dir_path, "surface_cap", > + cap_file_path, > sizeof(cap_dir_path))) > + return 0; > + > + /* use eet */ > + if (!eet_init()) return 0; > + et = eet_open(cap_file_path, EET_FILE_MODE_READ); > + if (!et) goto error; > + > + if (!_surface_cap_load(ee, et)) > + goto error; > + > + if (et) eet_close(et); > + eet_shutdown(); > + return 1; > + > +error: > + if (et) eet_close(et); > + eet_shutdown(); > + return 0; > +} > + > +static int > +_surface_cap_cache_save(EVGL_Engine *ee) > +{ > + /* check eet */ > + Eet_File *et = NULL; //check eet file > + int tmpfd; > + int res = 0; > + char cap_dir_path[PATH_MAX]; > + char cap_file_path[PATH_MAX]; > + char tmp_file[PATH_MAX]; > + > + if (!evas_gl_common_file_cache_dir_check(cap_dir_path, > sizeof(cap_dir_path))) > + { > + res = evas_gl_common_file_cache_mkpath(cap_dir_path); > + if (!res) return 0; /* we can't make directory */ > + } > + > + evas_gl_common_file_cache_file_check(cap_dir_path, "surface_cap", > cap_file_path, > + sizeof(cap_dir_path)); > + > + /* use mkstemp for writing */ > + snprintf(tmp_file, sizeof(tmp_file), "%s.XXXXXX", cap_file_path); > + tmpfd = mkstemp(tmp_file); > + if (tmpfd < 0) goto error; > + close(tmpfd); > + > + /* use eet */ > + if (!eet_init()) goto error; > + > + et = eet_open(tmp_file, EET_FILE_MODE_WRITE); > + if (!et) goto error; > + > + if (!_surface_cap_save(ee, et)) goto error; > + > + if (eet_close(et) != EET_ERROR_NONE) goto error; > + if (rename(tmp_file,cap_file_path) < 0) goto error; > + eet_shutdown(); > + return 1; > + > +error: > + if (et) eet_close(et); > + if (evas_gl_common_file_cache_file_exists(tmp_file)) unlink(tmp_file); > + eet_shutdown(); > + return 0; > +} > + > +static int > _surface_cap_init(EVGL_Engine *ee) > { > int max_size = 0; > @@ -623,16 +773,23 @@ > } > #endif > > - int num_fmts = 0; > + // Load Surface Cap > + if (!_surface_cap_cache_load(ee)) > + { > + // Check Surface Cap > + ee->caps.num_fbo_fmts = _surface_cap_check(ee); > + _surface_cap_cache_save(ee); > + DBG("Ran Evas GL Surface Cap and Cached the existing values."); > + } > + else > + { > + DBG("Loaded cached Evas GL Surface Cap values."); > + } > > - // Check Surface Cap > - num_fmts = _surface_cap_check(ee); > - > - if (num_fmts) > + if (ee->caps.num_fbo_fmts) > { > - ee->caps.num_fbo_fmts = num_fmts; > _surface_cap_print(ee, 0); > - DBG("Number of supported surface formats: %d", num_fmts); > + DBG("Number of supported surface formats: %d", > ee->caps.num_fbo_fmts); > return 1; > } > else > @@ -885,7 +1042,7 @@ > color_bit = (1 << cfg->color_format); > if (cfg->depth_bits) depth_bit = (1 << (cfg->depth_bits-1)); > if (cfg->stencil_bits) stencil_bit = (1 << (cfg->stencil_bits-1)); > - if (cfg->multisample_bits) > + if (cfg->multisample_bits) > msaa_samples = ee->caps.msaa_samples[cfg->multisample_bits-1]; > > // Run through all the available formats and choose the first match > @@ -1160,7 +1317,7 @@ > if (_evas_gl_log_dom >= 0) return 0; > eina_log_domain_unregister(_evas_gl_log_dom); > _evas_gl_log_dom = -1; > - > + > // Destroy internal resources > _internal_resources_destroy(ee); > > @@ -1240,7 +1397,7 @@ > ERR("Unable Create Specificed Surfaces. Unsupported format!"); > goto error; > }; > - > + > return sfc; > > error: > @@ -1413,7 +1570,7 @@ > ERR("Invalid Inputs. Engine: %p Surface: %p Context: %p!", ee, > sfc, ctx); > return 0; > } > - > + > // Get TLS Resources > if (!(rsc = _evgl_tls_resource_get(ee))) return 0; > > > Modified: trunk/efl/src/modules/evas/engines/gl_common/evas_gl_shader.c > =================================================================== > --- trunk/efl/src/modules/evas/engines/gl_common/evas_gl_shader.c > 2013-01-07 06:06:16 UTC (rev 82320) > +++ trunk/efl/src/modules/evas/engines/gl_common/evas_gl_shader.c > 2013-01-07 06:16:18 UTC (rev 82321) > @@ -321,118 +321,7 @@ > } > } > > -static mode_t default_mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP > | S_IROTH | S_IXOTH; > - > -static Eina_Bool > -_evas_gl_shader_file_is_dir(const char *file) > -{ > - struct stat st; > - > - if (stat(file, &st) < 0) return EINA_FALSE; > - if (S_ISDIR(st.st_mode)) return EINA_TRUE; > - return EINA_FALSE; > -} > - > -static Eina_Bool > -_evas_gl_shader_file_mkdir(const char *dir) > -{ > - /* evas gl shader only call this function when the dir is not exist */ > - if (mkdir(dir, default_mode) < 0) return EINA_FALSE; > - return EINA_TRUE; > -} > - > -static Eina_Bool > -_evas_gl_shader_file_exists(const char *file) > -{ > - struct stat st; > - if (!file) return EINA_FALSE; > - if (stat(file, &st) < 0) return EINA_FALSE; > - return EINA_TRUE; > -} > - > -static inline Eina_Bool > -_evas_gl_shader_file_mkpath_if_not_exists(const char *path) > -{ > - struct stat st; > - > - if (stat(path, &st) < 0) > - return _evas_gl_shader_file_mkdir(path); > - else if (!S_ISDIR(st.st_mode)) > - return EINA_FALSE; > - else > - return EINA_TRUE; > -} > - > -static Eina_Bool > -_evas_gl_shader_file_mkpath(const char *path) > -{ > - char ss[PATH_MAX]; > - unsigned int i; > - > - if (_evas_gl_shader_file_is_dir(path)) return EINA_TRUE; > - > - for (i = 0; path[i]; ss[i] = path[i], i++) > - { > - if (i == sizeof(ss) - 1) return EINA_FALSE; > - if ((path[i] == '/') && (i > 0)) > - { > - ss[i] = 0; > - if (!_evas_gl_shader_file_mkpath_if_not_exists(ss)) > - return EINA_FALSE; > - } > - } > - ss[i] = 0; > - return _evas_gl_shader_file_mkpath_if_not_exists(ss); > -} > - > static int > -_evas_gl_shader_dir_check(char *bin_shader_dir, int num) > -{ > - char *home = NULL; > - char *subdir = ".cache/evas_gl_common_shaders"; > - > - home = getenv("HOME"); > - if ((!home) || (!home[0])) return 0; > - > - snprintf(bin_shader_dir, num, "%s/%s", home, subdir); > - return _evas_gl_shader_file_exists(bin_shader_dir); > -} > - > -static int > -_evas_gl_shader_file_check(const char *bin_shader_dir, char > *bin_shader_file, int dir_num) > -{ > - char before_name[PATH_MAX]; > - char after_name[PATH_MAX]; > - int new_path_len = 0; > - int i = 0, j = 0; > - > - char *vendor = NULL; > - char *driver = NULL; > - char *version = NULL; > - > - vendor = (char *)glGetString(GL_VENDOR); > - driver = (char *)glGetString(GL_RENDERER); > - version = (char *)glGetString(GL_VERSION); > - > - new_path_len = snprintf(before_name, sizeof(before_name), > "%s::%s::%s::%s::binary_shader.eet", vendor, version, driver, MODULE_ARCH); > - > - /* remove '/' from file name */ > - for (i = 0; i < new_path_len; i++) > - { > - if (before_name[i] != '/') > - { > - after_name[j] = before_name[i]; > - j++; > - } > - } > - after_name[j] = 0; > - > - snprintf(bin_shader_file, dir_num, "%s/%s", bin_shader_dir, after_name); > - > - return _evas_gl_shader_file_exists(bin_shader_file); > -} > - > -static int > _evas_gl_common_shader_program_binary_init(Evas_GL_Program *p, > const char *pname, > Eet_File *ef) > @@ -459,8 +348,8 @@ > p->prog = glCreateProgram(); > > #if 1 > - // TODO: invalid rendering error occurs when attempting to use a > - // glProgramBinary. in order to render correctly we should create a dummy > + // TODO: invalid rendering error occurs when attempting to use a > + // glProgramBinary. in order to render correctly we should create a dummy > // vertex shader. > p->vert = glCreateShader(GL_VERTEX_SHADER); > glAttachShader(p->prog, p->vert); > @@ -544,7 +433,7 @@ > > p->vert = glCreateShader(GL_VERTEX_SHADER); > p->frag = glCreateShader(GL_FRAGMENT_SHADER); > - > + > glShaderSource(p->vert, 1, > (const char **)&(vert->src), NULL); > GLERR(__FUNCTION__, __FILE__, __LINE__, ""); > @@ -573,7 +462,7 @@ > ERR("Abort compile of shader frag (%s): %s", name, frag->src); > return 0; > } > - > + > p->prog = glCreateProgram(); > #ifdef GL_GLES > #else > @@ -667,10 +556,10 @@ > char bin_file_path[PATH_MAX]; > unsigned int i; > > - if (!_evas_gl_shader_dir_check(bin_dir_path, sizeof(bin_dir_path))) > + if (!evas_gl_common_file_cache_dir_check(bin_dir_path, > sizeof(bin_dir_path))) > return 0; > > - if (!_evas_gl_shader_file_check(bin_dir_path, bin_file_path, > + if (!evas_gl_common_file_cache_file_check(bin_dir_path, "binary_shader", > bin_file_path, > sizeof(bin_dir_path))) > return 0; > > @@ -707,13 +596,13 @@ > char tmp_file[PATH_MAX]; > unsigned int i; > > - if (!_evas_gl_shader_dir_check(bin_dir_path, sizeof(bin_dir_path))) > + if (!evas_gl_common_file_cache_dir_check(bin_dir_path, > sizeof(bin_dir_path))) > { > - res = _evas_gl_shader_file_mkpath(bin_dir_path); > + res = evas_gl_common_file_cache_mkpath(bin_dir_path); > if (!res) return 0; /* we can't make directory */ > } > > - _evas_gl_shader_file_check(bin_dir_path, bin_file_path, > + evas_gl_common_file_cache_file_check(bin_dir_path, "binary_shader", > bin_file_path, > sizeof(bin_dir_path)); > > /* use mkstemp for writing */ > @@ -741,7 +630,7 @@ > > error: > if (et) eet_close(et); > - if (_evas_gl_shader_file_exists(tmp_file)) unlink(tmp_file); > + if (evas_gl_common_file_cache_file_exists(tmp_file)) unlink(tmp_file); > eet_shutdown(); > return 0; > } > > > ------------------------------------------------------------------------------ > Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS, > MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current > with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft > MVPs and experts. SALE $99.99 this month only -- learn more at: > http://p.sf.net/sfu/learnmore_122412 > _______________________________________________ > enlightenment-svn mailing list > enlightenment-...@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn -- Leandro Dorileo ProFUSION embedded systems http://profusion.mobi ------------------------------------------------------------------------------ Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS, MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft MVPs and experts. SALE $99.99 this month only -- learn more at: http://p.sf.net/sfu/learnmore_122412 _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel