Home | History | Annotate | Download | only in ui
      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