15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_SURFACE_ACCELERATED_SURFACE_WIN_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_SURFACE_ACCELERATED_SURFACE_WIN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <d3d9.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/single_thread_task_runner.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_comptr.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/latency_info.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/surface/surface_export.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PresentThread;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VideoFrame;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SURFACE_EXPORT AcceleratedPresenter
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<AcceleratedPresenter> {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(bool,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              base::TimeTicks,
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              base::TimeDelta,
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              const ui::LatencyInfo&)> CompletionTask;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit AcceleratedPresenter(gfx::PluginWindowHandle window);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static void SetAdapterLUID(uint64 adapter_luid);
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a thread safe reference to the presenter for the given window or
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // null is no such presenter exists. The thread safe refptr ensures the
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // presenter will not be destroyed. This can be called on any thread.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_refptr<AcceleratedPresenter> GetForWindow(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::PluginWindowHandle window);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedule a frame to be presented. The completion callback will be invoked
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when it is safe to write to the surface on another thread. The lock for
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this surface will be held while the completion callback runs. This can be
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called on any thread.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AsyncPresentAndAcknowledge(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& size,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 surface_handle,
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const ui::LatencyInfo& latency_info,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CompletionTask& completion_task);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Returns true if the swap chain has been created and initialized.  This can
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // be called on any thread.
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool IsSwapChainInitialized() const;
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedule the presenter to free all its resources. This can be called on any
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Suspend();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates that the presenter has become invisible.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WasHidden();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when the Windows session is locked or unlocked.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetIsSessionLocked(bool locked);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedule the presenter to release its reference to the shared surface.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseSurface();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The public member functions are called on the main thread.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Present(HDC dc);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AsyncCopyTo(const gfx::Rect& src_subrect,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   const gfx::Size& dst_size,
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   const base::Callback<void(bool, const SkBitmap&)>& callback);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AsyncCopyToVideoFrame(
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Rect& src_subrect,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const scoped_refptr<media::VideoFrame>& target,
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Callback<void(bool)>& callback);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Invalidate();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Destroy any D3D resources owned by the given present thread. Called on
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the given present thread.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ResetPresentThread(PresentThread* present_thread);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(scottmg): This is a temporary hack until we have a two-worlds ash/aura
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // separation.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetNewTargetWindow(gfx::PluginWindowHandle window);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<AcceleratedPresenter>;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AcceleratedPresenter();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These member functions are called on the PresentThread with which the
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // presenter has affinity.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoPresentAndAcknowledge(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& size,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 surface_handle,
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const ui::LatencyInfo& latency_info,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CompletionTask& completion_task);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoSuspend();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoPresent(const base::Closure& composite_task);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoReleaseSurface();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoCopyToAndAcknowledge(
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Rect& src_subrect,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Size& dst_size,
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> callback_runner,
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Callback<void(bool, const SkBitmap&)>& callback);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoCopyToVideoFrameAndAcknowledge(
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Rect& src_subrect,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const scoped_refptr<media::VideoFrame>& target,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const scoped_refptr<base::SingleThreadTaskRunner>& callback_runner,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Callback<void(bool)>& callback);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DoCopyToYUV(const gfx::Rect& src_subrect,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   const scoped_refptr<media::VideoFrame>& frame);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DoCopyToARGB(const gfx::Rect& src_subrect,
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const gfx::Size& dst_size,
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    SkBitmap* bitmap);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PresentWithGDI(HDC dc);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size GetWindowSize();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function tries to guess whether Direct3D will be able to reliably
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // present to the window. When the window is resizing, presenting with
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Direct3D causes other regions of the window rendered with GDI to
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // flicker transparent / non-transparent.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckDirect3DWillWork();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The thread with which this presenter has affinity.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PresentThread* const present_thread_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The window that is presented to.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::PluginWindowHandle window_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UI thread can wait on this event to ensure a present is finished.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WaitableEvent event_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The current size of the swap chain. This is only accessed on the thread
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with which the surface has affinity. The swap chain size is rounded up and
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is not necessarily the same as the window size.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size quantized_size_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The size of the window on the last present. This is used to trigger the
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // compositor instead of presenting the last frame in the case where the
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window has been resized.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size present_size_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a shared texture that is being presented from.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedComPtr<IDirect3DTexture9> source_texture_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The swap chain is presented to the child window. Copy semantics
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are used so it is possible to represent it to quickly validate the window.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedComPtr<IDirect3DSwapChain9> swap_chain_;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the window is hidden or has not been presented to since it was
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // last hidden.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hidden_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set to true if the first present after the tab is unhidden needs to be done
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // with GDI.
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool do_present_with_GDI_;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set to true when the Windows session is locked.
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_session_locked_;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These are used to detect when the window is resizing. For some reason,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // presenting with D3D while the window resizes causes those parts not
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // drawn with D3D (e.g. with GDI) to flicker visible / invisible.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/120904
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size last_window_size_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_window_resize_time_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::LatencyInfo latency_info_;
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AcceleratedPresenter);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SURFACE_EXPORT AcceleratedSurface {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AcceleratedSurface(gfx::PluginWindowHandle window);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AcceleratedSurface();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Synchronously present a frame with no acknowledgement.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Present(HDC dc);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Returns true if the surface is fully initialized and has been presented to
1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // at least once.
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool IsReadyForCopy() const;
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Transfer the contents of the surface to an SkBitmap, and invoke a callback
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // with the result.
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AsyncCopyTo(const gfx::Rect& src_subrect,
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   const gfx::Size& dst_size,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   const base::Callback<void(bool, const SkBitmap&)>& callback);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Transfer the contents of the surface to an already-allocated YV12
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // VideoFrame, and invoke a callback to indicate success or failure.
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AsyncCopyToVideoFrame(
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Rect& src_subrect,
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const scoped_refptr<media::VideoFrame>& target,
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Callback<void(bool)>& callback);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporarily release resources until a new surface is asynchronously
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // presented. Present will not be able to represent the last surface after
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // calling this and will return false.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Suspend();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates that the surface has become invisible.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WasHidden();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when the Windows session in locked or unlocked.
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetIsSessionLocked(bool locked);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<AcceleratedPresenter> presenter_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AcceleratedSurface);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_SURFACE_ACCELERATED_SURFACE_WIN_H_
229