copybit.h revision 966f989a6d502dc12ad7f5ad950180df6581f382
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 */
45enum {
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 */
56enum {
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) */
81enum {
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 */
95enum {
96    COPYBIT_DISABLE = 0,
97    COPYBIT_ENABLE  = 1
98};
99
100/*
101 * copybit blending values. same as HWC blending values
102 */
103enum {
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 */
115enum {
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 */
127struct 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 */
145struct 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 */
157struct 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 */
166struct 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 */
174struct 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
261static 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
267static 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