From f1e721e692cf6a9cbe6219adc91651114edb88b0 Mon Sep 17 00:00:00 2001 From: cedric Date: Thu, 23 Feb 2012 16:11:52 +0000 Subject: [PATCH] expedite: remove software_sdl backend and use buffer instead. This result in an overall drop of 17% in performance. I think it may be due to some stuff related to HWSURFACE, the fact it use double buffer or that maybe SDL_FillRect was faster for cleaning up memory. If someone is really interested by this performance drop, better fix them with buffer engine. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/expedite@68351 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/bin/engine_software_sdl.c | 114 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 99 insertions(+), 15 deletions(-) diff --git a/src/bin/engine_software_sdl.c b/src/bin/engine_software_sdl.c index bf7dd1f..4a75a48 100644 --- a/src/bin/engine_software_sdl.c +++ b/src/bin/engine_software_sdl.c @@ -3,33 +3,84 @@ #include #include +#include + +static void * +_expedite_sdl_switch_buffer(void *data, void *dest __UNUSED__) +{ + SDL_Flip(data); + return ((SDL_Surface*)data)->pixels; +} Eina_Bool engine_software_sdl_args(const char *engine, int width, int height) { - Evas_Engine_Info_SDL *einfo; - int i; - int ok = 0; + int ok = 0; if (!strcmp(engine, "sdl")) ok = 1; if (!strcmp(engine, "sdl-16")) ok = 2; if (!ok) return EINA_FALSE; if (ok == 1) - evas_output_method_set(evas, evas_render_method_lookup("software_sdl")); - else - evas_output_method_set(evas, evas_render_method_lookup("software_16_sdl")); + { + Evas_Engine_Info_Buffer *einfo; - einfo = (Evas_Engine_Info_SDL *) evas_engine_info_get(evas); + evas_output_method_set(evas, evas_render_method_lookup("buffer")); - /* the following is specific to the engine */ - einfo->info.fullscreen = fullscreen; - einfo->info.noframe = 0; + einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(evas); + if (einfo) + { + SDL_Init(SDL_INIT_NOPARACHUTE); - if (!evas_engine_info_set(evas, (Evas_Engine_Info *) einfo)) + if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) + { + printf("SDL_Init failed with %s", SDL_GetError()); + SDL_Quit(); + return EINA_FALSE; + } + + einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32; + einfo->info.switch_data = SDL_SetVideoMode(width, height, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); + if (!einfo->info.switch_data) + { + printf("SDL_SetVideoMode failed !"); + return EINA_FALSE; + } + + SDL_SetAlpha(einfo->info.switch_data, SDL_SRCALPHA, 0); + SDL_FillRect(einfo->info.switch_data, NULL, 0); + + einfo->info.dest_buffer = ((SDL_Surface*)einfo->info.switch_data)->pixels; + einfo->info.dest_buffer_row_bytes = width * sizeof (int); + einfo->info.use_color_key = 0; + einfo->info.alpha_threshold = 0; + einfo->info.func.new_update_region = NULL; + einfo->info.func.free_update_region = NULL; + einfo->info.func.switch_buffer = _expedite_sdl_switch_buffer; + if (!evas_engine_info_set(evas, (Evas_Engine_Info *) einfo)) + { + printf("evas_engine_info_set() for engine 'sdl' with 'buffer' backend failed."); + return EINA_FALSE; + } + } + } + else { - printf("Evas can not setup the informations of the Software SDL Engine\n"); - return EINA_FALSE; + Evas_Engine_Info_SDL *einfo; + + evas_output_method_set(evas, evas_render_method_lookup("software_16_sdl")); + + einfo = (Evas_Engine_Info_SDL *) evas_engine_info_get(evas); + + /* the following is specific to the engine */ + einfo->info.fullscreen = fullscreen; + einfo->info.noframe = 0; + + if (!evas_engine_info_set(evas, (Evas_Engine_Info *) einfo)) + { + printf("Evas can not setup the informations of the Software SDL Engine\n"); + return EINA_FALSE; + } } return EINA_TRUE; @@ -39,6 +90,7 @@ void engine_software_sdl_loop(void) { SDL_Event event; + int rmethod; while(SDL_PollEvent(&event)) { @@ -56,9 +108,41 @@ engine_software_sdl_loop(void) evas_event_feed_mouse_up(evas, event.button.button, EVAS_BUTTON_NONE, 0, NULL); break; case SDL_VIDEORESIZE: + rmethod = evas_output_method_get(evas); + if (rmethod == evas_render_method_lookup("buffer")) + { + Evas_Engine_Info_Buffer *einfo; + + einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(evas); + if (einfo) + { + einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32; + einfo->info.switch_data = SDL_SetVideoMode(event.resize.w, event.resize.h, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); + if (!einfo->info.switch_data) + { + return ; + } + + SDL_SetAlpha(einfo->info.switch_data, SDL_SRCALPHA, 0); + SDL_FillRect(einfo->info.switch_data, NULL, 0); + + einfo->info.dest_buffer = ((SDL_Surface*)einfo->info.switch_data)->pixels; + einfo->info.dest_buffer_row_bytes = event.resize.w * sizeof (int); + einfo->info.use_color_key = 0; + einfo->info.alpha_threshold = 0; + einfo->info.func.new_update_region = NULL; + einfo->info.func.free_update_region = NULL; + einfo->info.func.switch_buffer = _expedite_sdl_switch_buffer; + if (!evas_engine_info_set(evas, (Evas_Engine_Info *) einfo)) + { + return ; + } + } + } + evas_output_viewport_set(evas, 0, 0, - event.resize.w, event.resize.w); - evas_output_size_set(evas, event.resize.w, event.resize.w); + event.resize.h, event.resize.w); + evas_output_size_set(evas, event.resize.h, event.resize.w); evas_output_size_get(evas, &win_w, &win_h); break; case SDL_VIDEOEXPOSE: -- 2.7.4