1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_UI_BUFFER_MAPPER_H
18 #define ANDROID_UI_BUFFER_MAPPER_H
19 
20 #include <stdint.h>
21 #include <sys/types.h>
22 
23 #include <memory>
24 
25 #include <ui/PixelFormat.h>
26 #include <utils/Singleton.h>
27 
28 
29 // Needed by code that still uses the GRALLOC_USAGE_* constants.
30 // when/if we get rid of gralloc, we should provide aliases or fix call sites.
31 #include <hardware/gralloc.h>
32 
33 
34 namespace android {
35 
36 // ---------------------------------------------------------------------------
37 
38 class GrallocMapper;
39 class Rect;
40 
41 class GraphicBufferMapper : public Singleton<GraphicBufferMapper>
42 {
43 public:
44     enum Version {
45         GRALLOC_2,
46         GRALLOC_3,
47     };
48     static void preloadHal();
get()49     static inline GraphicBufferMapper& get() { return getInstance(); }
50 
51     // The imported outHandle must be freed with freeBuffer when no longer
52     // needed. rawHandle is owned by the caller.
53     status_t importBuffer(buffer_handle_t rawHandle,
54             uint32_t width, uint32_t height, uint32_t layerCount,
55             PixelFormat format, uint64_t usage, uint32_t stride,
56             buffer_handle_t* outHandle);
57 
58     status_t freeBuffer(buffer_handle_t handle);
59 
60     void getTransportSize(buffer_handle_t handle,
61             uint32_t* outTransportNumFds, uint32_t* outTransportNumInts);
62 
63     status_t lock(buffer_handle_t handle, uint32_t usage, const Rect& bounds, void** vaddr,
64                   int32_t* outBytesPerPixel = nullptr, int32_t* outBytesPerStride = nullptr);
65 
66     status_t lockYCbCr(buffer_handle_t handle,
67             uint32_t usage, const Rect& bounds, android_ycbcr *ycbcr);
68 
69     status_t unlock(buffer_handle_t handle);
70 
71     status_t lockAsync(buffer_handle_t handle, uint32_t usage, const Rect& bounds, void** vaddr,
72                        int fenceFd, int32_t* outBytesPerPixel = nullptr,
73                        int32_t* outBytesPerStride = nullptr);
74 
75     status_t lockAsync(buffer_handle_t handle, uint64_t producerUsage, uint64_t consumerUsage,
76                        const Rect& bounds, void** vaddr, int fenceFd,
77                        int32_t* outBytesPerPixel = nullptr, int32_t* outBytesPerStride = nullptr);
78 
79     status_t lockAsyncYCbCr(buffer_handle_t handle,
80             uint32_t usage, const Rect& bounds, android_ycbcr *ycbcr,
81             int fenceFd);
82 
83     status_t unlockAsync(buffer_handle_t handle, int *fenceFd);
84 
85     status_t isSupported(uint32_t width, uint32_t height, android::PixelFormat format,
86                          uint32_t layerCount, uint64_t usage, bool* outSupported);
87 
getGrallocMapper()88     const GrallocMapper& getGrallocMapper() const {
89         return reinterpret_cast<const GrallocMapper&>(*mMapper);
90     }
91 
getMapperVersion()92     Version getMapperVersion() const { return mMapperVersion; }
93 
94 private:
95     friend class Singleton<GraphicBufferMapper>;
96 
97     GraphicBufferMapper();
98 
99     std::unique_ptr<const GrallocMapper> mMapper;
100 
101     Version mMapperVersion;
102 };
103 
104 // ---------------------------------------------------------------------------
105 
106 }; // namespace android
107 
108 #endif // ANDROID_UI_BUFFER_MAPPER_H
109 
110