Commit e74bf973 authored by Peng Huang's avatar Peng Huang Committed by Commit Bot

Android: Fix --use-vulkan problem

Bug: 1012878
Change-Id: I9c4c887d9fb5465d38da1cabbe1b52437235f948
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1863468Reviewed-by: default avatarKen Buchanan <kenrb@chromium.org>
Reviewed-by: default avatarVasiliy Telezhnikov <vasilyt@chromium.org>
Commit-Queue: Peng Huang <penghuang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#706223}
parent dd851d50
......@@ -160,7 +160,7 @@ GpuPreferences ParseGpuPreferences(const base::CommandLine* command_line) {
<< "--enabled-features=Vulkan is overrided by --use-vulkan.";
auto value = command_line->GetSwitchValueASCII(switches::kUseVulkan);
if (value.empty() || value == switches::kVulkanImplementationNameNative) {
gpu_preferences.use_vulkan = VulkanImplementationName::kNative;
gpu_preferences.use_vulkan = VulkanImplementationName::kForcedNative;
} else if (value == switches::kVulkanImplementationNameSwiftshader) {
gpu_preferences.use_vulkan = VulkanImplementationName::kSwiftshader;
} else {
......
......@@ -32,7 +32,8 @@ const size_t kLowEndMaxProgramCacheMemoryBytes = 128 * 1024;
enum class VulkanImplementationName : uint32_t {
kNone = 0,
kNative = 1,
kSwiftshader = 2,
kForcedNative = 2, // Cannot override by GPU blacklist.
kSwiftshader = 3,
kLast = kSwiftshader,
};
......
......@@ -77,7 +77,9 @@ GpuFeatureStatus GetVulkanFeatureStatus(
const std::set<int>& blacklisted_features,
const GpuPreferences& gpu_preferences) {
#if BUILDFLAG(ENABLE_VULKAN)
if (blacklisted_features.count(GPU_FEATURE_TYPE_VULKAN))
// Only blacklist native vulkan.
if (gpu_preferences.use_vulkan == VulkanImplementationName::kNative &&
blacklisted_features.count(GPU_FEATURE_TYPE_VULKAN))
return kGpuFeatureStatusBlacklisted;
if (gpu_preferences.use_vulkan == VulkanImplementationName::kNone)
......
......@@ -14,7 +14,8 @@ import "ui/gfx/mojom/buffer_types.mojom";
enum VulkanImplementationName {
kNone = 0,
kNative = 1,
kSwiftshader = 2,
kForcedNative = 2,
kSwiftshader = 3,
kLast = kSwiftshader,
};
......
......@@ -28,6 +28,8 @@ struct EnumTraits<gpu::mojom::VulkanImplementationName,
return gpu::mojom::VulkanImplementationName::kNone;
case gpu::VulkanImplementationName::kNative:
return gpu::mojom::VulkanImplementationName::kNative;
case gpu::VulkanImplementationName::kForcedNative:
return gpu::mojom::VulkanImplementationName::kForcedNative;
case gpu::VulkanImplementationName::kSwiftshader:
return gpu::mojom::VulkanImplementationName::kSwiftshader;
}
......@@ -43,6 +45,9 @@ struct EnumTraits<gpu::mojom::VulkanImplementationName,
case gpu::mojom::VulkanImplementationName::kNative:
*out = gpu::VulkanImplementationName::kNative;
return true;
case gpu::mojom::VulkanImplementationName::kForcedNative:
*out = gpu::VulkanImplementationName::kForcedNative;
return true;
case gpu::mojom::VulkanImplementationName::kSwiftshader:
*out = gpu::VulkanImplementationName::kSwiftshader;
return true;
......
......@@ -273,33 +273,6 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandLine* command_line,
->GetSupportedFormatsForTexturing();
#endif
#if BUILDFLAG(ENABLE_VULKAN)
if (gpu_feature_info_.status_values[gpu::GPU_FEATURE_TYPE_VULKAN] ==
gpu::kGpuFeatureStatusEnabled) {
DCHECK_NE(gpu_preferences_.use_vulkan,
gpu::VulkanImplementationName::kNone);
bool use_swiftshader = gpu_preferences_.use_vulkan ==
gpu::VulkanImplementationName::kSwiftshader;
const bool enforce_protected_memory =
gpu_preferences_.enforce_vulkan_protected_memory;
vulkan_implementation_ = gpu::CreateVulkanImplementation(
use_swiftshader,
enforce_protected_memory ? true : false /* allow_protected_memory */,
enforce_protected_memory);
if (!vulkan_implementation_ ||
!vulkan_implementation_->InitializeVulkanInstance(
!gpu_preferences_.disable_vulkan_surface)) {
DLOG(ERROR) << "Failed to create and initialize Vulkan implementation.";
vulkan_implementation_ = nullptr;
CHECK(!gpu_preferences_.disable_vulkan_fallback_to_gl_for_testing);
}
if (!vulkan_implementation_)
gpu_preferences_.use_vulkan = gpu::VulkanImplementationName::kNone;
}
#else
gpu_preferences_.use_vulkan = gpu::VulkanImplementationName::kNone;
#endif
if (!use_swiftshader) {
use_swiftshader = EnableSwiftShaderIfNeeded(
command_line, gpu_feature_info_,
......@@ -330,30 +303,90 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandLine* command_line,
gles2::PassthroughCommandDecoderSupported();
// We need to collect GL strings (VENDOR, RENDERER) for blacklisting purposes.
if (!gl_disabled && !use_swiftshader) {
if (!CollectGraphicsInfo(&gpu_info_, gpu_preferences_))
return false;
gpu::SetKeysForCrashLogging(gpu_info_);
gpu_feature_info_ = gpu::ComputeGpuFeatureInfo(gpu_info_, gpu_preferences_,
command_line, nullptr);
use_swiftshader = EnableSwiftShaderIfNeeded(
command_line, gpu_feature_info_,
gpu_preferences_.disable_software_rasterizer, false);
if (use_swiftshader) {
if (!gl_disabled) {
if (!use_swiftshader) {
if (!CollectGraphicsInfo(&gpu_info_, gpu_preferences_))
return false;
gpu::SetKeysForCrashLogging(gpu_info_);
gpu_feature_info_ = gpu::ComputeGpuFeatureInfo(
gpu_info_, gpu_preferences_, command_line, nullptr);
use_swiftshader = EnableSwiftShaderIfNeeded(
command_line, gpu_feature_info_,
gpu_preferences_.disable_software_rasterizer, false);
if (use_swiftshader) {
#if defined(OS_LINUX)
VLOG(1) << "Quit GPU process launch to fallback to SwiftShader cleanly "
<< "on Linux";
return false;
#else
gl::init::ShutdownGL(true);
if (!gl::init::InitializeGLNoExtensionsOneOff()) {
VLOG(1) << "gl::init::InitializeGLNoExtensionsOneOff with SwiftShader "
<< "failed";
VLOG(1) << "Quit GPU process launch to fallback to SwiftShader cleanly "
<< "on Linux";
return false;
}
#else
gl::init::ShutdownGL(true);
if (!gl::init::InitializeGLNoExtensionsOneOff()) {
VLOG(1)
<< "gl::init::InitializeGLNoExtensionsOneOff with SwiftShader "
<< "failed";
return false;
}
#endif // OS_LINUX
}
} else { // use_swiftshader == true
switch (gpu_preferences_.use_vulkan) {
case gpu::VulkanImplementationName::kNative: {
// Collect GPU info, so we can use backlist to disable vulkan if it is
// needed.
gpu::GPUInfo gpu_info;
if (!CollectGraphicsInfo(&gpu_info, gpu_preferences_))
return false;
auto gpu_feature_info = gpu::ComputeGpuFeatureInfo(
gpu_info, gpu_preferences_, command_line, nullptr);
gpu_feature_info_.status_values[gpu::GPU_FEATURE_TYPE_VULKAN] =
gpu_feature_info.status_values[gpu::GPU_FEATURE_TYPE_VULKAN];
break;
}
case gpu::VulkanImplementationName::kForcedNative:
case gpu::VulkanImplementationName::kSwiftshader:
gpu_feature_info_.status_values[gpu::GPU_FEATURE_TYPE_VULKAN] =
gpu::kGpuFeatureStatusEnabled;
break;
case gpu::VulkanImplementationName::kNone:
gpu_feature_info_.status_values[gpu::GPU_FEATURE_TYPE_VULKAN] =
gpu::kGpuFeatureStatusDisabled;
break;
}
}
}
#if BUILDFLAG(ENABLE_VULKAN)
if (gpu_feature_info_.status_values[gpu::GPU_FEATURE_TYPE_VULKAN] ==
gpu::kGpuFeatureStatusEnabled) {
DCHECK_NE(gpu_preferences_.use_vulkan,
gpu::VulkanImplementationName::kNone);
bool vulkan_use_swiftshader = gpu_preferences_.use_vulkan ==
gpu::VulkanImplementationName::kSwiftshader;
const bool enforce_protected_memory =
gpu_preferences_.enforce_vulkan_protected_memory;
vulkan_implementation_ = gpu::CreateVulkanImplementation(
vulkan_use_swiftshader,
enforce_protected_memory ? true : false /* allow_protected_memory */,
enforce_protected_memory);
if (!vulkan_implementation_ ||
!vulkan_implementation_->InitializeVulkanInstance(
!gpu_preferences_.disable_vulkan_surface)) {
DLOG(ERROR) << "Failed to create and initialize Vulkan implementation.";
vulkan_implementation_ = nullptr;
CHECK(!gpu_preferences_.disable_vulkan_fallback_to_gl_for_testing);
}
}
if (!vulkan_implementation_) {
gpu_preferences_.use_vulkan = gpu::VulkanImplementationName::kNone;
gpu_feature_info_.status_values[gpu::GPU_FEATURE_TYPE_VULKAN] =
gpu::kGpuFeatureStatusDisabled;
}
#else
gpu_preferences_.use_vulkan = gpu::VulkanImplementationName::kNone;
gpu_feature_info_.status_values[gpu::GPU_FEATURE_TYPE_VULKAN] =
gpu::kGpuFeatureStatusDisabled;
#endif
// Collect GPU process info
if (!gl_disabled) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment