| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef UI_GFX_SURFACE_ACCELERATED_SURFACE_WIN_H_ | |
| 6 #define UI_GFX_SURFACE_ACCELERATED_SURFACE_WIN_H_ | |
| 7 #pragma once | |
| 8 | |
| 9 #include <d3d9.h> | |
| 10 | |
| 11 #include "base/callback_forward.h" | |
| 12 #include "base/memory/ref_counted.h" | |
| 13 #include "base/synchronization/lock.h" | |
| 14 #include "base/synchronization/waitable_event.h" | |
| 15 #include "base/win/scoped_comptr.h" | |
| 16 #include "ui/gfx/native_widget_types.h" | |
| 17 #include "ui/gfx/size.h" | |
| 18 #include "ui/gfx/surface/surface_export.h" | |
| 19 | |
| 20 class PresentThread; | |
| 21 | |
| 22 class SURFACE_EXPORT AcceleratedPresenter | |
| 23 : public base::RefCountedThreadSafe<AcceleratedPresenter> { | |
| 24 public: | |
| 25 typedef base::Callback<void(bool)> CompletionTaskl; | |
| 26 | |
| 27 explicit AcceleratedPresenter(gfx::NativeWindow window); | |
| 28 | |
| 29 // Returns a thread safe reference to the presenter for the given window or | |
| 30 // null is no such presenter exists. The thread safe refptr ensures the | |
| 31 // presenter will not be destroyed. This can be called on any thread. | |
| 32 static scoped_refptr<AcceleratedPresenter> GetForWindow( | |
| 33 gfx::NativeWindow window); | |
| 34 | |
| 35 // Schedule a frame to be presented. The completion callback will be invoked | |
| 36 // when it is safe to write to the surface on another thread. The lock for | |
| 37 // this surface will be held while the completion callback runs. This can be | |
| 38 // called on any thread. | |
| 39 void AsyncPresentAndAcknowledge( | |
| 40 const gfx::Size& size, | |
| 41 int64 surface_handle, | |
| 42 const base::Callback<void(bool)>& completion_task); | |
| 43 | |
| 44 // Schedule the presenter to free all its resources. This can be called on any | |
| 45 // thread. | |
| 46 void Suspend(); | |
| 47 | |
| 48 // Schedule the presenter to release its reference to the shared surface. | |
| 49 void ReleaseSurface(); | |
| 50 | |
| 51 // The public member functions are called on the main thread. | |
| 52 bool Present(); | |
| 53 bool CopyTo(const gfx::Size& size, void* buf); | |
| 54 void Invalidate(); | |
| 55 | |
| 56 private: | |
| 57 friend class base::RefCountedThreadSafe<AcceleratedPresenter>; | |
| 58 | |
| 59 ~AcceleratedPresenter(); | |
| 60 | |
| 61 // These member functions are called on the PresentThread with which the | |
| 62 // presenter has affinity. | |
| 63 void DoPresentAndAcknowledge( | |
| 64 const gfx::Size& size, | |
| 65 int64 surface_handle, | |
| 66 const base::Callback<void(bool)>& completion_task); | |
| 67 void DoSuspend(); | |
| 68 void DoPresent(bool* presented); | |
| 69 bool DoRealPresent(); | |
| 70 void DoReleaseSurface(); | |
| 71 | |
| 72 // The thread with which this presenter has affinity. | |
| 73 PresentThread* const present_thread_; | |
| 74 | |
| 75 // The window that is presented to. | |
| 76 gfx::NativeWindow window_; | |
| 77 | |
| 78 // The lock is taken while any thread is calling the object, except those that | |
| 79 // simply post from the main thread to the present thread via the immutable | |
| 80 // present_thread_ member. | |
| 81 base::Lock lock_; | |
| 82 | |
| 83 // UI thread can wait on this event to ensure a present is finished. | |
| 84 base::WaitableEvent event_; | |
| 85 | |
| 86 // The current size of the swap chain. This is only accessed on the thread | |
| 87 // with which the surface has affinity. | |
| 88 gfx::Size size_; | |
| 89 | |
| 90 // This is a shared texture that is being presented from. | |
| 91 base::win::ScopedComPtr<IDirect3DTexture9> source_texture_; | |
| 92 | |
| 93 // The swap chain is presented to the child window. Copy semantics | |
| 94 // are used so it is possible to represent it to quickly validate the window. | |
| 95 base::win::ScopedComPtr<IDirect3DSwapChain9> swap_chain_; | |
| 96 | |
| 97 DISALLOW_COPY_AND_ASSIGN(AcceleratedPresenter); | |
| 98 }; | |
| 99 | |
| 100 class SURFACE_EXPORT AcceleratedSurface { | |
| 101 public: | |
| 102 AcceleratedSurface(gfx::NativeWindow window); | |
| 103 ~AcceleratedSurface(); | |
| 104 | |
| 105 // Synchronously present a frame with no acknowledgement. | |
| 106 bool Present(); | |
| 107 | |
| 108 // Copies the surface data to |buf|. The image data is transformed so that it | |
| 109 // fits in |size|. | |
| 110 // Caller must ensure that |buf| is allocated with the size no less than | |
| 111 // |4 * size.width() * size.height()| bytes. | |
| 112 bool CopyTo(const gfx::Size& size, void* buf); | |
| 113 | |
| 114 // Temporarily release resources until a new surface is asynchronously | |
| 115 // presented. Present will not be able to represent the last surface after | |
| 116 // calling this and will return false. | |
| 117 void Suspend(); | |
| 118 | |
| 119 private: | |
| 120 const scoped_refptr<AcceleratedPresenter> presenter_; | |
| 121 DISALLOW_COPY_AND_ASSIGN(AcceleratedSurface); | |
| 122 }; | |
| 123 | |
| 124 #endif // UI_GFX_SURFACE_ACCELERATED_SURFACE_WIN_H_ | |
| OLD | NEW |