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