OSDN Git Service

1e05150694d8b6ff98a06a53c507d9f77432ddb4
[android-x86/external-minigbm.git] / cros_gralloc / cros_gralloc_helpers.cc
1 /*
2  * Copyright 2016 The Chromium OS Authors. All rights reserved.
3  * Use of this source code is governed by a BSD-style license that can be
4  * found in the LICENSE file.
5  */
6
7 #include "cros_gralloc_helpers.h"
8
9 #include <sync/sync.h>
10
11 uint32_t cros_gralloc_convert_format(int format)
12 {
13         /*
14          * Conversion from HAL to fourcc-based DRV formats based on
15          * platform_android.c in mesa.
16          */
17
18         switch (format) {
19         case HAL_PIXEL_FORMAT_BGRA_8888:
20                 return DRM_FORMAT_ARGB8888;
21         case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
22                 return DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED;
23         case HAL_PIXEL_FORMAT_RAW16:
24                 return DRM_FORMAT_R16;
25         case HAL_PIXEL_FORMAT_RGB_565:
26                 return DRM_FORMAT_RGB565;
27         case HAL_PIXEL_FORMAT_RGB_888:
28                 return DRM_FORMAT_BGR888;
29         case HAL_PIXEL_FORMAT_RGBA_8888:
30                 return DRM_FORMAT_ABGR8888;
31         case HAL_PIXEL_FORMAT_RGBX_8888:
32                 return DRM_FORMAT_XBGR8888;
33         case HAL_PIXEL_FORMAT_YCbCr_420_888:
34                 return DRM_FORMAT_FLEX_YCbCr_420_888;
35         case HAL_PIXEL_FORMAT_YV12:
36                 return DRM_FORMAT_YVU420_ANDROID;
37         /*
38          * Choose DRM_FORMAT_R8 because <system/graphics.h> requires the buffers
39          * with a format HAL_PIXEL_FORMAT_BLOB have a height of 1, and width
40          * equal to their size in bytes.
41          */
42         case HAL_PIXEL_FORMAT_BLOB:
43                 return DRM_FORMAT_R8;
44 #if ANDROID_VERSION >= 0x0a00
45         case HAL_PIXEL_FORMAT_RGBA_1010102:
46                 return DRM_FORMAT_ABGR2101010;
47         case HAL_PIXEL_FORMAT_RGBA_FP16:
48                 return DRM_FORMAT_ABGR16161616F;
49 #endif
50         }
51
52         return DRM_FORMAT_NONE;
53 }
54
55 cros_gralloc_handle_t cros_gralloc_convert_handle(buffer_handle_t handle)
56 {
57         auto hnd = reinterpret_cast<cros_gralloc_handle_t>(handle);
58         if (!hnd || hnd->magic != cros_gralloc_magic)
59                 return nullptr;
60
61         return hnd;
62 }
63
64 int32_t cros_gralloc_sync_wait(int32_t fence, bool close_fence)
65 {
66         if (fence < 0)
67                 return 0;
68
69         /*
70          * Wait initially for 1000 ms, and then wait indefinitely. The SYNC_IOC_WAIT
71          * documentation states the caller waits indefinitely on the fence if timeout < 0.
72          */
73         int err = sync_wait(fence, 1000);
74         if (err < 0) {
75                 drv_log("Timed out on sync wait, err = %s\n", strerror(errno));
76                 err = sync_wait(fence, -1);
77                 if (err < 0) {
78                         drv_log("sync wait error = %s\n", strerror(errno));
79                         return -errno;
80                 }
81         }
82
83         if (close_fence) {
84                 err = close(fence);
85                 if (err) {
86                         drv_log("Unable to close fence fd, err = %s\n", strerror(errno));
87                         return -errno;
88                 }
89         }
90
91         return 0;
92 }