Chromium Code Reviews| Index: ui/ozone/platform/drm/common/client_native_pixmap_factory_gbm.cc |
| diff --git a/ui/ozone/platform/drm/common/client_native_pixmap_factory_gbm.cc b/ui/ozone/platform/drm/common/client_native_pixmap_factory_gbm.cc |
| index eda2a31acab43f00bbe4d7325c4e43629f4f50e1..e6e42332fd107b9195b01dc905aea01b173fe09c 100644 |
| --- a/ui/ozone/platform/drm/common/client_native_pixmap_factory_gbm.cc |
| +++ b/ui/ozone/platform/drm/common/client_native_pixmap_factory_gbm.cc |
| @@ -4,12 +4,13 @@ |
| #include "ui/ozone/platform/drm/common/client_native_pixmap_factory_gbm.h" |
| -#include "base/file_descriptor_posix.h" |
| #include "ui/gfx/native_pixmap_handle_ozone.h" |
| #include "ui/ozone/public/client_native_pixmap_factory.h" |
| #if defined(USE_VGEM_MAP) |
| -#include <fcntl.h> |
| +#include "base/synchronization/waitable_event.h" |
| +#include "base/threading/platform_thread.h" |
| +#include "base/threading/thread_restrictions.h" |
| #include "ui/ozone/platform/drm/gpu/client_native_pixmap_vgem.h" |
| #endif |
| @@ -30,20 +31,24 @@ class ClientNativePixmapGbm : public ClientNativePixmap { |
| void GetStride(int* stride) const override { NOTREACHED(); } |
| }; |
| +} // namespace |
| + |
| class ClientNativePixmapFactoryGbm : public ClientNativePixmapFactory { |
| public: |
| - ClientNativePixmapFactoryGbm() { |
| -#if defined(USE_VGEM_MAP) |
| - // TODO(dshwang): remove ad-hoc file open. crrev.com/1248713002 |
| - static const char kVgemPath[] = "/dev/dri/renderD129"; |
| - int vgem_fd = open(kVgemPath, O_RDWR | O_CLOEXEC); |
| - vgem_fd_.reset(vgem_fd); |
| - DCHECK_GE(vgem_fd_.get(), 0) << "Failed to open: " << kVgemPath; |
| -#endif |
| - } |
| + ClientNativePixmapFactoryGbm() : set_vgem_fd_event_(true, false) {} |
| ~ClientNativePixmapFactoryGbm() override {} |
| // ClientNativePixmapFactory: |
| + void Initialize(base::ScopedFD device_fd) override { |
| +#if defined(USE_VGEM_MAP) |
| + DCHECK_LT(vgem_fd_.get(), 0); |
| + vgem_fd_ = device_fd.Pass(); |
| +#if DCHECK_IS_ON() |
| + set_vgem_fd_thread_id_ = base::PlatformThread::CurrentRef(); |
| +#endif |
| + set_vgem_fd_event_.Signal(); |
| +#endif |
| + } |
| std::vector<Configuration> GetSupportedConfigurations() const override { |
| const Configuration kConfigurations[] = { |
| {gfx::BufferFormat::BGRA_8888, gfx::BufferUsage::SCANOUT}, |
| @@ -65,6 +70,16 @@ class ClientNativePixmapFactoryGbm : public ClientNativePixmapFactory { |
| switch (usage) { |
| case gfx::BufferUsage::MAP: |
| #if defined(USE_VGEM_MAP) |
| + // A valid |vgem_fd_| is required to acquire a VGEM bo. This will wait |
| + // for a valid |vgem_fd_| if one has not yet been set. |
| + { |
| + base::ThreadRestrictions::ScopedAllowWait allow_wait; |
|
dshwang
2015/08/21 13:04:10
It waits only one time in whole render process lif
|
| + set_vgem_fd_event_.Wait(); |
| + } |
| +#if DCHECK_IS_ON() |
| + DCHECK(!(set_vgem_fd_thread_id_ == base::PlatformThread::CurrentRef())); |
| +#endif |
| + DCHECK_GE(vgem_fd_.get(), 0); |
| return ClientNativePixmapVgem::ImportFromDmabuf( |
| vgem_fd_.get(), scoped_fd.get(), size, handle.stride); |
| #endif |
| @@ -84,13 +99,15 @@ class ClientNativePixmapFactoryGbm : public ClientNativePixmapFactory { |
| private: |
| #if defined(USE_VGEM_MAP) |
| base::ScopedFD vgem_fd_; |
| +#if DCHECK_IS_ON() |
| + base::PlatformThreadRef set_vgem_fd_thread_id_; |
| +#endif |
| + base::WaitableEvent set_vgem_fd_event_; |
| #endif |
| DISALLOW_COPY_AND_ASSIGN(ClientNativePixmapFactoryGbm); |
| }; |
| -} // namespace |
| - |
| ClientNativePixmapFactory* CreateClientNativePixmapFactoryGbm() { |
| return new ClientNativePixmapFactoryGbm(); |
| } |