diff options
author | Noah Vogt | 2022-05-13 08:33:46 +0200 |
---|---|---|
committer | Noah Vogt | 2022-05-13 08:33:46 +0200 |
commit | 710109d137f3b33f10270903bd2a46eb10a7d5f9 (patch) | |
tree | a9d03c10280731c992894b9a4774e4440d80acd9 /ozone-add-va-api-support-to-wayland.patch | |
parent | 6e80efb49b2f24fb3419b715d632be8b17c0556f (diff) | |
download | aur-710109d137f3b33f10270903bd2a46eb10a7d5f9.tar.gz |
uppkg -> 101.0.4951.54-1
Diffstat (limited to 'ozone-add-va-api-support-to-wayland.patch')
-rw-r--r-- | ozone-add-va-api-support-to-wayland.patch | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/ozone-add-va-api-support-to-wayland.patch b/ozone-add-va-api-support-to-wayland.patch new file mode 100644 index 000000000000..e2e055cc1e1e --- /dev/null +++ b/ozone-add-va-api-support-to-wayland.patch @@ -0,0 +1,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 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; + } |