| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #if defined(ENABLE_GPU) | 5 #if defined(ENABLE_GPU) |
| 6 | 6 |
| 7 #include "content/common/gpu/image_transport_surface.h" | 7 #include "content/common/gpu/image_transport_surface.h" |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/debug/trace_event.h" | 12 #include "base/debug/trace_event.h" |
| 13 #include "content/common/gpu/gpu_channel.h" | 13 #include "content/common/gpu/gpu_channel.h" |
| 14 #include "content/common/gpu/gpu_channel_manager.h" | 14 #include "content/common/gpu/gpu_channel_manager.h" |
| 15 #include "content/common/gpu/gpu_command_buffer_stub.h" | 15 #include "content/common/gpu/gpu_command_buffer_stub.h" |
| 16 #include "content/common/gpu/gpu_messages.h" | 16 #include "content/common/gpu/gpu_messages.h" |
| 17 #include "gpu/command_buffer/service/gpu_scheduler.h" | 17 #include "gpu/command_buffer/service/gpu_scheduler.h" |
| 18 #include "ui/gfx/gl/gl_switches.h" | 18 #include "ui/gfx/gl/gl_switches.h" |
| 19 | 19 |
| 20 ImageTransportSurface::ImageTransportSurface() { | 20 ImageTransportSurface::ImageTransportSurface() {} |
| 21 } | |
| 22 | 21 |
| 23 ImageTransportSurface::~ImageTransportSurface() { | 22 ImageTransportSurface::~ImageTransportSurface() {} |
| 24 } | |
| 25 | 23 |
| 26 void ImageTransportSurface::GetRegionsToCopy( | 24 void ImageTransportSurface::GetRegionsToCopy( |
| 27 const gfx::Rect& previous_damage_rect, | 25 const gfx::Rect& previous_damage_rect, |
| 28 const gfx::Rect& new_damage_rect, | 26 const gfx::Rect& new_damage_rect, |
| 29 std::vector<gfx::Rect>* regions) { | 27 std::vector<gfx::Rect>* regions) { |
| 30 gfx::Rect intersection = previous_damage_rect.Intersect(new_damage_rect); | 28 gfx::Rect intersection = previous_damage_rect.Intersect(new_damage_rect); |
| 31 | 29 |
| 32 if (intersection.IsEmpty()) { | 30 if (intersection.IsEmpty()) { |
| 33 regions->push_back(previous_damage_rect); | 31 regions->push_back(previous_damage_rect); |
| 34 return; | 32 return; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 | 78 |
| 81 if (!decoder) | 79 if (!decoder) |
| 82 return false; | 80 return false; |
| 83 | 81 |
| 84 decoder->SetResizeCallback( | 82 decoder->SetResizeCallback( |
| 85 base::Bind(&ImageTransportHelper::Resize, base::Unretained(this))); | 83 base::Bind(&ImageTransportHelper::Resize, base::Unretained(this))); |
| 86 | 84 |
| 87 return true; | 85 return true; |
| 88 } | 86 } |
| 89 | 87 |
| 90 void ImageTransportHelper::Destroy() { | 88 void ImageTransportHelper::Destroy() {} |
| 91 } | |
| 92 | 89 |
| 93 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { | 90 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { |
| 94 bool handled = true; | 91 bool handled = true; |
| 95 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) | 92 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) |
| 96 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, | 93 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, |
| 97 OnBuffersSwappedACK) | 94 OnBuffersSwappedACK) |
| 98 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_PostSubBufferACK, | 95 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_PostSubBufferACK, |
| 99 OnPostSubBufferACK) | 96 OnPostSubBufferACK) |
| 100 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, | 97 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, |
| 101 OnNewSurfaceACK) | 98 OnNewSurfaceACK) |
| 102 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); | 99 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); |
| 103 IPC_MESSAGE_UNHANDLED(handled = false) | 100 IPC_MESSAGE_UNHANDLED(handled = false) |
| 104 IPC_END_MESSAGE_MAP() | 101 IPC_END_MESSAGE_MAP() |
| 105 return handled; | 102 return handled; |
| 106 } | 103 } |
| 107 | 104 |
| 108 void ImageTransportHelper::SendAcceleratedSurfaceRelease( | |
| 109 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { | |
| 110 params.surface_id = stub_->surface_id(); | |
| 111 params.route_id = route_id_; | |
| 112 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); | |
| 113 } | |
| 114 | |
| 115 void ImageTransportHelper::SendAcceleratedSurfaceNew( | 105 void ImageTransportHelper::SendAcceleratedSurfaceNew( |
| 116 GpuHostMsg_AcceleratedSurfaceNew_Params params) { | 106 GpuHostMsg_AcceleratedSurfaceNew_Params params) { |
| 117 params.surface_id = stub_->surface_id(); | 107 params.surface_id = stub_->surface_id(); |
| 118 params.route_id = route_id_; | 108 params.route_id = route_id_; |
| 119 #if defined(OS_MACOSX) | 109 #if defined(OS_MACOSX) |
| 120 params.window = handle_; | 110 params.window = handle_; |
| 121 #endif | 111 #endif |
| 122 manager_->Send(new GpuHostMsg_AcceleratedSurfaceNew(params)); | 112 manager_->Send(new GpuHostMsg_AcceleratedSurfaceNew(params)); |
| 123 } | 113 } |
| 124 | 114 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 135 void ImageTransportHelper::SendAcceleratedSurfacePostSubBuffer( | 125 void ImageTransportHelper::SendAcceleratedSurfacePostSubBuffer( |
| 136 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params) { | 126 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params) { |
| 137 params.surface_id = stub_->surface_id(); | 127 params.surface_id = stub_->surface_id(); |
| 138 params.route_id = route_id_; | 128 params.route_id = route_id_; |
| 139 #if defined(OS_MACOSX) | 129 #if defined(OS_MACOSX) |
| 140 params.window = handle_; | 130 params.window = handle_; |
| 141 #endif | 131 #endif |
| 142 manager_->Send(new GpuHostMsg_AcceleratedSurfacePostSubBuffer(params)); | 132 manager_->Send(new GpuHostMsg_AcceleratedSurfacePostSubBuffer(params)); |
| 143 } | 133 } |
| 144 | 134 |
| 135 void ImageTransportHelper::SendAcceleratedSurfaceRelease( |
| 136 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { |
| 137 params.surface_id = stub_->surface_id(); |
| 138 params.route_id = route_id_; |
| 139 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); |
| 140 } |
| 141 |
| 145 void ImageTransportHelper::SendResizeView(const gfx::Size& size) { | 142 void ImageTransportHelper::SendResizeView(const gfx::Size& size) { |
| 146 manager_->Send(new GpuHostMsg_ResizeView(stub_->surface_id(), | 143 manager_->Send(new GpuHostMsg_ResizeView(stub_->surface_id(), |
| 147 route_id_, | 144 route_id_, |
| 148 size)); | 145 size)); |
| 149 } | 146 } |
| 150 | 147 |
| 151 void ImageTransportHelper::SetScheduled(bool is_scheduled) { | 148 void ImageTransportHelper::SetScheduled(bool is_scheduled) { |
| 152 gpu::GpuScheduler* scheduler = Scheduler(); | 149 gpu::GpuScheduler* scheduler = Scheduler(); |
| 153 if (!scheduler) | 150 if (!scheduler) |
| 154 return; | 151 return; |
| 155 | 152 |
| 156 if (is_scheduled) { | 153 if (is_scheduled) { |
| 157 TRACE_EVENT_ASYNC_END0("gpu", "Descheduled", this); | 154 TRACE_EVENT_ASYNC_END0("gpu", "Descheduled", this); |
| 158 } else { | 155 } else { |
| 159 TRACE_EVENT_ASYNC_BEGIN0("gpu", "Descheduled", this); | 156 TRACE_EVENT_ASYNC_BEGIN0("gpu", "Descheduled", this); |
| 160 } | 157 } |
| 161 scheduler->SetScheduled(is_scheduled); | 158 scheduler->SetScheduled(is_scheduled); |
| 162 } | 159 } |
| 163 | 160 |
| 164 void ImageTransportHelper::DeferToFence(base::Closure task) { | 161 void ImageTransportHelper::DeferToFence(base::Closure task) { |
| 165 gpu::GpuScheduler* scheduler = Scheduler(); | 162 gpu::GpuScheduler* scheduler = Scheduler(); |
| 166 DCHECK(scheduler); | 163 DCHECK(scheduler); |
| 167 | 164 |
| 168 scheduler->DeferToFence(task); | 165 scheduler->DeferToFence(task); |
| 169 } | 166 } |
| 170 | 167 |
| 171 void ImageTransportHelper::OnBuffersSwappedACK() { | 168 bool ImageTransportHelper::MakeCurrent() { |
| 172 surface_->OnBuffersSwappedACK(); | 169 gpu::gles2::GLES2Decoder* decoder = Decoder(); |
| 170 if (!decoder) |
| 171 return false; |
| 172 return decoder->MakeCurrent(); |
| 173 } | 173 } |
| 174 | 174 |
| 175 void ImageTransportHelper::OnPostSubBufferACK() { | 175 void ImageTransportHelper::SetSwapInterval() { |
| 176 surface_->OnPostSubBufferACK(); | 176 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync)) |
| 177 Decoder()->GetGLContext()->SetSwapInterval(0); |
| 178 else |
| 179 Decoder()->GetGLContext()->SetSwapInterval(1); |
| 180 } |
| 181 |
| 182 void ImageTransportHelper::Suspend() { |
| 183 manager_->Send(new GpuHostMsg_AcceleratedSurfaceSuspend(stub_->surface_id())); |
| 184 } |
| 185 |
| 186 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { |
| 187 if (!stub_.get()) |
| 188 return NULL; |
| 189 return stub_->scheduler(); |
| 190 } |
| 191 |
| 192 gpu::gles2::GLES2Decoder* ImageTransportHelper::Decoder() { |
| 193 if (!stub_.get()) |
| 194 return NULL; |
| 195 return stub_->decoder(); |
| 177 } | 196 } |
| 178 | 197 |
| 179 void ImageTransportHelper::OnNewSurfaceACK( | 198 void ImageTransportHelper::OnNewSurfaceACK( |
| 180 uint64 surface_handle, | 199 uint64 surface_handle, |
| 181 TransportDIB::Handle shm_handle) { | 200 TransportDIB::Handle shm_handle) { |
| 182 surface_->OnNewSurfaceACK(surface_handle, shm_handle); | 201 surface_->OnNewSurfaceACK(surface_handle, shm_handle); |
| 183 } | 202 } |
| 184 | 203 |
| 204 void ImageTransportHelper::OnBuffersSwappedACK() { |
| 205 surface_->OnBuffersSwappedACK(); |
| 206 } |
| 207 |
| 208 void ImageTransportHelper::OnPostSubBufferACK() { |
| 209 surface_->OnPostSubBufferACK(); |
| 210 } |
| 211 |
| 185 void ImageTransportHelper::OnResizeViewACK() { | 212 void ImageTransportHelper::OnResizeViewACK() { |
| 186 surface_->OnResizeViewACK(); | 213 surface_->OnResizeViewACK(); |
| 187 } | 214 } |
| 188 | 215 |
| 189 void ImageTransportHelper::Resize(gfx::Size size) { | 216 void ImageTransportHelper::Resize(gfx::Size size) { |
| 190 // On windows, the surface is recreated and, in case the newly allocated | 217 // On windows, the surface is recreated and, in case the newly allocated |
| 191 // surface happens to have the same address, it should be invalidated on the | 218 // surface happens to have the same address, it should be invalidated on the |
| 192 // decoder so that future calls to MakeCurrent do not early out on the | 219 // decoder so that future calls to MakeCurrent do not early out on the |
| 193 // assumption that neither the context or surface have actually changed. | 220 // assumption that neither the context or surface have actually changed. |
| 194 #if defined(OS_WIN) | 221 #if defined(OS_WIN) |
| 195 Decoder()->ReleaseCurrent(); | 222 Decoder()->ReleaseCurrent(); |
| 196 #endif | 223 #endif |
| 197 | 224 |
| 198 surface_->OnResize(size); | 225 surface_->OnResize(size); |
| 199 | 226 |
| 200 #if defined(OS_WIN) | 227 #if defined(OS_WIN) |
| 201 Decoder()->MakeCurrent(); | 228 Decoder()->MakeCurrent(); |
| 202 SetSwapInterval(); | 229 SetSwapInterval(); |
| 203 #endif | 230 #endif |
| 204 } | 231 } |
| 205 | 232 |
| 206 void ImageTransportHelper::SetSwapInterval() { | |
| 207 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync)) | |
| 208 Decoder()->GetGLContext()->SetSwapInterval(0); | |
| 209 else | |
| 210 Decoder()->GetGLContext()->SetSwapInterval(1); | |
| 211 } | |
| 212 | |
| 213 bool ImageTransportHelper::MakeCurrent() { | |
| 214 gpu::gles2::GLES2Decoder* decoder = Decoder(); | |
| 215 if (!decoder) | |
| 216 return false; | |
| 217 return decoder->MakeCurrent(); | |
| 218 } | |
| 219 | |
| 220 void ImageTransportHelper::Suspend() { | |
| 221 manager_->Send(new GpuHostMsg_AcceleratedSurfaceSuspend(stub_->surface_id())); | |
| 222 } | |
| 223 | |
| 224 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { | |
| 225 if (!stub_.get()) | |
| 226 return NULL; | |
| 227 return stub_->scheduler(); | |
| 228 } | |
| 229 | |
| 230 gpu::gles2::GLES2Decoder* ImageTransportHelper::Decoder() { | |
| 231 if (!stub_.get()) | |
| 232 return NULL; | |
| 233 return stub_->decoder(); | |
| 234 } | |
| 235 | |
| 236 PassThroughImageTransportSurface::PassThroughImageTransportSurface( | 233 PassThroughImageTransportSurface::PassThroughImageTransportSurface( |
| 237 GpuChannelManager* manager, | 234 GpuChannelManager* manager, |
| 238 GpuCommandBufferStub* stub, | 235 GpuCommandBufferStub* stub, |
| 239 gfx::GLSurface* surface, | 236 gfx::GLSurface* surface, |
| 240 bool transport) | 237 bool transport) |
| 241 : GLSurfaceAdapter(surface), | 238 : GLSurfaceAdapter(surface), |
| 242 transport_(transport), | 239 transport_(transport), |
| 243 did_set_swap_interval_(false) { | 240 did_set_swap_interval_(false) { |
| 244 helper_.reset(new ImageTransportHelper(this, | 241 helper_.reset(new ImageTransportHelper(this, |
| 245 manager, | 242 manager, |
| 246 stub, | 243 stub, |
| 247 gfx::kNullPluginWindow)); | 244 gfx::kNullPluginWindow)); |
| 248 } | 245 } |
| 249 | 246 |
| 250 PassThroughImageTransportSurface::~PassThroughImageTransportSurface() { | |
| 251 } | |
| 252 | |
| 253 bool PassThroughImageTransportSurface::Initialize() { | 247 bool PassThroughImageTransportSurface::Initialize() { |
| 254 // The surface is assumed to have already been initialized. | 248 // The surface is assumed to have already been initialized. |
| 255 return helper_->Initialize(); | 249 return helper_->Initialize(); |
| 256 } | 250 } |
| 257 | 251 |
| 258 void PassThroughImageTransportSurface::Destroy() { | 252 void PassThroughImageTransportSurface::Destroy() { |
| 259 helper_->Destroy(); | 253 helper_->Destroy(); |
| 260 GLSurfaceAdapter::Destroy(); | 254 GLSurfaceAdapter::Destroy(); |
| 261 } | 255 } |
| 262 | 256 |
| 263 void PassThroughImageTransportSurface::OnNewSurfaceACK( | |
| 264 uint64 surface_handle, TransportDIB::Handle shm_handle) { | |
| 265 } | |
| 266 | |
| 267 bool PassThroughImageTransportSurface::SwapBuffers() { | 257 bool PassThroughImageTransportSurface::SwapBuffers() { |
| 268 bool result = gfx::GLSurfaceAdapter::SwapBuffers(); | 258 bool result = gfx::GLSurfaceAdapter::SwapBuffers(); |
| 269 | 259 |
| 270 if (transport_) { | 260 if (transport_) { |
| 271 // Round trip to the browser UI thread, for throttling, by sending a dummy | 261 // Round trip to the browser UI thread, for throttling, by sending a dummy |
| 272 // SwapBuffers message. | 262 // SwapBuffers message. |
| 273 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; | 263 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; |
| 274 params.surface_handle = 0; | 264 params.surface_handle = 0; |
| 275 #if defined(OS_WIN) | 265 #if defined(OS_WIN) |
| 276 params.size = GetSize(); | 266 params.size = GetSize(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 303 } | 293 } |
| 304 | 294 |
| 305 bool PassThroughImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { | 295 bool PassThroughImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { |
| 306 if (!did_set_swap_interval_) { | 296 if (!did_set_swap_interval_) { |
| 307 helper_->SetSwapInterval(); | 297 helper_->SetSwapInterval(); |
| 308 did_set_swap_interval_ = true; | 298 did_set_swap_interval_ = true; |
| 309 } | 299 } |
| 310 return true; | 300 return true; |
| 311 } | 301 } |
| 312 | 302 |
| 303 void PassThroughImageTransportSurface::OnNewSurfaceACK( |
| 304 uint64 surface_handle, |
| 305 TransportDIB::Handle shm_handle) { |
| 306 } |
| 307 |
| 313 void PassThroughImageTransportSurface::OnBuffersSwappedACK() { | 308 void PassThroughImageTransportSurface::OnBuffersSwappedACK() { |
| 314 DCHECK(transport_); | 309 DCHECK(transport_); |
| 315 helper_->SetScheduled(true); | 310 helper_->SetScheduled(true); |
| 316 } | 311 } |
| 317 | 312 |
| 318 void PassThroughImageTransportSurface::OnPostSubBufferACK() { | 313 void PassThroughImageTransportSurface::OnPostSubBufferACK() { |
| 319 DCHECK(transport_); | 314 DCHECK(transport_); |
| 320 helper_->SetScheduled(true); | 315 helper_->SetScheduled(true); |
| 321 } | 316 } |
| 322 | 317 |
| 323 void PassThroughImageTransportSurface::OnResizeViewACK() { | 318 void PassThroughImageTransportSurface::OnResizeViewACK() { |
| 324 DCHECK(transport_); | 319 DCHECK(transport_); |
| 325 Resize(new_size_); | 320 Resize(new_size_); |
| 326 | 321 |
| 327 helper_->SetScheduled(true); | 322 helper_->SetScheduled(true); |
| 328 } | 323 } |
| 329 | 324 |
| 330 void PassThroughImageTransportSurface::OnResize(gfx::Size size) { | 325 void PassThroughImageTransportSurface::OnResize(gfx::Size size) { |
| 331 new_size_ = size; | 326 new_size_ = size; |
| 332 | 327 |
| 333 if (transport_) { | 328 if (transport_) { |
| 334 helper_->SendResizeView(size); | 329 helper_->SendResizeView(size); |
| 335 helper_->SetScheduled(false); | 330 helper_->SetScheduled(false); |
| 336 } else { | 331 } else { |
| 337 Resize(new_size_); | 332 Resize(new_size_); |
| 338 } | 333 } |
| 339 } | 334 } |
| 340 | 335 |
| 336 PassThroughImageTransportSurface::~PassThroughImageTransportSurface() {} |
| 337 |
| 341 #endif // defined(ENABLE_GPU) | 338 #endif // defined(ENABLE_GPU) |
| OLD | NEW |