1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker
17*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "C2Buffer"
19*ec779b8eSAndroid Build Coastguard Worker #define ATRACE_TAG ATRACE_TAG_VIDEO
20*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <utils/Trace.h>
22*ec779b8eSAndroid Build Coastguard Worker
23*ec779b8eSAndroid Build Coastguard Worker #include <list>
24*ec779b8eSAndroid Build Coastguard Worker #include <map>
25*ec779b8eSAndroid Build Coastguard Worker #include <mutex>
26*ec779b8eSAndroid Build Coastguard Worker
27*ec779b8eSAndroid Build Coastguard Worker #include <C2AllocatorBlob.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <C2AllocatorGralloc.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <C2AllocatorIon.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <C2BufferPriv.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <C2Debug.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <C2BlockInternal.h>
33*ec779b8eSAndroid Build Coastguard Worker #include <C2PlatformSupport.h>
34*ec779b8eSAndroid Build Coastguard Worker #include <bufferpool/ClientManager.h>
35*ec779b8eSAndroid Build Coastguard Worker #include <bufferpool2/ClientManager.h>
36*ec779b8eSAndroid Build Coastguard Worker
37*ec779b8eSAndroid Build Coastguard Worker namespace {
38*ec779b8eSAndroid Build Coastguard Worker
39*ec779b8eSAndroid Build Coastguard Worker using android::ScopedTrace;
40*ec779b8eSAndroid Build Coastguard Worker using android::C2AllocatorBlob;
41*ec779b8eSAndroid Build Coastguard Worker using android::C2AllocatorGralloc;
42*ec779b8eSAndroid Build Coastguard Worker using android::C2AllocatorIon;
43*ec779b8eSAndroid Build Coastguard Worker
44*ec779b8eSAndroid Build Coastguard Worker namespace bufferpool = android::hardware::media::bufferpool;
45*ec779b8eSAndroid Build Coastguard Worker namespace bufferpool_impl = android::hardware::media::bufferpool::V2_0::implementation;
46*ec779b8eSAndroid Build Coastguard Worker using android::hardware::media::bufferpool::V2_0::ResultStatus;
47*ec779b8eSAndroid Build Coastguard Worker
48*ec779b8eSAndroid Build Coastguard Worker namespace bufferpool2 = aidl::android::hardware::media::bufferpool2;
49*ec779b8eSAndroid Build Coastguard Worker namespace bufferpool2_impl = aidl::android::hardware::media::bufferpool2::implementation;
50*ec779b8eSAndroid Build Coastguard Worker using ResultStatus2 = aidl::android::hardware::media::bufferpool2::ResultStatus;
51*ec779b8eSAndroid Build Coastguard Worker
52*ec779b8eSAndroid Build Coastguard Worker // This anonymous namespace contains the helper classes that allow our implementation to create
53*ec779b8eSAndroid Build Coastguard Worker // block/buffer objects.
54*ec779b8eSAndroid Build Coastguard Worker //
55*ec779b8eSAndroid Build Coastguard Worker // Inherit from the parent, share with the friend.
56*ec779b8eSAndroid Build Coastguard Worker class ReadViewBuddy : public C2ReadView {
57*ec779b8eSAndroid Build Coastguard Worker using C2ReadView::C2ReadView;
58*ec779b8eSAndroid Build Coastguard Worker friend class ::C2ConstLinearBlock;
59*ec779b8eSAndroid Build Coastguard Worker };
60*ec779b8eSAndroid Build Coastguard Worker
61*ec779b8eSAndroid Build Coastguard Worker class WriteViewBuddy : public C2WriteView {
62*ec779b8eSAndroid Build Coastguard Worker using C2WriteView::C2WriteView;
63*ec779b8eSAndroid Build Coastguard Worker friend class ::C2LinearBlock;
64*ec779b8eSAndroid Build Coastguard Worker };
65*ec779b8eSAndroid Build Coastguard Worker
66*ec779b8eSAndroid Build Coastguard Worker class ConstLinearBlockBuddy : public C2ConstLinearBlock {
67*ec779b8eSAndroid Build Coastguard Worker using C2ConstLinearBlock::C2ConstLinearBlock;
68*ec779b8eSAndroid Build Coastguard Worker friend class ::C2LinearBlock;
69*ec779b8eSAndroid Build Coastguard Worker };
70*ec779b8eSAndroid Build Coastguard Worker
71*ec779b8eSAndroid Build Coastguard Worker class LinearBlockBuddy : public C2LinearBlock {
72*ec779b8eSAndroid Build Coastguard Worker using C2LinearBlock::C2LinearBlock;
73*ec779b8eSAndroid Build Coastguard Worker friend class ::C2BasicLinearBlockPool;
74*ec779b8eSAndroid Build Coastguard Worker };
75*ec779b8eSAndroid Build Coastguard Worker
76*ec779b8eSAndroid Build Coastguard Worker class AcquirableReadViewBuddy : public C2Acquirable<C2ReadView> {
77*ec779b8eSAndroid Build Coastguard Worker using C2Acquirable::C2Acquirable;
78*ec779b8eSAndroid Build Coastguard Worker friend class ::C2ConstLinearBlock;
79*ec779b8eSAndroid Build Coastguard Worker };
80*ec779b8eSAndroid Build Coastguard Worker
81*ec779b8eSAndroid Build Coastguard Worker class AcquirableWriteViewBuddy : public C2Acquirable<C2WriteView> {
82*ec779b8eSAndroid Build Coastguard Worker using C2Acquirable::C2Acquirable;
83*ec779b8eSAndroid Build Coastguard Worker friend class ::C2LinearBlock;
84*ec779b8eSAndroid Build Coastguard Worker };
85*ec779b8eSAndroid Build Coastguard Worker
86*ec779b8eSAndroid Build Coastguard Worker class GraphicViewBuddy : public C2GraphicView {
87*ec779b8eSAndroid Build Coastguard Worker using C2GraphicView::C2GraphicView;
88*ec779b8eSAndroid Build Coastguard Worker friend class ::C2ConstGraphicBlock;
89*ec779b8eSAndroid Build Coastguard Worker friend class ::C2GraphicBlock;
90*ec779b8eSAndroid Build Coastguard Worker };
91*ec779b8eSAndroid Build Coastguard Worker
92*ec779b8eSAndroid Build Coastguard Worker class AcquirableConstGraphicViewBuddy : public C2Acquirable<const C2GraphicView> {
93*ec779b8eSAndroid Build Coastguard Worker using C2Acquirable::C2Acquirable;
94*ec779b8eSAndroid Build Coastguard Worker friend class ::C2ConstGraphicBlock;
95*ec779b8eSAndroid Build Coastguard Worker };
96*ec779b8eSAndroid Build Coastguard Worker
97*ec779b8eSAndroid Build Coastguard Worker class AcquirableGraphicViewBuddy : public C2Acquirable<C2GraphicView> {
98*ec779b8eSAndroid Build Coastguard Worker using C2Acquirable::C2Acquirable;
99*ec779b8eSAndroid Build Coastguard Worker friend class ::C2GraphicBlock;
100*ec779b8eSAndroid Build Coastguard Worker };
101*ec779b8eSAndroid Build Coastguard Worker
102*ec779b8eSAndroid Build Coastguard Worker class ConstGraphicBlockBuddy : public C2ConstGraphicBlock {
103*ec779b8eSAndroid Build Coastguard Worker using C2ConstGraphicBlock::C2ConstGraphicBlock;
104*ec779b8eSAndroid Build Coastguard Worker friend class ::C2GraphicBlock;
105*ec779b8eSAndroid Build Coastguard Worker };
106*ec779b8eSAndroid Build Coastguard Worker
107*ec779b8eSAndroid Build Coastguard Worker class GraphicBlockBuddy : public C2GraphicBlock {
108*ec779b8eSAndroid Build Coastguard Worker using C2GraphicBlock::C2GraphicBlock;
109*ec779b8eSAndroid Build Coastguard Worker friend class ::C2BasicGraphicBlockPool;
110*ec779b8eSAndroid Build Coastguard Worker };
111*ec779b8eSAndroid Build Coastguard Worker
112*ec779b8eSAndroid Build Coastguard Worker class BufferDataBuddy : public C2BufferData {
113*ec779b8eSAndroid Build Coastguard Worker using C2BufferData::C2BufferData;
114*ec779b8eSAndroid Build Coastguard Worker friend class ::C2Buffer;
115*ec779b8eSAndroid Build Coastguard Worker friend class ::C2InfoBuffer;
116*ec779b8eSAndroid Build Coastguard Worker };
117*ec779b8eSAndroid Build Coastguard Worker
118*ec779b8eSAndroid Build Coastguard Worker } // namespace
119*ec779b8eSAndroid Build Coastguard Worker
120*ec779b8eSAndroid Build Coastguard Worker /*
121*ec779b8eSAndroid Build Coastguard Worker */
122*ec779b8eSAndroid Build Coastguard Worker
fetchLinearBlock(uint32_t capacity,C2MemoryUsage usage,std::shared_ptr<C2LinearBlock> * block,C2Fence * fence)123*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2BlockPool::fetchLinearBlock(
124*ec779b8eSAndroid Build Coastguard Worker uint32_t capacity, C2MemoryUsage usage,
125*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> *block /* nonnull */,
126*ec779b8eSAndroid Build Coastguard Worker C2Fence *fence /* nonnull */) {
127*ec779b8eSAndroid Build Coastguard Worker // fall back to non-waitable implementation, as long as it does not return C2_BLOCKING
128*ec779b8eSAndroid Build Coastguard Worker c2_status_t result = fetchLinearBlock(capacity, usage, block);
129*ec779b8eSAndroid Build Coastguard Worker C2_CHECK_NE(result, C2_BLOCKING);
130*ec779b8eSAndroid Build Coastguard Worker *fence = C2Fence();
131*ec779b8eSAndroid Build Coastguard Worker return result;
132*ec779b8eSAndroid Build Coastguard Worker }
133*ec779b8eSAndroid Build Coastguard Worker
fetchGraphicBlock(uint32_t width,uint32_t height,uint32_t format,C2MemoryUsage usage,std::shared_ptr<C2GraphicBlock> * block,C2Fence * fence)134*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2BlockPool::fetchGraphicBlock(
135*ec779b8eSAndroid Build Coastguard Worker uint32_t width, uint32_t height, uint32_t format,
136*ec779b8eSAndroid Build Coastguard Worker C2MemoryUsage usage,
137*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicBlock> *block /* nonnull */,
138*ec779b8eSAndroid Build Coastguard Worker C2Fence *fence /* nonnull */) {
139*ec779b8eSAndroid Build Coastguard Worker // fall back to non-waitable implementation, as long as it does not return C2_BLOCKING
140*ec779b8eSAndroid Build Coastguard Worker c2_status_t result = fetchGraphicBlock(width, height, format, usage, block);
141*ec779b8eSAndroid Build Coastguard Worker C2_CHECK_NE(result, C2_BLOCKING);
142*ec779b8eSAndroid Build Coastguard Worker *fence = C2Fence();
143*ec779b8eSAndroid Build Coastguard Worker return result;
144*ec779b8eSAndroid Build Coastguard Worker }
145*ec779b8eSAndroid Build Coastguard Worker
146*ec779b8eSAndroid Build Coastguard Worker /* ========================================== 1D BLOCK ========================================= */
147*ec779b8eSAndroid Build Coastguard Worker
148*ec779b8eSAndroid Build Coastguard Worker /**
149*ec779b8eSAndroid Build Coastguard Worker * This class is the base class for all 1D block and view implementations.
150*ec779b8eSAndroid Build Coastguard Worker *
151*ec779b8eSAndroid Build Coastguard Worker * This is basically just a placeholder for the underlying 1D allocation and the range of the
152*ec779b8eSAndroid Build Coastguard Worker * alloted portion to this block. There is also a placeholder for a blockpool data.
153*ec779b8eSAndroid Build Coastguard Worker */
154*ec779b8eSAndroid Build Coastguard Worker class C2_HIDE _C2Block1DImpl : public _C2LinearRangeAspect {
155*ec779b8eSAndroid Build Coastguard Worker public:
_C2Block1DImpl(const std::shared_ptr<C2LinearAllocation> & alloc,const std::shared_ptr<_C2BlockPoolData> & poolData=nullptr,size_t offset=0,size_t size=~(size_t)0)156*ec779b8eSAndroid Build Coastguard Worker _C2Block1DImpl(const std::shared_ptr<C2LinearAllocation> &alloc,
157*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<_C2BlockPoolData> &poolData = nullptr,
158*ec779b8eSAndroid Build Coastguard Worker size_t offset = 0, size_t size = ~(size_t)0)
159*ec779b8eSAndroid Build Coastguard Worker : _C2LinearRangeAspect(alloc.get(), offset, size),
160*ec779b8eSAndroid Build Coastguard Worker mAllocation(alloc),
161*ec779b8eSAndroid Build Coastguard Worker mPoolData(poolData) { }
162*ec779b8eSAndroid Build Coastguard Worker
_C2Block1DImpl(const _C2Block1DImpl & other,size_t offset=0,size_t size=~(size_t)0)163*ec779b8eSAndroid Build Coastguard Worker _C2Block1DImpl(const _C2Block1DImpl &other, size_t offset = 0, size_t size = ~(size_t)0)
164*ec779b8eSAndroid Build Coastguard Worker : _C2LinearRangeAspect(&other, offset, size),
165*ec779b8eSAndroid Build Coastguard Worker mAllocation(other.mAllocation),
166*ec779b8eSAndroid Build Coastguard Worker mPoolData(other.mPoolData) { }
167*ec779b8eSAndroid Build Coastguard Worker
168*ec779b8eSAndroid Build Coastguard Worker /** returns pool data */
poolData() const169*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<_C2BlockPoolData> poolData() const {
170*ec779b8eSAndroid Build Coastguard Worker return mPoolData;
171*ec779b8eSAndroid Build Coastguard Worker }
172*ec779b8eSAndroid Build Coastguard Worker
173*ec779b8eSAndroid Build Coastguard Worker /** returns native handle */
handle() const174*ec779b8eSAndroid Build Coastguard Worker const C2Handle *handle() const {
175*ec779b8eSAndroid Build Coastguard Worker return mAllocation ? mAllocation->handle() : nullptr;
176*ec779b8eSAndroid Build Coastguard Worker }
177*ec779b8eSAndroid Build Coastguard Worker
178*ec779b8eSAndroid Build Coastguard Worker /** returns the allocator's ID */
getAllocatorId() const179*ec779b8eSAndroid Build Coastguard Worker C2Allocator::id_t getAllocatorId() const {
180*ec779b8eSAndroid Build Coastguard Worker // BAD_ID can only happen if this Impl class is initialized for a view - never for a block.
181*ec779b8eSAndroid Build Coastguard Worker return mAllocation ? mAllocation->getAllocatorId() : C2Allocator::BAD_ID;
182*ec779b8eSAndroid Build Coastguard Worker }
183*ec779b8eSAndroid Build Coastguard Worker
getAllocation() const184*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> getAllocation() const {
185*ec779b8eSAndroid Build Coastguard Worker return mAllocation;
186*ec779b8eSAndroid Build Coastguard Worker }
187*ec779b8eSAndroid Build Coastguard Worker
188*ec779b8eSAndroid Build Coastguard Worker private:
189*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> mAllocation;
190*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<_C2BlockPoolData> mPoolData;
191*ec779b8eSAndroid Build Coastguard Worker };
192*ec779b8eSAndroid Build Coastguard Worker
193*ec779b8eSAndroid Build Coastguard Worker /**
194*ec779b8eSAndroid Build Coastguard Worker * This class contains the mapped data pointer, and the potential error.
195*ec779b8eSAndroid Build Coastguard Worker *
196*ec779b8eSAndroid Build Coastguard Worker * range is the mapped range of the underlying allocation (which is part of the allotted
197*ec779b8eSAndroid Build Coastguard Worker * range).
198*ec779b8eSAndroid Build Coastguard Worker */
199*ec779b8eSAndroid Build Coastguard Worker class C2_HIDE _C2MappedBlock1DImpl : public _C2Block1DImpl {
200*ec779b8eSAndroid Build Coastguard Worker public:
_C2MappedBlock1DImpl(const _C2Block1DImpl & block,uint8_t * data,size_t offset=0,size_t size=~(size_t)0)201*ec779b8eSAndroid Build Coastguard Worker _C2MappedBlock1DImpl(const _C2Block1DImpl &block, uint8_t *data,
202*ec779b8eSAndroid Build Coastguard Worker size_t offset = 0, size_t size = ~(size_t)0)
203*ec779b8eSAndroid Build Coastguard Worker : _C2Block1DImpl(block, offset, size), mData(data), mError(C2_OK) { }
204*ec779b8eSAndroid Build Coastguard Worker
_C2MappedBlock1DImpl(c2_status_t error)205*ec779b8eSAndroid Build Coastguard Worker _C2MappedBlock1DImpl(c2_status_t error)
206*ec779b8eSAndroid Build Coastguard Worker : _C2Block1DImpl(nullptr), mData(nullptr), mError(error) {
207*ec779b8eSAndroid Build Coastguard Worker // CHECK(error != C2_OK);
208*ec779b8eSAndroid Build Coastguard Worker }
209*ec779b8eSAndroid Build Coastguard Worker
data() const210*ec779b8eSAndroid Build Coastguard Worker const uint8_t *data() const {
211*ec779b8eSAndroid Build Coastguard Worker return mData;
212*ec779b8eSAndroid Build Coastguard Worker }
213*ec779b8eSAndroid Build Coastguard Worker
data()214*ec779b8eSAndroid Build Coastguard Worker uint8_t *data() {
215*ec779b8eSAndroid Build Coastguard Worker return mData;
216*ec779b8eSAndroid Build Coastguard Worker }
217*ec779b8eSAndroid Build Coastguard Worker
error() const218*ec779b8eSAndroid Build Coastguard Worker c2_status_t error() const {
219*ec779b8eSAndroid Build Coastguard Worker return mError;
220*ec779b8eSAndroid Build Coastguard Worker }
221*ec779b8eSAndroid Build Coastguard Worker
222*ec779b8eSAndroid Build Coastguard Worker private:
223*ec779b8eSAndroid Build Coastguard Worker uint8_t *mData;
224*ec779b8eSAndroid Build Coastguard Worker c2_status_t mError;
225*ec779b8eSAndroid Build Coastguard Worker };
226*ec779b8eSAndroid Build Coastguard Worker
227*ec779b8eSAndroid Build Coastguard Worker /**
228*ec779b8eSAndroid Build Coastguard Worker * Block implementation.
229*ec779b8eSAndroid Build Coastguard Worker */
230*ec779b8eSAndroid Build Coastguard Worker class C2Block1D::Impl : public _C2Block1DImpl {
231*ec779b8eSAndroid Build Coastguard Worker using _C2Block1DImpl::_C2Block1DImpl;
232*ec779b8eSAndroid Build Coastguard Worker };
233*ec779b8eSAndroid Build Coastguard Worker
handle() const234*ec779b8eSAndroid Build Coastguard Worker const C2Handle *C2Block1D::handle() const {
235*ec779b8eSAndroid Build Coastguard Worker return mImpl->handle();
236*ec779b8eSAndroid Build Coastguard Worker };
237*ec779b8eSAndroid Build Coastguard Worker
getAllocatorId() const238*ec779b8eSAndroid Build Coastguard Worker C2Allocator::id_t C2Block1D::getAllocatorId() const {
239*ec779b8eSAndroid Build Coastguard Worker return mImpl->getAllocatorId();
240*ec779b8eSAndroid Build Coastguard Worker };
241*ec779b8eSAndroid Build Coastguard Worker
C2Block1D(std::shared_ptr<Impl> impl,const _C2LinearRangeAspect & range)242*ec779b8eSAndroid Build Coastguard Worker C2Block1D::C2Block1D(std::shared_ptr<Impl> impl, const _C2LinearRangeAspect &range)
243*ec779b8eSAndroid Build Coastguard Worker // always clamp subrange to parent (impl) range for safety
244*ec779b8eSAndroid Build Coastguard Worker : _C2LinearRangeAspect(impl.get(), range.offset(), range.size()), mImpl(impl) {
245*ec779b8eSAndroid Build Coastguard Worker }
246*ec779b8eSAndroid Build Coastguard Worker
247*ec779b8eSAndroid Build Coastguard Worker /**
248*ec779b8eSAndroid Build Coastguard Worker * Read view implementation.
249*ec779b8eSAndroid Build Coastguard Worker *
250*ec779b8eSAndroid Build Coastguard Worker * range of Impl is the mapped range of the underlying allocation (which is part of the allotted
251*ec779b8eSAndroid Build Coastguard Worker * range). range of View is 0 to capacity() (not represented as an actual range). This maps to a
252*ec779b8eSAndroid Build Coastguard Worker * subrange of Impl range starting at mImpl->offset() + _mOffset.
253*ec779b8eSAndroid Build Coastguard Worker */
254*ec779b8eSAndroid Build Coastguard Worker class C2ReadView::Impl : public _C2MappedBlock1DImpl {
255*ec779b8eSAndroid Build Coastguard Worker using _C2MappedBlock1DImpl::_C2MappedBlock1DImpl;
256*ec779b8eSAndroid Build Coastguard Worker };
257*ec779b8eSAndroid Build Coastguard Worker
C2ReadView(std::shared_ptr<Impl> impl,uint32_t offset,uint32_t size)258*ec779b8eSAndroid Build Coastguard Worker C2ReadView::C2ReadView(std::shared_ptr<Impl> impl, uint32_t offset, uint32_t size)
259*ec779b8eSAndroid Build Coastguard Worker : _C2LinearCapacityAspect(C2LinearCapacity(impl->size()).range(offset, size).size()),
260*ec779b8eSAndroid Build Coastguard Worker mImpl(impl),
261*ec779b8eSAndroid Build Coastguard Worker mOffset(C2LinearCapacity(impl->size()).range(offset, size).offset()) { }
262*ec779b8eSAndroid Build Coastguard Worker
C2ReadView(c2_status_t error)263*ec779b8eSAndroid Build Coastguard Worker C2ReadView::C2ReadView(c2_status_t error)
264*ec779b8eSAndroid Build Coastguard Worker : _C2LinearCapacityAspect(0u), mImpl(std::make_shared<Impl>(error)), mOffset(0u) {
265*ec779b8eSAndroid Build Coastguard Worker // CHECK(error != C2_OK);
266*ec779b8eSAndroid Build Coastguard Worker }
267*ec779b8eSAndroid Build Coastguard Worker
data() const268*ec779b8eSAndroid Build Coastguard Worker const uint8_t *C2ReadView::data() const {
269*ec779b8eSAndroid Build Coastguard Worker return mImpl->error() ? nullptr : mImpl->data() + mOffset;
270*ec779b8eSAndroid Build Coastguard Worker }
271*ec779b8eSAndroid Build Coastguard Worker
error() const272*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2ReadView::error() const {
273*ec779b8eSAndroid Build Coastguard Worker return mImpl->error();
274*ec779b8eSAndroid Build Coastguard Worker }
275*ec779b8eSAndroid Build Coastguard Worker
subView(size_t offset,size_t size) const276*ec779b8eSAndroid Build Coastguard Worker C2ReadView C2ReadView::subView(size_t offset, size_t size) const {
277*ec779b8eSAndroid Build Coastguard Worker C2LinearRange subRange(*this, offset, size);
278*ec779b8eSAndroid Build Coastguard Worker return C2ReadView(mImpl, mOffset + subRange.offset(), subRange.size());
279*ec779b8eSAndroid Build Coastguard Worker }
280*ec779b8eSAndroid Build Coastguard Worker
281*ec779b8eSAndroid Build Coastguard Worker /**
282*ec779b8eSAndroid Build Coastguard Worker * Write view implementation.
283*ec779b8eSAndroid Build Coastguard Worker */
284*ec779b8eSAndroid Build Coastguard Worker class C2WriteView::Impl : public _C2MappedBlock1DImpl {
285*ec779b8eSAndroid Build Coastguard Worker using _C2MappedBlock1DImpl::_C2MappedBlock1DImpl;
286*ec779b8eSAndroid Build Coastguard Worker };
287*ec779b8eSAndroid Build Coastguard Worker
C2WriteView(std::shared_ptr<Impl> impl)288*ec779b8eSAndroid Build Coastguard Worker C2WriteView::C2WriteView(std::shared_ptr<Impl> impl)
289*ec779b8eSAndroid Build Coastguard Worker // UGLY: _C2LinearRangeAspect requires a bona-fide object for capacity to prevent spoofing, so
290*ec779b8eSAndroid Build Coastguard Worker // this is what we have to do.
291*ec779b8eSAndroid Build Coastguard Worker // TODO: use childRange
292*ec779b8eSAndroid Build Coastguard Worker : _C2EditableLinearRangeAspect(std::make_unique<C2LinearCapacity>(impl->size()).get()), mImpl(impl) { }
293*ec779b8eSAndroid Build Coastguard Worker
C2WriteView(c2_status_t error)294*ec779b8eSAndroid Build Coastguard Worker C2WriteView::C2WriteView(c2_status_t error)
295*ec779b8eSAndroid Build Coastguard Worker : _C2EditableLinearRangeAspect(nullptr), mImpl(std::make_shared<Impl>(error)) {}
296*ec779b8eSAndroid Build Coastguard Worker
base()297*ec779b8eSAndroid Build Coastguard Worker uint8_t *C2WriteView::base() { return mImpl->data(); }
298*ec779b8eSAndroid Build Coastguard Worker
data()299*ec779b8eSAndroid Build Coastguard Worker uint8_t *C2WriteView::data() { return mImpl->data() + offset(); }
300*ec779b8eSAndroid Build Coastguard Worker
error() const301*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2WriteView::error() const { return mImpl->error(); }
302*ec779b8eSAndroid Build Coastguard Worker
303*ec779b8eSAndroid Build Coastguard Worker /**
304*ec779b8eSAndroid Build Coastguard Worker * Const linear block implementation.
305*ec779b8eSAndroid Build Coastguard Worker */
C2ConstLinearBlock(std::shared_ptr<Impl> impl,const _C2LinearRangeAspect & range,C2Fence fence)306*ec779b8eSAndroid Build Coastguard Worker C2ConstLinearBlock::C2ConstLinearBlock(std::shared_ptr<Impl> impl, const _C2LinearRangeAspect &range, C2Fence fence)
307*ec779b8eSAndroid Build Coastguard Worker : C2Block1D(impl, range), mFence(fence) { }
308*ec779b8eSAndroid Build Coastguard Worker
map() const309*ec779b8eSAndroid Build Coastguard Worker C2Acquirable<C2ReadView> C2ConstLinearBlock::map() const {
310*ec779b8eSAndroid Build Coastguard Worker void *base = nullptr;
311*ec779b8eSAndroid Build Coastguard Worker uint32_t len = size();
312*ec779b8eSAndroid Build Coastguard Worker c2_status_t error = mImpl->getAllocation()->map(
313*ec779b8eSAndroid Build Coastguard Worker offset(), len, { C2MemoryUsage::CPU_READ, 0 }, nullptr, &base);
314*ec779b8eSAndroid Build Coastguard Worker // TODO: wait on fence
315*ec779b8eSAndroid Build Coastguard Worker if (error == C2_OK) {
316*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ReadViewBuddy::Impl> rvi = std::shared_ptr<ReadViewBuddy::Impl>(
317*ec779b8eSAndroid Build Coastguard Worker new ReadViewBuddy::Impl(*mImpl, (uint8_t *)base, offset(), len),
318*ec779b8eSAndroid Build Coastguard Worker [base, len](ReadViewBuddy::Impl *i) {
319*ec779b8eSAndroid Build Coastguard Worker (void)i->getAllocation()->unmap(base, len, nullptr);
320*ec779b8eSAndroid Build Coastguard Worker delete i;
321*ec779b8eSAndroid Build Coastguard Worker });
322*ec779b8eSAndroid Build Coastguard Worker return AcquirableReadViewBuddy(error, C2Fence(), ReadViewBuddy(rvi, 0, len));
323*ec779b8eSAndroid Build Coastguard Worker } else {
324*ec779b8eSAndroid Build Coastguard Worker return AcquirableReadViewBuddy(error, C2Fence(), ReadViewBuddy(error));
325*ec779b8eSAndroid Build Coastguard Worker }
326*ec779b8eSAndroid Build Coastguard Worker }
327*ec779b8eSAndroid Build Coastguard Worker
subBlock(size_t offset_,size_t size_) const328*ec779b8eSAndroid Build Coastguard Worker C2ConstLinearBlock C2ConstLinearBlock::subBlock(size_t offset_, size_t size_) const {
329*ec779b8eSAndroid Build Coastguard Worker C2LinearRange subRange(*mImpl, offset_, size_);
330*ec779b8eSAndroid Build Coastguard Worker return C2ConstLinearBlock(mImpl, subRange, mFence);
331*ec779b8eSAndroid Build Coastguard Worker }
332*ec779b8eSAndroid Build Coastguard Worker
333*ec779b8eSAndroid Build Coastguard Worker /**
334*ec779b8eSAndroid Build Coastguard Worker * Linear block implementation.
335*ec779b8eSAndroid Build Coastguard Worker */
C2LinearBlock(std::shared_ptr<Impl> impl,const _C2LinearRangeAspect & range)336*ec779b8eSAndroid Build Coastguard Worker C2LinearBlock::C2LinearBlock(std::shared_ptr<Impl> impl, const _C2LinearRangeAspect &range)
337*ec779b8eSAndroid Build Coastguard Worker : C2Block1D(impl, range) { }
338*ec779b8eSAndroid Build Coastguard Worker
map()339*ec779b8eSAndroid Build Coastguard Worker C2Acquirable<C2WriteView> C2LinearBlock::map() {
340*ec779b8eSAndroid Build Coastguard Worker void *base = nullptr;
341*ec779b8eSAndroid Build Coastguard Worker uint32_t len = size();
342*ec779b8eSAndroid Build Coastguard Worker c2_status_t error = mImpl->getAllocation()->map(
343*ec779b8eSAndroid Build Coastguard Worker offset(), len, { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE }, nullptr, &base);
344*ec779b8eSAndroid Build Coastguard Worker // TODO: wait on fence
345*ec779b8eSAndroid Build Coastguard Worker if (error == C2_OK) {
346*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<WriteViewBuddy::Impl> rvi = std::shared_ptr<WriteViewBuddy::Impl>(
347*ec779b8eSAndroid Build Coastguard Worker new WriteViewBuddy::Impl(*mImpl, (uint8_t *)base, 0, len),
348*ec779b8eSAndroid Build Coastguard Worker [base, len](WriteViewBuddy::Impl *i) {
349*ec779b8eSAndroid Build Coastguard Worker (void)i->getAllocation()->unmap(base, len, nullptr);
350*ec779b8eSAndroid Build Coastguard Worker delete i;
351*ec779b8eSAndroid Build Coastguard Worker });
352*ec779b8eSAndroid Build Coastguard Worker return AcquirableWriteViewBuddy(error, C2Fence(), WriteViewBuddy(rvi));
353*ec779b8eSAndroid Build Coastguard Worker } else {
354*ec779b8eSAndroid Build Coastguard Worker return AcquirableWriteViewBuddy(error, C2Fence(), WriteViewBuddy(error));
355*ec779b8eSAndroid Build Coastguard Worker }
356*ec779b8eSAndroid Build Coastguard Worker }
357*ec779b8eSAndroid Build Coastguard Worker
share(size_t offset_,size_t size_,C2Fence fence)358*ec779b8eSAndroid Build Coastguard Worker C2ConstLinearBlock C2LinearBlock::share(size_t offset_, size_t size_, C2Fence fence) {
359*ec779b8eSAndroid Build Coastguard Worker return ConstLinearBlockBuddy(mImpl, C2LinearRange(*this, offset_, size_), fence);
360*ec779b8eSAndroid Build Coastguard Worker }
361*ec779b8eSAndroid Build Coastguard Worker
C2BasicLinearBlockPool(const std::shared_ptr<C2Allocator> & allocator)362*ec779b8eSAndroid Build Coastguard Worker C2BasicLinearBlockPool::C2BasicLinearBlockPool(
363*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2Allocator> &allocator)
364*ec779b8eSAndroid Build Coastguard Worker : mAllocator(allocator) { }
365*ec779b8eSAndroid Build Coastguard Worker
fetchLinearBlock(uint32_t capacity,C2MemoryUsage usage,std::shared_ptr<C2LinearBlock> * block)366*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2BasicLinearBlockPool::fetchLinearBlock(
367*ec779b8eSAndroid Build Coastguard Worker uint32_t capacity,
368*ec779b8eSAndroid Build Coastguard Worker C2MemoryUsage usage,
369*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> *block /* nonnull */) {
370*ec779b8eSAndroid Build Coastguard Worker block->reset();
371*ec779b8eSAndroid Build Coastguard Worker
372*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> alloc;
373*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = mAllocator->newLinearAllocation(capacity, usage, &alloc);
374*ec779b8eSAndroid Build Coastguard Worker if (err != C2_OK) {
375*ec779b8eSAndroid Build Coastguard Worker return err;
376*ec779b8eSAndroid Build Coastguard Worker }
377*ec779b8eSAndroid Build Coastguard Worker
378*ec779b8eSAndroid Build Coastguard Worker *block = _C2BlockFactory::CreateLinearBlock(alloc);
379*ec779b8eSAndroid Build Coastguard Worker
380*ec779b8eSAndroid Build Coastguard Worker return C2_OK;
381*ec779b8eSAndroid Build Coastguard Worker }
382*ec779b8eSAndroid Build Coastguard Worker
383*ec779b8eSAndroid Build Coastguard Worker struct C2_HIDE C2PooledBlockPoolData : _C2BlockPoolData {
384*ec779b8eSAndroid Build Coastguard Worker
getTypeC2PooledBlockPoolData385*ec779b8eSAndroid Build Coastguard Worker virtual type_t getType() const override {
386*ec779b8eSAndroid Build Coastguard Worker return TYPE_BUFFERPOOL;
387*ec779b8eSAndroid Build Coastguard Worker }
388*ec779b8eSAndroid Build Coastguard Worker
getBufferPoolDataC2PooledBlockPoolData389*ec779b8eSAndroid Build Coastguard Worker void getBufferPoolData(std::shared_ptr<bufferpool::BufferPoolData> *data) const {
390*ec779b8eSAndroid Build Coastguard Worker *data = mData;
391*ec779b8eSAndroid Build Coastguard Worker }
392*ec779b8eSAndroid Build Coastguard Worker
C2PooledBlockPoolDataC2PooledBlockPoolData393*ec779b8eSAndroid Build Coastguard Worker C2PooledBlockPoolData(const std::shared_ptr<bufferpool::BufferPoolData> &data) : mData(data) {}
394*ec779b8eSAndroid Build Coastguard Worker
~C2PooledBlockPoolDataC2PooledBlockPoolData395*ec779b8eSAndroid Build Coastguard Worker virtual ~C2PooledBlockPoolData() override {}
396*ec779b8eSAndroid Build Coastguard Worker
397*ec779b8eSAndroid Build Coastguard Worker private:
398*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool::BufferPoolData> mData;
399*ec779b8eSAndroid Build Coastguard Worker };
400*ec779b8eSAndroid Build Coastguard Worker
GetBufferPoolData(const std::shared_ptr<const _C2BlockPoolData> & data,std::shared_ptr<bufferpool::BufferPoolData> * bufferPoolData)401*ec779b8eSAndroid Build Coastguard Worker bool _C2BlockFactory::GetBufferPoolData(
402*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<const _C2BlockPoolData> &data,
403*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool::BufferPoolData> *bufferPoolData) {
404*ec779b8eSAndroid Build Coastguard Worker if (data && data->getType() == _C2BlockPoolData::TYPE_BUFFERPOOL) {
405*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<const C2PooledBlockPoolData> poolData =
406*ec779b8eSAndroid Build Coastguard Worker std::static_pointer_cast<const C2PooledBlockPoolData>(data);
407*ec779b8eSAndroid Build Coastguard Worker poolData->getBufferPoolData(bufferPoolData);
408*ec779b8eSAndroid Build Coastguard Worker return true;
409*ec779b8eSAndroid Build Coastguard Worker }
410*ec779b8eSAndroid Build Coastguard Worker return false;
411*ec779b8eSAndroid Build Coastguard Worker }
412*ec779b8eSAndroid Build Coastguard Worker
413*ec779b8eSAndroid Build Coastguard Worker struct C2_HIDE C2PooledBlockPoolData2 : _C2BlockPoolData { // AIDL BufferPool(bufferpool2)
414*ec779b8eSAndroid Build Coastguard Worker
getTypeC2PooledBlockPoolData2415*ec779b8eSAndroid Build Coastguard Worker type_t getType() const override {
416*ec779b8eSAndroid Build Coastguard Worker return TYPE_BUFFERPOOL2;
417*ec779b8eSAndroid Build Coastguard Worker }
418*ec779b8eSAndroid Build Coastguard Worker
getBufferPoolDataC2PooledBlockPoolData2419*ec779b8eSAndroid Build Coastguard Worker void getBufferPoolData(std::shared_ptr<bufferpool2::BufferPoolData> *data) const {
420*ec779b8eSAndroid Build Coastguard Worker *data = mData;
421*ec779b8eSAndroid Build Coastguard Worker }
422*ec779b8eSAndroid Build Coastguard Worker
C2PooledBlockPoolData2C2PooledBlockPoolData2423*ec779b8eSAndroid Build Coastguard Worker C2PooledBlockPoolData2(const std::shared_ptr<bufferpool2::BufferPoolData> &data)
424*ec779b8eSAndroid Build Coastguard Worker : mData(data) {}
425*ec779b8eSAndroid Build Coastguard Worker
~C2PooledBlockPoolData2C2PooledBlockPoolData2426*ec779b8eSAndroid Build Coastguard Worker virtual ~C2PooledBlockPoolData2() override {}
427*ec779b8eSAndroid Build Coastguard Worker
428*ec779b8eSAndroid Build Coastguard Worker private:
429*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool2::BufferPoolData> mData;
430*ec779b8eSAndroid Build Coastguard Worker };
431*ec779b8eSAndroid Build Coastguard Worker
GetBufferPoolData(const std::shared_ptr<const _C2BlockPoolData> & data,std::shared_ptr<bufferpool2::BufferPoolData> * bufferPoolData)432*ec779b8eSAndroid Build Coastguard Worker bool _C2BlockFactory::GetBufferPoolData(
433*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<const _C2BlockPoolData> &data,
434*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool2::BufferPoolData> *bufferPoolData) {
435*ec779b8eSAndroid Build Coastguard Worker if (data && data->getType() == _C2BlockPoolData::TYPE_BUFFERPOOL2) {
436*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<const C2PooledBlockPoolData2> poolData =
437*ec779b8eSAndroid Build Coastguard Worker std::static_pointer_cast<const C2PooledBlockPoolData2>(data);
438*ec779b8eSAndroid Build Coastguard Worker poolData->getBufferPoolData(bufferPoolData);
439*ec779b8eSAndroid Build Coastguard Worker return true;
440*ec779b8eSAndroid Build Coastguard Worker }
441*ec779b8eSAndroid Build Coastguard Worker return false;
442*ec779b8eSAndroid Build Coastguard Worker }
443*ec779b8eSAndroid Build Coastguard Worker
CreateLinearBlock(const std::shared_ptr<C2LinearAllocation> & alloc,const std::shared_ptr<_C2BlockPoolData> & data,size_t offset,size_t size)444*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> _C2BlockFactory::CreateLinearBlock(
445*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2LinearAllocation> &alloc,
446*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<_C2BlockPoolData> &data, size_t offset, size_t size) {
447*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Block1D::Impl> impl =
448*ec779b8eSAndroid Build Coastguard Worker std::make_shared<C2Block1D::Impl>(alloc, data, offset, size);
449*ec779b8eSAndroid Build Coastguard Worker return std::shared_ptr<C2LinearBlock>(new C2LinearBlock(impl, *impl));
450*ec779b8eSAndroid Build Coastguard Worker }
451*ec779b8eSAndroid Build Coastguard Worker
GetLinearBlockPoolData(const C2Block1D & block)452*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<_C2BlockPoolData> _C2BlockFactory::GetLinearBlockPoolData(
453*ec779b8eSAndroid Build Coastguard Worker const C2Block1D &block) {
454*ec779b8eSAndroid Build Coastguard Worker if (block.mImpl) {
455*ec779b8eSAndroid Build Coastguard Worker return block.mImpl->poolData();
456*ec779b8eSAndroid Build Coastguard Worker }
457*ec779b8eSAndroid Build Coastguard Worker return nullptr;
458*ec779b8eSAndroid Build Coastguard Worker }
459*ec779b8eSAndroid Build Coastguard Worker
CreateLinearBlock(const C2Handle * handle)460*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> _C2BlockFactory::CreateLinearBlock(
461*ec779b8eSAndroid Build Coastguard Worker const C2Handle *handle) {
462*ec779b8eSAndroid Build Coastguard Worker // TODO: get proper allocator? and mutex?
463*ec779b8eSAndroid Build Coastguard Worker static std::shared_ptr<C2Allocator> sAllocator = []{
464*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Allocator> allocator;
465*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2AllocatorStore> allocatorStore = android::GetCodec2PlatformAllocatorStore();
466*ec779b8eSAndroid Build Coastguard Worker allocatorStore->fetchAllocator(C2AllocatorStore::DEFAULT_LINEAR, &allocator);
467*ec779b8eSAndroid Build Coastguard Worker
468*ec779b8eSAndroid Build Coastguard Worker return allocator;
469*ec779b8eSAndroid Build Coastguard Worker }();
470*ec779b8eSAndroid Build Coastguard Worker
471*ec779b8eSAndroid Build Coastguard Worker if (sAllocator == nullptr)
472*ec779b8eSAndroid Build Coastguard Worker return nullptr;
473*ec779b8eSAndroid Build Coastguard Worker
474*ec779b8eSAndroid Build Coastguard Worker bool isValidHandle = sAllocator->checkHandle(handle);
475*ec779b8eSAndroid Build Coastguard Worker
476*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> alloc;
477*ec779b8eSAndroid Build Coastguard Worker if (isValidHandle) {
478*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = sAllocator->priorLinearAllocation(handle, &alloc);
479*ec779b8eSAndroid Build Coastguard Worker if (err == C2_OK) {
480*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> block = _C2BlockFactory::CreateLinearBlock(alloc);
481*ec779b8eSAndroid Build Coastguard Worker return block;
482*ec779b8eSAndroid Build Coastguard Worker }
483*ec779b8eSAndroid Build Coastguard Worker }
484*ec779b8eSAndroid Build Coastguard Worker return nullptr;
485*ec779b8eSAndroid Build Coastguard Worker }
486*ec779b8eSAndroid Build Coastguard Worker
CreateLinearBlock(const C2Handle * cHandle,const std::shared_ptr<bufferpool::BufferPoolData> & data)487*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> _C2BlockFactory::CreateLinearBlock(
488*ec779b8eSAndroid Build Coastguard Worker const C2Handle *cHandle, const std::shared_ptr<bufferpool::BufferPoolData> &data) {
489*ec779b8eSAndroid Build Coastguard Worker // TODO: get proper allocator? and mutex?
490*ec779b8eSAndroid Build Coastguard Worker static std::shared_ptr<C2Allocator> sAllocator = []{
491*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Allocator> allocator;
492*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2AllocatorStore> allocatorStore = android::GetCodec2PlatformAllocatorStore();
493*ec779b8eSAndroid Build Coastguard Worker allocatorStore->fetchAllocator(C2AllocatorStore::DEFAULT_LINEAR, &allocator);
494*ec779b8eSAndroid Build Coastguard Worker
495*ec779b8eSAndroid Build Coastguard Worker return allocator;
496*ec779b8eSAndroid Build Coastguard Worker }();
497*ec779b8eSAndroid Build Coastguard Worker
498*ec779b8eSAndroid Build Coastguard Worker if (sAllocator == nullptr)
499*ec779b8eSAndroid Build Coastguard Worker return nullptr;
500*ec779b8eSAndroid Build Coastguard Worker
501*ec779b8eSAndroid Build Coastguard Worker bool isValidHandle = sAllocator->checkHandle(cHandle);
502*ec779b8eSAndroid Build Coastguard Worker
503*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> alloc;
504*ec779b8eSAndroid Build Coastguard Worker if (isValidHandle) {
505*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = sAllocator->priorLinearAllocation(cHandle, &alloc);
506*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2PooledBlockPoolData> poolData =
507*ec779b8eSAndroid Build Coastguard Worker std::make_shared<C2PooledBlockPoolData>(data);
508*ec779b8eSAndroid Build Coastguard Worker if (err == C2_OK && poolData) {
509*ec779b8eSAndroid Build Coastguard Worker // TODO: config params?
510*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> block =
511*ec779b8eSAndroid Build Coastguard Worker _C2BlockFactory::CreateLinearBlock(alloc, poolData);
512*ec779b8eSAndroid Build Coastguard Worker return block;
513*ec779b8eSAndroid Build Coastguard Worker }
514*ec779b8eSAndroid Build Coastguard Worker }
515*ec779b8eSAndroid Build Coastguard Worker return nullptr;
516*ec779b8eSAndroid Build Coastguard Worker };
517*ec779b8eSAndroid Build Coastguard Worker
CreateLinearBlock(const C2Handle * cHandle,const std::shared_ptr<bufferpool2::BufferPoolData> & data)518*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> _C2BlockFactory::CreateLinearBlock(
519*ec779b8eSAndroid Build Coastguard Worker const C2Handle *cHandle, const std::shared_ptr<bufferpool2::BufferPoolData> &data) {
520*ec779b8eSAndroid Build Coastguard Worker // TODO: get proper allocator? and mutex?
521*ec779b8eSAndroid Build Coastguard Worker static std::shared_ptr<C2Allocator> sAllocator = []{
522*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Allocator> allocator;
523*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2AllocatorStore> allocatorStore =
524*ec779b8eSAndroid Build Coastguard Worker android::GetCodec2PlatformAllocatorStore();
525*ec779b8eSAndroid Build Coastguard Worker allocatorStore->fetchAllocator(C2AllocatorStore::DEFAULT_LINEAR, &allocator);
526*ec779b8eSAndroid Build Coastguard Worker
527*ec779b8eSAndroid Build Coastguard Worker return allocator;
528*ec779b8eSAndroid Build Coastguard Worker }();
529*ec779b8eSAndroid Build Coastguard Worker
530*ec779b8eSAndroid Build Coastguard Worker if (sAllocator == nullptr)
531*ec779b8eSAndroid Build Coastguard Worker return nullptr;
532*ec779b8eSAndroid Build Coastguard Worker
533*ec779b8eSAndroid Build Coastguard Worker bool isValidHandle = sAllocator->checkHandle(cHandle);
534*ec779b8eSAndroid Build Coastguard Worker
535*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> alloc;
536*ec779b8eSAndroid Build Coastguard Worker if (isValidHandle) {
537*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = sAllocator->priorLinearAllocation(cHandle, &alloc);
538*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2PooledBlockPoolData2> poolData =
539*ec779b8eSAndroid Build Coastguard Worker std::make_shared<C2PooledBlockPoolData2>(data);
540*ec779b8eSAndroid Build Coastguard Worker if (err == C2_OK && poolData) {
541*ec779b8eSAndroid Build Coastguard Worker // TODO: config params?
542*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> block =
543*ec779b8eSAndroid Build Coastguard Worker _C2BlockFactory::CreateLinearBlock(alloc, poolData);
544*ec779b8eSAndroid Build Coastguard Worker return block;
545*ec779b8eSAndroid Build Coastguard Worker }
546*ec779b8eSAndroid Build Coastguard Worker }
547*ec779b8eSAndroid Build Coastguard Worker return nullptr;
548*ec779b8eSAndroid Build Coastguard Worker };
549*ec779b8eSAndroid Build Coastguard Worker
550*ec779b8eSAndroid Build Coastguard Worker /**
551*ec779b8eSAndroid Build Coastguard Worker * Wrapped C2Allocator which is injected to buffer pool on behalf of
552*ec779b8eSAndroid Build Coastguard Worker * C2BlockPool.
553*ec779b8eSAndroid Build Coastguard Worker */
554*ec779b8eSAndroid Build Coastguard Worker class _C2BufferPoolAllocator : public bufferpool_impl::BufferPoolAllocator {
555*ec779b8eSAndroid Build Coastguard Worker public:
_C2BufferPoolAllocator(const std::shared_ptr<C2Allocator> & allocator)556*ec779b8eSAndroid Build Coastguard Worker _C2BufferPoolAllocator(const std::shared_ptr<C2Allocator> &allocator)
557*ec779b8eSAndroid Build Coastguard Worker : mAllocator(allocator) {}
558*ec779b8eSAndroid Build Coastguard Worker
~_C2BufferPoolAllocator()559*ec779b8eSAndroid Build Coastguard Worker ~_C2BufferPoolAllocator() override {}
560*ec779b8eSAndroid Build Coastguard Worker
561*ec779b8eSAndroid Build Coastguard Worker ResultStatus allocate(const std::vector<uint8_t> ¶ms,
562*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool_impl::BufferPoolAllocation> *alloc,
563*ec779b8eSAndroid Build Coastguard Worker size_t *allocSize) override;
564*ec779b8eSAndroid Build Coastguard Worker
565*ec779b8eSAndroid Build Coastguard Worker bool compatible(const std::vector<uint8_t> &newParams,
566*ec779b8eSAndroid Build Coastguard Worker const std::vector<uint8_t> &oldParams) override;
567*ec779b8eSAndroid Build Coastguard Worker
568*ec779b8eSAndroid Build Coastguard Worker // Methods for codec2 component (C2BlockPool).
569*ec779b8eSAndroid Build Coastguard Worker /**
570*ec779b8eSAndroid Build Coastguard Worker * Transforms linear allocation parameters for C2Allocator to parameters
571*ec779b8eSAndroid Build Coastguard Worker * for buffer pool.
572*ec779b8eSAndroid Build Coastguard Worker *
573*ec779b8eSAndroid Build Coastguard Worker * @param capacity size of linear allocation
574*ec779b8eSAndroid Build Coastguard Worker * @param usage memory usage pattern for linear allocation
575*ec779b8eSAndroid Build Coastguard Worker * @param params allocation parameters for buffer pool
576*ec779b8eSAndroid Build Coastguard Worker */
577*ec779b8eSAndroid Build Coastguard Worker void getLinearParams(uint32_t capacity, C2MemoryUsage usage,
578*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> *params);
579*ec779b8eSAndroid Build Coastguard Worker
580*ec779b8eSAndroid Build Coastguard Worker /**
581*ec779b8eSAndroid Build Coastguard Worker * Transforms graphic allocation parameters for C2Allocator to parameters
582*ec779b8eSAndroid Build Coastguard Worker * for buffer pool.
583*ec779b8eSAndroid Build Coastguard Worker *
584*ec779b8eSAndroid Build Coastguard Worker * @param width width of graphic allocation
585*ec779b8eSAndroid Build Coastguard Worker * @param height height of graphic allocation
586*ec779b8eSAndroid Build Coastguard Worker * @param format color format of graphic allocation
587*ec779b8eSAndroid Build Coastguard Worker * @param params allocation parameter for buffer pool
588*ec779b8eSAndroid Build Coastguard Worker */
589*ec779b8eSAndroid Build Coastguard Worker void getGraphicParams(uint32_t width, uint32_t height,
590*ec779b8eSAndroid Build Coastguard Worker uint32_t format, C2MemoryUsage usage,
591*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> *params);
592*ec779b8eSAndroid Build Coastguard Worker
593*ec779b8eSAndroid Build Coastguard Worker /**
594*ec779b8eSAndroid Build Coastguard Worker * Transforms an existing native handle to a C2LinearAllocation.
595*ec779b8eSAndroid Build Coastguard Worker * Wrapper to C2Allocator#priorLinearAllocation
596*ec779b8eSAndroid Build Coastguard Worker */
597*ec779b8eSAndroid Build Coastguard Worker c2_status_t priorLinearAllocation(
598*ec779b8eSAndroid Build Coastguard Worker const C2Handle *handle,
599*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> *c2Allocation);
600*ec779b8eSAndroid Build Coastguard Worker
601*ec779b8eSAndroid Build Coastguard Worker /**
602*ec779b8eSAndroid Build Coastguard Worker * Transforms an existing native handle to a C2GraphicAllocation.
603*ec779b8eSAndroid Build Coastguard Worker * Wrapper to C2Allocator#priorGraphicAllocation
604*ec779b8eSAndroid Build Coastguard Worker */
605*ec779b8eSAndroid Build Coastguard Worker c2_status_t priorGraphicAllocation(
606*ec779b8eSAndroid Build Coastguard Worker const C2Handle *handle,
607*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> *c2Allocation);
608*ec779b8eSAndroid Build Coastguard Worker
609*ec779b8eSAndroid Build Coastguard Worker private:
610*ec779b8eSAndroid Build Coastguard Worker static constexpr int kMaxIntParams = 5; // large enough number;
611*ec779b8eSAndroid Build Coastguard Worker
612*ec779b8eSAndroid Build Coastguard Worker enum AllocType : uint8_t {
613*ec779b8eSAndroid Build Coastguard Worker ALLOC_NONE = 0,
614*ec779b8eSAndroid Build Coastguard Worker
615*ec779b8eSAndroid Build Coastguard Worker ALLOC_LINEAR,
616*ec779b8eSAndroid Build Coastguard Worker ALLOC_GRAPHIC,
617*ec779b8eSAndroid Build Coastguard Worker };
618*ec779b8eSAndroid Build Coastguard Worker
619*ec779b8eSAndroid Build Coastguard Worker union AllocParams {
620*ec779b8eSAndroid Build Coastguard Worker struct {
621*ec779b8eSAndroid Build Coastguard Worker AllocType allocType;
622*ec779b8eSAndroid Build Coastguard Worker C2MemoryUsage usage;
623*ec779b8eSAndroid Build Coastguard Worker uint32_t params[kMaxIntParams];
624*ec779b8eSAndroid Build Coastguard Worker } data;
625*ec779b8eSAndroid Build Coastguard Worker uint8_t array[0];
626*ec779b8eSAndroid Build Coastguard Worker
AllocParams()627*ec779b8eSAndroid Build Coastguard Worker AllocParams() : data{ALLOC_NONE, {0, 0}, {0}} {}
AllocParams(C2MemoryUsage usage,uint32_t capacity)628*ec779b8eSAndroid Build Coastguard Worker AllocParams(C2MemoryUsage usage, uint32_t capacity)
629*ec779b8eSAndroid Build Coastguard Worker : data{ALLOC_LINEAR, usage, {[0] = capacity}} {}
AllocParams(C2MemoryUsage usage,uint32_t width,uint32_t height,uint32_t format)630*ec779b8eSAndroid Build Coastguard Worker AllocParams(
631*ec779b8eSAndroid Build Coastguard Worker C2MemoryUsage usage,
632*ec779b8eSAndroid Build Coastguard Worker uint32_t width, uint32_t height, uint32_t format)
633*ec779b8eSAndroid Build Coastguard Worker : data{ALLOC_GRAPHIC, usage, {width, height, format}} {}
634*ec779b8eSAndroid Build Coastguard Worker };
635*ec779b8eSAndroid Build Coastguard Worker
636*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2Allocator> mAllocator;
637*ec779b8eSAndroid Build Coastguard Worker };
638*ec779b8eSAndroid Build Coastguard Worker
639*ec779b8eSAndroid Build Coastguard Worker struct LinearAllocationDtor {
LinearAllocationDtorLinearAllocationDtor640*ec779b8eSAndroid Build Coastguard Worker LinearAllocationDtor(const std::shared_ptr<C2LinearAllocation> &alloc)
641*ec779b8eSAndroid Build Coastguard Worker : mAllocation(alloc) {}
642*ec779b8eSAndroid Build Coastguard Worker
operator ()LinearAllocationDtor643*ec779b8eSAndroid Build Coastguard Worker void operator()(bufferpool_impl::BufferPoolAllocation *poolAlloc) { delete poolAlloc; }
644*ec779b8eSAndroid Build Coastguard Worker
645*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2LinearAllocation> mAllocation;
646*ec779b8eSAndroid Build Coastguard Worker };
647*ec779b8eSAndroid Build Coastguard Worker
648*ec779b8eSAndroid Build Coastguard Worker struct GraphicAllocationDtor {
GraphicAllocationDtorGraphicAllocationDtor649*ec779b8eSAndroid Build Coastguard Worker GraphicAllocationDtor(const std::shared_ptr<C2GraphicAllocation> &alloc)
650*ec779b8eSAndroid Build Coastguard Worker : mAllocation(alloc) {}
651*ec779b8eSAndroid Build Coastguard Worker
operator ()GraphicAllocationDtor652*ec779b8eSAndroid Build Coastguard Worker void operator()(bufferpool_impl::BufferPoolAllocation *poolAlloc) { delete poolAlloc; }
653*ec779b8eSAndroid Build Coastguard Worker
654*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2GraphicAllocation> mAllocation;
655*ec779b8eSAndroid Build Coastguard Worker };
656*ec779b8eSAndroid Build Coastguard Worker
allocate(const std::vector<uint8_t> & params,std::shared_ptr<bufferpool_impl::BufferPoolAllocation> * alloc,size_t * allocSize)657*ec779b8eSAndroid Build Coastguard Worker ResultStatus _C2BufferPoolAllocator::allocate(
658*ec779b8eSAndroid Build Coastguard Worker const std::vector<uint8_t> ¶ms,
659*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool_impl::BufferPoolAllocation> *alloc,
660*ec779b8eSAndroid Build Coastguard Worker size_t *allocSize) {
661*ec779b8eSAndroid Build Coastguard Worker AllocParams c2Params;
662*ec779b8eSAndroid Build Coastguard Worker memcpy(&c2Params, params.data(), std::min(sizeof(AllocParams), params.size()));
663*ec779b8eSAndroid Build Coastguard Worker c2_status_t status = C2_BAD_VALUE;
664*ec779b8eSAndroid Build Coastguard Worker switch(c2Params.data.allocType) {
665*ec779b8eSAndroid Build Coastguard Worker case ALLOC_NONE:
666*ec779b8eSAndroid Build Coastguard Worker break;
667*ec779b8eSAndroid Build Coastguard Worker case ALLOC_LINEAR: {
668*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> c2Linear;
669*ec779b8eSAndroid Build Coastguard Worker status = mAllocator->newLinearAllocation(
670*ec779b8eSAndroid Build Coastguard Worker c2Params.data.params[0], c2Params.data.usage, &c2Linear);
671*ec779b8eSAndroid Build Coastguard Worker if (status == C2_OK && c2Linear) {
672*ec779b8eSAndroid Build Coastguard Worker bufferpool_impl::BufferPoolAllocation *ptr =
673*ec779b8eSAndroid Build Coastguard Worker new bufferpool_impl::BufferPoolAllocation(c2Linear->handle());
674*ec779b8eSAndroid Build Coastguard Worker if (ptr) {
675*ec779b8eSAndroid Build Coastguard Worker *alloc = std::shared_ptr<bufferpool_impl::BufferPoolAllocation>(
676*ec779b8eSAndroid Build Coastguard Worker ptr, LinearAllocationDtor(c2Linear));
677*ec779b8eSAndroid Build Coastguard Worker if (*alloc) {
678*ec779b8eSAndroid Build Coastguard Worker *allocSize = (size_t)c2Params.data.params[0];
679*ec779b8eSAndroid Build Coastguard Worker return ResultStatus::OK;
680*ec779b8eSAndroid Build Coastguard Worker }
681*ec779b8eSAndroid Build Coastguard Worker delete ptr;
682*ec779b8eSAndroid Build Coastguard Worker }
683*ec779b8eSAndroid Build Coastguard Worker return ResultStatus::NO_MEMORY;
684*ec779b8eSAndroid Build Coastguard Worker }
685*ec779b8eSAndroid Build Coastguard Worker break;
686*ec779b8eSAndroid Build Coastguard Worker }
687*ec779b8eSAndroid Build Coastguard Worker case ALLOC_GRAPHIC: {
688*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> c2Graphic;
689*ec779b8eSAndroid Build Coastguard Worker status = mAllocator->newGraphicAllocation(
690*ec779b8eSAndroid Build Coastguard Worker c2Params.data.params[0],
691*ec779b8eSAndroid Build Coastguard Worker c2Params.data.params[1],
692*ec779b8eSAndroid Build Coastguard Worker c2Params.data.params[2],
693*ec779b8eSAndroid Build Coastguard Worker c2Params.data.usage, &c2Graphic);
694*ec779b8eSAndroid Build Coastguard Worker if (status == C2_OK && c2Graphic) {
695*ec779b8eSAndroid Build Coastguard Worker bufferpool_impl::BufferPoolAllocation *ptr =
696*ec779b8eSAndroid Build Coastguard Worker new bufferpool_impl::BufferPoolAllocation(c2Graphic->handle());
697*ec779b8eSAndroid Build Coastguard Worker if (ptr) {
698*ec779b8eSAndroid Build Coastguard Worker *alloc = std::shared_ptr<bufferpool_impl::BufferPoolAllocation>(
699*ec779b8eSAndroid Build Coastguard Worker ptr, GraphicAllocationDtor(c2Graphic));
700*ec779b8eSAndroid Build Coastguard Worker if (*alloc) {
701*ec779b8eSAndroid Build Coastguard Worker *allocSize = c2Params.data.params[0] * c2Params.data.params[1];
702*ec779b8eSAndroid Build Coastguard Worker return ResultStatus::OK;
703*ec779b8eSAndroid Build Coastguard Worker }
704*ec779b8eSAndroid Build Coastguard Worker delete ptr;
705*ec779b8eSAndroid Build Coastguard Worker }
706*ec779b8eSAndroid Build Coastguard Worker return ResultStatus::NO_MEMORY;
707*ec779b8eSAndroid Build Coastguard Worker }
708*ec779b8eSAndroid Build Coastguard Worker break;
709*ec779b8eSAndroid Build Coastguard Worker }
710*ec779b8eSAndroid Build Coastguard Worker default:
711*ec779b8eSAndroid Build Coastguard Worker break;
712*ec779b8eSAndroid Build Coastguard Worker }
713*ec779b8eSAndroid Build Coastguard Worker return ResultStatus::CRITICAL_ERROR;
714*ec779b8eSAndroid Build Coastguard Worker }
715*ec779b8eSAndroid Build Coastguard Worker
compatible(const std::vector<uint8_t> & newParams,const std::vector<uint8_t> & oldParams)716*ec779b8eSAndroid Build Coastguard Worker bool _C2BufferPoolAllocator::compatible(
717*ec779b8eSAndroid Build Coastguard Worker const std::vector<uint8_t> &newParams,
718*ec779b8eSAndroid Build Coastguard Worker const std::vector<uint8_t> &oldParams) {
719*ec779b8eSAndroid Build Coastguard Worker AllocParams newAlloc;
720*ec779b8eSAndroid Build Coastguard Worker AllocParams oldAlloc;
721*ec779b8eSAndroid Build Coastguard Worker memcpy(&newAlloc, newParams.data(), std::min(sizeof(AllocParams), newParams.size()));
722*ec779b8eSAndroid Build Coastguard Worker memcpy(&oldAlloc, oldParams.data(), std::min(sizeof(AllocParams), oldParams.size()));
723*ec779b8eSAndroid Build Coastguard Worker
724*ec779b8eSAndroid Build Coastguard Worker // TODO: support not exact matching. e.g.) newCapacity < oldCapacity
725*ec779b8eSAndroid Build Coastguard Worker if (newAlloc.data.allocType == oldAlloc.data.allocType &&
726*ec779b8eSAndroid Build Coastguard Worker newAlloc.data.usage.expected == oldAlloc.data.usage.expected) {
727*ec779b8eSAndroid Build Coastguard Worker for (int i = 0; i < kMaxIntParams; ++i) {
728*ec779b8eSAndroid Build Coastguard Worker if (newAlloc.data.params[i] != oldAlloc.data.params[i]) {
729*ec779b8eSAndroid Build Coastguard Worker return false;
730*ec779b8eSAndroid Build Coastguard Worker }
731*ec779b8eSAndroid Build Coastguard Worker }
732*ec779b8eSAndroid Build Coastguard Worker return true;
733*ec779b8eSAndroid Build Coastguard Worker }
734*ec779b8eSAndroid Build Coastguard Worker return false;
735*ec779b8eSAndroid Build Coastguard Worker }
736*ec779b8eSAndroid Build Coastguard Worker
getLinearParams(uint32_t capacity,C2MemoryUsage usage,std::vector<uint8_t> * params)737*ec779b8eSAndroid Build Coastguard Worker void _C2BufferPoolAllocator::getLinearParams(
738*ec779b8eSAndroid Build Coastguard Worker uint32_t capacity, C2MemoryUsage usage, std::vector<uint8_t> *params) {
739*ec779b8eSAndroid Build Coastguard Worker AllocParams c2Params(usage, capacity);
740*ec779b8eSAndroid Build Coastguard Worker params->assign(c2Params.array, c2Params.array + sizeof(AllocParams));
741*ec779b8eSAndroid Build Coastguard Worker }
742*ec779b8eSAndroid Build Coastguard Worker
getGraphicParams(uint32_t width,uint32_t height,uint32_t format,C2MemoryUsage usage,std::vector<uint8_t> * params)743*ec779b8eSAndroid Build Coastguard Worker void _C2BufferPoolAllocator::getGraphicParams(
744*ec779b8eSAndroid Build Coastguard Worker uint32_t width, uint32_t height, uint32_t format, C2MemoryUsage usage,
745*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> *params) {
746*ec779b8eSAndroid Build Coastguard Worker AllocParams c2Params(usage, width, height, format);
747*ec779b8eSAndroid Build Coastguard Worker params->assign(c2Params.array, c2Params.array + sizeof(AllocParams));
748*ec779b8eSAndroid Build Coastguard Worker }
749*ec779b8eSAndroid Build Coastguard Worker
priorLinearAllocation(const C2Handle * handle,std::shared_ptr<C2LinearAllocation> * c2Allocation)750*ec779b8eSAndroid Build Coastguard Worker c2_status_t _C2BufferPoolAllocator::priorLinearAllocation(
751*ec779b8eSAndroid Build Coastguard Worker const C2Handle *handle,
752*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> *c2Allocation) {
753*ec779b8eSAndroid Build Coastguard Worker return mAllocator->priorLinearAllocation(handle, c2Allocation);
754*ec779b8eSAndroid Build Coastguard Worker }
755*ec779b8eSAndroid Build Coastguard Worker
priorGraphicAllocation(const C2Handle * handle,std::shared_ptr<C2GraphicAllocation> * c2Allocation)756*ec779b8eSAndroid Build Coastguard Worker c2_status_t _C2BufferPoolAllocator::priorGraphicAllocation(
757*ec779b8eSAndroid Build Coastguard Worker const C2Handle *handle,
758*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> *c2Allocation) {
759*ec779b8eSAndroid Build Coastguard Worker return mAllocator->priorGraphicAllocation(handle, c2Allocation);
760*ec779b8eSAndroid Build Coastguard Worker }
761*ec779b8eSAndroid Build Coastguard Worker
762*ec779b8eSAndroid Build Coastguard Worker class C2PooledBlockPool::Impl {
763*ec779b8eSAndroid Build Coastguard Worker public:
Impl(const std::shared_ptr<C2Allocator> & allocator)764*ec779b8eSAndroid Build Coastguard Worker Impl(const std::shared_ptr<C2Allocator> &allocator)
765*ec779b8eSAndroid Build Coastguard Worker : mInit(C2_OK),
766*ec779b8eSAndroid Build Coastguard Worker mBufferPoolManager(bufferpool_impl::ClientManager::getInstance()),
767*ec779b8eSAndroid Build Coastguard Worker mAllocator(std::make_shared<_C2BufferPoolAllocator>(allocator)) {
768*ec779b8eSAndroid Build Coastguard Worker if (mAllocator && mBufferPoolManager) {
769*ec779b8eSAndroid Build Coastguard Worker if (mBufferPoolManager->create(
770*ec779b8eSAndroid Build Coastguard Worker mAllocator, &mConnectionId) == ResultStatus::OK) {
771*ec779b8eSAndroid Build Coastguard Worker return;
772*ec779b8eSAndroid Build Coastguard Worker }
773*ec779b8eSAndroid Build Coastguard Worker }
774*ec779b8eSAndroid Build Coastguard Worker mInit = C2_NO_INIT;
775*ec779b8eSAndroid Build Coastguard Worker }
776*ec779b8eSAndroid Build Coastguard Worker
~Impl()777*ec779b8eSAndroid Build Coastguard Worker ~Impl() {
778*ec779b8eSAndroid Build Coastguard Worker if (mInit == C2_OK) {
779*ec779b8eSAndroid Build Coastguard Worker mBufferPoolManager->close(mConnectionId);
780*ec779b8eSAndroid Build Coastguard Worker }
781*ec779b8eSAndroid Build Coastguard Worker }
782*ec779b8eSAndroid Build Coastguard Worker
fetchLinearBlock(uint32_t capacity,C2MemoryUsage usage,std::shared_ptr<C2LinearBlock> * block)783*ec779b8eSAndroid Build Coastguard Worker c2_status_t fetchLinearBlock(
784*ec779b8eSAndroid Build Coastguard Worker uint32_t capacity, C2MemoryUsage usage,
785*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> *block /* nonnull */) {
786*ec779b8eSAndroid Build Coastguard Worker block->reset();
787*ec779b8eSAndroid Build Coastguard Worker if (mInit != C2_OK) {
788*ec779b8eSAndroid Build Coastguard Worker return mInit;
789*ec779b8eSAndroid Build Coastguard Worker }
790*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> params;
791*ec779b8eSAndroid Build Coastguard Worker mAllocator->getLinearParams(capacity, usage, ¶ms);
792*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool::BufferPoolData> bufferPoolData;
793*ec779b8eSAndroid Build Coastguard Worker native_handle_t *cHandle = nullptr;
794*ec779b8eSAndroid Build Coastguard Worker ResultStatus status = mBufferPoolManager->allocate(
795*ec779b8eSAndroid Build Coastguard Worker mConnectionId, params, &cHandle, &bufferPoolData);
796*ec779b8eSAndroid Build Coastguard Worker if (status == ResultStatus::OK) {
797*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> alloc;
798*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2PooledBlockPoolData> poolData =
799*ec779b8eSAndroid Build Coastguard Worker std::make_shared<C2PooledBlockPoolData>(bufferPoolData);
800*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = mAllocator->priorLinearAllocation(cHandle, &alloc);
801*ec779b8eSAndroid Build Coastguard Worker if (err == C2_OK && poolData && alloc) {
802*ec779b8eSAndroid Build Coastguard Worker *block = _C2BlockFactory::CreateLinearBlock(alloc, poolData, 0, capacity);
803*ec779b8eSAndroid Build Coastguard Worker if (*block) {
804*ec779b8eSAndroid Build Coastguard Worker return C2_OK;
805*ec779b8eSAndroid Build Coastguard Worker }
806*ec779b8eSAndroid Build Coastguard Worker }
807*ec779b8eSAndroid Build Coastguard Worker return C2_NO_MEMORY;
808*ec779b8eSAndroid Build Coastguard Worker }
809*ec779b8eSAndroid Build Coastguard Worker if (status == ResultStatus::NO_MEMORY) {
810*ec779b8eSAndroid Build Coastguard Worker return C2_NO_MEMORY;
811*ec779b8eSAndroid Build Coastguard Worker }
812*ec779b8eSAndroid Build Coastguard Worker return C2_CORRUPTED;
813*ec779b8eSAndroid Build Coastguard Worker }
814*ec779b8eSAndroid Build Coastguard Worker
fetchGraphicBlock(uint32_t width,uint32_t height,uint32_t format,C2MemoryUsage usage,std::shared_ptr<C2GraphicBlock> * block)815*ec779b8eSAndroid Build Coastguard Worker c2_status_t fetchGraphicBlock(
816*ec779b8eSAndroid Build Coastguard Worker uint32_t width, uint32_t height, uint32_t format,
817*ec779b8eSAndroid Build Coastguard Worker C2MemoryUsage usage,
818*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicBlock> *block) {
819*ec779b8eSAndroid Build Coastguard Worker block->reset();
820*ec779b8eSAndroid Build Coastguard Worker if (mInit != C2_OK) {
821*ec779b8eSAndroid Build Coastguard Worker return mInit;
822*ec779b8eSAndroid Build Coastguard Worker }
823*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> params;
824*ec779b8eSAndroid Build Coastguard Worker mAllocator->getGraphicParams(width, height, format, usage, ¶ms);
825*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool::BufferPoolData> bufferPoolData;
826*ec779b8eSAndroid Build Coastguard Worker native_handle_t *cHandle = nullptr;
827*ec779b8eSAndroid Build Coastguard Worker ResultStatus status = mBufferPoolManager->allocate(
828*ec779b8eSAndroid Build Coastguard Worker mConnectionId, params, &cHandle, &bufferPoolData);
829*ec779b8eSAndroid Build Coastguard Worker if (status == ResultStatus::OK) {
830*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> alloc;
831*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2PooledBlockPoolData> poolData =
832*ec779b8eSAndroid Build Coastguard Worker std::make_shared<C2PooledBlockPoolData>(bufferPoolData);
833*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = mAllocator->priorGraphicAllocation(
834*ec779b8eSAndroid Build Coastguard Worker cHandle, &alloc);
835*ec779b8eSAndroid Build Coastguard Worker if (err == C2_OK && poolData && alloc) {
836*ec779b8eSAndroid Build Coastguard Worker *block = _C2BlockFactory::CreateGraphicBlock(
837*ec779b8eSAndroid Build Coastguard Worker alloc, poolData, C2Rect(width, height));
838*ec779b8eSAndroid Build Coastguard Worker if (*block) {
839*ec779b8eSAndroid Build Coastguard Worker return C2_OK;
840*ec779b8eSAndroid Build Coastguard Worker }
841*ec779b8eSAndroid Build Coastguard Worker }
842*ec779b8eSAndroid Build Coastguard Worker return C2_NO_MEMORY;
843*ec779b8eSAndroid Build Coastguard Worker }
844*ec779b8eSAndroid Build Coastguard Worker if (status == ResultStatus::NO_MEMORY) {
845*ec779b8eSAndroid Build Coastguard Worker return C2_NO_MEMORY;
846*ec779b8eSAndroid Build Coastguard Worker }
847*ec779b8eSAndroid Build Coastguard Worker return C2_CORRUPTED;
848*ec779b8eSAndroid Build Coastguard Worker }
849*ec779b8eSAndroid Build Coastguard Worker
getConnectionId()850*ec779b8eSAndroid Build Coastguard Worker bufferpool_impl::ConnectionId getConnectionId() {
851*ec779b8eSAndroid Build Coastguard Worker return mInit != C2_OK ? bufferpool_impl::INVALID_CONNECTIONID : mConnectionId;
852*ec779b8eSAndroid Build Coastguard Worker }
853*ec779b8eSAndroid Build Coastguard Worker
854*ec779b8eSAndroid Build Coastguard Worker private:
855*ec779b8eSAndroid Build Coastguard Worker c2_status_t mInit;
856*ec779b8eSAndroid Build Coastguard Worker const android::sp<bufferpool_impl::ClientManager> mBufferPoolManager;
857*ec779b8eSAndroid Build Coastguard Worker bufferpool_impl::ConnectionId mConnectionId; // locally
858*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<_C2BufferPoolAllocator> mAllocator;
859*ec779b8eSAndroid Build Coastguard Worker };
860*ec779b8eSAndroid Build Coastguard Worker
861*ec779b8eSAndroid Build Coastguard Worker /**
862*ec779b8eSAndroid Build Coastguard Worker * Wrapped C2Allocator which is injected to AIDL buffer pool on behalf of
863*ec779b8eSAndroid Build Coastguard Worker * C2BlockPool.
864*ec779b8eSAndroid Build Coastguard Worker */
865*ec779b8eSAndroid Build Coastguard Worker class _C2BufferPoolAllocator2 : public bufferpool2_impl::BufferPoolAllocator {
866*ec779b8eSAndroid Build Coastguard Worker public:
_C2BufferPoolAllocator2(const std::shared_ptr<C2Allocator> & allocator)867*ec779b8eSAndroid Build Coastguard Worker _C2BufferPoolAllocator2(const std::shared_ptr<C2Allocator> &allocator)
868*ec779b8eSAndroid Build Coastguard Worker : mAllocator(allocator) {}
869*ec779b8eSAndroid Build Coastguard Worker
~_C2BufferPoolAllocator2()870*ec779b8eSAndroid Build Coastguard Worker ~_C2BufferPoolAllocator2() override {}
871*ec779b8eSAndroid Build Coastguard Worker
872*ec779b8eSAndroid Build Coastguard Worker bufferpool2_impl::BufferPoolStatus allocate(const std::vector<uint8_t> ¶ms,
873*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool2_impl::BufferPoolAllocation> *alloc,
874*ec779b8eSAndroid Build Coastguard Worker size_t *allocSize) override;
875*ec779b8eSAndroid Build Coastguard Worker
876*ec779b8eSAndroid Build Coastguard Worker bool compatible(const std::vector<uint8_t> &newParams,
877*ec779b8eSAndroid Build Coastguard Worker const std::vector<uint8_t> &oldParams) override;
878*ec779b8eSAndroid Build Coastguard Worker
879*ec779b8eSAndroid Build Coastguard Worker // Methods for codec2 component (C2BlockPool).
880*ec779b8eSAndroid Build Coastguard Worker /**
881*ec779b8eSAndroid Build Coastguard Worker * Transforms linear allocation parameters for C2Allocator to parameters
882*ec779b8eSAndroid Build Coastguard Worker * for buffer pool.
883*ec779b8eSAndroid Build Coastguard Worker *
884*ec779b8eSAndroid Build Coastguard Worker * @param capacity size of linear allocation
885*ec779b8eSAndroid Build Coastguard Worker * @param usage memory usage pattern for linear allocation
886*ec779b8eSAndroid Build Coastguard Worker * @param params allocation parameters for buffer pool
887*ec779b8eSAndroid Build Coastguard Worker */
888*ec779b8eSAndroid Build Coastguard Worker void getLinearParams(uint32_t capacity, C2MemoryUsage usage,
889*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> *params);
890*ec779b8eSAndroid Build Coastguard Worker
891*ec779b8eSAndroid Build Coastguard Worker /**
892*ec779b8eSAndroid Build Coastguard Worker * Transforms graphic allocation parameters for C2Allocator to parameters
893*ec779b8eSAndroid Build Coastguard Worker * for buffer pool.
894*ec779b8eSAndroid Build Coastguard Worker *
895*ec779b8eSAndroid Build Coastguard Worker * @param width width of graphic allocation
896*ec779b8eSAndroid Build Coastguard Worker * @param height height of graphic allocation
897*ec779b8eSAndroid Build Coastguard Worker * @param format color format of graphic allocation
898*ec779b8eSAndroid Build Coastguard Worker * @param params allocation parameter for buffer pool
899*ec779b8eSAndroid Build Coastguard Worker */
900*ec779b8eSAndroid Build Coastguard Worker void getGraphicParams(uint32_t width, uint32_t height,
901*ec779b8eSAndroid Build Coastguard Worker uint32_t format, C2MemoryUsage usage,
902*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> *params);
903*ec779b8eSAndroid Build Coastguard Worker
904*ec779b8eSAndroid Build Coastguard Worker /**
905*ec779b8eSAndroid Build Coastguard Worker * Transforms an existing native handle to a C2LinearAllocation.
906*ec779b8eSAndroid Build Coastguard Worker * Wrapper to C2Allocator#priorLinearAllocation
907*ec779b8eSAndroid Build Coastguard Worker */
908*ec779b8eSAndroid Build Coastguard Worker c2_status_t priorLinearAllocation(
909*ec779b8eSAndroid Build Coastguard Worker const C2Handle *handle,
910*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> *c2Allocation);
911*ec779b8eSAndroid Build Coastguard Worker
912*ec779b8eSAndroid Build Coastguard Worker /**
913*ec779b8eSAndroid Build Coastguard Worker * Transforms an existing native handle to a C2GraphicAllocation.
914*ec779b8eSAndroid Build Coastguard Worker * Wrapper to C2Allocator#priorGraphicAllocation
915*ec779b8eSAndroid Build Coastguard Worker */
916*ec779b8eSAndroid Build Coastguard Worker c2_status_t priorGraphicAllocation(
917*ec779b8eSAndroid Build Coastguard Worker const C2Handle *handle,
918*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> *c2Allocation);
919*ec779b8eSAndroid Build Coastguard Worker
920*ec779b8eSAndroid Build Coastguard Worker private:
921*ec779b8eSAndroid Build Coastguard Worker static constexpr int kMaxIntParams = 5; // large enough number;
922*ec779b8eSAndroid Build Coastguard Worker
923*ec779b8eSAndroid Build Coastguard Worker enum AllocType : uint8_t {
924*ec779b8eSAndroid Build Coastguard Worker ALLOC_NONE = 0,
925*ec779b8eSAndroid Build Coastguard Worker
926*ec779b8eSAndroid Build Coastguard Worker ALLOC_LINEAR,
927*ec779b8eSAndroid Build Coastguard Worker ALLOC_GRAPHIC,
928*ec779b8eSAndroid Build Coastguard Worker };
929*ec779b8eSAndroid Build Coastguard Worker
930*ec779b8eSAndroid Build Coastguard Worker union AllocParams {
931*ec779b8eSAndroid Build Coastguard Worker struct {
932*ec779b8eSAndroid Build Coastguard Worker AllocType allocType;
933*ec779b8eSAndroid Build Coastguard Worker C2MemoryUsage usage;
934*ec779b8eSAndroid Build Coastguard Worker uint32_t params[kMaxIntParams];
935*ec779b8eSAndroid Build Coastguard Worker } data;
936*ec779b8eSAndroid Build Coastguard Worker uint8_t array[0];
937*ec779b8eSAndroid Build Coastguard Worker
AllocParams()938*ec779b8eSAndroid Build Coastguard Worker AllocParams() : data{ALLOC_NONE, {0, 0}, {0}} {}
AllocParams(C2MemoryUsage usage,uint32_t capacity)939*ec779b8eSAndroid Build Coastguard Worker AllocParams(C2MemoryUsage usage, uint32_t capacity)
940*ec779b8eSAndroid Build Coastguard Worker : data{ALLOC_LINEAR, usage, {[0] = capacity}} {}
AllocParams(C2MemoryUsage usage,uint32_t width,uint32_t height,uint32_t format)941*ec779b8eSAndroid Build Coastguard Worker AllocParams(
942*ec779b8eSAndroid Build Coastguard Worker C2MemoryUsage usage,
943*ec779b8eSAndroid Build Coastguard Worker uint32_t width, uint32_t height, uint32_t format)
944*ec779b8eSAndroid Build Coastguard Worker : data{ALLOC_GRAPHIC, usage, {width, height, format}} {}
945*ec779b8eSAndroid Build Coastguard Worker };
946*ec779b8eSAndroid Build Coastguard Worker
947*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2Allocator> mAllocator;
948*ec779b8eSAndroid Build Coastguard Worker };
949*ec779b8eSAndroid Build Coastguard Worker
950*ec779b8eSAndroid Build Coastguard Worker struct LinearAllocationDtor2 {
LinearAllocationDtor2LinearAllocationDtor2951*ec779b8eSAndroid Build Coastguard Worker LinearAllocationDtor2(const std::shared_ptr<C2LinearAllocation> &alloc)
952*ec779b8eSAndroid Build Coastguard Worker : mAllocation(alloc) {}
953*ec779b8eSAndroid Build Coastguard Worker
operator ()LinearAllocationDtor2954*ec779b8eSAndroid Build Coastguard Worker void operator()(bufferpool2_impl::BufferPoolAllocation *poolAlloc) { delete poolAlloc; }
955*ec779b8eSAndroid Build Coastguard Worker
956*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2LinearAllocation> mAllocation;
957*ec779b8eSAndroid Build Coastguard Worker };
958*ec779b8eSAndroid Build Coastguard Worker
959*ec779b8eSAndroid Build Coastguard Worker struct GraphicAllocationDtor2 {
GraphicAllocationDtor2GraphicAllocationDtor2960*ec779b8eSAndroid Build Coastguard Worker GraphicAllocationDtor2(const std::shared_ptr<C2GraphicAllocation> &alloc)
961*ec779b8eSAndroid Build Coastguard Worker : mAllocation(alloc) {}
962*ec779b8eSAndroid Build Coastguard Worker
operator ()GraphicAllocationDtor2963*ec779b8eSAndroid Build Coastguard Worker void operator()(bufferpool2_impl::BufferPoolAllocation *poolAlloc) { delete poolAlloc; }
964*ec779b8eSAndroid Build Coastguard Worker
965*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2GraphicAllocation> mAllocation;
966*ec779b8eSAndroid Build Coastguard Worker };
967*ec779b8eSAndroid Build Coastguard Worker
allocate(const std::vector<uint8_t> & params,std::shared_ptr<bufferpool2_impl::BufferPoolAllocation> * alloc,size_t * allocSize)968*ec779b8eSAndroid Build Coastguard Worker bufferpool2_impl::BufferPoolStatus _C2BufferPoolAllocator2::allocate(
969*ec779b8eSAndroid Build Coastguard Worker const std::vector<uint8_t> ¶ms,
970*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool2_impl::BufferPoolAllocation> *alloc,
971*ec779b8eSAndroid Build Coastguard Worker size_t *allocSize) {
972*ec779b8eSAndroid Build Coastguard Worker AllocParams c2Params;
973*ec779b8eSAndroid Build Coastguard Worker memcpy(&c2Params, params.data(), std::min(sizeof(AllocParams), params.size()));
974*ec779b8eSAndroid Build Coastguard Worker c2_status_t status = C2_BAD_VALUE;
975*ec779b8eSAndroid Build Coastguard Worker switch(c2Params.data.allocType) {
976*ec779b8eSAndroid Build Coastguard Worker case ALLOC_NONE:
977*ec779b8eSAndroid Build Coastguard Worker break;
978*ec779b8eSAndroid Build Coastguard Worker case ALLOC_LINEAR: {
979*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> c2Linear;
980*ec779b8eSAndroid Build Coastguard Worker status = mAllocator->newLinearAllocation(
981*ec779b8eSAndroid Build Coastguard Worker c2Params.data.params[0], c2Params.data.usage, &c2Linear);
982*ec779b8eSAndroid Build Coastguard Worker if (status == C2_OK && c2Linear) {
983*ec779b8eSAndroid Build Coastguard Worker bufferpool2_impl::BufferPoolAllocation *ptr =
984*ec779b8eSAndroid Build Coastguard Worker new bufferpool2_impl::BufferPoolAllocation(c2Linear->handle());
985*ec779b8eSAndroid Build Coastguard Worker if (ptr) {
986*ec779b8eSAndroid Build Coastguard Worker *alloc = std::shared_ptr<bufferpool2_impl::BufferPoolAllocation>(
987*ec779b8eSAndroid Build Coastguard Worker ptr, LinearAllocationDtor2(c2Linear));
988*ec779b8eSAndroid Build Coastguard Worker if (*alloc) {
989*ec779b8eSAndroid Build Coastguard Worker *allocSize = (size_t)c2Params.data.params[0];
990*ec779b8eSAndroid Build Coastguard Worker return ResultStatus2::OK;
991*ec779b8eSAndroid Build Coastguard Worker }
992*ec779b8eSAndroid Build Coastguard Worker delete ptr;
993*ec779b8eSAndroid Build Coastguard Worker }
994*ec779b8eSAndroid Build Coastguard Worker return ResultStatus2::NO_MEMORY;
995*ec779b8eSAndroid Build Coastguard Worker }
996*ec779b8eSAndroid Build Coastguard Worker break;
997*ec779b8eSAndroid Build Coastguard Worker }
998*ec779b8eSAndroid Build Coastguard Worker case ALLOC_GRAPHIC: {
999*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> c2Graphic;
1000*ec779b8eSAndroid Build Coastguard Worker status = mAllocator->newGraphicAllocation(
1001*ec779b8eSAndroid Build Coastguard Worker c2Params.data.params[0],
1002*ec779b8eSAndroid Build Coastguard Worker c2Params.data.params[1],
1003*ec779b8eSAndroid Build Coastguard Worker c2Params.data.params[2],
1004*ec779b8eSAndroid Build Coastguard Worker c2Params.data.usage, &c2Graphic);
1005*ec779b8eSAndroid Build Coastguard Worker if (status == C2_OK && c2Graphic) {
1006*ec779b8eSAndroid Build Coastguard Worker bufferpool2_impl::BufferPoolAllocation *ptr =
1007*ec779b8eSAndroid Build Coastguard Worker new bufferpool2_impl::BufferPoolAllocation(c2Graphic->handle());
1008*ec779b8eSAndroid Build Coastguard Worker if (ptr) {
1009*ec779b8eSAndroid Build Coastguard Worker *alloc = std::shared_ptr<bufferpool2_impl::BufferPoolAllocation>(
1010*ec779b8eSAndroid Build Coastguard Worker ptr, GraphicAllocationDtor2(c2Graphic));
1011*ec779b8eSAndroid Build Coastguard Worker if (*alloc) {
1012*ec779b8eSAndroid Build Coastguard Worker *allocSize = c2Params.data.params[0] * c2Params.data.params[1];
1013*ec779b8eSAndroid Build Coastguard Worker return ResultStatus2::OK;
1014*ec779b8eSAndroid Build Coastguard Worker }
1015*ec779b8eSAndroid Build Coastguard Worker delete ptr;
1016*ec779b8eSAndroid Build Coastguard Worker }
1017*ec779b8eSAndroid Build Coastguard Worker return ResultStatus2::NO_MEMORY;
1018*ec779b8eSAndroid Build Coastguard Worker }
1019*ec779b8eSAndroid Build Coastguard Worker break;
1020*ec779b8eSAndroid Build Coastguard Worker }
1021*ec779b8eSAndroid Build Coastguard Worker default:
1022*ec779b8eSAndroid Build Coastguard Worker break;
1023*ec779b8eSAndroid Build Coastguard Worker }
1024*ec779b8eSAndroid Build Coastguard Worker return ResultStatus2::CRITICAL_ERROR;
1025*ec779b8eSAndroid Build Coastguard Worker }
1026*ec779b8eSAndroid Build Coastguard Worker
compatible(const std::vector<uint8_t> & newParams,const std::vector<uint8_t> & oldParams)1027*ec779b8eSAndroid Build Coastguard Worker bool _C2BufferPoolAllocator2::compatible(
1028*ec779b8eSAndroid Build Coastguard Worker const std::vector<uint8_t> &newParams,
1029*ec779b8eSAndroid Build Coastguard Worker const std::vector<uint8_t> &oldParams) {
1030*ec779b8eSAndroid Build Coastguard Worker AllocParams newAlloc;
1031*ec779b8eSAndroid Build Coastguard Worker AllocParams oldAlloc;
1032*ec779b8eSAndroid Build Coastguard Worker memcpy(&newAlloc, newParams.data(), std::min(sizeof(AllocParams), newParams.size()));
1033*ec779b8eSAndroid Build Coastguard Worker memcpy(&oldAlloc, oldParams.data(), std::min(sizeof(AllocParams), oldParams.size()));
1034*ec779b8eSAndroid Build Coastguard Worker
1035*ec779b8eSAndroid Build Coastguard Worker // TODO: support not exact matching. e.g.) newCapacity < oldCapacity
1036*ec779b8eSAndroid Build Coastguard Worker if (newAlloc.data.allocType == oldAlloc.data.allocType &&
1037*ec779b8eSAndroid Build Coastguard Worker newAlloc.data.usage.expected == oldAlloc.data.usage.expected) {
1038*ec779b8eSAndroid Build Coastguard Worker for (int i = 0; i < kMaxIntParams; ++i) {
1039*ec779b8eSAndroid Build Coastguard Worker if (newAlloc.data.params[i] != oldAlloc.data.params[i]) {
1040*ec779b8eSAndroid Build Coastguard Worker return false;
1041*ec779b8eSAndroid Build Coastguard Worker }
1042*ec779b8eSAndroid Build Coastguard Worker }
1043*ec779b8eSAndroid Build Coastguard Worker return true;
1044*ec779b8eSAndroid Build Coastguard Worker }
1045*ec779b8eSAndroid Build Coastguard Worker return false;
1046*ec779b8eSAndroid Build Coastguard Worker }
1047*ec779b8eSAndroid Build Coastguard Worker
getLinearParams(uint32_t capacity,C2MemoryUsage usage,std::vector<uint8_t> * params)1048*ec779b8eSAndroid Build Coastguard Worker void _C2BufferPoolAllocator2::getLinearParams(
1049*ec779b8eSAndroid Build Coastguard Worker uint32_t capacity, C2MemoryUsage usage, std::vector<uint8_t> *params) {
1050*ec779b8eSAndroid Build Coastguard Worker AllocParams c2Params(usage, capacity);
1051*ec779b8eSAndroid Build Coastguard Worker params->assign(c2Params.array, c2Params.array + sizeof(AllocParams));
1052*ec779b8eSAndroid Build Coastguard Worker }
1053*ec779b8eSAndroid Build Coastguard Worker
getGraphicParams(uint32_t width,uint32_t height,uint32_t format,C2MemoryUsage usage,std::vector<uint8_t> * params)1054*ec779b8eSAndroid Build Coastguard Worker void _C2BufferPoolAllocator2::getGraphicParams(
1055*ec779b8eSAndroid Build Coastguard Worker uint32_t width, uint32_t height, uint32_t format, C2MemoryUsage usage,
1056*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> *params) {
1057*ec779b8eSAndroid Build Coastguard Worker AllocParams c2Params(usage, width, height, format);
1058*ec779b8eSAndroid Build Coastguard Worker params->assign(c2Params.array, c2Params.array + sizeof(AllocParams));
1059*ec779b8eSAndroid Build Coastguard Worker }
1060*ec779b8eSAndroid Build Coastguard Worker
priorLinearAllocation(const C2Handle * handle,std::shared_ptr<C2LinearAllocation> * c2Allocation)1061*ec779b8eSAndroid Build Coastguard Worker c2_status_t _C2BufferPoolAllocator2::priorLinearAllocation(
1062*ec779b8eSAndroid Build Coastguard Worker const C2Handle *handle,
1063*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> *c2Allocation) {
1064*ec779b8eSAndroid Build Coastguard Worker return mAllocator->priorLinearAllocation(handle, c2Allocation);
1065*ec779b8eSAndroid Build Coastguard Worker }
1066*ec779b8eSAndroid Build Coastguard Worker
priorGraphicAllocation(const C2Handle * handle,std::shared_ptr<C2GraphicAllocation> * c2Allocation)1067*ec779b8eSAndroid Build Coastguard Worker c2_status_t _C2BufferPoolAllocator2::priorGraphicAllocation(
1068*ec779b8eSAndroid Build Coastguard Worker const C2Handle *handle,
1069*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> *c2Allocation) {
1070*ec779b8eSAndroid Build Coastguard Worker return mAllocator->priorGraphicAllocation(handle, c2Allocation);
1071*ec779b8eSAndroid Build Coastguard Worker }
1072*ec779b8eSAndroid Build Coastguard Worker
1073*ec779b8eSAndroid Build Coastguard Worker class C2PooledBlockPool::Impl2 {
1074*ec779b8eSAndroid Build Coastguard Worker public:
Impl2(const std::shared_ptr<C2Allocator> & allocator)1075*ec779b8eSAndroid Build Coastguard Worker Impl2(const std::shared_ptr<C2Allocator> &allocator)
1076*ec779b8eSAndroid Build Coastguard Worker : mInit(C2_OK),
1077*ec779b8eSAndroid Build Coastguard Worker mBufferPoolManager(bufferpool2_impl::ClientManager::getInstance()),
1078*ec779b8eSAndroid Build Coastguard Worker mAllocator(std::make_shared<_C2BufferPoolAllocator2>(allocator)) {
1079*ec779b8eSAndroid Build Coastguard Worker if (mAllocator && mBufferPoolManager) {
1080*ec779b8eSAndroid Build Coastguard Worker if (mBufferPoolManager->create(
1081*ec779b8eSAndroid Build Coastguard Worker mAllocator, &mConnectionId) == ResultStatus2::OK) {
1082*ec779b8eSAndroid Build Coastguard Worker return;
1083*ec779b8eSAndroid Build Coastguard Worker }
1084*ec779b8eSAndroid Build Coastguard Worker }
1085*ec779b8eSAndroid Build Coastguard Worker mInit = C2_NO_INIT;
1086*ec779b8eSAndroid Build Coastguard Worker }
1087*ec779b8eSAndroid Build Coastguard Worker
~Impl2()1088*ec779b8eSAndroid Build Coastguard Worker ~Impl2() {
1089*ec779b8eSAndroid Build Coastguard Worker if (mInit == C2_OK) {
1090*ec779b8eSAndroid Build Coastguard Worker mBufferPoolManager->close(mConnectionId);
1091*ec779b8eSAndroid Build Coastguard Worker }
1092*ec779b8eSAndroid Build Coastguard Worker }
1093*ec779b8eSAndroid Build Coastguard Worker
fetchLinearBlock(uint32_t capacity,C2MemoryUsage usage,std::shared_ptr<C2LinearBlock> * block)1094*ec779b8eSAndroid Build Coastguard Worker c2_status_t fetchLinearBlock(
1095*ec779b8eSAndroid Build Coastguard Worker uint32_t capacity, C2MemoryUsage usage,
1096*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> *block /* nonnull */) {
1097*ec779b8eSAndroid Build Coastguard Worker block->reset();
1098*ec779b8eSAndroid Build Coastguard Worker if (mInit != C2_OK) {
1099*ec779b8eSAndroid Build Coastguard Worker return mInit;
1100*ec779b8eSAndroid Build Coastguard Worker }
1101*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> params;
1102*ec779b8eSAndroid Build Coastguard Worker mAllocator->getLinearParams(capacity, usage, ¶ms);
1103*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool2::BufferPoolData> bufferPoolData;
1104*ec779b8eSAndroid Build Coastguard Worker native_handle_t *cHandle = nullptr;
1105*ec779b8eSAndroid Build Coastguard Worker bufferpool2_impl::BufferPoolStatus status = mBufferPoolManager->allocate(
1106*ec779b8eSAndroid Build Coastguard Worker mConnectionId, params, &cHandle, &bufferPoolData);
1107*ec779b8eSAndroid Build Coastguard Worker if (status == ResultStatus2::OK) {
1108*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearAllocation> alloc;
1109*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2PooledBlockPoolData2> poolData =
1110*ec779b8eSAndroid Build Coastguard Worker std::make_shared<C2PooledBlockPoolData2>(bufferPoolData);
1111*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = mAllocator->priorLinearAllocation(cHandle, &alloc);
1112*ec779b8eSAndroid Build Coastguard Worker if (err == C2_OK && poolData && alloc) {
1113*ec779b8eSAndroid Build Coastguard Worker *block = _C2BlockFactory::CreateLinearBlock(alloc, poolData, 0, capacity);
1114*ec779b8eSAndroid Build Coastguard Worker if (*block) {
1115*ec779b8eSAndroid Build Coastguard Worker return C2_OK;
1116*ec779b8eSAndroid Build Coastguard Worker }
1117*ec779b8eSAndroid Build Coastguard Worker }
1118*ec779b8eSAndroid Build Coastguard Worker return C2_NO_MEMORY;
1119*ec779b8eSAndroid Build Coastguard Worker }
1120*ec779b8eSAndroid Build Coastguard Worker if (status == ResultStatus2::NO_MEMORY) {
1121*ec779b8eSAndroid Build Coastguard Worker return C2_NO_MEMORY;
1122*ec779b8eSAndroid Build Coastguard Worker }
1123*ec779b8eSAndroid Build Coastguard Worker return C2_CORRUPTED;
1124*ec779b8eSAndroid Build Coastguard Worker }
1125*ec779b8eSAndroid Build Coastguard Worker
fetchGraphicBlock(uint32_t width,uint32_t height,uint32_t format,C2MemoryUsage usage,std::shared_ptr<C2GraphicBlock> * block)1126*ec779b8eSAndroid Build Coastguard Worker c2_status_t fetchGraphicBlock(
1127*ec779b8eSAndroid Build Coastguard Worker uint32_t width, uint32_t height, uint32_t format,
1128*ec779b8eSAndroid Build Coastguard Worker C2MemoryUsage usage,
1129*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicBlock> *block) {
1130*ec779b8eSAndroid Build Coastguard Worker block->reset();
1131*ec779b8eSAndroid Build Coastguard Worker if (mInit != C2_OK) {
1132*ec779b8eSAndroid Build Coastguard Worker return mInit;
1133*ec779b8eSAndroid Build Coastguard Worker }
1134*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> params;
1135*ec779b8eSAndroid Build Coastguard Worker mAllocator->getGraphicParams(width, height, format, usage, ¶ms);
1136*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<bufferpool2::BufferPoolData> bufferPoolData;
1137*ec779b8eSAndroid Build Coastguard Worker native_handle_t *cHandle = nullptr;
1138*ec779b8eSAndroid Build Coastguard Worker bufferpool2_impl::BufferPoolStatus status = mBufferPoolManager->allocate(
1139*ec779b8eSAndroid Build Coastguard Worker mConnectionId, params, &cHandle, &bufferPoolData);
1140*ec779b8eSAndroid Build Coastguard Worker if (status == ResultStatus2::OK) {
1141*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> alloc;
1142*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2PooledBlockPoolData2> poolData =
1143*ec779b8eSAndroid Build Coastguard Worker std::make_shared<C2PooledBlockPoolData2>(bufferPoolData);
1144*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = mAllocator->priorGraphicAllocation(
1145*ec779b8eSAndroid Build Coastguard Worker cHandle, &alloc);
1146*ec779b8eSAndroid Build Coastguard Worker if (err == C2_OK && poolData && alloc) {
1147*ec779b8eSAndroid Build Coastguard Worker *block = _C2BlockFactory::CreateGraphicBlock(
1148*ec779b8eSAndroid Build Coastguard Worker alloc, poolData, C2Rect(width, height));
1149*ec779b8eSAndroid Build Coastguard Worker if (*block) {
1150*ec779b8eSAndroid Build Coastguard Worker return C2_OK;
1151*ec779b8eSAndroid Build Coastguard Worker }
1152*ec779b8eSAndroid Build Coastguard Worker }
1153*ec779b8eSAndroid Build Coastguard Worker return C2_NO_MEMORY;
1154*ec779b8eSAndroid Build Coastguard Worker }
1155*ec779b8eSAndroid Build Coastguard Worker if (status == ResultStatus2::NO_MEMORY) {
1156*ec779b8eSAndroid Build Coastguard Worker return C2_NO_MEMORY;
1157*ec779b8eSAndroid Build Coastguard Worker }
1158*ec779b8eSAndroid Build Coastguard Worker return C2_CORRUPTED;
1159*ec779b8eSAndroid Build Coastguard Worker }
1160*ec779b8eSAndroid Build Coastguard Worker
getConnectionId()1161*ec779b8eSAndroid Build Coastguard Worker bufferpool2_impl::ConnectionId getConnectionId() {
1162*ec779b8eSAndroid Build Coastguard Worker return mInit != C2_OK ? bufferpool2_impl::INVALID_CONNECTIONID : mConnectionId;
1163*ec779b8eSAndroid Build Coastguard Worker }
1164*ec779b8eSAndroid Build Coastguard Worker
1165*ec779b8eSAndroid Build Coastguard Worker private:
1166*ec779b8eSAndroid Build Coastguard Worker c2_status_t mInit;
1167*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<bufferpool2_impl::ClientManager> mBufferPoolManager;
1168*ec779b8eSAndroid Build Coastguard Worker bufferpool2_impl::ConnectionId mConnectionId; // locally
1169*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<_C2BufferPoolAllocator2> mAllocator;
1170*ec779b8eSAndroid Build Coastguard Worker };
1171*ec779b8eSAndroid Build Coastguard Worker
C2PooledBlockPool(const std::shared_ptr<C2Allocator> & allocator,const local_id_t localId,BufferPoolVer ver)1172*ec779b8eSAndroid Build Coastguard Worker C2PooledBlockPool::C2PooledBlockPool(
1173*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2Allocator> &allocator,
1174*ec779b8eSAndroid Build Coastguard Worker const local_id_t localId,
1175*ec779b8eSAndroid Build Coastguard Worker BufferPoolVer ver)
1176*ec779b8eSAndroid Build Coastguard Worker : mAllocator(allocator), mLocalId(localId), mBufferPoolVer(ver) {
1177*ec779b8eSAndroid Build Coastguard Worker if (mBufferPoolVer == VER_HIDL) {
1178*ec779b8eSAndroid Build Coastguard Worker mImpl = std::make_unique<Impl>(allocator);
1179*ec779b8eSAndroid Build Coastguard Worker }
1180*ec779b8eSAndroid Build Coastguard Worker if (mBufferPoolVer == VER_AIDL2) {
1181*ec779b8eSAndroid Build Coastguard Worker mImpl2 = std::make_unique<Impl2>(allocator);
1182*ec779b8eSAndroid Build Coastguard Worker }
1183*ec779b8eSAndroid Build Coastguard Worker }
1184*ec779b8eSAndroid Build Coastguard Worker
~C2PooledBlockPool()1185*ec779b8eSAndroid Build Coastguard Worker C2PooledBlockPool::~C2PooledBlockPool() {
1186*ec779b8eSAndroid Build Coastguard Worker }
1187*ec779b8eSAndroid Build Coastguard Worker
fetchLinearBlock(uint32_t capacity,C2MemoryUsage usage,std::shared_ptr<C2LinearBlock> * block)1188*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2PooledBlockPool::fetchLinearBlock(
1189*ec779b8eSAndroid Build Coastguard Worker uint32_t capacity,
1190*ec779b8eSAndroid Build Coastguard Worker C2MemoryUsage usage,
1191*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> *block /* nonnull */) {
1192*ec779b8eSAndroid Build Coastguard Worker ScopedTrace trace(ATRACE_TAG,"C2PooledBlockPool::fetchLinearBlock");
1193*ec779b8eSAndroid Build Coastguard Worker if (mBufferPoolVer == VER_HIDL && mImpl) {
1194*ec779b8eSAndroid Build Coastguard Worker return mImpl->fetchLinearBlock(capacity, usage, block);
1195*ec779b8eSAndroid Build Coastguard Worker }
1196*ec779b8eSAndroid Build Coastguard Worker if (mBufferPoolVer == VER_AIDL2 && mImpl2) {
1197*ec779b8eSAndroid Build Coastguard Worker return mImpl2->fetchLinearBlock(capacity, usage, block);
1198*ec779b8eSAndroid Build Coastguard Worker }
1199*ec779b8eSAndroid Build Coastguard Worker return C2_CORRUPTED;
1200*ec779b8eSAndroid Build Coastguard Worker }
1201*ec779b8eSAndroid Build Coastguard Worker
fetchGraphicBlock(uint32_t width,uint32_t height,uint32_t format,C2MemoryUsage usage,std::shared_ptr<C2GraphicBlock> * block)1202*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2PooledBlockPool::fetchGraphicBlock(
1203*ec779b8eSAndroid Build Coastguard Worker uint32_t width,
1204*ec779b8eSAndroid Build Coastguard Worker uint32_t height,
1205*ec779b8eSAndroid Build Coastguard Worker uint32_t format,
1206*ec779b8eSAndroid Build Coastguard Worker C2MemoryUsage usage,
1207*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicBlock> *block) {
1208*ec779b8eSAndroid Build Coastguard Worker ScopedTrace trace(ATRACE_TAG,"C2PooledBlockPool::fetchGraphicBlock");
1209*ec779b8eSAndroid Build Coastguard Worker if (mBufferPoolVer == VER_HIDL && mImpl) {
1210*ec779b8eSAndroid Build Coastguard Worker return mImpl->fetchGraphicBlock(width, height, format, usage, block);
1211*ec779b8eSAndroid Build Coastguard Worker }
1212*ec779b8eSAndroid Build Coastguard Worker if (mBufferPoolVer == VER_AIDL2 && mImpl2) {
1213*ec779b8eSAndroid Build Coastguard Worker return mImpl2->fetchGraphicBlock(width, height, format, usage, block);
1214*ec779b8eSAndroid Build Coastguard Worker }
1215*ec779b8eSAndroid Build Coastguard Worker return C2_CORRUPTED;
1216*ec779b8eSAndroid Build Coastguard Worker }
1217*ec779b8eSAndroid Build Coastguard Worker
getConnectionId()1218*ec779b8eSAndroid Build Coastguard Worker int64_t C2PooledBlockPool::getConnectionId() {
1219*ec779b8eSAndroid Build Coastguard Worker if (mBufferPoolVer == VER_HIDL && mImpl) {
1220*ec779b8eSAndroid Build Coastguard Worker return mImpl->getConnectionId();
1221*ec779b8eSAndroid Build Coastguard Worker }
1222*ec779b8eSAndroid Build Coastguard Worker if (mBufferPoolVer == VER_AIDL2 && mImpl2) {
1223*ec779b8eSAndroid Build Coastguard Worker return mImpl2->getConnectionId();
1224*ec779b8eSAndroid Build Coastguard Worker }
1225*ec779b8eSAndroid Build Coastguard Worker return 0;
1226*ec779b8eSAndroid Build Coastguard Worker }
1227*ec779b8eSAndroid Build Coastguard Worker
1228*ec779b8eSAndroid Build Coastguard Worker /* ========================================== 2D BLOCK ========================================= */
1229*ec779b8eSAndroid Build Coastguard Worker
1230*ec779b8eSAndroid Build Coastguard Worker /**
1231*ec779b8eSAndroid Build Coastguard Worker * Implementation that is shared between all 2D blocks and views.
1232*ec779b8eSAndroid Build Coastguard Worker *
1233*ec779b8eSAndroid Build Coastguard Worker * For blocks' Impl's crop is always the allotted crop, even if it is a sub block.
1234*ec779b8eSAndroid Build Coastguard Worker *
1235*ec779b8eSAndroid Build Coastguard Worker * For views' Impl's crop is the mapped portion - which for now is always the
1236*ec779b8eSAndroid Build Coastguard Worker * allotted crop.
1237*ec779b8eSAndroid Build Coastguard Worker */
1238*ec779b8eSAndroid Build Coastguard Worker class C2_HIDE _C2Block2DImpl : public _C2PlanarSectionAspect {
1239*ec779b8eSAndroid Build Coastguard Worker public:
1240*ec779b8eSAndroid Build Coastguard Worker /**
1241*ec779b8eSAndroid Build Coastguard Worker * Impl's crop is always the or part of the allotted crop of the allocation.
1242*ec779b8eSAndroid Build Coastguard Worker */
_C2Block2DImpl(const std::shared_ptr<C2GraphicAllocation> & alloc,const std::shared_ptr<_C2BlockPoolData> & poolData=nullptr,const C2Rect & allottedCrop=C2Rect (~0u,~0u))1243*ec779b8eSAndroid Build Coastguard Worker _C2Block2DImpl(const std::shared_ptr<C2GraphicAllocation> &alloc,
1244*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<_C2BlockPoolData> &poolData = nullptr,
1245*ec779b8eSAndroid Build Coastguard Worker const C2Rect &allottedCrop = C2Rect(~0u, ~0u))
1246*ec779b8eSAndroid Build Coastguard Worker : _C2PlanarSectionAspect(alloc.get(), allottedCrop),
1247*ec779b8eSAndroid Build Coastguard Worker mAllocation(alloc),
1248*ec779b8eSAndroid Build Coastguard Worker mPoolData(poolData) { }
1249*ec779b8eSAndroid Build Coastguard Worker
1250*ec779b8eSAndroid Build Coastguard Worker virtual ~_C2Block2DImpl() = default;
1251*ec779b8eSAndroid Build Coastguard Worker
1252*ec779b8eSAndroid Build Coastguard Worker /** returns pool data */
poolData() const1253*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<_C2BlockPoolData> poolData() const {
1254*ec779b8eSAndroid Build Coastguard Worker return mPoolData;
1255*ec779b8eSAndroid Build Coastguard Worker }
1256*ec779b8eSAndroid Build Coastguard Worker
1257*ec779b8eSAndroid Build Coastguard Worker /** returns native handle */
handle() const1258*ec779b8eSAndroid Build Coastguard Worker const C2Handle *handle() const {
1259*ec779b8eSAndroid Build Coastguard Worker return mAllocation ? mAllocation->handle() : nullptr;
1260*ec779b8eSAndroid Build Coastguard Worker }
1261*ec779b8eSAndroid Build Coastguard Worker
1262*ec779b8eSAndroid Build Coastguard Worker /** returns the allocator's ID */
getAllocatorId() const1263*ec779b8eSAndroid Build Coastguard Worker C2Allocator::id_t getAllocatorId() const {
1264*ec779b8eSAndroid Build Coastguard Worker // BAD_ID can only happen if this Impl class is initialized for a view - never for a block.
1265*ec779b8eSAndroid Build Coastguard Worker return mAllocation ? mAllocation->getAllocatorId() : C2Allocator::BAD_ID;
1266*ec779b8eSAndroid Build Coastguard Worker }
1267*ec779b8eSAndroid Build Coastguard Worker
getAllocation() const1268*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> getAllocation() const {
1269*ec779b8eSAndroid Build Coastguard Worker return mAllocation;
1270*ec779b8eSAndroid Build Coastguard Worker }
1271*ec779b8eSAndroid Build Coastguard Worker
1272*ec779b8eSAndroid Build Coastguard Worker private:
1273*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> mAllocation;
1274*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<_C2BlockPoolData> mPoolData;
1275*ec779b8eSAndroid Build Coastguard Worker };
1276*ec779b8eSAndroid Build Coastguard Worker
1277*ec779b8eSAndroid Build Coastguard Worker class C2_HIDE _C2MappingBlock2DImpl
1278*ec779b8eSAndroid Build Coastguard Worker : public _C2Block2DImpl, public std::enable_shared_from_this<_C2MappingBlock2DImpl> {
1279*ec779b8eSAndroid Build Coastguard Worker public:
1280*ec779b8eSAndroid Build Coastguard Worker using _C2Block2DImpl::_C2Block2DImpl;
1281*ec779b8eSAndroid Build Coastguard Worker
1282*ec779b8eSAndroid Build Coastguard Worker virtual ~_C2MappingBlock2DImpl() override = default;
1283*ec779b8eSAndroid Build Coastguard Worker
1284*ec779b8eSAndroid Build Coastguard Worker /**
1285*ec779b8eSAndroid Build Coastguard Worker * This class contains the mapped data pointer, and the potential error.
1286*ec779b8eSAndroid Build Coastguard Worker */
1287*ec779b8eSAndroid Build Coastguard Worker struct Mapped {
1288*ec779b8eSAndroid Build Coastguard Worker private:
1289*ec779b8eSAndroid Build Coastguard Worker friend class _C2MappingBlock2DImpl;
1290*ec779b8eSAndroid Build Coastguard Worker
Mapped_C2MappingBlock2DImpl::Mapped1291*ec779b8eSAndroid Build Coastguard Worker Mapped(const std::shared_ptr<_C2Block2DImpl> &impl, bool writable, C2Fence *fence __unused)
1292*ec779b8eSAndroid Build Coastguard Worker : mImpl(impl), mWritable(writable) {
1293*ec779b8eSAndroid Build Coastguard Worker memset(mData, 0, sizeof(mData));
1294*ec779b8eSAndroid Build Coastguard Worker const C2Rect crop = mImpl->crop();
1295*ec779b8eSAndroid Build Coastguard Worker // gralloc requires mapping the whole region of interest as we cannot
1296*ec779b8eSAndroid Build Coastguard Worker // map multiple regions
1297*ec779b8eSAndroid Build Coastguard Worker mError = mImpl->getAllocation()->map(
1298*ec779b8eSAndroid Build Coastguard Worker crop,
1299*ec779b8eSAndroid Build Coastguard Worker { C2MemoryUsage::CPU_READ, writable ? C2MemoryUsage::CPU_WRITE : 0 },
1300*ec779b8eSAndroid Build Coastguard Worker nullptr,
1301*ec779b8eSAndroid Build Coastguard Worker &mLayout,
1302*ec779b8eSAndroid Build Coastguard Worker mData);
1303*ec779b8eSAndroid Build Coastguard Worker if (mError != C2_OK) {
1304*ec779b8eSAndroid Build Coastguard Worker memset(&mLayout, 0, sizeof(mLayout));
1305*ec779b8eSAndroid Build Coastguard Worker memset(mData, 0, sizeof(mData));
1306*ec779b8eSAndroid Build Coastguard Worker memset(mOffsetData, 0, sizeof(mData));
1307*ec779b8eSAndroid Build Coastguard Worker } else {
1308*ec779b8eSAndroid Build Coastguard Worker // TODO: validate plane layout and
1309*ec779b8eSAndroid Build Coastguard Worker // adjust data pointers to the crop region's top left corner.
1310*ec779b8eSAndroid Build Coastguard Worker // fail if it is not on a subsampling boundary
1311*ec779b8eSAndroid Build Coastguard Worker for (size_t planeIx = 0; planeIx < mLayout.numPlanes; ++planeIx) {
1312*ec779b8eSAndroid Build Coastguard Worker const uint32_t colSampling = mLayout.planes[planeIx].colSampling;
1313*ec779b8eSAndroid Build Coastguard Worker const uint32_t rowSampling = mLayout.planes[planeIx].rowSampling;
1314*ec779b8eSAndroid Build Coastguard Worker if (crop.left % colSampling || crop.top % rowSampling) {
1315*ec779b8eSAndroid Build Coastguard Worker // cannot calculate data pointer
1316*ec779b8eSAndroid Build Coastguard Worker mImpl->getAllocation()->unmap(mData, crop, nullptr);
1317*ec779b8eSAndroid Build Coastguard Worker memset(&mLayout, 0, sizeof(mLayout));
1318*ec779b8eSAndroid Build Coastguard Worker memset(mData, 0, sizeof(mData));
1319*ec779b8eSAndroid Build Coastguard Worker memset(mOffsetData, 0, sizeof(mData));
1320*ec779b8eSAndroid Build Coastguard Worker mError = C2_BAD_VALUE;
1321*ec779b8eSAndroid Build Coastguard Worker return;
1322*ec779b8eSAndroid Build Coastguard Worker }
1323*ec779b8eSAndroid Build Coastguard Worker mOffsetData[planeIx] =
1324*ec779b8eSAndroid Build Coastguard Worker mData[planeIx] + (ssize_t)crop.left * mLayout.planes[planeIx].colInc
1325*ec779b8eSAndroid Build Coastguard Worker + (ssize_t)crop.top * mLayout.planes[planeIx].rowInc;
1326*ec779b8eSAndroid Build Coastguard Worker }
1327*ec779b8eSAndroid Build Coastguard Worker }
1328*ec779b8eSAndroid Build Coastguard Worker }
1329*ec779b8eSAndroid Build Coastguard Worker
Mapped_C2MappingBlock2DImpl::Mapped1330*ec779b8eSAndroid Build Coastguard Worker explicit Mapped(c2_status_t error)
1331*ec779b8eSAndroid Build Coastguard Worker : mImpl(nullptr), mWritable(false), mError(error) {
1332*ec779b8eSAndroid Build Coastguard Worker // CHECK(error != C2_OK);
1333*ec779b8eSAndroid Build Coastguard Worker memset(&mLayout, 0, sizeof(mLayout));
1334*ec779b8eSAndroid Build Coastguard Worker memset(mData, 0, sizeof(mData));
1335*ec779b8eSAndroid Build Coastguard Worker memset(mOffsetData, 0, sizeof(mData));
1336*ec779b8eSAndroid Build Coastguard Worker }
1337*ec779b8eSAndroid Build Coastguard Worker
1338*ec779b8eSAndroid Build Coastguard Worker public:
~Mapped_C2MappingBlock2DImpl::Mapped1339*ec779b8eSAndroid Build Coastguard Worker ~Mapped() {
1340*ec779b8eSAndroid Build Coastguard Worker if (mData[0] != nullptr) {
1341*ec779b8eSAndroid Build Coastguard Worker mImpl->getAllocation()->unmap(mData, mImpl->crop(), nullptr);
1342*ec779b8eSAndroid Build Coastguard Worker }
1343*ec779b8eSAndroid Build Coastguard Worker }
1344*ec779b8eSAndroid Build Coastguard Worker
1345*ec779b8eSAndroid Build Coastguard Worker /** returns mapping status */
error_C2MappingBlock2DImpl::Mapped1346*ec779b8eSAndroid Build Coastguard Worker c2_status_t error() const { return mError; }
1347*ec779b8eSAndroid Build Coastguard Worker
1348*ec779b8eSAndroid Build Coastguard Worker /** returns data pointer */
data_C2MappingBlock2DImpl::Mapped1349*ec779b8eSAndroid Build Coastguard Worker uint8_t *const *data() const { return mOffsetData; }
1350*ec779b8eSAndroid Build Coastguard Worker
1351*ec779b8eSAndroid Build Coastguard Worker /** returns the plane layout */
layout_C2MappingBlock2DImpl::Mapped1352*ec779b8eSAndroid Build Coastguard Worker C2PlanarLayout layout() const { return mLayout; }
1353*ec779b8eSAndroid Build Coastguard Worker
1354*ec779b8eSAndroid Build Coastguard Worker /** returns whether the mapping is writable */
writable_C2MappingBlock2DImpl::Mapped1355*ec779b8eSAndroid Build Coastguard Worker bool writable() const { return mWritable; }
1356*ec779b8eSAndroid Build Coastguard Worker
1357*ec779b8eSAndroid Build Coastguard Worker private:
1358*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<_C2Block2DImpl> mImpl;
1359*ec779b8eSAndroid Build Coastguard Worker bool mWritable;
1360*ec779b8eSAndroid Build Coastguard Worker c2_status_t mError;
1361*ec779b8eSAndroid Build Coastguard Worker uint8_t *mData[C2PlanarLayout::MAX_NUM_PLANES];
1362*ec779b8eSAndroid Build Coastguard Worker uint8_t *mOffsetData[C2PlanarLayout::MAX_NUM_PLANES];
1363*ec779b8eSAndroid Build Coastguard Worker C2PlanarLayout mLayout;
1364*ec779b8eSAndroid Build Coastguard Worker };
1365*ec779b8eSAndroid Build Coastguard Worker
1366*ec779b8eSAndroid Build Coastguard Worker /**
1367*ec779b8eSAndroid Build Coastguard Worker * Maps the allotted region.
1368*ec779b8eSAndroid Build Coastguard Worker *
1369*ec779b8eSAndroid Build Coastguard Worker * If already mapped and it is currently in use, returns the existing mapping.
1370*ec779b8eSAndroid Build Coastguard Worker * If fence is provided, an acquire fence is stored there.
1371*ec779b8eSAndroid Build Coastguard Worker */
map(bool writable,C2Fence * fence)1372*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<Mapped> map(bool writable, C2Fence *fence) {
1373*ec779b8eSAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(mMappedLock);
1374*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<Mapped> existing = mMapped.lock();
1375*ec779b8eSAndroid Build Coastguard Worker if (!existing) {
1376*ec779b8eSAndroid Build Coastguard Worker existing = std::shared_ptr<Mapped>(new Mapped(shared_from_this(), writable, fence));
1377*ec779b8eSAndroid Build Coastguard Worker mMapped = existing;
1378*ec779b8eSAndroid Build Coastguard Worker } else {
1379*ec779b8eSAndroid Build Coastguard Worker // if we mapped the region read-only, we cannot remap it read-write
1380*ec779b8eSAndroid Build Coastguard Worker if (writable && !existing->writable()) {
1381*ec779b8eSAndroid Build Coastguard Worker existing = std::shared_ptr<Mapped>(new Mapped(C2_CANNOT_DO));
1382*ec779b8eSAndroid Build Coastguard Worker }
1383*ec779b8eSAndroid Build Coastguard Worker if (fence != nullptr) {
1384*ec779b8eSAndroid Build Coastguard Worker *fence = C2Fence();
1385*ec779b8eSAndroid Build Coastguard Worker }
1386*ec779b8eSAndroid Build Coastguard Worker }
1387*ec779b8eSAndroid Build Coastguard Worker return existing;
1388*ec779b8eSAndroid Build Coastguard Worker }
1389*ec779b8eSAndroid Build Coastguard Worker
1390*ec779b8eSAndroid Build Coastguard Worker private:
1391*ec779b8eSAndroid Build Coastguard Worker std::weak_ptr<Mapped> mMapped;
1392*ec779b8eSAndroid Build Coastguard Worker std::mutex mMappedLock;
1393*ec779b8eSAndroid Build Coastguard Worker };
1394*ec779b8eSAndroid Build Coastguard Worker
1395*ec779b8eSAndroid Build Coastguard Worker class C2_HIDE _C2MappedBlock2DImpl : public _C2Block2DImpl {
1396*ec779b8eSAndroid Build Coastguard Worker public:
_C2MappedBlock2DImpl(const _C2Block2DImpl & impl,std::shared_ptr<_C2MappingBlock2DImpl::Mapped> mapping)1397*ec779b8eSAndroid Build Coastguard Worker _C2MappedBlock2DImpl(const _C2Block2DImpl &impl,
1398*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<_C2MappingBlock2DImpl::Mapped> mapping)
1399*ec779b8eSAndroid Build Coastguard Worker : _C2Block2DImpl(impl), mMapping(mapping) {
1400*ec779b8eSAndroid Build Coastguard Worker }
1401*ec779b8eSAndroid Build Coastguard Worker
1402*ec779b8eSAndroid Build Coastguard Worker virtual ~_C2MappedBlock2DImpl() override = default;
1403*ec779b8eSAndroid Build Coastguard Worker
mapping() const1404*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<_C2MappingBlock2DImpl::Mapped> mapping() const { return mMapping; }
1405*ec779b8eSAndroid Build Coastguard Worker
1406*ec779b8eSAndroid Build Coastguard Worker private:
1407*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<_C2MappingBlock2DImpl::Mapped> mMapping;
1408*ec779b8eSAndroid Build Coastguard Worker };
1409*ec779b8eSAndroid Build Coastguard Worker
1410*ec779b8eSAndroid Build Coastguard Worker /**
1411*ec779b8eSAndroid Build Coastguard Worker * Block implementation.
1412*ec779b8eSAndroid Build Coastguard Worker */
1413*ec779b8eSAndroid Build Coastguard Worker class C2Block2D::Impl : public _C2MappingBlock2DImpl {
1414*ec779b8eSAndroid Build Coastguard Worker public:
1415*ec779b8eSAndroid Build Coastguard Worker using _C2MappingBlock2DImpl::_C2MappingBlock2DImpl;
1416*ec779b8eSAndroid Build Coastguard Worker virtual ~Impl() override = default;
1417*ec779b8eSAndroid Build Coastguard Worker };
1418*ec779b8eSAndroid Build Coastguard Worker
handle() const1419*ec779b8eSAndroid Build Coastguard Worker const C2Handle *C2Block2D::handle() const {
1420*ec779b8eSAndroid Build Coastguard Worker return mImpl->handle();
1421*ec779b8eSAndroid Build Coastguard Worker }
1422*ec779b8eSAndroid Build Coastguard Worker
getAllocatorId() const1423*ec779b8eSAndroid Build Coastguard Worker C2Allocator::id_t C2Block2D::getAllocatorId() const {
1424*ec779b8eSAndroid Build Coastguard Worker return mImpl->getAllocatorId();
1425*ec779b8eSAndroid Build Coastguard Worker }
1426*ec779b8eSAndroid Build Coastguard Worker
C2Block2D(std::shared_ptr<Impl> impl,const _C2PlanarSectionAspect & section)1427*ec779b8eSAndroid Build Coastguard Worker C2Block2D::C2Block2D(std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion)
1428*ec779b8eSAndroid Build Coastguard Worker // always clamp subsection to parent (impl) crop for safety
1429*ec779b8eSAndroid Build Coastguard Worker : _C2PlanarSectionAspect(impl.get(), section.crop()), mImpl(impl) {
1430*ec779b8eSAndroid Build Coastguard Worker }
1431*ec779b8eSAndroid Build Coastguard Worker
1432*ec779b8eSAndroid Build Coastguard Worker /**
1433*ec779b8eSAndroid Build Coastguard Worker * Graphic view implementation.
1434*ec779b8eSAndroid Build Coastguard Worker *
1435*ec779b8eSAndroid Build Coastguard Worker * range of Impl is the mapped range of the underlying allocation. range of View is the current
1436*ec779b8eSAndroid Build Coastguard Worker * crop.
1437*ec779b8eSAndroid Build Coastguard Worker */
1438*ec779b8eSAndroid Build Coastguard Worker class C2GraphicView::Impl : public _C2MappedBlock2DImpl {
1439*ec779b8eSAndroid Build Coastguard Worker public:
1440*ec779b8eSAndroid Build Coastguard Worker using _C2MappedBlock2DImpl::_C2MappedBlock2DImpl;
1441*ec779b8eSAndroid Build Coastguard Worker virtual ~Impl() override = default;
1442*ec779b8eSAndroid Build Coastguard Worker };
1443*ec779b8eSAndroid Build Coastguard Worker
C2GraphicView(std::shared_ptr<Impl> impl,const _C2PlanarSectionAspect & section)1444*ec779b8eSAndroid Build Coastguard Worker C2GraphicView::C2GraphicView(std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion)
1445*ec779b8eSAndroid Build Coastguard Worker : _C2EditablePlanarSectionAspect(impl.get(), section.crop()), mImpl(impl) {
1446*ec779b8eSAndroid Build Coastguard Worker }
1447*ec779b8eSAndroid Build Coastguard Worker
data() const1448*ec779b8eSAndroid Build Coastguard Worker const uint8_t *const *C2GraphicView::data() const {
1449*ec779b8eSAndroid Build Coastguard Worker return mImpl->mapping()->data();
1450*ec779b8eSAndroid Build Coastguard Worker }
1451*ec779b8eSAndroid Build Coastguard Worker
data()1452*ec779b8eSAndroid Build Coastguard Worker uint8_t *const *C2GraphicView::data() {
1453*ec779b8eSAndroid Build Coastguard Worker return mImpl->mapping()->data();
1454*ec779b8eSAndroid Build Coastguard Worker }
1455*ec779b8eSAndroid Build Coastguard Worker
layout() const1456*ec779b8eSAndroid Build Coastguard Worker const C2PlanarLayout C2GraphicView::layout() const {
1457*ec779b8eSAndroid Build Coastguard Worker return mImpl->mapping()->layout();
1458*ec779b8eSAndroid Build Coastguard Worker }
1459*ec779b8eSAndroid Build Coastguard Worker
subView(const C2Rect & rect) const1460*ec779b8eSAndroid Build Coastguard Worker const C2GraphicView C2GraphicView::subView(const C2Rect &rect) const {
1461*ec779b8eSAndroid Build Coastguard Worker return C2GraphicView(mImpl, C2PlanarSection(*mImpl, rect));
1462*ec779b8eSAndroid Build Coastguard Worker }
1463*ec779b8eSAndroid Build Coastguard Worker
subView(const C2Rect & rect)1464*ec779b8eSAndroid Build Coastguard Worker C2GraphicView C2GraphicView::subView(const C2Rect &rect) {
1465*ec779b8eSAndroid Build Coastguard Worker return C2GraphicView(mImpl, C2PlanarSection(*mImpl, rect));
1466*ec779b8eSAndroid Build Coastguard Worker }
1467*ec779b8eSAndroid Build Coastguard Worker
error() const1468*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2GraphicView::error() const {
1469*ec779b8eSAndroid Build Coastguard Worker return mImpl->mapping()->error();
1470*ec779b8eSAndroid Build Coastguard Worker }
1471*ec779b8eSAndroid Build Coastguard Worker
1472*ec779b8eSAndroid Build Coastguard Worker /**
1473*ec779b8eSAndroid Build Coastguard Worker * Const graphic block implementation.
1474*ec779b8eSAndroid Build Coastguard Worker */
C2ConstGraphicBlock(std::shared_ptr<Impl> impl,const _C2PlanarSectionAspect & section,C2Fence fence)1475*ec779b8eSAndroid Build Coastguard Worker C2ConstGraphicBlock::C2ConstGraphicBlock(
1476*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion, C2Fence fence)
1477*ec779b8eSAndroid Build Coastguard Worker : C2Block2D(impl, section), mFence(fence) { }
1478*ec779b8eSAndroid Build Coastguard Worker
map() const1479*ec779b8eSAndroid Build Coastguard Worker C2Acquirable<const C2GraphicView> C2ConstGraphicBlock::map() const {
1480*ec779b8eSAndroid Build Coastguard Worker C2Fence fence;
1481*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<_C2MappingBlock2DImpl::Mapped> mapping =
1482*ec779b8eSAndroid Build Coastguard Worker mImpl->map(false /* writable */, &fence);
1483*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<GraphicViewBuddy::Impl> gvi =
1484*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<GraphicViewBuddy::Impl>(new GraphicViewBuddy::Impl(*mImpl, mapping));
1485*ec779b8eSAndroid Build Coastguard Worker return AcquirableConstGraphicViewBuddy(
1486*ec779b8eSAndroid Build Coastguard Worker mapping->error(), fence, GraphicViewBuddy(gvi, C2PlanarSection(*mImpl, crop())));
1487*ec779b8eSAndroid Build Coastguard Worker }
1488*ec779b8eSAndroid Build Coastguard Worker
subBlock(const C2Rect & rect) const1489*ec779b8eSAndroid Build Coastguard Worker C2ConstGraphicBlock C2ConstGraphicBlock::subBlock(const C2Rect &rect) const {
1490*ec779b8eSAndroid Build Coastguard Worker return C2ConstGraphicBlock(mImpl, C2PlanarSection(*mImpl, crop().intersect(rect)), mFence);
1491*ec779b8eSAndroid Build Coastguard Worker }
1492*ec779b8eSAndroid Build Coastguard Worker
1493*ec779b8eSAndroid Build Coastguard Worker /**
1494*ec779b8eSAndroid Build Coastguard Worker * Graphic block implementation.
1495*ec779b8eSAndroid Build Coastguard Worker */
C2GraphicBlock(std::shared_ptr<Impl> impl,const _C2PlanarSectionAspect & section)1496*ec779b8eSAndroid Build Coastguard Worker C2GraphicBlock::C2GraphicBlock(
1497*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<Impl> impl, const _C2PlanarSectionAspect §ion)
1498*ec779b8eSAndroid Build Coastguard Worker : C2Block2D(impl, section) { }
1499*ec779b8eSAndroid Build Coastguard Worker
map()1500*ec779b8eSAndroid Build Coastguard Worker C2Acquirable<C2GraphicView> C2GraphicBlock::map() {
1501*ec779b8eSAndroid Build Coastguard Worker C2Fence fence;
1502*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<_C2MappingBlock2DImpl::Mapped> mapping =
1503*ec779b8eSAndroid Build Coastguard Worker mImpl->map(true /* writable */, &fence);
1504*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<GraphicViewBuddy::Impl> gvi =
1505*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<GraphicViewBuddy::Impl>(new GraphicViewBuddy::Impl(*mImpl, mapping));
1506*ec779b8eSAndroid Build Coastguard Worker return AcquirableGraphicViewBuddy(
1507*ec779b8eSAndroid Build Coastguard Worker mapping->error(), fence, GraphicViewBuddy(gvi, C2PlanarSection(*mImpl, crop())));
1508*ec779b8eSAndroid Build Coastguard Worker }
1509*ec779b8eSAndroid Build Coastguard Worker
share(const C2Rect & crop,C2Fence fence)1510*ec779b8eSAndroid Build Coastguard Worker C2ConstGraphicBlock C2GraphicBlock::share(const C2Rect &crop, C2Fence fence) {
1511*ec779b8eSAndroid Build Coastguard Worker return ConstGraphicBlockBuddy(mImpl, C2PlanarSection(*mImpl, crop), fence);
1512*ec779b8eSAndroid Build Coastguard Worker }
1513*ec779b8eSAndroid Build Coastguard Worker
1514*ec779b8eSAndroid Build Coastguard Worker /**
1515*ec779b8eSAndroid Build Coastguard Worker * Basic block pool implementations.
1516*ec779b8eSAndroid Build Coastguard Worker */
C2BasicGraphicBlockPool(const std::shared_ptr<C2Allocator> & allocator)1517*ec779b8eSAndroid Build Coastguard Worker C2BasicGraphicBlockPool::C2BasicGraphicBlockPool(
1518*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2Allocator> &allocator)
1519*ec779b8eSAndroid Build Coastguard Worker : mAllocator(allocator) {}
1520*ec779b8eSAndroid Build Coastguard Worker
fetchGraphicBlock(uint32_t width,uint32_t height,uint32_t format,C2MemoryUsage usage,std::shared_ptr<C2GraphicBlock> * block)1521*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2BasicGraphicBlockPool::fetchGraphicBlock(
1522*ec779b8eSAndroid Build Coastguard Worker uint32_t width,
1523*ec779b8eSAndroid Build Coastguard Worker uint32_t height,
1524*ec779b8eSAndroid Build Coastguard Worker uint32_t format,
1525*ec779b8eSAndroid Build Coastguard Worker C2MemoryUsage usage,
1526*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicBlock> *block /* nonnull */) {
1527*ec779b8eSAndroid Build Coastguard Worker block->reset();
1528*ec779b8eSAndroid Build Coastguard Worker
1529*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> alloc;
1530*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = mAllocator->newGraphicAllocation(width, height, format, usage, &alloc);
1531*ec779b8eSAndroid Build Coastguard Worker if (err != C2_OK) {
1532*ec779b8eSAndroid Build Coastguard Worker return err;
1533*ec779b8eSAndroid Build Coastguard Worker }
1534*ec779b8eSAndroid Build Coastguard Worker
1535*ec779b8eSAndroid Build Coastguard Worker *block = _C2BlockFactory::CreateGraphicBlock(alloc);
1536*ec779b8eSAndroid Build Coastguard Worker
1537*ec779b8eSAndroid Build Coastguard Worker return C2_OK;
1538*ec779b8eSAndroid Build Coastguard Worker }
1539*ec779b8eSAndroid Build Coastguard Worker
CreateGraphicBlock(const std::shared_ptr<C2GraphicAllocation> & alloc,const std::shared_ptr<_C2BlockPoolData> & data,const C2Rect & allottedCrop)1540*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicBlock> _C2BlockFactory::CreateGraphicBlock(
1541*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2GraphicAllocation> &alloc,
1542*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<_C2BlockPoolData> &data, const C2Rect &allottedCrop) {
1543*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Block2D::Impl> impl =
1544*ec779b8eSAndroid Build Coastguard Worker std::make_shared<C2Block2D::Impl>(alloc, data, allottedCrop);
1545*ec779b8eSAndroid Build Coastguard Worker return std::shared_ptr<C2GraphicBlock>(new C2GraphicBlock(impl, *impl));
1546*ec779b8eSAndroid Build Coastguard Worker }
1547*ec779b8eSAndroid Build Coastguard Worker
GetGraphicBlockPoolData(const C2Block2D & block)1548*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<_C2BlockPoolData> _C2BlockFactory::GetGraphicBlockPoolData(
1549*ec779b8eSAndroid Build Coastguard Worker const C2Block2D &block) {
1550*ec779b8eSAndroid Build Coastguard Worker if (block.mImpl) {
1551*ec779b8eSAndroid Build Coastguard Worker return block.mImpl->poolData();
1552*ec779b8eSAndroid Build Coastguard Worker }
1553*ec779b8eSAndroid Build Coastguard Worker return nullptr;
1554*ec779b8eSAndroid Build Coastguard Worker }
1555*ec779b8eSAndroid Build Coastguard Worker
CreateGraphicBlock(const C2Handle * cHandle,const std::shared_ptr<bufferpool::BufferPoolData> & data)1556*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicBlock> _C2BlockFactory::CreateGraphicBlock(
1557*ec779b8eSAndroid Build Coastguard Worker const C2Handle *cHandle,
1558*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<bufferpool::BufferPoolData> &data) {
1559*ec779b8eSAndroid Build Coastguard Worker // TODO: get proper allocator? and mutex?
1560*ec779b8eSAndroid Build Coastguard Worker static std::unique_ptr<C2AllocatorGralloc> sAllocator = std::make_unique<C2AllocatorGralloc>(0);
1561*ec779b8eSAndroid Build Coastguard Worker
1562*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> alloc;
1563*ec779b8eSAndroid Build Coastguard Worker if (sAllocator->isValid(cHandle)) {
1564*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = sAllocator->priorGraphicAllocation(cHandle, &alloc);
1565*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2PooledBlockPoolData> poolData =
1566*ec779b8eSAndroid Build Coastguard Worker std::make_shared<C2PooledBlockPoolData>(data);
1567*ec779b8eSAndroid Build Coastguard Worker if (err == C2_OK && poolData) {
1568*ec779b8eSAndroid Build Coastguard Worker // TODO: config setup?
1569*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicBlock> block =
1570*ec779b8eSAndroid Build Coastguard Worker _C2BlockFactory::CreateGraphicBlock(alloc, poolData);
1571*ec779b8eSAndroid Build Coastguard Worker return block;
1572*ec779b8eSAndroid Build Coastguard Worker }
1573*ec779b8eSAndroid Build Coastguard Worker }
1574*ec779b8eSAndroid Build Coastguard Worker return nullptr;
1575*ec779b8eSAndroid Build Coastguard Worker };
1576*ec779b8eSAndroid Build Coastguard Worker
CreateGraphicBlock(const C2Handle * cHandle,const std::shared_ptr<bufferpool2::BufferPoolData> & data)1577*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicBlock> _C2BlockFactory::CreateGraphicBlock(
1578*ec779b8eSAndroid Build Coastguard Worker const C2Handle *cHandle,
1579*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<bufferpool2::BufferPoolData> &data) {
1580*ec779b8eSAndroid Build Coastguard Worker // TODO: get proper allocator? and mutex?
1581*ec779b8eSAndroid Build Coastguard Worker static std::unique_ptr<C2AllocatorGralloc> sAllocator = std::make_unique<C2AllocatorGralloc>(0);
1582*ec779b8eSAndroid Build Coastguard Worker
1583*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicAllocation> alloc;
1584*ec779b8eSAndroid Build Coastguard Worker if (sAllocator->isValid(cHandle)) {
1585*ec779b8eSAndroid Build Coastguard Worker c2_status_t err = sAllocator->priorGraphicAllocation(cHandle, &alloc);
1586*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2PooledBlockPoolData2> poolData =
1587*ec779b8eSAndroid Build Coastguard Worker std::make_shared<C2PooledBlockPoolData2>(data);
1588*ec779b8eSAndroid Build Coastguard Worker if (err == C2_OK && poolData) {
1589*ec779b8eSAndroid Build Coastguard Worker // TODO: config setup?
1590*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicBlock> block =
1591*ec779b8eSAndroid Build Coastguard Worker _C2BlockFactory::CreateGraphicBlock(alloc, poolData);
1592*ec779b8eSAndroid Build Coastguard Worker return block;
1593*ec779b8eSAndroid Build Coastguard Worker }
1594*ec779b8eSAndroid Build Coastguard Worker }
1595*ec779b8eSAndroid Build Coastguard Worker return nullptr;
1596*ec779b8eSAndroid Build Coastguard Worker };
1597*ec779b8eSAndroid Build Coastguard Worker
1598*ec779b8eSAndroid Build Coastguard Worker /* ========================================== BUFFER ========================================= */
1599*ec779b8eSAndroid Build Coastguard Worker
1600*ec779b8eSAndroid Build Coastguard Worker class C2BufferData::Impl {
1601*ec779b8eSAndroid Build Coastguard Worker public:
Impl(const std::vector<C2ConstLinearBlock> & blocks)1602*ec779b8eSAndroid Build Coastguard Worker explicit Impl(const std::vector<C2ConstLinearBlock> &blocks)
1603*ec779b8eSAndroid Build Coastguard Worker : mType(blocks.size() == 1 ? LINEAR : LINEAR_CHUNKS),
1604*ec779b8eSAndroid Build Coastguard Worker mLinearBlocks(blocks) {
1605*ec779b8eSAndroid Build Coastguard Worker }
1606*ec779b8eSAndroid Build Coastguard Worker
Impl(const std::vector<C2ConstGraphicBlock> & blocks)1607*ec779b8eSAndroid Build Coastguard Worker explicit Impl(const std::vector<C2ConstGraphicBlock> &blocks)
1608*ec779b8eSAndroid Build Coastguard Worker : mType(blocks.size() == 1 ? GRAPHIC : GRAPHIC_CHUNKS),
1609*ec779b8eSAndroid Build Coastguard Worker mGraphicBlocks(blocks) {
1610*ec779b8eSAndroid Build Coastguard Worker }
1611*ec779b8eSAndroid Build Coastguard Worker
type() const1612*ec779b8eSAndroid Build Coastguard Worker type_t type() const { return mType; }
linearBlocks() const1613*ec779b8eSAndroid Build Coastguard Worker const std::vector<C2ConstLinearBlock> &linearBlocks() const { return mLinearBlocks; }
graphicBlocks() const1614*ec779b8eSAndroid Build Coastguard Worker const std::vector<C2ConstGraphicBlock> &graphicBlocks() const { return mGraphicBlocks; }
1615*ec779b8eSAndroid Build Coastguard Worker
1616*ec779b8eSAndroid Build Coastguard Worker private:
1617*ec779b8eSAndroid Build Coastguard Worker type_t mType;
1618*ec779b8eSAndroid Build Coastguard Worker std::vector<C2ConstLinearBlock> mLinearBlocks;
1619*ec779b8eSAndroid Build Coastguard Worker std::vector<C2ConstGraphicBlock> mGraphicBlocks;
1620*ec779b8eSAndroid Build Coastguard Worker friend class C2InfoBuffer;
1621*ec779b8eSAndroid Build Coastguard Worker };
1622*ec779b8eSAndroid Build Coastguard Worker
C2BufferData(const std::vector<C2ConstLinearBlock> & blocks)1623*ec779b8eSAndroid Build Coastguard Worker C2BufferData::C2BufferData(const std::vector<C2ConstLinearBlock> &blocks) : mImpl(new Impl(blocks)) {}
C2BufferData(const std::vector<C2ConstGraphicBlock> & blocks)1624*ec779b8eSAndroid Build Coastguard Worker C2BufferData::C2BufferData(const std::vector<C2ConstGraphicBlock> &blocks) : mImpl(new Impl(blocks)) {}
1625*ec779b8eSAndroid Build Coastguard Worker
type() const1626*ec779b8eSAndroid Build Coastguard Worker C2BufferData::type_t C2BufferData::type() const { return mImpl->type(); }
1627*ec779b8eSAndroid Build Coastguard Worker
linearBlocks() const1628*ec779b8eSAndroid Build Coastguard Worker const std::vector<C2ConstLinearBlock> C2BufferData::linearBlocks() const {
1629*ec779b8eSAndroid Build Coastguard Worker return mImpl->linearBlocks();
1630*ec779b8eSAndroid Build Coastguard Worker }
1631*ec779b8eSAndroid Build Coastguard Worker
graphicBlocks() const1632*ec779b8eSAndroid Build Coastguard Worker const std::vector<C2ConstGraphicBlock> C2BufferData::graphicBlocks() const {
1633*ec779b8eSAndroid Build Coastguard Worker return mImpl->graphicBlocks();
1634*ec779b8eSAndroid Build Coastguard Worker }
1635*ec779b8eSAndroid Build Coastguard Worker
C2InfoBuffer(C2Param::Index index,const std::vector<C2ConstLinearBlock> & blocks)1636*ec779b8eSAndroid Build Coastguard Worker C2InfoBuffer::C2InfoBuffer(
1637*ec779b8eSAndroid Build Coastguard Worker C2Param::Index index, const std::vector<C2ConstLinearBlock> &blocks)
1638*ec779b8eSAndroid Build Coastguard Worker : mIndex(index), mData(BufferDataBuddy(blocks)) {
1639*ec779b8eSAndroid Build Coastguard Worker }
1640*ec779b8eSAndroid Build Coastguard Worker
C2InfoBuffer(C2Param::Index index,const std::vector<C2ConstGraphicBlock> & blocks)1641*ec779b8eSAndroid Build Coastguard Worker C2InfoBuffer::C2InfoBuffer(
1642*ec779b8eSAndroid Build Coastguard Worker C2Param::Index index, const std::vector<C2ConstGraphicBlock> &blocks)
1643*ec779b8eSAndroid Build Coastguard Worker : mIndex(index), mData(BufferDataBuddy(blocks)) {
1644*ec779b8eSAndroid Build Coastguard Worker }
1645*ec779b8eSAndroid Build Coastguard Worker
C2InfoBuffer(C2Param::Index index,const C2BufferData & data)1646*ec779b8eSAndroid Build Coastguard Worker C2InfoBuffer::C2InfoBuffer(
1647*ec779b8eSAndroid Build Coastguard Worker C2Param::Index index, const C2BufferData &data)
1648*ec779b8eSAndroid Build Coastguard Worker : mIndex(index), mData(data) {
1649*ec779b8eSAndroid Build Coastguard Worker }
1650*ec779b8eSAndroid Build Coastguard Worker
1651*ec779b8eSAndroid Build Coastguard Worker // static
CreateLinearBuffer(C2Param::CoreIndex index,const C2ConstLinearBlock & block)1652*ec779b8eSAndroid Build Coastguard Worker C2InfoBuffer C2InfoBuffer::CreateLinearBuffer(
1653*ec779b8eSAndroid Build Coastguard Worker C2Param::CoreIndex index, const C2ConstLinearBlock &block) {
1654*ec779b8eSAndroid Build Coastguard Worker return C2InfoBuffer(index.coreIndex() | C2Param::Index::KIND_INFO | C2Param::Index::DIR_GLOBAL,
1655*ec779b8eSAndroid Build Coastguard Worker { block });
1656*ec779b8eSAndroid Build Coastguard Worker }
1657*ec779b8eSAndroid Build Coastguard Worker
1658*ec779b8eSAndroid Build Coastguard Worker // static
CreateGraphicBuffer(C2Param::CoreIndex index,const C2ConstGraphicBlock & block)1659*ec779b8eSAndroid Build Coastguard Worker C2InfoBuffer C2InfoBuffer::CreateGraphicBuffer(
1660*ec779b8eSAndroid Build Coastguard Worker C2Param::CoreIndex index, const C2ConstGraphicBlock &block) {
1661*ec779b8eSAndroid Build Coastguard Worker return C2InfoBuffer(index.coreIndex() | C2Param::Index::KIND_INFO | C2Param::Index::DIR_GLOBAL,
1662*ec779b8eSAndroid Build Coastguard Worker { block });
1663*ec779b8eSAndroid Build Coastguard Worker }
1664*ec779b8eSAndroid Build Coastguard Worker
1665*ec779b8eSAndroid Build Coastguard Worker class C2Buffer::Impl {
1666*ec779b8eSAndroid Build Coastguard Worker public:
Impl(C2Buffer * thiz,const std::vector<C2ConstLinearBlock> & blocks)1667*ec779b8eSAndroid Build Coastguard Worker Impl(C2Buffer *thiz, const std::vector<C2ConstLinearBlock> &blocks)
1668*ec779b8eSAndroid Build Coastguard Worker : mThis(thiz), mData(blocks) {}
Impl(C2Buffer * thiz,const std::vector<C2ConstGraphicBlock> & blocks)1669*ec779b8eSAndroid Build Coastguard Worker Impl(C2Buffer *thiz, const std::vector<C2ConstGraphicBlock> &blocks)
1670*ec779b8eSAndroid Build Coastguard Worker : mThis(thiz), mData(blocks) {}
1671*ec779b8eSAndroid Build Coastguard Worker
~Impl()1672*ec779b8eSAndroid Build Coastguard Worker ~Impl() {
1673*ec779b8eSAndroid Build Coastguard Worker for (const auto &pair : mNotify) {
1674*ec779b8eSAndroid Build Coastguard Worker pair.first(mThis, pair.second);
1675*ec779b8eSAndroid Build Coastguard Worker }
1676*ec779b8eSAndroid Build Coastguard Worker }
1677*ec779b8eSAndroid Build Coastguard Worker
data() const1678*ec779b8eSAndroid Build Coastguard Worker const C2BufferData &data() const { return mData; }
1679*ec779b8eSAndroid Build Coastguard Worker
registerOnDestroyNotify(OnDestroyNotify onDestroyNotify,void * arg)1680*ec779b8eSAndroid Build Coastguard Worker c2_status_t registerOnDestroyNotify(OnDestroyNotify onDestroyNotify, void *arg) {
1681*ec779b8eSAndroid Build Coastguard Worker auto it = std::find_if(
1682*ec779b8eSAndroid Build Coastguard Worker mNotify.begin(), mNotify.end(),
1683*ec779b8eSAndroid Build Coastguard Worker [onDestroyNotify, arg] (const auto &pair) {
1684*ec779b8eSAndroid Build Coastguard Worker return pair.first == onDestroyNotify && pair.second == arg;
1685*ec779b8eSAndroid Build Coastguard Worker });
1686*ec779b8eSAndroid Build Coastguard Worker if (it != mNotify.end()) {
1687*ec779b8eSAndroid Build Coastguard Worker return C2_DUPLICATE;
1688*ec779b8eSAndroid Build Coastguard Worker }
1689*ec779b8eSAndroid Build Coastguard Worker mNotify.emplace_back(onDestroyNotify, arg);
1690*ec779b8eSAndroid Build Coastguard Worker return C2_OK;
1691*ec779b8eSAndroid Build Coastguard Worker }
1692*ec779b8eSAndroid Build Coastguard Worker
unregisterOnDestroyNotify(OnDestroyNotify onDestroyNotify,void * arg)1693*ec779b8eSAndroid Build Coastguard Worker c2_status_t unregisterOnDestroyNotify(OnDestroyNotify onDestroyNotify, void *arg) {
1694*ec779b8eSAndroid Build Coastguard Worker auto it = std::find_if(
1695*ec779b8eSAndroid Build Coastguard Worker mNotify.begin(), mNotify.end(),
1696*ec779b8eSAndroid Build Coastguard Worker [onDestroyNotify, arg] (const auto &pair) {
1697*ec779b8eSAndroid Build Coastguard Worker return pair.first == onDestroyNotify && pair.second == arg;
1698*ec779b8eSAndroid Build Coastguard Worker });
1699*ec779b8eSAndroid Build Coastguard Worker if (it == mNotify.end()) {
1700*ec779b8eSAndroid Build Coastguard Worker return C2_NOT_FOUND;
1701*ec779b8eSAndroid Build Coastguard Worker }
1702*ec779b8eSAndroid Build Coastguard Worker mNotify.erase(it);
1703*ec779b8eSAndroid Build Coastguard Worker return C2_OK;
1704*ec779b8eSAndroid Build Coastguard Worker }
1705*ec779b8eSAndroid Build Coastguard Worker
info() const1706*ec779b8eSAndroid Build Coastguard Worker std::vector<std::shared_ptr<const C2Info>> info() const {
1707*ec779b8eSAndroid Build Coastguard Worker std::vector<std::shared_ptr<const C2Info>> result(mInfos.size());
1708*ec779b8eSAndroid Build Coastguard Worker std::transform(
1709*ec779b8eSAndroid Build Coastguard Worker mInfos.begin(), mInfos.end(), result.begin(),
1710*ec779b8eSAndroid Build Coastguard Worker [] (const auto &elem) { return elem.second; });
1711*ec779b8eSAndroid Build Coastguard Worker return result;
1712*ec779b8eSAndroid Build Coastguard Worker }
1713*ec779b8eSAndroid Build Coastguard Worker
setInfo(const std::shared_ptr<C2Info> & info)1714*ec779b8eSAndroid Build Coastguard Worker c2_status_t setInfo(const std::shared_ptr<C2Info> &info) {
1715*ec779b8eSAndroid Build Coastguard Worker // To "update" you need to erase the existing one if any, and then insert.
1716*ec779b8eSAndroid Build Coastguard Worker (void) mInfos.erase(info->coreIndex());
1717*ec779b8eSAndroid Build Coastguard Worker (void) mInfos.insert({ info->coreIndex(), info });
1718*ec779b8eSAndroid Build Coastguard Worker return C2_OK;
1719*ec779b8eSAndroid Build Coastguard Worker }
1720*ec779b8eSAndroid Build Coastguard Worker
hasInfo(C2Param::Type index) const1721*ec779b8eSAndroid Build Coastguard Worker bool hasInfo(C2Param::Type index) const {
1722*ec779b8eSAndroid Build Coastguard Worker return mInfos.count(index.coreIndex()) > 0;
1723*ec779b8eSAndroid Build Coastguard Worker }
1724*ec779b8eSAndroid Build Coastguard Worker
getInfo(C2Param::Type index) const1725*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<const C2Info> getInfo(C2Param::Type index) const {
1726*ec779b8eSAndroid Build Coastguard Worker auto it = mInfos.find(index.coreIndex());
1727*ec779b8eSAndroid Build Coastguard Worker if (it == mInfos.end()) {
1728*ec779b8eSAndroid Build Coastguard Worker return nullptr;
1729*ec779b8eSAndroid Build Coastguard Worker }
1730*ec779b8eSAndroid Build Coastguard Worker return std::const_pointer_cast<const C2Info>(it->second);
1731*ec779b8eSAndroid Build Coastguard Worker }
1732*ec779b8eSAndroid Build Coastguard Worker
removeInfo(C2Param::Type index)1733*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Info> removeInfo(C2Param::Type index) {
1734*ec779b8eSAndroid Build Coastguard Worker auto it = mInfos.find(index.coreIndex());
1735*ec779b8eSAndroid Build Coastguard Worker if (it == mInfos.end()) {
1736*ec779b8eSAndroid Build Coastguard Worker return nullptr;
1737*ec779b8eSAndroid Build Coastguard Worker }
1738*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Info> ret = it->second;
1739*ec779b8eSAndroid Build Coastguard Worker (void) mInfos.erase(it);
1740*ec779b8eSAndroid Build Coastguard Worker return ret;
1741*ec779b8eSAndroid Build Coastguard Worker }
1742*ec779b8eSAndroid Build Coastguard Worker
1743*ec779b8eSAndroid Build Coastguard Worker private:
1744*ec779b8eSAndroid Build Coastguard Worker C2Buffer * const mThis;
1745*ec779b8eSAndroid Build Coastguard Worker BufferDataBuddy mData;
1746*ec779b8eSAndroid Build Coastguard Worker std::map<C2Param::CoreIndex, std::shared_ptr<C2Info>> mInfos;
1747*ec779b8eSAndroid Build Coastguard Worker std::list<std::pair<OnDestroyNotify, void *>> mNotify;
1748*ec779b8eSAndroid Build Coastguard Worker };
1749*ec779b8eSAndroid Build Coastguard Worker
C2Buffer(const std::vector<C2ConstLinearBlock> & blocks)1750*ec779b8eSAndroid Build Coastguard Worker C2Buffer::C2Buffer(const std::vector<C2ConstLinearBlock> &blocks)
1751*ec779b8eSAndroid Build Coastguard Worker : mImpl(new Impl(this, blocks)) {}
1752*ec779b8eSAndroid Build Coastguard Worker
C2Buffer(const std::vector<C2ConstGraphicBlock> & blocks)1753*ec779b8eSAndroid Build Coastguard Worker C2Buffer::C2Buffer(const std::vector<C2ConstGraphicBlock> &blocks)
1754*ec779b8eSAndroid Build Coastguard Worker : mImpl(new Impl(this, blocks)) {}
1755*ec779b8eSAndroid Build Coastguard Worker
data() const1756*ec779b8eSAndroid Build Coastguard Worker const C2BufferData C2Buffer::data() const { return mImpl->data(); }
1757*ec779b8eSAndroid Build Coastguard Worker
registerOnDestroyNotify(OnDestroyNotify onDestroyNotify,void * arg)1758*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2Buffer::registerOnDestroyNotify(OnDestroyNotify onDestroyNotify, void *arg) {
1759*ec779b8eSAndroid Build Coastguard Worker return mImpl->registerOnDestroyNotify(onDestroyNotify, arg);
1760*ec779b8eSAndroid Build Coastguard Worker }
1761*ec779b8eSAndroid Build Coastguard Worker
unregisterOnDestroyNotify(OnDestroyNotify onDestroyNotify,void * arg)1762*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2Buffer::unregisterOnDestroyNotify(OnDestroyNotify onDestroyNotify, void *arg) {
1763*ec779b8eSAndroid Build Coastguard Worker return mImpl->unregisterOnDestroyNotify(onDestroyNotify, arg);
1764*ec779b8eSAndroid Build Coastguard Worker }
1765*ec779b8eSAndroid Build Coastguard Worker
info() const1766*ec779b8eSAndroid Build Coastguard Worker const std::vector<std::shared_ptr<const C2Info>> C2Buffer::info() const {
1767*ec779b8eSAndroid Build Coastguard Worker return mImpl->info();
1768*ec779b8eSAndroid Build Coastguard Worker }
1769*ec779b8eSAndroid Build Coastguard Worker
setInfo(const std::shared_ptr<C2Info> & info)1770*ec779b8eSAndroid Build Coastguard Worker c2_status_t C2Buffer::setInfo(const std::shared_ptr<C2Info> &info) {
1771*ec779b8eSAndroid Build Coastguard Worker return mImpl->setInfo(info);
1772*ec779b8eSAndroid Build Coastguard Worker }
1773*ec779b8eSAndroid Build Coastguard Worker
hasInfo(C2Param::Type index) const1774*ec779b8eSAndroid Build Coastguard Worker bool C2Buffer::hasInfo(C2Param::Type index) const {
1775*ec779b8eSAndroid Build Coastguard Worker return mImpl->hasInfo(index);
1776*ec779b8eSAndroid Build Coastguard Worker }
1777*ec779b8eSAndroid Build Coastguard Worker
getInfo(C2Param::Type index) const1778*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<const C2Info> C2Buffer::getInfo(C2Param::Type index) const {
1779*ec779b8eSAndroid Build Coastguard Worker return mImpl->getInfo(index);
1780*ec779b8eSAndroid Build Coastguard Worker }
1781*ec779b8eSAndroid Build Coastguard Worker
removeInfo(C2Param::Type index)1782*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Info> C2Buffer::removeInfo(C2Param::Type index) {
1783*ec779b8eSAndroid Build Coastguard Worker return mImpl->removeInfo(index);
1784*ec779b8eSAndroid Build Coastguard Worker }
1785*ec779b8eSAndroid Build Coastguard Worker
1786*ec779b8eSAndroid Build Coastguard Worker // static
CreateLinearBuffer(const C2ConstLinearBlock & block)1787*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> C2Buffer::CreateLinearBuffer(const C2ConstLinearBlock &block) {
1788*ec779b8eSAndroid Build Coastguard Worker return std::shared_ptr<C2Buffer>(new C2Buffer({ block }));
1789*ec779b8eSAndroid Build Coastguard Worker }
1790*ec779b8eSAndroid Build Coastguard Worker
1791*ec779b8eSAndroid Build Coastguard Worker // static
CreateGraphicBuffer(const C2ConstGraphicBlock & block)1792*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> C2Buffer::CreateGraphicBuffer(const C2ConstGraphicBlock &block) {
1793*ec779b8eSAndroid Build Coastguard Worker return std::shared_ptr<C2Buffer>(new C2Buffer({ block }));
1794*ec779b8eSAndroid Build Coastguard Worker }
1795