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