OSDN Git Service

from codeaurora-Froyo-QSD-SSSS-7227
[gb-231r1-is01/GB_2.3_IS01.git] / hardware / libhardware / include / hardware / gralloc.h
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