Home | History | Annotate | Download | only in libcopybit
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
      4  *
      5  * Not a Contribution, Apache license notifications and license are retained
      6  * for attribution purposes only.
      7  *
      8  * Licensed under the Apache License, Version 2.0 (the "License");
      9  * you may not use this file except in compliance with the License.
     10  * You may obtain a copy of the License at
     11  *
     12  *      http://www.apache.org/licenses/LICENSE-2.0
     13  *
     14  * Unless required by applicable law or agreed to in writing, software
     15  * distributed under the License is distributed on an "AS IS" BASIS,
     16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     17  * See the License for the specific language governing permissions and
     18  * limitations under the License.
     19  */
     20 
     21 #ifndef ANDROID_COPYBIT_INTERFACE_H
     22 #define ANDROID_COPYBIT_INTERFACE_H
     23 
     24 #include <hardware/hardware.h>
     25 
     26 #include <stdint.h>
     27 #include <sys/cdefs.h>
     28 #include <sys/types.h>
     29 
     30 __BEGIN_DECLS
     31 
     32 /**
     33  * The id of this module
     34  */
     35 #define COPYBIT_HARDWARE_MODULE_ID "copybit"
     36 
     37 /**
     38  * Name of the graphics device to open
     39  */
     40 #define COPYBIT_HARDWARE_COPYBIT0 "copybit0"
     41 
     42 /* supported pixel-formats. these must be compatible with
     43  * graphics/PixelFormat.java, ui/PixelFormat.h, pixelflinger/format.h
     44  */
     45 enum {
     46     COPYBIT_FORMAT_RGBA_8888    = HAL_PIXEL_FORMAT_RGBA_8888,
     47     COPYBIT_FORMAT_RGBX_8888    = HAL_PIXEL_FORMAT_RGBX_8888,
     48     COPYBIT_FORMAT_RGB_888      = HAL_PIXEL_FORMAT_RGB_888,
     49     COPYBIT_FORMAT_RGB_565      = HAL_PIXEL_FORMAT_RGB_565,
     50     COPYBIT_FORMAT_BGRA_8888    = HAL_PIXEL_FORMAT_BGRA_8888,
     51     COPYBIT_FORMAT_YCbCr_422_SP = 0x10,
     52     COPYBIT_FORMAT_YCrCb_420_SP = 0x11,
     53 };
     54 
     55 /* name for copybit_set_parameter */
     56 enum {
     57     /* Default blit destination is offline buffer */
     58     /* clients to set this to '1', if blitting to framebuffer */
     59     /* and reset to '0', after calling blit/stretch */
     60     COPYBIT_BLIT_TO_FRAMEBUFFER = 0,
     61     /* rotation of the source image in degrees (0 to 359) */
     62     COPYBIT_ROTATION_DEG    = 1,
     63     /* plane alpha value */
     64     COPYBIT_PLANE_ALPHA     = 2,
     65     /* enable or disable dithering */
     66     COPYBIT_DITHER          = 3,
     67     /* transformation applied (this is a superset of COPYBIT_ROTATION_DEG) */
     68     COPYBIT_TRANSFORM       = 4,
     69     /* blurs the copied bitmap. The amount of blurring cannot be changed
     70      * at this time. */
     71     COPYBIT_BLUR            = 5,
     72     /* Blend mode */
     73     COPYBIT_BLEND_MODE  = 6,
     74     /* FB width */
     75     COPYBIT_FRAMEBUFFER_WIDTH = 7,
     76     /* FB height */
     77     COPYBIT_FRAMEBUFFER_HEIGHT = 8,
     78 };
     79 
     80 /* values for copybit_set_parameter(COPYBIT_TRANSFORM) */
     81 enum {
     82     /* flip source image horizontally */
     83     COPYBIT_TRANSFORM_FLIP_H    = HAL_TRANSFORM_FLIP_H,
     84     /* flip source image vertically */
     85     COPYBIT_TRANSFORM_FLIP_V    = HAL_TRANSFORM_FLIP_V,
     86     /* rotate source image 90 degres */
     87     COPYBIT_TRANSFORM_ROT_90    = HAL_TRANSFORM_ROT_90,
     88     /* rotate source image 180 degres */
     89     COPYBIT_TRANSFORM_ROT_180   = HAL_TRANSFORM_ROT_180,
     90     /* rotate source image 270 degres */
     91     COPYBIT_TRANSFORM_ROT_270   = HAL_TRANSFORM_ROT_270,
     92 };
     93 
     94 /* enable/disable value copybit_set_parameter */
     95 enum {
     96     COPYBIT_DISABLE = 0,
     97     COPYBIT_ENABLE  = 1
     98 };
     99 
    100 /*
    101  * copybit blending values. same as HWC blending values
    102  */
    103 enum {
    104     /* no blending */
    105     COPYBIT_BLENDING_NONE     = 0x0100,
    106 
    107     /* ONE / ONE_MINUS_SRC_ALPHA */
    108     COPYBIT_BLENDING_PREMULT  = 0x0105,
    109 
    110     /* SRC_ALPHA / ONE_MINUS_SRC_ALPHA */
    111     COPYBIT_BLENDING_COVERAGE = 0x0405
    112 };
    113 
    114 /* use get_static_info() to query static informations about the hardware */
    115 enum {
    116     /* Maximum amount of minification supported by the hardware*/
    117     COPYBIT_MINIFICATION_LIMIT  = 1,
    118     /* Maximum amount of magnification supported by the hardware */
    119     COPYBIT_MAGNIFICATION_LIMIT = 2,
    120     /* Number of fractional bits support by the scaling engine */
    121     COPYBIT_SCALING_FRAC_BITS   = 3,
    122     /* Supported rotation step in degres. */
    123     COPYBIT_ROTATION_STEP_DEG   = 4,
    124 };
    125 
    126 /* Image structure */
    127 struct copybit_image_t {
    128     /* width */
    129     uint32_t    w;
    130     /* height */
    131     uint32_t    h;
    132     /* format COPYBIT_FORMAT_xxx */
    133     int32_t     format;
    134     /* base of buffer with image */
    135     void        *base;
    136     /* handle to the image */
    137     native_handle_t* handle;
    138     /* number of pixels added for the stride */
    139     uint32_t    horiz_padding;
    140     /* number of pixels added for the vertical stride */
    141     uint32_t    vert_padding;
    142 };
    143 
    144 /* Rectangle */
    145 struct copybit_rect_t {
    146     /* left */
    147     int l;
    148     /* top */
    149     int t;
    150     /* right */
    151     int r;
    152     /* bottom */
    153     int b;
    154 };
    155 
    156 /* Region */
    157 struct copybit_region_t {
    158     int (*next)(struct copybit_region_t const *region, struct copybit_rect_t *rect);
    159 };
    160 
    161 /**
    162  * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
    163  * and the fields of this data structure must begin with hw_module_t
    164  * followed by module specific information.
    165  */
    166 struct copybit_module_t {
    167     struct hw_module_t common;
    168 };
    169 
    170 /**
    171  * Every device data structure must begin with hw_device_t
    172  * followed by module specific public methods and attributes.
    173  */
    174 struct copybit_device_t {
    175     struct hw_device_t common;
    176 
    177     /**
    178      * Set a copybit parameter.
    179      *
    180      * @param dev from open
    181      * @param name one for the COPYBIT_NAME_xxx
    182      * @param value one of the COPYBIT_VALUE_xxx
    183      *
    184      * @return 0 if successful
    185      */
    186     int (*set_parameter)(struct copybit_device_t *dev, int name, int value);
    187 
    188     /**
    189      * Get a static copybit information.
    190      *
    191      * @param dev from open
    192      * @param name one of the COPYBIT_STATIC_xxx
    193      *
    194      * @return value or -EINVAL if error
    195      */
    196     int (*get)(struct copybit_device_t *dev, int name);
    197 
    198     /**
    199      * Execute the bit blit copy operation
    200      *
    201      * @param dev from open
    202      * @param dst is the destination image
    203      * @param src is the source image
    204      * @param region the clip region
    205      *
    206      * @return 0 if successful
    207      */
    208     int (*blit)(struct copybit_device_t *dev,
    209                 struct copybit_image_t const *dst,
    210                 struct copybit_image_t const *src,
    211                 struct copybit_region_t const *region);
    212 
    213     /**
    214      * Execute the stretch bit blit copy operation
    215      *
    216      * @param dev from open
    217      * @param dst is the destination image
    218      * @param src is the source image
    219      * @param dst_rect is the destination rectangle
    220      * @param src_rect is the source rectangle
    221      * @param region the clip region
    222      *
    223      * @return 0 if successful
    224      */
    225     int (*stretch)(struct copybit_device_t *dev,
    226                    struct copybit_image_t const *dst,
    227                    struct copybit_image_t const *src,
    228                    struct copybit_rect_t const *dst_rect,
    229                    struct copybit_rect_t const *src_rect,
    230                    struct copybit_region_t const *region);
    231 
    232   /**
    233     * Execute the completion of the copybit draw operation.
    234     *
    235     * @param dev from open
    236     *
    237     * @return 0 if successful
    238     */
    239   int (*finish)(struct copybit_device_t *dev);
    240 
    241   /**
    242     * Trigger the copybit draw operation(async).
    243     *
    244     * @param dev from open
    245     *
    246     * @param fd - gets the fencefd
    247     *
    248     * @return 0 if successful
    249     */
    250   int (*flush_get_fence)(struct copybit_device_t *dev, int* fd);
    251 
    252   /* Clears the buffer
    253    */
    254   int (*clear)(struct copybit_device_t *dev, struct copybit_image_t const *buf,
    255                struct copybit_rect_t *rect);
    256 };
    257 
    258 
    259 /** convenience API for opening and closing a device */
    260 
    261 static inline int copybit_open(const struct hw_module_t* module,
    262                                struct copybit_device_t** device) {
    263     return module->methods->open(module,
    264                                  COPYBIT_HARDWARE_COPYBIT0, (struct hw_device_t**)device);
    265 }
    266 
    267 static inline int copybit_close(struct copybit_device_t* device) {
    268     return device->common.close(&device->common);
    269 }
    270 
    271 
    272 __END_DECLS
    273 
    274 #endif  // ANDROID_COPYBIT_INTERFACE_H
    275