| Jesse Hall | 99c7dbb | 2013-03-14 14:29:29 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright 2013 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_SF_VIRTUAL_DISPLAY_SURFACE_H | 
|  | 18 | #define ANDROID_SF_VIRTUAL_DISPLAY_SURFACE_H | 
|  | 19 |  | 
| Dominik Laskowski | 075d317 | 2018-05-24 15:50:06 -0700 | [diff] [blame] | 20 | #include <optional> | 
| Dominik Laskowski | bf170d9 | 2018-04-19 15:08:05 -0700 | [diff] [blame] | 21 | #include <string> | 
|  | 22 |  | 
| Lloyd Pique | 542307f | 2018-10-19 13:24:08 -0700 | [diff] [blame] | 23 | #include <compositionengine/DisplaySurface.h> | 
| Lloyd Pique | 76ed703 | 2018-12-04 17:24:28 -0800 | [diff] [blame] | 24 | #include <compositionengine/impl/HwcBufferCache.h> | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 25 | #include <gui/ConsumerBase.h> | 
|  | 26 | #include <gui/IGraphicBufferProducer.h> | 
| Marin Shalamanov | 0f10d0d | 2020-08-06 20:04:06 +0200 | [diff] [blame] | 27 | #include <ui/DisplayId.h> | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 28 |  | 
| Lloyd Pique | 542307f | 2018-10-19 13:24:08 -0700 | [diff] [blame] | 29 | #include "DisplayIdentification.h" | 
| Lloyd Pique | 542307f | 2018-10-19 13:24:08 -0700 | [diff] [blame] | 30 |  | 
| Jesse Hall | 99c7dbb | 2013-03-14 14:29:29 -0700 | [diff] [blame] | 31 | // --------------------------------------------------------------------------- | 
|  | 32 | namespace android { | 
|  | 33 | // --------------------------------------------------------------------------- | 
|  | 34 |  | 
|  | 35 | class HWComposer; | 
| Dan Stoza | f0eaf25 | 2014-03-21 13:05:51 -0700 | [diff] [blame] | 36 | class IProducerListener; | 
| Jesse Hall | 99c7dbb | 2013-03-14 14:29:29 -0700 | [diff] [blame] | 37 |  | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 38 | /* This DisplaySurface implementation supports virtual displays, where GPU | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 39 | * and/or HWC compose into a buffer that is then passed to an arbitrary | 
|  | 40 | * consumer (the sink) running in another process. | 
|  | 41 | * | 
|  | 42 | * The simplest case is when the virtual display will never use the h/w | 
|  | 43 | * composer -- either the h/w composer doesn't support writing to buffers, or | 
|  | 44 | * there are more virtual displays than it supports simultaneously. In this | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 45 | * case, the GPU driver works directly with the output buffer queue, and | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 46 | * calls to the VirtualDisplay from SurfaceFlinger and DisplayHardware do | 
|  | 47 | * nothing. | 
|  | 48 | * | 
|  | 49 | * If h/w composer might be used, then each frame will fall into one of three | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 50 | * configurations: GPU-only, HWC-only, and MIXED composition. In all of these, | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 51 | * we must provide a FB target buffer and output buffer for the HWC set() call. | 
|  | 52 | * | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 53 | * In GPU-only composition, the GPU driver is given a buffer from the sink to | 
|  | 54 | * render into. When the GPU driver queues the buffer to the | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 55 | * VirtualDisplaySurface, the VirtualDisplaySurface holds onto it instead of | 
|  | 56 | * immediately queueing it to the sink. The buffer is used as both the FB | 
|  | 57 | * target and output buffer for HWC, though on these frames the HWC doesn't | 
|  | 58 | * do any work for this display and doesn't write to the output buffer. After | 
|  | 59 | * composition is complete, the buffer is queued to the sink. | 
|  | 60 | * | 
|  | 61 | * In HWC-only composition, the VirtualDisplaySurface dequeues a buffer from | 
|  | 62 | * the sink and passes it to HWC as both the FB target buffer and output | 
|  | 63 | * buffer. The HWC doesn't need to read from the FB target buffer, but does | 
|  | 64 | * write to the output buffer. After composition is complete, the buffer is | 
|  | 65 | * queued to the sink. | 
|  | 66 | * | 
|  | 67 | * On MIXED frames, things become more complicated, since some h/w composer | 
|  | 68 | * implementations can't read from and write to the same buffer. This class has | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 69 | * an internal BufferQueue that it uses as a scratch buffer pool. The GPU | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 70 | * driver is given a scratch buffer to render into. When it finishes rendering, | 
|  | 71 | * the buffer is queued and then immediately acquired by the | 
|  | 72 | * VirtualDisplaySurface. The scratch buffer is then used as the FB target | 
|  | 73 | * buffer for HWC, and a separate buffer is dequeued from the sink and used as | 
|  | 74 | * the HWC output buffer. When HWC composition is complete, the scratch buffer | 
|  | 75 | * is released and the output buffer is queued to the sink. | 
| Jesse Hall | 80e0a39 | 2013-03-15 12:32:10 -0700 | [diff] [blame] | 76 | */ | 
| Lloyd Pique | 542307f | 2018-10-19 13:24:08 -0700 | [diff] [blame] | 77 | class VirtualDisplaySurface : public compositionengine::DisplaySurface, | 
| Mathias Agopian | db89edc | 2013-08-02 01:40:18 -0700 | [diff] [blame] | 78 | public BnGraphicBufferProducer, | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 79 | private ConsumerBase { | 
| Jesse Hall | 99c7dbb | 2013-03-14 14:29:29 -0700 | [diff] [blame] | 80 | public: | 
| Marin Shalamanov | 0f10d0d | 2020-08-06 20:04:06 +0200 | [diff] [blame] | 81 | VirtualDisplaySurface(HWComposer&, VirtualDisplayId, const sp<IGraphicBufferProducer>& sink, | 
| Dominik Laskowski | 075d317 | 2018-05-24 15:50:06 -0700 | [diff] [blame] | 82 | const sp<IGraphicBufferProducer>& bqProducer, | 
|  | 83 | const sp<IGraphicBufferConsumer>& bqConsumer, const std::string& name); | 
| Jesse Hall | 99c7dbb | 2013-03-14 14:29:29 -0700 | [diff] [blame] | 84 |  | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 85 | // | 
|  | 86 | // DisplaySurface interface | 
|  | 87 | // | 
| Dan Stoza | 7143316 | 2014-02-04 16:22:36 -0800 | [diff] [blame] | 88 | virtual status_t beginFrame(bool mustRecompose); | 
| Marin Shalamanov | 0f10d0d | 2020-08-06 20:04:06 +0200 | [diff] [blame] | 89 | virtual status_t prepareFrame(CompositionType); | 
| Jesse Hall | 99c7dbb | 2013-03-14 14:29:29 -0700 | [diff] [blame] | 90 | virtual status_t advanceFrame(); | 
| Jesse Hall | 851cfe8 | 2013-03-20 13:44:00 -0700 | [diff] [blame] | 91 | virtual void onFrameCommitted(); | 
| Dan Stoza | 01049c8 | 2014-11-11 10:32:31 -0800 | [diff] [blame] | 92 | virtual void dumpAsString(String8& result) const; | 
| Michael Lentine | 47e4540 | 2014-07-18 15:34:25 -0700 | [diff] [blame] | 93 | virtual void resizeBuffers(const uint32_t w, const uint32_t h); | 
| Dan Stoza | 9e56aa0 | 2015-11-02 13:00:03 -0800 | [diff] [blame] | 94 | virtual const sp<Fence>& getClientTargetAcquireFence() const override; | 
| Jesse Hall | 99c7dbb | 2013-03-14 14:29:29 -0700 | [diff] [blame] | 95 |  | 
|  | 96 | private: | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 97 | enum Source {SOURCE_SINK = 0, SOURCE_SCRATCH = 1}; | 
|  | 98 |  | 
| Jesse Hall | 99c7dbb | 2013-03-14 14:29:29 -0700 | [diff] [blame] | 99 | virtual ~VirtualDisplaySurface(); | 
|  | 100 |  | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 101 | // | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 102 | // IGraphicBufferProducer interface, used by the GPU driver. | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 103 | // | 
|  | 104 | virtual status_t requestBuffer(int pslot, sp<GraphicBuffer>* outBuf); | 
| Pablo Ceballos | fa45535 | 2015-08-12 17:47:47 -0700 | [diff] [blame] | 105 | virtual status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers); | 
|  | 106 | virtual status_t setAsyncMode(bool async); | 
| Marin Shalamanov | 0f10d0d | 2020-08-06 20:04:06 +0200 | [diff] [blame] | 107 | virtual status_t dequeueBuffer(int* pslot, sp<Fence>*, uint32_t w, uint32_t h, PixelFormat, | 
|  | 108 | uint64_t usage, uint64_t* outBufferAge, | 
| Ian Elliott | a2eb34c | 2017-07-18 11:05:49 -0600 | [diff] [blame] | 109 | FrameEventHistoryDelta* outTimestamps); | 
| Dan Stoza | 9f3053d | 2014-03-06 15:14:33 -0800 | [diff] [blame] | 110 | virtual status_t detachBuffer(int slot); | 
| Marin Shalamanov | 0f10d0d | 2020-08-06 20:04:06 +0200 | [diff] [blame] | 111 | virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence); | 
|  | 112 | virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>&); | 
|  | 113 | virtual status_t queueBuffer(int pslot, const QueueBufferInput&, QueueBufferOutput*); | 
|  | 114 | virtual status_t cancelBuffer(int pslot, const sp<Fence>&); | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 115 | virtual int query(int what, int* value); | 
| Marin Shalamanov | 0f10d0d | 2020-08-06 20:04:06 +0200 | [diff] [blame] | 116 | virtual status_t connect(const sp<IProducerListener>&, int api, bool producerControlledByApp, | 
|  | 117 | QueueBufferOutput*); | 
|  | 118 | virtual status_t disconnect(int api, DisconnectMode); | 
| Jesse Hall | 399184a | 2014-03-03 15:42:54 -0800 | [diff] [blame] | 119 | virtual status_t setSidebandStream(const sp<NativeHandle>& stream); | 
| Marin Shalamanov | 0f10d0d | 2020-08-06 20:04:06 +0200 | [diff] [blame] | 120 | virtual void allocateBuffers(uint32_t width, uint32_t height, PixelFormat, uint64_t usage); | 
| Dan Stoza | 9de7293 | 2015-04-16 17:28:43 -0700 | [diff] [blame] | 121 | virtual status_t allowAllocation(bool allow); | 
| Marin Shalamanov | 0f10d0d | 2020-08-06 20:04:06 +0200 | [diff] [blame] | 122 | virtual status_t setGenerationNumber(uint32_t); | 
| Dan Stoza | c6f30bd | 2015-06-08 09:32:50 -0700 | [diff] [blame] | 123 | virtual String8 getConsumerName() const override; | 
| Pablo Ceballos | 3559fbf | 2016-03-17 15:50:23 -0700 | [diff] [blame] | 124 | virtual status_t setSharedBufferMode(bool sharedBufferMode) override; | 
| Pablo Ceballos | ff95aab | 2016-01-13 17:09:58 -0800 | [diff] [blame] | 125 | virtual status_t setAutoRefresh(bool autoRefresh) override; | 
| Dan Stoza | 127fc63 | 2015-06-30 13:43:32 -0700 | [diff] [blame] | 126 | virtual status_t setDequeueTimeout(nsecs_t timeout) override; | 
| Dan Stoza | 50101d0 | 2016-04-07 16:53:23 -0700 | [diff] [blame] | 127 | virtual status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, | 
| John Reck | 1a61da5 | 2016-04-28 13:18:15 -0700 | [diff] [blame] | 128 | sp<Fence>* outFence, float outTransformMatrix[16]) override; | 
| Pablo Ceballos | 8e3e92b | 2016-06-27 17:56:53 -0700 | [diff] [blame] | 129 | virtual status_t getUniqueId(uint64_t* outId) const override; | 
| Chia-I Wu | e2786ea | 2017-08-07 10:36:08 -0700 | [diff] [blame] | 130 | virtual status_t getConsumerUsage(uint64_t* outUsage) const override; | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 131 |  | 
|  | 132 | // | 
|  | 133 | // Utility methods | 
|  | 134 | // | 
| Marin Shalamanov | 0f10d0d | 2020-08-06 20:04:06 +0200 | [diff] [blame] | 135 | static Source fbSourceForCompositionType(CompositionType); | 
|  | 136 | status_t dequeueBuffer(Source, PixelFormat, uint64_t usage, int* sslot, sp<Fence>*); | 
|  | 137 | void updateQueueBufferOutput(QueueBufferOutput&&); | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 138 | void resetPerFrameState(); | 
| Jesse Hall | 028dc8f | 2013-08-20 16:35:32 -0700 | [diff] [blame] | 139 | status_t refreshOutputBuffer(); | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 140 |  | 
|  | 141 | // Both the sink and scratch buffer pools have their own set of slots | 
|  | 142 | // ("source slots", or "sslot"). We have to merge these into the single | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 143 | // set of slots used by the graphics producer ("producer slots" or "pslot") and | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 144 | // internally in the VirtualDisplaySurface. To minimize the number of times | 
|  | 145 | // a producer slot switches which source it comes from, we map source slot | 
|  | 146 | // numbers to producer slot numbers differently for each source. | 
| Marin Shalamanov | 0f10d0d | 2020-08-06 20:04:06 +0200 | [diff] [blame] | 147 | static int mapSource2ProducerSlot(Source, int sslot); | 
|  | 148 | static int mapProducer2SourceSlot(Source, int pslot); | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 149 |  | 
|  | 150 | // | 
|  | 151 | // Immutable after construction | 
|  | 152 | // | 
|  | 153 | HWComposer& mHwc; | 
| Marin Shalamanov | 0f10d0d | 2020-08-06 20:04:06 +0200 | [diff] [blame] | 154 | const VirtualDisplayId mDisplayId; | 
| Dominik Laskowski | bf170d9 | 2018-04-19 15:08:05 -0700 | [diff] [blame] | 155 | const std::string mDisplayName; | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 156 | sp<IGraphicBufferProducer> mSource[2]; // indexed by SOURCE_* | 
| Jesse Hall | 497ba0e | 2013-11-04 16:43:03 -0800 | [diff] [blame] | 157 | uint32_t mDefaultOutputFormat; | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 158 |  | 
|  | 159 | // | 
|  | 160 | // Inter-frame state | 
|  | 161 | // | 
|  | 162 |  | 
| Jesse Hall | 1e27ba2 | 2013-09-27 09:05:09 -0700 | [diff] [blame] | 163 | // To avoid buffer reallocations, we track the buffer usage and format | 
|  | 164 | // we used on the previous frame and use it again on the new frame. If | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 165 | // the composition type changes or the GPU driver starts requesting | 
| Jesse Hall | 1e27ba2 | 2013-09-27 09:05:09 -0700 | [diff] [blame] | 166 | // different usage/format, we'll get a new buffer. | 
|  | 167 | uint32_t mOutputFormat; | 
| Mathias Agopian | cb496ac | 2017-05-22 14:21:00 -0700 | [diff] [blame] | 168 | uint64_t mOutputUsage; | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 169 |  | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 170 | // Since we present a single producer interface to the GPU driver, but | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 171 | // are internally muxing between the sink and scratch producers, we have | 
|  | 172 | // to keep track of which source last returned each producer slot from | 
| Dan Stoza | febd4f4 | 2014-04-09 16:14:51 -0700 | [diff] [blame] | 173 | // dequeueBuffer. Each bit in mProducerSlotSource corresponds to a producer | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 174 | // slot. Both mProducerSlotSource and mProducerBuffers are indexed by a | 
|  | 175 | // "producer slot"; see the mapSlot*() functions. | 
| Dan Stoza | febd4f4 | 2014-04-09 16:14:51 -0700 | [diff] [blame] | 176 | uint64_t mProducerSlotSource; | 
| Mathias Agopian | a934764 | 2017-02-13 16:42:28 -0800 | [diff] [blame] | 177 | sp<GraphicBuffer> mProducerBuffers[BufferQueueDefs::NUM_BUFFER_SLOTS]; | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 178 |  | 
|  | 179 | // The QueueBufferOutput with the latest info from the sink, and with the | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 180 | // transform hint cleared. Since we defer queueBuffer from the GPU driver | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 181 | // to the sink, we have to return the previous version. | 
| Brian Anderson | 3d4039d | 2016-09-23 16:31:30 -0700 | [diff] [blame] | 182 | // Moves instead of copies are performed to avoid duplicate | 
|  | 183 | // FrameEventHistoryDeltas. | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 184 | QueueBufferOutput mQueueBufferOutput; | 
|  | 185 |  | 
| Michael Lentine | 47e4540 | 2014-07-18 15:34:25 -0700 | [diff] [blame] | 186 | // Details of the current sink buffer. These become valid when a buffer is | 
|  | 187 | // dequeued from the sink, and are used when queueing the buffer. | 
|  | 188 | uint32_t mSinkBufferWidth, mSinkBufferHeight; | 
|  | 189 |  | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 190 | // | 
|  | 191 | // Intra-frame state | 
|  | 192 | // | 
|  | 193 |  | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 194 | // Composition type and graphics buffer source for the current frame. | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 195 | // Valid after prepareFrame(), cleared in onFrameCommitted. | 
|  | 196 | CompositionType mCompositionType; | 
|  | 197 |  | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 198 | // mFbFence is the fence HWC should wait for before reading the framebuffer | 
|  | 199 | // target buffer. | 
|  | 200 | sp<Fence> mFbFence; | 
|  | 201 |  | 
| Jesse Hall | 028dc8f | 2013-08-20 16:35:32 -0700 | [diff] [blame] | 202 | // mOutputFence is the fence HWC should wait for before writing to the | 
|  | 203 | // output buffer. | 
|  | 204 | sp<Fence> mOutputFence; | 
|  | 205 |  | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 206 | // Producer slot numbers for the buffers to use for HWC framebuffer target | 
|  | 207 | // and output. | 
|  | 208 | int mFbProducerSlot; | 
|  | 209 | int mOutputProducerSlot; | 
|  | 210 |  | 
|  | 211 | // Debug only -- track the sequence of events in each frame so we can make | 
|  | 212 | // sure they happen in the order we expect. This class implicitly models | 
|  | 213 | // a state machine; this enum/variable makes it explicit. | 
|  | 214 | // | 
|  | 215 | // +-----------+-------------------+-------------+ | 
|  | 216 | // | State     | Event             || Next State | | 
|  | 217 | // +-----------+-------------------+-------------+ | 
| Jesse Hall | 028dc8f | 2013-08-20 16:35:32 -0700 | [diff] [blame] | 218 | // | IDLE      | beginFrame        || BEGUN      | | 
|  | 219 | // | BEGUN     | prepareFrame      || PREPARED   | | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 220 | // | PREPARED  | dequeueBuffer [1] || GPU        | | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 221 | // | PREPARED  | advanceFrame [2]  || HWC        | | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 222 | // | GPU       | queueBuffer       || GPU_DONE   | | 
|  | 223 | // | GPU_DONE  | advanceFrame      || HWC        | | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 224 | // | HWC       | onFrameCommitted  || IDLE       | | 
|  | 225 | // +-----------+-------------------++------------+ | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 226 | // [1] COMPOSITION_GPU and COMPOSITION_MIXED frames. | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 227 | // [2] COMPOSITION_HWC frames. | 
|  | 228 | // | 
|  | 229 | enum DbgState { | 
|  | 230 | // no buffer dequeued, don't know anything about the next frame | 
|  | 231 | DBG_STATE_IDLE, | 
| Jesse Hall | 028dc8f | 2013-08-20 16:35:32 -0700 | [diff] [blame] | 232 | // output buffer dequeued, framebuffer source not yet known | 
|  | 233 | DBG_STATE_BEGUN, | 
|  | 234 | // output buffer dequeued, framebuffer source known but not provided | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 235 | // to GPU yet. | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 236 | DBG_STATE_PREPARED, | 
| Peiyong Lin | f3ffc4e | 2019-12-13 00:46:24 -0800 | [diff] [blame] | 237 | // GPU driver has a buffer dequeued | 
|  | 238 | DBG_STATE_GPU, | 
|  | 239 | // GPU driver has queued the buffer, we haven't sent it to HWC yet | 
|  | 240 | DBG_STATE_GPU_DONE, | 
| Jesse Hall | 38efe86 | 2013-04-06 23:12:29 -0700 | [diff] [blame] | 241 | // HWC has the buffer for this frame | 
|  | 242 | DBG_STATE_HWC, | 
|  | 243 | }; | 
|  | 244 | DbgState mDbgState; | 
|  | 245 | CompositionType mDbgLastCompositionType; | 
|  | 246 |  | 
|  | 247 | const char* dbgStateStr() const; | 
|  | 248 | static const char* dbgSourceStr(Source s); | 
| Dan Stoza | 7143316 | 2014-02-04 16:22:36 -0800 | [diff] [blame] | 249 |  | 
|  | 250 | bool mMustRecompose; | 
| Chia-I Wu | 06d63de | 2017-01-04 14:58:51 +0800 | [diff] [blame] | 251 |  | 
| Lloyd Pique | 76ed703 | 2018-12-04 17:24:28 -0800 | [diff] [blame] | 252 | compositionengine::impl::HwcBufferCache mHwcBufferCache; | 
| Fabien Sanglard | a34ed63 | 2017-03-14 11:43:52 -0700 | [diff] [blame] | 253 |  | 
|  | 254 | bool mForceHwcCopy; | 
| Jesse Hall | 99c7dbb | 2013-03-14 14:29:29 -0700 | [diff] [blame] | 255 | }; | 
|  | 256 |  | 
|  | 257 | // --------------------------------------------------------------------------- | 
|  | 258 | } // namespace android | 
|  | 259 | // --------------------------------------------------------------------------- | 
|  | 260 |  | 
|  | 261 | #endif // ANDROID_SF_VIRTUAL_DISPLAY_SURFACE_H |