mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 823610: Make discarding GL contexts of foreground pages on memory pressure pref-able, and pref off for b2g. r=jgilbert,jlebar
This commit is contained in:
parent
25eb36e582
commit
90fdd69121
@ -615,3 +615,7 @@ pref("wap.UAProf.tagname", "x-wap-profile");
|
|||||||
|
|
||||||
// Wait up to this much milliseconds when orientation changed
|
// Wait up to this much milliseconds when orientation changed
|
||||||
pref("layers.orientation.sync.timeout", 1000);
|
pref("layers.orientation.sync.timeout", 1000);
|
||||||
|
|
||||||
|
// Don't discard WebGL contexts for foreground apps on memory
|
||||||
|
// pressure.
|
||||||
|
pref("webgl.can-lose-context-in-foreground", false);
|
||||||
|
@ -45,12 +45,14 @@
|
|||||||
#include "mozilla/Services.h"
|
#include "mozilla/Services.h"
|
||||||
#include "mozilla/dom/WebGLRenderingContextBinding.h"
|
#include "mozilla/dom/WebGLRenderingContextBinding.h"
|
||||||
#include "mozilla/dom/BindingUtils.h"
|
#include "mozilla/dom/BindingUtils.h"
|
||||||
|
#include "mozilla/dom/ipc/ProcessPriorityManager.h"
|
||||||
|
|
||||||
#include "Layers.h"
|
#include "Layers.h"
|
||||||
|
|
||||||
using namespace mozilla;
|
using namespace mozilla;
|
||||||
using namespace mozilla::gl;
|
using namespace mozilla::gl;
|
||||||
using namespace mozilla::dom;
|
using namespace mozilla::dom;
|
||||||
|
using namespace mozilla::dom::ipc;
|
||||||
using namespace mozilla::layers;
|
using namespace mozilla::layers;
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
@ -63,7 +65,10 @@ WebGLMemoryPressureObserver::Observe(nsISupports* aSubject,
|
|||||||
|
|
||||||
bool wantToLoseContext = true;
|
bool wantToLoseContext = true;
|
||||||
|
|
||||||
if (!nsCRT::strcmp(aSomeData, NS_LITERAL_STRING("heap-minimize").get()))
|
if (!mContext->mCanLoseContextInForeground && CurrentProcessIsForeground())
|
||||||
|
wantToLoseContext = false;
|
||||||
|
else if (!nsCRT::strcmp(aSomeData,
|
||||||
|
NS_LITERAL_STRING("heap-minimize").get()))
|
||||||
wantToLoseContext = mContext->mLoseContextOnHeapMinimize;
|
wantToLoseContext = mContext->mLoseContextOnHeapMinimize;
|
||||||
|
|
||||||
if (wantToLoseContext)
|
if (wantToLoseContext)
|
||||||
@ -179,6 +184,7 @@ WebGLContext::WebGLContext()
|
|||||||
mContextStatus = ContextStable;
|
mContextStatus = ContextStable;
|
||||||
mContextLostErrorSet = false;
|
mContextLostErrorSet = false;
|
||||||
mLoseContextOnHeapMinimize = false;
|
mLoseContextOnHeapMinimize = false;
|
||||||
|
mCanLoseContextInForeground = true;
|
||||||
|
|
||||||
mAlreadyGeneratedWarnings = 0;
|
mAlreadyGeneratedWarnings = 0;
|
||||||
mAlreadyWarnedAboutFakeVertexAttrib0 = false;
|
mAlreadyWarnedAboutFakeVertexAttrib0 = false;
|
||||||
|
@ -843,6 +843,7 @@ protected:
|
|||||||
bool mHasRobustness;
|
bool mHasRobustness;
|
||||||
bool mIsMesa;
|
bool mIsMesa;
|
||||||
bool mLoseContextOnHeapMinimize;
|
bool mLoseContextOnHeapMinimize;
|
||||||
|
bool mCanLoseContextInForeground;
|
||||||
|
|
||||||
template<typename WebGLObjectType>
|
template<typename WebGLObjectType>
|
||||||
void DeleteWebGLObjectsArray(nsTArray<WebGLObjectType>& array);
|
void DeleteWebGLObjectsArray(nsTArray<WebGLObjectType>& array);
|
||||||
|
@ -858,6 +858,7 @@ WebGLContext::InitAndValidateGL()
|
|||||||
mMinCapability = Preferences::GetBool("webgl.min_capability_mode", false);
|
mMinCapability = Preferences::GetBool("webgl.min_capability_mode", false);
|
||||||
mDisableExtensions = Preferences::GetBool("webgl.disable-extensions", false);
|
mDisableExtensions = Preferences::GetBool("webgl.disable-extensions", false);
|
||||||
mLoseContextOnHeapMinimize = Preferences::GetBool("webgl.lose-context-on-heap-minimize", false);
|
mLoseContextOnHeapMinimize = Preferences::GetBool("webgl.lose-context-on-heap-minimize", false);
|
||||||
|
mCanLoseContextInForeground = Preferences::GetBool("webgl.can-lose-context-in-foreground", true);
|
||||||
|
|
||||||
mActiveTexture = 0;
|
mActiveTexture = 0;
|
||||||
mWebGLError = LOCAL_GL_NO_ERROR;
|
mWebGLError = LOCAL_GL_NO_ERROR;
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
* 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/. */
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include "mozilla/ClearOnShutdown.h"
|
||||||
#include "mozilla/dom/ipc/ProcessPriorityManager.h"
|
#include "mozilla/dom/ipc/ProcessPriorityManager.h"
|
||||||
#include "mozilla/dom/ContentChild.h"
|
#include "mozilla/dom/ContentChild.h"
|
||||||
#include "mozilla/dom/TabChild.h"
|
#include "mozilla/dom/TabChild.h"
|
||||||
@ -26,6 +27,7 @@
|
|||||||
#include "nsIDOMEventTarget.h"
|
#include "nsIDOMEventTarget.h"
|
||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
#include "nsPIDOMWindow.h"
|
#include "nsPIDOMWindow.h"
|
||||||
|
#include "StaticPtr.h"
|
||||||
|
|
||||||
#ifdef XP_WIN
|
#ifdef XP_WIN
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
@ -42,6 +44,8 @@ namespace ipc {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
static bool sInitialized = false;
|
static bool sInitialized = false;
|
||||||
|
class ProcessPriorityManager;
|
||||||
|
static StaticRefPtr<ProcessPriorityManager> sManager;
|
||||||
|
|
||||||
// Some header defines a LOG macro, but we don't want it here.
|
// Some header defines a LOG macro, but we don't want it here.
|
||||||
#ifdef LOG
|
#ifdef LOG
|
||||||
@ -127,6 +131,8 @@ public:
|
|||||||
NS_DECL_NSIOBSERVER
|
NS_DECL_NSIOBSERVER
|
||||||
NS_DECL_NSIDOMEVENTLISTENER
|
NS_DECL_NSIDOMEVENTLISTENER
|
||||||
|
|
||||||
|
ProcessPriority GetPriority() const { return mProcessPriority; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void SetPriority(ProcessPriority aPriority);
|
void SetPriority(ProcessPriority aPriority);
|
||||||
void OnContentDocumentGlobalCreated(nsISupports* aOuterWindow);
|
void OnContentDocumentGlobalCreated(nsISupports* aOuterWindow);
|
||||||
@ -389,9 +395,15 @@ InitProcessPriorityManager()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This object is held alive by the observer service.
|
sManager = new ProcessPriorityManager();
|
||||||
nsRefPtr<ProcessPriorityManager> mgr = new ProcessPriorityManager();
|
sManager->Init();
|
||||||
mgr->Init();
|
ClearOnShutdown(&sManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CurrentProcessIsForeground()
|
||||||
|
{
|
||||||
|
return sManager->GetPriority() >= PROCESS_PRIORITY_FOREGROUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ipc
|
} // namespace ipc
|
||||||
|
@ -26,6 +26,13 @@ namespace ipc {
|
|||||||
*/
|
*/
|
||||||
void InitProcessPriorityManager();
|
void InitProcessPriorityManager();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* True iff the current process has foreground or higher priority as
|
||||||
|
* computed by DOM visibility. The returned answer may not match the
|
||||||
|
* actual OS process priority, for short intervals.
|
||||||
|
*/
|
||||||
|
bool CurrentProcessIsForeground();
|
||||||
|
|
||||||
} // namespace ipc
|
} // namespace ipc
|
||||||
} // namespace dom
|
} // namespace dom
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
@ -70,6 +70,9 @@ typedef Observer<SwitchEvent> SwitchObserver;
|
|||||||
enum ProcessPriority {
|
enum ProcessPriority {
|
||||||
PROCESS_PRIORITY_BACKGROUND,
|
PROCESS_PRIORITY_BACKGROUND,
|
||||||
PROCESS_PRIORITY_BACKGROUND_HOMESCREEN,
|
PROCESS_PRIORITY_BACKGROUND_HOMESCREEN,
|
||||||
|
// Any priority greater than or equal to FOREGROUND is considered
|
||||||
|
// "foreground" for the purposes of priority testing, for example
|
||||||
|
// CurrentProcessIsForeground().
|
||||||
PROCESS_PRIORITY_FOREGROUND,
|
PROCESS_PRIORITY_FOREGROUND,
|
||||||
PROCESS_PRIORITY_MASTER,
|
PROCESS_PRIORITY_MASTER,
|
||||||
NUM_PROCESS_PRIORITY
|
NUM_PROCESS_PRIORITY
|
||||||
|
@ -3706,6 +3706,7 @@ pref("webgl.prefer-16bpp", false);
|
|||||||
pref("webgl.default-no-alpha", false);
|
pref("webgl.default-no-alpha", false);
|
||||||
pref("webgl.force-layers-readback", false);
|
pref("webgl.force-layers-readback", false);
|
||||||
pref("webgl.lose-context-on-heap-minimize", false);
|
pref("webgl.lose-context-on-heap-minimize", false);
|
||||||
|
pref("webgl.can-lose-context-in-foreground", true);
|
||||||
|
|
||||||
// Stagefright prefs
|
// Stagefright prefs
|
||||||
pref("stagefright.force-enabled", false);
|
pref("stagefright.force-enabled", false);
|
||||||
|
Loading…
Reference in New Issue
Block a user