1 /* 2 * Copyright 2016 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_GRALLOC1_H 18 #define ANDROID_UI_GRALLOC1_H 19 20 #define GRALLOC1_LOG_TAG "Gralloc1" 21 22 #include <ui/Gralloc1On0Adapter.h> 23 24 #include <unordered_set> 25 26 namespace std { 27 template <> 28 struct hash<gralloc1_capability_t> { 29 size_t operator()(gralloc1_capability_t capability) const { 30 return std::hash<int32_t>()(static_cast<int32_t>(capability)); 31 } 32 }; 33 } 34 35 namespace android { 36 37 class Fence; 38 class GraphicBuffer; 39 40 namespace Gralloc1 { 41 42 class Device; 43 44 class Descriptor { 45 public: 46 Descriptor(Device& device, gralloc1_buffer_descriptor_t deviceId) 47 : mShimDevice(device), 48 mDeviceId(deviceId), 49 mWidth(0), 50 mHeight(0), 51 mFormat(static_cast<android_pixel_format_t>(0)), 52 mProducerUsage(GRALLOC1_PRODUCER_USAGE_NONE), 53 mConsumerUsage(GRALLOC1_CONSUMER_USAGE_NONE) {} 54 55 ~Descriptor(); 56 57 gralloc1_buffer_descriptor_t getDeviceId() const { return mDeviceId; } 58 59 gralloc1_error_t setDimensions(uint32_t width, uint32_t height); 60 gralloc1_error_t setFormat(android_pixel_format_t format); 61 gralloc1_error_t setProducerUsage(gralloc1_producer_usage_t usage); 62 gralloc1_error_t setConsumerUsage(gralloc1_consumer_usage_t usage); 63 64 private: 65 Device& mShimDevice; 66 const gralloc1_buffer_descriptor_t mDeviceId; 67 68 uint32_t mWidth; 69 uint32_t mHeight; 70 android_pixel_format_t mFormat; 71 gralloc1_producer_usage_t mProducerUsage; 72 gralloc1_consumer_usage_t mConsumerUsage; 73 74 }; // Descriptor 75 76 class Device { 77 friend class Gralloc1::Descriptor; 78 79 public: 80 Device(gralloc1_device_t* device); 81 82 bool hasCapability(gralloc1_capability_t capability) const; 83 84 std::string dump(); 85 86 std::shared_ptr<Descriptor> createDescriptor(); 87 88 gralloc1_error_t getStride(buffer_handle_t buffer, uint32_t* outStride); 89 90 gralloc1_error_t allocate( 91 const std::vector<std::shared_ptr<const Descriptor>>& descriptors, 92 std::vector<buffer_handle_t>* outBuffers); 93 gralloc1_error_t allocate( 94 const std::shared_ptr<const Descriptor>& descriptor, 95 gralloc1_backing_store_t id, buffer_handle_t* outBuffer); 96 97 gralloc1_error_t retain(buffer_handle_t buffer); 98 gralloc1_error_t retain(const GraphicBuffer* buffer); 99 100 gralloc1_error_t release(buffer_handle_t buffer); 101 102 gralloc1_error_t getNumFlexPlanes(buffer_handle_t buffer, 103 uint32_t* outNumPlanes); 104 105 gralloc1_error_t lock(buffer_handle_t buffer, 106 gralloc1_producer_usage_t producerUsage, 107 gralloc1_consumer_usage_t consumerUsage, 108 const gralloc1_rect_t* accessRegion, void** outData, 109 const sp<Fence>& acquireFence); 110 gralloc1_error_t lockFlex(buffer_handle_t buffer, 111 gralloc1_producer_usage_t producerUsage, 112 gralloc1_consumer_usage_t consumerUsage, 113 const gralloc1_rect_t* accessRegion, 114 struct android_flex_layout* outData, const sp<Fence>& acquireFence); 115 gralloc1_error_t lockYCbCr(buffer_handle_t buffer, 116 gralloc1_producer_usage_t producerUsage, 117 gralloc1_consumer_usage_t consumerUsage, 118 const gralloc1_rect_t* accessRegion, struct android_ycbcr* outData, 119 const sp<Fence>& acquireFence); 120 121 gralloc1_error_t unlock(buffer_handle_t buffer, sp<Fence>* outFence); 122 123 private: 124 std::unordered_set<gralloc1_capability_t> loadCapabilities(); 125 126 bool loadFunctions(); 127 128 template <typename LockType, typename OutType> 129 gralloc1_error_t lockHelper(LockType pfn, buffer_handle_t buffer, 130 gralloc1_producer_usage_t producerUsage, 131 gralloc1_consumer_usage_t consumerUsage, 132 const gralloc1_rect_t* accessRegion, OutType* outData, 133 const sp<Fence>& acquireFence) { 134 int32_t intError = pfn(mDevice, buffer, 135 static_cast<uint64_t>(producerUsage), 136 static_cast<uint64_t>(consumerUsage), accessRegion, outData, 137 acquireFence->dup()); 138 return static_cast<gralloc1_error_t>(intError); 139 } 140 141 gralloc1_device_t* const mDevice; 142 143 const std::unordered_set<gralloc1_capability_t> mCapabilities; 144 145 template <typename PFN, gralloc1_function_descriptor_t descriptor> 146 struct FunctionLoader { 147 FunctionLoader() : pfn(nullptr) {} 148 149 bool load(gralloc1_device_t* device, bool errorIfNull) { 150 gralloc1_function_pointer_t rawPointer = 151 device->getFunction(device, descriptor); 152 pfn = reinterpret_cast<PFN>(rawPointer); 153 if (errorIfNull && !rawPointer) { 154 ALOG(LOG_ERROR, GRALLOC1_LOG_TAG, 155 "Failed to load function pointer %d", descriptor); 156 } 157 return rawPointer != nullptr; 158 } 159 160 template <typename ...Args> 161 typename std::result_of<PFN(Args...)>::type operator()(Args... args) { 162 return pfn(args...); 163 } 164 165 PFN pfn; 166 }; 167 168 // Function pointers 169 struct Functions { 170 FunctionLoader<GRALLOC1_PFN_DUMP, GRALLOC1_FUNCTION_DUMP> dump; 171 FunctionLoader<GRALLOC1_PFN_CREATE_DESCRIPTOR, 172 GRALLOC1_FUNCTION_CREATE_DESCRIPTOR> createDescriptor; 173 FunctionLoader<GRALLOC1_PFN_DESTROY_DESCRIPTOR, 174 GRALLOC1_FUNCTION_DESTROY_DESCRIPTOR> destroyDescriptor; 175 FunctionLoader<GRALLOC1_PFN_SET_CONSUMER_USAGE, 176 GRALLOC1_FUNCTION_SET_CONSUMER_USAGE> setConsumerUsage; 177 FunctionLoader<GRALLOC1_PFN_SET_DIMENSIONS, 178 GRALLOC1_FUNCTION_SET_DIMENSIONS> setDimensions; 179 FunctionLoader<GRALLOC1_PFN_SET_FORMAT, 180 GRALLOC1_FUNCTION_SET_FORMAT> setFormat; 181 FunctionLoader<GRALLOC1_PFN_SET_PRODUCER_USAGE, 182 GRALLOC1_FUNCTION_SET_PRODUCER_USAGE> setProducerUsage; 183 FunctionLoader<GRALLOC1_PFN_GET_BACKING_STORE, 184 GRALLOC1_FUNCTION_GET_BACKING_STORE> getBackingStore; 185 FunctionLoader<GRALLOC1_PFN_GET_CONSUMER_USAGE, 186 GRALLOC1_FUNCTION_GET_CONSUMER_USAGE> getConsumerUsage; 187 FunctionLoader<GRALLOC1_PFN_GET_DIMENSIONS, 188 GRALLOC1_FUNCTION_GET_DIMENSIONS> getDimensions; 189 FunctionLoader<GRALLOC1_PFN_GET_FORMAT, 190 GRALLOC1_FUNCTION_GET_FORMAT> getFormat; 191 FunctionLoader<GRALLOC1_PFN_GET_PRODUCER_USAGE, 192 GRALLOC1_FUNCTION_GET_PRODUCER_USAGE> getProducerUsage; 193 FunctionLoader<GRALLOC1_PFN_GET_STRIDE, 194 GRALLOC1_FUNCTION_GET_STRIDE> getStride; 195 FunctionLoader<GRALLOC1_PFN_ALLOCATE, 196 GRALLOC1_FUNCTION_ALLOCATE> allocate; 197 FunctionLoader<GRALLOC1_PFN_RETAIN, 198 GRALLOC1_FUNCTION_RETAIN> retain; 199 FunctionLoader<GRALLOC1_PFN_RELEASE, 200 GRALLOC1_FUNCTION_RELEASE> release; 201 FunctionLoader<GRALLOC1_PFN_GET_NUM_FLEX_PLANES, 202 GRALLOC1_FUNCTION_GET_NUM_FLEX_PLANES> getNumFlexPlanes; 203 FunctionLoader<GRALLOC1_PFN_LOCK, 204 GRALLOC1_FUNCTION_LOCK> lock; 205 FunctionLoader<GRALLOC1_PFN_LOCK_FLEX, 206 GRALLOC1_FUNCTION_LOCK_FLEX> lockFlex; 207 FunctionLoader<GRALLOC1_PFN_LOCK_YCBCR, 208 GRALLOC1_FUNCTION_LOCK_YCBCR> lockYCbCr; 209 FunctionLoader<GRALLOC1_PFN_UNLOCK, 210 GRALLOC1_FUNCTION_UNLOCK> unlock; 211 212 // Adapter-only functions 213 FunctionLoader<GRALLOC1_PFN_RETAIN_GRAPHIC_BUFFER, 214 GRALLOC1_FUNCTION_RETAIN_GRAPHIC_BUFFER> retainGraphicBuffer; 215 FunctionLoader<GRALLOC1_PFN_ALLOCATE_WITH_ID, 216 GRALLOC1_FUNCTION_ALLOCATE_WITH_ID> allocateWithId; 217 } mFunctions; 218 219 }; // class android::Gralloc1::Device 220 221 class Loader 222 { 223 public: 224 Loader(); 225 ~Loader(); 226 227 std::unique_ptr<Device> getDevice(); 228 229 private: 230 static std::unique_ptr<Gralloc1On0Adapter> mAdapter; 231 std::unique_ptr<Device> mDevice; 232 }; 233 234 } // namespace android::Gralloc1 235 236 } // namespace android 237 238 #endif 239