19e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza/* 29e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * Copyright (C) 2010 The Android Open Source Project 39e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * 49e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 59e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * you may not use this file except in compliance with the License. 69e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * You may obtain a copy of the License at 79e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * 89e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * http://www.apache.org/licenses/LICENSE-2.0 99e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * 109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * Unless required by applicable law or agreed to in writing, software 119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * See the License for the specific language governing permissions and 149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * limitations under the License. 159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza */ 169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifndef ANDROID_SF_HWCOMPOSER_HWC1_H 189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#define ANDROID_SF_HWCOMPOSER_HWC1_H 199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include <stdint.h> 219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include <sys/types.h> 229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include <hardware/hwcomposer_defs.h> 249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include <ui/Fence.h> 269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include <utils/BitSet.h> 289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include <utils/Condition.h> 299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include <utils/Mutex.h> 309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include <utils/StrongPointer.h> 319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include <utils/Thread.h> 329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include <utils/Timers.h> 339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#include <utils/Vector.h> 349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaextern "C" int clock_nanosleep(clockid_t clock_id, int flags, 369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const struct timespec *request, 379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza struct timespec *remain); 389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastruct hwc_composer_device_1; 409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastruct hwc_display_contents_1; 419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastruct hwc_layer_1; 429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastruct hwc_procs; 439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozastruct framebuffer_device_t; 449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozanamespace android { 469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza// --------------------------------------------------------------------------- 479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaclass Fence; 499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaclass FloatRect; 509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaclass GraphicBuffer; 519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaclass NativeHandle; 529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaclass Region; 539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaclass String8; 549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaclass SurfaceFlinger; 559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaclass HWComposer 579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza{ 589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozapublic: 599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza class EventHandler { 609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza friend class HWComposer; 619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void onVSyncReceived(int disp, nsecs_t timestamp) = 0; 629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void onHotplugReceived(int disp, bool connected) = 0; 639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza protected: 649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual ~EventHandler() {} 659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza }; 669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza enum { 689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza NUM_BUILTIN_DISPLAYS = HWC_NUM_PHYSICAL_DISPLAY_TYPES, 699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza MAX_HWC_DISPLAYS = HWC_NUM_DISPLAY_TYPES, 709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza VIRTUAL_DISPLAY_ID_BASE = HWC_DISPLAY_VIRTUAL, 719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza }; 729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza HWComposer( 749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const sp<SurfaceFlinger>& flinger, 759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza EventHandler& handler); 769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ~HWComposer(); 789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t initCheck() const; 809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Returns a display ID starting at VIRTUAL_DISPLAY_ID_BASE, this ID is to 829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // be used with createWorkList (and all other methods requiring an ID 839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // below). 849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // IDs below NUM_BUILTIN_DISPLAYS are pre-defined and therefore are 859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // always valid. 869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Returns -1 if an ID cannot be allocated 879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza int32_t allocateDisplayId(); 889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Recycles the given virtual display ID and frees the associated worklist. 909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // IDs below NUM_BUILTIN_DISPLAYS are not recycled. 919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t freeDisplayId(int32_t id); 929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Asks the HAL what it can do 959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t prepare(); 969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // commits the list 989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t commit(); 999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // set power mode 1019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t setPowerMode(int disp, int mode); 1029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // set active config 1049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t setActiveConfig(int disp, int mode); 1059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // reset state when an external, non-virtual display is disconnected 1079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza void disconnectDisplay(int disp); 1089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // create a work list for numLayers layer. sets HWC_GEOMETRY_CHANGED. 1109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t createWorkList(int32_t id, size_t numLayers); 1119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool supportsFramebufferTarget() const; 1139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // does this display have layers handled by HWC 1159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasHwcComposition(int32_t id) const; 1169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // does this display have layers handled by GLES 1189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasGlesComposition(int32_t id) const; 1199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // get the releaseFence file descriptor for a display's framebuffer layer. 1219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // the release fence is only valid after commit() 1229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence> getAndResetReleaseFence(int32_t id); 1239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // needed forward declarations 1259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza class LayerListIterator; 1269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // return the visual id to be used to find a suitable EGLConfig for 1289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // *ALL* displays. 1299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza int getVisualID() const; 1309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Forwarding to FB HAL for pre-HWC-1.1 code (see FramebufferSurface). 1329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza int fbPost(int32_t id, const sp<Fence>& acquireFence, const sp<GraphicBuffer>& buf); 1339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza int fbCompositionComplete(); 1349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza void fbDump(String8& result); 1359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Set the output buffer and acquire fence for a virtual display. 1379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Returns INVALID_OPERATION if id is not a virtual display. 1389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t setOutputBuffer(int32_t id, const sp<Fence>& acquireFence, 1399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const sp<GraphicBuffer>& buf); 1409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Get the retire fence for the last committed frame. This fence will 1429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // signal when the h/w composer is completely finished with the frame. 1439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // For physical displays, it is no longer being displayed. For virtual 1449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // displays, writes to the output buffer are complete. 1459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence> getLastRetireFence(int32_t id) const; 1469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t setCursorPositionAsync(int32_t id, const Rect &pos); 1489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza /* 1509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * Interface to hardware composer's layers functionality. 1519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * This abstracts the HAL interface to layers which can evolve in 1529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * incompatible ways from one release to another. 1539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * The idea is that we could extend this interface as we add 1549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * features to h/w composer. 1559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza */ 1569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza class HWCLayerInterface { 1579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza protected: 1589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual ~HWCLayerInterface() { } 1599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza public: 1609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual int32_t getCompositionType() const = 0; 1619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual uint32_t getHints() const = 0; 1629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual sp<Fence> getAndResetReleaseFence() = 0; 1639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setDefaultState() = 0; 1649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setSkip(bool skip) = 0; 1659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setIsCursorLayerHint(bool isCursor = true) = 0; 1669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setBlending(uint32_t blending) = 0; 1679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setTransform(uint32_t transform) = 0; 1689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setFrame(const Rect& frame) = 0; 1699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setCrop(const FloatRect& crop) = 0; 1709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setVisibleRegionScreen(const Region& reg) = 0; 1719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setSurfaceDamage(const Region& reg) = 0; 1729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setSidebandStream(const sp<NativeHandle>& stream) = 0; 1739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setBuffer(const sp<GraphicBuffer>& buffer) = 0; 1749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setAcquireFenceFd(int fenceFd) = 0; 1759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void setPlaneAlpha(uint8_t alpha) = 0; 1769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void onDisplayed() = 0; 1779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza }; 1789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza /* 1809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * Interface used to implement an iterator to a list 1819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * of HWCLayer. 1829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza */ 1839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza class HWCLayer : public HWCLayerInterface { 1849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza friend class LayerListIterator; 1859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // select the layer at the given index 1869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual status_t setLayer(size_t index) = 0; 1879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual HWCLayer* dup() = 0; 1889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static HWCLayer* copy(HWCLayer *rhs) { 1899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return rhs ? rhs->dup() : NULL; 1909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 1919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza protected: 1929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual ~HWCLayer() { } 1939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza }; 1949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza /* 1969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * Iterator through a HWCLayer list. 1979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza * This behaves more or less like a forward iterator. 1989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza */ 1999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza class LayerListIterator { 2009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza friend class HWComposer; 2019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza HWCLayer* const mLayerList; 2029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza size_t mIndex; 2039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza LayerListIterator() : mLayerList(NULL), mIndex(0) { } 2059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza LayerListIterator(HWCLayer* layer, size_t index) 2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza : mLayerList(layer), mIndex(index) { } 2089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // we don't allow assignment, because we don't need it for now 2109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza LayerListIterator& operator = (const LayerListIterator& rhs); 2119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza public: 2139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // copy operators 2149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza LayerListIterator(const LayerListIterator& rhs) 2159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza : mLayerList(HWCLayer::copy(rhs.mLayerList)), mIndex(rhs.mIndex) { 2169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ~LayerListIterator() { delete mLayerList; } 2199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // pre-increment 2219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza LayerListIterator& operator++() { 2229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mLayerList->setLayer(++mIndex); 2239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return *this; 2249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // dereference 2279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza HWCLayerInterface& operator * () { return *mLayerList; } 2289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza HWCLayerInterface* operator -> () { return mLayerList; } 2299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // comparison 2319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool operator == (const LayerListIterator& rhs) const { 2329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mIndex == rhs.mIndex; 2339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool operator != (const LayerListIterator& rhs) const { 2359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return !operator==(rhs); 2369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 2379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza }; 2389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Returns an iterator to the beginning of the layer list 2409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza LayerListIterator begin(int32_t id); 2419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Returns an iterator to the end of the layer list 2439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza LayerListIterator end(int32_t id); 2449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Events handling --------------------------------------------------------- 2479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza enum { 2499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza EVENT_VSYNC = HWC_EVENT_VSYNC 2509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza }; 2519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza void eventControl(int disp, int event, int enabled); 2539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza struct DisplayConfig { 2559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza uint32_t width; 2569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza uint32_t height; 2579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza float xdpi; 2589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza float ydpi; 2599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t refresh; 2609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza int colorTransform; 2619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza }; 2629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Query display parameters. Pass in a display index (e.g. 2649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // HWC_DISPLAY_PRIMARY). 2659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t getRefreshTimestamp(int disp) const; 2669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence> getDisplayFence(int disp) const; 2679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza uint32_t getFormat(int disp) const; 2689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool isConnected(int disp) const; 2699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // These return the values for the current config of a given display index. 2719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // To get the values for all configs, use getConfigs below. 2729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza uint32_t getWidth(int disp) const; 2739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza uint32_t getHeight(int disp) const; 2749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza float getDpiX(int disp) const; 2759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza float getDpiY(int disp) const; 2769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t getRefreshPeriod(int disp) const; 2779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Vector<DisplayConfig>& getConfigs(int disp) const; 2799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza size_t getCurrentConfig(int disp) const; 2809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t setVirtualDisplayProperties(int32_t id, uint32_t w, uint32_t h, 2829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza uint32_t format); 2839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 2849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // this class is only used to fake the VSync event on systems that don't 2859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // have it. 2869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza class VSyncThread : public Thread { 2879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza HWComposer& mHwc; 2889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mutable Mutex mLock; 2899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Condition mCondition; 2909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool mEnabled; 2919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mutable nsecs_t mNextFakeVSync; 2929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t mRefreshPeriod; 2939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual void onFirstRef(); 2949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza virtual bool threadLoop(); 2959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza public: 2969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza VSyncThread(HWComposer& hwc); 2979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza void setEnabled(bool enabled); 2989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza }; 2999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza friend class VSyncThread; 3019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // for debugging ---------------------------------------------------------- 3039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza void dump(String8& out) const; 3049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozaprivate: 3069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza void loadHwcModule(); 3079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza int loadFbHalModule(); 3089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza LayerListIterator getLayerIterator(int32_t id, size_t index); 3109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza struct cb_context; 3129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static void hook_invalidate(const struct hwc_procs* procs); 3149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static void hook_vsync(const struct hwc_procs* procs, int disp, 3159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza int64_t timestamp); 3169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static void hook_hotplug(const struct hwc_procs* procs, int disp, 3179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza int connected); 3189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza inline void invalidate(); 3209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza inline void vsync(int disp, int64_t timestamp); 3219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza inline void hotplug(int disp, int connected); 3229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t queryDisplayProperties(int disp); 3249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza status_t setFramebufferTarget(int32_t id, 3269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const sp<Fence>& acquireFence, const sp<GraphicBuffer>& buf); 3279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza struct DisplayData { 3299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza DisplayData(); 3309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ~DisplayData(); 3319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Vector<DisplayConfig> configs; 3329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza size_t currentConfig; 3339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza uint32_t format; // pixel format from FB hal, for pre-hwc-1.1 3349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool connected; 3359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasFbComp; 3369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool hasOvComp; 3379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza size_t capacity; 3389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwc_display_contents_1* list; 3399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwc_layer_1* framebufferTarget; 3409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza buffer_handle_t fbTargetHandle; 3419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence> lastRetireFence; // signals when the last set op retires 3429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence> lastDisplayFence; // signals when the last set op takes 3439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // effect on screen 3449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza buffer_handle_t outbufHandle; 3459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence> outbufAcquireFence; 3469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // protected by mEventControlLock 3489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza int32_t events; 349f5abc7801eb008708d31c8f349d4301881c51c89Gary Smith 350f5abc7801eb008708d31c8f349d4301881c51c89Gary Smith // We need to hold "copies" of these for memory management purposes. The 351f5abc7801eb008708d31c8f349d4301881c51c89Gary Smith // actual hwc_layer_1_t holds pointers to the memory within. Vector<> 352f5abc7801eb008708d31c8f349d4301881c51c89Gary Smith // internally doesn't copy the memory unless one of the copies is 353f5abc7801eb008708d31c8f349d4301881c51c89Gary Smith // modified. 354f5abc7801eb008708d31c8f349d4301881c51c89Gary Smith Vector<Region> visibleRegions; 355f5abc7801eb008708d31c8f349d4301881c51c89Gary Smith Vector<Region> surfaceDamageRegions; 3569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza }; 3579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<SurfaceFlinger> mFlinger; 3599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza framebuffer_device_t* mFbDev; 3609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza struct hwc_composer_device_1* mHwc; 3619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // invariant: mLists[0] != NULL iff mHwc != NULL 3629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // mLists[i>0] can be NULL. that display is to be ignored 3639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza struct hwc_display_contents_1* mLists[MAX_HWC_DISPLAYS]; 3649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza DisplayData mDisplayData[MAX_HWC_DISPLAYS]; 3659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // protect mDisplayData from races between prepare and dump 3669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mutable Mutex mDisplayLock; 3679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza size_t mNumDisplays; 3689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza cb_context* mCBContext; 3709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza EventHandler& mEventHandler; 3719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza size_t mVSyncCounts[HWC_NUM_PHYSICAL_DISPLAY_TYPES]; 3729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<VSyncThread> mVSyncThread; 3739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool mDebugForceFakeVSync; 3749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza BitSet32 mAllocatedDisplayIDs; 3759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // protected by mLock 3779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mutable Mutex mLock; 3789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mutable nsecs_t mLastHwVSync[HWC_NUM_PHYSICAL_DISPLAY_TYPES]; 3799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // thread-safe 3819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mutable Mutex mEventControlLock; 3829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}; 3839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza// --------------------------------------------------------------------------- 3859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza}; // namespace android 3869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 3879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif // ANDROID_SF_HWCOMPOSER_H 388