OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CC_RESOURCES_SINGLE_RELEASE_CALLBACK_H_ | 5 #ifndef CC_RESOURCES_SINGLE_RELEASE_CALLBACK_H_ |
6 #define CC_RESOURCES_SINGLE_RELEASE_CALLBACK_H_ | 6 #define CC_RESOURCES_SINGLE_RELEASE_CALLBACK_H_ |
7 | 7 |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
11 #include "cc/base/cc_export.h" | 11 #include "cc/base/cc_export.h" |
12 #include "cc/resources/release_callback.h" | 12 #include "cc/resources/release_callback.h" |
| 13 #include "mojo/public/cpp/bindings/struct_traits.h" |
| 14 |
| 15 namespace mojo { |
| 16 template <class T> |
| 17 class InterfacePtr; |
| 18 } |
13 | 19 |
14 namespace cc { | 20 namespace cc { |
15 | 21 |
| 22 namespace mojom { |
| 23 class SingleReleaseCallbackDataView; |
| 24 class TextureMailboxReleaser; |
| 25 typedef mojo::InterfacePtr<TextureMailboxReleaser> TextureMailboxReleaserPtr; |
| 26 } |
| 27 |
16 class CC_EXPORT SingleReleaseCallback { | 28 class CC_EXPORT SingleReleaseCallback { |
| 29 class PtrHolder { |
| 30 public: |
| 31 virtual ~PtrHolder() {} |
| 32 virtual mojom::TextureMailboxReleaserPtr TakePtr() = 0; |
| 33 virtual void Release(const gpu::SyncToken& sync_token, bool is_lost) = 0; |
| 34 }; |
| 35 |
| 36 template <class T> |
| 37 class PtrHolderImpl : public PtrHolder { |
| 38 public: |
| 39 explicit PtrHolderImpl(T ptr) : ptr_(std::move(ptr)) {} |
| 40 T TakePtr() { return std::move(ptr_); } |
| 41 void Release(const gpu::SyncToken& sync_token, bool is_lost) override { |
| 42 ptr_->Release(sync_token, is_lost); |
| 43 } |
| 44 |
| 45 private: |
| 46 T ptr_; |
| 47 }; |
| 48 |
17 public: | 49 public: |
18 static std::unique_ptr<SingleReleaseCallback> Create( | 50 static std::unique_ptr<SingleReleaseCallback> Create( |
19 const ReleaseCallback& cb) { | 51 const ReleaseCallback& cb) { |
20 return base::WrapUnique(new SingleReleaseCallback(cb)); | 52 return base::WrapUnique(new SingleReleaseCallback(cb)); |
21 } | 53 } |
22 | 54 |
| 55 template <class T> |
| 56 static std::unique_ptr<SingleReleaseCallback> Create(T ptr) { |
| 57 auto ptr_holder = base::MakeUnique<PtrHolderImpl<T>>(std::move(ptr)); |
| 58 return base::WrapUnique(new SingleReleaseCallback(std::move(ptr_holder))); |
| 59 } |
| 60 |
23 ~SingleReleaseCallback(); | 61 ~SingleReleaseCallback(); |
24 | 62 |
25 void Run(const gpu::SyncToken& sync_token, bool is_lost); | 63 void Run(const gpu::SyncToken& sync_token, bool is_lost); |
26 | 64 |
27 private: | 65 private: |
| 66 friend struct mojo::StructTraits<mojom::SingleReleaseCallbackDataView, |
| 67 std::unique_ptr<SingleReleaseCallback>>; |
| 68 |
28 explicit SingleReleaseCallback(const ReleaseCallback& callback); | 69 explicit SingleReleaseCallback(const ReleaseCallback& callback); |
| 70 explicit SingleReleaseCallback(std::unique_ptr<PtrHolder> ptr_holder); |
29 | 71 |
30 ReleaseCallback callback_; | 72 ReleaseCallback callback_; |
| 73 std::unique_ptr<PtrHolder> ptr_holder_; |
| 74 |
| 75 DISALLOW_COPY_AND_ASSIGN(SingleReleaseCallback); |
31 }; | 76 }; |
32 | 77 |
33 } // namespace cc | 78 } // namespace cc |
34 | 79 |
35 #endif // CC_RESOURCES_SINGLE_RELEASE_CALLBACK_H_ | 80 #endif // CC_RESOURCES_SINGLE_RELEASE_CALLBACK_H_ |
OLD | NEW |