Bug 1288618 - Part 1: Use gfxVars for CanUseHardwareVideoDecoding so we can access it in the GPU process. r?dvander
MozReview-Commit-ID: LdvDLZICZSQ
--- a/dom/media/mediasource/MediaSource.cpp
+++ b/dom/media/mediasource/MediaSource.cpp
@@ -25,17 +25,17 @@
#include "nsError.h"
#include "nsIRunnable.h"
#include "nsIScriptObjectPrincipal.h"
#include "nsPIDOMWindow.h"
#include "nsString.h"
#include "nsThreadUtils.h"
#include "mozilla/Logging.h"
#include "nsServiceManagerUtils.h"
-#include "gfxPlatform.h"
+#include "mozilla/gfx/gfxVars.h"
#include "mozilla/Sprintf.h"
struct JSContext;
class JSObject;
mozilla::LogModule* GetMediaSourceLog()
{
static mozilla::LazyLogModule sLogModule("MediaSource");
@@ -73,17 +73,17 @@ static const char* const gMediaSourceTyp
// 2. If H264 hardware acceleration is not available.
// 3. The CPU is considered to be fast enough
static bool
IsWebMForced(DecoderDoctorDiagnostics* aDiagnostics)
{
bool mp4supported =
DecoderTraits::IsMP4TypeAndEnabled(NS_LITERAL_CSTRING("video/mp4"),
aDiagnostics);
- bool hwsupported = gfxPlatform::GetPlatform()->CanUseHardwareVideoDecoding();
+ bool hwsupported = gfx::gfxVars::CanUseHardwareVideoDecoding();
return !mp4supported || !hwsupported || VP9Benchmark::IsVP9DecodeFast();
}
namespace dom {
/* static */
nsresult
MediaSource::IsTypeSupported(const nsAString& aType, DecoderDoctorDiagnostics* aDiagnostics)
--- a/dom/media/mediasource/moz.build
+++ b/dom/media/mediasource/moz.build
@@ -36,12 +36,14 @@ UNIFIED_SOURCES += [
TEST_DIRS += [
'gtest',
]
if CONFIG['MOZ_GONK_MEDIACODEC']:
DEFINES['MOZ_GONK_MEDIACODEC'] = True
+include('/ipc/chromium/chromium-config.mozbuild')
+
FINAL_LIBRARY = 'xul'
if CONFIG['GNU_CXX']:
CXXFLAGS += ['-Wno-error=shadow']
--- a/dom/media/platforms/apple/AppleDecoderModule.cpp
+++ b/dom/media/platforms/apple/AppleDecoderModule.cpp
@@ -8,16 +8,17 @@
#include "AppleCMLinker.h"
#include "AppleDecoderModule.h"
#include "AppleVTDecoder.h"
#include "AppleVTLinker.h"
#include "MacIOSurfaceImage.h"
#include "MediaPrefs.h"
#include "mozilla/DebugOnly.h"
#include "mozilla/Logging.h"
+#include "mozilla/gfx/gfxVars.h"
namespace mozilla {
bool AppleDecoderModule::sInitialized = false;
bool AppleDecoderModule::sIsCoreMediaAvailable = false;
bool AppleDecoderModule::sIsVTAvailable = false;
bool AppleDecoderModule::sIsVTHWAvailable = false;
bool AppleDecoderModule::sCanUseHardwareVideoDecoder = true;
@@ -48,17 +49,17 @@ AppleDecoderModule::Init()
// We must link both CM and VideoToolbox framework to allow for proper
// paired Link/Unlink calls
bool haveVideoToolbox = loaded && AppleVTLinker::Link();
sIsVTAvailable = sIsCoreMediaAvailable && haveVideoToolbox;
sIsVTHWAvailable = AppleVTLinker::skPropEnableHWAccel != nullptr;
sCanUseHardwareVideoDecoder = loaded &&
- gfxPlatform::GetPlatform()->CanUseHardwareVideoDecoding();
+ gfx::gfxVars::CanUseHardwareVideoDecoding();
sInitialized = true;
}
nsresult
AppleDecoderModule::Startup()
{
if (!sInitialized || !sIsVTAvailable) {
--- a/dom/media/platforms/wmf/WMFDecoderModule.cpp
+++ b/dom/media/platforms/wmf/WMFDecoderModule.cpp
@@ -14,17 +14,17 @@
#include "WMFMediaDataDecoder.h"
#include "nsAutoPtr.h"
#include "nsIWindowsRegKey.h"
#include "nsComponentManagerUtils.h"
#include "nsServiceManagerUtils.h"
#include "nsIGfxInfo.h"
#include "nsWindowsHelpers.h"
#include "GfxDriverInfo.h"
-#include "gfxWindowsPlatform.h"
+#include "mozilla/gfx/gfxVars.h"
#include "MediaInfo.h"
#include "MediaPrefs.h"
#include "prsystem.h"
#include "mozilla/Maybe.h"
#include "mozilla/StaticMutex.h"
#include "MP4Decoder.h"
#include "VPXDecoder.h"
@@ -44,17 +44,17 @@ WMFDecoderModule::~WMFDecoderModule()
NS_ASSERTION(SUCCEEDED(hr), "MFShutdown failed");
}
}
/* static */
void
WMFDecoderModule::Init()
{
- sDXVAEnabled = gfxPlatform::GetPlatform()->CanUseHardwareVideoDecoding();
+ sDXVAEnabled = gfx::gfxVars::CanUseHardwareVideoDecoding();
}
/* static */
int
WMFDecoderModule::GetNumDecoderThreads()
{
int32_t numCores = PR_GetNumberOfProcessors();
--- a/gfx/config/gfxVars.h
+++ b/gfx/config/gfxVars.h
@@ -24,16 +24,17 @@ class gfxVarReceiver;
#define GFX_VARS_LIST(_) \
/* C++ Name, Data Type, Default Value */ \
_(BrowserTabsRemoteAutostart, bool, false) \
_(ContentBackend, BackendType, BackendType::NONE) \
_(TileSize, IntSize, IntSize(-1, -1)) \
_(UseXRender, bool, false) \
_(OffscreenFormat, gfxImageFormat, mozilla::gfx::SurfaceFormat::X8R8G8B8_UINT32) \
_(RequiresAcceleratedGLContextForCompositorOGL, bool, false) \
+ _(CanUseHardwareVideoDecoding, bool, false) \
/* Add new entries above this line. */
// Some graphics settings are computed on the UI process and must be
// communicated to content and GPU processes. gfxVars helps facilitate
// this. Its function is similar to gfxPrefs, except rather than hold
// user preferences, it holds dynamically computed values.
//
--- a/gfx/layers/ImageContainer.cpp
+++ b/gfx/layers/ImageContainer.cpp
@@ -16,16 +16,17 @@
#include "mozilla/layers/CompositorTypes.h"
#include "mozilla/layers/ImageBridgeChild.h" // for ImageBridgeChild
#include "mozilla/layers/ImageClient.h" // for ImageClient
#include "mozilla/layers/ImageContainerChild.h"
#include "mozilla/layers/LayersMessages.h"
#include "mozilla/layers/SharedPlanarYCbCrImage.h"
#include "mozilla/layers/SharedRGBImage.h"
#include "mozilla/layers/TextureClientRecycleAllocator.h"
+#include "mozilla/gfx/gfxVars.h"
#include "nsISupportsUtils.h" // for NS_IF_ADDREF
#include "YCbCrUtils.h" // for YCbCr conversions
#ifdef MOZ_WIDGET_GONK
#include "GrallocImages.h"
#endif
#if defined(MOZ_WIDGET_GONK) && defined(MOZ_B2G_CAMERA) && defined(MOZ_WEBRTC)
#include "GonkCameraImage.h"
#endif
@@ -498,17 +499,17 @@ RecyclingPlanarYCbCrImage::CopyData(cons
mOrigin = gfx::IntPoint(aData.mPicX, aData.mPicY);
return true;
}
gfxImageFormat
PlanarYCbCrImage::GetOffscreenFormat()
{
return mOffscreenFormat == SurfaceFormat::UNKNOWN ?
- gfxPlatform::GetPlatform()->GetOffscreenFormat() :
+ gfxVars::OffscreenFormat() :
mOffscreenFormat;
}
bool
PlanarYCbCrImage::AdoptData(const Data &aData)
{
mData = aData;
mSize = aData.mPicSize;
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -2087,16 +2087,28 @@ gfxPlatform::OptimalFormatForContent(gfx
* not have any effect until we restart.
*/
static mozilla::Atomic<bool> sLayersSupportsHardwareVideoDecoding(false);
static bool sLayersHardwareVideoDecodingFailed = false;
static bool sBufferRotationCheckPref = true;
static mozilla::Atomic<bool> sLayersAccelerationPrefsInitialized(false);
+void VideoDecodingFailedChangedCallback(const char* aPref, void*)
+{
+ sLayersHardwareVideoDecodingFailed = Preferences::GetBool(aPref, false);
+ gfxPlatform::GetPlatform()->UpdateCanUseHardareVideoDecoding();
+}
+
+void
+gfxPlatform::UpdateCanUseHardareVideoDecoding()
+{
+ gfxVars::SetCanUseHardwareVideoDecoding(CanUseHardwareVideoDecoding());
+}
+
void
gfxPlatform::InitAcceleration()
{
if (sLayersAccelerationPrefsInitialized) {
return;
}
InitCompositorAccelerationPrefs();
@@ -2126,21 +2138,22 @@ gfxPlatform::InitAcceleration()
#endif
NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_HARDWARE_VIDEO_DECODING,
discardFailureId, &status))) {
if (status == nsIGfxInfo::FEATURE_STATUS_OK || gfxPrefs::HardwareVideoDecodingForceEnabled()) {
sLayersSupportsHardwareVideoDecoding = true;
}
}
- Preferences::AddBoolVarCache(&sLayersHardwareVideoDecodingFailed,
- "media.hardware-video-decoding.failed",
- false);
+ if (XRE_IsParentProcess()) {
+ Preferences::RegisterCallbackAndCall(VideoDecodingFailedChangedCallback,
+ "media.hardware-video-decoding.failed",
+ nullptr,
+ Preferences::ExactMatch);
- if (XRE_IsParentProcess()) {
FeatureState& gpuProc = gfxConfig::GetFeature(Feature::GPU_PROCESS);
if (gfxPrefs::GPUProcessDevEnabled()) {
// We want to hide this from about:support, so only set a default if the
// pref is known to be true.
gpuProc.SetDefaultFromPref(
gfxPrefs::GetGPUProcessDevEnabledPrefName(),
true,
gfxPrefs::GetGPUProcessDevEnabledPrefDefault());
--- a/gfx/thebes/gfxPlatform.h
+++ b/gfx/thebes/gfxPlatform.h
@@ -451,17 +451,17 @@ public:
// platform-specific override, by default do nothing
}
// Are we in safe mode?
static bool InSafeMode();
static bool OffMainThreadCompositingEnabled();
- virtual bool CanUseHardwareVideoDecoding();
+ void UpdateCanUseHardareVideoDecoding();
// Returns a prioritized list of all available compositor backends.
void GetCompositorBackends(bool useAcceleration, nsTArray<mozilla::layers::LayersBackend>& aBackends);
/**
* Is it possible to use buffer rotation. Note that these
* check the preference, but also allow for the override to
* disable it using DisableBufferRotation.
@@ -747,16 +747,18 @@ protected:
/**
* Decode the backend enumberation from a string.
*/
static mozilla::gfx::BackendType BackendTypeForName(const nsCString& aName);
static already_AddRefed<mozilla::gfx::ScaledFont>
GetScaledFontForFontWithCairoSkia(mozilla::gfx::DrawTarget* aTarget, gfxFont* aFont);
+ virtual bool CanUseHardwareVideoDecoding();
+
int8_t mAllowDownloadableFonts;
int8_t mGraphiteShapingEnabled;
int8_t mOpenTypeSVGEnabled;
int8_t mBidiNumeralOption;
// whether to always search font cmaps globally
// when doing system font fallback
--- a/gfx/thebes/gfxWindowsPlatform.cpp
+++ b/gfx/thebes/gfxWindowsPlatform.cpp
@@ -375,16 +375,19 @@ gfxWindowsPlatform::InitAcceleration()
InitDWriteSupport();
}
}
bool
gfxWindowsPlatform::CanUseHardwareVideoDecoding()
{
DeviceManagerDx* dm = DeviceManagerDx::Get();
+ if (!dm) {
+ return false;
+ }
if (!gfxPrefs::LayersPreferD3D9() && !dm->TextureSharingWorks()) {
return false;
}
return !dm->IsWARP() && gfxPlatform::CanUseHardwareVideoDecoding();
}
bool
gfxWindowsPlatform::InitDWriteSupport()
@@ -2016,16 +2019,20 @@ gfxWindowsPlatform::ImportGPUDeviceData(
if (d2d1.IsEnabled()) {
d2d1.SetFailed(
FeatureStatus::Unavailable,
"Direct2D requires Direct3D 11 compositing",
NS_LITERAL_CSTRING("FEATURE_FAILURE_D2D_D3D11_COMP"));
}
}
+ // CanUseHardwareVideoDecoding depends on d3d11 state, so update
+ // the cached value now.
+ UpdateCanUseHardareVideoDecoding();
+
// For completeness (and messaging in about:support). Content recomputes this
// on its own, and we won't use ANGLE in the UI process if we're using a GPU
// process.
UpdateANGLEConfig();
}
void
gfxWindowsPlatform::ImportContentDeviceData(const mozilla::gfx::ContentDeviceData& aData)