From cb88e79ecbd16dea5f2201fd12320db5945db83e Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Fri, 26 Aug 2011 01:35:14 +0200 Subject: Add hw.gpu.enabled hardware property This patch adds a new hardware property to enable GPU emulation (named hw.gpu.enabled). It is currently disabled by default. It also modifies the UI code to display the GL output properly inside the UI window. And sets the kernel parameter qemu.gles to either 0 or 1 to indicate to the guest system's GLES libraries whether to use GPU emulation or fallback to the software renderer. A future patch will also add auto-detection of desktop GL capabilities. For example, if the emulator is started on a headless server without an X11/GL display, hw.gpu.enabled will be forced to 'no', forcing the guest to use the software renderer. Another patch will allow to change the property from the command-line for debugging purpose. NOTE: If you want to test GPU emulation, change the default value of the property in android/avd/hardware-properties.ini from 'no' to 'yes'. You will need to run a ToT master AOSP tree with the following pending patches applied: https://review.source.android.com/25797 https://review.source.android.com/25154 https://review.source.android.com/25759 Change-Id: I1fa3512be24395244fd5068f2bf59ad54db5c7d5 --- android/skin/scaler.c | 22 +++++++++++++++++++++ android/skin/scaler.h | 6 ++++++ android/skin/window.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) (limited to 'android/skin') diff --git a/android/skin/scaler.c b/android/skin/scaler.c index 907c5ca..5672869 100644 --- a/android/skin/scaler.c +++ b/android/skin/scaler.c @@ -81,6 +81,28 @@ typedef struct { void +skin_scaler_get_scaled_rect( SkinScaler* scaler, + SkinRect* srect, + SkinRect* drect ) +{ + int sx = srect->pos.x; + int sy = srect->pos.y; + int sw = srect->size.w; + int sh = srect->size.h; + double scale = scaler->scale; + + if (!scaler->valid) { + drect[0] = srect[0]; + return; + } + + drect->pos.x = (int)(sx * scale + scaler->xdisp); + drect->pos.y = (int)(sy * scale + scaler->ydisp); + drect->size.w = (int)(ceil((sx + sw) * scale + scaler->xdisp)) - drect->pos.x; + drect->size.h = (int)(ceil((sy + sh) * scale + scaler->ydisp)) - drect->pos.y; +} + +void skin_scaler_scale( SkinScaler* scaler, SDL_Surface* dst_surface, SDL_Surface* src_surface, diff --git a/android/skin/scaler.h b/android/skin/scaler.h index 4e0ec5a..e2d7641 100644 --- a/android/skin/scaler.h +++ b/android/skin/scaler.h @@ -26,6 +26,12 @@ extern int skin_scaler_set( SkinScaler* scaler, double xDisp, double yDisp ); +/* retrieve the position of the scaled source rectangle 'srect' into 'drect' + * you can use the same pointer for both parameters. */ +extern void skin_scaler_get_scaled_rect( SkinScaler* scaler, + SkinRect* srect, + SkinRect* drect ); + extern void skin_scaler_free( SkinScaler* scaler ); extern void skin_scaler_scale( SkinScaler* scaler, diff --git a/android/skin/window.c b/android/skin/window.c index 9a72db5..5d8c684 100644 --- a/android/skin/window.c +++ b/android/skin/window.c @@ -22,6 +22,7 @@ #include #include "android/framebuffer.h" +#include "android/opengles.h" /* when shrinking, we reduce the pixel ratio by this fixed amount */ #define SHRINK_SCALE 0.6 @@ -1140,6 +1141,44 @@ skin_window_show_trackball( SkinWindow* window, int enable ) } } +/* Hide the OpenGL ES framebuffer */ +static void +skin_window_hide_opengles( SkinWindow* window ) +{ + android_hideOpenglesWindow(); +} + +/* Show the OpenGL ES framebuffer window */ +static void +skin_window_show_opengles( SkinWindow* window ) +{ + { + SDL_SysWMinfo wminfo; + void* winhandle; + ADisplay* disp = window->layout.displays; + SkinRect drect = disp->rect; + + memset(&wminfo, 0, sizeof(wminfo)); + SDL_GetWMInfo(&wminfo); +#ifdef _WIN32 + winhandle = (void*)wminfo.window; +#elif defined(CONFIG_DARWIN) + winhandle = (void*)wminfo.nsWindowPtr; +#else + winhandle = (void*)wminfo.info.x11.window; +#endif + skin_scaler_get_scaled_rect(window->scaler, &drect, &drect); + + android_showOpenglesWindow(winhandle, drect.pos.x, drect.pos.y, + drect.size.w, drect.size.h, disp->rotation * -90.); + } +} + +static void +skin_window_redraw_opengles( SkinWindow* window ) +{ + android_redrawOpenglesWindow(); +} static int skin_window_reset_internal (SkinWindow*, SkinLayout*); @@ -1224,6 +1263,8 @@ skin_window_create( SkinLayout* slayout, int x, int y, double scale, int no dprint( "emulator window was out of view and was recentered\n" ); } + skin_window_show_opengles(window); + return window; } @@ -1261,6 +1302,9 @@ skin_window_set_title( SkinWindow* window, const char* title ) static void skin_window_resize( SkinWindow* window ) { + if ( !window->no_display ) + skin_window_hide_opengles(window); + /* now resize window */ if (window->surface) { SDL_FreeSurface(window->surface); @@ -1342,7 +1386,10 @@ skin_window_resize( SkinWindow* window ) } if (scale == 1.0) + { window->surface = surface; + skin_scaler_set( window->scaler, 1.0, 0, 0 ); + } else { window_w = (int) ceil(window_w / scale ); @@ -1361,6 +1408,8 @@ skin_window_resize( SkinWindow* window ) } skin_scaler_set( window->scaler, scale, window->effective_x, window->effective_y ); } + + skin_window_show_opengles(window); } } @@ -1552,6 +1601,7 @@ skin_window_redraw( SkinWindow* window, SkinRect* rect ) SDL_UpdateRects( window->surface, 1, &rd ); } + skin_window_redraw_opengles( window ); } } @@ -1681,6 +1731,10 @@ skin_window_process_event( SkinWindow* window, SDL_Event* ev ) } } break; + + case SDL_VIDEOEXPOSE: + skin_window_redraw_opengles(window); + break; } } -- cgit v1.1