blob: 96e5ad6f0c5e8a0980f00911be11ab9bd3676fdc [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "flutter/impeller/playground/backend/vulkan/swiftshader_utilities.h"
#include <cstdlib>
#include "flutter/fml/build_config.h"
#include "flutter/fml/file.h"
#include "flutter/fml/logging.h"
#include "flutter/fml/paths.h"
#if FML_OS_WIN
#include <Windows.h>
#endif // FML_OS_WIN
namespace impeller {
static void FindSwiftShaderICDAtKnownPaths() {
static constexpr const char* kSwiftShaderICDJSON = "vk_swiftshader_icd.json";
static constexpr const char* kVulkanICDFileNamesEnvVariableKey =
"VK_ICD_FILENAMES";
const auto executable_directory_path =
fml::paths::GetExecutableDirectoryPath();
FML_CHECK(executable_directory_path.first);
const auto executable_directory =
fml::OpenDirectory(executable_directory_path.second.c_str(), false,
fml::FilePermission::kRead);
FML_CHECK(executable_directory.is_valid());
if (fml::FileExists(executable_directory, kSwiftShaderICDJSON)) {
const auto icd_path = fml::paths::JoinPaths(
{executable_directory_path.second, kSwiftShaderICDJSON});
#if FML_OS_WIN
const auto success =
::SetEnvironmentVariableA(kVulkanICDFileNamesEnvVariableKey, //
icd_path.c_str() //
) != 0;
#else // FML_OS_WIN
const auto success = ::setenv(kVulkanICDFileNamesEnvVariableKey, //
icd_path.c_str(), //
1 // overwrite
) == 0;
#endif // FML_OS_WIN
FML_CHECK(success)
<< "Could not set the environment variable to use SwiftShader.";
} else {
FML_CHECK(false)
<< "Was asked to use SwiftShader but could not find the installable "
"client driver (ICD) for the locally built SwiftShader.";
}
}
void SetupSwiftshaderOnce(bool use_swiftshader) {
static bool swiftshader_preference = false;
static std::once_flag sOnceInitializer;
std::call_once(sOnceInitializer, [use_swiftshader]() {
if (use_swiftshader) {
FindSwiftShaderICDAtKnownPaths();
swiftshader_preference = use_swiftshader;
}
});
FML_CHECK(swiftshader_preference == use_swiftshader)
<< "The option to use SwiftShader in a process can only be set once and "
"may not be changed later.";
}
} // namespace impeller