140 lines
5.3 KiB
Diff
140 lines
5.3 KiB
Diff
From fbd756ab55f9351165f923b0411c31dd71319c78 Mon Sep 17 00:00:00 2001
|
|
From: Ted Meyer <tmathmeyer@chromium.org>
|
|
Date: Wed, 16 Sep 2020 17:42:03 +0000
|
|
Subject: [PATCH] Only fall back to the i965 driver if we're on iHD
|
|
|
|
I got my hands on an old AMD laptop, and the gallium driver worked very
|
|
well and was saving power even at 720p, so there's no reason to block
|
|
that for now.
|
|
|
|
Bug: 1116703
|
|
Change-Id: Ib15bc2b93f33e99adad7569dd825e167b503a0ea
|
|
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2409967
|
|
Commit-Queue: Ted Meyer <tmathmeyer@chromium.org>
|
|
Reviewed-by: Andres Calderon Jaramillo <andrescj@chromium.org>
|
|
Cr-Commit-Position: refs/heads/master@{#807550}
|
|
---
|
|
media/gpu/vaapi/vaapi_wrapper.cc | 73 ++++++++++++++++++++------------
|
|
1 file changed, 47 insertions(+), 26 deletions(-)
|
|
|
|
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc
|
|
index 2ad0b997e56..e30d1dfb73b 100644
|
|
--- media/gpu/vaapi/vaapi_wrapper.cc
|
|
+++ media/gpu/vaapi/vaapi_wrapper.cc
|
|
@@ -409,6 +409,8 @@ class VADisplayState {
|
|
|
|
// Implementation of Initialize() called only once.
|
|
bool InitializeOnce() EXCLUSIVE_LOCKS_REQUIRED(va_lock_);
|
|
+ bool InitializeVaDisplay_Locked() EXCLUSIVE_LOCKS_REQUIRED(va_lock_);
|
|
+ bool InitializeVaDriver_Locked() EXCLUSIVE_LOCKS_REQUIRED(va_lock_);
|
|
|
|
int refcount_ GUARDED_BY(va_lock_);
|
|
|
|
@@ -472,11 +474,7 @@ bool VADisplayState::Initialize() {
|
|
return success;
|
|
}
|
|
|
|
-bool VADisplayState::InitializeOnce() {
|
|
- static_assert(
|
|
- VA_MAJOR_VERSION >= 2 || (VA_MAJOR_VERSION == 1 && VA_MINOR_VERSION >= 1),
|
|
- "Requires VA-API >= 1.1.0");
|
|
-
|
|
+bool VADisplayState::InitializeVaDisplay_Locked() {
|
|
switch (gl::GetGLImplementation()) {
|
|
case gl::kGLImplementationEGLGLES2:
|
|
va_display_ = vaGetDisplayDRM(drm_fd_.get());
|
|
@@ -519,25 +517,10 @@ bool VADisplayState::InitializeOnce() {
|
|
return false;
|
|
}
|
|
|
|
- // Set VA logging level and driver name, unless already set.
|
|
- constexpr char libva_log_level_env[] = "LIBVA_MESSAGING_LEVEL";
|
|
- std::unique_ptr<base::Environment> env(base::Environment::Create());
|
|
- if (!env->HasVar(libva_log_level_env))
|
|
- env->SetVar(libva_log_level_env, "1");
|
|
-
|
|
-#if defined(USE_X11)
|
|
- if (gl::GetGLImplementation() == gl::kGLImplementationEGLANGLE) {
|
|
- DCHECK(!features::IsUsingOzonePlatform());
|
|
- constexpr char libva_driver_impl_env[] = "LIBVA_DRIVER_NAME";
|
|
- // TODO(crbug/1116703) The libva intel-media driver has a known segfault in
|
|
- // vaPutSurface, so until this is fixed, fall back to the i965 driver. There
|
|
- // is discussion of the issue here:
|
|
- // https://github.com/intel/media-driver/issues/818
|
|
- if (!env->HasVar(libva_driver_impl_env))
|
|
- env->SetVar(libva_driver_impl_env, "i965");
|
|
- }
|
|
-#endif // USE_X11
|
|
+ return true;
|
|
+}
|
|
|
|
+bool VADisplayState::InitializeVaDriver_Locked() {
|
|
// The VAAPI version.
|
|
int major_version, minor_version;
|
|
VAStatus va_res = vaInitialize(va_display_, &major_version, &minor_version);
|
|
@@ -545,9 +528,6 @@ bool VADisplayState::InitializeOnce() {
|
|
LOG(ERROR) << "vaInitialize failed: " << vaErrorStr(va_res);
|
|
return false;
|
|
}
|
|
-
|
|
- va_initialized_ = true;
|
|
-
|
|
const std::string va_vendor_string = vaQueryVendorString(va_display_);
|
|
DLOG_IF(WARNING, va_vendor_string.empty())
|
|
<< "Vendor string empty or error reading.";
|
|
@@ -555,6 +535,8 @@ bool VADisplayState::InitializeOnce() {
|
|
<< va_vendor_string;
|
|
implementation_type_ = VendorStringToImplementationType(va_vendor_string);
|
|
|
|
+ va_initialized_ = true;
|
|
+
|
|
// The VAAPI version is determined from what is loaded on the system by
|
|
// calling vaInitialize(). Since the libva is now ABI-compatible, relax the
|
|
// version check which helps in upgrading the libva, without breaking any
|
|
@@ -571,6 +553,45 @@ bool VADisplayState::InitializeOnce() {
|
|
return true;
|
|
}
|
|
|
|
+bool VADisplayState::InitializeOnce() {
|
|
+ static_assert(
|
|
+ VA_MAJOR_VERSION >= 2 || (VA_MAJOR_VERSION == 1 && VA_MINOR_VERSION >= 1),
|
|
+ "Requires VA-API >= 1.1.0");
|
|
+
|
|
+ // Set VA logging level, unless already set.
|
|
+ constexpr char libva_log_level_env[] = "LIBVA_MESSAGING_LEVEL";
|
|
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
|
|
+ if (!env->HasVar(libva_log_level_env))
|
|
+ env->SetVar(libva_log_level_env, "1");
|
|
+
|
|
+ if (!InitializeVaDisplay_Locked() || !InitializeVaDriver_Locked())
|
|
+ return false;
|
|
+
|
|
+#if defined(USE_X11)
|
|
+ if (gl::GetGLImplementation() == gl::kGLImplementationEGLANGLE &&
|
|
+ implementation_type_ == VAImplementation::kIntelIHD) {
|
|
+ DCHECK(!features::IsUsingOzonePlatform());
|
|
+ constexpr char libva_driver_impl_env[] = "LIBVA_DRIVER_NAME";
|
|
+ // TODO(crbug/1116703) The libva intel-media driver has a known segfault in
|
|
+ // vaPutSurface, so until this is fixed, fall back to the i965 driver. There
|
|
+ // is discussion of the issue here:
|
|
+ // https://github.com/intel/media-driver/issues/818
|
|
+ if (!env->HasVar(libva_driver_impl_env))
|
|
+ env->SetVar(libva_driver_impl_env, "i965");
|
|
+
|
|
+ // Re-initialize with the new driver.
|
|
+ va_display_ = nullptr;
|
|
+ va_initialized_ = false;
|
|
+ implementation_type_ = VAImplementation::kInvalid;
|
|
+
|
|
+ if (!InitializeVaDisplay_Locked() || !InitializeVaDriver_Locked())
|
|
+ return false;
|
|
+ }
|
|
+#endif // USE_X11
|
|
+
|
|
+ return true;
|
|
+}
|
|
+
|
|
VAStatus VADisplayState::Deinitialize() {
|
|
base::AutoLock auto_lock(va_lock_);
|
|
VAStatus va_res = VA_STATUS_SUCCESS;
|