SurfaceInterceptor.h revision c274c6313bee6044208a46137c40fb05f7f6e485
1/*
2 * Copyright 2016 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#ifndef ANDROID_SURFACEINTERCEPTOR_H
18#define ANDROID_SURFACEINTERCEPTOR_H
19
20#include <frameworks/native/cmds/surfacecapturereplay/proto/src/trace.pb.h>
21
22#include <mutex>
23
24namespace android {
25
26class BufferItem;
27class Layer;
28struct layer_state_t;
29
30constexpr auto DEFAULT_FILENAME = "/data/SurfaceTrace.dat";
31
32/*
33 * SurfaceInterceptor intercepts and stores incoming streams of window
34 * properties on SurfaceFlinger.
35 */
36class SurfaceInterceptor {
37public:
38    // The layer vector is used to capture the inital snapshot in the trace
39    void enable(const SortedVector<sp<Layer>>& layers);
40    void disable();
41    void setOutputFileName(const std::string& OutputFileName);
42
43    void saveLayerUpdates(const Vector<ComposerState>& state, uint32_t flags);
44    void saveLayerCreate(const sp<const Layer>& layer);
45    void saveLayerDelete(const sp<const Layer>& layer);
46    void saveBufferUpdate(const sp<const Layer>& layer, uint32_t width, uint32_t height,
47            uint64_t frameNumber);
48    void saveVSyncEvent(nsecs_t timestamp);
49
50private:
51    void saveExistingLayers(const SortedVector<sp<Layer>>& layers);
52    void saveInitialLayerStateLocked(const sp<const Layer>& layer);
53    void saveLayerCreateLocked(const sp<const Layer>& layer);
54    status_t writeProtoFileLocked();
55    const sp<const Layer> getLayer(const sp<const IBinder>& handle);
56    const std::string getLayerName(const sp<const Layer>& layer);
57    int32_t getLayerId(const sp<const Layer>& layer);
58    Increment* addTraceIncrementLocked();
59
60    void addUpdatedLayersLocked(Increment* increment, uint32_t flags,
61            const Vector<ComposerState>& stateUpdates);
62    void addCreatedLayerLocked(Increment* increment, const sp<const Layer>& layer);
63    void addDeletedLayerLocked(Increment* increment, const sp<const Layer>& layer);
64    void addUpdatedBufferLocked(Increment* increment, const sp<const Layer>& layer, uint32_t width,
65            uint32_t height, uint64_t frameNumber);
66    void addUpdatedVsyncLocked(Increment* increment, nsecs_t timestamp);
67
68    Change* addChangeLocked(Transaction* transaction, int32_t layerId);
69    void setProtoRectLocked(Rectangle* protoRect, const Rect& rect);
70    void addPositionLocked(Transaction* transaction, int32_t layerId, float x, float y);
71    void addDepthLocked(Transaction* transaction, int32_t layerId, uint32_t z);
72    void addSizeLocked(Transaction* transaction, int32_t layerId, uint32_t w, uint32_t h);
73    void addAlphaLocked(Transaction* transaction, int32_t layerId, float alpha);
74    void addMatrixLocked(Transaction* transaction, int32_t layerId,
75            const layer_state_t::matrix22_t& matrix);
76    void addTransparentRegionLocked(Transaction* transaction, int32_t layerId,
77            const Region& transRegion);
78    void addFlagsLocked(Transaction* transaction, int32_t layerId, uint8_t flags);
79    void addLayerStackLocked(Transaction* transaction, int32_t layerId, uint32_t layerStack);
80    void addCropLocked(Transaction* transaction, int32_t layerId, const Rect& rect);
81    void addDeferTransactionLocked(Transaction* transaction, int32_t layerId,
82            const sp<const IBinder>& handle, uint64_t frameNumber);
83    void addFinalCropLocked(Transaction* transaction, int32_t layerId, const Rect& rect);
84    void addOverrideScalingModeLocked(Transaction* transaction, int32_t layerId,
85            int32_t overrideScalingMode);
86    void addChangedPropertiesLocked(Transaction* transaction, const layer_state_t& state);
87
88    bool mEnabled {false};
89    std::string mOutputFileName {DEFAULT_FILENAME};
90    std::mutex mTraceMutex {};
91    Trace mTrace {};
92};
93
94}
95
96#endif // ANDROID_SURFACEINTERCEPTOR_H
97