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
}
#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
#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,
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(
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;
#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
#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);
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(),
#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);
}
}
.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;
if (!client_shared_image_) {
LOG(ERROR) << __FUNCTION__ << " Shared Image couldn't be created ";
- return 0;
+ return false;
}
gpu::SyncToken sync_token = sii_->GenUnverifiedSyncToken();
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
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;
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};
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);
}