diff options
author | Vladimir Chtchetkine <vchtchetkine@google.com> | 2011-01-31 10:49:06 -0800 |
---|---|---|
committer | Vladimir Chtchetkine <vchtchetkine@google.com> | 2011-01-31 10:49:06 -0800 |
commit | 94a2fba98924c6684650d66409934358cb0c9d09 (patch) | |
tree | 61438a0563eb274091cf81fe6136a35973495e8f /android | |
parent | f988ac730fecefbd7590d3a8068c9e80fc53e026 (diff) | |
download | external_qemu-94a2fba98924c6684650d66409934358cb0c9d09.zip external_qemu-94a2fba98924c6684650d66409934358cb0c9d09.tar.gz external_qemu-94a2fba98924c6684650d66409934358cb0c9d09.tar.bz2 |
Refactor the framebuffer service
Change-Id: I8ac4580af65b8d58976c97b77b309dd202e75003
Diffstat (limited to 'android')
-rw-r--r-- | android/console.c | 12 | ||||
-rw-r--r-- | android/display-core.c | 10 | ||||
-rw-r--r-- | android/display-core.h | 6 | ||||
-rw-r--r-- | android/main-ui.c | 10 | ||||
-rw-r--r-- | android/protocol/fb-updates-impl.c (renamed from android/framebuffer-ui.c) | 183 | ||||
-rw-r--r-- | android/protocol/fb-updates-impl.h (renamed from android/framebuffer-ui.h) | 26 | ||||
-rw-r--r-- | android/protocol/fb-updates-proxy.c (renamed from android/framebuffer-core.c) | 136 | ||||
-rw-r--r-- | android/protocol/fb-updates-proxy.h (renamed from android/framebuffer-core.h) | 24 | ||||
-rw-r--r-- | android/protocol/fb-updates.h (renamed from android/framebuffer-common.h) | 20 |
9 files changed, 200 insertions, 227 deletions
diff --git a/android/console.c b/android/console.c index 59610eb..e797d9e 100644 --- a/android/console.c +++ b/android/console.c @@ -51,7 +51,7 @@ #include "android/keycode-array.h" #include "android/charmap.h" #include "android/display-core.h" -#include "android/framebuffer-core.h" +#include "android/protocol/fb-updates-proxy.h" #include "android/protocol/user-events-impl.h" #include "android/protocol/ui-commands-api.h" #include "android/protocol/core-commands-impl.h" @@ -247,9 +247,9 @@ control_client_destroy( ControlClient client ) } if (client == framebuffer_client) { - CoreFramebuffer* core_fb = coredisplay_detach_fb_service(); + ProxyFramebuffer* core_fb = coredisplay_detach_fb_service(); if (core_fb != NULL) { - corefb_destroy(core_fb); + proxyFb_destroy(core_fb); AFREE(core_fb); } framebuffer_client = NULL; @@ -2523,7 +2523,7 @@ extern CoreDisplay core_display; static int do_create_framebuffer_service( ControlClient client, char* args ) { - CoreFramebuffer* core_fb; + ProxyFramebuffer* core_fb; const char* protocol = "-raw"; // Default framebuffer exchange protocol. // Protocol type is defined by the arguments passed with the stream switch @@ -2554,13 +2554,13 @@ do_create_framebuffer_service( ControlClient client, char* args ) return -1; } - core_fb = corefb_create(client->sock, protocol, coredisplay_get_framebuffer()); + core_fb = proxyFb_create(client->sock, protocol, coredisplay_get_framebuffer()); if (!coredisplay_attach_fb_service(core_fb)) { char reply_buf[4096]; framebuffer_client = client; // Reply "OK" with the framebuffer's bits per pixel snprintf(reply_buf, sizeof(reply_buf), "OK: -bitsperpixel=%d\r\n", - corefb_get_bits_per_pixel(core_fb)); + proxyFb_get_bits_per_pixel(core_fb)); control_write( client, reply_buf); } else { control_write( client, "KO\r\n" ); diff --git a/android/display-core.c b/android/display-core.c index 27b0706..6834cd6 100644 --- a/android/display-core.c +++ b/android/display-core.c @@ -27,7 +27,7 @@ struct CoreDisplay { QFrameBuffer* fb; /* Framebuffer service associated with this core display. */ - CoreFramebuffer* core_fb; + ProxyFramebuffer* core_fb; }; /* One and only one core display instance. */ @@ -43,7 +43,7 @@ coredisplay_fb_update(void* opaque, int x, int y, int w, int h) { CoreDisplay* cd = (CoreDisplay*)opaque; if (cd->core_fb) { - corefb_update(cd->core_fb, cd->fb, x, y, w, h); + proxyFb_update(cd->core_fb, cd->fb, x, y, w, h); } } @@ -109,7 +109,7 @@ coredisplay_init(DisplayState* ds) } int -coredisplay_attach_fb_service(CoreFramebuffer* core_fb) +coredisplay_attach_fb_service(ProxyFramebuffer* core_fb) { if (core_display.core_fb == NULL) { core_display.core_fb = core_fb; @@ -119,10 +119,10 @@ coredisplay_attach_fb_service(CoreFramebuffer* core_fb) } } -CoreFramebuffer* +ProxyFramebuffer* coredisplay_detach_fb_service(void) { - CoreFramebuffer* ret = core_display.core_fb; + ProxyFramebuffer* ret = core_display.core_fb; core_display.core_fb = NULL; return ret; } diff --git a/android/display-core.h b/android/display-core.h index 4e1d07f..6204e56 100644 --- a/android/display-core.h +++ b/android/display-core.h @@ -20,7 +20,7 @@ #include "framebuffer.h" #include "android/display.h" -#include "android/framebuffer-core.h" +#include "android/protocol/fb-updates-proxy.h" /* Descriptor for a core display instance */ typedef struct CoreDisplay CoreDisplay; @@ -39,7 +39,7 @@ extern void coredisplay_init(DisplayState* ds); * Return: * 0 on success, or -1 on failure. */ -extern int coredisplay_attach_fb_service(CoreFramebuffer* core_fb); +extern int coredisplay_attach_fb_service(ProxyFramebuffer* core_fb); /* * Detaches framebuffer service previously attached to the core display. @@ -47,7 +47,7 @@ extern int coredisplay_attach_fb_service(CoreFramebuffer* core_fb); * Framebuffer service descriptor attached to the core display, or NULL if * the core display didn't have framebuffer service attached to it. */ -extern CoreFramebuffer* coredisplay_detach_fb_service(void); +extern ProxyFramebuffer* coredisplay_detach_fb_service(void); /* * Get framebuffer descriptor for core display. diff --git a/android/main-ui.c b/android/main-ui.c index 4b86ad1..968eeeb 100644 --- a/android/main-ui.c +++ b/android/main-ui.c @@ -60,7 +60,7 @@ #include "android/snapshot.h" #include "android/core-connection.h" -#include "android/framebuffer-ui.h" +#include "android/protocol/fb-updates-impl.h" #include "android/protocol/user-events-proxy.h" #include "android/protocol/core-commands-proxy.h" #include "android/protocol/ui-commands-impl.h" @@ -106,9 +106,6 @@ unsigned long android_verbose; /* Instance of the "attach-UI" Emulator's core console client. */ CoreConnection* attach_client = NULL; -/* Instance of the "framebuffer" console client. */ -ClientFramebuffer* fb_client = NULL; - /* -ui-settings parameters received from the core on UI attachment. */ char* core_ui_settings = ""; @@ -960,9 +957,8 @@ attach_to_core(AndroidOptions* opts) { qemulator_set_title(emulator); // Connect to the core's framebuffer service - fb_client = clientfb_create(&console_socket, "-raw", - qemulator_get_first_framebuffer(emulator)); - if (fb_client == NULL) { + if (implFb_create(&console_socket, "-raw", + qemulator_get_first_framebuffer(emulator))) { return -1; } diff --git a/android/framebuffer-ui.c b/android/protocol/fb-updates-impl.c index 0ae109f..ebe7309 100644 --- a/android/framebuffer-ui.c +++ b/android/protocol/fb-updates-impl.c @@ -15,31 +15,26 @@ * from the core. */ -#include "android/framebuffer-common.h" -#include "android/framebuffer-ui.h" +#include "sysemu.h" #include "android/utils/system.h" #include "android/utils/debug.h" +#include "android/utils/panic.h" #include "android/sync-utils.h" +#include "android/protocol/fb-updates.h" +#include "android/protocol/fb-updates-impl.h" -#define PANIC(...) do { fprintf(stderr, __VA_ARGS__); \ - exit(1); \ - } while (0) - -/* - * Enumerates states for the client framebuffer update reader. - */ -typedef enum ClientFBState { +/*Enumerates states for the client framebuffer update reader. */ +typedef enum ImplFBState { /* The reader is waiting on update header. */ - WAIT_HEADER, + EXPECTS_HEADER, /* The reader is waiting on pixels. */ - WAIT_PIXELS, -} ClientFBState; + EXPECTS_PIXELS, +} ImplFBState; -/* - * Descriptor for the framebuffer client. +/* Descriptor for the UI-side implementation of the "framebufer" service. */ -struct ClientFramebuffer { +typedef struct ImplFramebuffer { /* Framebuffer for this client. */ QFrameBuffer* fb; @@ -59,17 +54,17 @@ struct ClientFramebuffer { size_t reader_bytes; /* Current state of the update reader. */ - ClientFBState fb_state; + ImplFBState fb_state; /* Socket descriptor for the framebuffer client. */ int sock; /* Number of bits used to encode single pixel. */ int bits_per_pixel; -}; +} ImplFramebuffer; -/* The only instance of framebuffer client. */ -static ClientFramebuffer _client_fb; +/* One and the only ImplFramebuffer instance. */ +static ImplFramebuffer _implFb; /* * Updates a display rectangle. @@ -81,14 +76,15 @@ static ClientFramebuffer _client_fb; * must be eventually freed with free() */ static void -update_rect(QFrameBuffer* fb, uint16_t x, uint16_t y, uint16_t w, uint16_t h, - uint8_t bits_per_pixel, uint8_t* pixels) +_update_rect(QFrameBuffer* fb, uint16_t x, uint16_t y, uint16_t w, uint16_t h, + uint8_t bits_per_pixel, uint8_t* pixels) { if (fb != NULL) { uint16_t n; const uint8_t* src = pixels; const uint16_t src_line_size = w * ((bits_per_pixel + 7) / 8); - uint8_t* dst = (uint8_t*)fb->pixels + y * fb->pitch + x * fb->bytes_per_pixel; + uint8_t* dst = (uint8_t*)fb->pixels + y * fb->pitch + x * + fb->bytes_per_pixel; for (n = 0; n < h; n++) { memcpy(dst, src, src_line_size); src += src_line_size; @@ -103,12 +99,12 @@ update_rect(QFrameBuffer* fb, uint16_t x, uint16_t y, uint16_t w, uint16_t h, * Asynchronous I/O callback launched when framebuffer notifications are ready * to be read. * Param: - * opaque - ClientFramebuffer instance. + * opaque - ImplFramebuffer instance. */ static void -_clientfb_read_cb(void* opaque) +_implFb_read_cb(void* opaque) { - ClientFramebuffer* fb_client = opaque; + ImplFramebuffer* fb_client = opaque; int ret; // Read updates while they are immediately available. @@ -118,7 +114,7 @@ _clientfb_read_cb(void* opaque) fb_client->reader_bytes - fb_client->reader_offset); if (ret == 0) { /* disconnection ! */ - clientfb_destroy(fb_client); + implFb_destroy(); return; } if (ret < 0) { @@ -138,28 +134,28 @@ _clientfb_read_cb(void* opaque) } // All expected data has been read. Time to change the state. - if (fb_client->fb_state == WAIT_HEADER) { + if (fb_client->fb_state == EXPECTS_HEADER) { // Update header has been read. Prepare for the pixels. - fb_client->fb_state = WAIT_PIXELS; + fb_client->fb_state = EXPECTS_PIXELS; fb_client->reader_offset = 0; fb_client->reader_bytes = fb_client->update_header.w * fb_client->update_header.h * (fb_client->bits_per_pixel / 8); fb_client->reader_buffer = malloc(fb_client->reader_bytes); if (fb_client->reader_buffer == NULL) { - PANIC("Unable to allocate memory for framebuffer update\n"); + APANIC("Unable to allocate memory for framebuffer update\n"); } } else { // Pixels have been read. Prepare for the header. uint8_t* pixels = fb_client->reader_buffer; - fb_client->fb_state = WAIT_HEADER; + fb_client->fb_state = EXPECTS_HEADER; fb_client->reader_offset = 0; fb_client->reader_bytes = sizeof(FBUpdateMessage); fb_client->reader_buffer = (uint8_t*)&fb_client->update_header; // Perform the update. Note that pixels buffer must be freed there. - update_rect(fb_client->fb, fb_client->update_header.x, + _update_rect(fb_client->fb, fb_client->update_header.x, fb_client->update_header.y, fb_client->update_header.w, fb_client->update_header.h, fb_client->bits_per_pixel, pixels); @@ -167,47 +163,33 @@ _clientfb_read_cb(void* opaque) } } -ClientFramebuffer* -clientfb_create(SockAddress* console_socket, - const char* protocol, - QFrameBuffer* fb) +int +implFb_create(SockAddress* console_socket, const char* protocol, QFrameBuffer* fb) { - char* connect_message = NULL; + char* handshake = NULL; char switch_cmd[256]; + // Initialize descriptor. + _implFb.fb = fb; + _implFb.reader_buffer = (uint8_t*)&_implFb.update_header; + _implFb.reader_offset = 0; + _implFb.reader_bytes = sizeof(FBUpdateMessage); + // Connect to the framebuffer service. - _client_fb.core_connection = core_connection_create(console_socket); - if (_client_fb.core_connection == NULL) { - derror("Framebuffer client is unable to connect to the console: %s\n", - errno_str); - return NULL; - } - if (core_connection_open(_client_fb.core_connection)) { - core_connection_free(_client_fb.core_connection); - _client_fb.core_connection = NULL; - derror("Framebuffer client is unable to open the console: %s\n", - errno_str); - return NULL; - } snprintf(switch_cmd, sizeof(switch_cmd), "framebuffer %s", protocol); - if (core_connection_switch_stream(_client_fb.core_connection, switch_cmd, - &connect_message)) { - derror("Unable to attach to the framebuffer %s: %s\n", - switch_cmd, connect_message ? connect_message : ""); - if (connect_message != NULL) { - free(connect_message); - } - core_connection_close(_client_fb.core_connection); - core_connection_free(_client_fb.core_connection); - _client_fb.core_connection = NULL; - return NULL; + _implFb.core_connection = + core_connection_create_and_switch(console_socket, switch_cmd, &handshake); + if (_implFb.core_connection == NULL) { + derror("Unable to connect to the framebuffer service: %s\n", + errno_str); + return -1; } // We expect core framebuffer to return us bits per pixel property in // the handshake message. - _client_fb.bits_per_pixel = 0; - if (connect_message != NULL) { - char* bpp = strstr(connect_message, "bitsperpixel="); + _implFb.bits_per_pixel = 0; + if (handshake != NULL) { + char* bpp = strstr(handshake, "bitsperpixel="); if (bpp != NULL) { char* end; bpp += strlen("bitsperpixel="); @@ -215,67 +197,68 @@ clientfb_create(SockAddress* console_socket, if (end == NULL) { end = bpp + strlen(bpp); } - _client_fb.bits_per_pixel = strtol(bpp, &end, 0); + _implFb.bits_per_pixel = strtol(bpp, &end, 0); } } - - if (!_client_fb.bits_per_pixel) { + if (!_implFb.bits_per_pixel) { derror("Unexpected core framebuffer reply: %s\n" - "Bits per pixel property is not there, or is invalid\n", connect_message); - core_connection_close(_client_fb.core_connection); - core_connection_free(_client_fb.core_connection); - _client_fb.core_connection = NULL; - return NULL; + "Bits per pixel property is not there, or is invalid\n", + handshake); + implFb_destroy(); + return -1; } - // Now that we're connected lets initialize the descriptor. - _client_fb.fb = fb; - _client_fb.sock = core_connection_get_socket(_client_fb.core_connection); - _client_fb.fb_state = WAIT_HEADER; - _client_fb.reader_buffer = (uint8_t*)&_client_fb.update_header; - _client_fb.reader_offset = 0; - _client_fb.reader_bytes = sizeof(FBUpdateMessage); - - if (connect_message != NULL) { - free(connect_message); - } + _implFb.sock = core_connection_get_socket(_implFb.core_connection); // At last setup read callback, and start receiving the updates. - if (qemu_set_fd_handler(_client_fb.sock, _clientfb_read_cb, NULL, &_client_fb)) { - derror("Unable to set up framebuffer read callback\n"); - core_connection_close(_client_fb.core_connection); - core_connection_free(_client_fb.core_connection); - _client_fb.core_connection = NULL; - return NULL; + if (qemu_set_fd_handler(_implFb.sock, _implFb_read_cb, NULL, &_implFb)) { + derror("Unable to set up framebuffer read callback.\n"); + implFb_destroy(); + return -1; } { // Force the core to send us entire framebuffer now, when we're prepared // to receive it. FBRequestHeader hd; - SyncSocket* sk = syncsocket_init(_client_fb.sock); + SyncSocket* sk = syncsocket_init(_implFb.sock); hd.request_type = AFB_REQUEST_REFRESH; syncsocket_start_write(sk); - syncsocket_write(sk, &hd, sizeof(hd), 500); + syncsocket_write(sk, &hd, sizeof(hd), 5000); syncsocket_stop_write(sk); syncsocket_free(sk); } - fprintf(stdout, "Framebuffer %s is now attached to the core %s\n", - protocol, sock_address_to_string(console_socket)); - return &_client_fb; + fprintf(stdout, "framebuffer is now connected to the core at %s.", + sock_address_to_string(console_socket)); + if (handshake != NULL) { + if (handshake[0] != '\0') { + fprintf(stdout, " Handshake: %s", handshake); + } + free(handshake); + } + fprintf(stdout, "\n"); + + return 0; } void -clientfb_destroy(ClientFramebuffer* client_fb) +implFb_destroy(void) { - if (client_fb != NULL && client_fb->core_connection != NULL) { + if (_implFb.core_connection != NULL) { // Disable the reader callback. - qemu_set_fd_handler(client_fb->sock, NULL, NULL, NULL); + qemu_set_fd_handler(_implFb.sock, NULL, NULL, NULL); // Close framebuffer connection. - core_connection_close(client_fb->core_connection); - core_connection_free(client_fb->core_connection); - client_fb->core_connection = NULL; + core_connection_close(_implFb.core_connection); + core_connection_free(_implFb.core_connection); + _implFb.core_connection = NULL; + } + + _implFb.fb = NULL; + if (_implFb.reader_buffer != NULL && + _implFb.reader_buffer != (uint8_t*)&_implFb.update_header) { + free(_implFb.reader_buffer); + _implFb.reader_buffer = (uint8_t*)&_implFb.update_header; } } diff --git a/android/framebuffer-ui.h b/android/protocol/fb-updates-impl.h index 158f137..0c351aa 100644 --- a/android/framebuffer-ui.h +++ b/android/protocol/fb-updates-impl.h @@ -11,8 +11,8 @@ */ /* - * Contains UI-side framebuffer client that receives framebuffer updates - * from the core. + * Contains UI-side "framebuffer" client that receives framebuffer updates + * from the Core. */ #ifndef _ANDROID_FRAMEBUFFER_UI_H @@ -24,11 +24,7 @@ #include "android/async-utils.h" #include "android/core-connection.h" -/* Descriptor for the framebuffer client. */ -typedef struct ClientFramebuffer ClientFramebuffer; - -/* - * Creates framebuffer client, and connects it with the core. +/* Creates framebuffer client, and connects it with the core. * Param: * console_socket Address of the core's console socket. * protocol Protocol to use for the updates: @@ -36,17 +32,13 @@ typedef struct ClientFramebuffer ClientFramebuffer; * -shared Use shared memory for pixels. * fb - Framebuffer associated with this FB client. * Return: - * Descriptor for the framebuffer client on success, or NULL on failure. + * 0 on success, or < 0 on failure. */ -ClientFramebuffer* clientfb_create(SockAddress* console_socket, - const char* protocol, - QFrameBuffer* fb); +int implFb_create(SockAddress* console_socket, + const char* protocol, + QFrameBuffer* fb); -/* - * Disconnects and destroys framebuffer client. - * Param: - * client_fb Framebuffer client descriptor created with clientfb_create. - */ -void clientfb_destroy(ClientFramebuffer* client_fb); +/* Disconnects and destroys framebuffer client. */ +void implFb_destroy(void); #endif /* _ANDROID_FRAMEBUFFER_UI_H */ diff --git a/android/framebuffer-core.c b/android/protocol/fb-updates-proxy.c index 89b7b46..fee1195 100644 --- a/android/framebuffer-core.c +++ b/android/protocol/fb-updates-proxy.c @@ -20,13 +20,14 @@ #include "android/looper.h" #include "android/display-core.h" #include "android/async-utils.h" -#include "android/framebuffer-common.h" -#include "android/framebuffer-core.h" +#include "android/protocol/fb-updates.h" +#include "android/protocol/fb-updates-proxy.h" #include "android/utils/system.h" #include "android/utils/debug.h" -/* Core framebuffer descriptor. */ -struct CoreFramebuffer { +/* Descriptor for the Core-side implementation of the "framebufer" service. + */ +struct ProxyFramebuffer { /* Writer used to send FB update notification messages. */ AsyncWriter fb_update_writer; @@ -55,13 +56,13 @@ struct CoreFramebuffer { FBRequestHeader fb_req_header; }; -/* Framebuffer update notification descriptor to the core. */ +/* Framebuffer update notification descriptor. */ typedef struct FBUpdateNotify { /* Links all pending FB update notifications. */ struct FBUpdateNotify* next_fb_update; /* Core framebuffer instance that owns the message. */ - CoreFramebuffer* core_fb; + ProxyFramebuffer* proxy_fb; /* Size of the message to transfer. */ size_t message_size; @@ -112,14 +113,14 @@ _copy_fb_rect(uint8_t* rect, const QFrameBuffer* fb, int x, int y, int w, int h) * Initialized framebuffer update notification descriptor. */ static FBUpdateNotify* -fbupdatenotify_create(CoreFramebuffer* core_fb, const QFrameBuffer* fb, +fbupdatenotify_create(ProxyFramebuffer* proxy_fb, const QFrameBuffer* fb, int x, int y, int w, int h) { const size_t rect_size = w * h * fb->bytes_per_pixel; FBUpdateNotify* ret = malloc(sizeof(FBUpdateNotify) + rect_size); ret->next_fb_update = NULL; - ret->core_fb = core_fb; + ret->proxy_fb = proxy_fb; ret->message_size = sizeof(FBUpdateMessage) + rect_size; ret->message.x = x; ret->message.y = y; @@ -149,23 +150,23 @@ extern void destroy_control_fb_client(void); * Asynchronous write I/O callback launched when writing framebuffer * notifications to the socket. * Param: - * core_fb - CoreFramebuffer instance. + * proxy_fb - ProxyFramebuffer instance. */ static void -corefb_io_write(CoreFramebuffer* core_fb) +_proxyFb_io_write(ProxyFramebuffer* proxy_fb) { - while (core_fb->fb_update_head != NULL) { - FBUpdateNotify* current_update = core_fb->fb_update_head; + while (proxy_fb->fb_update_head != NULL) { + FBUpdateNotify* current_update = proxy_fb->fb_update_head; // Lets continue writing of the current notification. const AsyncStatus status = - asyncWriter_write(&core_fb->fb_update_writer, &core_fb->io); + asyncWriter_write(&proxy_fb->fb_update_writer, &proxy_fb->io); switch (status) { case ASYNC_COMPLETE: // Done with the current update. Move on to the next one. break; case ASYNC_ERROR: // Done with the current update. Move on to the next one. - loopIo_dontWantWrite(&core_fb->io); + loopIo_dontWantWrite(&proxy_fb->io); break; case ASYNC_NEED_MORE: @@ -174,18 +175,18 @@ corefb_io_write(CoreFramebuffer* core_fb) } // Advance the list of updates - core_fb->fb_update_head = current_update->next_fb_update; - if (core_fb->fb_update_head == NULL) { - core_fb->fb_update_tail = NULL; + proxy_fb->fb_update_head = current_update->next_fb_update; + if (proxy_fb->fb_update_head == NULL) { + proxy_fb->fb_update_tail = NULL; } fbupdatenotify_delete(current_update); - if (core_fb->fb_update_head != NULL) { + if (proxy_fb->fb_update_head != NULL) { // Schedule the next one. - asyncWriter_init(&core_fb->fb_update_writer, - &core_fb->fb_update_head->message, - core_fb->fb_update_head->message_size, - &core_fb->io); + asyncWriter_init(&proxy_fb->fb_update_writer, + &proxy_fb->fb_update_head->message, + proxy_fb->fb_update_head->message_size, + &proxy_fb->io); } } } @@ -194,34 +195,35 @@ corefb_io_write(CoreFramebuffer* core_fb) * Asynchronous read I/O callback launched when reading framebuffer requests * from the socket. * Param: - * core_fb - CoreFramebuffer instance. + * proxy_fb - ProxyFramebuffer instance. */ static void -corefb_io_read(CoreFramebuffer* core_fb) +_proxyFb_io_read(ProxyFramebuffer* proxy_fb) { // Read the request header. const AsyncStatus status = - asyncReader_read(&core_fb->fb_req_reader, &core_fb->io); + asyncReader_read(&proxy_fb->fb_req_reader, &proxy_fb->io); switch (status) { case ASYNC_COMPLETE: // Request header is received - switch (core_fb->fb_req_header.request_type) { + switch (proxy_fb->fb_req_header.request_type) { case AFB_REQUEST_REFRESH: // Force full screen update to be sent - corefb_update(core_fb, core_fb->fb, - 0, 0, core_fb->fb->width, core_fb->fb->height); + proxyFb_update(proxy_fb, proxy_fb->fb, + 0, 0, proxy_fb->fb->width, + proxy_fb->fb->height); break; default: derror("Unknown framebuffer request %d\n", - core_fb->fb_req_header.request_type); + proxy_fb->fb_req_header.request_type); break; } - core_fb->fb_req_header.request_type = -1; - asyncReader_init(&core_fb->fb_req_reader, &core_fb->fb_req_header, - sizeof(core_fb->fb_req_header), &core_fb->io); + proxy_fb->fb_req_header.request_type = -1; + asyncReader_init(&proxy_fb->fb_req_reader, &proxy_fb->fb_req_header, + sizeof(proxy_fb->fb_req_header), &proxy_fb->io); break; case ASYNC_ERROR: - loopIo_dontWantRead(&core_fb->io); + loopIo_dontWantRead(&proxy_fb->io); if (errno == ECONNRESET) { // UI has exited. We need to destroy framebuffer service. destroy_control_fb_client(); @@ -238,93 +240,93 @@ corefb_io_read(CoreFramebuffer* core_fb) * Asynchronous I/O callback launched when writing framebuffer notifications * to the socket. * Param: - * opaque - CoreFramebuffer instance. + * opaque - ProxyFramebuffer instance. */ static void -corefb_io_func(void* opaque, int fd, unsigned events) +_proxyFb_io_fun(void* opaque, int fd, unsigned events) { if (events & LOOP_IO_READ) { - corefb_io_read((CoreFramebuffer*)opaque); + _proxyFb_io_read((ProxyFramebuffer*)opaque); } else if (events & LOOP_IO_WRITE) { - corefb_io_write((CoreFramebuffer*)opaque); + _proxyFb_io_write((ProxyFramebuffer*)opaque); } } -CoreFramebuffer* -corefb_create(int sock, const char* protocol, QFrameBuffer* fb) +ProxyFramebuffer* +proxyFb_create(int sock, const char* protocol, QFrameBuffer* fb) { // At this point we're implementing the -raw protocol only. - CoreFramebuffer* ret; + ProxyFramebuffer* ret; ANEW0(ret); ret->sock = sock; ret->looper = looper_newCore(); ret->fb = fb; ret->fb_update_head = NULL; ret->fb_update_tail = NULL; - loopIo_init(&ret->io, ret->looper, sock, corefb_io_func, ret); + loopIo_init(&ret->io, ret->looper, sock, _proxyFb_io_fun, ret); asyncReader_init(&ret->fb_req_reader, &ret->fb_req_header, sizeof(ret->fb_req_header), &ret->io); return ret; } void -corefb_destroy(CoreFramebuffer* core_fb) +proxyFb_destroy(ProxyFramebuffer* proxy_fb) { - if (core_fb != NULL) { - if (core_fb->looper != NULL) { + if (proxy_fb != NULL) { + if (proxy_fb->looper != NULL) { // Stop all I/O that may still be going on. - loopIo_done(&core_fb->io); + loopIo_done(&proxy_fb->io); // Delete all pending frame updates. - while (core_fb->fb_update_head != NULL) { - FBUpdateNotify* pending_update = core_fb->fb_update_head; - core_fb->fb_update_head = pending_update->next_fb_update; + while (proxy_fb->fb_update_head != NULL) { + FBUpdateNotify* pending_update = proxy_fb->fb_update_head; + proxy_fb->fb_update_head = pending_update->next_fb_update; fbupdatenotify_delete(pending_update); } - core_fb->fb_update_tail = NULL; - looper_free(core_fb->looper); - core_fb->looper = NULL; + proxy_fb->fb_update_tail = NULL; + looper_free(proxy_fb->looper); + proxy_fb->looper = NULL; } } } void -corefb_update(CoreFramebuffer* core_fb, +proxyFb_update(ProxyFramebuffer* proxy_fb, struct QFrameBuffer* fb, int x, int y, int w, int h) { AsyncStatus status; - FBUpdateNotify* descr = fbupdatenotify_create(core_fb, fb, x, y, w, h); + FBUpdateNotify* descr = fbupdatenotify_create(proxy_fb, fb, x, y, w, h); // Lets see if we should list it behind other pending updates. - if (core_fb->fb_update_tail != NULL) { - core_fb->fb_update_tail->next_fb_update = descr; - core_fb->fb_update_tail = descr; + if (proxy_fb->fb_update_tail != NULL) { + proxy_fb->fb_update_tail->next_fb_update = descr; + proxy_fb->fb_update_tail = descr; return; } // We're first in the list. Just send it now. - core_fb->fb_update_head = core_fb->fb_update_tail = descr; - asyncWriter_init(&core_fb->fb_update_writer, - &core_fb->fb_update_head->message, - core_fb->fb_update_head->message_size, &core_fb->io); - status = asyncWriter_write(&core_fb->fb_update_writer, &core_fb->io); + proxy_fb->fb_update_head = proxy_fb->fb_update_tail = descr; + asyncWriter_init(&proxy_fb->fb_update_writer, + &proxy_fb->fb_update_head->message, + proxy_fb->fb_update_head->message_size, &proxy_fb->io); + status = asyncWriter_write(&proxy_fb->fb_update_writer, &proxy_fb->io); switch (status) { case ASYNC_COMPLETE: fbupdatenotify_delete(descr); - core_fb->fb_update_head = core_fb->fb_update_tail = NULL; + proxy_fb->fb_update_head = proxy_fb->fb_update_tail = NULL; return; case ASYNC_ERROR: fbupdatenotify_delete(descr); - core_fb->fb_update_head = core_fb->fb_update_tail = NULL; + proxy_fb->fb_update_head = proxy_fb->fb_update_tail = NULL; return; case ASYNC_NEED_MORE: - // Update transfer will eventually complete in corefb_io_func + // Update transfer will eventually complete in _proxyFb_io_fun return; } } int -corefb_get_bits_per_pixel(CoreFramebuffer* core_fb) +proxyFb_get_bits_per_pixel(ProxyFramebuffer* proxy_fb) { - return (core_fb != NULL && core_fb->fb != NULL) ? - core_fb->fb->bits_per_pixel : -1; + return (proxy_fb != NULL && proxy_fb->fb != NULL) ? + proxy_fb->fb->bits_per_pixel : -1; } diff --git a/android/framebuffer-core.h b/android/protocol/fb-updates-proxy.h index 773c248..e750f1a 100644 --- a/android/framebuffer-core.h +++ b/android/protocol/fb-updates-proxy.h @@ -15,11 +15,11 @@ * to the UI connected to the core. */ -#ifndef _ANDROID_FRAMEBUFFER_CORE_H -#define _ANDROID_FRAMEBUFFER_CORE_H +#ifndef _ANDROID_PROTOCOL_FB_UPDATES_PROXY_H +#define _ANDROID_PROTOCOL_FB_UPDATES_PROXY_H /* Descriptor for a framebuffer core service instance */ -typedef struct CoreFramebuffer CoreFramebuffer; +typedef struct ProxyFramebuffer ProxyFramebuffer; /* * Creates framebuffer service. @@ -33,32 +33,32 @@ typedef struct CoreFramebuffer CoreFramebuffer; * Return: * Framebuffer service descriptor. */ -CoreFramebuffer* corefb_create(int sock, const char* protocol, struct QFrameBuffer* fb); +ProxyFramebuffer* proxyFb_create(int sock, const char* protocol, struct QFrameBuffer* fb); /* - * Destroys framebuffer service created with corefb_create. + * Destroys framebuffer service created with proxyFb_create. * Param: - * core_fb - Framebuffer service descriptor created with corefb_create + * core_fb - Framebuffer service descriptor created with proxyFb_create */ -void corefb_destroy(CoreFramebuffer* core_fb); +void proxyFb_destroy(ProxyFramebuffer* core_fb); /* * Notifies framebuffer client about changes in framebuffer. * Param: - * core_fb - Framebuffer service descriptor created with corefb_create + * core_fb - Framebuffer service descriptor created with proxyFb_create * fb Framebuffer containing pixels. * x, y, w, and h identify the rectangle that has benn changed. */ -void corefb_update(CoreFramebuffer* core_fb, struct QFrameBuffer* fb, +void proxyFb_update(ProxyFramebuffer* core_fb, struct QFrameBuffer* fb, int x, int y, int w, int h); /* * Gets number of bits used to encode a single pixel. * Param: - * core_fb - Framebuffer service descriptor created with corefb_create + * core_fb - Framebuffer service descriptor created with proxyFb_create * Return: * Number of bits used to encode a single pixel. */ -int corefb_get_bits_per_pixel(CoreFramebuffer* core_fb); +int proxyFb_get_bits_per_pixel(ProxyFramebuffer* core_fb); -#endif /* _ANDROID_FRAMEBUFFER_CORE_H */ +#endif /* _ANDROID_PROTOCOL_FB_UPDATES_PROXY_H */ diff --git a/android/framebuffer-common.h b/android/protocol/fb-updates.h index da773b7..c4f9779 100644 --- a/android/framebuffer-common.h +++ b/android/protocol/fb-updates.h @@ -11,14 +11,19 @@ */ /* - * Contains framebuffer declarations that are shared by the core and the UI. + * Contains the API for calling into the UI with Core's framebuffer updates. */ -#ifndef _ANDROID_FRAMEBUFFER_COMMON_H -#define _ANDROID_FRAMEBUFFER_COMMON_H +#ifndef _ANDROID_PROTOCOL_FB_UPDATES_H +#define _ANDROID_PROTOCOL_FB_UPDATES_H #include "sysemu.h" +/* Requests the Core to refresh framebuffer. + * This message is sent by the UI to the Core right after the UI is initialized. + * This message forces the Core to send a full display update back to the UI. */ +#define AFB_REQUEST_REFRESH 1 + /* Header of framebuffer update message sent from the core to the UI. */ typedef struct FBUpdateMessage { /* x, y, w, and h identify the rectangle that is being updated. */ @@ -31,15 +36,10 @@ typedef struct FBUpdateMessage { uint8_t rect[0]; } FBUpdateMessage; -/* Requests the service to refresh framebuffer. */ -#define AFB_REQUEST_REFRESH 1 - -/* Header for framebuffer requests sent from the client (UI) - * to the service (core). - */ +/* Header for framebuffer requests sent from the UI to the Core. */ typedef struct FBRequestHeader { /* Request type. See AFB_REQUEST_XXX for the values. */ uint8_t request_type; } FBRequestHeader; -#endif /* _ANDROID_FRAMEBUFFER_UI_H */ +#endif /* _ANDROID_PROTOCOL_FB_UPDATES_H */ |