bool TextureClientD3D11::Lock(OpenMode aMode) { if (!IsAllocated()) { return false; } MOZ_ASSERT(!mIsLocked, "The Texture is already locked!"); if (mTexture) { MOZ_ASSERT(!mTexture10); mIsLocked = LockD3DTexture(mTexture.get()); } else { MOZ_ASSERT(!mTexture); mIsLocked = LockD3DTexture(mTexture10.get()); } if (!mIsLocked) { return false; } if (NS_IsMainThread()) { // Make sure that successful write-lock means we will have a DrawTarget to // write into. if (aMode & OpenMode::OPEN_WRITE) { mDrawTarget = BorrowDrawTarget(); if (!mDrawTarget) { Unlock(); return false; } } if (mNeedsClear) { mDrawTarget = BorrowDrawTarget(); if (!mDrawTarget) { Unlock(); return false; } mDrawTarget->ClearRect(Rect(0, 0, GetSize().width, GetSize().height)); mNeedsClear = false; } if (mNeedsClearWhite) { mDrawTarget = BorrowDrawTarget(); if (!mDrawTarget) { Unlock(); return false; } mDrawTarget->FillRect(Rect(0, 0, GetSize().width, GetSize().height), ColorPattern(Color(1.0, 1.0, 1.0, 1.0))); mNeedsClearWhite = false; } } return true; }
already_AddRefed<gfx::SourceSurface> PersistentBufferProviderShared::BorrowSnapshot() { MOZ_ASSERT(!mDrawTarget); auto front = GetTexture(mFront); if (!front || front->IsLocked()) { MOZ_ASSERT(false); return nullptr; } if (!front->Lock(OpenMode::OPEN_READ)) { return nullptr; } RefPtr<DrawTarget> dt = front->BorrowDrawTarget(); if (!dt) { front->Unlock(); return nullptr; } mSnapshot = dt->Snapshot(); RefPtr<SourceSurface> snapshot = mSnapshot; return snapshot.forget(); }
bool X11TextureData::UpdateFromSurface(gfx::SourceSurface* aSurface) { RefPtr<DrawTarget> dt = BorrowDrawTarget(); if (!dt) { return false; } dt->CopySurface(aSurface, IntRect(IntPoint(), aSurface->GetSize()), IntPoint()); return true; }