123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- /*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #ifndef ANDROID_DISPLAY_DEVICE_H
- #define ANDROID_DISPLAY_DEVICE_H
- #include <stdlib.h>
- #include <ui/PixelFormat.h>
- #include <ui/Region.h>
- #include <EGL/egl.h>
- #include <EGL/eglext.h>
- #include <utils/Mutex.h>
- #include <utils/String8.h>
- #include <utils/Timers.h>
- #include <hardware/hwcomposer_defs.h>
- #include "Transform.h"
- struct ANativeWindow;
- namespace android {
- struct DisplayInfo;
- class DisplaySurface;
- class IGraphicBufferProducer;
- class Layer;
- class SurfaceFlinger;
- class HWComposer;
- class DisplayDevice : public LightRefBase<DisplayDevice>
- {
- public:
- // region in layer-stack space
- mutable Region dirtyRegion;
- // region in screen space
- mutable Region swapRegion;
- // region in screen space
- Region undefinedRegion;
- bool lastCompositionHadVisibleLayers;
- enum DisplayType {
- DISPLAY_ID_INVALID = -1,
- DISPLAY_PRIMARY = HWC_DISPLAY_PRIMARY,
- DISPLAY_EXTERNAL = HWC_DISPLAY_EXTERNAL,
- DISPLAY_VIRTUAL = HWC_DISPLAY_VIRTUAL,
- NUM_BUILTIN_DISPLAY_TYPES = HWC_NUM_PHYSICAL_DISPLAY_TYPES,
- };
- enum {
- PARTIAL_UPDATES = 0x00020000, // video driver feature
- SWAP_RECTANGLE = 0x00080000,
- };
- enum {
- NO_LAYER_STACK = 0xFFFFFFFF,
- };
- DisplayDevice(
- const sp<SurfaceFlinger>& flinger,
- DisplayType type,
- int32_t hwcId, // negative for non-HWC-composited displays
- int format,
- bool isSecure,
- const wp<IBinder>& displayToken,
- const sp<DisplaySurface>& displaySurface,
- const sp<IGraphicBufferProducer>& producer,
- EGLConfig config);
- ~DisplayDevice();
- // whether this is a valid object. An invalid DisplayDevice is returned
- // when an non existing id is requested
- bool isValid() const;
- // isSecure indicates whether this display can be trusted to display
- // secure surfaces.
- bool isSecure() const { return mIsSecure; }
- // Flip the front and back buffers if the back buffer is "dirty". Might
- // be instantaneous, might involve copying the frame buffer around.
- void flip(const Region& dirty) const;
- int getWidth() const;
- int getHeight() const;
- PixelFormat getFormat() const;
- uint32_t getFlags() const;
- EGLSurface getEGLSurface() const;
- void setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers);
- const Vector< sp<Layer> >& getVisibleLayersSortedByZ() const;
- bool getSecureLayerVisible() const;
- Region getDirtyRegion(bool repaintEverything) const;
- void setLayerStack(uint32_t stack);
- void setDisplaySize(const int newWidth, const int newHeight);
- void setProjection(int orientation, const Rect& viewport, const Rect& frame);
- int getOrientation() const { return mOrientation; }
- uint32_t getOrientationTransform() const;
- const Transform& getTransform() const { return mGlobalTransform; }
- const Rect getViewport() const { return mViewport; }
- const Rect getFrame() const { return mFrame; }
- const Rect& getScissor() const { return mScissor; }
- bool needsFiltering() const { return mNeedsFiltering; }
- uint32_t getLayerStack() const { return mLayerStack; }
- int32_t getDisplayType() const { return mType; }
- int32_t getHwcDisplayId() const { return mHwcDisplayId; }
- const wp<IBinder>& getDisplayToken() const { return mDisplayToken; }
- uint32_t getPanelMountFlip() const {
- return mPanelMountFlip;
- }
- // We pass in mustRecompose so we can keep VirtualDisplaySurface's state
- // machine happy without actually queueing a buffer if nothing has changed
- status_t beginFrame(bool mustRecompose) const;
- status_t prepareFrame(const HWComposer& hwc) const;
- void swapBuffers(HWComposer& hwc) const;
- status_t compositionComplete() const;
- // called after h/w composer has completed its set() call
- void onSwapBuffersCompleted(HWComposer& hwc) const;
- Rect getBounds() const {
- return Rect(mDisplayWidth, mDisplayHeight);
- }
- inline Rect bounds() const { return getBounds(); }
- void setDisplayName(const String8& displayName);
- const String8& getDisplayName() const { return mDisplayName; }
- EGLBoolean makeCurrent(EGLDisplay dpy, EGLContext ctx) const;
- void setViewportAndProjection() const;
- /* ------------------------------------------------------------------------
- * Display power mode management.
- */
- int getPowerMode() const;
- void setPowerMode(int mode);
- bool isDisplayOn() const;
- /* ------------------------------------------------------------------------
- * Display active config management.
- */
- int getActiveConfig() const;
- void setActiveConfig(int mode);
- // release HWC resources (if any) for removable displays
- void disconnect(HWComposer& hwc);
- /* ------------------------------------------------------------------------
- * Debugging
- */
- uint32_t getPageFlipCount() const;
- void dump(String8& result) const;
- private:
- /*
- * Constants, set during initialization
- */
- sp<SurfaceFlinger> mFlinger;
- DisplayType mType;
- int32_t mHwcDisplayId;
- wp<IBinder> mDisplayToken;
- // ANativeWindow this display is rendering into
- sp<ANativeWindow> mNativeWindow;
- sp<DisplaySurface> mDisplaySurface;
- EGLConfig mConfig;
- EGLDisplay mDisplay;
- EGLSurface mSurface;
- int mDisplayWidth;
- int mDisplayHeight;
- PixelFormat mFormat;
- uint32_t mFlags;
- mutable uint32_t mPageFlipCount;
- String8 mDisplayName;
- bool mIsSecure;
- /*
- * Can only accessed from the main thread, these members
- * don't need synchronization.
- */
- // list of visible layers on that display
- Vector< sp<Layer> > mVisibleLayersSortedByZ;
- // Whether we have a visible secure layer on this display
- bool mSecureLayerVisible;
- /*
- * Transaction state
- */
- status_t orientationToTransfrom(int orientation,
- int w, int h, Transform* tr);
- uint32_t mLayerStack;
- int mOrientation;
- // user-provided visible area of the layer stack
- Rect mViewport;
- // user-provided rectangle where mViewport gets mapped to
- Rect mFrame;
- // pre-computed scissor to apply to the display
- Rect mScissor;
- Transform mGlobalTransform;
- bool mNeedsFiltering;
- // Current power mode
- int mPowerMode;
- // Current active config
- int mActiveConfig;
- // Panel's mount flip, H, V or 180 (HV)
- uint32_t mPanelMountFlip;
- };
- }; // namespace android
- #endif // ANDROID_DISPLAY_DEVICE_H
|