aboutsummaryrefslogtreecommitdiffstats
path: root/framebuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'framebuffer.h')
-rw-r--r--framebuffer.h130
1 files changed, 93 insertions, 37 deletions
diff --git a/framebuffer.h b/framebuffer.h
index 46f9156..1dce0d9 100644
--- a/framebuffer.h
+++ b/framebuffer.h
@@ -12,18 +12,27 @@
#ifndef _QEMU_FRAMEBUFFER_H_
#define _QEMU_FRAMEBUFFER_H_
-/* a simple interface to a framebuffer display. this is to be used by the hardware framebuffer
- * driver (e.g. hw/goldfish_fb.c) to send VRAM updates to the emulator.
+/* A simple abstract interface to framebuffer displays. this is used to
+ * de-couple hardware emulation from final display.
*
- * note the 'rotation' field: it can take values 0, 1, 2 or 3 and corresponds to a rotation
- * that must be performed to the pixels stored in the framebuffer *before* displaying them
- * a value of 1 corresponds to a rotation of 90 clockwise-degrees, when the framebuffer is
- * rotated 90 or 270 degrees, its width/height are swapped automatically
+ * Each QFrameBuffer object holds a pixel buffer that is shared between
+ * one 'Producer' and one or more 'Clients'
*
- * phys_width_mm and phys_height_mm are physical dimensions expressed in millimeters
+ * The Producer is in charge of updating the pixel buffer from the state
+ * of the emulated VRAM. A Client listens to updates to the pixel buffer,
+ * sent from the producer through qframebuffer_update()/_rotate() and
+ * displays them.
*
- * each QFrameBuffer can have one "client" that reacts to VRAM updates or the framebuffer
- * rotations requested by the system.
+ * note the 'rotation' field: it can take values 0, 1, 2 or 3 and corresponds
+ * to a rotation that must be performed to the pixels stored in the framebuffer
+ * *before* displaying them a value of 1 corresponds to a rotation of
+ * 90 clockwise-degrees, when the framebuffer is rotated 90 or 270 degrees,
+ * its width/height are swapped automatically
+ *
+ * phys_width_mm and phys_height_mm are physical dimensions expressed
+ * in millimeters
+ *
+ * More about the client/producer relationships below.
*/
typedef struct QFrameBuffer QFrameBuffer;
@@ -50,8 +59,9 @@ struct QFrameBuffer {
};
-/* the default dpi resolution of a typical framebuffer. this is an average between
- * various prototypes being used during the development of the Android system...
+/* the default dpi resolution of a typical framebuffer. this is an average
+ * between various prototypes being used during the development of the
+ * Android system...
*/
#define DEFAULT_FRAMEBUFFER_DPI 165
@@ -66,25 +76,46 @@ qframebuffer_init( QFrameBuffer* qfbuff,
int rotation,
QFrameBufferFormat format );
-/* recompute phys_width_mm and phys_height_mm according to the emulated screen DPI settings */
+/* recompute phys_width_mm and phys_height_mm according to the emulated
+ * screen DPI settings */
extern void
qframebuffer_set_dpi( QFrameBuffer* qfbuff,
int x_dpi,
int y_dpi );
-/* alternative to qframebuffer_set_dpi where one can set the physical dimensions directly */
-/* in millimeters. for the record 1 inch = 25.4 mm */
+/* alternative to qframebuffer_set_dpi where one can set the physical
+ * dimensions directly in millimeters. for the record 1 inch = 25.4 mm */
extern void
qframebuffer_set_mm( QFrameBuffer* qfbuff,
int width_mm,
int height_mm );
-/* add one client to a given framebuffer */
-/* client functions */
-typedef void (*QFrameBufferUpdateFunc)( void* opaque, int x, int y, int w, int h );
+/* the Client::Update method is called to instruct a client that a given
+ * rectangle of the framebuffer pixels was updated and needs to be
+ * redrawn.
+ */
+typedef void (*QFrameBufferUpdateFunc)( void* opaque, int x, int y,
+ int w, int h );
+
+/* the Client::Rotate method is called to instruct the client that a
+ * framebuffer's internal rotation has changed. This is the rotation
+ * that must be applied before displaying the pixels.
+ *
+ * Note that it is assumed that all framebuffer pixels have changed too
+ * so the client should call its Update method as well.
+ */
typedef void (*QFrameBufferRotateFunc)( void* opaque, int rotation );
+
+/* the Client::Done func tells a client that a framebuffer object was freed.
+ * no more reference to its pixels should be done.
+ */
typedef void (*QFrameBufferDoneFunc) ( void* opaque );
+/* add one client to a given framebuffer.
+ * the current implementation only allows one client per frame-buffer,
+ * but we could allow more for various reasons (e.g. displaying the
+ * framebuffer + dispatching it through VNC at the same time)
+ */
extern void
qframebuffer_add_client( QFrameBuffer* qfbuff,
void* fb_opaque,
@@ -92,58 +123,83 @@ qframebuffer_add_client( QFrameBuffer* qfbuff,
QFrameBufferRotateFunc fb_rotate,
QFrameBufferDoneFunc fb_done );
-/* add one producer to a given framebuffer */
-/* producer functions */
+/* Producer::CheckUpdate is called to let the producer check the
+ * VRAM state (e.g. VRAM dirty pages) to see if anything changed since the
+ * last call to the method. When true, the method should call either
+ * qframebuffer_update() or qframebuffer_rotate() with the appropriate values.
+ */
typedef void (*QFrameBufferCheckUpdateFunc)( void* opaque );
+
+/* Producer::Invalidate tells the producer that the next call to
+ * CheckUpdate should act as if the whole content of VRAM had changed.
+ * this is normally done to force client initialization/refreshes.
+ */
typedef void (*QFrameBufferInvalidateFunc) ( void* opaque );
+
+/* the Producer::Detach method is used to tell the producer that the
+ * underlying QFrameBuffer object is about to be de-allocated.
+ */
typedef void (*QFrameBufferDetachFunc) ( void* opaque );
+/* set the producer of a given framebuffer */
extern void
-qframebuffer_add_producer( QFrameBuffer* qfbuff,
+qframebuffer_set_producer( QFrameBuffer* qfbuff,
void* opaque,
QFrameBufferCheckUpdateFunc fb_check,
QFrameBufferInvalidateFunc fb_invalidate,
QFrameBufferDetachFunc fb_detach );
-/* tell a client that a rectangle region has been updated in the framebuffer pixel buffer */
+/* tell a client that a rectangle region has been updated in the framebuffer
+ * pixel buffer this is typically called from a Producer::CheckUpdate method
+ */
extern void
qframebuffer_update( QFrameBuffer* qfbuff, int x, int y, int w, int h );
-/* rotate the framebuffer (may swap width/height), and tell a client that we did */
+/* rotate the framebuffer (may swap width/height), and tell all clients.
+ * Should be called from a Producer::CheckUpdate method
+ */
extern void
qframebuffer_rotate( QFrameBuffer* qfbuff, int rotation );
-/* finalize a framebuffer, release its pixel buffer */
+/* finalize a framebuffer, release its pixel buffer. Should be called
+ * from the framebuffer object's owner
+ */
extern void
qframebuffer_done( QFrameBuffer* qfbuff );
+/* this is called repeatedly by the emulator. for each registered framebuffer,
+ * call its producer's CheckUpdate method, if any.
+ */
+extern void
+qframebuffer_check_updates( void );
+
+/* this is called by the emulator. for each registered framebuffer, call
+ * its producer's Invalidate method, if any
+ */
+extern void
+qframebuffer_invalidate_all( void );
+
/*
- * QFrameBuffer objects are created by the emulated system, its characteristics typically
- * depend on the current device skin being used.
+ * to completely separate the implementation of clients, producers, and skins,
+ * we use a simple global FIFO list of QFrameBuffer objects.
*
- * there are also used by emulated framebuffer devices, who don't know much about all this
+ * qframebuffer_fifo_add() is typically called by the emulator initialization
+ * depending on the emulated device's configuration
*
- * use a simple fifo to bridge these together
+ * qframebuffer_fifo_get() is typically called by a hardware framebuffer
+ * emulation.
*/
/* add a new constructed frame buffer object to our global list */
extern void
qframebuffer_fifo_add( QFrameBuffer* qfbuff );
+/* retrieve a frame buffer object from the global FIFO list */
extern QFrameBuffer*
qframebuffer_fifo_get( void );
-/*
- * check all registered framebuffers for updates. tgus wukk cakk tge ckuebt's update
- * functions in the end...
- */
-
-extern void
-qframebuffer_check_updates( void );
-
-extern void
-qframebuffer_invalidate_all( void );
+/* */
#endif /* _QEMU_FRAMEBUFFER_H_ */