diff options
author | David 'Digit' Turner <digit@android.com> | 2011-08-26 01:35:14 +0200 |
---|---|---|
committer | David 'Digit' Turner <digit@android.com> | 2011-08-29 17:02:17 +0200 |
commit | cb88e79ecbd16dea5f2201fd12320db5945db83e (patch) | |
tree | a4f22e25a58723ae81cb9adc6a9a09e3f6a32a43 /android/skin | |
parent | 6a8b698fff4d328c2706776c1c09171cfadb8de4 (diff) | |
download | external_qemu-cb88e79ecbd16dea5f2201fd12320db5945db83e.zip external_qemu-cb88e79ecbd16dea5f2201fd12320db5945db83e.tar.gz external_qemu-cb88e79ecbd16dea5f2201fd12320db5945db83e.tar.bz2 |
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
Diffstat (limited to 'android/skin')
-rw-r--r-- | android/skin/scaler.c | 22 | ||||
-rw-r--r-- | android/skin/scaler.h | 6 | ||||
-rw-r--r-- | android/skin/window.c | 54 |
3 files changed, 82 insertions, 0 deletions
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 <math.h> #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; } } |