199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall/*
299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * Copyright 2013 The Android Open Source Project
399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall *
499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * Licensed under the Apache License, Version 2.0 (the "License");
599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * you may not use this file except in compliance with the License.
699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * You may obtain a copy of the License at
799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall *
899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall *      http://www.apache.org/licenses/LICENSE-2.0
999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall *
1099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * Unless required by applicable law or agreed to in writing, software
1199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * distributed under the License is distributed on an "AS IS" BASIS,
1299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * See the License for the specific language governing permissions and
1499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall * limitations under the License.
1599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall */
1699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
1799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#ifndef ANDROID_SF_VIRTUAL_DISPLAY_SURFACE_H
1899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#define ANDROID_SF_VIRTUAL_DISPLAY_SURFACE_H
1999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
2038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall#include <gui/ConsumerBase.h>
2138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall#include <gui/IGraphicBufferProducer.h>
2238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
2399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplaySurface.h"
2499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
2599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// ---------------------------------------------------------------------------
2699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallnamespace android {
2799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// ---------------------------------------------------------------------------
2899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
2999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallclass HWComposer;
3099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
3138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall/* This DisplaySurface implementation supports virtual displays, where GLES
3238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * and/or HWC compose into a buffer that is then passed to an arbitrary
3338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * consumer (the sink) running in another process.
3438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *
3538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * The simplest case is when the virtual display will never use the h/w
3638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * composer -- either the h/w composer doesn't support writing to buffers, or
3738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * there are more virtual displays than it supports simultaneously. In this
3838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * case, the GLES driver works directly with the output buffer queue, and
3938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * calls to the VirtualDisplay from SurfaceFlinger and DisplayHardware do
4038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * nothing.
4138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *
4238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * If h/w composer might be used, then each frame will fall into one of three
4338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * configurations: GLES-only, HWC-only, and MIXED composition. In all of these,
4438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * we must provide a FB target buffer and output buffer for the HWC set() call.
4538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *
4638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * In GLES-only composition, the GLES driver is given a buffer from the sink to
4738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * render into. When the GLES driver queues the buffer to the
4838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * VirtualDisplaySurface, the VirtualDisplaySurface holds onto it instead of
4938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * immediately queueing it to the sink. The buffer is used as both the FB
5038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * target and output buffer for HWC, though on these frames the HWC doesn't
5138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * do any work for this display and doesn't write to the output buffer. After
5238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * composition is complete, the buffer is queued to the sink.
5338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *
5438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * In HWC-only composition, the VirtualDisplaySurface dequeues a buffer from
5538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * the sink and passes it to HWC as both the FB target buffer and output
5638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * buffer. The HWC doesn't need to read from the FB target buffer, but does
5738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * write to the output buffer. After composition is complete, the buffer is
5838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * queued to the sink.
5938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall *
6038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * On MIXED frames, things become more complicated, since some h/w composer
6138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * implementations can't read from and write to the same buffer. This class has
6238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * an internal BufferQueue that it uses as a scratch buffer pool. The GLES
6338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * driver is given a scratch buffer to render into. When it finishes rendering,
6438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * the buffer is queued and then immediately acquired by the
6538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * VirtualDisplaySurface. The scratch buffer is then used as the FB target
6638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * buffer for HWC, and a separate buffer is dequeued from the sink and used as
6738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * the HWC output buffer. When HWC composition is complete, the scratch buffer
6838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall * is released and the output buffer is queued to the sink.
6980e0a397a4712666661ecc629a64ec26e7f6aac3Jesse Hall */
7038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hallclass VirtualDisplaySurface : public DisplaySurface,
71db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian                              public BnGraphicBufferProducer,
7238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall                              private ConsumerBase {
7399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallpublic:
74ffe1f19ca9707f84cb9fdb06209bf36cd8c2ef0aJesse Hall    VirtualDisplaySurface(HWComposer& hwc, int32_t dispId,
7599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            const sp<IGraphicBufferProducer>& sink,
76db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian            const sp<BufferQueue>& bq,
7799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall            const String8& name);
7899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
7938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
8038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // DisplaySurface interface
8138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
82028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall    virtual status_t beginFrame();
8338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    virtual status_t prepareFrame(CompositionType compositionType);
8499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    virtual status_t compositionComplete();
8599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    virtual status_t advanceFrame();
86851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall    virtual void onFrameCommitted();
8799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    virtual void dump(String8& result) const;
8899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
8999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallprivate:
9038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    enum Source {SOURCE_SINK = 0, SOURCE_SCRATCH = 1};
9138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
9299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    virtual ~VirtualDisplaySurface();
9399c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
9438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
9538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // IGraphicBufferProducer interface, used by the GLES driver.
9638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
9738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    virtual status_t requestBuffer(int pslot, sp<GraphicBuffer>* outBuf);
9838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    virtual status_t setBufferCount(int bufferCount);
997cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian    virtual status_t dequeueBuffer(int* pslot, sp<Fence>* fence, bool async,
10038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall            uint32_t w, uint32_t h, uint32_t format, uint32_t usage);
10138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    virtual status_t queueBuffer(int pslot,
10238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall            const QueueBufferInput& input, QueueBufferOutput* output);
10338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    virtual void cancelBuffer(int pslot, const sp<Fence>& fence);
10438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    virtual int query(int what, int* value);
105365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian    virtual status_t connect(const sp<IBinder>& token,
106365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian            int api, bool producerControlledByApp, QueueBufferOutput* output);
10738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    virtual status_t disconnect(int api);
10838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
10938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
11038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // Utility methods
11138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
11238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    static Source fbSourceForCompositionType(CompositionType type);
1131e27ba234c5bfd4f6535ee221a6c20407a50f868Jesse Hall    status_t dequeueBuffer(Source source, uint32_t format, uint32_t usage,
1148db92553e9e6263cd41eaf1a1ebc9e3f88f92b5fJesse Hall            int* sslot, sp<Fence>* fence);
11538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    void updateQueueBufferOutput(const QueueBufferOutput& qbo);
11638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    void resetPerFrameState();
117028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall    status_t refreshOutputBuffer();
11838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
11938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // Both the sink and scratch buffer pools have their own set of slots
12038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // ("source slots", or "sslot"). We have to merge these into the single
12138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // set of slots used by the GLES producer ("producer slots" or "pslot") and
12238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // internally in the VirtualDisplaySurface. To minimize the number of times
12338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // a producer slot switches which source it comes from, we map source slot
12438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // numbers to producer slot numbers differently for each source.
12538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    static int mapSource2ProducerSlot(Source source, int sslot);
12638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    static int mapProducer2SourceSlot(Source source, int pslot);
12738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
12838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
12938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // Immutable after construction
13038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
13138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    HWComposer& mHwc;
13238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    const int32_t mDisplayId;
13338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    const String8 mDisplayName;
13438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    sp<IGraphicBufferProducer> mSource[2]; // indexed by SOURCE_*
135497ba0e08503806571b52ebe27cc7eee4c0e71a7Jesse Hall    uint32_t mDefaultOutputFormat;
13638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
13738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
13838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // Inter-frame state
13938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
14038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
1411e27ba234c5bfd4f6535ee221a6c20407a50f868Jesse Hall    // To avoid buffer reallocations, we track the buffer usage and format
1421e27ba234c5bfd4f6535ee221a6c20407a50f868Jesse Hall    // we used on the previous frame and use it again on the new frame. If
1431e27ba234c5bfd4f6535ee221a6c20407a50f868Jesse Hall    // the composition type changes or the GLES driver starts requesting
1441e27ba234c5bfd4f6535ee221a6c20407a50f868Jesse Hall    // different usage/format, we'll get a new buffer.
1451e27ba234c5bfd4f6535ee221a6c20407a50f868Jesse Hall    uint32_t mOutputFormat;
1461e27ba234c5bfd4f6535ee221a6c20407a50f868Jesse Hall    uint32_t mOutputUsage;
14738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
14838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // Since we present a single producer interface to the GLES driver, but
14938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // are internally muxing between the sink and scratch producers, we have
15038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // to keep track of which source last returned each producer slot from
15138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // dequeueBuffer. Each bit in mLastSlotSource corresponds to a producer
15238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // slot. Both mProducerSlotSource and mProducerBuffers are indexed by a
15338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // "producer slot"; see the mapSlot*() functions.
15438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    uint32_t mProducerSlotSource;
15538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    sp<GraphicBuffer> mProducerBuffers[BufferQueue::NUM_BUFFER_SLOTS];
15638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
15738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // The QueueBufferOutput with the latest info from the sink, and with the
15838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // transform hint cleared. Since we defer queueBuffer from the GLES driver
15938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // to the sink, we have to return the previous version.
16038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    QueueBufferOutput mQueueBufferOutput;
16138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
16238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
16338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // Intra-frame state
16438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
16538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
16638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // Composition type and GLES buffer source for the current frame.
16738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // Valid after prepareFrame(), cleared in onFrameCommitted.
16838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    CompositionType mCompositionType;
16938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
17038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // Details of the current sink buffer. These become valid when a buffer is
17138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // dequeued from the sink, and are used when queueing the buffer.
17238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    uint32_t mSinkBufferWidth, mSinkBufferHeight;
17338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
17438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // mFbFence is the fence HWC should wait for before reading the framebuffer
17538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // target buffer.
17638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    sp<Fence> mFbFence;
17738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
178028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall    // mOutputFence is the fence HWC should wait for before writing to the
179028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall    // output buffer.
180028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall    sp<Fence> mOutputFence;
181028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall
18238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // Producer slot numbers for the buffers to use for HWC framebuffer target
18338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // and output.
18438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    int mFbProducerSlot;
18538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    int mOutputProducerSlot;
18638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
18738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // Debug only -- track the sequence of events in each frame so we can make
18838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // sure they happen in the order we expect. This class implicitly models
18938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // a state machine; this enum/variable makes it explicit.
19038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
19138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // +-----------+-------------------+-------------+
19238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // | State     | Event             || Next State |
19338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // +-----------+-------------------+-------------+
194028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall    // | IDLE      | beginFrame        || BEGUN      |
195028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall    // | BEGUN     | prepareFrame      || PREPARED   |
19638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // | PREPARED  | dequeueBuffer [1] || GLES       |
19738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // | PREPARED  | advanceFrame [2]  || HWC        |
19838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // | GLES      | queueBuffer       || GLES_DONE  |
19938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // | GLES_DONE | advanceFrame      || HWC        |
20038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // | HWC       | onFrameCommitted  || IDLE       |
20138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // +-----------+-------------------++------------+
20238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // [1] COMPOSITION_GLES and COMPOSITION_MIXED frames.
20338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    // [2] COMPOSITION_HWC frames.
20438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    //
20538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    enum DbgState {
20638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // no buffer dequeued, don't know anything about the next frame
20738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        DBG_STATE_IDLE,
208028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall        // output buffer dequeued, framebuffer source not yet known
209028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall        DBG_STATE_BEGUN,
210028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall        // output buffer dequeued, framebuffer source known but not provided
211028dc8f2d72bc7cd4fbe7808781443125a742f78Jesse Hall        // to GLES yet.
21238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        DBG_STATE_PREPARED,
21338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // GLES driver has a buffer dequeued
21438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        DBG_STATE_GLES,
21538efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // GLES driver has queued the buffer, we haven't sent it to HWC yet
21638efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        DBG_STATE_GLES_DONE,
21738efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        // HWC has the buffer for this frame
21838efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall        DBG_STATE_HWC,
21938efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    };
22038efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    DbgState mDbgState;
22138efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    CompositionType mDbgLastCompositionType;
22238efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall
22338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    const char* dbgStateStr() const;
22438efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    static const char* dbgSourceStr(Source s);
22599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall};
22699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
22799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// ---------------------------------------------------------------------------
22899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall} // namespace android
22999c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall// ---------------------------------------------------------------------------
23099c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
23199c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#endif // ANDROID_SF_VIRTUAL_DISPLAY_SURFACE_H
23299c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
233