swiftshader_component_installer.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1f75b84e94b1ca1540295584421de0158d87a9b52bsalomon@google.com// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2f75b84e94b1ca1540295584421de0158d87a9b52bsalomon@google.com// Use of this source code is governed by a BSD-style license that can be 3f75b84e94b1ca1540295584421de0158d87a9b52bsalomon@google.com// found in the LICENSE file. 4f75b84e94b1ca1540295584421de0158d87a9b52bsalomon@google.com 5f75b84e94b1ca1540295584421de0158d87a9b52bsalomon@google.com#include "chrome/browser/component_updater/swiftshader_component_installer.h" 6f75b84e94b1ca1540295584421de0158d87a9b52bsalomon@google.com 7f75b84e94b1ca1540295584421de0158d87a9b52bsalomon@google.com#include <string> 8aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include <vector> 9aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 10aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "base/base_paths.h" 119381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com#include "base/bind.h" 12c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com#include "base/compiler_specific.h" 13b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "base/cpu.h" 14aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "base/file_util.h" 15aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "base/files/file_enumerator.h" 16dbeeac33329f5fd7dbd3514cd7189ca6ed080476bsalomon@google.com#include "base/files/file_path.h" 17b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "base/logging.h" 18aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "base/path_service.h" 1912b4e27ae1a29460e91a59f38122483e1faec697sugoi@google.com#include "base/strings/string_util.h" 20aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "base/values.h" 21aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "chrome/browser/component_updater/component_updater_service.h" 2207e1c3fd5030869c480c15ff30d36bd161718262commit-bot@chromium.org#include "components/component_updater/component_updater_paths.h" 234647f9059825c062169d4d454c12640d82ae16c0bsalomon@google.com#include "content/public/browser/browser_thread.h" 24aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "content/public/browser/gpu_data_manager.h" 25aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "content/public/browser/gpu_data_manager_observer.h" 26aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "gpu/config/gpu_feature_type.h" 275383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com 28aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comusing content::BrowserThread; 29aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comusing content::GpuDataManager; 30aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 31ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.comnamespace component_updater { 32ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com 33ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.comnamespace { 34ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com 35ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com// CRX hash. The extension id is: nhfgdggnnopgbfdlpeoalgcjdgfafocg. 36ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.comconst uint8 kSha2Hash[] = {0xd7, 0x56, 0x36, 0x6d, 0xde, 0xf6, 0x15, 0x3b, 37ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com 0xf4, 0xe0, 0xb6, 0x29, 0x36, 0x50, 0x5e, 0x26, 38ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com 0xbd, 0x77, 0x8b, 0x8e, 0x35, 0xc2, 0x7e, 0x43, 39681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com 0x52, 0x47, 0x62, 0xed, 0x12, 0xca, 0xcc, 0x6a}; 40ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com 41aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com// File name of the internal SwiftShader plugin on different platforms. 42aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comconst base::FilePath::CharType kSwiftShaderEglName[] = 43aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com FILE_PATH_LITERAL("libegl.dll"); 44aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comconst base::FilePath::CharType kSwiftShaderGlesName[] = 45aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com FILE_PATH_LITERAL("libglesv2.dll"); 46aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 47681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.comconst char kSwiftShaderManifestName[] = "SwiftShader"; 48681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com 49681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com// If we don't have a SwiftShader component, this is the version we claim. 50681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.comconst char kNullVersion[] = "0.0.0.0"; 51681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com 52681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com// The base directory on windows looks like: 538341eb76fbc54593e873f5589961e02793e7f15fcommit-bot@chromium.org// <profile>\AppData\Local\Google\Chrome\User Data\SwiftShader\. 54aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.combase::FilePath GetSwiftShaderBaseDirectory() { 55aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com base::FilePath result; 56c377baf406996aed18d82d328029c82dbc3b8ddatomhudson@google.com if (!PathService::Get(DIR_SWIFT_SHADER, &result)) 57aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com NOTREACHED() << "Couldn't get SwiftShader directory."; 58aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com return result; 59aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com} 60aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 61aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com// SwiftShader has version encoded in the path itself 62aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com// so we need to enumerate the directories to find the full path. 63aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com// On success it returns something like: 64aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com// <profile>\AppData\Local\Google\Chrome\User Data\SwiftShader\10.3.44.555\. 65aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.combool GetLatestSwiftShaderDirectory(base::FilePath* result, 66aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com Version* latest, 67aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com std::vector<base::FilePath>* older_dirs) { 68aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com base::FilePath base_dir = GetSwiftShaderBaseDirectory(); 69aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com bool found = false; 70aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com base::FileEnumerator file_enumerator( 710e5104c1570de4709e04720e62d80a0ca8970260bsalomon@google.com base_dir, false, base::FileEnumerator::DIRECTORIES); 72aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com for (base::FilePath path = file_enumerator.Next(); !path.value().empty(); 73aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com path = file_enumerator.Next()) { 74aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com Version version(path.BaseName().MaybeAsASCII()); 75aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com if (!version.IsValid()) 76aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com continue; 77aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com if (version.CompareTo(*latest) > 0 && 78aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com base::PathExists(path.Append(kSwiftShaderEglName)) && 79aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com base::PathExists(path.Append(kSwiftShaderGlesName))) { 80aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com if (found && older_dirs) 81aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com older_dirs->push_back(*result); 82aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com *latest = version; 83aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com *result = path; 84aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com found = true; 85aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com } else { 86aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com if (older_dirs) 87aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com older_dirs->push_back(path); 88aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com } 898341eb76fbc54593e873f5589961e02793e7f15fcommit-bot@chromium.org } 90aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com return found; 91aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com} 92aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 93681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.comvoid RegisterSwiftShaderWithChrome(const base::FilePath& path) { 94681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 958341eb76fbc54593e873f5589961e02793e7f15fcommit-bot@chromium.org GpuDataManager::GetInstance()->RegisterSwiftShaderPath(path); 96681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com} 97681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com 98681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.comclass SwiftShaderComponentInstaller : public ComponentInstaller { 99681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com public: 100681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com explicit SwiftShaderComponentInstaller(const Version& version); 101ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com 102ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com virtual ~SwiftShaderComponentInstaller() {} 103ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com 104ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com virtual void OnUpdateError(int error) OVERRIDE; 105681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com 106681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com virtual bool Install(const base::DictionaryValue& manifest, 107ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com const base::FilePath& unpack_path) OVERRIDE; 108681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com 109681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com virtual bool GetInstalledFile(const std::string& file, 110ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com base::FilePath* installed_file) OVERRIDE; 111681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com 112681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com private: 113ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com Version current_version_; 114ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com}; 115ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com 1167475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.comSwiftShaderComponentInstaller::SwiftShaderComponentInstaller( 117ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com const Version& version) 118ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com : current_version_(version) { 119ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com DCHECK(version.IsValid()); 1207475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com} 121ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com 122ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.comvoid SwiftShaderComponentInstaller::OnUpdateError(int error) { 123ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com NOTREACHED() << "SwiftShader update error: " << error; 1247475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com} 125ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com 126ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.combool SwiftShaderComponentInstaller::Install( 127ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com const base::DictionaryValue& manifest, 128ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com const base::FilePath& unpack_path) { 129ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com std::string name; 130ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com manifest.GetStringASCII("name", &name); 131ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com if (name != kSwiftShaderManifestName) 132ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com return false; 133ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com std::string proposed_version; 134ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com manifest.GetStringASCII("version", &proposed_version); 135ada90dac10fa804b49cac9d4e8aa036cb587044frobertphillips@google.com Version version(proposed_version.c_str()); 136681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com if (!version.IsValid()) 137681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com return false; 138681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com if (current_version_.CompareTo(version) >= 0) 139681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com return false; 140681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com if (!base::PathExists(unpack_path.Append(kSwiftShaderEglName)) || 141681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com !base::PathExists(unpack_path.Append(kSwiftShaderGlesName))) 1428341eb76fbc54593e873f5589961e02793e7f15fcommit-bot@chromium.org return false; 143681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com // Passed the basic tests. Time to install it. 144681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com base::FilePath path = 145681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com GetSwiftShaderBaseDirectory().AppendASCII(version.GetString()); 146aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com if (base::PathExists(path)) 147aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com return false; 148aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com if (!base::Move(unpack_path, path)) 149a8a6a32f428e77ee865780ad93bd5f8e1ce3c687bsalomon@google.com return false; 150a8a6a32f428e77ee865780ad93bd5f8e1ce3c687bsalomon@google.com // Installation is done. Now tell the rest of chrome. 151a8a6a32f428e77ee865780ad93bd5f8e1ce3c687bsalomon@google.com current_version_ = version; 152681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com BrowserThread::PostTask(BrowserThread::UI, 153681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com FROM_HERE, 154681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com base::Bind(&RegisterSwiftShaderWithChrome, path)); 155681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com return true; 156681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com} 157681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com 158a8a6a32f428e77ee865780ad93bd5f8e1ce3c687bsalomon@google.combool SwiftShaderComponentInstaller::GetInstalledFile( 159a8a6a32f428e77ee865780ad93bd5f8e1ce3c687bsalomon@google.com const std::string& file, 160c377baf406996aed18d82d328029c82dbc3b8ddatomhudson@google.com base::FilePath* installed_file) { 161681ccf08758d33f6307d8d466bbe8ffe0e8b9312jvanverth@google.com return false; 162aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com} 163aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 164aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comvoid FinishSwiftShaderUpdateRegistration(ComponentUpdateService* cus, 165aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com const Version& version) { 166aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 167aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 168aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com CrxComponent swiftshader; 169aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com swiftshader.name = "Swift Shader"; 170aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com swiftshader.installer = new SwiftShaderComponentInstaller(version); 171aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com swiftshader.version = version; 172aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com swiftshader.pk_hash.assign(kSha2Hash, &kSha2Hash[sizeof(kSha2Hash)]); 173aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com if (cus->RegisterComponent(swiftshader) != ComponentUpdateService::kOk) { 174aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com NOTREACHED() << "SwiftShader component registration fail"; 175aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com } 176aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com} 177aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 178aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comclass UpdateChecker : public content::GpuDataManagerObserver { 179aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com public: 180aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com explicit UpdateChecker(ComponentUpdateService* cus); 18192669014aa7ab821cdc09cc9ad610316eb16b490bsalomon@google.com 182aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com virtual void OnGpuInfoUpdate() OVERRIDE; 183aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 184aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com private: 185aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com ComponentUpdateService* cus_; 186515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org}; 187aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com 188aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comUpdateChecker::UpdateChecker(ComponentUpdateService* cus) : cus_(cus) { 189aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com} 190f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org 191f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.orgvoid UpdateChecker::OnGpuInfoUpdate() { 192f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org GpuDataManager* gpu_data_manager = GpuDataManager::GetInstance(); 193f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org 194f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org if (!gpu_data_manager->GpuAccessAllowed(NULL) || 195f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org gpu_data_manager->IsFeatureBlacklisted(gpu::GPU_FEATURE_TYPE_WEBGL) || 196f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org gpu_data_manager->ShouldUseSwiftShader()) { 197f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org gpu_data_manager->RemoveObserver(this); 198f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 199f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org base::FilePath path = GetSwiftShaderBaseDirectory(); 200f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org 201aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com Version version(kNullVersion); 202aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com GetLatestSwiftShaderDirectory(&path, &version, NULL); 2032ec7280a178ad3dcfd2e645bc330eeb04a84bfcfbsalomon@google.com 2042ec7280a178ad3dcfd2e645bc330eeb04a84bfcfbsalomon@google.com BrowserThread::PostTask( 205aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com BrowserThread::UI, 206aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com FROM_HERE, 2075383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com base::Bind(&FinishSwiftShaderUpdateRegistration, cus_, version)); 2085383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com } 2095383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com} 2103f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com 2115383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com#if defined(ENABLE_SWIFTSHADER) 2123f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com 2135383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com// Check if there already is a version of swiftshader installed, 2145383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com// and if so register it. 2155383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.comvoid RegisterSwiftShaderPath(ComponentUpdateService* cus) { 2165383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 2175383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com base::FilePath path = GetSwiftShaderBaseDirectory(); 2185383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com if (!base::PathExists(path)) { 2195383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com if (!base::CreateDirectory(path)) { 2205383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com NOTREACHED() << "Could not create SwiftShader directory."; 2215383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com return; 2225383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com } 2235383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com } 2245383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com 2255383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com Version version(kNullVersion); 2265383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com std::vector<base::FilePath> older_dirs; 2275383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com if (GetLatestSwiftShaderDirectory(&path, &version, &older_dirs)) 2285383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com BrowserThread::PostTask(BrowserThread::UI, 2293f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com FROM_HERE, 2303f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com base::Bind(&RegisterSwiftShaderWithChrome, path)); 2313f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com 2323f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com UpdateChecker* update_checker = new UpdateChecker(cus); 2333f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com GpuDataManager::GetInstance()->AddObserver(update_checker); 2343f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com update_checker->OnGpuInfoUpdate(); 2353f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com // We leak update_checker here, because it has to stick around for the life 2363f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com // of the GpuDataManager. 2373f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com 2383f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com // Remove older versions of SwiftShader. 2393f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com for (std::vector<base::FilePath>::iterator iter = older_dirs.begin(); 2403f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com iter != older_dirs.end(); 2413f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com ++iter) { 2423f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com base::DeleteFile(*iter, true); 2433f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com } 2445383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com} 2455383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com 2465383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com#endif // ENABLE_SWIFTSHADER 2475383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com 2485383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com} // namespace 2495383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com 2505383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.comvoid RegisterSwiftShaderComponent(ComponentUpdateService* cus) { 2515383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com#if defined(ENABLE_SWIFTSHADER) 2525383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com base::CPU cpu; 2535383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com 2545383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com if (!cpu.has_sse2()) 2555383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com return; 2565383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com BrowserThread::PostTask(BrowserThread::FILE, 2575383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com FROM_HERE, 2585383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com base::Bind(&RegisterSwiftShaderPath, cus)); 2595383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com#endif 2605383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com} 2615383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com 2625383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com} // namespace component_updater 2635383a7525355dec72efa2083aeadffdd09a962b9egdaniel@google.com