icecat: add release icecat-140.10.1-1gnu1 for ecne
This commit is contained in:
parent
a5f93cb214
commit
ff85d7c623
1256 changed files with 63469 additions and 24141 deletions
|
|
@ -142,20 +142,18 @@ class SourceSurfaceCanvasRecording final : public gfx::SourceSurface {
|
|||
}
|
||||
|
||||
already_AddRefed<gfx::DataSourceSurface> GetDataSurface() final {
|
||||
EnsureDataSurfaceOnMainThread();
|
||||
MutexAutoLock lock(mDataSurfaceLock);
|
||||
EnsureDataSurfaceOnMainThread(lock);
|
||||
return do_AddRef(mDataSourceSurface);
|
||||
}
|
||||
|
||||
void AttachSurface() { mDetached = false; }
|
||||
void DetachSurface() { mDetached = true; }
|
||||
void DetachSurface(bool aInvalidate = false) {
|
||||
mDetached = true;
|
||||
|
||||
void InvalidateDataSurface() {
|
||||
if (mDataSourceSurface && mMayInvalidate) {
|
||||
// This must be the only reference to the data left.
|
||||
MOZ_ASSERT(mDataSourceSurface->hasOneRef());
|
||||
mDataSourceSurface =
|
||||
gfx::Factory::CopyDataSourceSurface(mDataSourceSurface);
|
||||
mMayInvalidate = false;
|
||||
if (aInvalidate) {
|
||||
MutexAutoLock lock(mDataSurfaceLock);
|
||||
InvalidateDataSurface(lock);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -165,6 +163,10 @@ class SourceSurfaceCanvasRecording final : public gfx::SourceSurface {
|
|||
}
|
||||
|
||||
bool GetSurfaceDescriptor(SurfaceDescriptor& aDesc) final {
|
||||
if (!NS_IsMainThread()) {
|
||||
// Only allow recording surface upload optimization on main thread.
|
||||
return false;
|
||||
}
|
||||
static Atomic<uintptr_t> sNextExportID(0);
|
||||
if (!mExportID) {
|
||||
mExportID = gfx::ReferencePtr(++sNextExportID);
|
||||
|
|
@ -177,11 +179,31 @@ class SourceSurfaceCanvasRecording final : public gfx::SourceSurface {
|
|||
}
|
||||
|
||||
private:
|
||||
void EnsureDataSurfaceOnMainThread() {
|
||||
// The data can only be retrieved on the main thread.
|
||||
if (!mDataSourceSurface && NS_IsMainThread()) {
|
||||
mDataSourceSurface = mCanvasChild->GetDataSurface(
|
||||
mTextureOwnerId, mRecordedSurface, mDetached, mMayInvalidate);
|
||||
void InvalidateDataSurface(const MutexAutoLock& aProofOfLock)
|
||||
MOZ_REQUIRES(mDataSurfaceLock) {
|
||||
// The data is about to be invalidated and must be copied before it is
|
||||
// modified.
|
||||
if (mDataSourceSurface && mMayInvalidate) {
|
||||
mDataSourceSurface =
|
||||
gfx::Factory::CopyDataSourceSurface(mDataSourceSurface);
|
||||
mMayInvalidate = false;
|
||||
}
|
||||
}
|
||||
|
||||
void EnsureDataSurfaceOnMainThread(const MutexAutoLock& aProofOfLock)
|
||||
MOZ_REQUIRES(mDataSurfaceLock) {
|
||||
if (NS_IsMainThread()) {
|
||||
// The data can only be retrieved on the main thread.
|
||||
if (!mDataSourceSurface) {
|
||||
mDataSourceSurface = mCanvasChild->GetDataSurface(
|
||||
mTextureOwnerId, mRecordedSurface, mDetached, mMayInvalidate);
|
||||
}
|
||||
} else {
|
||||
// If data is going to be accessed on another thread, then copy the data
|
||||
// if necessary before access. This avoids the main thread accidentally
|
||||
// trying to invalidate the data surface while the other thread is still
|
||||
// accessing it.
|
||||
InvalidateDataSurface(aProofOfLock);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -207,9 +229,11 @@ class SourceSurfaceCanvasRecording final : public gfx::SourceSurface {
|
|||
RefPtr<gfx::SourceSurface> mRecordedSurface;
|
||||
RefPtr<CanvasChild> mCanvasChild;
|
||||
RefPtr<CanvasDrawEventRecorder> mRecorder;
|
||||
RefPtr<gfx::DataSourceSurface> mDataSourceSurface;
|
||||
Mutex mDataSurfaceLock{"SourceSurfaceCanvasRecording::mDataSurfaceLock"};
|
||||
RefPtr<gfx::DataSourceSurface> mDataSourceSurface
|
||||
MOZ_GUARDED_BY(mDataSurfaceLock);
|
||||
bool mMayInvalidate MOZ_GUARDED_BY(mDataSurfaceLock) = false;
|
||||
bool mDetached = false;
|
||||
bool mMayInvalidate = false;
|
||||
ReferencePtr mExportID;
|
||||
};
|
||||
|
||||
|
|
@ -679,10 +703,7 @@ void CanvasChild::DetachSurface(const RefPtr<gfx::SourceSurface>& aSurface,
|
|||
bool aInvalidate) {
|
||||
if (auto* surface =
|
||||
static_cast<SourceSurfaceCanvasRecording*>(aSurface.get())) {
|
||||
surface->DetachSurface();
|
||||
if (aInvalidate) {
|
||||
surface->InvalidateDataSurface();
|
||||
}
|
||||
surface->DetachSurface(aInvalidate);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue