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-78.0.3887.7/media/gpu/gpu_video_decode_accelerator_factory.cc
===================================================================
--- chromium-78.0.3887.7.orig/media/gpu/gpu_video_decode_accelerator_factory.cc
+++ chromium-78.0.3887.7/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-78.0.3887.7/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
===================================================================
--- chromium-78.0.3887.7.orig/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
+++ chromium-78.0.3887.7/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) \
@@ -635,6 +640,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.
@@ -648,6 +660,7 @@ 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
@@ -659,9 +672,13 @@ void VaapiVideoDecodeAccelerator::Assign
     PictureBuffer buffer = buffers[i];
     buffer.set_size(requested_pic_size_);
     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_, buffer);
     RETURN_AND_NOTIFY_ON_FAILURE(picture, "Failed creating a VaapiPicture",
                                  PLATFORM_FAILURE, );
@@ -1086,6 +1103,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)
@@ -1121,6 +1141,7 @@ VaapiVideoDecodeAccelerator::DecideBuffe
     return BufferAllocationMode::kReduced;
 
   return BufferAllocationMode::kSuperReduced;
+  #endif
 }
 
 bool VaapiVideoDecodeAccelerator::IsBufferAllocationModeReducedOrSuperReduced()
Index: chromium-78.0.3887.7/media/gpu/vaapi/vaapi_wrapper.cc
===================================================================
--- chromium-78.0.3887.7.orig/media/gpu/vaapi/vaapi_wrapper.cc
+++ chromium-78.0.3887.7/media/gpu/vaapi/vaapi_wrapper.cc
@@ -328,6 +328,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()
@@ -362,10 +366,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:
@@ -398,8 +403,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;
openSUSE Build Service is sponsored by