• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <gui/LayerDebugInfo.h>
18 
19 #include <android-base/stringprintf.h>
20 
21 #include <ui/DebugUtils.h>
22 
23 #include <binder/Parcel.h>
24 
25 using namespace android;
26 using android::base::StringAppendF;
27 
28 #define RETURN_ON_ERROR(X) do {status_t res = (X); if (res != NO_ERROR) return res;} while(false)
29 
30 namespace android {
31 
writeToParcel(Parcel * parcel) const32 status_t LayerDebugInfo::writeToParcel(Parcel* parcel) const {
33     RETURN_ON_ERROR(parcel->writeCString(mName.c_str()));
34     RETURN_ON_ERROR(parcel->writeCString(mParentName.c_str()));
35     RETURN_ON_ERROR(parcel->writeCString(mType.c_str()));
36     RETURN_ON_ERROR(parcel->write(mTransparentRegion));
37     RETURN_ON_ERROR(parcel->write(mVisibleRegion));
38     RETURN_ON_ERROR(parcel->write(mSurfaceDamageRegion));
39     RETURN_ON_ERROR(parcel->writeUint32(mLayerStack));
40     RETURN_ON_ERROR(parcel->writeFloat(mX));
41     RETURN_ON_ERROR(parcel->writeFloat(mY));
42     RETURN_ON_ERROR(parcel->writeUint32(mZ));
43     RETURN_ON_ERROR(parcel->writeInt32(mWidth));
44     RETURN_ON_ERROR(parcel->writeInt32(mHeight));
45     RETURN_ON_ERROR(parcel->write(mCrop));
46     RETURN_ON_ERROR(parcel->writeFloat(mColor.r));
47     RETURN_ON_ERROR(parcel->writeFloat(mColor.g));
48     RETURN_ON_ERROR(parcel->writeFloat(mColor.b));
49     RETURN_ON_ERROR(parcel->writeFloat(mColor.a));
50     RETURN_ON_ERROR(parcel->writeUint32(mFlags));
51     RETURN_ON_ERROR(parcel->writeInt32(mPixelFormat));
52     RETURN_ON_ERROR(parcel->writeUint32(static_cast<uint32_t>(mDataSpace)));
53     for (size_t index = 0; index < 4; index++) {
54         RETURN_ON_ERROR(parcel->writeFloat(mMatrix[index / 2][index % 2]));
55     }
56     RETURN_ON_ERROR(parcel->writeInt32(mActiveBufferWidth));
57     RETURN_ON_ERROR(parcel->writeInt32(mActiveBufferHeight));
58     RETURN_ON_ERROR(parcel->writeInt32(mActiveBufferStride));
59     RETURN_ON_ERROR(parcel->writeInt32(mActiveBufferFormat));
60     RETURN_ON_ERROR(parcel->writeInt32(mNumQueuedFrames));
61     RETURN_ON_ERROR(parcel->writeBool(mRefreshPending));
62     RETURN_ON_ERROR(parcel->writeBool(mIsOpaque));
63     RETURN_ON_ERROR(parcel->writeBool(mContentDirty));
64     return NO_ERROR;
65 }
66 
readFromParcel(const Parcel * parcel)67 status_t LayerDebugInfo::readFromParcel(const Parcel* parcel) {
68     mName = parcel->readCString();
69     RETURN_ON_ERROR(parcel->errorCheck());
70     mParentName = parcel->readCString();
71     RETURN_ON_ERROR(parcel->errorCheck());
72     mType = parcel->readCString();
73     RETURN_ON_ERROR(parcel->errorCheck());
74     RETURN_ON_ERROR(parcel->read(mTransparentRegion));
75     RETURN_ON_ERROR(parcel->read(mVisibleRegion));
76     RETURN_ON_ERROR(parcel->read(mSurfaceDamageRegion));
77     RETURN_ON_ERROR(parcel->readUint32(&mLayerStack));
78     RETURN_ON_ERROR(parcel->readFloat(&mX));
79     RETURN_ON_ERROR(parcel->readFloat(&mY));
80     RETURN_ON_ERROR(parcel->readUint32(&mZ));
81     RETURN_ON_ERROR(parcel->readInt32(&mWidth));
82     RETURN_ON_ERROR(parcel->readInt32(&mHeight));
83     RETURN_ON_ERROR(parcel->read(mCrop));
84     mColor.r = parcel->readFloat();
85     RETURN_ON_ERROR(parcel->errorCheck());
86     mColor.g = parcel->readFloat();
87     RETURN_ON_ERROR(parcel->errorCheck());
88     mColor.b = parcel->readFloat();
89     RETURN_ON_ERROR(parcel->errorCheck());
90     mColor.a = parcel->readFloat();
91     RETURN_ON_ERROR(parcel->errorCheck());
92     RETURN_ON_ERROR(parcel->readUint32(&mFlags));
93     RETURN_ON_ERROR(parcel->readInt32(&mPixelFormat));
94     // \todo [2017-07-25 kraita]: Static casting mDataSpace pointer to an uint32 does work. Better ways?
95     mDataSpace = static_cast<android_dataspace>(parcel->readUint32());
96     RETURN_ON_ERROR(parcel->errorCheck());
97     for (size_t index = 0; index < 4; index++) {
98         RETURN_ON_ERROR(parcel->readFloat(&mMatrix[index / 2][index % 2]));
99     }
100     RETURN_ON_ERROR(parcel->readInt32(&mActiveBufferWidth));
101     RETURN_ON_ERROR(parcel->readInt32(&mActiveBufferHeight));
102     RETURN_ON_ERROR(parcel->readInt32(&mActiveBufferStride));
103     RETURN_ON_ERROR(parcel->readInt32(&mActiveBufferFormat));
104     RETURN_ON_ERROR(parcel->readInt32(&mNumQueuedFrames));
105     RETURN_ON_ERROR(parcel->readBool(&mRefreshPending));
106     RETURN_ON_ERROR(parcel->readBool(&mIsOpaque));
107     RETURN_ON_ERROR(parcel->readBool(&mContentDirty));
108     return NO_ERROR;
109 }
110 
to_string(const LayerDebugInfo & info)111 std::string to_string(const LayerDebugInfo& info) {
112     std::string result;
113 
114     StringAppendF(&result, "+ %s (%s)\n", info.mType.c_str(), info.mName.c_str());
115     info.mTransparentRegion.dump(result, "TransparentRegion");
116     info.mVisibleRegion.dump(result, "VisibleRegion");
117     info.mSurfaceDamageRegion.dump(result, "SurfaceDamageRegion");
118 
119     StringAppendF(&result, "      layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), ",
120                   info.mLayerStack, info.mZ, static_cast<double>(info.mX),
121                   static_cast<double>(info.mY), info.mWidth, info.mHeight);
122 
123     StringAppendF(&result, "crop=%s, ", to_string(info.mCrop).c_str());
124     StringAppendF(&result, "isOpaque=%1d, invalidate=%1d, ", info.mIsOpaque, info.mContentDirty);
125     StringAppendF(&result, "dataspace=%s, ", dataspaceDetails(info.mDataSpace).c_str());
126     StringAppendF(&result, "pixelformat=%s, ", decodePixelFormat(info.mPixelFormat).c_str());
127     StringAppendF(&result, "color=(%.3f,%.3f,%.3f,%.3f), flags=0x%08x, ",
128                   static_cast<double>(info.mColor.r), static_cast<double>(info.mColor.g),
129                   static_cast<double>(info.mColor.b), static_cast<double>(info.mColor.a),
130                   info.mFlags);
131     StringAppendF(&result, "tr=[%.2f, %.2f][%.2f, %.2f]", static_cast<double>(info.mMatrix[0][0]),
132                   static_cast<double>(info.mMatrix[0][1]), static_cast<double>(info.mMatrix[1][0]),
133                   static_cast<double>(info.mMatrix[1][1]));
134     result.append("\n");
135     StringAppendF(&result, "      parent=%s\n", info.mParentName.c_str());
136     StringAppendF(&result, "      activeBuffer=[%4ux%4u:%4u,%s],", info.mActiveBufferWidth,
137                   info.mActiveBufferHeight, info.mActiveBufferStride,
138                   decodePixelFormat(info.mActiveBufferFormat).c_str());
139     StringAppendF(&result, " queued-frames=%d, mRefreshPending=%d", info.mNumQueuedFrames,
140                   info.mRefreshPending);
141     result.append("\n");
142     return result;
143 }
144 
145 } // android
146