[M130][MM] Enable TBM functionality 58/323958/8
authorSuhas Poornachandra <s.poornachan@samsung.com>
Fri, 9 May 2025 13:26:22 +0000 (18:56 +0530)
committerBot Blink <blinkbot@samsung.com>
Mon, 9 Jun 2025 10:30:32 +0000 (10:30 +0000)
This patch enables tbm functionality for tv profile and also avoids
double destruction of SharedImage.
Texture id is moved from VideoFrame to EGLImageBacking hence the
refernces to them have been replaced with ClientSharedImage.

Change-Id: I0cd6434aab9150146328c05eaf142886c0d82cda
Signed-off-by: Suhas Poornachandra <s.poornachan@samsung.com>
cc/layers/video_layer_impl.cc
gpu/command_buffer/client/client_shared_image.cc
gpu/command_buffer/client/client_shared_image.h
gpu/command_buffer/client/shared_image_interface.cc
gpu/command_buffer/service/shared_image/egl_image_backing.cc
gpu/ipc/client/client_shared_image_interface.cc
media/base/video_frame.cc
media/base/video_frame.h
tizen_src/chromium_impl/content/renderer/media/tizen/media_player_renderer_client.cc

index d7d94995002239a871f3ba0fe7aadd9364a7dc1d..b086748146b93574f2ecfb9411c061d47d187ae5 100644 (file)
@@ -152,7 +152,6 @@ bool VideoLayerImpl::WillDraw(DrawMode draw_mode,
                        base::Unretained(this), frame_));
 #if defined(_DEBUG_TBM_VIDEO_RENDERING) && _DEBUG_TBM_VIDEO_RENDERING
     LOG(INFO) << " Video frame > "
-              << ", texture_id:" << frame_->GetTbmTexture()
               << ", resource_id:" << resource_id_
               << ", size:" << frame_->visible_rect().size().ToString();
 #endif
index 7acf74bbfb5b419fe91db9a2f734def8b0c4cd7c..a2d146fe9e32fd4394220a399411f10dbc4e089c 100644 (file)
@@ -165,10 +165,21 @@ void ClientSharedImage::AllowExternalSamplingWithoutNativeBuffersForTesting(
 }
 
 #if defined(TIZEN_TBM_SUPPORT)
