[TTVD][WebRTC] Allowing multiple shared image reads 94/323694/6
authorAdam Bujalski <a.bujalski@samsung.com>
Fri, 25 Apr 2025 08:43:11 +0000 (10:43 +0200)
committerBot Blink <blinkbot@samsung.com>
Tue, 6 May 2025 10:06:11 +0000 (10:06 +0000)
There are apps which may do multiple simultaneous reads of video data
e.g. displaying preview from the same stream in multiple HTML video
elements. However current logic of `SharedImageBackingEfl` disallowed
such reads.

This patch allows multilpe simultaneous reads from the image.

Bug: https://jira-eu.sec.samsung.net/browse/VDWASM-2198
Change-Id: Ie41a401ce097e28071375929b8a17bbd72878d1a

tizen_src/chromium_impl/gpu/command_buffer/service/shared_image_backing_efl.cc
tizen_src/chromium_impl/gpu/command_buffer/service/shared_image_backing_efl.h

index d283f70f3cc104f0433d8dd10bece0e3ce768645..1d7bac7ef636fd40eb52230f577496667dad3a2a 100644 (file)
@@ -136,13 +136,21 @@ bool SharedImageBackingEfl::BeginAccess(GLenum mode) {
     LOG(ERROR) << "Write access still active";
     return false;
   } else if (mode_ == RepresentationAccessMode::kRead) {
-    LOG(ERROR) << "Read/write access twice";
+    if (mode == GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM) {
+      DCHECK_GT(readers_cnt_, 0);
+      ++readers_cnt_;
+      return true;
+    }
+
+    LOG(ERROR) << "Write access while reader(s) still active.";
     return false;
   }
 
   switch (mode) {
     case GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM:
       mode_ = RepresentationAccessMode::kRead;
+      DCHECK_EQ(readers_cnt_, 0);
+      readers_cnt_ = 1;
       if (write_fence_) {
         write_fence_->ServerWait();
         write_fence_.reset();
@@ -169,6 +177,12 @@ bool SharedImageBackingEfl::BeginAccess(GLenum mode) {
 void SharedImageBackingEfl::EndAccess() {
   switch (mode_) {
     case RepresentationAccessMode::kRead:
+      DCHECK_GT(readers_cnt_, 0);
+      --readers_cnt_;
+      if (readers_cnt_ > 0) {
+        // Readers still active.
+        return;
+      }
       read_fence_ = gl::GLFenceEGL::Create();
       break;
     case RepresentationAccessMode::kWrite:
index f7c4204ccbe1da10e88cd3a50ada8f7aed4f1a30..78e3c0d5a348ba2dc4d1cc115adadaad7b87be32 100644 (file)
@@ -96,6 +96,7 @@ class GPU_GLES2_EXPORT SharedImageBackingEfl
   std::unique_ptr<gl::GLFenceEGL> write_fence_ = nullptr;
   std::unique_ptr<gl::GLFenceEGL> read_fence_ = nullptr;
   scoped_refptr<ImageHolder> image_holder_;
+  uint32_t readers_cnt_ = 0;
   bool use_passthrough_;
 };