1 /*
2  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above
10  *       copyright notice, this list of conditions and the following
11  *       disclaimer in the documentation and/or other materials provided
12  *       with the distribution.
13  *     * Neither the name of The Linux Foundation nor the names of its
14  *       contributors may be used to endorse or promote products derived
15  *       from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #ifndef __QTIMAPPER_H__
31 #define __QTIMAPPER_H__
32 
33 #include <hidl/MQDescriptor.h>
34 #include <hidl/Status.h>
35 
36 #include "gr_buf_mgr.h"
37 namespace vendor {
38 namespace qti {
39 namespace hardware {
40 namespace display {
41 namespace mapper {
42 namespace V1_0 {
43 namespace implementation {
44 
45 using ::android::hardware::Return;
46 using ::android::hardware::Void;
47 using ::android::hardware::graphics::mapper::V2_0::IMapper;
48 using ::android::hardware::graphics::mapper::V2_0::Error;
49 using ::android::hardware::graphics::mapper::V2_0::YCbCrLayout;
50 using ::android::hardware::graphics::common::V1_1::PixelFormat;
51 using ::android::hardware::hidl_array;
52 using ::android::hardware::hidl_handle;
53 using ::android::hardware::hidl_memory;
54 using ::android::hardware::hidl_string;
55 using ::android::hardware::hidl_vec;
56 using ::android::hidl::base::V1_0::DebugInfo;
57 using ::android::hidl::base::V1_0::IBase;
58 using ::android::sp;
59 using gralloc::BufferManager;
60 
61 using IMapper_2_1 = android::hardware::graphics::mapper::V2_1::IMapper;
62 using BufferDescriptorInfo_2_0 =
63 android::hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo;
64 using BufferDescriptorInfo_2_1 =
65 android::hardware::graphics::mapper::V2_1::IMapper::BufferDescriptorInfo;
66 using IMapperBufferDescriptor = android::hardware::graphics::mapper::V2_0::BufferDescriptor;
67 
68 class QtiMapper : public IMapper_2_1 {
69  public:
70   QtiMapper();
71   // Methods from ::android::hardware::graphics::mapper::V2_0::IMapper follow.
72   Return<void> createDescriptor(const BufferDescriptorInfo_2_0 &descriptor_info,
73                                 createDescriptor_cb hidl_cb) override;
74   Return<void> importBuffer(const hidl_handle &raw_handle, importBuffer_cb hidl_cb) override;
75   Return<Error> freeBuffer(void *buffer) override;
76   Return<void> lock(void *buffer, uint64_t cpu_usage, const IMapper::Rect &access_region,
77                     const hidl_handle &acquire_fence, lock_cb hidl_cb) override;
78   Return<void> lockYCbCr(void *buffer, uint64_t cpu_usage, const IMapper::Rect &access_region,
79                          const hidl_handle &acquire_fence, lockYCbCr_cb hidl_cb) override;
80   Return<void> unlock(void *buffer, unlock_cb hidl_cb) override;
81 
82   // Methods from ::android::hardware::graphics::mapper::V2_1::IMapper follow.
83   Return<Error> validateBufferSize(void* buffer,
84                                    const BufferDescriptorInfo_2_1& descriptorInfo,
85                                    uint32_t stride) override;
86   Return<void> getTransportSize(void* buffer, IMapper_2_1::getTransportSize_cb hidl_cb) override;
87   Return<void> createDescriptor_2_1(const BufferDescriptorInfo_2_1& descriptorInfo,
88                                     createDescriptor_2_1_cb _hidl_cb) override;
89 #ifdef ENABLE_QTI_MAPPER_EXTENSION
90   Return<void> getMapSecureBufferFlag(void *buffer, getMapSecureBufferFlag_cb _hidl_cb) override;
91   Return<void> getInterlacedFlag(void *buffer, getInterlacedFlag_cb _hidl_cb) override;
92   Return<void> getCustomDimensions(void *buffer, getCustomDimensions_cb _hidl_cb) override;
93   Return<void> getRgbDataAddress(void *buffer, getRgbDataAddress_cb _hidl_cb) override;
94   Return<void> calculateBufferAttributes(int32_t width, int32_t height, int32_t format,
95                                          uint64_t usage,
96                                          calculateBufferAttributes_cb _hidl_cb) override;
97   Return<void> getColorSpace(void *buffer, getColorSpace_cb _hidl_cb) override;
98   Return<void> getYuvPlaneInfo(void *buffer, getYuvPlaneInfo_cb _hidl_cb) override;
99   Return<Error> setSingleBufferMode(void *buffer, bool enable) override;
100 #endif
101 
102  private:
103   BufferManager *buf_mgr_ = nullptr;
104   Error CreateDescriptor(const BufferDescriptorInfo_2_1& descriptor_info,
105                          IMapperBufferDescriptor * descriptor);
106   bool ValidDescriptor(const IMapper::BufferDescriptorInfo &bd);
107   bool GetFenceFd(const hidl_handle &fence_handle, int *outFenceFd);
108   void WaitFenceFd(int fence_fd);
109   Error LockBuffer(void *buffer, uint64_t usage, const hidl_handle &acquire_fence);
110 };
111 
112 extern "C" IMapper_2_1 *HIDL_FETCH_IMapper(const char *name);
113 }  // namespace implementation
114 }  // namespace V1_0
115 }  // namespace mapper
116 }  // namespace display
117 }  // namespace hardware
118 }  // namespace qti
119 }  // namespace vendor
120 
121 #endif  // __QTIMAPPER_H__
122