From 4a6788b02fb2bd174ac9e2386029785f084b7fdd Mon Sep 17 00:00:00 2001 From: Riley Andrews Date: Mon, 30 Jun 2014 15:55:55 -0700 Subject: [PATCH] Add interface for doing asynchonous cursor layer updates to hwcomposer Change-Id: If2ab523b400cfb586c8e1fed98f2ebe3538c0419 --- include/hardware/hwcomposer.h | 46 +++++++++++++++++++++++++++++++++----- include/hardware/hwcomposer_defs.h | 17 +++++++++++++- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/include/hardware/hwcomposer.h b/include/hardware/hwcomposer.h index af04181..3dfb4fd 100644 --- a/include/hardware/hwcomposer.h +++ b/include/hardware/hwcomposer.h @@ -141,6 +141,13 @@ typedef struct hwc_layer_1 { * as a solid color since the platform is not currently able to composite * sideband layers with the GPU. This may be improved in future * versions of the platform. + * + * + * HWC_CURSOR_OVERLAY + * Set by the HWC implementation during (*prepare)(), this value + * indicates the layer's composition will now be handled by the HWC. + * Additionally, the client can now asynchronously update the on-screen + * position of this layer using the setCursorPositionAsync() api. */ int32_t compositionType; @@ -505,11 +512,12 @@ typedef struct hwc_composer_device_1 { * (*prepare)() can be called more than once, the last call prevails. * * The HWC responds by setting the compositionType field in each layer to - * either HWC_FRAMEBUFFER or HWC_OVERLAY. In the former case, the - * composition for the layer is handled by SurfaceFlinger with OpenGL ES, - * in the later case, the HWC will have to handle the layer's composition. - * compositionType and hints are preserved between (*prepare)() calles - * unless the HWC_GEOMETRY_CHANGED flag is set. + * either HWC_FRAMEBUFFER, HWC_OVERLAY, or HWC_CURSOR_OVERLAY. For the + * HWC_FRAMEBUFFER type, composition for the layer is handled by + * SurfaceFlinger with OpenGL ES. For the latter two overlay types, + * the HWC will have to handle the layer's composition. compositionType + * and hints are preserved between (*prepare)() calles unless the + * HWC_GEOMETRY_CHANGED flag is set. * * (*prepare)() is called with HWC_GEOMETRY_CHANGED to indicate that the * list's geometry has changed, that is, when more than just the buffer's @@ -751,11 +759,37 @@ typedef struct hwc_composer_device_1 { */ int (*setActiveConfig)(struct hwc_composer_device_1* dev, int disp, int index); + /* + * Asynchronously update the location of the cursor layer. + * + * Within the standard prepare()/set() composition loop, the client + * (surfaceflinger) can request that a given layer uses dedicated cursor + * composition hardware by specifiying the HWC_IS_CURSOR_LAYER flag. Only + * one layer per display can have this flag set. If the layer is suitable + * for the platform's cursor hardware, hwcomposer will return from prepare() + * a composition type of HWC_CURSOR_OVERLAY for that layer. This indicates + * not only that the client is not responsible for compositing that layer, + * but also that the client can continue to update the position of that layer + * after a call to set(). This can reduce the visible latency of mouse + * movement to visible, on-screen cursor updates. Calls to + * setCursorPositionAsync() may be made from a different thread doing the + * prepare()/set() composition loop, but care must be taken to not interleave + * calls of setCursorPositionAsync() between calls of set()/prepare(). + * + * Notes: + * - Only one layer per display can be specified as a cursor layer with + * HWC_IS_CURSOR_LAYER. + * - hwcomposer will only return one layer per display as HWC_CURSOR_OVERLAY + * - This returns 0 on success or -errno on error. + * - This field is optional for HWC_DEVICE_API_VERSION_1_4 and later. It + * should be null for previous versions. + */ + int (*setCursorPositionAsync)(struct hwc_composer_device_1 *dev, int disp, int x_pos, int y_pos); /* * Reserved for future use. Must be NULL. */ - void* reserved_proc[2]; + void* reserved_proc[1]; } hwc_composer_device_1_t; diff --git a/include/hardware/hwcomposer_defs.h b/include/hardware/hwcomposer_defs.h index d24bc9d..9a52436 100644 --- a/include/hardware/hwcomposer_defs.h +++ b/include/hardware/hwcomposer_defs.h @@ -77,6 +77,16 @@ enum { * by SurfaceFlinger (just as if compositionType was set to HWC_OVERLAY). */ HWC_SKIP_LAYER = 0x00000001, + + /* + * HWC_IS_CURSOR_LAYER is set by surfaceflinger to indicate that this + * layer is being used as a cursor on this particular display, and that + * surfaceflinger can potentially perform asynchronous position updates for + * this layer. If a call to prepare() returns HWC_CURSOR_OVERLAY for the + * composition type of this layer, then the hwcomposer will allow async + * position updates to this layer via setCursorPositionAsync(). + */ + HWC_IS_CURSOR_LAYER = 0x00000002 }; /* @@ -100,8 +110,13 @@ enum { /* this layer's contents are taken from a sideband buffer stream. * Added in HWC_DEVICE_API_VERSION_1_4. */ HWC_SIDEBAND = 4, -}; + /* this layer's composition will be handled by hwcomposer by dedicated + cursor overlay hardware. hwcomposer will also all async position updates + of this layer outside of the normal prepare()/set() loop. Added in + HWC_DEVICE_API_VERSION_1_4. */ + HWC_CURSOR_OVERLAY = 5 + }; /* * hwc_layer_t::blending values */ -- 2.11.0