mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 19:35:51 +00:00
Bug 1014815 - Add a delay stage for webgl on b2g to let frame resolve. r=jgilbert
--HG-- extra : rebase_source : ca0d405db3af1e7f8f38456fedbb8b27b9f3b249
This commit is contained in:
parent
ed539c02a6
commit
ba2036ac44
@ -842,6 +842,10 @@ public:
|
||||
context->MarkContextClean();
|
||||
|
||||
context->UpdateLastUseIndex();
|
||||
|
||||
if (context->GL()->Screen()->HasDelayedFrame()) {
|
||||
context->Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -155,6 +155,10 @@ public:
|
||||
const gfx::IntSize& size,
|
||||
const SurfaceCaps& caps);
|
||||
|
||||
bool HasDelayedFrame() {
|
||||
return mStream->HasDelayedFrame();
|
||||
}
|
||||
|
||||
protected:
|
||||
GLContext* const mGL; // Owns us.
|
||||
SurfaceCaps mCaps;
|
||||
|
@ -31,6 +31,16 @@ SurfaceStream::ChooseGLStreamType(SurfaceStream::OMTC omtc,
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
ShouldDelayFrame()
|
||||
{
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
SurfaceStream*
|
||||
SurfaceStream::CreateForType(SurfaceStreamType type, mozilla::gl::GLContext* glContext, SurfaceStream* prevStream)
|
||||
{
|
||||
@ -43,12 +53,20 @@ SurfaceStream::CreateForType(SurfaceStreamType type, mozilla::gl::GLContext* glC
|
||||
case SurfaceStreamType::TripleBuffer_Copy:
|
||||
result = new SurfaceStream_TripleBuffer_Copy(prevStream);
|
||||
break;
|
||||
case SurfaceStreamType::TripleBuffer_Async:
|
||||
result = new SurfaceStream_TripleBuffer_Async(prevStream);
|
||||
case SurfaceStreamType::TripleBuffer_Async: {
|
||||
result = new SurfaceStream_TripleBuffer_Async(ShouldDelayFrame(), prevStream);
|
||||
break;
|
||||
case SurfaceStreamType::TripleBuffer:
|
||||
result = new SurfaceStream_TripleBuffer(prevStream);
|
||||
}
|
||||
case SurfaceStreamType::TripleBuffer: {
|
||||
bool delayFrame = false;
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
// Give time for the frame to resolve instead of waiting for the
|
||||
// fence right away.
|
||||
delayFrame = true;
|
||||
#endif
|
||||
result = new SurfaceStream_TripleBuffer(delayFrame, prevStream);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
MOZ_CRASH("Invalid Type.");
|
||||
}
|
||||
@ -391,18 +409,25 @@ void SurfaceStream_TripleBuffer::Init(SurfaceStream* prevStream)
|
||||
}
|
||||
|
||||
|
||||
SurfaceStream_TripleBuffer::SurfaceStream_TripleBuffer(SurfaceStreamType type, SurfaceStream* prevStream)
|
||||
SurfaceStream_TripleBuffer::SurfaceStream_TripleBuffer(bool aUseSwapDelay,
|
||||
SurfaceStreamType type,
|
||||
SurfaceStream* prevStream)
|
||||
: SurfaceStream(type, prevStream)
|
||||
, mStaging(nullptr)
|
||||
, mConsumer(nullptr)
|
||||
, mDelay(nullptr)
|
||||
, mUseSwapDelay(aUseSwapDelay)
|
||||
{
|
||||
SurfaceStream_TripleBuffer::Init(prevStream);
|
||||
}
|
||||
|
||||
SurfaceStream_TripleBuffer::SurfaceStream_TripleBuffer(SurfaceStream* prevStream)
|
||||
SurfaceStream_TripleBuffer::SurfaceStream_TripleBuffer(bool aUseSwapDelay,
|
||||
SurfaceStream* prevStream)
|
||||
: SurfaceStream(SurfaceStreamType::TripleBuffer, prevStream)
|
||||
, mStaging(nullptr)
|
||||
, mConsumer(nullptr)
|
||||
, mDelay(nullptr)
|
||||
, mUseSwapDelay(aUseSwapDelay)
|
||||
{
|
||||
SurfaceStream_TripleBuffer::Init(prevStream);
|
||||
}
|
||||
@ -411,6 +436,7 @@ SurfaceStream_TripleBuffer::~SurfaceStream_TripleBuffer()
|
||||
{
|
||||
Delete(mStaging);
|
||||
Delete(mConsumer);
|
||||
Delete(mDelay);
|
||||
}
|
||||
|
||||
void
|
||||
@ -460,17 +486,31 @@ SharedSurface*
|
||||
SurfaceStream_TripleBuffer::SwapConsumer_NoWait()
|
||||
{
|
||||
MonitorAutoLock lock(mMonitor);
|
||||
if (mStaging) {
|
||||
if (mDelay) {
|
||||
Scrap(mConsumer);
|
||||
Move(mStaging, mConsumer);
|
||||
Move(mDelay, mConsumer);
|
||||
mMonitor.NotifyAll();
|
||||
}
|
||||
|
||||
if (mStaging) {
|
||||
if (mUseSwapDelay && mConsumer) {
|
||||
MOZ_ASSERT(!mDelay);
|
||||
Move(mStaging, mDelay);
|
||||
} else {
|
||||
Scrap(mConsumer);
|
||||
Move(mStaging, mConsumer);
|
||||
mMonitor.NotifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
return mConsumer;
|
||||
}
|
||||
|
||||
SurfaceStream_TripleBuffer_Async::SurfaceStream_TripleBuffer_Async(SurfaceStream* prevStream)
|
||||
: SurfaceStream_TripleBuffer(SurfaceStreamType::TripleBuffer_Async, prevStream)
|
||||
SurfaceStream_TripleBuffer_Async::SurfaceStream_TripleBuffer_Async(bool aSwapDelay,
|
||||
SurfaceStream* prevStream)
|
||||
: SurfaceStream_TripleBuffer(aSwapDelay,
|
||||
SurfaceStreamType::TripleBuffer_Async,
|
||||
prevStream)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -53,6 +53,13 @@ public:
|
||||
|
||||
mozilla::gl::GLContext* GLContext() const { return mGLContext; }
|
||||
|
||||
/**
|
||||
* If we have a pending frame in the queue then we will need
|
||||
* another SwapConsumer.
|
||||
*/
|
||||
virtual bool HasDelayedFrame() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
protected:
|
||||
// |mProd| is owned by us, but can be ripped away when
|
||||
@ -60,13 +67,14 @@ protected:
|
||||
SharedSurface* mProducer;
|
||||
std::set<SharedSurface*> mSurfaces;
|
||||
std::stack<SharedSurface*> mScraps;
|
||||
mutable Monitor mMonitor;
|
||||
bool mIsAlive;
|
||||
|
||||
// Do not use this. It exists solely so we can ref it in CanvasClientWebGL::Update()
|
||||
// before sent up to the compositor. You have been warned (Bug 894405)
|
||||
mozilla::gl::GLContext* mGLContext;
|
||||
|
||||
mutable Monitor mMonitor;
|
||||
bool mIsAlive;
|
||||
|
||||
// |previous| can be null, indicating this is the first one.
|
||||
// Otherwise, we pull in |mProd| from |previous| an our initial surface.
|
||||
SurfaceStream(SurfaceStreamType type, SurfaceStream* prevStream)
|
||||
@ -190,19 +198,25 @@ class SurfaceStream_TripleBuffer
|
||||
protected:
|
||||
SharedSurface* mStaging;
|
||||
SharedSurface* mConsumer;
|
||||
SharedSurface* mDelay;
|
||||
bool mUseSwapDelay;
|
||||
|
||||
// Returns true if we were able to wait, false if not
|
||||
virtual void WaitForCompositor() {}
|
||||
|
||||
// To support subclasses initializing the mType.
|
||||
SurfaceStream_TripleBuffer(SurfaceStreamType type, SurfaceStream* prevStream);
|
||||
SurfaceStream_TripleBuffer(bool aUseSwapDelay, SurfaceStreamType type, SurfaceStream* prevStream);
|
||||
|
||||
public:
|
||||
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(SurfaceStream_TripleBuffer)
|
||||
SurfaceStream_TripleBuffer(SurfaceStream* prevStream);
|
||||
SurfaceStream_TripleBuffer(bool aUseSwapDelay, SurfaceStream* prevStream);
|
||||
virtual ~SurfaceStream_TripleBuffer();
|
||||
virtual bool CopySurfaceToProducer(SharedSurface* src, SurfaceFactory* factory);
|
||||
|
||||
virtual bool HasDelayedFrame() const MOZ_OVERRIDE {
|
||||
return !!mDelay;
|
||||
}
|
||||
|
||||
private:
|
||||
// Common constructor code.
|
||||
void Init(SurfaceStream* prevStream);
|
||||
@ -224,7 +238,7 @@ protected:
|
||||
virtual void WaitForCompositor() MOZ_OVERRIDE;
|
||||
|
||||
public:
|
||||
SurfaceStream_TripleBuffer_Async(SurfaceStream* prevStream);
|
||||
SurfaceStream_TripleBuffer_Async(bool aSwapDelay, SurfaceStream* prevStream);
|
||||
virtual ~SurfaceStream_TripleBuffer_Async();
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user