1 /*
2 * Copyright (C) 2020 Arm Limited. All rights reserved.
3 *
4 * Copyright 2016 The Android Open Source Project
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 #include "GrallocMapper.h"
19 #include "hidl_common/BufferDescriptor.h"
20 #include "hidl_common/MapperMetadata.h"
21
22 #include "allocator/mali_gralloc_ion.h"
23
24 namespace arm
25 {
26 namespace mapper
27 {
28
29 using android::hardware::graphics::mapper::V4_0::Error;
30 using android::hardware::graphics::mapper::V4_0::BufferDescriptor;
31 using android::hardware::graphics::mapper::V4_0::IMapper;
32 using android::hardware::Return;
33 using android::hardware::hidl_handle;
34 using android::hardware::hidl_vec;
35 using android::hardware::Void;
36
37
GrallocMapper()38 GrallocMapper::GrallocMapper() {}
39
~GrallocMapper()40 GrallocMapper::~GrallocMapper() {}
41
createDescriptor(const BufferDescriptorInfo & descriptorInfo,createDescriptor_cb hidl_cb)42 Return<void> GrallocMapper::createDescriptor(const BufferDescriptorInfo &descriptorInfo, createDescriptor_cb hidl_cb)
43 {
44 if (common::validateDescriptorInfo(descriptorInfo))
45 {
46 hidl_cb(Error::NONE, common::grallocEncodeBufferDescriptor<uint8_t>(descriptorInfo));
47 }
48 else
49 {
50 MALI_GRALLOC_LOGE("Invalid attributes to create descriptor for Mapper 3.0");
51 hidl_cb(Error::BAD_VALUE, BufferDescriptor());
52 }
53
54 return Void();
55 }
56
importBuffer(const hidl_handle & rawHandle,importBuffer_cb hidl_cb)57 Return<void> GrallocMapper::importBuffer(const hidl_handle &rawHandle, importBuffer_cb hidl_cb)
58 {
59 common::importBuffer(rawHandle, hidl_cb);
60 return Void();
61 }
62
freeBuffer(void * buffer)63 Return<Error> GrallocMapper::freeBuffer(void *buffer)
64 {
65 return common::freeBuffer(buffer);
66 }
67
validateBufferSize(void * buffer,const BufferDescriptorInfo & descriptorInfo,uint32_t in_stride)68 Return<Error> GrallocMapper::validateBufferSize(void *buffer, const BufferDescriptorInfo &descriptorInfo,
69 uint32_t in_stride)
70 {
71 /* All Gralloc allocated buffers must be conform to local descriptor validation */
72 if (!common::validateDescriptorInfo<BufferDescriptorInfo>(descriptorInfo))
73 {
74 MALI_GRALLOC_LOGE("Invalid descriptor attributes for validating buffer size");
75 return Error::BAD_VALUE;
76 }
77 return common::validateBufferSize(buffer, descriptorInfo, in_stride);
78 }
79
lock(void * buffer,uint64_t cpuUsage,const IMapper::Rect & accessRegion,const hidl_handle & acquireFence,lock_cb hidl_cb)80 Return<void> GrallocMapper::lock(void *buffer, uint64_t cpuUsage, const IMapper::Rect &accessRegion,
81 const hidl_handle &acquireFence, lock_cb hidl_cb)
82 {
83 common::lock(buffer, cpuUsage, accessRegion, acquireFence, hidl_cb);
84 return Void();
85 }
86
unlock(void * buffer,unlock_cb hidl_cb)87 Return<void> GrallocMapper::unlock(void *buffer, unlock_cb hidl_cb)
88 {
89 common::unlock(buffer, hidl_cb);
90 return Void();
91 }
92
flushLockedBuffer(void * buffer,flushLockedBuffer_cb hidl_cb)93 Return<void> GrallocMapper::flushLockedBuffer(void *buffer, flushLockedBuffer_cb hidl_cb)
94 {
95 common::flushLockedBuffer(buffer, hidl_cb);
96 return Void();
97 }
98
rereadLockedBuffer(void * buffer)99 Return<Error> GrallocMapper::rereadLockedBuffer(void *buffer)
100 {
101 return common::rereadLockedBuffer(buffer);
102 }
103
get(void * buffer,const MetadataType & metadataType,IMapper::get_cb hidl_cb)104 Return<void> GrallocMapper::get(void *buffer, const MetadataType &metadataType, IMapper::get_cb hidl_cb)
105 {
106 common::get(buffer, metadataType, hidl_cb);
107 return Void();
108 }
109
set(void * buffer,const MetadataType & metadataType,const hidl_vec<uint8_t> & metadata)110 Return<Error> GrallocMapper::set(void *buffer, const MetadataType &metadataType, const hidl_vec<uint8_t> &metadata)
111 {
112 return common::set(buffer, metadataType, metadata);
113 }
114
getFromBufferDescriptorInfo(const BufferDescriptorInfo & description,const MetadataType & metadataType,getFromBufferDescriptorInfo_cb hidl_cb)115 Return<void> GrallocMapper::getFromBufferDescriptorInfo(const BufferDescriptorInfo &description,
116 const MetadataType &metadataType,
117 getFromBufferDescriptorInfo_cb hidl_cb)
118 {
119 common::getFromBufferDescriptorInfo(description, metadataType, hidl_cb);
120 return Void();
121 }
122
getTransportSize(void * buffer,getTransportSize_cb hidl_cb)123 Return<void> GrallocMapper::getTransportSize(void *buffer, getTransportSize_cb hidl_cb)
124 {
125 common::getTransportSize(buffer, hidl_cb);
126 return Void();
127 }
128
isSupported(const IMapper::BufferDescriptorInfo & description,isSupported_cb hidl_cb)129 Return<void> GrallocMapper::isSupported(const IMapper::BufferDescriptorInfo &description, isSupported_cb hidl_cb)
130 {
131 if (!common::validateDescriptorInfo<BufferDescriptorInfo>(description))
132 {
133 MALI_GRALLOC_LOGE("Invalid descriptor attributes for validating buffer size");
134 hidl_cb(Error::BAD_VALUE, false);
135 }
136 common::isSupported(description, hidl_cb);
137 return Void();
138 }
139
listSupportedMetadataTypes(listSupportedMetadataTypes_cb hidl_cb)140 Return<void> GrallocMapper::listSupportedMetadataTypes(listSupportedMetadataTypes_cb hidl_cb)
141 {
142 common::listSupportedMetadataTypes(hidl_cb);
143 return Void();
144 }
145
dumpBuffer(void * buffer,dumpBuffer_cb hidl_cb)146 Return<void> GrallocMapper::dumpBuffer(void *buffer, dumpBuffer_cb hidl_cb)
147 {
148 common::dumpBuffer(buffer, hidl_cb);
149 return Void();
150 }
151
dumpBuffers(dumpBuffers_cb hidl_cb)152 Return<void> GrallocMapper::dumpBuffers(dumpBuffers_cb hidl_cb)
153 {
154 common::dumpBuffers(hidl_cb);
155 return Void();
156 }
157
getReservedRegion(void * buffer,getReservedRegion_cb hidl_cb)158 Return<void> GrallocMapper::getReservedRegion(void *buffer, getReservedRegion_cb hidl_cb)
159 {
160 common::getReservedRegion(buffer, hidl_cb);
161 return Void();
162 }
163
164 } // namespace mapper
165 } // namespace arm
166
HIDL_FETCH_IMapper(const char *)167 extern "C" IMapper *HIDL_FETCH_IMapper(const char * /* name */)
168 {
169 MALI_GRALLOC_LOGV("Arm Module IMapper %d.%d , pid = %d", GRALLOC_VERSION_MAJOR,
170 (HIDL_MAPPER_VERSION_SCALED - (GRALLOC_VERSION_MAJOR * 100)) / 10, getpid());
171
172 return new arm::mapper::GrallocMapper();
173 }
174