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