aboutsummaryrefslogtreecommitdiffstats
path: root/android/skin
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@android.com>2011-08-26 01:35:14 +0200
committerDavid 'Digit' Turner <digit@android.com>2011-08-29 17:02:17 +0200
commitcb88e79ecbd16dea5f2201fd12320db5945db83e (patch)
treea4f22e25a58723ae81cb9adc6a9a09e3f6a32a43 /android/skin
parent6a8b698fff4d328c2706776c1c09171cfadb8de4 (diff)
downloadexternal_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.c22
-rw-r--r--android/skin/scaler.h6
-rw-r--r--android/skin/window.c54
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;
}
}