forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
From ddb186d8904d6ec80d1084a1cc495b824381a565 Mon Sep 17 00:00:00 2001
From: Maksim Sisov <msisov@igalia.com>
Date: Wed, 20 Jan 2021 09:50:22 +0200
Subject: [PATCH] ozone/wayland: add VA-API support.
 
This patch ads VA-API support utilizing old VA-API path used for
ChromeOS, which can be buggy on some devices (currently tested
on Intel Gen8 and Gen9 with Gen8 having some minor bugs).
 
It's known that a new VA-API is being developed atm and once it's ready,
we will switch to a new path, which should be more stable.
 
Upstream-Status: Inappropriate
 
The patch is based on the old va-api path. ChromeOS
team is working on the new path, which will be also employed
by Wayland later.
 
Signed-off-by: Maksim Sisov <msisov@igalia.com>
---
 media/gpu/vaapi/vaapi_picture_factory.cc        |  2 +-
 media/gpu/vaapi/vaapi_picture_native_pixmap.cc  | 17 ++++++++++++++++-
 .../gpu/vaapi/vaapi_video_decode_accelerator.cc |  4 ++--
 .../platform/wayland/gpu/gbm_pixmap_wayland.cc  | 14 ++++++++++++--
 .../platform/wayland/gpu/gbm_pixmap_wayland.h   |  3 +++
 .../platform/wayland/ozone_platform_wayland.cc  |  3 +++
 6 files changed, 37 insertions(+), 6 deletions(-)
 
diff --git a/media/gpu/vaapi/vaapi_picture_factory.cc b/media/gpu/vaapi/vaapi_picture_factory.cc
index 9c7d7387d24b2..400ea292e9d6e 100644
--- a/media/gpu/vaapi/vaapi_picture_factory.cc
+++ b/media/gpu/vaapi/vaapi_picture_factory.cc
@@ -102,7 +102,7 @@ uint32_t VaapiPictureFactory::GetGLTextureTarget() {
 }
 
 gfx::BufferFormat VaapiPictureFactory::GetBufferFormat() {
-#if BUILDFLAG(USE_VAAPI_X11)
+#if defined(OS_LINUX)
   return gfx::BufferFormat::RGBX_8888;
 #else
   return gfx::BufferFormat::YUV_420_BIPLANAR;
diff --git a/media/gpu/vaapi/vaapi_picture_native_pixmap.cc b/media/gpu/vaapi/vaapi_picture_native_pixmap.cc
index 941f24cc59590..a9c80356e7109 100644
--- a/media/gpu/vaapi/vaapi_picture_native_pixmap.cc
+++ b/media/gpu/vaapi/vaapi_picture_native_pixmap.cc
@@ -4,6 +4,7 @@
 
 #include "media/gpu/vaapi/vaapi_picture_native_pixmap.h"
 
+#include "media/gpu/macros.h"
 #include "media/gpu/vaapi/va_surface.h"
 #include "media/gpu/vaapi/vaapi_wrapper.h"
 #include "ui/gfx/buffer_format_util.h"
@@ -40,7 +41,21 @@ VaapiPictureNativePixmap::~VaapiPictureNativePixmap() = default;
 bool VaapiPictureNativePixmap::DownloadFromSurface(
     scoped_refptr<VASurface> va_surface) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return vaapi_wrapper_->BlitSurface(*va_surface, *va_surface_);
+  if (!vaapi_wrapper_->SyncSurface(va_surface->id())) {
+    VLOGF(1) << "Cannot sync VPP input surface";
+    return false;
+  }
+  if (!vaapi_wrapper_->BlitSurface(*va_surface, *va_surface_)) {
+    VLOGF(1) << "Cannot convert decoded image into output buffer";
+    return false;
+  }
+
+  // Sync target surface since the buffer is returning to client.
+  if (!vaapi_wrapper_->SyncSurface(va_surface_->id())) {
+    VLOGF(1) << "Cannot sync VPP output surface";
+    return false;
+  }
+  return true;
 }
 
 bool VaapiPictureNativePixmap::AllowOverlay() const {
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
index 26696da127121..017fd33f0e24a 100644
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -563,12 +563,12 @@ void VaapiVideoDecodeAccelerator::InitiateSurfaceSetChange(
   requested_visible_rect_ = visible_rect;
   if (buffer_allocation_mode_ == BufferAllocationMode::kSuperReduced) {
     // Add one to the reference frames for the one being currently egressed.
-    requested_num_reference_frames_ = num_reference_frames + 1;
+    requested_num_reference_frames_ = num_reference_frames + 4;
     requested_num_pics_ = num_pics - num_reference_frames;
   } else if (buffer_allocation_mode_ == BufferAllocationMode::kReduced) {
     // Add one to the reference frames for the one being currently egressed,
     // and an extra allocation for both |client_| and |decoder_|.
-    requested_num_reference_frames_ = num_reference_frames + 2;
+    requested_num_reference_frames_ = num_reference_frames + 5;
     requested_num_pics_ = num_pics - num_reference_frames + 1;
   } else {
     requested_num_reference_frames_ = 0;
diff --git a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
index 52ce88f40ab5f..1994d78a0a1cc 100644
--- a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
+++ b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
@@ -33,8 +33,12 @@ GbmPixmapWayland::GbmPixmapWayland(WaylandBufferManagerGpu* buffer_manager)
       buffer_id_(buffer_manager->AllocateBufferID()) {}
 
 GbmPixmapWayland::~GbmPixmapWayland() {
-  if (gbm_bo_ && widget_ != gfx::kNullAcceleratedWidget)
+  // gfx::BufferUsage::SCANOUT_VDA_WRITE doesn't result in creation of
+  // wl_buffers.
+  if (gbm_bo_ && usage_ != gfx::BufferUsage::SCANOUT_VDA_WRITE &&
+      widget_ != gfx::kNullAcceleratedWidget) {
     buffer_manager_->DestroyBuffer(widget_, buffer_id_);
+  }
 }
 
 bool GbmPixmapWayland::InitializeBuffer(
@@ -83,8 +87,14 @@ bool GbmPixmapWayland::InitializeBuffer(
            << " usage=" << gfx::BufferUsageToString(usage);
 
   visible_area_size_ = visible_area_size ? visible_area_size.value() : size;
-  if (widget_ != gfx::kNullAcceleratedWidget)
+  usage_ = usage;
+  // Do not create wl_buffers for SCANOUT_VDA_WRITE usages. These buffers are
+  // only used by video decoders and are not going to be requested to be
+  // attached to Wayland surfaces.
+  if (usage_ != gfx::BufferUsage::SCANOUT_VDA_WRITE &&
+      widget_ != gfx::kNullAcceleratedWidget) {
     CreateDmabufBasedBuffer();
+  }
   return true;
 }
 
diff --git a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
index e2af8c3d3233c..5a54fd7f96aec 100644
--- a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
+++ b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
@@ -88,6 +88,9 @@ class GbmPixmapWayland : public gfx::NativePixmap {
 
   // Size of the visible area of the buffer.
   gfx::Size visible_area_size_;
+
+  // Tells the usage of this pixmap.
+  gfx::BufferUsage usage_ = gfx::BufferUsage::SCANOUT;
 };
 
 }  // namespace ui
diff --git a/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
index 7334bf8225e48..2f29dc66d02f6 100644
--- a/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -314,6 +314,9 @@ class OzonePlatformWayland : public OzonePlatform,
       // coordinates, instead only surface-local ones are supported.
       properties->supports_global_screen_coordinates = false;
 
+      // Let the media know this platform supports va-api.
+      properties->supports_vaapi = true;
+
       initialised = true;
     }