Index: cc/resources/single_release_callback.h |
diff --git a/cc/resources/single_release_callback.h b/cc/resources/single_release_callback.h |
index cfb2330a4c2a436756760bb0a46bf08b170ce5c8..64fea50e1b6ec3fb39eb8b9bd4dae8aa92ad11f5 100644 |
--- a/cc/resources/single_release_callback.h |
+++ b/cc/resources/single_release_callback.h |
@@ -10,24 +10,69 @@ |
#include "base/memory/ptr_util.h" |
#include "cc/base/cc_export.h" |
#include "cc/resources/release_callback.h" |
+#include "mojo/public/cpp/bindings/struct_traits.h" |
+ |
+namespace mojo { |
+template <class T> |
+class InterfacePtr; |
+} |
namespace cc { |
+namespace mojom { |
+class SingleReleaseCallbackDataView; |
+class TextureMailboxReleaser; |
+typedef mojo::InterfacePtr<TextureMailboxReleaser> TextureMailboxReleaserPtr; |
+} |
+ |
class CC_EXPORT SingleReleaseCallback { |
+ class PtrHolder { |
+ public: |
+ virtual ~PtrHolder() {} |
+ virtual mojom::TextureMailboxReleaserPtr TakePtr() = 0; |
+ virtual void Release(const gpu::SyncToken& sync_token, bool is_lost) = 0; |
+ }; |
+ |
+ template <class T> |
+ class PtrHolderImpl : public PtrHolder { |
+ public: |
+ explicit PtrHolderImpl(T ptr) : ptr_(std::move(ptr)) {} |
+ T TakePtr() { return std::move(ptr_); } |
+ void Release(const gpu::SyncToken& sync_token, bool is_lost) override { |
+ ptr_->Release(sync_token, is_lost); |
+ } |
+ |
+ private: |
+ T ptr_; |
+ }; |
+ |
public: |
static std::unique_ptr<SingleReleaseCallback> Create( |
const ReleaseCallback& cb) { |
return base::WrapUnique(new SingleReleaseCallback(cb)); |
} |
+ template <class T> |
+ static std::unique_ptr<SingleReleaseCallback> Create(T ptr) { |
+ auto ptr_holder = base::MakeUnique<PtrHolderImpl<T>>(std::move(ptr)); |
+ return base::WrapUnique(new SingleReleaseCallback(std::move(ptr_holder))); |
+ } |
+ |
~SingleReleaseCallback(); |
void Run(const gpu::SyncToken& sync_token, bool is_lost); |
private: |
+ friend struct mojo::StructTraits<mojom::SingleReleaseCallbackDataView, |
+ std::unique_ptr<SingleReleaseCallback>>; |
+ |
explicit SingleReleaseCallback(const ReleaseCallback& callback); |
+ explicit SingleReleaseCallback(std::unique_ptr<PtrHolder> ptr_holder); |
ReleaseCallback callback_; |
+ std::unique_ptr<PtrHolder> ptr_holder_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SingleReleaseCallback); |
}; |
} // namespace cc |