Bug 1152370 part 3 - Use DisplaySurface r=mwu

This commit is contained in:
Sotaro Ikeda 2015-04-23 06:49:40 -07:00
Родитель a08694b934
Коммит 5879b59690
16 изменённых файлов: 158 добавлений и 108 удалений

Просмотреть файл

@ -337,7 +337,7 @@ public:
*/
virtual void EndFrame() = 0;
virtual void SetFBAcquireFence(Layer* aLayer) {}
virtual void SetDispAcquireFence(Layer* aLayer) {}
virtual FenceHandle GetReleaseFence()
{

Просмотреть файл

@ -768,7 +768,7 @@ LayerManagerComposite::Render()
js::ProfileEntry::Category::GRAPHICS);
mCompositor->EndFrame();
mCompositor->SetFBAcquireFence(mRoot);
mCompositor->SetDispAcquireFence(mRoot);
}
if (composer2D) {
@ -945,7 +945,7 @@ LayerManagerComposite::RenderToPresentationSurface()
RootLayer()->RenderLayer(clipRect);
mCompositor->EndFrame();
mCompositor->SetFBAcquireFence(mRoot);
mCompositor->SetDispAcquireFence(mRoot);
}
#endif

Просмотреть файл

@ -1284,12 +1284,12 @@ CompositorOGL::EndFrame()
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
void
CompositorOGL::SetFBAcquireFence(Layer* aLayer)
CompositorOGL::SetDispAcquireFence(Layer* aLayer)
{
// OpenGL does not provide ReleaseFence for rendering.
// Instead use FBAcquireFence as layer buffer's ReleaseFence
// Instead use DispAcquireFence as layer buffer's ReleaseFence
// to prevent flickering and tearing.
// FBAcquireFence is FramebufferSurface's AcquireFence.
// DispAcquireFence is DisplaySurface's AcquireFence.
// AcquireFence will be signaled when a buffer's content is available.
// See Bug 974152.
@ -1297,7 +1297,7 @@ CompositorOGL::SetFBAcquireFence(Layer* aLayer)
return;
}
android::sp<android::Fence> fence = new android::Fence(GetGonkDisplay()->GetPrevFBAcquireFd());
android::sp<android::Fence> fence = new android::Fence(GetGonkDisplay()->GetPrevDispAcquireFd());
if (fence.get() && fence->isValid()) {
FenceHandle handle = FenceHandle(fence);
mReleaseFenceHandle.Merge(handle);
@ -1315,7 +1315,7 @@ CompositorOGL::GetReleaseFence()
#else
void
CompositorOGL::SetFBAcquireFence(Layer* aLayer)
CompositorOGL::SetDispAcquireFence(Layer* aLayer)
{
}

Просмотреть файл

@ -236,7 +236,7 @@ public:
const gfx::Matrix4x4 &aTransform) override;
virtual void EndFrame() override;
virtual void SetFBAcquireFence(Layer* aLayer) override;
virtual void SetDispAcquireFence(Layer* aLayer) override;
virtual FenceHandle GetReleaseFence() override;
virtual void EndFrameForExternalComposition(const gfx::Matrix& aTransform) override;

Просмотреть файл

