123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- 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 62e3a429239eb..df4905a10f68b 100644
- --- a/media/gpu/vaapi/vaapi_picture_factory.cc
- +++ b/media/gpu/vaapi/vaapi_picture_factory.cc
- @@ -105,7 +105,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 baaf2ae468d36..4d6933d869933 100644
- --- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
- +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
- @@ -562,12 +562,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 2ec4e4e01729e..e73af1fe781c6 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(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 e9b25a7452882..3eb91765eba30 100644
- --- a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
- +++ b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
- @@ -87,6 +87,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 661859754cd80..665e6de2616bb 100644
- --- a/ui/ozone/platform/wayland/ozone_platform_wayland.cc
- +++ b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
- @@ -289,6 +289,9 @@ class OzonePlatformWayland : public OzonePlatform,
- // arbitrary position.
- properties->supports_global_screen_coordinates = false;
-
- + // Let the media know this platform supports va-api.
- + properties->supports_vaapi = true;
- +
- initialised = true;
- }
|