• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 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_GUI_ISURFACE_COMPOSER_H
18 #define ANDROID_GUI_ISURFACE_COMPOSER_H
19 
20 #include <stdint.h>
21 #include <sys/types.h>
22 
23 #include <binder/IBinder.h>
24 #include <binder/IInterface.h>
25 
26 #include <gui/ITransactionCompletedListener.h>
27 
28 #include <ui/ConfigStoreTypes.h>
29 #include <ui/DisplayedFrameStats.h>
30 #include <ui/FrameStats.h>
31 #include <ui/GraphicBuffer.h>
32 #include <ui/GraphicTypes.h>
33 #include <ui/PixelFormat.h>
34 
35 #include <utils/Errors.h>
36 #include <utils/RefBase.h>
37 #include <utils/Timers.h>
38 #include <utils/Vector.h>
39 
40 #include <optional>
41 #include <unordered_set>
42 #include <vector>
43 
44 namespace android {
45 // ----------------------------------------------------------------------------
46 
47 struct client_cache_t;
48 struct ComposerState;
49 struct DisplayState;
50 struct DisplayInfo;
51 struct DisplayStatInfo;
52 struct InputWindowCommands;
53 class LayerDebugInfo;
54 class HdrCapabilities;
55 class IDisplayEventConnection;
56 class IGraphicBufferProducer;
57 class ISurfaceComposerClient;
58 class IRegionSamplingListener;
59 class Rect;
60 enum class FrameEvent;
61 
62 /*
63  * This class defines the Binder IPC interface for accessing various
64  * SurfaceFlinger features.
65  */
66 class ISurfaceComposer: public IInterface {
67 public:
68     DECLARE_META_INTERFACE(SurfaceComposer)
69 
70     // flags for setTransactionState()
71     enum {
72         eSynchronous = 0x01,
73         eAnimation   = 0x02,
74 
75         // Indicates that this transaction will likely result in a lot of layers being composed, and
76         // thus, SurfaceFlinger should wake-up earlier to avoid missing frame deadlines. In this
77         // case SurfaceFlinger will wake up at (sf vsync offset - debug.sf.early_phase_offset_ns)
78         eEarlyWakeup = 0x04
79     };
80 
81     enum Rotation {
82         eRotateNone = 0,
83         eRotate90   = 1,
84         eRotate180  = 2,
85         eRotate270  = 3
86     };
87 
88     enum VsyncSource {
89         eVsyncSourceApp = 0,
90         eVsyncSourceSurfaceFlinger = 1
91     };
92 
93     /*
94      * Create a connection with SurfaceFlinger.
95      */
96     virtual sp<ISurfaceComposerClient> createConnection() = 0;
97 
98     /* return an IDisplayEventConnection */
99     virtual sp<IDisplayEventConnection> createDisplayEventConnection(
100             VsyncSource vsyncSource = eVsyncSourceApp) = 0;
101 
102     /* create a virtual display
103      * requires ACCESS_SURFACE_FLINGER permission.
104      */
105     virtual sp<IBinder> createDisplay(const String8& displayName,
106             bool secure) = 0;
107 
108     /* destroy a virtual display
109      * requires ACCESS_SURFACE_FLINGER permission.
110      */
111     virtual void destroyDisplay(const sp<IBinder>& display) = 0;
112 
113     /* get stable IDs for connected physical displays.
114      */
115     virtual std::vector<PhysicalDisplayId> getPhysicalDisplayIds() const = 0;
116 
117     // TODO(b/74619554): Remove this stopgap once the framework is display-agnostic.
getInternalDisplayId()118     std::optional<PhysicalDisplayId> getInternalDisplayId() const {
119         const auto displayIds = getPhysicalDisplayIds();
120         return displayIds.empty() ? std::nullopt : std::make_optional(displayIds.front());
121     }
122 
123     /* get token for a physical display given its stable ID obtained via getPhysicalDisplayIds or a
124      * DisplayEventReceiver hotplug event.
125      */
126     virtual sp<IBinder> getPhysicalDisplayToken(PhysicalDisplayId displayId) const = 0;
127 
128     // TODO(b/74619554): Remove this stopgap once the framework is display-agnostic.
getInternalDisplayToken()129     sp<IBinder> getInternalDisplayToken() const {
130         const auto displayId = getInternalDisplayId();
131         return displayId ? getPhysicalDisplayToken(*displayId) : nullptr;
132     }
133 
134     /* open/close transactions. requires ACCESS_SURFACE_FLINGER permission */
135     virtual void setTransactionState(const Vector<ComposerState>& state,
136                                      const Vector<DisplayState>& displays, uint32_t flags,
137                                      const sp<IBinder>& applyToken,
138                                      const InputWindowCommands& inputWindowCommands,
139                                      int64_t desiredPresentTime,
140                                      const client_cache_t& uncacheBuffer,
141                                      const std::vector<ListenerCallbacks>& listenerCallbacks) = 0;
142 
143     /* signal that we're done booting.
144      * Requires ACCESS_SURFACE_FLINGER permission
145      */
146     virtual void bootFinished() = 0;
147 
148     /* verify that an IGraphicBufferProducer was created by SurfaceFlinger.
149      */
150     virtual bool authenticateSurfaceTexture(
151             const sp<IGraphicBufferProducer>& surface) const = 0;
152 
153     /* Returns the frame timestamps supported by SurfaceFlinger.
154      */
155     virtual status_t getSupportedFrameTimestamps(
156             std::vector<FrameEvent>* outSupported) const = 0;
157 
158     /* set display power mode. depending on the mode, it can either trigger
159      * screen on, off or low power mode and wait for it to complete.
160      * requires ACCESS_SURFACE_FLINGER permission.
161      */
162     virtual void setPowerMode(const sp<IBinder>& display, int mode) = 0;
163 
164     /* returns information for each configuration of the given display
165      * intended to be used to get information about built-in displays */
166     virtual status_t getDisplayConfigs(const sp<IBinder>& display,
167             Vector<DisplayInfo>* configs) = 0;
168 
169     /* returns display statistics for a given display
170      * intended to be used by the media framework to properly schedule
171      * video frames */
172     virtual status_t getDisplayStats(const sp<IBinder>& display,
173             DisplayStatInfo* stats) = 0;
174 
175     /* indicates which of the configurations returned by getDisplayInfo is
176      * currently active */
177     virtual int getActiveConfig(const sp<IBinder>& display) = 0;
178 
179     /* specifies which configuration (of those returned by getDisplayInfo)
180      * should be used */
181     virtual status_t setActiveConfig(const sp<IBinder>& display, int id) = 0;
182 
183     virtual status_t getDisplayColorModes(const sp<IBinder>& display,
184             Vector<ui::ColorMode>* outColorModes) = 0;
185     virtual status_t getDisplayNativePrimaries(const sp<IBinder>& display,
186             ui::DisplayPrimaries& primaries) = 0;
187     virtual ui::ColorMode getActiveColorMode(const sp<IBinder>& display) = 0;
188     virtual status_t setActiveColorMode(const sp<IBinder>& display,
189             ui::ColorMode colorMode) = 0;
190 
191     /**
192      * Capture the specified screen. This requires READ_FRAME_BUFFER
193      * permission.  This function will fail if there is a secure window on
194      * screen.
195      *
196      * This function can capture a subregion (the source crop) of the screen.
197      * The subregion can be optionally rotated.  It will also be scaled to
198      * match the size of the output buffer.
199      *
200      * reqDataspace and reqPixelFormat specify the data space and pixel format
201      * of the buffer. The caller should pick the data space and pixel format
202      * that it can consume.
203      *
204      * sourceCrop is the crop on the logical display.
205      *
206      * reqWidth and reqHeight specifies the size of the buffer.  When either
207      * of them is 0, they are set to the size of the logical display viewport.
208      *
209      * When useIdentityTransform is true, layer transformations are disabled.
210      *
211      * rotation specifies the rotation of the source crop (and the pixels in
212      * it) around its center.
213      */
214     virtual status_t captureScreen(const sp<IBinder>& display, sp<GraphicBuffer>* outBuffer,
215                                    bool& outCapturedSecureLayers, const ui::Dataspace reqDataspace,
216                                    const ui::PixelFormat reqPixelFormat, Rect sourceCrop,
217                                    uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform,
218                                    Rotation rotation = eRotateNone,
219                                    bool captureSecureLayers = false) = 0;
220     /**
221      * Capture the specified screen. This requires READ_FRAME_BUFFER
222      * permission.  This function will fail if there is a secure window on
223      * screen.
224      *
225      * This function can capture a subregion (the source crop) of the screen
226      * into an sRGB buffer with RGBA_8888 pixel format.
227      * The subregion can be optionally rotated.  It will also be scaled to
228      * match the size of the output buffer.
229      *
230      * At the moment, sourceCrop is ignored and is always set to the visible
231      * region (projected display viewport) of the screen.
232      *
233      * reqWidth and reqHeight specifies the size of the buffer.  When either
234      * of them is 0, they are set to the size of the logical display viewport.
235      *
236      * When useIdentityTransform is true, layer transformations are disabled.
237      *
238      * rotation specifies the rotation of the source crop (and the pixels in
239      * it) around its center.
240      */
241     virtual status_t captureScreen(const sp<IBinder>& display, sp<GraphicBuffer>* outBuffer,
242                                    Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
243                                    bool useIdentityTransform, Rotation rotation = eRotateNone) {
244         bool outIgnored;
245         return captureScreen(display, outBuffer, outIgnored, ui::Dataspace::V0_SRGB,
246                              ui::PixelFormat::RGBA_8888, sourceCrop, reqWidth, reqHeight,
247                              useIdentityTransform, rotation);
248     }
249 
250     virtual status_t captureScreen(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace,
251                                    sp<GraphicBuffer>* outBuffer) = 0;
252 
253     template <class AA>
254     struct SpHash {
operatorSpHash255         size_t operator()(const sp<AA>& k) const { return std::hash<AA*>()(k.get()); }
256     };
257 
258     /**
259      * Capture a subtree of the layer hierarchy, potentially ignoring the root node.
260      *
261      * reqDataspace and reqPixelFormat specify the data space and pixel format
262      * of the buffer. The caller should pick the data space and pixel format
263      * that it can consume.
264      */
265     virtual status_t captureLayers(
266             const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer,
267             const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat,
268             const Rect& sourceCrop,
269             const std::unordered_set<sp<IBinder>, SpHash<IBinder>>& excludeHandles,
270             float frameScale = 1.0, bool childrenOnly = false) = 0;
271 
272     /**
273      * Capture a subtree of the layer hierarchy into an sRGB buffer with RGBA_8888 pixel format,
274      * potentially ignoring the root node.
275      */
276     status_t captureLayers(const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer,
277                            const Rect& sourceCrop, float frameScale = 1.0,
278                            bool childrenOnly = false) {
279         return captureLayers(layerHandleBinder, outBuffer, ui::Dataspace::V0_SRGB,
280                              ui::PixelFormat::RGBA_8888, sourceCrop, {}, frameScale, childrenOnly);
281     }
282 
283     /* Clears the frame statistics for animations.
284      *
285      * Requires the ACCESS_SURFACE_FLINGER permission.
286      */
287     virtual status_t clearAnimationFrameStats() = 0;
288 
289     /* Gets the frame statistics for animations.
290      *
291      * Requires the ACCESS_SURFACE_FLINGER permission.
292      */
293     virtual status_t getAnimationFrameStats(FrameStats* outStats) const = 0;
294 
295     /* Gets the supported HDR capabilities of the given display.
296      *
297      * Requires the ACCESS_SURFACE_FLINGER permission.
298      */
299     virtual status_t getHdrCapabilities(const sp<IBinder>& display,
300             HdrCapabilities* outCapabilities) const = 0;
301 
302     virtual status_t enableVSyncInjections(bool enable) = 0;
303 
304     virtual status_t injectVSync(nsecs_t when) = 0;
305 
306     /* Gets the list of active layers in Z order for debugging purposes
307      *
308      * Requires the ACCESS_SURFACE_FLINGER permission.
309      */
310     virtual status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) = 0;
311 
312     virtual status_t getColorManagement(bool* outGetColorManagement) const = 0;
313 
314     /* Gets the composition preference of the default data space and default pixel format,
315      * as well as the wide color gamut data space and wide color gamut pixel format.
316      * If the wide color gamut data space is V0_SRGB, then it implies that the platform
317      * has no wide color gamut support.
318      *
319      * Requires the ACCESS_SURFACE_FLINGER permission.
320      */
321     virtual status_t getCompositionPreference(ui::Dataspace* defaultDataspace,
322                                               ui::PixelFormat* defaultPixelFormat,
323                                               ui::Dataspace* wideColorGamutDataspace,
324                                               ui::PixelFormat* wideColorGamutPixelFormat) const = 0;
325     /*
326      * Requires the ACCESS_SURFACE_FLINGER permission.
327      */
328     virtual status_t getDisplayedContentSamplingAttributes(const sp<IBinder>& display,
329                                                            ui::PixelFormat* outFormat,
330                                                            ui::Dataspace* outDataspace,
331                                                            uint8_t* outComponentMask) const = 0;
332 
333     /* Turns on the color sampling engine on the display.
334      *
335      * Requires the ACCESS_SURFACE_FLINGER permission.
336      */
337     virtual status_t setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable,
338                                                       uint8_t componentMask,
339                                                       uint64_t maxFrames) const = 0;
340 
341     /* Returns statistics on the color profile of the last frame displayed for a given display
342      *
343      * Requires the ACCESS_SURFACE_FLINGER permission.
344      */
345     virtual status_t getDisplayedContentSample(const sp<IBinder>& display, uint64_t maxFrames,
346                                                uint64_t timestamp,
347                                                DisplayedFrameStats* outStats) const = 0;
348 
349     /*
350      * Gets whether SurfaceFlinger can support protected content in GPU composition.
351      * Requires the ACCESS_SURFACE_FLINGER permission.
352      */
353     virtual status_t getProtectedContentSupport(bool* outSupported) const = 0;
354 
355     /*
356      * Queries whether the given display is a wide color display.
357      * Requires the ACCESS_SURFACE_FLINGER permission.
358      */
359     virtual status_t isWideColorDisplay(const sp<IBinder>& token,
360                                         bool* outIsWideColorDisplay) const = 0;
361 
362     /* Registers a listener to stream median luma updates from SurfaceFlinger.
363      *
364      * The sampling area is bounded by both samplingArea and the given stopLayerHandle
365      * (i.e., only layers behind the stop layer will be captured and sampled).
366      *
367      * Multiple listeners may be provided so long as they have independent listeners.
368      * If multiple listeners are provided, the effective sampling region for each listener will
369      * be bounded by whichever stop layer has a lower Z value.
370      *
371      * Requires the same permissions as captureLayers and captureScreen.
372      */
373     virtual status_t addRegionSamplingListener(const Rect& samplingArea,
374                                                const sp<IBinder>& stopLayerHandle,
375                                                const sp<IRegionSamplingListener>& listener) = 0;
376 
377     /*
378      * Removes a listener that was streaming median luma updates from SurfaceFlinger.
379      */
380     virtual status_t removeRegionSamplingListener(const sp<IRegionSamplingListener>& listener) = 0;
381 
382     /*
383      * Sets the allowed display configurations to be used.
384      * The allowedConfigs in a vector of indexes corresponding to the configurations
385      * returned from getDisplayConfigs().
386      */
387     virtual status_t setAllowedDisplayConfigs(const sp<IBinder>& displayToken,
388                                               const std::vector<int32_t>& allowedConfigs) = 0;
389 
390     /*
391      * Returns the allowed display configurations currently set.
392      * The allowedConfigs in a vector of indexes corresponding to the configurations
393      * returned from getDisplayConfigs().
394      */
395     virtual status_t getAllowedDisplayConfigs(const sp<IBinder>& displayToken,
396                                               std::vector<int32_t>* outAllowedConfigs) = 0;
397     /*
398      * Gets whether brightness operations are supported on a display.
399      *
400      * displayToken
401      *      The token of the display.
402      * outSupport
403      *      An output parameter for whether brightness operations are supported.
404      *
405      * Returns NO_ERROR upon success. Otherwise,
406      *      NAME_NOT_FOUND if the display is invalid, or
407      *      BAD_VALUE      if the output parameter is invalid.
408      */
409     virtual status_t getDisplayBrightnessSupport(const sp<IBinder>& displayToken,
410                                                  bool* outSupport) const = 0;
411 
412     /*
413      * Sets the brightness of a display.
414      *
415      * displayToken
416      *      The token of the display whose brightness is set.
417      * brightness
418      *      A number between 0.0f (minimum brightness) and 1.0 (maximum brightness), or -1.0f to
419      *      turn the backlight off.
420      *
421      * Returns NO_ERROR upon success. Otherwise,
422      *      NAME_NOT_FOUND    if the display is invalid, or
423      *      BAD_VALUE         if the brightness is invalid, or
424      *      INVALID_OPERATION if brightness operations are not supported.
425      */
426     virtual status_t setDisplayBrightness(const sp<IBinder>& displayToken,
427                                           float brightness) const = 0;
428 
429     /*
430      * Sends a power hint to the composer. This function is asynchronous.
431      *
432      * hintId
433      *      hint id according to android::hardware::power::V1_0::PowerHint
434      *
435      * Returns NO_ERROR upon success.
436      */
437     virtual status_t notifyPowerHint(int32_t hintId) = 0;
438 };
439 
440 // ----------------------------------------------------------------------------
441 
442 class BnSurfaceComposer: public BnInterface<ISurfaceComposer> {
443 public:
444     enum ISurfaceComposerTag {
445         // Note: BOOT_FINISHED must remain this value, it is called from
446         // Java by ActivityManagerService.
447         BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION,
448         CREATE_CONNECTION,
449         CREATE_GRAPHIC_BUFFER_ALLOC_UNUSED, // unused, fails permissions check
450         CREATE_DISPLAY_EVENT_CONNECTION,
451         CREATE_DISPLAY,
452         DESTROY_DISPLAY,
453         GET_PHYSICAL_DISPLAY_TOKEN,
454         SET_TRANSACTION_STATE,
455         AUTHENTICATE_SURFACE,
456         GET_SUPPORTED_FRAME_TIMESTAMPS,
457         GET_DISPLAY_CONFIGS,
458         GET_ACTIVE_CONFIG,
459         SET_ACTIVE_CONFIG,
460         CONNECT_DISPLAY_UNUSED, // unused, fails permissions check
461         CAPTURE_SCREEN,
462         CAPTURE_LAYERS,
463         CLEAR_ANIMATION_FRAME_STATS,
464         GET_ANIMATION_FRAME_STATS,
465         SET_POWER_MODE,
466         GET_DISPLAY_STATS,
467         GET_HDR_CAPABILITIES,
468         GET_DISPLAY_COLOR_MODES,
469         GET_ACTIVE_COLOR_MODE,
470         SET_ACTIVE_COLOR_MODE,
471         ENABLE_VSYNC_INJECTIONS,
472         INJECT_VSYNC,
473         GET_LAYER_DEBUG_INFO,
474         GET_COMPOSITION_PREFERENCE,
475         GET_COLOR_MANAGEMENT,
476         GET_DISPLAYED_CONTENT_SAMPLING_ATTRIBUTES,
477         SET_DISPLAY_CONTENT_SAMPLING_ENABLED,
478         GET_DISPLAYED_CONTENT_SAMPLE,
479         GET_PROTECTED_CONTENT_SUPPORT,
480         IS_WIDE_COLOR_DISPLAY,
481         GET_DISPLAY_NATIVE_PRIMARIES,
482         GET_PHYSICAL_DISPLAY_IDS,
483         ADD_REGION_SAMPLING_LISTENER,
484         REMOVE_REGION_SAMPLING_LISTENER,
485         SET_ALLOWED_DISPLAY_CONFIGS,
486         GET_ALLOWED_DISPLAY_CONFIGS,
487         GET_DISPLAY_BRIGHTNESS_SUPPORT,
488         SET_DISPLAY_BRIGHTNESS,
489         CAPTURE_SCREEN_BY_ID,
490         NOTIFY_POWER_HINT,
491         // Always append new enum to the end.
492     };
493 
494     virtual status_t onTransact(uint32_t code, const Parcel& data,
495             Parcel* reply, uint32_t flags = 0);
496 };
497 
498 // ----------------------------------------------------------------------------
499 
500 }; // namespace android
501 
502 #endif // ANDROID_GUI_ISURFACE_COMPOSER_H
503