blob: cf3787bb542cf6c9b91c59ee02196966ebc564ef [file] [log] [blame]
Dima Zavin6198e542012-02-29 17:02:46 -08001/*
2 * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
3 *
4 * Copyright (C) 2008 The Android Open Source Project
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19#ifndef GRALLOC_PRIV_H_
20#define GRALLOC_PRIV_H_
21
22#include <stdint.h>
23#include <pthread.h>
24#include <errno.h>
25#include <linux/fb.h>
26
27#include <hardware/gralloc.h>
28#include <cutils/native_handle.h>
29
30#include "ump.h"
31
Dima Zavina9301d12012-03-01 10:22:09 -080032/* UGH.. HACK */
33enum {
34 GRALLOC_USAGE_HW_FIMC1 = 0x01000000,
35 GRALLOC_USAGE_HW_ION = 0x02000000,
36 GRALLOC_USAGE_YUV_ADDR = 0x04000000,
37 /* SEC Private usage , for Overlay path at HWC */
38 GRALLOC_USAGE_HWC_HWOVERLAY = 0x20000000,
39
40 /* SEC Private usage , for HWC to set HDMI S3D format */
41 /* HDMI should display this buffer as S3D SBS LR/RL*/
42 GRALLOC_USAGE_PRIVATE_SBS_LR = 0x00400000,
43 GRALLOC_USAGE_PRIVATE_SBS_RL = 0x00200000,
44 /* HDMI should display this buffer as 3D TB LR/RL*/
45 GRALLOC_USAGE_PRIVATE_TB_LR = 0x00100000,
46 GRALLOC_USAGE_PRIVATE_TB_RL = 0x00080000,
47};
48
Dima Zavin6198e542012-02-29 17:02:46 -080049/*
50 * HWC_HWOVERLAY is flag for location of glFinish().
51 * Enable this define if you want that glFinish() is in HWComposer.
52 * If you disable this define, glFinish() is called in threadloop().
53 */
54#define HWC_HWOVERLAY 1
55
56#define GRALLOC_ARM_UMP_MODULE 1
57
58struct private_handle_t;
59
60struct private_module_t
61{
62 gralloc_module_t base;
63
64 private_handle_t* framebuffer;
65 uint32_t flags;
66 uint32_t numBuffers;
67 uint32_t bufferMask;
68 pthread_mutex_t lock;
69 buffer_handle_t currentBuffer;
70 int ion_client;
71
72 struct fb_var_screeninfo info;
73 struct fb_fix_screeninfo finfo;
74 float xdpi;
75 float ydpi;
76 float fps;
77
78 enum {
79 PRIV_USAGE_LOCKED_FOR_POST = 0x80000000
80 };
81};
82
83#ifdef __cplusplus
84struct private_handle_t : public native_handle
85{
86#else
87struct private_handle_t
88{
89 struct native_handle nativeHandle;
90#endif
91
92 enum {
93 PRIV_FLAGS_FRAMEBUFFER = 0x00000001,
94 PRIV_FLAGS_USES_UMP = 0x00000002,
95 PRIV_FLAGS_USES_ION = 0x00000020,
96 };
97
98 enum {
99 LOCK_STATE_WRITE = 1<<31,
100 LOCK_STATE_MAPPED = 1<<30,
101 LOCK_STATE_READ_MASK = 0x3FFFFFFF
102 };
103
104 // Following member is for ION memory only
105 int fd;
106 int magic;
107 int flags;
108 int size;
109 int base;
110 int lockState;
111 int writeOwner;
112 int pid;
113
114 // Following members are for UMP memory only
115 ump_secure_id ump_id;
116 ump_handle ump_mem_handle;
117
118 // Following members is for framebuffer only
119 int offset;
120 int paddr;
121
122 int format;
123 int usage;
124 int width;
125 int height;
126 int bpp;
127 int stride;
128
129 /* Following members are for YUV information */
130 unsigned int yaddr;
131 unsigned int uoffset;
132 unsigned int voffset;
133 int ion_client;
134
135#ifdef __cplusplus
136 static const int sNumInts = 21;
137 static const int sNumFds = 1;
138 static const int sMagic = 0x3141592;
139 private_handle_t(int flags, int size, int base, int lock_state, ump_secure_id secure_id, ump_handle handle):
140 magic(sMagic),
141 flags(flags),
142 size(size),
143 base(base),
144 lockState(lock_state),
145 writeOwner(0),
146 pid(getpid()),
147 ump_id(secure_id),
148 ump_mem_handle(handle),
149 fd(0),
150 format(0),
151 usage(0),
152 width(0),
153 height(0),
154 bpp(0),
155 stride(0),
156 yaddr(0),
157 uoffset(0),
158 voffset(0),
159 offset(0)
160 {
161 version = sizeof(native_handle);
162 numFds = sNumFds;
163 numInts = sNumInts;
164 }
165
166 private_handle_t(int flags, int size, int base, int lock_state, int fb_file, int fb_offset):
167 magic(sMagic),
168 flags(flags),
169 size(size),
170 base(base),
171 lockState(lock_state),
172 writeOwner(0),
173 pid(getpid()),
174 ump_id(UMP_INVALID_SECURE_ID),
175 ump_mem_handle(UMP_INVALID_MEMORY_HANDLE),
176 fd(fb_file),
177 format(0),
178 usage(0),
179 width(0),
180 height(0),
181 bpp(0),
182 stride(0),
183 yaddr(0),
184 uoffset(0),
185 voffset(0),
186 offset(fb_offset)
187 {
188 version = sizeof(native_handle);
189 numFds = sNumFds;
190 numInts = sNumInts;
191 }
192
193 ~private_handle_t()
194 {
195 magic = 0;
196 }
197
198 bool usesPhysicallyContiguousMemory()
199 {
200 return (flags & PRIV_FLAGS_FRAMEBUFFER) ? true : false;
201 }
202
203 static int validate(const native_handle* h)
204 {
205 const private_handle_t* hnd = (const private_handle_t*)h;
206
207 if (!h || h->version != sizeof(native_handle) ||
208 h->numInts != sNumInts ||
209 h->numFds != sNumFds ||
210 hnd->magic != sMagic)
211 return -EINVAL;
212
213 return 0;
214 }
215
216 static private_handle_t* dynamicCast(const native_handle* in)
217 {
218 if (validate(in) == 0)
219 return (private_handle_t*) in;
220
221 return NULL;
222 }
223#endif
224};
225
226#endif /* GRALLOC_PRIV_H_ */