| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/callback.h" | 9 #include "base/callback.h" |
| 10 #include "content/common/gpu/gpu_channel.h" | 10 #include "content/common/gpu/gpu_channel.h" |
| 11 #include "content/common/gpu/gpu_channel_manager.h" | 11 #include "content/common/gpu/gpu_channel_manager.h" |
| 12 #include "content/common/gpu/gpu_command_buffer_stub.h" | 12 #include "content/common/gpu/gpu_command_buffer_stub.h" |
| 13 #include "content/common/gpu/gpu_messages.h" | 13 #include "content/common/gpu/gpu_messages.h" |
| 14 #include "gpu/command_buffer/service/gpu_scheduler.h" | 14 #include "gpu/command_buffer/service/gpu_scheduler.h" |
| 15 | 15 |
| 16 ImageTransportSurface::ImageTransportSurface() { | |
| 17 } | |
| 18 | |
| 19 ImageTransportSurface::~ImageTransportSurface() { | |
| 20 } | |
| 21 | |
| 22 ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface, | 16 ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface, |
| 23 GpuChannelManager* manager, | 17 GpuChannelManager* manager, |
| 24 int32 render_view_id, | 18 int32 render_view_id, |
| 25 int32 renderer_id, | 19 int32 renderer_id, |
| 26 int32 command_buffer_id, | 20 int32 command_buffer_id, |
| 27 gfx::PluginWindowHandle handle) | 21 gfx::PluginWindowHandle handle) |
| 28 : surface_(surface), | 22 : surface_(surface), |
| 29 manager_(manager), | 23 manager_(manager), |
| 30 render_view_id_(render_view_id), | 24 render_view_id_(render_view_id), |
| 31 renderer_id_(renderer_id), | 25 renderer_id_(renderer_id), |
| (...skipping 22 matching lines...) Expand all Loading... |
| 54 void ImageTransportHelper::Destroy() { | 48 void ImageTransportHelper::Destroy() { |
| 55 } | 49 } |
| 56 | 50 |
| 57 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { | 51 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { |
| 58 bool handled = true; | 52 bool handled = true; |
| 59 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) | 53 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) |
| 60 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, | 54 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, |
| 61 OnBuffersSwappedACK) | 55 OnBuffersSwappedACK) |
| 62 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, | 56 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, |
| 63 OnNewSurfaceACK) | 57 OnNewSurfaceACK) |
| 64 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); | |
| 65 IPC_MESSAGE_UNHANDLED(handled = false) | 58 IPC_MESSAGE_UNHANDLED(handled = false) |
| 66 IPC_END_MESSAGE_MAP() | 59 IPC_END_MESSAGE_MAP() |
| 67 return handled; | 60 return handled; |
| 68 } | 61 } |
| 69 | 62 |
| 70 void ImageTransportHelper::SendAcceleratedSurfaceRelease( | 63 void ImageTransportHelper::SendAcceleratedSurfaceRelease( |
| 71 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { | 64 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { |
| 72 params.renderer_id = renderer_id_; | 65 params.renderer_id = renderer_id_; |
| 73 params.render_view_id = render_view_id_; | 66 params.render_view_id = render_view_id_; |
| 74 params.route_id = route_id_; | 67 params.route_id = route_id_; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 90 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { | 83 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { |
| 91 params.renderer_id = renderer_id_; | 84 params.renderer_id = renderer_id_; |
| 92 params.render_view_id = render_view_id_; | 85 params.render_view_id = render_view_id_; |
| 93 params.route_id = route_id_; | 86 params.route_id = route_id_; |
| 94 #if defined(OS_MACOSX) | 87 #if defined(OS_MACOSX) |
| 95 params.window = handle_; | 88 params.window = handle_; |
| 96 #endif | 89 #endif |
| 97 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); | 90 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); |
| 98 } | 91 } |
| 99 | 92 |
| 100 void ImageTransportHelper::SendResizeView(const gfx::Size& size) { | |
| 101 manager_->Send(new GpuHostMsg_ResizeView(renderer_id_, | |
| 102 render_view_id_, | |
| 103 route_id_, | |
| 104 size)); | |
| 105 } | |
| 106 | |
| 107 void ImageTransportHelper::SetScheduled(bool is_scheduled) { | 93 void ImageTransportHelper::SetScheduled(bool is_scheduled) { |
| 108 gpu::GpuScheduler* scheduler = Scheduler(); | 94 gpu::GpuScheduler* scheduler = Scheduler(); |
| 109 if (!scheduler) | 95 if (!scheduler) |
| 110 return; | 96 return; |
| 111 | 97 |
| 112 scheduler->SetScheduled(is_scheduled); | 98 scheduler->SetScheduled(is_scheduled); |
| 113 } | 99 } |
| 114 | 100 |
| 115 void ImageTransportHelper::DeferToFence(base::Closure task) { | |
| 116 gpu::GpuScheduler* scheduler = Scheduler(); | |
| 117 DCHECK(scheduler); | |
| 118 | |
| 119 scheduler->DeferToFence(task); | |
| 120 } | |
| 121 | |
| 122 void ImageTransportHelper::OnBuffersSwappedACK() { | 101 void ImageTransportHelper::OnBuffersSwappedACK() { |
| 123 surface_->OnBuffersSwappedACK(); | 102 surface_->OnBuffersSwappedACK(); |
| 124 } | 103 } |
| 125 | 104 |
| 126 void ImageTransportHelper::OnNewSurfaceACK( | 105 void ImageTransportHelper::OnNewSurfaceACK( |
| 127 uint64 surface_id, | 106 uint64 surface_id, |
| 128 TransportDIB::Handle shm_handle) { | 107 TransportDIB::Handle shm_handle) { |
| 129 surface_->OnNewSurfaceACK(surface_id, shm_handle); | 108 surface_->OnNewSurfaceACK(surface_id, shm_handle); |
| 130 } | 109 } |
| 131 | 110 |
| 132 void ImageTransportHelper::OnResizeViewACK() { | |
| 133 surface_->OnResizeViewACK(); | |
| 134 } | |
| 135 | |
| 136 void ImageTransportHelper::Resize(gfx::Size size) { | 111 void ImageTransportHelper::Resize(gfx::Size size) { |
| 137 // On windows, the surface is recreated and, in case the newly allocated | |
| 138 // surface happens to have the same address, it should be invalidated on the | |
| 139 // decoder so that future calls to MakeCurrent do not early out on the | |
| 140 // assumption that neither the context or surface have actually changed. | |
| 141 #if defined(OS_WIN) | |
| 142 Decoder()->ReleaseCurrent(); | |
| 143 #endif | |
| 144 | |
| 145 surface_->OnResize(size); | 112 surface_->OnResize(size); |
| 146 | |
| 147 #if defined(OS_WIN) | |
| 148 Decoder()->MakeCurrent(); | |
| 149 SetSwapInterval(); | |
| 150 #endif | |
| 151 } | |
| 152 | |
| 153 void ImageTransportHelper::SetSwapInterval() { | |
| 154 GpuChannel* channel = manager_->LookupChannel(renderer_id_); | |
| 155 if (!channel) | |
| 156 return; | |
| 157 | |
| 158 GpuCommandBufferStub* stub = | |
| 159 channel->LookupCommandBuffer(command_buffer_id_); | |
| 160 if (!stub) | |
| 161 return; | |
| 162 | |
| 163 stub->SetSwapInterval(); | |
| 164 } | 113 } |
| 165 | 114 |
| 166 bool ImageTransportHelper::MakeCurrent() { | 115 bool ImageTransportHelper::MakeCurrent() { |
| 167 gpu::gles2::GLES2Decoder* decoder = Decoder(); | 116 gpu::gles2::GLES2Decoder* decoder = Decoder(); |
| 168 if (!decoder) | 117 if (!decoder) |
| 169 return false; | 118 return false; |
| 170 return decoder->MakeCurrent(); | 119 return decoder->MakeCurrent(); |
| 171 } | 120 } |
| 172 | 121 |
| 173 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { | 122 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 189 return NULL; | 138 return NULL; |
| 190 | 139 |
| 191 GpuCommandBufferStub* stub = | 140 GpuCommandBufferStub* stub = |
| 192 channel->LookupCommandBuffer(command_buffer_id_); | 141 channel->LookupCommandBuffer(command_buffer_id_); |
| 193 if (!stub) | 142 if (!stub) |
| 194 return NULL; | 143 return NULL; |
| 195 | 144 |
| 196 return stub->decoder(); | 145 return stub->decoder(); |
| 197 } | 146 } |
| 198 | 147 |
| 199 PassThroughImageTransportSurface::PassThroughImageTransportSurface( | |
| 200 GpuChannelManager* manager, | |
| 201 int32 render_view_id, | |
| 202 int32 renderer_id, | |
| 203 int32 command_buffer_id, | |
| 204 gfx::GLSurface* surface) : GLSurfaceAdapter(surface) { | |
| 205 helper_.reset(new ImageTransportHelper(this, | |
| 206 manager, | |
| 207 render_view_id, | |
| 208 renderer_id, | |
| 209 command_buffer_id, | |
| 210 gfx::kNullPluginWindow)); | |
| 211 } | |
| 212 | |
| 213 PassThroughImageTransportSurface::~PassThroughImageTransportSurface() { | |
| 214 } | |
| 215 | |
| 216 bool PassThroughImageTransportSurface::Initialize() { | |
| 217 // The surface is assumed to have already been initialized. | |
| 218 return helper_->Initialize(); | |
| 219 } | |
| 220 | |
| 221 void PassThroughImageTransportSurface::Destroy() { | |
| 222 helper_->Destroy(); | |
| 223 GLSurfaceAdapter::Destroy(); | |
| 224 } | |
| 225 | |
| 226 void PassThroughImageTransportSurface::OnNewSurfaceACK( | |
| 227 uint64 surface_id, TransportDIB::Handle surface_handle) { | |
| 228 } | |
| 229 | |
| 230 void PassThroughImageTransportSurface::OnBuffersSwappedACK() { | |
| 231 } | |
| 232 | |
| 233 void PassThroughImageTransportSurface::OnResizeViewACK() { | |
| 234 helper_->SetScheduled(true); | |
| 235 } | |
| 236 | |
| 237 void PassThroughImageTransportSurface::OnResize(gfx::Size size) { | |
| 238 helper_->SendResizeView(size); | |
| 239 helper_->SetScheduled(false); | |
| 240 } | |
| 241 | |
| 242 #endif // defined(ENABLE_GPU) | 148 #endif // defined(ENABLE_GPU) |
| OLD | NEW |