From ddb186d8904d6ec80d1084a1cc495b824381a565 Mon Sep 17 00:00:00 2001 From: Maksim Sisov 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 --- 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 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; }