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