Home | History | Annotate | Download | only in hardware
      1 /*
      2  * Copyright (C) 2008 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 
     18 #ifndef ANDROID_GRALLOC_INTERFACE_H
     19 #define ANDROID_GRALLOC_INTERFACE_H
     20 
     21 #include <cutils/native_handle.h>
     22 
     23 #include <hardware/hardware.h>
     24 
     25 #include <stdint.h>
     26 #include <sys/cdefs.h>
     27 #include <sys/types.h>
     28 
     29 __BEGIN_DECLS
     30 
     31 /**
     32  * The id of this module
     33  */
     34 #define GRALLOC_HARDWARE_MODULE_ID "gralloc"
     35 
     36 /**
     37  * Name of the graphics device to open
     38  */
     39 
     40 #define GRALLOC_HARDWARE_FB0 "fb0"
     41 #define GRALLOC_HARDWARE_GPU0 "gpu0"
     42 
     43 enum {
     44     /* buffer is never read in software */
     45     GRALLOC_USAGE_SW_READ_NEVER   = 0x00000000,
     46     /* buffer is rarely read in software */
     47     GRALLOC_USAGE_SW_READ_RARELY  = 0x00000002,
     48     /* buffer is often read in software */
     49     GRALLOC_USAGE_SW_READ_OFTEN   = 0x00000003,
     50     /* mask for the software read values */
     51     GRALLOC_USAGE_SW_READ_MASK    = 0x0000000F,
     52 
     53     /* buffer is never written in software */
     54     GRALLOC_USAGE_SW_WRITE_NEVER  = 0x00000000,
     55     /* buffer is never written in software */
     56     GRALLOC_USAGE_SW_WRITE_RARELY = 0x00000020,
     57     /* buffer is never written in software */
     58     GRALLOC_USAGE_SW_WRITE_OFTEN  = 0x00000030,
     59     /* mask for the software write values */
     60     GRALLOC_USAGE_SW_WRITE_MASK   = 0x000000F0,
     61 
     62     /* buffer will be used as an OpenGL ES texture */
     63     GRALLOC_USAGE_HW_TEXTURE      = 0x00000100,
     64     /* buffer will be used as an OpenGL ES render target */
     65     GRALLOC_USAGE_HW_RENDER       = 0x00000200,
     66     /* buffer will be used by the 2D hardware blitter */
     67     GRALLOC_USAGE_HW_2D           = 0x00000C00,
     68     /* buffer will be used with the framebuffer device */
     69     GRALLOC_USAGE_HW_FB           = 0x00001000,
     70     /* mask for the software usage bit-mask */
     71     GRALLOC_USAGE_HW_MASK         = 0x00001F00,
     72 };
     73 
     74 /*****************************************************************************/
     75 
     76 typedef const native_handle* buffer_handle_t;
     77 
     78 enum {
     79     /* FIXME: this only exists to work-around some issues with
     80      * the video and camera frameworks. don't implement unless
     81      * you know what you're doing.
     82      */
     83     GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER = 0x080000001,
     84 };
     85 
     86 /**
     87  * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
     88  * and the fields of this data structure must begin with hw_module_t
     89  * followed by module specific information.
     90  */
     91 typedef struct gralloc_module_t {
     92     struct hw_module_t common;
     93 
     94     /*
     95      * (*registerBuffer)() must be called before a buffer_handle_t that has not
     96      * been created with (*alloc_device_t::alloc)() can be used.
     97      *
     98      * This is intended to be used with buffer_handle_t's that have been
     99      * received in this process through IPC.
    100      *
    101      * This function checks that the handle is indeed a valid one and prepares
    102      * it for use with (*lock)() and (*unlock)().
    103      *
    104      * It is not necessary to call (*registerBuffer)() on a handle created
    105      * with (*alloc_device_t::alloc)().
    106      *
    107      * returns an error if this buffer_handle_t is not valid.
    108      */
    109     int (*registerBuffer)(struct gralloc_module_t const* module,
    110             buffer_handle_t handle);
    111 
    112     /*
    113      * (*unregisterBuffer)() is called once this handle is no longer needed in
    114      * this process. After this call, it is an error to call (*lock)(),
    115      * (*unlock)(), or (*registerBuffer)().
    116      *
    117      * This function doesn't close or free the handle itself; this is done
    118      * by other means, usually through libcutils's native_handle_close() and
    119      * native_handle_free().
    120      *
    121      * It is an error to call (*unregisterBuffer)() on a buffer that wasn't
    122      * explicitly registered first.
    123      */
    124     int (*unregisterBuffer)(struct gralloc_module_t const* module,
    125             buffer_handle_t handle);
    126 
    127     /*
    128      * The (*lock)() method is called before a buffer is accessed for the
    129      * specified usage. This call may block, for instance if the h/w needs
    130      * to finish rendering or if CPU caches need to be synchronized.
    131      *
    132      * The caller promises to modify only pixels in the area specified
    133      * by (l,t,w,h).
    134      *
    135      * The content of the buffer outside of the specified area is NOT modified
    136      * by this call.
    137      *
    138      * If usage specifies GRALLOC_USAGE_SW_*, vaddr is filled with the address
    139      * of the buffer in virtual memory.
    140      *
    141      * THREADING CONSIDERATIONS:
    142      *
    143      * It is legal for several different threads to lock a buffer from
    144      * read access, none of the threads are blocked.
    145      *
    146      * However, locking a buffer simultaneously for write or read/write is
    147      * undefined, but:
    148      * - shall not result in termination of the process
    149      * - shall not block the caller
    150      * It is acceptable to return an error or to leave the buffer's content
    151      * into an indeterminate state.
    152      *
    153      * If the buffer was created with a usage mask incompatible with the
    154      * requested usage flags here, -EINVAL is returned.
    155      *
    156      */
    157 
    158     int (*lock)(struct gralloc_module_t const* module,
    159             buffer_handle_t handle, int usage,
    160             int l, int t, int w, int h,
    161             void** vaddr);
    162 
    163 
    164     /*
    165      * The (*unlock)() method must be called after all changes to the buffer
    166      * are completed.
    167      */
    168 
    169     int (*unlock)(struct gralloc_module_t const* module,
    170             buffer_handle_t handle);
    171 
    172 
    173     /* reserved for future use */
    174     int (*perform)(struct gralloc_module_t const* module,
    175             int operation, ... );
    176 
    177     /* reserved for future use */
    178     void* reserved_proc[7];
    179 } gralloc_module_t;
    180 
    181 /*****************************************************************************/
    182 
    183 /**
    184  * Every device data structure must begin with hw_device_t
    185  * followed by module specific public methods and attributes.
    186  */
    187 
    188 typedef struct alloc_device_t {
    189     struct hw_device_t common;
    190 
    191     /*
    192      * (*alloc)() Allocates a buffer in graphic memory with the requested
    193      * parameters and returns a buffer_handle_t and the stride in pixels to
    194      * allow the implementation to satisfy hardware constraints on the width
    195      * of a pixmap (eg: it may have to be multiple of 8 pixels).
    196      * The CALLER TAKES OWNERSHIP of the buffer_handle_t.
    197      *
    198      * Returns 0 on success or -errno on error.
    199      */
    200 
    201     int (*alloc)(struct alloc_device_t* dev,
    202             int w, int h, int format, int usage,
    203             buffer_handle_t* handle, int* stride);
    204 
    205     /*
    206      * (*free)() Frees a previously allocated buffer.
    207      * Behavior is undefined if the buffer is still mapped in any process,
    208      * but shall not result in termination of the program or security breaches
    209      * (allowing a process to get access to another process' buffers).
    210      * THIS FUNCTION TAKES OWNERSHIP of the buffer_handle_t which becomes
    211      * invalid after the call.
    212      *
    213      * Returns 0 on success or -errno on error.
    214      */
    215     int (*free)(struct alloc_device_t* dev,
    216             buffer_handle_t handle);
    217 
    218 } alloc_device_t;
    219 
    220 
    221 typedef struct framebuffer_device_t {
    222     struct hw_device_t common;
    223 
    224     /* flags describing some attributes of the framebuffer */
    225     const uint32_t  flags;
    226 
    227     /* dimensions of the framebuffer in pixels */
    228     const uint32_t  width;
    229     const uint32_t  height;
    230 
    231     /* frambuffer stride in pixels */
    232     const int       stride;
    233 
    234     /* framebuffer pixel format */
    235     const int       format;
    236 
    237     /* resolution of the framebuffer's display panel in pixel per inch*/
    238     const float     xdpi;
    239     const float     ydpi;
    240 
    241     /* framebuffer's display panel refresh rate in frames per second */
    242     const float     fps;
    243 
    244     /* min swap interval supported by this framebuffer */
    245     const int       minSwapInterval;
    246 
    247     /* max swap interval supported by this framebuffer */
    248     const int       maxSwapInterval;
    249 
    250     int reserved[8];
    251 
    252     /*
    253      * requests a specific swap-interval (same definition than EGL)
    254      *
    255      * Returns 0 on success or -errno on error.
    256      */
    257     int (*setSwapInterval)(struct framebuffer_device_t* window,
    258             int interval);
    259 
    260     /*
    261      * This hook is OPTIONAL.
    262      *
    263      * It is non NULL If the framebuffer driver supports "update-on-demand"
    264      * and the given rectangle is the area of the screen that gets
    265      * updated during (*post)().
    266      *
    267      * This is useful on devices that are able to DMA only a portion of
    268      * the screen to the display panel, upon demand -- as opposed to
    269      * constantly refreshing the panel 60 times per second, for instance.
    270      *
    271      * Only the area defined by this rectangle is guaranteed to be valid, that
    272      * is, the driver is not allowed to post anything outside of this
    273      * rectangle.
    274      *
    275      * The rectangle evaluated during (*post)() and specifies which area
    276      * of the buffer passed in (*post)() shall to be posted.
    277      *
    278      * return -EINVAL if width or height <=0, or if left or top < 0
    279      */
    280     int (*setUpdateRect)(struct framebuffer_device_t* window,
    281             int left, int top, int width, int height);
    282 
    283     /*
    284      * Post <buffer> to the display (display it on the screen)
    285      * The buffer must have been allocated with the
    286      *   GRALLOC_USAGE_HW_FB usage flag.
    287      * buffer must be the same width and height as the display and must NOT
    288      * be locked.
    289      *
    290      * The buffer is shown during the next VSYNC.
    291      *
    292      * If the same buffer is posted again (possibly after some other buffer),
    293      * post() will block until the the first post is completed.
    294      *
    295      * Internally, post() is expected to lock the buffer so that a
    296      * subsequent call to gralloc_module_t::(*lock)() with USAGE_RENDER or
    297      * USAGE_*_WRITE will block until it is safe; that is typically once this
    298      * buffer is shown and another buffer has been posted.
    299      *
    300      * Returns 0 on success or -errno on error.
    301      */
    302     int (*post)(struct framebuffer_device_t* dev, buffer_handle_t buffer);
    303 
    304 
    305     /*
    306      * The (*compositionComplete)() method must be called after the
    307      * compositor has finished issuing GL commands for client buffers.
    308      */
    309 
    310     int (*compositionComplete)(struct framebuffer_device_t* dev);
    311 
    312 
    313     void* reserved_proc[8];
    314 
    315 } framebuffer_device_t;
    316 
    317 
    318 /** convenience API for opening and closing a supported device */
    319 
    320 static inline int gralloc_open(const struct hw_module_t* module,
    321         struct alloc_device_t** device) {
    322     return module->methods->open(module,
    323             GRALLOC_HARDWARE_GPU0, (struct hw_device_t**)device);
    324 }
    325 
    326 static inline int gralloc_close(struct alloc_device_t* device) {
    327     return device->common.close(&device->common);
    328 }
    329 
    330 
    331 static inline int framebuffer_open(const struct hw_module_t* module,
    332         struct framebuffer_device_t** device) {
    333     return module->methods->open(module,
    334             GRALLOC_HARDWARE_FB0, (struct hw_device_t**)device);
    335 }
    336 
    337 static inline int framebuffer_close(struct framebuffer_device_t* device) {
    338     return device->common.close(&device->common);
    339 }
    340 
    341 
    342 __END_DECLS
    343 
    344 #endif  // ANDROID_ALLOC_INTERFACE_H
    345