13e87601170141229d661df93e2f59e1ced73474bMathias Agopian/*
23e87601170141229d661df93e2f59e1ced73474bMathias Agopian * Copyright (C) 2007 The Android Open Source Project
33e87601170141229d661df93e2f59e1ced73474bMathias Agopian *
43e87601170141229d661df93e2f59e1ced73474bMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
53e87601170141229d661df93e2f59e1ced73474bMathias Agopian * you may not use this file except in compliance with the License.
63e87601170141229d661df93e2f59e1ced73474bMathias Agopian * You may obtain a copy of the License at
73e87601170141229d661df93e2f59e1ced73474bMathias Agopian *
83e87601170141229d661df93e2f59e1ced73474bMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
93e87601170141229d661df93e2f59e1ced73474bMathias Agopian *
103e87601170141229d661df93e2f59e1ced73474bMathias Agopian * Unless required by applicable law or agreed to in writing, software
113e87601170141229d661df93e2f59e1ced73474bMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
123e87601170141229d661df93e2f59e1ced73474bMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133e87601170141229d661df93e2f59e1ced73474bMathias Agopian * See the License for the specific language governing permissions and
143e87601170141229d661df93e2f59e1ced73474bMathias Agopian * limitations under the License.
153e87601170141229d661df93e2f59e1ced73474bMathias Agopian */
163e87601170141229d661df93e2f59e1ced73474bMathias Agopian
173e87601170141229d661df93e2f59e1ced73474bMathias Agopian#ifndef ANDROID_SF_FRAMEBUFFER_SURFACE_H
183e87601170141229d661df93e2f59e1ced73474bMathias Agopian#define ANDROID_SF_FRAMEBUFFER_SURFACE_H
193e87601170141229d661df93e2f59e1ced73474bMathias Agopian
203e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <stdint.h>
213e87601170141229d661df93e2f59e1ced73474bMathias Agopian#include <sys/types.h>
223e87601170141229d661df93e2f59e1ced73474bMathias Agopian
231a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/ConsumerBase.h>
243e87601170141229d661df93e2f59e1ced73474bMathias Agopian
2599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall#include "DisplaySurface.h"
2699c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall
273e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------
283e87601170141229d661df93e2f59e1ced73474bMathias Agopiannamespace android {
293e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------
303e87601170141229d661df93e2f59e1ced73474bMathias Agopian
313e87601170141229d661df93e2f59e1ced73474bMathias Agopianclass Rect;
323e87601170141229d661df93e2f59e1ced73474bMathias Agopianclass String8;
33b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFaddenclass HWComposer;
343e87601170141229d661df93e2f59e1ced73474bMathias Agopian
353e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------
363e87601170141229d661df93e2f59e1ced73474bMathias Agopian
3799c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hallclass FramebufferSurface : public ConsumerBase,
3899c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall                           public DisplaySurface {
393e87601170141229d661df93e2f59e1ced73474bMathias Agopianpublic:
40db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    FramebufferSurface(HWComposer& hwc, int disp, const sp<IGraphicBufferConsumer>& consumer);
413e87601170141229d661df93e2f59e1ced73474bMathias Agopian
427143316af216fa92c31a60d4407b707637382da1Dan Stoza    virtual status_t beginFrame(bool mustRecompose);
4338efe86d9459cf5c96a24a34cc5cbf31fdba7e19Jesse Hall    virtual status_t prepareFrame(CompositionType compositionType);
4499c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    virtual status_t compositionComplete();
4599c7dbb24994df2f3e175f7b25dd2c9dd92a72f0Jesse Hall    virtual status_t advanceFrame();
46851cfe834295224cd64bdd499872b95b19c4de8cJesse Hall    virtual void onFrameCommitted();
47f10c46ef855b6410b20ebd8b1351d4d78d8eca8eDan Stoza    virtual void dumpAsString(String8& result) const;
48a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian
4947e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    // Cannot resize a buffers in a FramebufferSurface. Only works with virtual
5047e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    // displays.
5147e45405d1533aa73307014f7bf371e118695cf3Michael Lentine    virtual void resizeBuffers(const uint32_t /*w*/, const uint32_t /*h*/) { };
5247e45405d1533aa73307014f7bf371e118695cf3Michael Lentine
533e87601170141229d661df93e2f59e1ced73474bMathias Agopianprivate:
54b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden    virtual ~FramebufferSurface() { }; // this class cannot be overloaded
551a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
568dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza    virtual void onFrameAvailable(const BufferItem& item);
571a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    virtual void freeBufferLocked(int slotIndex);
583e87601170141229d661df93e2f59e1ced73474bMathias Agopian
5974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    virtual void dumpLocked(String8& result, const char* prefix) const;
607adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall
61da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    // nextBuffer waits for and then latches the next buffer from the
62da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    // BufferQueue and releases the previously latched buffer to the
63da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    // BufferQueue.  The new buffer is returned in the 'buffer' argument.
64da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    status_t nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence);
65da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian
66f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian    // mDisplayType must match one of the HWC display types
67f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian    int mDisplayType;
68f5a33928349bebc8eebc9f466618997e98c24e68Mathias Agopian
691a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mCurrentBufferIndex is the slot index of the current buffer or
701a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // INVALID_BUFFER_SLOT to indicate that either there is no current buffer
711a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // or the buffer is not associated with a slot.
721a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    int mCurrentBufferSlot;
733e87601170141229d661df93e2f59e1ced73474bMathias Agopian
741a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mCurrentBuffer is the current buffer or NULL to indicate that there is
751a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // no current buffer.
761a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    sp<GraphicBuffer> mCurrentBuffer;
77b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden
78b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden    // Hardware composer, owned by SurfaceFlinger.
79b0d1dd36f104c0b581674adc7f830cbf44b7db06Andy McFadden    HWComposer& mHwc;
803e87601170141229d661df93e2f59e1ced73474bMathias Agopian};
813e87601170141229d661df93e2f59e1ced73474bMathias Agopian
823e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------
833e87601170141229d661df93e2f59e1ced73474bMathias Agopian}; // namespace android
843e87601170141229d661df93e2f59e1ced73474bMathias Agopian// ---------------------------------------------------------------------------
853e87601170141229d661df93e2f59e1ced73474bMathias Agopian
863e87601170141229d661df93e2f59e1ced73474bMathias Agopian#endif // ANDROID_SF_FRAMEBUFFER_SURFACE_H
873e87601170141229d661df93e2f59e1ced73474bMathias Agopian
88