mozilla::ipc::IPCResult GPUParent::RecvInit(nsTArray<GfxPrefSetting>&& prefs, nsTArray<GfxVarUpdate>&& vars, const DevicePrefs& devicePrefs) { const nsTArray<gfxPrefs::Pref*>& globalPrefs = gfxPrefs::all(); for (auto& setting : prefs) { gfxPrefs::Pref* pref = globalPrefs[setting.index()]; pref->SetCachedValue(setting.value()); } for (const auto& var : vars) { gfxVars::ApplyUpdate(var); } // Inherit device preferences. gfxConfig::Inherit(Feature::HW_COMPOSITING, devicePrefs.hwCompositing()); gfxConfig::Inherit(Feature::D3D11_COMPOSITING, devicePrefs.d3d11Compositing()); gfxConfig::Inherit(Feature::D3D9_COMPOSITING, devicePrefs.d3d9Compositing()); gfxConfig::Inherit(Feature::OPENGL_COMPOSITING, devicePrefs.oglCompositing()); gfxConfig::Inherit(Feature::DIRECT2D, devicePrefs.useD2D1()); #if defined(XP_WIN) if (gfxConfig::IsEnabled(Feature::D3D11_COMPOSITING)) { DeviceManagerDx::Get()->CreateCompositorDevices(); } #endif #if defined(MOZ_WIDGET_GTK) char* display_name = PR_GetEnv("DISPLAY"); if (display_name) { int argc = 3; char option_name[] = "--display"; char* argv[] = { // argv0 is unused because g_set_prgname() was called in // XRE_InitChildProcess(). nullptr, option_name, display_name, nullptr }; char** argvp = argv; gtk_init(&argc, &argvp); } else { gtk_init(nullptr, nullptr); } #endif VRManager::ManagerInit(); // Send a message to the UI process that we're done. GPUDeviceData data; RecvGetDeviceStatus(&data); Unused << SendInitComplete(data); Telemetry::AccumulateTimeDelta(Telemetry::GPU_PROCESS_INITIALIZATION_TIME_MS, mLaunchTime); return IPC_OK(); }
void GPUChild::Init() { // Build a list of prefs the GPU process will need. Note that because we // limit the GPU process to prefs contained in gfxPrefs, we can simplify // the message in two ways: one, we only need to send its index in gfxPrefs // rather than its name, and two, we only need to send prefs that don't // have their default value. nsTArray<GfxPrefSetting> prefs; for (auto pref : gfxPrefs::all()) { if (pref->HasDefaultValue()) { continue; } GfxPrefValue value; pref->GetCachedValue(&value); prefs.AppendElement(GfxPrefSetting(pref->Index(), value)); } nsTArray<GfxVarUpdate> updates = gfxVars::FetchNonDefaultVars(); DevicePrefs devicePrefs; devicePrefs.hwCompositing() = gfxConfig::GetValue(Feature::HW_COMPOSITING); devicePrefs.d3d11Compositing() = gfxConfig::GetValue(Feature::D3D11_COMPOSITING); devicePrefs.oglCompositing() = gfxConfig::GetValue(Feature::OPENGL_COMPOSITING); devicePrefs.useD2D1() = gfxConfig::GetValue(Feature::DIRECT2D); nsTArray<LayerTreeIdMapping> mappings; LayerTreeOwnerTracker::Get()->Iterate([&](uint64_t aLayersId, base::ProcessId aProcessId) { mappings.AppendElement(LayerTreeIdMapping(aLayersId, aProcessId)); }); SendInit(prefs, updates, devicePrefs, mappings); gfxVars::AddReceiver(this); #ifdef MOZ_GECKO_PROFILER Unused << SendInitProfiler(ProfilerParent::CreateForProcess(OtherPid())); #endif }
mozilla::ipc::IPCResult GPUParent::RecvInit(nsTArray<GfxPrefSetting>&& prefs, nsTArray<GfxVarUpdate>&& vars, const DevicePrefs& devicePrefs, nsTArray<LayerTreeIdMapping>&& aMappings) { const nsTArray<gfxPrefs::Pref*>& globalPrefs = gfxPrefs::all(); for (auto& setting : prefs) { gfxPrefs::Pref* pref = globalPrefs[setting.index()]; pref->SetCachedValue(setting.value()); } for (const auto& var : vars) { gfxVars::ApplyUpdate(var); } // Inherit device preferences. gfxConfig::Inherit(Feature::HW_COMPOSITING, devicePrefs.hwCompositing()); gfxConfig::Inherit(Feature::D3D11_COMPOSITING, devicePrefs.d3d11Compositing()); gfxConfig::Inherit(Feature::OPENGL_COMPOSITING, devicePrefs.oglCompositing()); gfxConfig::Inherit(Feature::ADVANCED_LAYERS, devicePrefs.advancedLayers()); gfxConfig::Inherit(Feature::DIRECT2D, devicePrefs.useD2D1()); for (const LayerTreeIdMapping& map : aMappings) { LayerTreeOwnerTracker::Get()->Map(map.layersId(), map.ownerId()); } #if defined(XP_WIN) if (gfxConfig::IsEnabled(Feature::D3D11_COMPOSITING)) { DeviceManagerDx::Get()->CreateCompositorDevices(); } if (gfxVars::UseWebRender()) { // Ensure to initialize GfxInfo services::GetGfxInfo(); Factory::EnsureDWriteFactory(); } #endif #if defined(MOZ_WIDGET_GTK) char* display_name = PR_GetEnv("DISPLAY"); if (display_name) { int argc = 3; char option_name[] = "--display"; char* argv[] = { // argv0 is unused because g_set_prgname() was called in // XRE_InitChildProcess(). nullptr, option_name, display_name, nullptr }; char** argvp = argv; gtk_init(&argc, &argvp); } else { gtk_init(nullptr, nullptr); } // Ensure we have an FT library for font instantiation. // This would normally be set by gfxPlatform::Init(). // Since we bypass that, we must do it here instead. if (gfxVars::UseWebRender()) { FT_Library library = Factory::NewFTLibrary(); MOZ_ASSERT(library); Factory::SetFTLibrary(library); } #endif // Make sure to do this *after* we update gfxVars above. if (gfxVars::UseWebRender()) { wr::WebRenderAPI::InitExternalLogHandler(); wr::RenderThread::Start(); } VRManager::ManagerInit(); // Send a message to the UI process that we're done. GPUDeviceData data; RecvGetDeviceStatus(&data); Unused << SendInitComplete(data); Telemetry::AccumulateTimeDelta(Telemetry::GPU_PROCESS_INITIALIZATION_TIME_MS, mLaunchTime); return IPC_OK(); }