-ClientSharedImage::ClientSharedImage(const Mailbox& mailbox,
-                                     const SharedImageMetadata& metadata)
-    : mailbox_(mailbox), metadata_(metadata) {
+ClientSharedImage::ClientSharedImage(
+    const Mailbox& mailbox,
+    const SharedImageMetadata& metadata,
+    const SyncToken& sync_token,
+    scoped_refptr<SharedImageInterfaceHolder> sii_holder,
+    gfx::GpuMemoryBufferType gmb_type,
+    uint32_t texture_target)
+    : mailbox_(mailbox),
+      metadata_(metadata),
+      creation_sync_token_(sync_token),
+      sii_holder_(std::move(sii_holder)),
+      texture_target_(texture_target) {
   CHECK(!mailbox.IsZero());
+  CHECK(sii_holder_);
+  CHECK(texture_target);
 }
 #endif
 
index 42a53024110c27ebaff44ecb6ef801e92af03b68..8484e5d11f91e39d0151288347b46a5d647a5fe3 100644 (file)
@@ -101,7 +101,11 @@ class GPU_EXPORT ClientSharedImage
 #if defined(TIZEN_TBM_SUPPORT)
   // TBM ClientSharedImage
   ClientSharedImage(const Mailbox& mailbox,
-                    const SharedImageMetadata& metadata);
+                    const SharedImageMetadata& metadata,
+                    const SyncToken& sync_token,
+                    scoped_refptr<SharedImageInterfaceHolder> sii_holder,
+                    gfx::GpuMemoryBufferType gmb_type,
+                    uint32_t texture_target);
 #endif
   // `sii_holder` must not be null.
   ClientSharedImage(const Mailbox& mailbox,
index 4a8bec1490ee84c8693a18a217ff2b14e3eccc3b..52b1d19e8d15479cf4da9c03d84caa78c065f8c2 100644 (file)
@@ -34,14 +34,9 @@ scoped_refptr<ClientSharedImage> SharedImageInterface::CreateSharedImage(
     const SharedImageInfo& si_info,
     gpu::SurfaceHandle surface_handle,
     gfx::BufferUsage buffer_usage) {
-  NOTREACHED_IN_MIGRATION();
-#if defined(TIZEN_TBM_SUPPORT)
-  return base::MakeRefCounted<ClientSharedImage>(Mailbox(), si_info.meta);
-#else
   return base::MakeRefCounted<ClientSharedImage>(Mailbox(), si_info.meta,
                                                  GenUnverifiedSyncToken(),
                                                  holder_, gfx::EMPTY_BUFFER);
-#endif
 }
 
 SharedImageUsageSet SharedImageInterface::UsageForMailbox(
index 3765dd00ae04a5edb9d371864c4067e628da210a..74e4c8c3cdde38ae13eb5d68f24198fec9c70a8e 100644 (file)
@@ -267,6 +267,7 @@ EGLImageBacking::EGLImageBacking(
                                       true /*is_thread_safe*/),
       format_info_(format_info),
       use_passthrough_(use_passthrough) {
+  created_on_context_ = gl::g_current_gl_context;
   std::vector<scoped_refptr<EGLImageBacking::TextureHolder>> texture_holders;
   texture_holders.push_back(GenEGLImageSibling(std::move(handle)));
   source_texture_holders_ = texture_holders;
index 14480b489e751e0f4701ff7942dc3e2a9f68dc70..bc2206fd6b9764b42b54afdc9da9a6da887363fc 100644 (file)
 #include "ui/gfx/gpu_fence.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 
+#if defined(TIZEN_TBM_SUPPORT)
+#include "ui/gl/gl_bindings.h"
+#endif
+
 #if BUILDFLAG(IS_WIN)
 #include "ui/gfx/win/d3d_shared_fence.h"
 #endif
@@ -188,6 +192,13 @@ scoped_refptr<ClientSharedImage> ClientSharedImageInterface::CreateSharedImage(
 #endif
   auto buffer_handle_type = buffer_handle.type;
   auto mailbox = proxy_->CreateSharedImage(si_info, std::move(buffer_handle));
+#if defined(TIZEN_TBM_SUPPORT)
+  if (buffer_handle.tbm_buffer_handle_ip.is_video_frame) {
+    return base::MakeRefCounted<ClientSharedImage>(
+        AddMailbox(mailbox), si_info.meta, GenUnverifiedSyncToken(), holder_,
+        buffer_handle_type, GL_TEXTURE_EXTERNAL_OES);
+  }
+#endif
   return base::MakeRefCounted<ClientSharedImage>(
       AddMailbox(mailbox), si_info.meta, GenUnverifiedSyncToken(), holder_,
       buffer_handle_type);
index e9e575b77e317bb4db61eb202d12b91e8ff6d9f8..86f5cab4916416fb7a02ad636ffd9e1dc2de8bce 100644 (file)
@@ -1754,11 +1754,6 @@ VideoFrame::VideoFrame(const VideoFrameLayout& layout,
       storage_type_(storage_type),
       visible_rect_(Intersection(visible_rect, gfx::Rect(layout.coded_size()))),
       natural_size_(natural_size),
-#if defined(TIZEN_TBM_SUPPORT)
-      texture_id_(0),
-      gl_(nullptr),
-      image_id_(0),
-#endif
       timestamp_(timestamp),
       unique_id_(GetNextID()) {
   DCHECK(IsValidConfigInternal(format(), frame_control_type, coded_size(),
@@ -2073,17 +2068,14 @@ std::vector<size_t> VideoFrame::CalculatePlaneSize(
 #if defined(TIZEN_TBM_SUPPORT)
 void ReleaseTbmTexture(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-    gpu::raster::RasterInterface* ri,
     scoped_refptr<gpu::ClientSharedImage> client_shared_image,
-    scoped_refptr<viz::RasterContextProvider> context_provider,
     const gpu::SyncToken& release_sync_point) {
 #if defined(USE_TTRACE)
   TTRACE(TTRACE_TAG_WEB, "ReleaseTbmTexture");
 #endif
   DCHECK(task_runner->BelongsToCurrentThread());
-  if (context_provider->SharedImageInterface() && client_shared_image) {
-    context_provider->SharedImageInterface()->DestroySharedImage(
-        release_sync_point, std::move(client_shared_image->mailbox()));
+  if (client_shared_image) {
+    client_shared_image->UpdateDestructionSyncToken(release_sync_point);
   }
 }
 
@@ -2102,15 +2094,19 @@ void VideoFrame::ReleaseTbm() {
       .Run(release_sync_token, std::move(gpu_memory_buffer_));
 }
 
-unsigned VideoFrame::CreateTbmTextureIfNeeded(
-    gpu::raster::RasterInterface* ri) {
+bool VideoFrame::CreateTbmTextureIfNeeded(gpu::raster::RasterInterface* ri) {
 #if defined(USE_TTRACE)
   TTRACE(TTRACE_TAG_WEB, "VideoFrameCompositor::CreateTbmTextureIfNeeded");
 #endif
   base::AutoLock autolock(tbm_lock_);
   sii_ = context_provider_->SharedImageInterface();
-  if (!ri || !sii_ || texture_id_) {
-    return (ri_ == ri) ? texture_id_ : 0;
+  if (!ri || !sii_) {
+    return false;
+  }
+
+  if (client_shared_image_ != nullptr) {
+    // Shared image already created return true
+    return true;
   }
 
   ri_ = ri;
@@ -2133,7 +2129,7 @@ unsigned VideoFrame::CreateTbmTextureIfNeeded(
 
   if (!client_shared_image_) {
     LOG(ERROR) << __FUNCTION__ << " Shared Image couldn't be created ";
-    return 0;
+    return false;
   }
 
   gpu::SyncToken sync_token = sii_->GenUnverifiedSyncToken();
@@ -2141,10 +2137,11 @@ unsigned VideoFrame::CreateTbmTextureIfNeeded(
 
   mailbox_holder_ = gpu::MailboxHolder(client_shared_image_->mailbox(),
                                        sync_token, GL_TEXTURE_EXTERNAL_OES);
+
   SetReleaseMailboxCB(base::BindOnce(
-      ReleaseTbmTexture, base::SingleThreadTaskRunner::GetCurrentDefault(), ri,
-      client_shared_image_, context_provider_));
-  return texture_id_;
+      ReleaseTbmTexture, base::SingleThreadTaskRunner::GetCurrentDefault(),
+      client_shared_image_));
+  return true;
 }
 #endif
 
index 0fec5bb171041b5ee0f8c19bf897e4f84c35e900..b294f8618bea797bcb429cb2bba435d0819145a9 100644 (file)
@@ -488,13 +488,11 @@ class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> {
                                                   base::TimeDelta timestamp,
                                                   gfx::TbmBufferHandle handle);
   bool IsTBMBackend() const { return storage_type_ == STORAGE_TBM_SURFACE; }
-  unsigned GetTbmTexture() { return texture_id_; }
-  unsigned CreateTbmTextureIfNeeded(gpu::raster::RasterInterface* ri);
+  bool SharedImageCreated() { return client_shared_image_ != nullptr; }
+
+  bool CreateTbmTextureIfNeeded(gpu::raster::RasterInterface* ri);
   void ReleaseTbm();
-  void SetTbmTexture(unsigned texture) { texture_id_ = texture; }
   gfx::TbmBufferHandle GetTbmBuffer() { return buffer_handle_; }
-  unsigned GetImageID() { return image_id_; }
-  void SetImageID(unsigned image_id) { image_id_ = image_id; }
   void SetContextProvider(
       scoped_refptr<viz::RasterContextProvider> context_provider) {
     context_provider_ = context_provider;
@@ -1043,12 +1041,10 @@ class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> {
   base::Lock tbm_lock_;
   mutable base::Lock tbm_map_lock_;
   gfx::TbmBufferHandle buffer_handle_;
-  unsigned texture_id_;
   gpu::raster::RasterInterface* ri_ = nullptr;
   gpu::gles2::GLES2Interface* gl_ = nullptr;
   gpu::SharedImageInterface* sii_ = nullptr;
 
-  unsigned image_id_;
   scoped_refptr<viz::RasterContextProvider> context_provider_;
   scoped_refptr<gpu::ClientSharedImage> client_shared_image_;
   mutable tbm_bo bo_[TBM_BO_NUM_MAX] = {nullptr};
index 6460a57e9cd1e8d23eb7425f2a63cf7b08196eb1..a53e33a3f06433e3853c4236b1a4f90152485a8b 100644 (file)
@@ -283,8 +283,9 @@ void MediaPlayerRendererClient::OnMediaPacketExhausted(
     media::VideoFrame* video_frame,
     uintptr_t media_packet) {
   // In this case, media packet will be released in destructor of |GLImageEGL|.
-  if (video_frame->GetTbmTexture())
+  if (video_frame->SharedImageCreated()) {
     return;
+  }
 
   renderer_extension_remote_->OnMediaPacketExhausted(media_packet);
 }