mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-17 15:25:52 +00:00
fea686b1f6
Backed out changeset 391c8e7897df (bug 1265824) Backed out changeset 27c7daabd1a3 (bug 1265824) Backed out changeset 7c90215a2eca (bug 1265824) Backed out changeset c141fb67cf9a (bug 1265824) Backed out changeset 239ab9f9ef52 (bug 1265824) Backed out changeset 39ae151b3d8c (bug 1265824) Backed out changeset 71b23fbe1fec (bug 1265824) Backed out changeset 295dd1a6a09f (bug 1265824) Backed out changeset 6aecd088e02c (bug 1265824) Backed out changeset bf9d73b214fc (bug 1265824)
96 lines
2.7 KiB
C++
96 lines
2.7 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "mozilla/layers/TextureSourceProvider.h"
|
|
#include "mozilla/layers/TextureHost.h"
|
|
#include "mozilla/layers/PTextureParent.h"
|
|
#ifdef XP_DARWIN
|
|
#include "mozilla/layers/TextureSync.h"
|
|
#endif
|
|
|
|
namespace mozilla {
|
|
namespace layers {
|
|
|
|
TextureSourceProvider::~TextureSourceProvider()
|
|
{
|
|
ReadUnlockTextures();
|
|
}
|
|
|
|
void
|
|
TextureSourceProvider::ReadUnlockTextures()
|
|
{
|
|
#ifdef XP_DARWIN
|
|
nsClassHashtable<nsUint32HashKey, nsTArray<uint64_t>> texturesIdsToUnlockByPid;
|
|
for (auto& texture : mUnlockAfterComposition) {
|
|
auto bufferTexture = texture->AsBufferTextureHost();
|
|
if (bufferTexture && bufferTexture->IsDirectMap()) {
|
|
texture->ReadUnlock();
|
|
auto actor = texture->GetIPDLActor();
|
|
if (actor) {
|
|
base::ProcessId pid = actor->OtherPid();
|
|
nsTArray<uint64_t>* textureIds = texturesIdsToUnlockByPid.LookupOrAdd(pid);
|
|
textureIds->AppendElement(TextureHost::GetTextureSerial(actor));
|
|
}
|
|
} else {
|
|
texture->ReadUnlock();
|
|
}
|
|
}
|
|
for (auto it = texturesIdsToUnlockByPid.ConstIter(); !it.Done(); it.Next()) {
|
|
TextureSync::SetTexturesUnlocked(it.Key(), *it.UserData());
|
|
}
|
|
#else
|
|
for (auto& texture : mUnlockAfterComposition) {
|
|
texture->ReadUnlock();
|
|
}
|
|
#endif
|
|
mUnlockAfterComposition.Clear();
|
|
}
|
|
|
|
void
|
|
TextureSourceProvider::UnlockAfterComposition(TextureHost* aTexture)
|
|
{
|
|
mUnlockAfterComposition.AppendElement(aTexture);
|
|
}
|
|
|
|
bool
|
|
TextureSourceProvider::NotifyNotUsedAfterComposition(TextureHost* aTextureHost)
|
|
{
|
|
mNotifyNotUsedAfterComposition.AppendElement(aTextureHost);
|
|
|
|
// If Compositor holds many TextureHosts without compositing,
|
|
// the TextureHosts should be flushed to reduce memory consumption.
|
|
const int thresholdCount = 5;
|
|
const double thresholdSec = 2.0f;
|
|
if (mNotifyNotUsedAfterComposition.Length() > thresholdCount) {
|
|
TimeStamp lastCompositionEndTime = GetLastCompositionEndTime();
|
|
TimeDuration duration = lastCompositionEndTime ? TimeStamp::Now() - lastCompositionEndTime : TimeDuration();
|
|
// Check if we could flush
|
|
if (duration.ToSeconds() > thresholdSec) {
|
|
FlushPendingNotifyNotUsed();
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void
|
|
TextureSourceProvider::FlushPendingNotifyNotUsed()
|
|
{
|
|
for (auto& textureHost : mNotifyNotUsedAfterComposition) {
|
|
textureHost->CallNotifyNotUsed();
|
|
}
|
|
mNotifyNotUsedAfterComposition.Clear();
|
|
}
|
|
|
|
void
|
|
TextureSourceProvider::Destroy()
|
|
{
|
|
ReadUnlockTextures();
|
|
FlushPendingNotifyNotUsed();
|
|
}
|
|
|
|
} // namespace layers
|
|
} // namespace mozilla
|