Home | History | Annotate | Download | only in hardware
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_INCLUDE_HARDWARE_HWCOMPOSER_H
     18 #define ANDROID_INCLUDE_HARDWARE_HWCOMPOSER_H
     19 
     20 #include <stdint.h>
     21 #include <sys/cdefs.h>
     22 
     23 #include <hardware/gralloc.h>
     24 #include <hardware/hardware.h>
     25 #include <cutils/native_handle.h>
     26 
     27 #include <hardware/hwcomposer_defs.h>
     28 
     29 __BEGIN_DECLS
     30 
     31 /*****************************************************************************/
     32 
     33 // for compatibility
     34 #define HWC_MODULE_API_VERSION      HWC_MODULE_API_VERSION_0_1
     35 #define HWC_DEVICE_API_VERSION      HWC_DEVICE_API_VERSION_0_1
     36 #define HWC_API_VERSION             HWC_DEVICE_API_VERSION
     37 
     38 /**
     39  * The id of this module
     40  */
     41 #define HWC_HARDWARE_MODULE_ID "hwcomposer"
     42 
     43 /**
     44  * Name of the sensors device to open
     45  */
     46 #define HWC_HARDWARE_COMPOSER   "composer"
     47 
     48 
     49 struct hwc_composer_device;
     50 
     51 /*
     52  * availability: HWC_DEVICE_API_VERSION_0_3
     53  *
     54  * struct hwc_methods cannot be embedded in other structures as
     55  * sizeof(struct hwc_methods) cannot be relied upon.
     56  *
     57  */
     58 typedef struct hwc_methods {
     59 
     60     /*************************************************************************
     61      * HWC_DEVICE_API_VERSION_0_3
     62      *************************************************************************/
     63 
     64     /*
     65      * eventControl(..., event, enabled)
     66      * Enables or disables h/w composer events.
     67      *
     68      * eventControl can be called from any thread and takes effect
     69      * immediately.
     70      *
     71      *  Supported events are:
     72      *      HWC_EVENT_VSYNC
     73      *
     74      * returns -EINVAL if the "event" parameter is not one of the value above
     75      * or if the "enabled" parameter is not 0 or 1.
     76      */
     77 
     78     int (*eventControl)(
     79             struct hwc_composer_device* dev, int event, int enabled);
     80 
     81 } hwc_methods_t;
     82 
     83 typedef struct hwc_rect {
     84     int left;
     85     int top;
     86     int right;
     87     int bottom;
     88 } hwc_rect_t;
     89 
     90 typedef struct hwc_region {
     91     size_t numRects;
     92     hwc_rect_t const* rects;
     93 } hwc_region_t;
     94 
     95 typedef struct hwc_color {
     96     uint8_t r;
     97     uint8_t g;
     98     uint8_t b;
     99     uint8_t a;
    100 } hwc_color_t;
    101 
    102 typedef struct hwc_layer {
    103     /*
    104      * initially set to HWC_FRAMEBUFFER or HWC_BACKGROUND.
    105      * HWC_FRAMEBUFFER
    106      *   indicates the layer will be drawn into the framebuffer
    107      *   using OpenGL ES.
    108      *   The HWC can toggle this value to HWC_OVERLAY, to indicate
    109      *   it will handle the layer.
    110      *
    111      * HWC_BACKGROUND
    112      *   indicates this is a special "background"  layer. The only valid
    113      *   field is backgroundColor. HWC_BACKGROUND can only be used with
    114      *   HWC_API_VERSION >= 0.2
    115      *   The HWC can toggle this value to HWC_FRAMEBUFFER, to indicate
    116      *   it CANNOT handle the background color
    117      *
    118      */
    119     int32_t compositionType;
    120 
    121     /* see hwc_layer_t::hints above */
    122     uint32_t hints;
    123 
    124     /* see hwc_layer_t::flags above */
    125     uint32_t flags;
    126 
    127     union {
    128         /* color of the background.  hwc_color_t.a is ignored */
    129         hwc_color_t backgroundColor;
    130 
    131         struct {
    132             /* handle of buffer to compose. This handle is guaranteed to have been
    133              * allocated from gralloc using the GRALLOC_USAGE_HW_COMPOSER usage flag. If
    134              * the layer's handle is unchanged across two consecutive prepare calls and
    135              * the HWC_GEOMETRY_CHANGED flag is not set for the second call then the
    136              * HWComposer implementation may assume that the contents of the buffer have
    137              * not changed. */
    138             buffer_handle_t handle;
    139 
    140             /* transformation to apply to the buffer during composition */
    141             uint32_t transform;
    142 
    143             /* blending to apply during composition */
    144             int32_t blending;
    145 
    146             /* area of the source to consider, the origin is the top-left corner of
    147              * the buffer */
    148             hwc_rect_t sourceCrop;
    149 
    150             /* where to composite the sourceCrop onto the display. The sourceCrop
    151              * is scaled using linear filtering to the displayFrame. The origin is the
    152              * top-left corner of the screen.
    153              */
    154             hwc_rect_t displayFrame;
    155 
    156             /* visible region in screen space. The origin is the
    157              * top-left corner of the screen.
    158              * The visible region INCLUDES areas overlapped by a translucent layer.
    159              */
    160             hwc_region_t visibleRegionScreen;
    161         };
    162     };
    163 } hwc_layer_t;
    164 
    165 
    166 /*
    167  * hwc_layer_list_t::flags values
    168  */
    169 enum {
    170     /*
    171      * HWC_GEOMETRY_CHANGED is set by SurfaceFlinger to indicate that the list
    172      * passed to (*prepare)() has changed by more than just the buffer handles.
    173      */
    174     HWC_GEOMETRY_CHANGED = 0x00000001,
    175 };
    176 
    177 /*
    178  * List of layers.
    179  * The handle members of hwLayers elements must be unique.
    180  */
    181 typedef struct hwc_layer_list {
    182     uint32_t flags;
    183     size_t numHwLayers;
    184     hwc_layer_t hwLayers[0];
    185 } hwc_layer_list_t;
    186 
    187 /* This represents a display, typically an EGLDisplay object */
    188 typedef void* hwc_display_t;
    189 
    190 /* This represents a surface, typically an EGLSurface object  */
    191 typedef void* hwc_surface_t;
    192 
    193 
    194 /* see hwc_composer_device::registerProcs()
    195  * Any of the callbacks can be NULL, in which case the corresponding
    196  * functionality is not supported.
    197  */
    198 typedef struct hwc_procs {
    199     /*
    200      * (*invalidate)() triggers a screen refresh, in particular prepare and set
    201      * will be called shortly after this call is made. Note that there is
    202      * NO GUARANTEE that the screen refresh will happen after invalidate()
    203      * returns (in particular, it could happen before).
    204      * invalidate() is GUARANTEED TO NOT CALL BACK into the h/w composer HAL and
    205      * it is safe to call invalidate() from any of hwc_composer_device
    206      * hooks, unless noted otherwise.
    207      */
    208     void (*invalidate)(struct hwc_procs* procs);
    209 
    210     /*
    211      * (*vsync)() is called by the h/w composer HAL when a vsync event is
    212      * received and HWC_EVENT_VSYNC is enabled (see: hwc_event_control).
    213      *
    214      * the "zero" parameter must always be 0.
    215      * the "timestamp" parameter is the system monotonic clock timestamp in
    216      *   nanosecond of when the vsync event happened.
    217      *
    218      * vsync() is GUARANTEED TO NOT CALL BACK into the h/w composer HAL.
    219      *
    220      * It is expected that vsync() is called from a thread of at least
    221      * HAL_PRIORITY_URGENT_DISPLAY with as little latency as possible,
    222      * typically less than 0.5 ms.
    223      *
    224      * It is a (silent) error to have HWC_EVENT_VSYNC enabled when calling
    225      * hwc_composer_device.set(..., 0, 0, 0) (screen off). The implementation
    226      * can either stop or continue to process VSYNC events, but must not
    227      * crash or cause other problems.
    228      *
    229      */
    230     void (*vsync)(struct hwc_procs* procs, int zero, int64_t timestamp);
    231 } hwc_procs_t;
    232 
    233 
    234 /*****************************************************************************/
    235 
    236 typedef struct hwc_module {
    237     struct hw_module_t common;
    238 } hwc_module_t;
    239 
    240 
    241 typedef struct hwc_composer_device {
    242     struct hw_device_t common;
    243 
    244     /*
    245      * (*prepare)() is called for each frame before composition and is used by
    246      * SurfaceFlinger to determine what composition steps the HWC can handle.
    247      *
    248      * (*prepare)() can be called more than once, the last call prevails.
    249      *
    250      * The HWC responds by setting the compositionType field to either
    251      * HWC_FRAMEBUFFER or HWC_OVERLAY. In the former case, the composition for
    252      * this layer is handled by SurfaceFlinger with OpenGL ES, in the later
    253      * case, the HWC will have to handle this layer's composition.
    254      *
    255      * (*prepare)() is called with HWC_GEOMETRY_CHANGED to indicate that the
    256      * list's geometry has changed, that is, when more than just the buffer's
    257      * handles have been updated. Typically this happens (but is not limited to)
    258      * when a window is added, removed, resized or moved.
    259      *
    260      * a NULL list parameter or a numHwLayers of zero indicates that the
    261      * entire composition will be handled by SurfaceFlinger with OpenGL ES.
    262      *
    263      * returns: 0 on success. An negative error code on error. If an error is
    264      * returned, SurfaceFlinger will assume that none of the layer will be
    265      * handled by the HWC.
    266      */
    267     int (*prepare)(struct hwc_composer_device *dev, hwc_layer_list_t* list);
    268 
    269 
    270     /*
    271      * (*set)() is used in place of eglSwapBuffers(), and assumes the same
    272      * functionality, except it also commits the work list atomically with
    273      * the actual eglSwapBuffers().
    274      *
    275      * The list parameter is guaranteed to be the same as the one returned
    276      * from the last call to (*prepare)().
    277      *
    278      * When this call returns the caller assumes that:
    279      *
    280      * - the display will be updated in the near future with the content
    281      *   of the work list, without artifacts during the transition from the
    282      *   previous frame.
    283      *
    284      * - all objects are available for immediate access or destruction, in
    285      *   particular, hwc_region_t::rects data and hwc_layer_t::layer's buffer.
    286      *   Note that this means that immediately accessing (potentially from a
    287      *   different process) a buffer used in this call will not result in
    288      *   screen corruption, the driver must apply proper synchronization or
    289      *   scheduling (eg: block the caller, such as gralloc_module_t::lock(),
    290      *   OpenGL ES, Camera, Codecs, etc..., or schedule the caller's work
    291      *   after the buffer is freed from the actual composition).
    292      *
    293      * a NULL list parameter or a numHwLayers of zero indicates that the
    294      * entire composition has been handled by SurfaceFlinger with OpenGL ES.
    295      * In this case, (*set)() behaves just like eglSwapBuffers().
    296      *
    297      * dpy, sur, and list are set to NULL to indicate that the screen is
    298      * turning off. This happens WITHOUT prepare() being called first.
    299      * This is a good time to free h/w resources and/or power
    300      * the relevant h/w blocks down.
    301      *
    302      * IMPORTANT NOTE: there is an implicit layer containing opaque black
    303      * pixels behind all the layers in the list.
    304      * It is the responsibility of the hwcomposer module to make
    305      * sure black pixels are output (or blended from).
    306      *
    307      * returns: 0 on success. An negative error code on error:
    308      *    HWC_EGL_ERROR: eglGetError() will provide the proper error code
    309      *    Another code for non EGL errors.
    310      *
    311      */
    312     int (*set)(struct hwc_composer_device *dev,
    313                 hwc_display_t dpy,
    314                 hwc_surface_t sur,
    315                 hwc_layer_list_t* list);
    316     /*
    317      * This field is OPTIONAL and can be NULL.
    318      *
    319      * If non NULL it will be called by SurfaceFlinger on dumpsys
    320      */
    321     void (*dump)(struct hwc_composer_device* dev, char *buff, int buff_len);
    322 
    323     /*
    324      * This field is OPTIONAL and can be NULL.
    325      *
    326      * (*registerProcs)() registers a set of callbacks the h/w composer HAL
    327      * can later use. It is FORBIDDEN to call any of the callbacks from
    328      * within registerProcs(). registerProcs() must save the hwc_procs_t pointer
    329      * which is needed when calling a registered callback.
    330      * Each call to registerProcs replaces the previous set of callbacks.
    331      * registerProcs is called with NULL to unregister all callbacks.
    332      *
    333      * Any of the callbacks can be NULL, in which case the corresponding
    334      * functionality is not supported.
    335      */
    336     void (*registerProcs)(struct hwc_composer_device* dev,
    337             hwc_procs_t const* procs);
    338 
    339     /*
    340      * This field is OPTIONAL and can be NULL.
    341      * availability: HWC_DEVICE_API_VERSION_0_2
    342      *
    343      * Used to retrieve information about the h/w composer
    344      *
    345      * Returns 0 on success or -errno on error.
    346      */
    347     int (*query)(struct hwc_composer_device* dev, int what, int* value);
    348 
    349     /*
    350      * Reserved for future use. Must be NULL.
    351      */
    352     void* reserved_proc[4];
    353 
    354     /*
    355      * This field is OPTIONAL and can be NULL.
    356      * availability: HWC_DEVICE_API_VERSION_0_3
    357      */
    358     hwc_methods_t const *methods;
    359 
    360 } hwc_composer_device_t;
    361 
    362 
    363 /** convenience API for opening and closing a device */
    364 
    365 static inline int hwc_open(const struct hw_module_t* module,
    366         hwc_composer_device_t** device) {
    367     return module->methods->open(module,
    368             HWC_HARDWARE_COMPOSER, (struct hw_device_t**)device);
    369 }
    370 
    371 static inline int hwc_close(hwc_composer_device_t* device) {
    372     return device->common.close(&device->common);
    373 }
    374 
    375 
    376 /*****************************************************************************/
    377 
    378 __END_DECLS
    379 
    380 #endif /* ANDROID_INCLUDE_HARDWARE_HWCOMPOSER_H */
    381