• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/android_native_buffer.h>
24 #include <ui/PixelFormat.h>
25 #include <ui/Rect.h>
26 #include <utils/Flattenable.h>
27 #include <pixelflinger/pixelflinger.h>
28 
29 #include <hardware/hardware.h>
30 
31 struct android_native_buffer_t;
32 
33 namespace android {
34 
35 class GraphicBufferMapper;
36 
37 // ===========================================================================
38 // GraphicBuffer
39 // ===========================================================================
40 
41 class GraphicBuffer
42     : public EGLNativeBase<
43         android_native_buffer_t,
44         GraphicBuffer,
45         LightRefBase<GraphicBuffer> >, public Flattenable
46 {
47 public:
48 
49     enum {
50         USAGE_SW_READ_NEVER     = GRALLOC_USAGE_SW_READ_NEVER,
51         USAGE_SW_READ_RARELY    = GRALLOC_USAGE_SW_READ_RARELY,
52         USAGE_SW_READ_OFTEN     = GRALLOC_USAGE_SW_READ_OFTEN,
53         USAGE_SW_READ_MASK      = GRALLOC_USAGE_SW_READ_MASK,
54 
55         USAGE_SW_WRITE_NEVER    = GRALLOC_USAGE_SW_WRITE_NEVER,
56         USAGE_SW_WRITE_RARELY   = GRALLOC_USAGE_SW_WRITE_RARELY,
57         USAGE_SW_WRITE_OFTEN    = GRALLOC_USAGE_SW_WRITE_OFTEN,
58         USAGE_SW_WRITE_MASK     = GRALLOC_USAGE_SW_WRITE_MASK,
59 
60         USAGE_SOFTWARE_MASK     = USAGE_SW_READ_MASK|USAGE_SW_WRITE_MASK,
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_MASK           = GRALLOC_USAGE_HW_MASK
66     };
67 
68     enum {
69         TRANSFORM_IDENTITY      = 0,
70         TRANSFORM_ROT_90        = HAL_TRANSFORM_ROT_90,
71         TRANSFORM_ROT_180       = HAL_TRANSFORM_ROT_180,
72         TRANSFORM_ROT_270       = HAL_TRANSFORM_ROT_270
73     };
74 
75     GraphicBuffer();
76 
77     // creates w * h buffer
78     GraphicBuffer(uint32_t w, uint32_t h, PixelFormat format, uint32_t usage);
79 
80     // create a buffer from an existing handle
81     GraphicBuffer(uint32_t w, uint32_t h, PixelFormat format, uint32_t usage,
82             uint32_t stride, native_handle_t* handle, bool keepOwnership);
83 
84     // return status
85     status_t initCheck() const;
86 
getWidth()87     uint32_t getWidth() const           { return width; }
getHeight()88     uint32_t getHeight() const          { return height; }
getStride()89     uint32_t getStride() const          { return stride; }
getUsage()90     uint32_t getUsage() const           { return usage; }
getTransform()91     uint32_t getTransform() const       { return transform; }
getPixelFormat()92     PixelFormat getPixelFormat() const  { return format; }
getBounds()93     Rect getBounds() const              { return Rect(width, height); }
94 
95     status_t reallocate(uint32_t w, uint32_t h, PixelFormat f, uint32_t usage);
96 
97     status_t lock(uint32_t usage, void** vaddr);
98     status_t lock(uint32_t usage, const Rect& rect, void** vaddr);
99     status_t lock(GGLSurface* surface, uint32_t usage);
100     status_t unlock();
101 
102     android_native_buffer_t* getNativeBuffer() const;
103 
104     void setIndex(int index);
105     int getIndex() const;
106 
107     // for debugging
108     static void dumpAllocationsToSystemLog();
109 
110 private:
111     virtual ~GraphicBuffer();
112 
113     enum {
114         ownNone   = 0,
115         ownHandle = 1,
116         ownData   = 2,
117     };
118 
getBufferMapper()119     inline const GraphicBufferMapper& getBufferMapper() const {
120         return mBufferMapper;
121     }
getBufferMapper()122     inline GraphicBufferMapper& getBufferMapper() {
123         return mBufferMapper;
124     }
125     uint8_t mOwner;
126 
127 private:
128     friend class Surface;
129     friend class BpSurface;
130     friend class BnSurface;
131     friend class LightRefBase<GraphicBuffer>;
132     GraphicBuffer(const GraphicBuffer& rhs);
133     GraphicBuffer& operator = (const GraphicBuffer& rhs);
134     const GraphicBuffer& operator = (const GraphicBuffer& rhs) const;
135 
136     status_t initSize(uint32_t w, uint32_t h, PixelFormat format,
137             uint32_t usage);
138 
139     void free_handle();
140 
141     // Flattenable interface
142     size_t getFlattenedSize() const;
143     size_t getFdCount() const;
144     status_t flatten(void* buffer, size_t size,
145             int fds[], size_t count) const;
146     status_t unflatten(void const* buffer, size_t size,
147             int fds[], size_t count);
148 
149 
150     GraphicBufferMapper& mBufferMapper;
151     ssize_t mInitCheck;
152     int mIndex;
153 };
154 
155 }; // namespace android
156 
157 #endif // ANDROID_GRAPHIC_BUFFER_H
158