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