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) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <stdint.h> 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <string> 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <vector> 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/component_updater/component_updater_paths.h" 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/component_updater/component_updater_service.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager_observer.h" 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_feature_type.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::GpuDataManager; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace component_updater { 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CRX hash. The extension id is: nhfgdggnnopgbfdlpeoalgcjdgfafocg. 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst uint8_t kSha2Hash[] = {0xd7, 0x56, 0x36, 0x6d, 0xde, 0xf6, 0x15, 0x3b, 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0xf4, 0xe0, 0xb6, 0x29, 0x36, 0x50, 0x5e, 0x26, 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0xbd, 0x77, 0x8b, 0x8e, 0x35, 0xc2, 0x7e, 0x43, 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0x52, 0x47, 0x62, 0xed, 0x12, 0xca, 0xcc, 0x6a}; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// File name of the internal SwiftShader plugin on different platforms. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kSwiftShaderEglName[] = 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("libegl.dll"); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kSwiftShaderGlesName[] = 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("libglesv2.dll"); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSwiftShaderManifestName[] = "SwiftShader"; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If we don't have a SwiftShader component, this is the version we claim. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNullVersion[] = "0.0.0.0"; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The base directory on windows looks like: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <profile>\AppData\Local\Google\Chrome\User Data\SwiftShader\. 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetSwiftShaderBaseDirectory() { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath result; 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!PathService::Get(DIR_SWIFT_SHADER, &result)) 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED() << "Couldn't get SwiftShader directory."; 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return result; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SwiftShader has version encoded in the path itself 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so we need to enumerate the directories to find the full path. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On success it returns something like: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <profile>\AppData\Local\Google\Chrome\User Data\SwiftShader\10.3.44.555\. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetLatestSwiftShaderDirectory(base::FilePath* result, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version* latest, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::FilePath>* older_dirs) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath base_dir = GetSwiftShaderBaseDirectory(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found = false; 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FileEnumerator file_enumerator( 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base_dir, false, base::FileEnumerator::DIRECTORIES); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::FilePath path = file_enumerator.Next(); !path.value().empty(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = file_enumerator.Next()) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version version(path.BaseName().MaybeAsASCII()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!version.IsValid()) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (version.CompareTo(*latest) > 0 && 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::PathExists(path.Append(kSwiftShaderEglName)) && 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::PathExists(path.Append(kSwiftShaderGlesName))) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found && older_dirs) 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) older_dirs->push_back(*result); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *latest = version; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = path; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = true; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (older_dirs) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) older_dirs->push_back(path); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return found; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RegisterSwiftShaderWithChrome(const base::FilePath& path) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuDataManager::GetInstance()->RegisterSwiftShaderPath(path); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SwiftShaderComponentInstaller : public ComponentInstaller { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SwiftShaderComponentInstaller(const Version& version); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SwiftShaderComponentInstaller() {} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnUpdateError(int error) OVERRIDE; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool Install(const base::DictionaryValue& manifest, 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& unpack_path) OVERRIDE; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual bool GetInstalledFile(const std::string& file, 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath* installed_file) OVERRIDE; 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version current_version_; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SwiftShaderComponentInstaller::SwiftShaderComponentInstaller( 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const Version& version) 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : current_version_(version) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(version.IsValid()); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SwiftShaderComponentInstaller::OnUpdateError(int error) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "SwiftShader update error: " << error; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool SwiftShaderComponentInstaller::Install( 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue& manifest, 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& unpack_path) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manifest.GetStringASCII("name", &name); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name != kSwiftShaderManifestName) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string proposed_version; 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manifest.GetStringASCII("version", &proposed_version); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version version(proposed_version.c_str()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!version.IsValid()) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_version_.CompareTo(version) >= 0) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(unpack_path.Append(kSwiftShaderEglName)) || 1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !base::PathExists(unpack_path.Append(kSwiftShaderGlesName))) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Passed the basic tests. Time to install it. 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path = 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSwiftShaderBaseDirectory().AppendASCII(version.GetString()); 1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (base::PathExists(path)) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!base::Move(unpack_path, path)) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Installation is done. Now tell the rest of chrome. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_version_ = version; 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&RegisterSwiftShaderWithChrome, path)); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool SwiftShaderComponentInstaller::GetInstalledFile( 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& file, 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath* installed_file) { 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FinishSwiftShaderUpdateRegistration(ComponentUpdateService* cus, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Version& version) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxComponent swiftshader; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) swiftshader.name = "Swift Shader"; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) swiftshader.installer = new SwiftShaderComponentInstaller(version); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) swiftshader.version = version; 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) swiftshader.pk_hash.assign(kSha2Hash, &kSha2Hash[sizeof(kSha2Hash)]); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cus->RegisterComponent(swiftshader) != ComponentUpdateService::kOk) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "SwiftShader component registration fail"; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UpdateChecker : public content::GpuDataManagerObserver { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit UpdateChecker(ComponentUpdateService* cus); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGpuInfoUpdate() OVERRIDE; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComponentUpdateService* cus_; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)UpdateChecker::UpdateChecker(ComponentUpdateService* cus) : cus_(cus) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UpdateChecker::OnGpuInfoUpdate() { 192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GpuDataManager* gpu_data_manager = GpuDataManager::GetInstance(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!gpu_data_manager->GpuAccessAllowed(NULL) || 19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gpu_data_manager->IsFeatureBlacklisted(gpu::GPU_FEATURE_TYPE_WEBGL) || 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gpu_data_manager->ShouldUseSwiftShader()) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_data_manager->RemoveObserver(this); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path = GetSwiftShaderBaseDirectory(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version version(kNullVersion); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLatestSwiftShaderDirectory(&path, &version, NULL); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::PostTask( 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::UI, 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&FinishSwiftShaderUpdateRegistration, cus_, version)); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_SWIFTSHADER) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check if there already is a version of swiftshader installed, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and if so register it. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterSwiftShaderPath(ComponentUpdateService* cus) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path = GetSwiftShaderBaseDirectory(); 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(path)) { 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!base::CreateDirectory(path)) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Could not create SwiftShader directory."; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Version version(kNullVersion); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::FilePath> older_dirs; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetLatestSwiftShaderDirectory(&path, &version, &older_dirs)) 228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, 229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, 230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&RegisterSwiftShaderWithChrome, path)); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) UpdateChecker* update_checker = new UpdateChecker(cus); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuDataManager::GetInstance()->AddObserver(update_checker); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_checker->OnGpuInfoUpdate(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We leak update_checker here, because it has to stick around for the life 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the GpuDataManager. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove older versions of SwiftShader. 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::vector<base::FilePath>::iterator iter = older_dirs.begin(); 240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) iter != older_dirs.end(); 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ++iter) { 2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DeleteFile(*iter, true); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // ENABLE_SWIFTSHADER 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterSwiftShaderComponent(ComponentUpdateService* cus) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_SWIFTSHADER) 252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::FILE, 253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, 254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&RegisterSwiftShaderPath, cus)); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace component_updater 259