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_GRAPHIC_BUFFER_H
18 #define ANDROID_GRAPHIC_BUFFER_H
19 
20 #include <stdint.h>
21 #include <sys/types.h>
22 
23 #include <ui/ANativeObjectBase.h>
24 #include <ui/PixelFormat.h>
25 #include <ui/Rect.h>
26 #include <utils/Flattenable.h>
27 #include <utils/RefBase.h>
28 
29 
30 struct ANativeWindowBuffer;
31 
32 namespace android {
33 
34 class GraphicBufferMapper;
35 
36 // ===========================================================================
37 // GraphicBuffer
38 // ===========================================================================
39 
40 class GraphicBuffer
41     : public ANativeObjectBase< ANativeWindowBuffer, GraphicBuffer, RefBase >,
42       public Flattenable<GraphicBuffer>
43 {
44     friend class Flattenable<GraphicBuffer>;
45 public:
46 
47     enum {
48         USAGE_SW_READ_NEVER     = GRALLOC_USAGE_SW_READ_NEVER,
49         USAGE_SW_READ_RARELY    = GRALLOC_USAGE_SW_READ_RARELY,
50         USAGE_SW_READ_OFTEN     = GRALLOC_USAGE_SW_READ_OFTEN,
51         USAGE_SW_READ_MASK      = GRALLOC_USAGE_SW_READ_MASK,
52 
53         USAGE_SW_WRITE_NEVER    = GRALLOC_USAGE_SW_WRITE_NEVER,
54         USAGE_SW_WRITE_RARELY   = GRALLOC_USAGE_SW_WRITE_RARELY,
55         USAGE_SW_WRITE_OFTEN    = GRALLOC_USAGE_SW_WRITE_OFTEN,
56         USAGE_SW_WRITE_MASK     = GRALLOC_USAGE_SW_WRITE_MASK,
57 
58         USAGE_SOFTWARE_MASK     = USAGE_SW_READ_MASK|USAGE_SW_WRITE_MASK,
59 
60         USAGE_PROTECTED         = GRALLOC_USAGE_PROTECTED,
61 
62         USAGE_HW_TEXTURE        = GRALLOC_USAGE_HW_TEXTURE,
63         USAGE_HW_RENDER         = GRALLOC_USAGE_HW_RENDER,
64         USAGE_HW_2D             = GRALLOC_USAGE_HW_2D,
65         USAGE_HW_COMPOSER       = GRALLOC_USAGE_HW_COMPOSER,
66         USAGE_HW_VIDEO_ENCODER  = GRALLOC_USAGE_HW_VIDEO_ENCODER,
67         USAGE_HW_MASK           = GRALLOC_USAGE_HW_MASK,
68 
69         USAGE_CURSOR            = GRALLOC_USAGE_CURSOR,
70     };
71 
72     GraphicBuffer();
73 
74     // creates w * h buffer
75     GraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,
76             uint32_t inUsage);
77 
78     // create a buffer from an existing handle
79     GraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,
80             uint32_t inUsage, uint32_t inStride, native_handle_t* inHandle,
81             bool keepOwnership);
82 
83     // create a buffer from an existing ANativeWindowBuffer
84     GraphicBuffer(ANativeWindowBuffer* buffer, bool keepOwnership);
85 
86     // return status
87     status_t initCheck() const;
88 
getWidth()89     uint32_t getWidth() const           { return static_cast<uint32_t>(width); }
getHeight()90     uint32_t getHeight() const          { return static_cast<uint32_t>(height); }
getStride()91     uint32_t getStride() const          { return static_cast<uint32_t>(stride); }
getUsage()92     uint32_t getUsage() const           { return static_cast<uint32_t>(usage); }
getPixelFormat()93     PixelFormat getPixelFormat() const  { return format; }
getBounds()94     Rect getBounds() const              { return Rect(width, height); }
getId()95     uint64_t getId() const              { return mId; }
96 
getGenerationNumber()97     uint32_t getGenerationNumber() const { return mGenerationNumber; }
setGenerationNumber(uint32_t generation)98     void setGenerationNumber(uint32_t generation) {
99         mGenerationNumber = generation;
100     }
101 
102     status_t reallocate(uint32_t inWidth, uint32_t inHeight,
103             PixelFormat inFormat, uint32_t inUsage);
104 
105     bool needsReallocation(uint32_t inWidth, uint32_t inHeight,
106             PixelFormat inFormat, uint32_t inUsage);
107 
108     status_t lock(uint32_t inUsage, void** vaddr);
109     status_t lock(uint32_t inUsage, const Rect& rect, void** vaddr);
110     // For HAL_PIXEL_FORMAT_YCbCr_420_888
111     status_t lockYCbCr(uint32_t inUsage, android_ycbcr *ycbcr);
112     status_t lockYCbCr(uint32_t inUsage, const Rect& rect,
113             android_ycbcr *ycbcr);
114     status_t unlock();
115     status_t lockAsync(uint32_t inUsage, void** vaddr, int fenceFd);
116     status_t lockAsync(uint32_t inUsage, const Rect& rect, void** vaddr,
117             int fenceFd);
118     status_t lockAsyncYCbCr(uint32_t inUsage, android_ycbcr *ycbcr,
119             int fenceFd);
120     status_t lockAsyncYCbCr(uint32_t inUsage, const Rect& rect,
121             android_ycbcr *ycbcr, int fenceFd);
122     status_t unlockAsync(int *fenceFd);
123 
124     ANativeWindowBuffer* getNativeBuffer() const;
125 
126     // for debugging
127     static void dumpAllocationsToSystemLog();
128 
129     // Flattenable protocol
130     size_t getFlattenedSize() const;
131     size_t getFdCount() const;
132     status_t flatten(void*& buffer, size_t& size, int*& fds, size_t& count) const;
133     status_t unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count);
134 
135 private:
136     ~GraphicBuffer();
137 
138     enum {
139         ownNone   = 0,
140         ownHandle = 1,
141         ownData   = 2,
142     };
143 
getBufferMapper()144     inline const GraphicBufferMapper& getBufferMapper() const {
145         return mBufferMapper;
146     }
getBufferMapper()147     inline GraphicBufferMapper& getBufferMapper() {
148         return mBufferMapper;
149     }
150     uint8_t mOwner;
151 
152 private:
153     friend class Surface;
154     friend class BpSurface;
155     friend class BnSurface;
156     friend class LightRefBase<GraphicBuffer>;
157     GraphicBuffer(const GraphicBuffer& rhs);
158     GraphicBuffer& operator = (const GraphicBuffer& rhs);
159     const GraphicBuffer& operator = (const GraphicBuffer& rhs) const;
160 
161     status_t initSize(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,
162             uint32_t inUsage);
163 
164     void free_handle();
165 
166     GraphicBufferMapper& mBufferMapper;
167     ssize_t mInitCheck;
168 
169     // If we're wrapping another buffer then this reference will make sure it
170     // doesn't get freed.
171     sp<ANativeWindowBuffer> mWrappedBuffer;
172 
173     uint64_t mId;
174 
175     // Stores the generation number of this buffer. If this number does not
176     // match the BufferQueue's internal generation number (set through
177     // IGBP::setGenerationNumber), attempts to attach the buffer will fail.
178     uint32_t mGenerationNumber;
179 };
180 
181 }; // namespace android
182 
183 #endif // ANDROID_GRAPHIC_BUFFER_H
184