SharedSurface* SurfaceStream_TripleBuffer::SwapProducer(SurfaceFactory* factory, const gfxIntSize& size) { PROFILER_LABEL("SurfaceStream_TripleBuffer", "SwapProducer"); MonitorAutoLock lock(mMonitor); if (mProducer) { RecycleScraps(factory); // If WaitForCompositor succeeds, mStaging has moved to mConsumer. // If it failed, we might have to scrap it. if (mStaging && !WaitForCompositor()) Scrap(mStaging); MOZ_ASSERT(!mStaging); Move(mProducer, mStaging); mStaging->Fence(); } MOZ_ASSERT(!mProducer); New(factory, size, mProducer); return mProducer; }
SharedSurface* SurfaceStream_TripleBuffer_Copy::SwapProducer(SurfaceFactory* factory, const gfxIntSize& size) { MonitorAutoLock lock(mMonitor); RecycleScraps(factory); if (mProducer) { if (mStaging && mStaging->Type() != factory->Type()) Recycle(factory, mStaging); if (!mStaging) New(factory, mProducer->Size(), mStaging); if (!mStaging) return nullptr; SharedSurface::Copy(mProducer, mStaging, factory); // Fence now, before we start (maybe) juggling Prod around. mStaging->Fence(); if (mProducer->Size() != size) Recycle(factory, mProducer); } // The old Prod (if there every was one) was invalid, // so we need a new one. if (!mProducer) { New(factory, size, mProducer); } return mProducer; }
SharedSurface* SurfaceStream_TripleBuffer_Copy::SwapProducer(SurfaceFactory* factory, const gfxIntSize& size) { MonitorAutoLock lock(mMonitor); RecycleScraps(factory); if (mProducer) { if (mStaging) { // We'll re-use this for a new mProducer later on if // the size remains the same Recycle(factory, mStaging); } Move(mProducer, mStaging); mStaging->Fence(); New(factory, size, mProducer); if (mProducer && mStaging->Size() == mProducer->Size()) SharedSurface::Copy(mStaging, mProducer, factory); } else { New(factory, size, mProducer); } return mProducer; }
SharedSurface* SurfaceStream_TripleBuffer::SwapProducer(SurfaceFactory* factory, const gfxIntSize& size) { MutexAutoLock lock(mMutex); if (mProducer) { RecycleScraps(factory); if (mStaging) Recycle(factory, mStaging); Move(mProducer, mStaging); mStaging->Fence(); } MOZ_ASSERT(!mProducer); New(factory, size, mProducer); return mProducer; }
SharedSurface* SurfaceStream_TripleBuffer::SwapProducer(SurfaceFactory* factory, const gfx::IntSize& size) { PROFILER_LABEL("SurfaceStream_TripleBuffer", "SwapProducer"); MonitorAutoLock lock(mMonitor); if (mProducer) { RecycleScraps(factory); if (mStaging) Scrap(mStaging); MOZ_ASSERT(!mStaging); Move(mProducer, mStaging); mStaging->Fence(); } MOZ_ASSERT(!mProducer); New(factory, size, mProducer); return mProducer; }