1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include <gui/BufferItem.h>
18*38e8c45fSAndroid Build Coastguard Worker
19*38e8c45fSAndroid Build Coastguard Worker #include <ui/Fence.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <ui/GraphicBuffer.h>
21*38e8c45fSAndroid Build Coastguard Worker
22*38e8c45fSAndroid Build Coastguard Worker #include <system/window.h>
23*38e8c45fSAndroid Build Coastguard Worker
24*38e8c45fSAndroid Build Coastguard Worker namespace android {
25*38e8c45fSAndroid Build Coastguard Worker
26*38e8c45fSAndroid Build Coastguard Worker template<typename T>
low32(const T n)27*38e8c45fSAndroid Build Coastguard Worker static inline constexpr uint32_t low32(const T n) {
28*38e8c45fSAndroid Build Coastguard Worker return static_cast<uint32_t>(static_cast<uint64_t>(n));
29*38e8c45fSAndroid Build Coastguard Worker }
30*38e8c45fSAndroid Build Coastguard Worker
31*38e8c45fSAndroid Build Coastguard Worker template<typename T>
high32(const T n)32*38e8c45fSAndroid Build Coastguard Worker static inline constexpr uint32_t high32(const T n) {
33*38e8c45fSAndroid Build Coastguard Worker return static_cast<uint32_t>(static_cast<uint64_t>(n)>>32);
34*38e8c45fSAndroid Build Coastguard Worker }
35*38e8c45fSAndroid Build Coastguard Worker
36*38e8c45fSAndroid Build Coastguard Worker template<typename T>
to64(const uint32_t lo,const uint32_t hi)37*38e8c45fSAndroid Build Coastguard Worker static inline constexpr T to64(const uint32_t lo, const uint32_t hi) {
38*38e8c45fSAndroid Build Coastguard Worker return static_cast<T>(static_cast<uint64_t>(hi)<<32 | lo);
39*38e8c45fSAndroid Build Coastguard Worker }
40*38e8c45fSAndroid Build Coastguard Worker
BufferItem()41*38e8c45fSAndroid Build Coastguard Worker BufferItem::BufferItem()
42*38e8c45fSAndroid Build Coastguard Worker : mGraphicBuffer(nullptr),
43*38e8c45fSAndroid Build Coastguard Worker mFence(nullptr),
44*38e8c45fSAndroid Build Coastguard Worker mCrop(Rect::INVALID_RECT),
45*38e8c45fSAndroid Build Coastguard Worker mTransform(0),
46*38e8c45fSAndroid Build Coastguard Worker mScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
47*38e8c45fSAndroid Build Coastguard Worker mTimestamp(0),
48*38e8c45fSAndroid Build Coastguard Worker mIsAutoTimestamp(false),
49*38e8c45fSAndroid Build Coastguard Worker mDataSpace(HAL_DATASPACE_UNKNOWN),
50*38e8c45fSAndroid Build Coastguard Worker mFrameNumber(0),
51*38e8c45fSAndroid Build Coastguard Worker mSlot(INVALID_BUFFER_SLOT),
52*38e8c45fSAndroid Build Coastguard Worker mIsDroppable(false),
53*38e8c45fSAndroid Build Coastguard Worker mAcquireCalled(false),
54*38e8c45fSAndroid Build Coastguard Worker mTransformToDisplayInverse(false),
55*38e8c45fSAndroid Build Coastguard Worker mSurfaceDamage(),
56*38e8c45fSAndroid Build Coastguard Worker mAutoRefresh(false),
57*38e8c45fSAndroid Build Coastguard Worker mQueuedBuffer(true),
58*38e8c45fSAndroid Build Coastguard Worker mIsStale(false),
59*38e8c45fSAndroid Build Coastguard Worker mApi(0) {}
60*38e8c45fSAndroid Build Coastguard Worker
~BufferItem()61*38e8c45fSAndroid Build Coastguard Worker BufferItem::~BufferItem() {}
62*38e8c45fSAndroid Build Coastguard Worker
63*38e8c45fSAndroid Build Coastguard Worker template <typename T>
addAligned(size_t & size,T)64*38e8c45fSAndroid Build Coastguard Worker static void addAligned(size_t& size, T /* value */) {
65*38e8c45fSAndroid Build Coastguard Worker size = FlattenableUtils::align<sizeof(T)>(size);
66*38e8c45fSAndroid Build Coastguard Worker size += sizeof(T);
67*38e8c45fSAndroid Build Coastguard Worker }
68*38e8c45fSAndroid Build Coastguard Worker
getPodSize() const69*38e8c45fSAndroid Build Coastguard Worker size_t BufferItem::getPodSize() const {
70*38e8c45fSAndroid Build Coastguard Worker size_t size = 0;
71*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mCrop);
72*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mTransform);
73*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mScalingMode);
74*38e8c45fSAndroid Build Coastguard Worker addAligned(size, low32(mTimestamp));
75*38e8c45fSAndroid Build Coastguard Worker addAligned(size, high32(mTimestamp));
76*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mIsAutoTimestamp);
77*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mDataSpace);
78*38e8c45fSAndroid Build Coastguard Worker #if COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
79*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mPictureProfileHandle.has_value());
80*38e8c45fSAndroid Build Coastguard Worker addAligned(size, low32(PictureProfileHandle::NONE.getId()));
81*38e8c45fSAndroid Build Coastguard Worker addAligned(size, high32(PictureProfileHandle::NONE.getId()));
82*38e8c45fSAndroid Build Coastguard Worker #endif // COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
83*38e8c45fSAndroid Build Coastguard Worker addAligned(size, low32(mFrameNumber));
84*38e8c45fSAndroid Build Coastguard Worker addAligned(size, high32(mFrameNumber));
85*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mSlot);
86*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mIsDroppable);
87*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mAcquireCalled);
88*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mTransformToDisplayInverse);
89*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mAutoRefresh);
90*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mQueuedBuffer);
91*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mIsStale);
92*38e8c45fSAndroid Build Coastguard Worker addAligned(size, mApi);
93*38e8c45fSAndroid Build Coastguard Worker return size;
94*38e8c45fSAndroid Build Coastguard Worker }
95*38e8c45fSAndroid Build Coastguard Worker
getFlattenedSize() const96*38e8c45fSAndroid Build Coastguard Worker size_t BufferItem::getFlattenedSize() const {
97*38e8c45fSAndroid Build Coastguard Worker size_t size = sizeof(uint32_t); // Flags
98*38e8c45fSAndroid Build Coastguard Worker if (mGraphicBuffer != nullptr) {
99*38e8c45fSAndroid Build Coastguard Worker size += mGraphicBuffer->getFlattenedSize();
100*38e8c45fSAndroid Build Coastguard Worker size = FlattenableUtils::align<4>(size);
101*38e8c45fSAndroid Build Coastguard Worker }
102*38e8c45fSAndroid Build Coastguard Worker if (mFence != nullptr) {
103*38e8c45fSAndroid Build Coastguard Worker size += mFence->getFlattenedSize();
104*38e8c45fSAndroid Build Coastguard Worker size = FlattenableUtils::align<4>(size);
105*38e8c45fSAndroid Build Coastguard Worker }
106*38e8c45fSAndroid Build Coastguard Worker size += mSurfaceDamage.getFlattenedSize();
107*38e8c45fSAndroid Build Coastguard Worker size += mHdrMetadata.getFlattenedSize();
108*38e8c45fSAndroid Build Coastguard Worker size = FlattenableUtils::align<8>(size);
109*38e8c45fSAndroid Build Coastguard Worker return size + getPodSize();
110*38e8c45fSAndroid Build Coastguard Worker }
111*38e8c45fSAndroid Build Coastguard Worker
getFdCount() const112*38e8c45fSAndroid Build Coastguard Worker size_t BufferItem::getFdCount() const {
113*38e8c45fSAndroid Build Coastguard Worker size_t count = 0;
114*38e8c45fSAndroid Build Coastguard Worker if (mGraphicBuffer != nullptr) {
115*38e8c45fSAndroid Build Coastguard Worker count += mGraphicBuffer->getFdCount();
116*38e8c45fSAndroid Build Coastguard Worker }
117*38e8c45fSAndroid Build Coastguard Worker if (mFence != nullptr) {
118*38e8c45fSAndroid Build Coastguard Worker count += mFence->getFdCount();
119*38e8c45fSAndroid Build Coastguard Worker }
120*38e8c45fSAndroid Build Coastguard Worker return count;
121*38e8c45fSAndroid Build Coastguard Worker }
122*38e8c45fSAndroid Build Coastguard Worker
123*38e8c45fSAndroid Build Coastguard Worker template <typename T>
writeAligned(void * & buffer,size_t & size,T value)124*38e8c45fSAndroid Build Coastguard Worker static void writeAligned(void*& buffer, size_t& size, T value) {
125*38e8c45fSAndroid Build Coastguard Worker size -= FlattenableUtils::align<alignof(T)>(buffer);
126*38e8c45fSAndroid Build Coastguard Worker FlattenableUtils::write(buffer, size, value);
127*38e8c45fSAndroid Build Coastguard Worker }
128*38e8c45fSAndroid Build Coastguard Worker
flatten(void * & buffer,size_t & size,int * & fds,size_t & count) const129*38e8c45fSAndroid Build Coastguard Worker status_t BufferItem::flatten(
130*38e8c45fSAndroid Build Coastguard Worker void*& buffer, size_t& size, int*& fds, size_t& count) const {
131*38e8c45fSAndroid Build Coastguard Worker
132*38e8c45fSAndroid Build Coastguard Worker // make sure we have enough space
133*38e8c45fSAndroid Build Coastguard Worker if (size < BufferItem::getFlattenedSize()) {
134*38e8c45fSAndroid Build Coastguard Worker return NO_MEMORY;
135*38e8c45fSAndroid Build Coastguard Worker }
136*38e8c45fSAndroid Build Coastguard Worker
137*38e8c45fSAndroid Build Coastguard Worker // content flags are stored first
138*38e8c45fSAndroid Build Coastguard Worker uint32_t& flags = *static_cast<uint32_t*>(buffer);
139*38e8c45fSAndroid Build Coastguard Worker
140*38e8c45fSAndroid Build Coastguard Worker // advance the pointer
141*38e8c45fSAndroid Build Coastguard Worker FlattenableUtils::advance(buffer, size, sizeof(uint32_t));
142*38e8c45fSAndroid Build Coastguard Worker
143*38e8c45fSAndroid Build Coastguard Worker flags = 0;
144*38e8c45fSAndroid Build Coastguard Worker if (mGraphicBuffer != nullptr) {
145*38e8c45fSAndroid Build Coastguard Worker status_t err = mGraphicBuffer->flatten(buffer, size, fds, count);
146*38e8c45fSAndroid Build Coastguard Worker if (err) return err;
147*38e8c45fSAndroid Build Coastguard Worker size -= FlattenableUtils::align<4>(buffer);
148*38e8c45fSAndroid Build Coastguard Worker flags |= 1;
149*38e8c45fSAndroid Build Coastguard Worker }
150*38e8c45fSAndroid Build Coastguard Worker if (mFence != nullptr) {
151*38e8c45fSAndroid Build Coastguard Worker status_t err = mFence->flatten(buffer, size, fds, count);
152*38e8c45fSAndroid Build Coastguard Worker if (err) return err;
153*38e8c45fSAndroid Build Coastguard Worker size -= FlattenableUtils::align<4>(buffer);
154*38e8c45fSAndroid Build Coastguard Worker flags |= 2;
155*38e8c45fSAndroid Build Coastguard Worker }
156*38e8c45fSAndroid Build Coastguard Worker
157*38e8c45fSAndroid Build Coastguard Worker status_t err = mSurfaceDamage.flatten(buffer, size);
158*38e8c45fSAndroid Build Coastguard Worker if (err) return err;
159*38e8c45fSAndroid Build Coastguard Worker FlattenableUtils::advance(buffer, size, mSurfaceDamage.getFlattenedSize());
160*38e8c45fSAndroid Build Coastguard Worker
161*38e8c45fSAndroid Build Coastguard Worker err = mHdrMetadata.flatten(buffer, size);
162*38e8c45fSAndroid Build Coastguard Worker if (err) return err;
163*38e8c45fSAndroid Build Coastguard Worker FlattenableUtils::advance(buffer, size, mHdrMetadata.getFlattenedSize());
164*38e8c45fSAndroid Build Coastguard Worker
165*38e8c45fSAndroid Build Coastguard Worker // Check we still have enough space
166*38e8c45fSAndroid Build Coastguard Worker if (size < getPodSize()) {
167*38e8c45fSAndroid Build Coastguard Worker return NO_MEMORY;
168*38e8c45fSAndroid Build Coastguard Worker }
169*38e8c45fSAndroid Build Coastguard Worker
170*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mCrop);
171*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mTransform);
172*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mScalingMode);
173*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, low32(mTimestamp));
174*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, high32(mTimestamp));
175*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mIsAutoTimestamp);
176*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mDataSpace);
177*38e8c45fSAndroid Build Coastguard Worker #if COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
178*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mPictureProfileHandle.has_value());
179*38e8c45fSAndroid Build Coastguard Worker if (mPictureProfileHandle.has_value()) {
180*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, low32(mPictureProfileHandle->getId()));
181*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, high32(mPictureProfileHandle->getId()));
182*38e8c45fSAndroid Build Coastguard Worker } else {
183*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, low32(PictureProfileHandle::NONE.getId()));
184*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, high32(PictureProfileHandle::NONE.getId()));
185*38e8c45fSAndroid Build Coastguard Worker }
186*38e8c45fSAndroid Build Coastguard Worker #endif // COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
187*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, low32(mFrameNumber));
188*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, high32(mFrameNumber));
189*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mSlot);
190*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mIsDroppable);
191*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mAcquireCalled);
192*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mTransformToDisplayInverse);
193*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mAutoRefresh);
194*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mQueuedBuffer);
195*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mIsStale);
196*38e8c45fSAndroid Build Coastguard Worker writeAligned(buffer, size, mApi);
197*38e8c45fSAndroid Build Coastguard Worker
198*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
199*38e8c45fSAndroid Build Coastguard Worker }
200*38e8c45fSAndroid Build Coastguard Worker
201*38e8c45fSAndroid Build Coastguard Worker template <typename T>
readAligned(const void * & buffer,size_t & size,T & value)202*38e8c45fSAndroid Build Coastguard Worker static void readAligned(const void*& buffer, size_t& size, T& value) {
203*38e8c45fSAndroid Build Coastguard Worker size -= FlattenableUtils::align<alignof(T)>(buffer);
204*38e8c45fSAndroid Build Coastguard Worker FlattenableUtils::read(buffer, size, value);
205*38e8c45fSAndroid Build Coastguard Worker }
206*38e8c45fSAndroid Build Coastguard Worker
unflatten(void const * & buffer,size_t & size,int const * & fds,size_t & count)207*38e8c45fSAndroid Build Coastguard Worker status_t BufferItem::unflatten(
208*38e8c45fSAndroid Build Coastguard Worker void const*& buffer, size_t& size, int const*& fds, size_t& count) {
209*38e8c45fSAndroid Build Coastguard Worker
210*38e8c45fSAndroid Build Coastguard Worker if (size < sizeof(uint32_t)) {
211*38e8c45fSAndroid Build Coastguard Worker return NO_MEMORY;
212*38e8c45fSAndroid Build Coastguard Worker }
213*38e8c45fSAndroid Build Coastguard Worker
214*38e8c45fSAndroid Build Coastguard Worker uint32_t flags = 0;
215*38e8c45fSAndroid Build Coastguard Worker FlattenableUtils::read(buffer, size, flags);
216*38e8c45fSAndroid Build Coastguard Worker
217*38e8c45fSAndroid Build Coastguard Worker if (flags & 1) {
218*38e8c45fSAndroid Build Coastguard Worker mGraphicBuffer = new GraphicBuffer();
219*38e8c45fSAndroid Build Coastguard Worker status_t err = mGraphicBuffer->unflatten(buffer, size, fds, count);
220*38e8c45fSAndroid Build Coastguard Worker if (err) return err;
221*38e8c45fSAndroid Build Coastguard Worker size -= FlattenableUtils::align<4>(buffer);
222*38e8c45fSAndroid Build Coastguard Worker }
223*38e8c45fSAndroid Build Coastguard Worker
224*38e8c45fSAndroid Build Coastguard Worker if (flags & 2) {
225*38e8c45fSAndroid Build Coastguard Worker mFence = new Fence();
226*38e8c45fSAndroid Build Coastguard Worker status_t err = mFence->unflatten(buffer, size, fds, count);
227*38e8c45fSAndroid Build Coastguard Worker if (err) return err;
228*38e8c45fSAndroid Build Coastguard Worker size -= FlattenableUtils::align<4>(buffer);
229*38e8c45fSAndroid Build Coastguard Worker
230*38e8c45fSAndroid Build Coastguard Worker mFenceTime = std::make_shared<FenceTime>(mFence);
231*38e8c45fSAndroid Build Coastguard Worker }
232*38e8c45fSAndroid Build Coastguard Worker
233*38e8c45fSAndroid Build Coastguard Worker status_t err = mSurfaceDamage.unflatten(buffer, size);
234*38e8c45fSAndroid Build Coastguard Worker if (err) return err;
235*38e8c45fSAndroid Build Coastguard Worker FlattenableUtils::advance(buffer, size, mSurfaceDamage.getFlattenedSize());
236*38e8c45fSAndroid Build Coastguard Worker
237*38e8c45fSAndroid Build Coastguard Worker err = mHdrMetadata.unflatten(buffer, size);
238*38e8c45fSAndroid Build Coastguard Worker if (err) return err;
239*38e8c45fSAndroid Build Coastguard Worker FlattenableUtils::advance(buffer, size, mHdrMetadata.getFlattenedSize());
240*38e8c45fSAndroid Build Coastguard Worker
241*38e8c45fSAndroid Build Coastguard Worker // Check we still have enough space
242*38e8c45fSAndroid Build Coastguard Worker if (size < getPodSize()) {
243*38e8c45fSAndroid Build Coastguard Worker return NO_MEMORY;
244*38e8c45fSAndroid Build Coastguard Worker }
245*38e8c45fSAndroid Build Coastguard Worker
246*38e8c45fSAndroid Build Coastguard Worker uint32_t timestampLo = 0, timestampHi = 0;
247*38e8c45fSAndroid Build Coastguard Worker uint32_t frameNumberLo = 0, frameNumberHi = 0;
248*38e8c45fSAndroid Build Coastguard Worker int32_t pictureProfileIdLo = 0, pictureProfileIdHi = 0;
249*38e8c45fSAndroid Build Coastguard Worker
250*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mCrop);
251*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mTransform);
252*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mScalingMode);
253*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, timestampLo);
254*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, timestampHi);
255*38e8c45fSAndroid Build Coastguard Worker mTimestamp = to64<int64_t>(timestampLo, timestampHi);
256*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mIsAutoTimestamp);
257*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mDataSpace);
258*38e8c45fSAndroid Build Coastguard Worker #if COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
259*38e8c45fSAndroid Build Coastguard Worker bool hasPictureProfileHandle;
260*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, hasPictureProfileHandle);
261*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, pictureProfileIdLo);
262*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, pictureProfileIdHi);
263*38e8c45fSAndroid Build Coastguard Worker mPictureProfileHandle = hasPictureProfileHandle
264*38e8c45fSAndroid Build Coastguard Worker ? std::optional(PictureProfileHandle(
265*38e8c45fSAndroid Build Coastguard Worker to64<PictureProfileId>(pictureProfileIdLo, pictureProfileIdHi)))
266*38e8c45fSAndroid Build Coastguard Worker : std::nullopt;
267*38e8c45fSAndroid Build Coastguard Worker #endif // COM_ANDROID_GRAPHICS_LIBUI_FLAGS_APPLY_PICTURE_PROFILES
268*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, frameNumberLo);
269*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, frameNumberHi);
270*38e8c45fSAndroid Build Coastguard Worker mFrameNumber = to64<uint64_t>(frameNumberLo, frameNumberHi);
271*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mSlot);
272*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mIsDroppable);
273*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mAcquireCalled);
274*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mTransformToDisplayInverse);
275*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mAutoRefresh);
276*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mQueuedBuffer);
277*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mIsStale);
278*38e8c45fSAndroid Build Coastguard Worker readAligned(buffer, size, mApi);
279*38e8c45fSAndroid Build Coastguard Worker
280*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR;
281*38e8c45fSAndroid Build Coastguard Worker }
282*38e8c45fSAndroid Build Coastguard Worker
scalingModeName(uint32_t scalingMode)283*38e8c45fSAndroid Build Coastguard Worker const char* BufferItem::scalingModeName(uint32_t scalingMode) {
284*38e8c45fSAndroid Build Coastguard Worker switch (scalingMode) {
285*38e8c45fSAndroid Build Coastguard Worker case NATIVE_WINDOW_SCALING_MODE_FREEZE: return "FREEZE";
286*38e8c45fSAndroid Build Coastguard Worker case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: return "SCALE_TO_WINDOW";
287*38e8c45fSAndroid Build Coastguard Worker case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: return "SCALE_CROP";
288*38e8c45fSAndroid Build Coastguard Worker default: return "Unknown";
289*38e8c45fSAndroid Build Coastguard Worker }
290*38e8c45fSAndroid Build Coastguard Worker }
291*38e8c45fSAndroid Build Coastguard Worker
292*38e8c45fSAndroid Build Coastguard Worker } // namespace android
293