swiftshader_component_installer.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/cpu.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_path.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_service.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager_observer.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::GpuDataManager;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CRX hash. The extension id is: nhfgdggnnopgbfdlpeoalgcjdgfafocg.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 sha2_hash[] = {0xd7, 0x56, 0x36, 0x6d, 0xde, 0xf6, 0x15, 0x3b,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0xf4, 0xe0, 0xb6, 0x29, 0x36, 0x50, 0x5e, 0x26,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0xbd, 0x77, 0x8b, 0x8e, 0x35, 0xc2, 0x7e, 0x43,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           0x52, 0x47, 0x62, 0xed, 0x12, 0xca, 0xcc, 0x6a};
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// File name of the internal SwiftShader plugin on different platforms.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const FilePath::CharType kSwiftShaderEglName[] =
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_PATH_LITERAL("libegl.dll");
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const FilePath::CharType kSwiftShaderGlesName[] =
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_PATH_LITERAL("libglesv2.dll");
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSwiftShaderManifestName[] = "SwiftShader";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const FilePath::CharType kSwiftShaderBaseDirectory[] =
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_PATH_LITERAL("SwiftShader");
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If we don't have a SwiftShader component, this is the version we claim.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNullVersion[] = "0.0.0.0";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The base directory on windows looks like:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <profile>\AppData\Local\Google\Chrome\User Data\SwiftShader\.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FilePath GetSwiftShaderBaseDirectory() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath result;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(chrome::DIR_USER_DATA, &result);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result.Append(kSwiftShaderBaseDirectory);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SwiftShader has version encoded in the path itself
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so we need to enumerate the directories to find the full path.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On success it returns something like:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <profile>\AppData\Local\Google\Chrome\User Data\SwiftShader\10.3.44.555\.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetLatestSwiftShaderDirectory(FilePath* result,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   Version* latest,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   std::vector<FilePath>* older_dirs) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath base_dir = GetSwiftShaderBaseDirectory();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool found = false;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_util::FileEnumerator
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_enumerator(base_dir, false, file_util::FileEnumerator::DIRECTORIES);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (FilePath path = file_enumerator.Next(); !path.value().empty();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       path = file_enumerator.Next()) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Version version(path.BaseName().MaybeAsASCII());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!version.IsValid())
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (version.CompareTo(*latest) > 0 &&
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_util::PathExists(path.Append(kSwiftShaderEglName)) &&
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_util::PathExists(path.Append(kSwiftShaderGlesName))) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (found && older_dirs)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          older_dirs->push_back(*result);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *latest = version;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = path;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found = true;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (older_dirs)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        older_dirs->push_back(path);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return found;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterSwiftShaderWithChrome(const FilePath& path) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuDataManager::GetInstance()->RegisterSwiftShaderPath(path);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SwiftShaderComponentInstaller : public ComponentInstaller {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SwiftShaderComponentInstaller(const Version& version);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SwiftShaderComponentInstaller() {}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnUpdateError(int error) OVERRIDE;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Install(base::DictionaryValue* manifest,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const FilePath& unpack_path) OVERRIDE;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version current_version_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SwiftShaderComponentInstaller::SwiftShaderComponentInstaller(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Version& version) : current_version_(version) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(version.IsValid());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SwiftShaderComponentInstaller::OnUpdateError(int error) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() << "SwiftShader update error: " << error;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SwiftShaderComponentInstaller::Install(base::DictionaryValue* manifest,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const FilePath& unpack_path) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string name;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest->GetStringASCII("name", &name);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (name != kSwiftShaderManifestName)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string proposed_version;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest->GetStringASCII("version", &proposed_version);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version version(proposed_version.c_str());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!version.IsValid())
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_version_.CompareTo(version) >= 0)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!file_util::PathExists(unpack_path.Append(kSwiftShaderEglName)) ||
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !file_util::PathExists(unpack_path.Append(kSwiftShaderGlesName)))
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Passed the basic tests. Time to install it.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath path =
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetSwiftShaderBaseDirectory().AppendASCII(version.GetString());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (file_util::PathExists(path))
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!file_util::Move(unpack_path, path))
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installation is done. Now tell the rest of chrome.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_version_ = version;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&RegisterSwiftShaderWithChrome, path));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FinishSwiftShaderUpdateRegistration(ComponentUpdateService* cus,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const Version& version) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrxComponent swiftshader;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  swiftshader.name = "Swift Shader";
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  swiftshader.installer = new SwiftShaderComponentInstaller(version);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  swiftshader.version = version;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  swiftshader.pk_hash.assign(sha2_hash, &sha2_hash[sizeof(sha2_hash)]);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cus->RegisterComponent(swiftshader) != ComponentUpdateService::kOk) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "SwiftShader component registration fail";
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UpdateChecker : public content::GpuDataManagerObserver {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit UpdateChecker(ComponentUpdateService* cus);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnGpuInfoUpdate() OVERRIDE;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnVideoMemoryUsageStatsUpdate(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::GPUVideoMemoryUsageStats& video_memory_usage_stats)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          OVERRIDE {}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ComponentUpdateService* cus_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UpdateChecker::UpdateChecker(ComponentUpdateService* cus)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : cus_(cus) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UpdateChecker::OnGpuInfoUpdate() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuDataManager *gpu_data_manager = GpuDataManager::GetInstance();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!gpu_data_manager->GpuAccessAllowed() ||
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (gpu_data_manager->GetBlacklistedFeatures() &
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       content::GPU_FEATURE_TYPE_WEBGL) ||
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gpu_data_manager->ShouldUseSoftwareRendering()) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu_data_manager->RemoveObserver(this);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FilePath path = GetSwiftShaderBaseDirectory();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Version version(kNullVersion);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetLatestSwiftShaderDirectory(&path, &version, NULL);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&FinishSwiftShaderUpdateRegistration, cus_, version));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check if there already is a version of swiftshader installed,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and if so register it.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterSwiftShaderPath(ComponentUpdateService* cus) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath path = GetSwiftShaderBaseDirectory();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!file_util::PathExists(path)) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!file_util::CreateDirectory(path)) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Could not create SwiftShader directory.";
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Version version(kNullVersion);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FilePath> older_dirs;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetLatestSwiftShaderDirectory(&path, &version, &older_dirs))
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&RegisterSwiftShaderWithChrome, path));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateChecker *update_checker = new UpdateChecker(cus);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuDataManager::GetInstance()->AddObserver(update_checker);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  update_checker->OnGpuInfoUpdate();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We leak update_checker here, because it has to stick around for the life
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the GpuDataManager.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove older versions of SwiftShader.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<FilePath>::iterator iter = older_dirs.begin();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != older_dirs.end(); ++iter) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::Delete(*iter, true);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterSwiftShaderComponent(ComponentUpdateService* cus) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_SWIFTSHADER)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::CPU cpu;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cpu.has_sse2())
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&RegisterSwiftShaderPath, cus));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
240