Bug 1249640: Part 2 gfxPlatform simplification when it comes to accelerated canvas, using the new blocking. r=gw280

This commit is contained in:
Milan Sreckovic 2016-02-22 14:23:00 +01:00
parent 536d058333
commit 65bcdb7519
5 changed files with 31 additions and 28 deletions

View File

@ -795,10 +795,16 @@ CanvasDrawObserver::FrameEnd()
// If we don't have enough data, don't bother changing...
if (mGPUPreferredCalls > mMinCallsBeforeDecision ||
mSoftwarePreferredCalls > mMinCallsBeforeDecision) {
CanvasRenderingContext2D::RenderingMode switchToMode;
if (mGPUPreferredCalls >= mSoftwarePreferredCalls) {
mCanvasContext->SwitchRenderingMode(CanvasRenderingContext2D::RenderingMode::OpenGLBackendMode);
switchToMode = CanvasRenderingContext2D::RenderingMode::OpenGLBackendMode;
} else {
mCanvasContext->SwitchRenderingMode(CanvasRenderingContext2D::RenderingMode::SoftwareBackendMode);
switchToMode = CanvasRenderingContext2D::RenderingMode::SoftwareBackendMode;
}
if (switchToMode != mCanvasContext->mRenderingMode) {
if (!mCanvasContext->SwitchRenderingMode(switchToMode)) {
gfxDebug() << "Canvas acceleration failed mode switch to " << switchToMode;
}
}
}
@ -968,12 +974,10 @@ CanvasRenderingContext2D::CanvasRenderingContext2D()
sNumLivingContexts++;
// The default is to use OpenGL mode
if (!gfxPlatform::GetPlatform()->UseAcceleratedSkiaCanvas()) {
mRenderingMode = RenderingMode::SoftwareBackendMode;
}
if (gfxPlatform::GetPlatform()->HaveChoiceOfHWAndSWCanvas()) {
if (gfxPlatform::GetPlatform()->UseAcceleratedCanvas()) {
mDrawObserver = new CanvasDrawObserver(this);
} else {
mRenderingMode = RenderingMode::SoftwareBackendMode;
}
}
@ -1208,8 +1212,7 @@ bool CanvasRenderingContext2D::SwitchRenderingMode(RenderingMode aRenderingMode)
#ifdef USE_SKIA_GPU
// Do not attempt to switch into GL mode if the platform doesn't allow it.
if ((aRenderingMode == RenderingMode::OpenGLBackendMode) &&
(!gfxPlatform::GetPlatform()->HaveChoiceOfHWAndSWCanvas() ||
!gfxPlatform::GetPlatform()->UseAcceleratedSkiaCanvas())) {
!gfxPlatform::GetPlatform()->UseAcceleratedCanvas()) {
return false;
}
@ -1416,7 +1419,7 @@ CanvasRenderingContext2D::EnsureTarget(RenderingMode aRenderingMode)
if (layerManager) {
if (mode == RenderingMode::OpenGLBackendMode &&
gfxPlatform::GetPlatform()->UseAcceleratedSkiaCanvas() &&
gfxPlatform::GetPlatform()->UseAcceleratedCanvas() &&
CheckSizeForSkiaGL(size)) {
DemoteOldestContextIfNecessary();
mBufferProvider = nullptr;

View File

@ -64,7 +64,7 @@ function IsAcceleratedSkia() {
try {
var props = Cc["@mozilla.org/gfx/info;1"].getService(SpecialPowers.Ci.nsIGfxInfo).getInfo();
enabled = props.AzureCanvasBackend == "skia" && props.AzureSkiaAccelerated;
enabled = props.AzureCanvasBackend == "skia" && props.AzureCanvasAccelerated;
} catch(e) { }
return enabled;

View File

@ -1207,22 +1207,24 @@ gfxPlatform::SupportsAzureContentForDrawTarget(DrawTarget* aTarget)
return SupportsAzureContentForType(aTarget->GetBackendType());
}
bool
gfxPlatform::UseAcceleratedSkiaCanvas()
bool gfxPlatform::UseAcceleratedCanvas()
{
return gfxPrefs::CanvasAzureAccelerated() &&
mPreferredCanvasBackend == BackendType::SKIA;
}
bool gfxPlatform::HaveChoiceOfHWAndSWCanvas()
{
return mPreferredCanvasBackend == BackendType::SKIA;
// Allow acceleration on Skia if the preference is set, unless it's blocked
if (mPreferredCanvasBackend == BackendType::SKIA && gfxPrefs::CanvasAzureAccelerated()) {
nsCOMPtr<nsIGfxInfo> gfxInfo = do_GetService("@mozilla.org/gfx/info;1");
int32_t status;
return !gfxInfo ||
(NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_CANVAS2D_ACCELERATION,
&status)) &&
status == nsIGfxInfo::FEATURE_STATUS_OK);
}
return false;
}
void
gfxPlatform::InitializeSkiaCacheLimits()
{
if (UseAcceleratedSkiaCanvas()) {
if (UseAcceleratedCanvas()) {
#ifdef USE_SKIA_GPU
bool usingDynamicCache = gfxPrefs::CanvasSkiaGLDynamicCache();
int cacheItemLimit = gfxPrefs::CanvasSkiaGLCacheItems();
@ -1254,7 +1256,7 @@ SkiaGLGlue*
gfxPlatform::GetSkiaGLGlue()
{
#ifdef USE_SKIA_GPU
if (!gfxPlatform::GetPlatform()->UseAcceleratedSkiaCanvas()) {
if (!UseAcceleratedCanvas()) {
gfxCriticalNote << "Accelerated Skia canvas is disabled";
return nullptr;
}

View File

@ -252,15 +252,13 @@ public:
return BackendTypeBit(aType) & mContentBackendBitmask;
}
/// This function lets us know if the current preferences/platform
/// This function also lets us know if the current preferences/platform
/// combination allows for both accelerated and not accelerated canvas
/// implementations. If it does, and other relevant preferences are
/// asking for it, we will examine the commands in the first few seconds
/// of the canvas usage, and potentially change to accelerated or
/// non-accelerated canvas.
virtual bool HaveChoiceOfHWAndSWCanvas();
virtual bool UseAcceleratedSkiaCanvas();
virtual bool UseAcceleratedCanvas();
virtual void InitializeSkiaCacheLimits();
/// These should be used instead of directly accessing the preference,
@ -271,7 +269,7 @@ public:
virtual void GetAzureBackendInfo(mozilla::widget::InfoObject &aObj) {
aObj.DefineProperty("AzureCanvasBackend", GetBackendName(mPreferredCanvasBackend));
aObj.DefineProperty("AzureSkiaAccelerated", UseAcceleratedSkiaCanvas());
aObj.DefineProperty("AzureCanvasAccelerated", UseAcceleratedCanvas());
aObj.DefineProperty("AzureFallbackCanvasBackend", GetBackendName(mFallbackCanvasBackend));
aObj.DefineProperty("AzureContentBackend", GetBackendName(mContentBackend));
}

View File

@ -654,7 +654,7 @@ function BuildConditionSandbox(aURL) {
sandbox.azureQuartz = info.AzureCanvasBackend == "quartz";
sandbox.azureSkia = info.AzureCanvasBackend == "skia";
sandbox.skiaContent = info.AzureContentBackend == "skia";
sandbox.azureSkiaGL = info.AzureSkiaAccelerated; // FIXME: assumes GL right now
sandbox.azureSkiaGL = info.AzureCanvasAccelerated; // FIXME: assumes GL right now
// true if we are using the same Azure backend for rendering canvas and content
sandbox.contentSameGfxBackendAsCanvas = info.AzureContentBackend == info.AzureCanvasBackend
|| (info.AzureContentBackend == "none" && info.AzureCanvasBackend == "cairo");