aboutsummaryrefslogtreecommitdiffstats
path: root/android
diff options
context:
space:
mode:
authorVladimir Chtchetkine <vchtchetkine@google.com>2012-05-15 09:01:52 -0700
committerVladimir Chtchetkine <vchtchetkine@google.com>2012-05-15 09:01:52 -0700
commit1129b0b97f1c204bd86ee6d19cbf3b4c2275762b (patch)
treef3d256baee1cbcde7275f6973bfe9d27b4d034eb /android
parent6df71197252e119baccbe4dd060935222af4f8ba (diff)
downloadexternal_qemu-1129b0b97f1c204bd86ee6d19cbf3b4c2275762b.zip
external_qemu-1129b0b97f1c204bd86ee6d19cbf3b4c2275762b.tar.gz
external_qemu-1129b0b97f1c204bd86ee6d19cbf3b4c2275762b.tar.bz2
Improve FB update protocol.
As it turned out, emulator has been sending Fb updates faster than MT handler on the device could process them. This lead to significant screen lag between the emulator and the device. With this CL emulator will not send FB updates to the device until the device has fully proccesed the previous FB update. Change-Id: I9a39e9f358f87d5bd6baaa2617a79e7de59ae99e
Diffstat (limited to 'android')
-rw-r--r--android/multitouch-port.c25
-rw-r--r--android/multitouch-screen.c31
-rw-r--r--android/multitouch-screen.h3
3 files changed, 48 insertions, 11 deletions
diff --git a/android/multitouch-port.c b/android/multitouch-port.c
index faefdbf..88a76fe 100644
--- a/android/multitouch-port.c
+++ b/android/multitouch-port.c
@@ -48,17 +48,21 @@
*/
/* Pointer move message. */
-#define SDKCTL_MT_MOVE 1
+#define SDKCTL_MT_MOVE 1
/* First pointer down message. */
-#define SDKCTL_MT_FISRT_DOWN 2
+#define SDKCTL_MT_FISRT_DOWN 2
/* Last pointer up message. */
-#define SDKCTL_MT_LAST_UP 3
+#define SDKCTL_MT_LAST_UP 3
/* Pointer down message. */
-#define SDKCTL_MT_POINTER_DOWN 4
+#define SDKCTL_MT_POINTER_DOWN 4
/* Pointer up message. */
-#define SDKCTL_MT_POINTER_UP 5
+#define SDKCTL_MT_POINTER_UP 5
/* Sends framebuffer update. */
-#define SDKCTL_MT_FB_UPDATE 6
+#define SDKCTL_MT_FB_UPDATE 6
+/* Framebuffer update has been received. */
+#define SDKCTL_MT_FB_UPDATE_RECEIVED 7
+/* Framebuffer update has been handled. */
+#define SDKCTL_MT_FB_UPDATE_HANDLED 8
/* Multi-touch port descriptor. */
struct AndroidMTSPort {
@@ -332,6 +336,15 @@ _on_multitouch_message(void* client_opaque,
_on_pup((const AndroidMTPtr*)msg_data);
break;
+ case SDKCTL_MT_FB_UPDATE_RECEIVED:
+ D("Framebuffer update ACK.");
+ break;
+
+ case SDKCTL_MT_FB_UPDATE_HANDLED:
+ D("Framebuffer update handled.");
+ multitouch_fb_updated();
+ break;
+
default:
W("Multi-touch: Unknown message %d", msg_type);
break;
diff --git a/android/multitouch-screen.c b/android/multitouch-screen.c
index 155218a..36f937d 100644
--- a/android/multitouch-screen.c
+++ b/android/multitouch-screen.c
@@ -252,16 +252,15 @@ _on_fb_sent(void* opaque, SDKCtlDirectPacket* packet, AsyncIOState status)
if (status == ASIO_STATE_SUCCEEDED) {
/* Lets see if we have accumulated more changes while transmission has been
* in progress. */
- if (mts_state->fb_header.w && mts_state->fb_header.h) {
+ if (mts_state->fb_header.w && mts_state->fb_header.h &&
+ !mts_state->fb_transfer_in_progress) {
+ mts_state->fb_transfer_in_progress = 1;
/* Send accumulated updates. */
if (mts_port_send_frame(mts_state->mtsp, &mts_state->fb_header,
mts_state->current_fb, _on_fb_sent, mts_state,
mts_state->ydir)) {
mts_state->fb_transfer_in_progress = 0;
}
- } else {
- /* Framebuffer transfer is completed, and no more updates are pending. */
- mts_state->fb_transfer_in_progress = 0;
}
}
@@ -376,7 +375,8 @@ multitouch_opengles_fb_update(void* context,
_mt_fb_common_update(mts_state, 0, 0, w, h);
}
-void multitouch_refresh_screen(void)
+void
+multitouch_refresh_screen(void)
{
MTSState* const mts_state = &_MTSState;
@@ -393,6 +393,27 @@ void multitouch_refresh_screen(void)
}
void
+multitouch_fb_updated(void)
+{
+ MTSState* const mts_state = &_MTSState;
+
+ /* This concludes framebuffer update. */
+ mts_state->fb_transfer_in_progress = 0;
+
+ /* Lets see if we have accumulated more changes while transmission has been
+ * in progress. */
+ if (mts_state->fb_header.w && mts_state->fb_header.h) {
+ mts_state->fb_transfer_in_progress = 1;
+ /* Send accumulated updates. */
+ if (mts_port_send_frame(mts_state->mtsp, &mts_state->fb_header,
+ mts_state->current_fb, _on_fb_sent, mts_state,
+ mts_state->ydir)) {
+ mts_state->fb_transfer_in_progress = 0;
+ }
+ }
+}
+
+void
multitouch_init(AndroidMTSPort* mtsp)
{
if (!_is_mt_initialized) {
diff --git a/android/multitouch-screen.h b/android/multitouch-screen.h
index 901d76e..baca224 100644
--- a/android/multitouch-screen.h
+++ b/android/multitouch-screen.h
@@ -100,4 +100,7 @@ extern void multitouch_opengles_fb_update(void* context,
*/
extern void multitouch_refresh_screen(void);
+/* Framebuffer update has been handled by the device. */
+extern void multitouch_fb_updated(void);
+
#endif /* ANDROID_MULTITOUCH_SCREEN_H_ */