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 |
16 ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface, | 22 ImageTransportHelper::ImageTransportHelper(ImageTransportSurface* surface, |
17 GpuChannelManager* manager, | 23 GpuChannelManager* manager, |
18 int32 render_view_id, | 24 int32 render_view_id, |
19 int32 renderer_id, | 25 int32 renderer_id, |
20 int32 command_buffer_id, | 26 int32 command_buffer_id, |
21 gfx::PluginWindowHandle handle) | 27 gfx::PluginWindowHandle handle) |
22 : surface_(surface), | 28 : surface_(surface), |
23 manager_(manager), | 29 manager_(manager), |
24 render_view_id_(render_view_id), | 30 render_view_id_(render_view_id), |
25 renderer_id_(renderer_id), | 31 renderer_id_(renderer_id), |
(...skipping 22 matching lines...) Expand all Loading... |
48 void ImageTransportHelper::Destroy() { | 54 void ImageTransportHelper::Destroy() { |
49 } | 55 } |
50 | 56 |
51 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { | 57 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { |
52 bool handled = true; | 58 bool handled = true; |
53 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) | 59 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) |
54 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, | 60 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, |
55 OnBuffersSwappedACK) | 61 OnBuffersSwappedACK) |
56 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, | 62 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, |
57 OnNewSurfaceACK) | 63 OnNewSurfaceACK) |
| 64 IPC_MESSAGE_HANDLER(GpuMsg_ResizeViewACK, OnResizeViewACK); |
58 IPC_MESSAGE_UNHANDLED(handled = false) | 65 IPC_MESSAGE_UNHANDLED(handled = false) |
59 IPC_END_MESSAGE_MAP() | 66 IPC_END_MESSAGE_MAP() |
60 return handled; | 67 return handled; |
61 } | 68 } |
62 | 69 |
63 void ImageTransportHelper::SendAcceleratedSurfaceRelease( | 70 void ImageTransportHelper::SendAcceleratedSurfaceRelease( |
64 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { | 71 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { |
65 params.renderer_id = renderer_id_; | 72 params.renderer_id = renderer_id_; |
66 params.render_view_id = render_view_id_; | 73 params.render_view_id = render_view_id_; |
67 params.route_id = route_id_; | 74 params.route_id = route_id_; |
(...skipping 15 matching lines...) Expand all Loading... |
83 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { | 90 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params) { |
84 params.renderer_id = renderer_id_; | 91 params.renderer_id = renderer_id_; |
85 params.render_view_id = render_view_id_; | 92 params.render_view_id = render_view_id_; |
86 params.route_id = route_id_; | 93 params.route_id = route_id_; |
87 #if defined(OS_MACOSX) | 94 #if defined(OS_MACOSX) |
88 params.window = handle_; | 95 params.window = handle_; |
89 #endif | 96 #endif |
90 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); | 97 manager_->Send(new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); |
91 } | 98 } |
92 | 99 |
| 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 |
93 void ImageTransportHelper::SetScheduled(bool is_scheduled) { | 107 void ImageTransportHelper::SetScheduled(bool is_scheduled) { |
94 gpu::GpuScheduler* scheduler = Scheduler(); | 108 gpu::GpuScheduler* scheduler = Scheduler(); |
95 if (!scheduler) | 109 if (!scheduler) |
96 return; | 110 return; |
97 | 111 |
98 scheduler->SetScheduled(is_scheduled); | 112 scheduler->SetScheduled(is_scheduled); |
99 } | 113 } |
100 | 114 |
| 115 void ImageTransportHelper::DeferToFence(base::Closure task) { |
| 116 gpu::GpuScheduler* scheduler = Scheduler(); |
| 117 DCHECK(scheduler); |
| 118 |
| 119 scheduler->DeferToFence(task); |
| 120 } |
| 121 |
101 void ImageTransportHelper::OnBuffersSwappedACK() { | 122 void ImageTransportHelper::OnBuffersSwappedACK() { |
102 surface_->OnBuffersSwappedACK(); | 123 surface_->OnBuffersSwappedACK(); |
103 } | 124 } |
104 | 125 |
105 void ImageTransportHelper::OnNewSurfaceACK( | 126 void ImageTransportHelper::OnNewSurfaceACK( |
106 uint64 surface_id, | 127 uint64 surface_id, |
107 TransportDIB::Handle shm_handle) { | 128 TransportDIB::Handle shm_handle) { |
108 surface_->OnNewSurfaceACK(surface_id, shm_handle); | 129 surface_->OnNewSurfaceACK(surface_id, shm_handle); |
109 } | 130 } |
110 | 131 |
| 132 void ImageTransportHelper::OnResizeViewACK() { |
| 133 surface_->OnResizeViewACK(); |
| 134 } |
| 135 |
111 void ImageTransportHelper::Resize(gfx::Size size) { | 136 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 |
112 surface_->OnResize(size); | 145 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(); |
113 } | 164 } |
114 | 165 |
115 bool ImageTransportHelper::MakeCurrent() { | 166 bool ImageTransportHelper::MakeCurrent() { |
116 gpu::gles2::GLES2Decoder* decoder = Decoder(); | 167 gpu::gles2::GLES2Decoder* decoder = Decoder(); |
117 if (!decoder) | 168 if (!decoder) |
118 return false; | 169 return false; |
119 return decoder->MakeCurrent(); | 170 return decoder->MakeCurrent(); |
120 } | 171 } |
121 | 172 |
122 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { | 173 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { |
(...skipping 15 matching lines...) Expand all Loading... |
138 return NULL; | 189 return NULL; |
139 | 190 |
140 GpuCommandBufferStub* stub = | 191 GpuCommandBufferStub* stub = |
141 channel->LookupCommandBuffer(command_buffer_id_); | 192 channel->LookupCommandBuffer(command_buffer_id_); |
142 if (!stub) | 193 if (!stub) |
143 return NULL; | 194 return NULL; |
144 | 195 |
145 return stub->decoder(); | 196 return stub->decoder(); |
146 } | 197 } |
147 | 198 |
| 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 |
148 #endif // defined(ENABLE_GPU) | 242 #endif // defined(ENABLE_GPU) |
OLD | NEW |