File chromium-vaapi-fix.patch of Package chromium.openSUSE_Leap_15.0_Update
From fe61d25580bd22d68b20323e7cd684dcba0cd3f4 Mon Sep 17 00:00:00 2001
From: Akarshan Biswas <akarshanbiswas@fedoraproject.org>
Date: Tue, 9 Jul 2019 18:39:54 +0530
Subject: [PATCH] Disable VAProfileNone on Linux and fix vaapi drm
---
.../gpu_video_decode_accelerator_factory.cc | 2 ++
.../vaapi/vaapi_video_decode_accelerator.cc | 21 ++++++++++++++++
media/gpu/vaapi/vaapi_wrapper.cc | 24 +++++++++++++++----
3 files changed, 42 insertions(+), 5 deletions(-)
Index: chromium-77.0.3865.90/media/gpu/gpu_video_decode_accelerator_factory.cc
===================================================================
--- chromium-77.0.3865.90.orig/media/gpu/gpu_video_decode_accelerator_factory.cc
+++ chromium-77.0.3865.90/media/gpu/gpu_video_decode_accelerator_factory.cc
@@ -171,6 +171,8 @@ GpuVideoDecodeAcceleratorFactory::Create
vda = (this->*create_vda_function)(workarounds, gpu_preferences, media_log);
if (vda && vda->Initialize(config, client))
return vda;
+ else
+ LOG(ERROR) << "Initialization of one or more VDAs failed.";
}
return nullptr;
Index: chromium-77.0.3865.90/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
===================================================================
--- chromium-77.0.3865.90.orig/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
+++ chromium-77.0.3865.90/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -63,6 +63,9 @@ void ReportToUMA(VAVDADecoderFailure fai
VAVDA_DECODER_FAILURES_MAX + 1);
}
+// Move this thing to chromeos only as build can fail if treat warnings as errors been set to true
+#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
+
// Returns true if the CPU is an Intel Gemini Lake or later (including Kaby
// Lake) Cpu platform id's are referenced from the following file in kernel
// source arch/x86/include/asm/intel-family.h
@@ -76,6 +79,8 @@ bool IsGeminiLakeOrLater() {
return is_geminilake_or_later;
}
+#endif
+
} // namespace
#define RETURN_AND_NOTIFY_ON_FAILURE(result, log, error_code, ret) \
@@ -631,6 +636,13 @@ void VaapiVideoDecodeAccelerator::Assign
va_surface_format_ = GetVaFormatForVideoCodecProfile(profile_);
std::vector<VASurfaceID> va_surface_ids;
+ // Nvidia doesn't support VAProfileNone, so don't try to create a temporary
+ // copy buffer there. It's not needed anyways for hardware video decoding
+ // to work.
+
+ #if defined(OS_ANDROID) || defined(OS_CHROMEOS)
+
+
// If we aren't in BufferAllocationMode::kNone, we have to allocate a
// |vpp_vaapi_wrapper_| for VaapiPicture to DownloadFromSurface() the VA's
// internal decoded frame.
@@ -644,15 +656,20 @@ void VaapiVideoDecodeAccelerator::Assign
NotifyError(PLATFORM_FAILURE);
}
}
+ #endif
for (size_t i = 0; i < buffers.size(); ++i) {
// If we aren't in BufferAllocationMode::kNone, this |picture| is
// only used as a copy destination. Therefore, the VaapiWrapper used and
// owned by |picture| is |vpp_vaapi_wrapper_|.
std::unique_ptr<VaapiPicture> picture = vaapi_picture_factory_->Create(
+ #if defined(OS_LINUX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+ vaapi_wrapper_,
+ #else
(buffer_allocation_mode_ == BufferAllocationMode::kNone)
? vaapi_wrapper_
: vpp_vaapi_wrapper_,
+ #endif
make_context_current_cb_, bind_image_cb_, buffers[i]);
RETURN_AND_NOTIFY_ON_FAILURE(picture, "Failed creating a VaapiPicture",
PLATFORM_FAILURE, );
@@ -1077,6 +1094,9 @@ VaapiVideoDecodeAccelerator::GetSupporte
VaapiVideoDecodeAccelerator::BufferAllocationMode
VaapiVideoDecodeAccelerator::DecideBufferAllocationMode() {
+ #if defined(OS_LINUX) && !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+ return BufferAllocationMode::kNormal;
+ #else
// TODO(crbug.com/912295): Enable a better BufferAllocationMode for IMPORT
// |output_mode_| as well.
if (output_mode_ == VideoDecodeAccelerator::Config::OutputMode::IMPORT)
@@ -1112,6 +1132,7 @@ VaapiVideoDecodeAccelerator::DecideBuffe
return BufferAllocationMode::kReduced;
return BufferAllocationMode::kSuperReduced;
+ #endif
}
bool VaapiVideoDecodeAccelerator::IsBufferAllocationModeReducedOrSuperReduced()
Index: chromium-77.0.3865.90/media/gpu/vaapi/vaapi_wrapper.cc
===================================================================
--- chromium-77.0.3865.90.orig/media/gpu/vaapi/vaapi_wrapper.cc
+++ chromium-77.0.3865.90/media/gpu/vaapi/vaapi_wrapper.cc
@@ -327,6 +327,10 @@ void VADisplayState::PreSandboxInitializ
base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE);
if (drm_file.IsValid())
VADisplayState::Get()->SetDrmFd(drm_file.GetPlatformFile());
+ const char kNvidiaPath[] = "/dev/dri/nvidiactl";
+ base::File nvidia_file = base::File(
+ base::FilePath::FromUTF8Unsafe(kNvidiaPath),
+ base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE);
}
VADisplayState::VADisplayState()
@@ -361,10 +365,11 @@ bool VADisplayState::InitializeOnce() {
case gl::kGLImplementationDesktopGL:
#if defined(USE_X11)
va_display_ = vaGetDisplay(gfx::GetXDisplay());
-#else
- LOG(WARNING) << "VAAPI video acceleration not available without "
- "DesktopGL (GLX).";
+ if (vaDisplayIsValid(va_display_))
+ break;
+
#endif // USE_X11
+ va_display_ = vaGetDisplayDRM(drm_fd_.get());
break;
// Cannot infer platform from GL, try all available displays
case gl::kGLImplementationNone:
@@ -397,8 +402,17 @@ bool VADisplayState::InitializeOnce() {
int major_version, minor_version;
VAStatus va_res = vaInitialize(va_display_, &major_version, &minor_version);
if (va_res != VA_STATUS_SUCCESS) {
- LOG(ERROR) << "vaInitialize failed: " << vaErrorStr(va_res);
- return false;
+ LOG(ERROR) << "vaInitialize failed (ignore if using Wayland desktop environment, refer:(Github)akarshanbiswas/chromium-vaapi/issues/7): " << vaErrorStr(va_res);
+ va_display_ = vaGetDisplayDRM(drm_fd_.get());
+ if (!vaDisplayIsValid(va_display_)) {
+ LOG(ERROR) << "Could not get a valid DRM VA display";
+ return false;
+ }
+ va_res = vaInitialize(va_display_, &major_version, &minor_version);
+ if (va_res != VA_STATUS_SUCCESS) {
+ LOG(ERROR) << "vaInitialize failed using DRM: " << vaErrorStr(va_res);
+ return false;
+ }
}
va_initialized_ = true;