OSDN Git Service

minigbm: add support for BG24
[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_RGB_565:
24                 return DRM_FORMAT_RGB565;
25         case HAL_PIXEL_FORMAT_RGB_888:
26                 return DRM_FORMAT_BGR888;
27         case HAL_PIXEL_FORMAT_RGBA_8888:
28                 return DRM_FORMAT_ABGR8888;
29         case HAL_PIXEL_FORMAT_RGBX_8888:
30                 return DRM_FORMAT_XBGR8888;
31         case HAL_PIXEL_FORMAT_YCbCr_420_888:
32                 return DRM_FORMAT_FLEX_YCbCr_420_888;
33         case HAL_PIXEL_FORMAT_YV12:
34                 return DRM_FORMAT_YVU420_ANDROID;
35         /*
36          * Choose DRM_FORMAT_R8 because <system/graphics.h> requires the buffers
37          * with a format HAL_PIXEL_FORMAT_BLOB have a height of 1, and width
38          * equal to their size in bytes.
39          */
40         case HAL_PIXEL_FORMAT_BLOB:
41                 return DRM_FORMAT_R8;
42         }
43
44         return DRM_FORMAT_NONE;
45 }
46
47 cros_gralloc_handle_t cros_gralloc_convert_handle(buffer_handle_t handle)
48 {
49         auto hnd = reinterpret_cast<cros_gralloc_handle_t>(handle);
50         if (!hnd || hnd->magic != cros_gralloc_magic)
51                 return nullptr;
52
53         return hnd;
54 }
55
56 int32_t cros_gralloc_sync_wait(int32_t acquire_fence)
57 {
58         if (acquire_fence < 0)
59                 return 0;
60
61         /*
62          * Wait initially for 1000 ms, and then wait indefinitely. The SYNC_IOC_WAIT
63          * documentation states the caller waits indefinitely on the fence if timeout < 0.
64          */
65         int err = sync_wait(acquire_fence, 1000);
66         if (err < 0) {
67                 drv_log("Timed out on sync wait, err = %s\n", strerror(errno));
68                 err = sync_wait(acquire_fence, -1);
69                 if (err < 0) {
70                         drv_log("sync wait error = %s\n", strerror(errno));
71                         return -errno;
72                 }
73         }
74
75         err = close(acquire_fence);
76         if (err) {
77                 drv_log("Unable to close fence fd, err = %s\n", strerror(errno));
78                 return -errno;
79         }
80
81         return 0;
82 }