blob: 32ba90c2bc7d5df070625bf719f66aff8b66832c [file] [log] [blame]
Mathias Agopian5d3de302010-08-05 15:24:35 -07001/*
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
Louis Huemiller45e23712010-12-01 12:25:00 -080023#include <hardware/gralloc.h>
Mathias Agopian5d3de302010-08-05 15:24:35 -070024#include <hardware/hardware.h>
25#include <cutils/native_handle.h>
26
27__BEGIN_DECLS
28
29/*****************************************************************************/
Erik Gillinge9952042010-12-07 18:46:04 -080030
Mathias Agopian81c323d2012-03-25 01:09:35 -070031#define HWC_DEVICE_API_VERSION HARDWARE_DEVICE_API_VERSION(0, 2)
32#define HWC_MODULE_API_VERSION HARDWARE_MODULE_API_VERSION(0, 1)
33// for compatibility
34#define HWC_API_VERSION HWC_DEVICE_API_VERSION
Erik Gillinge9952042010-12-07 18:46:04 -080035
Mathias Agopian5d3de302010-08-05 15:24:35 -070036/**
37 * The id of this module
38 */
39#define HWC_HARDWARE_MODULE_ID "hwcomposer"
40
41/**
42 * Name of the sensors device to open
43 */
44#define HWC_HARDWARE_COMPOSER "composer"
45
46
47enum {
48 /* hwc_composer_device_t::set failed in EGL */
49 HWC_EGL_ERROR = -1
50};
51
52/*
53 * hwc_layer_t::hints values
54 * Hints are set by the HAL and read by SurfaceFlinger
55 */
56enum {
57 /*
Mathias Agopiancdd44a02010-08-12 15:04:58 -070058 * HWC can set the HWC_HINT_TRIPLE_BUFFER hint to indicate to SurfaceFlinger
Mathias Agopian5d3de302010-08-05 15:24:35 -070059 * that it should triple buffer this layer. Typically HWC does this when
60 * the layer will be unavailable for use for an extended period of time,
61 * e.g. if the display will be fetching data directly from the layer and
62 * the layer can not be modified until after the next set().
63 */
Mathias Agopiancdd44a02010-08-12 15:04:58 -070064 HWC_HINT_TRIPLE_BUFFER = 0x00000001,
65
66 /*
67 * HWC sets HWC_HINT_CLEAR_FB to tell SurfaceFlinger that it should clear the
68 * framebuffer with transparent pixels where this layer would be.
69 * SurfaceFlinger will only honor this flag when the layer has no blending
70 *
71 */
72 HWC_HINT_CLEAR_FB = 0x00000002
Mathias Agopian5d3de302010-08-05 15:24:35 -070073};
74
75/*
76 * hwc_layer_t::flags values
77 * Flags are set by SurfaceFlinger and read by the HAL
78 */
79enum {
80 /*
81 * HWC_SKIP_LAYER is set by SurfaceFlnger to indicate that the HAL
82 * shall not consider this layer for composition as it will be handled
83 * by SurfaceFlinger (just as if compositionType was set to HWC_OVERLAY).
84 */
85 HWC_SKIP_LAYER = 0x00000001,
86};
87
88/*
89 * hwc_layer_t::compositionType values
90 */
91enum {
92 /* this layer is to be drawn into the framebuffer by SurfaceFlinger */
93 HWC_FRAMEBUFFER = 0,
94
95 /* this layer will be handled in the HWC */
96 HWC_OVERLAY = 1,
Mathias Agopianeb8fb502012-02-03 15:54:11 -080097
98 /* this is the background layer. it's used to set the background color.
99 * there is only a single background layer */
100 HWC_BACKGROUND = 2,
Mathias Agopian5d3de302010-08-05 15:24:35 -0700101};
102
103/*
104 * hwc_layer_t::blending values
105 */
106enum {
107 /* no blending */
108 HWC_BLENDING_NONE = 0x0100,
109
110 /* ONE / ONE_MINUS_SRC_ALPHA */
111 HWC_BLENDING_PREMULT = 0x0105,
112
113 /* SRC_ALPHA / ONE_MINUS_SRC_ALPHA */
114 HWC_BLENDING_COVERAGE = 0x0405
115};
116
117/*
118 * hwc_layer_t::transform values
119 */
120enum {
121 /* flip source image horizontally */
122 HWC_TRANSFORM_FLIP_H = HAL_TRANSFORM_FLIP_H,
123 /* flip source image vertically */
124 HWC_TRANSFORM_FLIP_V = HAL_TRANSFORM_FLIP_V,
125 /* rotate source image 90 degrees clock-wise */
126 HWC_TRANSFORM_ROT_90 = HAL_TRANSFORM_ROT_90,
127 /* rotate source image 180 degrees */
128 HWC_TRANSFORM_ROT_180 = HAL_TRANSFORM_ROT_180,
129 /* rotate source image 270 degrees clock-wise */
130 HWC_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270,
131};
132
Mathias Agopianeb8fb502012-02-03 15:54:11 -0800133/* attributes queriable with query() */
134enum {
135 /* must return 1 if the background layer is supported, 0 otherwise */
136 HWC_BACKGROUND_LAYER_SUPPORTED = 0,
137};
138
Mathias Agopian5d3de302010-08-05 15:24:35 -0700139typedef struct hwc_rect {
140 int left;
141 int top;
142 int right;
143 int bottom;
144} hwc_rect_t;
145
146typedef struct hwc_region {
147 size_t numRects;
148 hwc_rect_t const* rects;
149} hwc_region_t;
150
Mathias Agopianeb8fb502012-02-03 15:54:11 -0800151typedef struct hwc_color {
152 uint8_t r;
153 uint8_t g;
154 uint8_t b;
155 uint8_t a;
156} hwc_color_t;
157
Mathias Agopian5d3de302010-08-05 15:24:35 -0700158typedef struct hwc_layer {
159 /*
Mathias Agopianeb8fb502012-02-03 15:54:11 -0800160 * initially set to HWC_FRAMEBUFFER or HWC_BACKGROUND.
161 * HWC_FRAMEBUFFER
162 * indicates the layer will be drawn into the framebuffer
163 * using OpenGL ES.
164 * The HWC can toggle this value to HWC_OVERLAY, to indicate
165 * it will handle the layer.
166 *
167 * HWC_BACKGROUND
168 * indicates this is a special "background" layer. The only valid
169 * field is backgroundColor. HWC_BACKGROUND can only be used with
170 * HWC_API_VERSION >= 0.2
171 * The HWC can toggle this value to HWC_FRAMEBUFFER, to indicate
172 * it CANNOT handle the background color
173 *
Mathias Agopian5d3de302010-08-05 15:24:35 -0700174 */
175 int32_t compositionType;
176
177 /* see hwc_layer_t::hints above */
178 uint32_t hints;
179
180 /* see hwc_layer_t::flags above */
181 uint32_t flags;
182
Mathias Agopianeb8fb502012-02-03 15:54:11 -0800183 union {
184 /* color of the background. hwc_color_t.a is ignored */
185 hwc_color_t backgroundColor;
Mathias Agopian5d3de302010-08-05 15:24:35 -0700186
Mathias Agopianeb8fb502012-02-03 15:54:11 -0800187 struct {
Mathias Agopian5d3de302010-08-05 15:24:35 -0700188
Mathias Agopianeb8fb502012-02-03 15:54:11 -0800189 /* handle of buffer to compose. This handle is guaranteed to have been
190 * allocated from gralloc using the GRALLOC_USAGE_HW_COMPOSER usage flag. If
191 * the layer's handle is unchanged across two consecutive prepare calls and
192 * the HWC_GEOMETRY_CHANGED flag is not set for the second call then the
193 * HWComposer implementation may assume that the contents of the buffer have
194 * not changed. */
195 buffer_handle_t handle;
Mathias Agopian5d3de302010-08-05 15:24:35 -0700196
Mathias Agopianeb8fb502012-02-03 15:54:11 -0800197 /* transformation to apply to the buffer during composition */
198 uint32_t transform;
Mathias Agopian5d3de302010-08-05 15:24:35 -0700199
Mathias Agopianeb8fb502012-02-03 15:54:11 -0800200 /* blending to apply during composition */
201 int32_t blending;
Mathias Agopian5d3de302010-08-05 15:24:35 -0700202
Mathias Agopianeb8fb502012-02-03 15:54:11 -0800203 /* area of the source to consider, the origin is the top-left corner of
204 * the buffer */
205 hwc_rect_t sourceCrop;
206
207 /* where to composite the sourceCrop onto the display. The sourceCrop
208 * is scaled using linear filtering to the displayFrame. The origin is the
209 * top-left corner of the screen.
210 */
211 hwc_rect_t displayFrame;
212
213 /* visible region in screen space. The origin is the
214 * top-left corner of the screen.
215 * The visible region INCLUDES areas overlapped by a translucent layer.
216 */
217 hwc_region_t visibleRegionScreen;
218 };
219 };
Mathias Agopian5d3de302010-08-05 15:24:35 -0700220} hwc_layer_t;
221
222
223/*
224 * hwc_layer_list_t::flags values
225 */
226enum {
227 /*
228 * HWC_GEOMETRY_CHANGED is set by SurfaceFlinger to indicate that the list
229 * passed to (*prepare)() has changed by more than just the buffer handles.
230 */
231 HWC_GEOMETRY_CHANGED = 0x00000001,
232};
233
Louis Huemiller871815b2010-10-25 17:00:52 -0700234/*
235 * List of layers.
236 * The handle members of hwLayers elements must be unique.
237 */
Mathias Agopian5d3de302010-08-05 15:24:35 -0700238typedef struct hwc_layer_list {
239 uint32_t flags;
240 size_t numHwLayers;
241 hwc_layer_t hwLayers[0];
242} hwc_layer_list_t;
243
244/* This represents a display, typically an EGLDisplay object */
245typedef void* hwc_display_t;
246
247/* This represents a surface, typically an EGLSurface object */
248typedef void* hwc_surface_t;
249
Mathias Agopian5d3de302010-08-05 15:24:35 -0700250
Mathias Agopiand6afef62011-08-01 16:34:42 -0700251/* see hwc_composer_device::registerProcs()
252 * Any of the callbacks can be NULL, in which case the corresponding
253 * functionality is not supported.
254 */
255typedef struct hwc_procs {
256 /*
257 * (*invalidate)() triggers a screen refresh, in particular prepare and set
258 * will be called shortly after this call is made. Note that there is
259 * NO GUARANTEE that the screen refresh will happen after invalidate()
260 * returns (in particular, it could happen before).
261 * invalidate() is GUARANTEED TO NOT CALL BACK into the h/w composer HAL and
262 * it is safe to call invalidate() from any of hwc_composer_device
263 * hooks, unless noted otherwise.
264 */
265 void (*invalidate)(struct hwc_procs* procs);
266} hwc_procs_t;
267
268
269/*****************************************************************************/
Mathias Agopian5d3de302010-08-05 15:24:35 -0700270
271typedef struct hwc_module {
272 struct hw_module_t common;
273} hwc_module_t;
274
275
276typedef struct hwc_composer_device {
277 struct hw_device_t common;
278
279 /*
280 * (*prepare)() is called for each frame before composition and is used by
281 * SurfaceFlinger to determine what composition steps the HWC can handle.
282 *
283 * (*prepare)() can be called more than once, the last call prevails.
284 *
285 * The HWC responds by setting the compositionType field to either
286 * HWC_FRAMEBUFFER or HWC_OVERLAY. In the former case, the composition for
287 * this layer is handled by SurfaceFlinger with OpenGL ES, in the later
288 * case, the HWC will have to handle this layer's composition.
289 *
290 * (*prepare)() is called with HWC_GEOMETRY_CHANGED to indicate that the
291 * list's geometry has changed, that is, when more than just the buffer's
292 * handles have been updated. Typically this happens (but is not limited to)
293 * when a window is added, removed, resized or moved.
294 *
295 * a NULL list parameter or a numHwLayers of zero indicates that the
296 * entire composition will be handled by SurfaceFlinger with OpenGL ES.
297 *
298 * returns: 0 on success. An negative error code on error. If an error is
299 * returned, SurfaceFlinger will assume that none of the layer will be
300 * handled by the HWC.
301 */
302 int (*prepare)(struct hwc_composer_device *dev, hwc_layer_list_t* list);
303
304
305 /*
306 * (*set)() is used in place of eglSwapBuffers(), and assumes the same
307 * functionality, except it also commits the work list atomically with
308 * the actual eglSwapBuffers().
309 *
310 * The list parameter is guaranteed to be the same as the one returned
311 * from the last call to (*prepare)().
312 *
313 * When this call returns the caller assumes that:
314 *
315 * - the display will be updated in the near future with the content
316 * of the work list, without artifacts during the transition from the
317 * previous frame.
318 *
319 * - all objects are available for immediate access or destruction, in
320 * particular, hwc_region_t::rects data and hwc_layer_t::layer's buffer.
321 * Note that this means that immediately accessing (potentially from a
322 * different process) a buffer used in this call will not result in
323 * screen corruption, the driver must apply proper synchronization or
324 * scheduling (eg: block the caller, such as gralloc_module_t::lock(),
325 * OpenGL ES, Camera, Codecs, etc..., or schedule the caller's work
326 * after the buffer is freed from the actual composition).
327 *
328 * a NULL list parameter or a numHwLayers of zero indicates that the
329 * entire composition has been handled by SurfaceFlinger with OpenGL ES.
330 * In this case, (*set)() behaves just like eglSwapBuffers().
331 *
Mathias Agopian71212e32011-11-21 17:35:15 -0800332 * dpy, sur, and list are set to NULL to indicate that the screen is
333 * turning off. This happens WITHOUT prepare() being called first.
334 * This is a good time to free h/w resources and/or power
335 * the relevant h/w blocks down.
336 *
Mathias Agopianfb410362011-11-15 21:27:52 -0800337 * IMPORTANT NOTE: there is an implicit layer containing opaque black
338 * pixels behind all the layers in the list.
339 * It is the responsibility of the hwcomposer module to make
340 * sure black pixels are output (or blended from).
341 *
Mathias Agopian5d3de302010-08-05 15:24:35 -0700342 * returns: 0 on success. An negative error code on error:
343 * HWC_EGL_ERROR: eglGetError() will provide the proper error code
344 * Another code for non EGL errors.
345 *
346 */
347 int (*set)(struct hwc_composer_device *dev,
348 hwc_display_t dpy,
349 hwc_surface_t sur,
350 hwc_layer_list_t* list);
Erik Gilling158549c2010-12-01 16:34:08 -0800351 /*
352 * This hook is OPTIONAL.
353 *
Mathias Agopiand6afef62011-08-01 16:34:42 -0700354 * If non NULL it will be called by SurfaceFlinger on dumpsys
Erik Gilling158549c2010-12-01 16:34:08 -0800355 */
356 void (*dump)(struct hwc_composer_device* dev, char *buff, int buff_len);
Mathias Agopian5d3de302010-08-05 15:24:35 -0700357
Mathias Agopiand6afef62011-08-01 16:34:42 -0700358 /*
359 * This hook is OPTIONAL.
360 *
361 * (*registerProcs)() registers a set of callbacks the h/w composer HAL
362 * can later use. It is FORBIDDEN to call any of the callbacks from
363 * within registerProcs(). registerProcs() must save the hwc_procs_t pointer
364 * which is needed when calling a registered callback.
365 * Each call to registerProcs replaces the previous set of callbacks.
366 * registerProcs is called with NULL to unregister all callbacks.
367 *
368 * Any of the callbacks can be NULL, in which case the corresponding
369 * functionality is not supported.
370 */
371 void (*registerProcs)(struct hwc_composer_device* dev,
372 hwc_procs_t const* procs);
373
Mathias Agopianeb8fb502012-02-03 15:54:11 -0800374 /*
375 * This hook is OPTIONAL.
376 *
377 * Used to retrieve information about the h/w composer
378 *
379 * Returns 0 on success or -errno on error.
380 */
381 int (*query)(struct hwc_composer_device* dev, int what, int* value);
382
383
384 void* reserved_proc[5];
Erik Gillinge9952042010-12-07 18:46:04 -0800385
Mathias Agopian5d3de302010-08-05 15:24:35 -0700386} hwc_composer_device_t;
387
388
389/** convenience API for opening and closing a device */
390
391static inline int hwc_open(const struct hw_module_t* module,
392 hwc_composer_device_t** device) {
393 return module->methods->open(module,
394 HWC_HARDWARE_COMPOSER, (struct hw_device_t**)device);
395}
396
397static inline int hwc_close(hwc_composer_device_t* device) {
398 return device->common.close(&device->common);
399}
400
401
402/*****************************************************************************/
403
404__END_DECLS
405
406#endif /* ANDROID_INCLUDE_HARDWARE_HWCOMPOSER_H */