mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
Bug 1152370 part 3 - Use DisplaySurface r=mwu
This commit is contained in:
parent
a08694b934
commit
5879b59690
@ -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',
|
||||
|
Loading…
Reference in New Issue
Block a user