|
41 | 41 |
|
42 | 42 | #include <system/graphics.h> |
43 | 43 |
|
| 44 | +using unique_fd = ::android::base::unique_fd; |
| 45 | + |
44 | 46 | namespace android { |
45 | 47 | // --------------------------------------------------------------------------- |
46 | 48 |
|
| 49 | +using LockResult = GraphicBufferMapper::LockResult; |
| 50 | + |
47 | 51 | ANDROID_SINGLETON_STATIC_INSTANCE( GraphicBufferMapper ) |
48 | 52 |
|
49 | 53 | void GraphicBufferMapper::preloadHal() { |
@@ -135,63 +139,86 @@ status_t GraphicBufferMapper::freeBuffer(buffer_handle_t handle) |
135 | 139 | return NO_ERROR; |
136 | 140 | } |
137 | 141 |
|
138 | | -status_t GraphicBufferMapper::lock(buffer_handle_t handle, uint32_t usage, const Rect& bounds, |
139 | | - void** vaddr, int32_t* outBytesPerPixel, |
140 | | - int32_t* outBytesPerStride) { |
141 | | - return lockAsync(handle, usage, bounds, vaddr, -1, outBytesPerPixel, outBytesPerStride); |
142 | | -} |
143 | | - |
144 | | -status_t GraphicBufferMapper::lockYCbCr(buffer_handle_t handle, uint32_t usage, |
145 | | - const Rect& bounds, android_ycbcr *ycbcr) |
146 | | -{ |
147 | | - return lockAsyncYCbCr(handle, usage, bounds, ycbcr, -1); |
148 | | -} |
| 142 | +ui::Result<LockResult> GraphicBufferMapper::lock(buffer_handle_t handle, int64_t usage, |
| 143 | + const Rect& bounds, unique_fd&& acquireFence) { |
| 144 | + ATRACE_CALL(); |
149 | 145 |
|
150 | | -status_t GraphicBufferMapper::unlock(buffer_handle_t handle) |
151 | | -{ |
152 | | - int32_t fenceFd = -1; |
153 | | - status_t error = unlockAsync(handle, &fenceFd); |
154 | | - if (error == NO_ERROR && fenceFd >= 0) { |
155 | | - sync_wait(fenceFd, -1); |
156 | | - close(fenceFd); |
| 146 | + LockResult result; |
| 147 | + status_t status = mMapper->lock(handle, usage, bounds, acquireFence.release(), &result.address, |
| 148 | + &result.bytesPerPixel, &result.bytesPerStride); |
| 149 | + if (status != OK) { |
| 150 | + return base::unexpected(ui::Error::statusToCode(status)); |
| 151 | + } else { |
| 152 | + return result; |
157 | 153 | } |
158 | | - return error; |
159 | | -} |
160 | | - |
161 | | -status_t GraphicBufferMapper::lockAsync(buffer_handle_t handle, uint32_t usage, const Rect& bounds, |
162 | | - void** vaddr, int fenceFd, int32_t* outBytesPerPixel, |
163 | | - int32_t* outBytesPerStride) { |
164 | | - return lockAsync(handle, usage, usage, bounds, vaddr, fenceFd, outBytesPerPixel, |
165 | | - outBytesPerStride); |
166 | 154 | } |
167 | 155 |
|
168 | | -status_t GraphicBufferMapper::lockAsync(buffer_handle_t handle, uint64_t producerUsage, |
169 | | - uint64_t consumerUsage, const Rect& bounds, void** vaddr, |
170 | | - int fenceFd, int32_t* outBytesPerPixel, |
171 | | - int32_t* outBytesPerStride) { |
| 156 | +ui::Result<android_ycbcr> GraphicBufferMapper::lockYCbCr(buffer_handle_t handle, int64_t usage, |
| 157 | + const Rect& bounds, |
| 158 | + base::unique_fd&& acquireFence) { |
172 | 159 | ATRACE_CALL(); |
173 | 160 |
|
174 | | - const uint64_t usage = static_cast<uint64_t>( |
175 | | - android_convertGralloc1To0Usage(producerUsage, consumerUsage)); |
176 | | - return mMapper->lock(handle, usage, bounds, fenceFd, vaddr, outBytesPerPixel, |
177 | | - outBytesPerStride); |
| 161 | + android_ycbcr result = {}; |
| 162 | + status_t status = mMapper->lock(handle, usage, bounds, acquireFence.release(), &result); |
| 163 | + if (status != OK) { |
| 164 | + return base::unexpected(ui::Error::statusToCode(status)); |
| 165 | + } else { |
| 166 | + return result; |
| 167 | + } |
178 | 168 | } |
179 | 169 |
|
180 | | -status_t GraphicBufferMapper::lockAsyncYCbCr(buffer_handle_t handle, |
181 | | - uint32_t usage, const Rect& bounds, android_ycbcr *ycbcr, int fenceFd) |
182 | | -{ |
| 170 | +status_t GraphicBufferMapper::unlock(buffer_handle_t handle, base::unique_fd* outFence) { |
183 | 171 | ATRACE_CALL(); |
| 172 | + int fence = mMapper->unlock(handle); |
| 173 | + if (outFence) { |
| 174 | + *outFence = unique_fd{fence}; |
| 175 | + } else { |
| 176 | + sync_wait(fence, -1); |
| 177 | + close(fence); |
| 178 | + } |
| 179 | + return OK; |
| 180 | +} |
184 | 181 |
|
185 | | - return mMapper->lock(handle, usage, bounds, fenceFd, ycbcr); |
| 182 | +status_t GraphicBufferMapper::lock(buffer_handle_t handle, uint32_t usage, const Rect& bounds, |
| 183 | + void** vaddr) { |
| 184 | + auto result = lock(handle, static_cast<int64_t>(usage), bounds); |
| 185 | + if (!result.has_value()) return result.asStatus(); |
| 186 | + auto val = result.value(); |
| 187 | + *vaddr = val.address; |
| 188 | + return OK; |
186 | 189 | } |
187 | 190 |
|
188 | | -status_t GraphicBufferMapper::unlockAsync(buffer_handle_t handle, int *fenceFd) |
189 | | -{ |
190 | | - ATRACE_CALL(); |
| 191 | +status_t GraphicBufferMapper::lockYCbCr(buffer_handle_t handle, uint32_t usage, const Rect& bounds, |
| 192 | + android_ycbcr* ycbcr) { |
| 193 | + auto result = lockYCbCr(handle, static_cast<int64_t>(usage), bounds); |
| 194 | + if (!result.has_value()) return result.asStatus(); |
| 195 | + *ycbcr = result.value(); |
| 196 | + return OK; |
| 197 | +} |
| 198 | + |
| 199 | +status_t GraphicBufferMapper::lockAsync(buffer_handle_t handle, uint32_t usage, const Rect& bounds, |
| 200 | + void** vaddr, int fenceFd) { |
| 201 | + auto result = lock(handle, static_cast<int64_t>(usage), bounds, unique_fd{fenceFd}); |
| 202 | + if (!result.has_value()) return result.asStatus(); |
| 203 | + auto val = result.value(); |
| 204 | + *vaddr = val.address; |
| 205 | + return OK; |
| 206 | +} |
191 | 207 |
|
192 | | - *fenceFd = mMapper->unlock(handle); |
| 208 | +status_t GraphicBufferMapper::lockAsync(buffer_handle_t handle, uint64_t producerUsage, |
| 209 | + uint64_t consumerUsage, const Rect& bounds, void** vaddr, |
| 210 | + int fenceFd) { |
| 211 | + return lockAsync(handle, android_convertGralloc1To0Usage(producerUsage, consumerUsage), bounds, |
| 212 | + vaddr, fenceFd); |
| 213 | +} |
193 | 214 |
|
194 | | - return NO_ERROR; |
| 215 | +status_t GraphicBufferMapper::lockAsyncYCbCr(buffer_handle_t handle, uint32_t usage, |
| 216 | + const Rect& bounds, android_ycbcr* ycbcr, |
| 217 | + int fenceFd) { |
| 218 | + auto result = lockYCbCr(handle, static_cast<int64_t>(usage), bounds, unique_fd{fenceFd}); |
| 219 | + if (!result.has_value()) return result.asStatus(); |
| 220 | + *ycbcr = result.value(); |
| 221 | + return OK; |
195 | 222 | } |
196 | 223 |
|
197 | 224 | status_t GraphicBufferMapper::isSupported(uint32_t width, uint32_t height, |
@@ -287,6 +314,17 @@ status_t GraphicBufferMapper::getPlaneLayouts(buffer_handle_t bufferHandle, |
287 | 314 | return mMapper->getPlaneLayouts(bufferHandle, outPlaneLayouts); |
288 | 315 | } |
289 | 316 |
|
| 317 | +ui::Result<std::vector<ui::PlaneLayout>> GraphicBufferMapper::getPlaneLayouts( |
| 318 | + buffer_handle_t bufferHandle) { |
| 319 | + std::vector<ui::PlaneLayout> temp; |
| 320 | + status_t status = mMapper->getPlaneLayouts(bufferHandle, &temp); |
| 321 | + if (status == OK) { |
| 322 | + return std::move(temp); |
| 323 | + } else { |
| 324 | + return base::unexpected(ui::Error::statusToCode(status)); |
| 325 | + } |
| 326 | +} |
| 327 | + |
290 | 328 | status_t GraphicBufferMapper::getDataspace(buffer_handle_t bufferHandle, |
291 | 329 | ui::Dataspace* outDataspace) { |
292 | 330 | return mMapper->getDataspace(bufferHandle, outDataspace); |
|
0 commit comments