3 // Copyright (c) 2017 Intel Corporation
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 #ifndef OS_UTILS_ANDROID_H_
19 #define OS_UTILS_ANDROID_H_
21 #include <xf86drmMode.h>
25 #include <drm_fourcc.h>
26 #include <system/graphics.h>
28 #include "platformdefines.h"
31 #include <cros_gralloc_handle.h>
32 #include <cros_gralloc_helpers.h>
36 #include "hwcbuffer.h"
39 #define HWC_UNUSED(x) ((void)&(x))
45 #define DRV_MAX_PLANES 4
47 // Conversion from HAL to fourcc-based DRM formats
48 static uint32_t GetDrmFormatFromHALFormat(int format) {
50 case HAL_PIXEL_FORMAT_RGBA_8888:
51 return DRM_FORMAT_BGRA8888;
52 case HAL_PIXEL_FORMAT_RGBX_8888:
53 return DRM_FORMAT_BGRX8888;
54 case HAL_PIXEL_FORMAT_RGB_888:
55 return DRM_FORMAT_BGR888;
56 case HAL_PIXEL_FORMAT_RGB_565:
57 return DRM_FORMAT_BGR565;
58 case HAL_PIXEL_FORMAT_BGRA_8888:
59 return DRM_FORMAT_ARGB8888;
60 case HAL_PIXEL_FORMAT_YV12:
61 return DRM_FORMAT_YVU420;
66 return DRM_FORMAT_NONE;
69 static uint32_t DrmFormatToHALFormat(int format) {
71 case DRM_FORMAT_BGRA8888:
72 return HAL_PIXEL_FORMAT_RGBA_8888;
73 case DRM_FORMAT_BGRX8888:
74 return HAL_PIXEL_FORMAT_RGBX_8888;
75 case DRM_FORMAT_BGR888:
76 return HAL_PIXEL_FORMAT_RGB_888;
77 case DRM_FORMAT_BGR565:
78 return HAL_PIXEL_FORMAT_RGB_565;
79 case DRM_FORMAT_ARGB8888:
80 return HAL_PIXEL_FORMAT_BGRA_8888;
81 case DRM_FORMAT_YVU420:
82 return HAL_PIXEL_FORMAT_YV12;
84 return HAL_PIXEL_FORMAT_BLOB;
87 return HAL_PIXEL_FORMAT_Y16;
88 case DRM_FORMAT_RGB332: //('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */
90 case DRM_FORMAT_BGR233: //('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */
93 case DRM_FORMAT_XRGB4444:
94 case DRM_FORMAT_XBGR4444:
95 case DRM_FORMAT_RGBX4444:
96 case DRM_FORMAT_BGRX4444:
97 case DRM_FORMAT_ARGB4444:
98 case DRM_FORMAT_ABGR4444:
99 case DRM_FORMAT_RGBA4444:
100 case DRM_FORMAT_BGRA4444:
102 case DRM_FORMAT_XRGB1555:
103 case DRM_FORMAT_XBGR1555:
104 case DRM_FORMAT_RGBX5551:
105 case DRM_FORMAT_BGRX5551:
106 case DRM_FORMAT_ARGB1555:
107 case DRM_FORMAT_ABGR1555:
108 case DRM_FORMAT_RGBA5551:
109 case DRM_FORMAT_BGRA5551:
111 case DRM_FORMAT_RGB565:
112 return HAL_PIXEL_FORMAT_RGB_565;
113 case DRM_FORMAT_RGB888:
114 return HAL_PIXEL_FORMAT_RGB_888;
115 case DRM_FORMAT_XRGB8888:
116 case DRM_FORMAT_XBGR8888:
117 case DRM_FORMAT_RGBX8888:
118 case DRM_FORMAT_ABGR8888:
119 case DRM_FORMAT_RGBA8888:
121 case DRM_FORMAT_XRGB2101010:
122 case DRM_FORMAT_XBGR2101010:
123 case DRM_FORMAT_RGBX1010102:
124 case DRM_FORMAT_BGRX1010102:
125 case DRM_FORMAT_ARGB2101010:
126 case DRM_FORMAT_ABGR2101010:
127 case DRM_FORMAT_RGBA1010102:
128 case DRM_FORMAT_BGRA1010102:
130 case DRM_FORMAT_YUYV:
131 return HAL_PIXEL_FORMAT_YCbCr_422_I;
132 case DRM_FORMAT_YVYU:
133 case DRM_FORMAT_UYVY:
134 case DRM_FORMAT_VYUY:
135 case DRM_FORMAT_AYUV:
138 case DRM_FORMAT_NV12:
139 return HAL_PIXEL_FORMAT_NV12;
141 case DRM_FORMAT_NV21:
142 return HAL_PIXEL_FORMAT_YCrCb_420_SP;
143 case DRM_FORMAT_NV16:
144 return HAL_PIXEL_FORMAT_YCbCr_422_SP;
145 case DRM_FORMAT_NV61:
146 case DRM_FORMAT_YUV410:
147 case DRM_FORMAT_YVU410:
148 case DRM_FORMAT_YUV411:
149 case DRM_FORMAT_YVU411:
151 case DRM_FORMAT_YUV420:
152 return HAL_PIXEL_FORMAT_YCbCr_420_888;
153 case DRM_FORMAT_YVU420_ANDROID:
154 return HAL_PIXEL_FORMAT_YV12;
155 case DRM_FORMAT_YUV422:
156 return HAL_PIXEL_FORMAT_YCbCr_422_888;
157 case DRM_FORMAT_YVU422:
159 case DRM_FORMAT_YUV444:
160 return HAL_PIXEL_FORMAT_YCbCr_444_888;
161 case DRM_FORMAT_YVU444:
164 case DRM_FORMAT_NV12_Y_TILED_INTEL:
165 return HAL_PIXEL_FORMAT_NV12_Y_TILED_INTEL;
167 case DRM_FORMAT_P010:
168 return HAL_PIXEL_FORMAT_P010_INTEL;
174 return DRM_FORMAT_NONE;
177 static native_handle_t *dup_buffer_handle(buffer_handle_t handle) {
178 native_handle_t *new_handle =
179 native_handle_create(handle->numFds, handle->numInts);
180 if (new_handle == NULL)
183 const int *old_data = handle->data;
184 int *new_data = new_handle->data;
185 for (int i = 0; i < handle->numFds; i++) {
186 *new_data = dup(*old_data);
190 memcpy(new_data, old_data, sizeof(int) * handle->numInts);
195 static void free_buffer_handle(native_handle_t *handle) {
196 int ret = native_handle_close(handle);
198 ETRACE("Failed to close native handle %d", ret);
199 ret = native_handle_delete(handle);
201 ETRACE("Failed to delete native handle %d", ret);
204 static void CopyBufferHandle(HWCNativeHandle source, HWCNativeHandle *target) {
205 struct gralloc_handle *temp = new struct gralloc_handle();
206 temp->handle_ = source->handle_;
207 temp->buffer_ = source->buffer_;
208 temp->imported_handle_ = dup_buffer_handle(source->handle_);
209 temp->hwc_buffer_ = source->hwc_buffer_;
213 static void DestroyBufferHandle(HWCNativeHandle handle) {
214 if (handle->imported_handle_)
215 free_buffer_handle(handle->imported_handle_);
221 static bool CreateGraphicsBuffer(uint32_t w, uint32_t h, int format,
222 HWCNativeHandle *handle, uint32_t layer_type) {
223 struct gralloc_handle *temp = new struct gralloc_handle();
225 uint32_t pixel_format = 0;
227 pixel_format = DrmFormatToHALFormat(format);
230 if (pixel_format == 0) {
231 pixel_format = android::PIXEL_FORMAT_RGBA_8888;
234 if (layer_type == hwcomposer::kLayerNormal) {
235 usage |= GRALLOC_USAGE_HW_FB | GRALLOC_USAGE_HW_RENDER |
236 GRALLOC_USAGE_HW_COMPOSER;
237 } else if (layer_type == hwcomposer::kLayerVideo) {
238 switch (pixel_format) {
239 case HAL_PIXEL_FORMAT_YCbCr_422_I:
240 case HAL_PIXEL_FORMAT_Y8:
241 usage |= GRALLOC_USAGE_HW_TEXTURE;
244 usage |= GRALLOC_USAGE_HW_CAMERA_WRITE | GRALLOC_USAGE_HW_CAMERA_READ |
245 GRALLOC_USAGE_HW_TEXTURE;
247 } else if (layer_type == hwcomposer::kLayerCursor) {
248 usage |= GRALLOC_USAGE_CURSOR;
251 temp->buffer_ = new android::GraphicBuffer(w, h, pixel_format, usage);
252 temp->handle_ = temp->buffer_->handle;
253 temp->hwc_buffer_ = true;
259 static bool ReleaseGraphicsBuffer(HWCNativeHandle handle, int fd) {
263 if (handle->buffer_.get() && handle->hwc_buffer_) {
264 handle->buffer_.clear();
267 if (handle->gem_handle_ > 0) {
268 struct drm_gem_close gem_close;
269 memset(&gem_close, 0, sizeof(gem_close));
270 gem_close.handle = handle->gem_handle_;
271 int ret = drmIoctl(fd, DRM_IOCTL_GEM_CLOSE, &gem_close);
273 ETRACE("Failed to close gem handle %d", ret);
276 handle->gem_handle_ = 0;
281 static bool ImportGraphicsBuffer(HWCNativeHandle handle, HwcBuffer *bo,
283 auto gr_handle = (struct cros_gralloc_handle *)handle->imported_handle_;
284 memset(bo, 0, sizeof(struct HwcBuffer));
285 bo->format = gr_handle->format;
286 bo->width = gr_handle->width;
287 bo->height = gr_handle->height;
288 bo->prime_fd = gr_handle->fds[0];
291 if (drmPrimeFDToHandle(fd, bo->prime_fd, &id)) {
292 ETRACE("drmPrimeFDToHandle failed. %s", PRINTERROR());
296 for (size_t p = 0; p < DRV_MAX_PLANES; p++) {
297 bo->offsets[p] = gr_handle->offsets[p];
298 bo->pitches[p] = gr_handle->strides[p];
299 bo->gem_handles[p] = id;
302 if (gr_handle->usage & GRALLOC_USAGE_PROTECTED) {
303 bo->usage |= hwcomposer::kLayerProtected;
304 } else if (gr_handle->usage & GRALLOC_USAGE_CURSOR) {
305 bo->usage |= hwcomposer::kLayerCursor;
306 // We support DRM_FORMAT_ARGB8888 for cursor.
307 bo->format = DRM_FORMAT_ARGB8888;
309 bo->usage |= hwcomposer::kLayerNormal;
312 handle->gem_handle_ = id;
314 // switch minigbm specific enum to a standard one
315 if (bo->format == DRM_FORMAT_YVU420_ANDROID)
316 bo->format = DRM_FORMAT_YVU420;