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) { ...@@ -160,7 +160,7 @@ GpuPreferences ParseGpuPreferences(const base::CommandLine* command_line) {
<< "--enabled-features=Vulkan is overrided by --use-vulkan."; << "--enabled-features=Vulkan is overrided by --use-vulkan.";
auto value = command_line->GetSwitchValueASCII(switches::kUseVulkan); auto value = command_line->GetSwitchValueASCII(switches::kUseVulkan);
if (value.empty() || value == switches::kVulkanImplementationNameNative) { if (value.empty() || value == switches::kVulkanImplementationNameNative) {
gpu_preferences.use_vulkan = VulkanImplementationName::kNative; gpu_preferences.use_vulkan = VulkanImplementationName::kForcedNative;
} else if (value == switches::kVulkanImplementationNameSwiftshader) { } else if (value == switches::kVulkanImplementationNameSwiftshader) {
gpu_preferences.use_vulkan = VulkanImplementationName::kSwiftshader; gpu_preferences.use_vulkan = VulkanImplementationName::kSwiftshader;
} else { } else {
......
...@@ -32,7 +32,8 @@ const size_t kLowEndMaxProgramCacheMemoryBytes = 128 * 1024; ...@@ -32,7 +32,8 @@ const size_t kLowEndMaxProgramCacheMemoryBytes = 128 * 1024;
enum class VulkanImplementationName : uint32_t { enum class VulkanImplementationName : uint32_t {
kNone = 0, kNone = 0,
kNative = 1, kNative = 1,
kSwiftshader = 2, kForcedNative = 2, // Cannot override by GPU blacklist.
kSwiftshader = 3,
kLast = kSwiftshader, kLast = kSwiftshader,
}; };
......
...@@ -77,7 +77,9 @@ GpuFeatureStatus GetVulkanFeatureStatus( ...@@ -77,7 +77,9 @@ GpuFeatureStatus GetVulkanFeatureStatus(
const std::set<int>& blacklisted_features, const std::set<int>& blacklisted_features,
const GpuPreferences& gpu_preferences) { const GpuPreferences& gpu_preferences) {
#if BUILDFLAG(ENABLE_VULKAN) #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; return kGpuFeatureStatusBlacklisted;
if (gpu_preferences.use_vulkan == VulkanImplementationName::kNone) if (gpu_preferences.use_vulkan == VulkanImplementationName::kNone)
......
...@@ -14,7 +14,8 @@ import "ui/gfx/mojom/buffer_types.mojom"; ...@@ -14,7 +14,8 @@ import "ui/gfx/mojom/buffer_types.mojom";
enum VulkanImplementationName { enum VulkanImplementationName {
kNone = 0, kNone = 0,
kNative = 1, kNative = 1,
kSwiftshader = 2, kForcedNative = 2,
kSwiftshader = 3,
kLast = kSwiftshader, kLast = kSwiftshader,
}; };
......
...@@ -28,6 +28,8 @@ struct EnumTraits<gpu::mojom::VulkanImplementationName, ...@@ -28,6 +28,8 @@ struct EnumTraits<gpu::mojom::VulkanImplementationName,
return gpu::mojom::VulkanImplementationName::kNone; return gpu::mojom::VulkanImplementationName::kNone;
case gpu::VulkanImplementationName::kNative: case gpu::VulkanImplementationName::kNative:
return gpu::mojom::VulkanImplementationName::kNative; return gpu::mojom::VulkanImplementationName::kNative;
case gpu::VulkanImplementationName::kForcedNative:
return gpu::mojom::VulkanImplementationName::kForcedNative;
case gpu::VulkanImplementationName::kSwiftshader: case gpu::VulkanImplementationName::kSwiftshader:
return gpu::mojom::VulkanImplementationName::kSwiftshader; return gpu::mojom::VulkanImplementationName::kSwiftshader;
} }
...@@ -43,6 +45,9 @@ struct EnumTraits<gpu::mojom::VulkanImplementationName, ...@@ -43,6 +45,9 @@ struct EnumTraits<gpu::mojom::VulkanImplementationName,
case gpu::mojom::VulkanImplementationName::kNative: case gpu::mojom::VulkanImplementationName::kNative:
*out = gpu::VulkanImplementationName::kNative; *out = gpu::VulkanImplementationName::kNative;
return true; return true;
case gpu::mojom::VulkanImplementationName::kForcedNative:
*out = gpu::VulkanImplementationName::kForcedNative;
return true;
case gpu::mojom::VulkanImplementationName::kSwiftshader: case gpu::mojom::VulkanImplementationName::kSwiftshader:
*out = gpu::VulkanImplementationName::kSwiftshader; *out = gpu::VulkanImplementationName::kSwiftshader;
return true; return true;
......
...@@ -273,33 +273,6 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandLine* command_line, ...@@ -273,33 +273,6 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandLine* command_line,
->GetSupportedFormatsForTexturing(); ->GetSupportedFormatsForTexturing();
#endif #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) { if (!use_swiftshader) {
use_swiftshader = EnableSwiftShaderIfNeeded( use_swiftshader = EnableSwiftShaderIfNeeded(
command_line, gpu_feature_info_, command_line, gpu_feature_info_,
...@@ -330,30 +303,90 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandLine* command_line, ...@@ -330,30 +303,90 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandLine* command_line,
gles2::PassthroughCommandDecoderSupported(); gles2::PassthroughCommandDecoderSupported();
// We need to collect GL strings (VENDOR, RENDERER) for blacklisting purposes. // We need to collect GL strings (VENDOR, RENDERER) for blacklisting purposes.
if (!gl_disabled && !use_swiftshader) { if (!gl_disabled) {
if (!CollectGraphicsInfo(&gpu_info_, gpu_preferences_)) if (!use_swiftshader) {
return false; if (!CollectGraphicsInfo(&gpu_info_, gpu_preferences_))
gpu::SetKeysForCrashLogging(gpu_info_); return false;
gpu_feature_info_ = gpu::ComputeGpuFeatureInfo(gpu_info_, gpu_preferences_, gpu::SetKeysForCrashLogging(gpu_info_);
command_line, nullptr); gpu_feature_info_ = gpu::ComputeGpuFeatureInfo(
use_swiftshader = EnableSwiftShaderIfNeeded( gpu_info_, gpu_preferences_, command_line, nullptr);
command_line, gpu_feature_info_, use_swiftshader = EnableSwiftShaderIfNeeded(
gpu_preferences_.disable_software_rasterizer, false); command_line, gpu_feature_info_,
if (use_swiftshader) { gpu_preferences_.disable_software_rasterizer, false);
if (use_swiftshader) {
#if defined(OS_LINUX) #if defined(OS_LINUX)
VLOG(1) << "Quit GPU process launch to fallback to SwiftShader cleanly " VLOG(1) << "Quit GPU process launch to fallback to SwiftShader cleanly "
<< "on Linux"; << "on Linux";
return false;
#else
gl::init::ShutdownGL(true);
if (!gl::init::InitializeGLNoExtensionsOneOff()) {
VLOG(1) << "gl::init::InitializeGLNoExtensionsOneOff with SwiftShader "
<< "failed";
return false; return false;
} #else
gl::init::ShutdownGL(true);
if (!gl::init::InitializeGLNoExtensionsOneOff()) {
VLOG(1)
<< "gl::init::InitializeGLNoExtensionsOneOff with SwiftShader "
<< "failed";
return false;
}
#endif // OS_LINUX #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 // Collect GPU process info
if (!gl_disabled) { 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