Home | History | Annotate | Download | only in gui
      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.
    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.
    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 {
    255         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) const = 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