@ -35,7 +35,7 @@
#include "VsyncSource.h"
#if ANDROID_VERSION >= 17
#include "libdisplay/FramebufferSurface.h"
#include "libdisplay/DisplaySurface.h"
#include "gfxPrefs.h"
#include "nsThreadUtils.h"
#endif
@ -674,10 +674,10 @@ HwcComposer2D::PrepareLayerList(Layer* aLayer,
bool
HwcComposer2D::TryHwComposition()
{
FramebufferSurface* fbsurface = (FramebufferSurface*)(GetGonkDisplay()->GetFBSurface());
DisplaySurface* dispSurface = (DisplaySurface*)(GetGonkDisplay()->GetDispSurface());
if (!(fbsurface && fbsurface->lastHandle)) {
LOGD("H/W Composition failed. FBSurface not initialized.");
if (!(dispSurface && dispSurface->lastHandle)) {
LOGD("H/W Composition failed. DispSurface not initialized.");
return false;
}
@ -690,7 +690,7 @@ HwcComposer2D::TryHwComposition()
}
}
Prepare(fbsurface->lastHandle, -1);
Prepare(dispSurface->lastHandle, -1);
/* Possible composition paths, after hwc prepare:
1. GPU Composition
@ -744,22 +744,22 @@ HwcComposer2D::TryHwComposition()
// GPU or partial OVERLAY Composition
return false;
} else if (blitComposite) {
// BLIT Composition, flip FB target
GetGonkDisplay()->UpdateFBSurface(mDpy, mSur);
FramebufferSurface* fbsurface = (FramebufferSurface*)(GetGonkDisplay()->GetFBSurface());
if (!fbsurface) {
LOGE("H/W Composition failed. NULL FBSurface.");
// BLIT Composition, flip DispSurface target
GetGonkDisplay()->UpdateDispSurface(mDpy, mSur);
DisplaySurface* dispSurface = (DisplaySurface*)(GetGonkDisplay()->GetDispSurface());
if (!dispSurface) {
LOGE("H/W Composition failed. NULL DispSurface.");
return false;
}
mList->hwLayers[idx].handle = fbsurface->lastHandle;
mList->hwLayers[idx].acquireFenceFd = fbsurface->GetPrevFBAcquireFd();
mList->hwLayers[idx].handle = dispSurface->lastHandle;
mList->hwLayers[idx].acquireFenceFd = dispSurface->GetPrevDispAcquireFd();
}
}
// BLIT or full OVERLAY Composition
Commit();
GetGonkDisplay()->SetFBReleaseFd(mList->hwLayers[idx].releaseFenceFd);
GetGonkDisplay()->SetDispReleaseFd(mList->hwLayers[idx].releaseFenceFd);
mList->hwLayers[idx].releaseFenceFd = -1;
return true;
}
@ -772,16 +772,16 @@ HwcComposer2D::Render()
return GetGonkDisplay()->SwapBuffers(mDpy, mSur);
}
FramebufferSurface* fbsurface = (FramebufferSurface*)(GetGonkDisplay()->GetFBSurface());
if (!fbsurface) {
LOGE("H/W Composition failed. FBSurface not initialized.");
DisplaySurface* dispSurface = (DisplaySurface*)(GetGonkDisplay()->GetDispSurface());
if (!dispSurface) {
LOGE("H/W Composition failed. DispSurface not initialized.");
return false;
}
if (mPrepared) {
// No mHwc prepare, if already prepared in current draw cycle
mList->hwLayers[mList->numHwLayers - 1].handle = fbsurface->lastHandle;
mList->hwLayers[mList->numHwLayers - 1].acquireFenceFd = fbsurface->GetPrevFBAcquireFd();
mList->hwLayers[mList->numHwLayers - 1].handle = dispSurface->lastHandle;
mList->hwLayers[mList->numHwLayers - 1].acquireFenceFd = dispSurface->GetPrevDispAcquireFd();
} else {
mList->flags = HWC_GEOMETRY_CHANGED;
mList->numHwLayers = 2;
@ -792,19 +792,19 @@ HwcComposer2D::Render()
mList->hwLayers[0].acquireFenceFd = -1;
mList->hwLayers[0].releaseFenceFd = -1;
mList->hwLayers[0].displayFrame = {0, 0, mScreenRect.width, mScreenRect.height};
Prepare(fbsurface->lastHandle, fbsurface->GetPrevFBAcquireFd());
Prepare(dispSurface->lastHandle, dispSurface->GetPrevDispAcquireFd());
}
// GPU or partial HWC Composition
Commit();
GetGonkDisplay()->SetFBReleaseFd(mList->hwLayers[mList->numHwLayers - 1].releaseFenceFd);
GetGonkDisplay()->SetDispReleaseFd(mList->hwLayers[mList->numHwLayers - 1].releaseFenceFd);
mList->hwLayers[mList->numHwLayers - 1].releaseFenceFd = -1;
return true;
}
void
HwcComposer2D::Prepare(buffer_handle_t fbHandle, int fence)
HwcComposer2D::Prepare(buffer_handle_t dispHandle, int fence)
{
int idx = mList->numHwLayers - 1;
const hwc_rect_t r = {0, 0, mScreenRect.width, mScreenRect.height};
@ -818,7 +818,7 @@ HwcComposer2D::Prepare(buffer_handle_t fbHandle, int fence)
mList->hwLayers[idx].hints = 0;
mList->hwLayers[idx].flags = 0;
mList->hwLayers[idx].transform = 0;
mList->hwLayers[idx].handle = fbHandle;
mList->hwLayers[idx].handle = dispHandle;
mList->hwLayers[idx].blending = HWC_BLENDING_PREMULT;
mList->hwLayers[idx].compositionType = HWC_FRAMEBUFFER_TARGET;
setCrop(&mList->hwLayers[idx], r);

Просмотреть файл

@ -102,7 +102,7 @@ public:
private:
void Reset();
void Prepare(buffer_handle_t fbHandle, int fence);
void Prepare(buffer_handle_t dispHandle, int fence);
bool Commit();
bool TryHwComposition();
bool ReallocLayerList();

Просмотреть файл

@ -54,15 +54,10 @@ FramebufferSurface::FramebufferSurface(int disp,
uint32_t height,
uint32_t format,
const sp<StreamConsumer>& sc)
#if ANDROID_VERSION >= 19
: ConsumerBase(sc, true)
#else
: ConsumerBase(sc)
#endif
: DisplaySurface(sc)
, mDisplayType(disp)
, mCurrentBufferSlot(-1)
, mCurrentBuffer(0)
, lastHandle(0)
{
mName = "FramebufferSurface";
@ -81,6 +76,21 @@ FramebufferSurface::FramebufferSurface(int disp,
consumer->setDefaultMaxBufferCount(NUM_FRAMEBUFFER_SURFACE_BUFFERS);
}
status_t FramebufferSurface::beginFrame(bool /*mustRecompose*/) {
return NO_ERROR;
}
status_t FramebufferSurface::prepareFrame(CompositionType /*compositionType*/) {
return NO_ERROR;
}
status_t FramebufferSurface::advanceFrame() {
// Once we remove FB HAL support, we can call nextBuffer() from here
// instead of using onFrameAvailable(). No real benefit, except it'll be
// more like VirtualDisplaySurface.
return NO_ERROR;
}
status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence) {
Mutex::Autolock lock(mMutex);
@ -174,28 +184,25 @@ status_t FramebufferSurface::setReleaseFenceFd(int fenceFd) {
return err;
}
int FramebufferSurface::GetPrevFBAcquireFd() {
int FramebufferSurface::GetPrevDispAcquireFd() {
if (mPrevFBAcquireFence.get() && mPrevFBAcquireFence->isValid()) {
return mPrevFBAcquireFence->dup();
}
return -1;
}
status_t FramebufferSurface::setUpdateRectangle(const Rect& r)
{
return INVALID_OPERATION;
void FramebufferSurface::onFrameCommitted() {
// XXX This role is almost same to setReleaseFenceFd().
}
status_t FramebufferSurface::compositionComplete()
{
// Actual implementaiton is in GonkDisplay::SwapBuffers()
// XXX need to move that to here.
return NO_ERROR;
}
void FramebufferSurface::dump(String8& result) {
ConsumerBase::dump(result);
}
void FramebufferSurface::dump(String8& result, const char* prefix) {
void FramebufferSurface::dump(String8& result) const {
ConsumerBase::dump(result);
}

Просмотреть файл

@ -20,7 +20,7 @@
#include <stdint.h>
#include <sys/types.h>
#include <gui/ConsumerBase.h>
#include "DisplaySurface.h"
// ---------------------------------------------------------------------------
namespace android {
@ -29,24 +29,24 @@ namespace android {
class Rect;
class String8;
#if ANDROID_VERSION >= 21
typedef IGraphicBufferConsumer StreamConsumer;
#else
typedef BufferQueue StreamConsumer;
#endif
// ---------------------------------------------------------------------------
class FramebufferSurface : public ConsumerBase {
class FramebufferSurface : public DisplaySurface {
public:
FramebufferSurface(int disp, uint32_t width, uint32_t height, uint32_t format, const sp<StreamConsumer>& sc);
bool isUpdateOnDemand() const { return false; }
status_t setUpdateRectangle(const Rect& updateRect);
status_t compositionComplete();
virtual void dump(String8& result);
virtual void dump(String8& result, const char* prefix);
// From DisplaySurface
virtual status_t beginFrame(bool mustRecompose);
virtual status_t prepareFrame(CompositionType compositionType);
virtual status_t compositionComplete();
virtual status_t advanceFrame();
virtual void onFrameCommitted();
// Implementation of DisplaySurface::dump(). Note that ConsumerBase also
// has a non-virtual dump() with the same signature.
virtual void dump(String8& result) const;
// Cannot resize a buffers in a FramebufferSurface. Only works with virtual
// displays.
virtual void resizeBuffers(const uint32_t /*w*/, const uint32_t /*h*/) { };
// setReleaseFenceFd stores a fence file descriptor that will signal when the
// current buffer is no longer being read. This fence will be returned to
@ -56,9 +56,8 @@ public:
// when finished with it.
status_t setReleaseFenceFd(int fenceFd);
virtual int GetPrevFBAcquireFd();
virtual int GetPrevDispAcquireFd();
buffer_handle_t lastHandle;
private:
virtual ~FramebufferSurface() { }; // this class cannot be overloaded

Просмотреть файл

@ -36,7 +36,7 @@ public:
virtual void* GetHWCDevice() = 0;
virtual void* GetFBSurface() = 0;
virtual void* GetDispSurface() = 0;
/**
* Only GonkDisplayICS uses arguments.
@ -47,20 +47,20 @@ public:
virtual bool QueueBuffer(ANativeWindowBuffer* buf) = 0;
virtual void UpdateFBSurface(EGLDisplay dpy, EGLSurface sur) = 0;
virtual void UpdateDispSurface(EGLDisplay dpy, EGLSurface sur) = 0;
/**
* Set FramebufferSurface ReleaseFence's file descriptor.
* ReleaseFence will be signaled after the HWC has finished reading
* from a buffer.
*/
virtual void SetFBReleaseFd(int fd) = 0;
virtual void SetDispReleaseFd(int fd) = 0;
/**
* Get FramebufferSurface AcquireFence's file descriptor
* AcquireFence will be signaled when a buffer's content is available.
*/
virtual int GetPrevFBAcquireFd() = 0;
virtual int GetPrevDispAcquireFd() = 0;
float xdpi;
int32_t surfaceformat;

Просмотреть файл

@ -173,12 +173,6 @@ GonkDisplayICS::GetHWCDevice()
return mHwc;
}
void*
GonkDisplayICS::GetFBSurface()
{
return mFBSurface.get();
}
bool
GonkDisplayICS::SwapBuffers(EGLDisplay dpy, EGLSurface sur)
{
@ -211,13 +205,13 @@ GonkDisplayICS::QueueBuffer(ANativeWindowBuffer *buf)
}
void
GonkDisplayICS::UpdateFBSurface(EGLDisplay dpy, EGLSurface sur)
GonkDisplayICS::UpdateDispSurface(EGLDisplay dpy, EGLSurface sur)
{
eglSwapBuffers(dpy, sur);
}
void
GonkDisplayICS::SetFBReleaseFd(int fd)
GonkDisplayICS::SetDispReleaseFd(int fd)
{
}

Просмотреть файл

@ -38,7 +38,10 @@ public:
virtual void* GetHWCDevice();
virtual void* GetFBSurface();
virtual void* GetDispSurface()
{
return nullptr;
}
virtual bool SwapBuffers(EGLDisplay dpy, EGLSurface sur);
@ -46,11 +49,11 @@ public:
virtual bool QueueBuffer(ANativeWindowBuffer* handle);
virtual void UpdateFBSurface(EGLDisplay dpy, EGLSurface sur);
virtual void UpdateDispSurface(EGLDisplay dpy, EGLSurface sur);
virtual void SetFBReleaseFd(int fd);
virtual void SetDispReleaseFd(int fd);
virtual int GetPrevFBAcquireFd()
virtual int GetPrevDispAcquireFd()
{
return -1;
}

Просмотреть файл

@ -26,6 +26,7 @@
#include <hardware/power.h>
#include <suspend/autosuspend.h>
#include "FramebufferSurface.h"
#if ANDROID_VERSION == 17
#include "GraphicBufferAlloc.h"
#endif
@ -119,11 +120,11 @@ GonkDisplayJB::GonkDisplayJB()
sp<BufferQueue> consumer = new BufferQueue(true, mAlloc);
#endif
mFBSurface = new FramebufferSurface(0, mWidth, mHeight, surfaceformat, consumer);
mDispSurface = new FramebufferSurface(0, mWidth, mHeight, surfaceformat, consumer);
#if ANDROID_VERSION == 17
sp<SurfaceTextureClient> stc = new SurfaceTextureClient(
static_cast<sp<ISurfaceTexture> >(mFBSurface->getBufferQueue()));
static_cast<sp<ISurfaceTexture> >(mDispSurface->getBufferQueue()));
#else
sp<Surface> stc = new Surface(producer);
#endif
@ -223,9 +224,9 @@ GonkDisplayJB::GetHWCDevice()
}
void*
GonkDisplayJB::GetFBSurface()
GonkDisplayJB::GetDispSurface()
{
return mFBSurface.get();
return mDispSurface.get();
}
bool
@ -238,7 +239,7 @@ GonkDisplayJB::SwapBuffers(EGLDisplay dpy, EGLSurface sur)
if (mFBDevice && mFBDevice->compositionComplete) {
mFBDevice->compositionComplete(mFBDevice);
}
return Post(mFBSurface->lastHandle, mFBSurface->GetPrevFBAcquireFd());
return Post(mDispSurface->lastHandle, mDispSurface->GetPrevDispAcquireFd());
}
bool
@ -297,7 +298,7 @@ GonkDisplayJB::Post(buffer_handle_t buf, int fence)
#endif
mHwc->prepare(mHwc, HWC_NUM_DISPLAY_TYPES, displays);
int err = mHwc->set(mHwc, HWC_NUM_DISPLAY_TYPES, displays);
mFBSurface->setReleaseFenceFd(mList->hwLayers[1].releaseFenceFd);
mDispSurface->setReleaseFenceFd(mList->hwLayers[1].releaseFenceFd);
if (mList->retireFenceFd >= 0)
close(mList->retireFenceFd);
return !err;
@ -321,21 +322,21 @@ GonkDisplayJB::QueueBuffer(ANativeWindowBuffer* buf)
}
void
GonkDisplayJB::UpdateFBSurface(EGLDisplay dpy, EGLSurface sur)
GonkDisplayJB::UpdateDispSurface(EGLDisplay dpy, EGLSurface sur)
{
eglSwapBuffers(dpy, sur);
}
void
GonkDisplayJB::SetFBReleaseFd(int fd)
GonkDisplayJB::SetDispReleaseFd(int fd)
{
mFBSurface->setReleaseFenceFd(fd);
mDispSurface->setReleaseFenceFd(fd);
}
int
GonkDisplayJB::GetPrevFBAcquireFd()
GonkDisplayJB::GetPrevDispAcquireFd()
{
return mFBSurface->GetPrevFBAcquireFd();
return mDispSurface->GetPrevDispAcquireFd();
}
__attribute__ ((visibility ("default")))

Просмотреть файл

@ -16,8 +16,8 @@
#ifndef GONKDISPLAYJB_H
#define GONKDISPLAYJB_H
#include "DisplaySurface.h"
#include "GonkDisplay.h"
#include "FramebufferSurface.h"
#include "hardware/hwcomposer.h"
#include "hardware/power.h"
#include "ui/Fence.h"
@ -38,7 +38,7 @@ public:
virtual void* GetHWCDevice();
virtual void* GetFBSurface();
virtual void* GetDispSurface();
virtual bool SwapBuffers(EGLDisplay dpy, EGLSurface sur);
@ -46,11 +46,11 @@ public:
virtual bool QueueBuffer(ANativeWindowBuffer* buf);
virtual void UpdateFBSurface(EGLDisplay dpy, EGLSurface sur);
virtual void UpdateDispSurface(EGLDisplay dpy, EGLSurface sur);
virtual void SetFBReleaseFd(int fd);
virtual void SetDispReleaseFd(int fd);
virtual int GetPrevFBAcquireFd();
virtual int GetPrevDispAcquireFd();
bool Post(buffer_handle_t buf, int fence);
@ -60,7 +60,7 @@ private:
hwc_composer_device_1_t* mHwc;
framebuffer_device_t* mFBDevice;
power_module_t* mPowerModule;
android::sp<android::FramebufferSurface> mFBSurface;
android::sp<android::DisplaySurface> mDispSurface;
android::sp<ANativeWindow> mSTClient;
android::sp<android::IGraphicBufferAlloc> mAlloc;
int mFence;

Просмотреть файл

@ -16,7 +16,6 @@
// #define LOG_NDEBUG 0
#include "VirtualDisplaySurface.h"
#include "HWComposer.h"
// ---------------------------------------------------------------------------
namespace android {
@ -45,13 +44,12 @@ static const char* dbgCompositionTypeStr(DisplaySurface::CompositionType type) {
}
}
VirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, int32_t dispId,
VirtualDisplaySurface::VirtualDisplaySurface(int32_t dispId,
const sp<IGraphicBufferProducer>& sink,
const sp<IGraphicBufferProducer>& bqProducer,
const sp<IGraphicBufferConsumer>& bqConsumer,
const sp<StreamConsumer>& bqConsumer,
const String8& name)
: ConsumerBase(bqConsumer),
mHwc(hwc),
: DisplaySurface(bqConsumer),
mDisplayId(dispId),
mDisplayName(name),
mOutputUsage(GRALLOC_USAGE_HW_COMPOSER),
@ -162,6 +160,11 @@ status_t VirtualDisplaySurface::compositionComplete() {
}
status_t VirtualDisplaySurface::advanceFrame() {
return NO_ERROR;
// XXX Add HWC support
#if 0
if (mDisplayId < 0)
return NO_ERROR;
@ -204,9 +207,15 @@ status_t VirtualDisplaySurface::advanceFrame() {
}
return result;
#endif
}
void VirtualDisplaySurface::onFrameCommitted() {
return;
// XXX Add HWC support
#if 0
if (mDisplayId < 0)
return;
@ -252,6 +261,7 @@ void VirtualDisplaySurface::onFrameCommitted() {
}
resetPerFrameState();
#endif
}
void VirtualDisplaySurface::dump(String8& /* result */) const {
@ -495,6 +505,7 @@ int VirtualDisplaySurface::query(int what, int* value) {
return NO_ERROR;
}
#if ANDROID_VERSION >= 21
status_t VirtualDisplaySurface::connect(const sp<IProducerListener>& listener,
int api, bool producerControlledByApp,
QueueBufferOutput* output) {
@ -507,14 +518,29 @@ status_t VirtualDisplaySurface::connect(const sp<IProducerListener>& listener,
}
return result;
}
#else
status_t VirtualDisplaySurface::connect(const sp<IBinder>& token,
int api, bool producerControlledByApp,
QueueBufferOutput* output) {
QueueBufferOutput qbo;
status_t result = mSource[SOURCE_SINK]->connect(token, api, producerControlledByApp, &qbo);
if (result == NO_ERROR) {
updateQueueBufferOutput(qbo);
*output = mQueueBufferOutput;
}
return result;
}
#endif
status_t VirtualDisplaySurface::disconnect(int api) {
return mSource[SOURCE_SINK]->disconnect(api);
}
#if ANDROID_VERSION >= 21
status_t VirtualDisplaySurface::setSidebandStream(const sp<NativeHandle>& /*stream*/) {
return INVALID_OPERATION;
}
#endif
void VirtualDisplaySurface::allocateBuffers(bool /* async */,
uint32_t /* width */, uint32_t /* height */, uint32_t /* format */,
@ -538,6 +564,12 @@ void VirtualDisplaySurface::resetPerFrameState() {
}
status_t VirtualDisplaySurface::refreshOutputBuffer() {
return INVALID_OPERATION;
// XXX Add HWC support
#if 0
if (mOutputProducerSlot >= 0) {
mSource[SOURCE_SINK]->cancelBuffer(
mapProducer2SourceSlot(SOURCE_SINK, mOutputProducerSlot),
@ -559,6 +591,7 @@ status_t VirtualDisplaySurface::refreshOutputBuffer() {
mProducerBuffers[mOutputProducerSlot]);
return result;
#endif
}
// This slot mapping function is its own inverse, so two copies are unnecessary.

Просмотреть файл

@ -17,7 +17,6 @@
#ifndef ANDROID_SF_VIRTUAL_DISPLAY_SURFACE_H
#define ANDROID_SF_VIRTUAL_DISPLAY_SURFACE_H
#include <gui/ConsumerBase.h>
#include <gui/IGraphicBufferProducer.h>
#include "DisplaySurface.h"
@ -69,13 +68,12 @@ class IProducerListener;
* is released and the output buffer is queued to the sink.
*/
class VirtualDisplaySurface : public DisplaySurface,
public BnGraphicBufferProducer,
private ConsumerBase {
public BnGraphicBufferProducer {
public:
VirtualDisplaySurface(HWComposer& hwc, int32_t dispId,
VirtualDisplaySurface(int32_t dispId,
const sp<IGraphicBufferProducer>& sink,
const sp<IGraphicBufferProducer>& bqProducer,
const sp<IGraphicBufferConsumer>& bqConsumer,
const sp<StreamConsumer>& bqConsumer,
const String8& name);
//
@ -89,6 +87,9 @@ public:
virtual void dump(String8& result) const;
virtual void resizeBuffers(const uint32_t w, const uint32_t h);
virtual status_t setReleaseFenceFd(int fenceFd) { return INVALID_OPERATION; }
virtual int GetPrevDispAcquireFd() { return -1; };
private:
enum Source {SOURCE_SINK = 0, SOURCE_SCRATCH = 1};
@ -109,10 +110,17 @@ private:
const QueueBufferInput& input, QueueBufferOutput* output);
virtual void cancelBuffer(int pslot, const sp<Fence>& fence);
virtual int query(int what, int* value);
#if ANDROID_VERSION >= 21
virtual status_t connect(const sp<IProducerListener>& listener,
int api, bool producerControlledByApp, QueueBufferOutput* output);
#else
virtual status_t connect(const sp<IBinder>& token,
int api, bool producerControlledByApp, QueueBufferOutput* output);
#endif
virtual status_t disconnect(int api);
#if ANDROID_VERSION >= 21
virtual status_t setSidebandStream(const sp<NativeHandle>& stream);
#endif
virtual void allocateBuffers(bool async, uint32_t width, uint32_t height,
uint32_t format, uint32_t usage);
@ -138,7 +146,6 @@ private:
//
// Immutable after construction
//
HWComposer& mHwc;
const int32_t mDisplayId;
const String8 mDisplayName;
sp<IGraphicBufferProducer> mSource[2]; // indexed by SOURCE_*

Просмотреть файл

@ -18,7 +18,13 @@ SOURCES += [
'BootAnimation.cpp',
]
if CONFIG['ANDROID_VERSION'] >= '18':
if CONFIG['ANDROID_VERSION'] >= '19':
SOURCES += [
'FramebufferSurface.cpp',
'GonkDisplayJB.cpp',
'VirtualDisplaySurface.cpp',
]
elif CONFIG['ANDROID_VERSION'] == '18':
SOURCES += [
'FramebufferSurface.cpp',
'GonkDisplayJB.cpp',