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 #pragma once 18 19 #include <utils/Errors.h> 20 #include <utils/RefBase.h> 21 #include <utils/StrongPointer.h> 22 23 namespace android { 24 25 class Fence; 26 class IGraphicBufferProducer; 27 class String8; 28 29 namespace compositionengine { 30 31 /** 32 * An abstraction for working with a display surface (buffer queue) 33 */ 34 class DisplaySurface : public virtual RefBase { 35 public: 36 virtual ~DisplaySurface(); 37 38 // beginFrame is called at the beginning of the composition loop, before 39 // the configuration is known. The DisplaySurface should do anything it 40 // needs to do to enable HWComposer to decide how to compose the frame. 41 // We pass in mustRecompose so we can keep VirtualDisplaySurface's state 42 // machine happy without actually queueing a buffer if nothing has changed. 43 virtual status_t beginFrame(bool mustRecompose) = 0; 44 45 // prepareFrame is called after the composition configuration is known but 46 // before composition takes place. The DisplaySurface can use the 47 // composition type to decide how to manage the flow of buffers between 48 // GLES and HWC for this frame. 49 enum CompositionType { 50 COMPOSITION_UNKNOWN = 0, 51 COMPOSITION_GLES = 1, 52 COMPOSITION_HWC = 2, 53 COMPOSITION_MIXED = COMPOSITION_GLES | COMPOSITION_HWC 54 }; 55 virtual status_t prepareFrame(CompositionType compositionType) = 0; 56 57 // Inform the surface that GLES composition is complete for this frame, and 58 // the surface should make sure that HWComposer has the correct buffer for 59 // this frame. Some implementations may only push a new buffer to 60 // HWComposer if GLES composition took place, others need to push a new 61 // buffer on every frame. 62 // 63 // advanceFrame must be followed by a call to onFrameCommitted before 64 // advanceFrame may be called again. 65 virtual status_t advanceFrame() = 0; 66 67 // onFrameCommitted is called after the frame has been committed to the 68 // hardware composer. The surface collects the release fence for this 69 // frame's buffer. 70 virtual void onFrameCommitted() = 0; 71 72 virtual void dumpAsString(String8& result) const = 0; 73 74 virtual void resizeBuffers(const uint32_t w, const uint32_t h) = 0; 75 76 virtual const sp<Fence>& getClientTargetAcquireFence() const = 0; 77 }; 78 79 } // namespace compositionengine 80 } // namespace android 81