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)#include "content/renderer/gpu/compositor_output_surface.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame_ack.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface_client.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/gpu/client/command_buffer_proxy_impl.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_switches.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_forwarding_message_filter.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sync_channel.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebGraphicsContext3D; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// There are several compositor surfaces in a process, but they share the same 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// compositor thread, so we use a simple int here to track prefer-smoothness. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int g_prefer_smoothness_count = 0; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IPC::ForwardingMessageFilter* CompositorOutputSurface::CreateFilter( 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TaskRunner* target_task_runner) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 messages_to_filter[] = { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ViewMsg_UpdateVSyncParameters::ID, 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ViewMsg_SwapCompositorFrameAck::ID, 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ViewMsg_BeginFrame::ID 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new IPC::ForwardingMessageFilter( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) messages_to_filter, arraysize(messages_to_filter), 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_task_runner); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CompositorOutputSurface::CompositorOutputSurface( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 routing_id, 52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint32 output_surface_id, 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebGraphicsContext3DCommandBufferImpl* context3D, 545e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) cc::SoftwareOutputDevice* software_device, 555e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) bool use_swap_compositor_frame_message) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : OutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D>(context3D), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) make_scoped_ptr(software_device)), 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch output_surface_id_(output_surface_id), 595e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) use_swap_compositor_frame_message_(use_swap_compositor_frame_message), 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_surface_filter_( 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderThreadImpl::current()->compositor_output_surface_filter()), 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_(routing_id), 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefers_smoothness_(false), 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(epenner): Implement PlatformThread::CurrentHandle() on windows. 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_thread_handle_(base::PlatformThreadHandle()) 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_thread_handle_(base::PlatformThread::CurrentHandle()) 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{ 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(output_surface_filter_.get()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachFromThread(); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_sender_ = RenderThreadImpl::current()->sync_message_filter(); 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(message_sender_.get()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CompositorOutputSurface::~CompositorOutputSurface() { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetNeedsBeginFrame(false); 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!HasClient()) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateSmoothnessTakesPriority(false); 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (output_surface_proxy_.get()) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_surface_proxy_->ClearOutputSurface(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_surface_filter_->RemoveRoute(routing_id_); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool CompositorOutputSurface::BindToClient( 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::OutputSurfaceClient* client) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!cc::OutputSurface::BindToClient(client)) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_surface_proxy_ = new CompositorOutputSurfaceProxy(this); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_surface_filter_->AddRoute( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id_, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CompositorOutputSurfaceProxy::OnMessageReceived, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_surface_proxy_)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)void CompositorOutputSurface::SwapBuffers(cc::CompositorFrame* frame) { 1055e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) if (use_swap_compositor_frame_message_) { 106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch Send(new ViewHostMsg_SwapCompositorFrame(routing_id_, 107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch output_surface_id_, 108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch *frame)); 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DidSwapBuffers(); 1105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) return; 1115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) if (frame->gl_frame_data) { 1145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) WebGraphicsContext3DCommandBufferImpl* command_buffer = 1155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) static_cast<WebGraphicsContext3DCommandBufferImpl*>(context3d()); 1165e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) CommandBufferProxyImpl* command_buffer_proxy = 1175e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) command_buffer->GetCommandBufferProxy(); 1185e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) DCHECK(command_buffer_proxy); 1195e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) context3d()->shallowFlushCHROMIUM(); 1205e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) command_buffer_proxy->SetLatencyInfo(frame->metadata.latency_info); 1215e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) } 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1235e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) OutputSurface::SwapBuffers(frame); 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CompositorOutputSurface::OnMessageReceived(const IPC::Message& message) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!HasClient()) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(CompositorOutputSurface, message) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_UpdateVSyncParameters, OnUpdateVSyncParameters); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_SwapCompositorFrameAck, OnSwapAck); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrame); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CompositorOutputSurface::OnUpdateVSyncParameters( 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks timebase, base::TimeDelta interval) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnVSyncParametersChanged(timebase, interval); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void CompositorOutputSurface::SetNeedsBeginFrame(bool enable) { 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(CalledOnValidThread()); 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (needs_begin_frame_ != enable) 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Send(new ViewHostMsg_SetNeedsBeginFrame(routing_id_, enable)); 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OutputSurface::SetNeedsBeginFrame(enable); 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void CompositorOutputSurface::OnBeginFrame(const cc::BeginFrameArgs& args) { 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(CalledOnValidThread()); 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BeginFrame(args); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(OS_ANDROID) 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid CompositorOutputSurface::OnSwapAck(uint32 output_surface_id, 160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const cc::CompositorFrameAck& ack) { 161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Ignore message if it's a stale one coming from a different output surface 162ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // (e.g. after a lost context). 163ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (output_surface_id != output_surface_id_) 164ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnSwapBuffersComplete(&ack); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool CompositorOutputSurface::Send(IPC::Message* message) { 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return message_sender_->Send(message); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetThreadPriorityToIdle(base::PlatformThreadHandle handle) { 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::PlatformThread::SetThreadPriority( 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) handle, base::kThreadPriority_Background); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetThreadPriorityToDefault(base::PlatformThreadHandle handle) { 17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::PlatformThread::SetThreadPriority( 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) handle, base::kThreadPriority_Normal); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetThreadPriorityToIdle(base::PlatformThreadHandle handle) {} 18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetThreadPriorityToDefault(base::PlatformThreadHandle handle) {} 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CompositorOutputSurface::UpdateSmoothnessTakesPriority( 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool prefers_smoothness) { 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NDEBUG 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we use different compositor threads, we need to 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // use an atomic int to track prefer smoothness count. 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::PlatformThreadId g_last_thread = base::PlatformThread::CurrentId(); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(g_last_thread, base::PlatformThread::CurrentId()); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (prefers_smoothness_ == prefers_smoothness) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If this is the first surface to start preferring smoothness, 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Throttle the main thread's priority. 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (prefers_smoothness_ == false && 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++g_prefer_smoothness_count == 1) { 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetThreadPriorityToIdle(main_thread_handle_); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If this is the last surface to stop preferring smoothness, 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reset the main thread's priority to the default. 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (prefers_smoothness_ == true && 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --g_prefer_smoothness_count == 0) { 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetThreadPriorityToDefault(main_thread_handle_); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefers_smoothness_ = prefers_smoothness; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 214