swiftshader_component_installer.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/swiftshader_component_installer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/cpu.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager_observer.h"
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_feature_type.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::GpuDataManager;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CRX hash. The extension id is: nhfgdggnnopgbfdlpeoalgcjdgfafocg.
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const uint8 kSha2Hash[] = {0xd7, 0x56, 0x36, 0x6d, 0xde, 0xf6, 0x15, 0x3b,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0xf4, 0xe0, 0xb6, 0x29, 0x36, 0x50, 0x5e, 0x26,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0xbd, 0x77, 0x8b, 0x8e, 0x35, 0xc2, 0x7e, 0x43,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x52, 0x47, 0x62, 0xed, 0x12, 0xca, 0xcc, 0x6a};
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// File name of the internal SwiftShader plugin on different platforms.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kSwiftShaderEglName[] =
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_PATH_LITERAL("libegl.dll");
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kSwiftShaderGlesName[] =
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_PATH_LITERAL("libglesv2.dll");
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSwiftShaderManifestName[] = "SwiftShader";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kSwiftShaderBaseDirectory[] =
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_PATH_LITERAL("SwiftShader");
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If we don't have a SwiftShader component, this is the version we claim.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNullVersion[] = "0.0.0.0";
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The base directory on windows looks like:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <profile>\AppData\Local\Google\Chrome\User Data\SwiftShader\.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetSwiftShaderBaseDirectory() {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath result;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(chrome::DIR_USER_DATA, &result);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result.Append(kSwiftShaderBaseDirectory);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SwiftShader has version encoded in the path itself
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so we need to enumerate the directories to find the full path.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On success it returns something like:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <profile>\AppData\Local\Google\Chrome\User Data\SwiftShader\10.3.44.555\.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetLatestSwiftShaderDirectory(base::FilePath* result,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   Version* latest,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   std::vector<base::FilePath>* older_dirs) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath base_dir = GetSwiftShaderBaseDirectory();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool found = false;
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::FileEnumerator
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      file_enumerator(base_dir, false, base::FileEnumerator::DIRECTORIES);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (base::FilePath path = file_enumerator.Next(); !path.value().empty();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       path = file_enumerator.Next()) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Version version(path.BaseName().MaybeAsASCII());
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!version.IsValid())
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (version.CompareTo(*latest) > 0 &&
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_util::PathExists(path.Append(kSwiftShaderEglName)) &&
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_util::PathExists(path.Append(kSwiftShaderGlesName))) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (found && older_dirs)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          older_dirs->push_back(*result);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *latest = version;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = path;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found = true;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (older_dirs)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        older_dirs->push_back(path);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return found;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RegisterSwiftShaderWithChrome(const base::FilePath& path) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuDataManager::GetInstance()->RegisterSwiftShaderPath(path);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SwiftShaderComponentInstaller : public ComponentInstaller {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SwiftShaderComponentInstaller(const Version& version);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SwiftShaderComponentInstaller() {}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnUpdateError(int error) OVERRIDE;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Install(const base::DictionaryValue& manifest,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const base::FilePath& unpack_path) OVERRIDE;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool GetInstalledFile(const std::string& file,
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                base::FilePath* installed_file) OVERRIDE;
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version current_version_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SwiftShaderComponentInstaller::SwiftShaderComponentInstaller(
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Version& version) : current_version_(version) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(version.IsValid());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SwiftShaderComponentInstaller::OnUpdateError(int error) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() << "SwiftShader update error: " << error;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool SwiftShaderComponentInstaller::Install(
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::DictionaryValue& manifest,
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& unpack_path) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string name;
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manifest.GetStringASCII("name", &name);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (name != kSwiftShaderManifestName)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string proposed_version;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manifest.GetStringASCII("version", &proposed_version);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version version(proposed_version.c_str());
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!version.IsValid())
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_version_.CompareTo(version) >= 0)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!file_util::PathExists(unpack_path.Append(kSwiftShaderEglName)) ||
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !file_util::PathExists(unpack_path.Append(kSwiftShaderGlesName)))
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Passed the basic tests. Time to install it.
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path =
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetSwiftShaderBaseDirectory().AppendASCII(version.GetString());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (file_util::PathExists(path))
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!base::Move(unpack_path, path))
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installation is done. Now tell the rest of chrome.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_version_ = version;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&RegisterSwiftShaderWithChrome, path));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool SwiftShaderComponentInstaller::GetInstalledFile(
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string& file, base::FilePath* installed_file) {
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return false;
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FinishSwiftShaderUpdateRegistration(ComponentUpdateService* cus,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const Version& version) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent swiftshader;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  swiftshader.name = "Swift Shader";
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  swiftshader.installer = new SwiftShaderComponentInstaller(version);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  swiftshader.version = version;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  swiftshader.pk_hash.assign(kSha2Hash, &kSha2Hash[sizeof(kSha2Hash)]);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cus->RegisterComponent(swiftshader) != ComponentUpdateService::kOk) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "SwiftShader component registration fail";
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UpdateChecker : public content::GpuDataManagerObserver {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit UpdateChecker(ComponentUpdateService* cus);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnGpuInfoUpdate() OVERRIDE;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ComponentUpdateService* cus_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UpdateChecker::UpdateChecker(ComponentUpdateService* cus)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : cus_(cus) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UpdateChecker::OnGpuInfoUpdate() {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuDataManager *gpu_data_manager = GpuDataManager::GetInstance();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!gpu_data_manager->GpuAccessAllowed(NULL) ||
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gpu_data_manager->IsFeatureBlacklisted(gpu::GPU_FEATURE_TYPE_WEBGL) ||
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gpu_data_manager->ShouldUseSwiftShader()) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu_data_manager->RemoveObserver(this);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path = GetSwiftShaderBaseDirectory();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Version version(kNullVersion);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetLatestSwiftShaderDirectory(&path, &version, NULL);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&FinishSwiftShaderUpdateRegistration, cus_, version));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check if there already is a version of swiftshader installed,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and if so register it.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterSwiftShaderPath(ComponentUpdateService* cus) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path = GetSwiftShaderBaseDirectory();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!file_util::PathExists(path)) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!file_util::CreateDirectory(path)) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Could not create SwiftShader directory.";
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version version(kNullVersion);
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::FilePath> older_dirs;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetLatestSwiftShaderDirectory(&path, &version, &older_dirs))
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&RegisterSwiftShaderWithChrome, path));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateChecker *update_checker = new UpdateChecker(cus);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuDataManager::GetInstance()->AddObserver(update_checker);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  update_checker->OnGpuInfoUpdate();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We leak update_checker here, because it has to stick around for the life
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the GpuDataManager.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove older versions of SwiftShader.
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::vector<base::FilePath>::iterator iter = older_dirs.begin();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != older_dirs.end(); ++iter) {
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::Delete(*iter, true);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterSwiftShaderComponent(ComponentUpdateService* cus) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_SWIFTSHADER)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::CPU cpu;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cpu.has_sse2())
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&RegisterSwiftShaderPath, cus));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
247