xref: /aosp_15_r20/frameworks/native/libs/gui/BufferItem.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
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