Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Side by Side Diff: content/renderer/pepper/ppb_graphics_3d_impl.cc

Issue 1864723003: Make lost context and error message callbacks on GpuControl go to client (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: errorcallback: blimp Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include "content/renderer/pepper/ppb_graphics_3d_impl.h" 5 #include "content/renderer/pepper/ppb_graphics_3d_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 share_buffer = share_graphics->GetCommandBufferProxy(); 237 share_buffer = share_graphics->GetCommandBufferProxy();
238 } 238 }
239 239
240 command_buffer_ = channel_->CreateCommandBuffer( 240 command_buffer_ = channel_->CreateCommandBuffer(
241 gpu::kNullSurfaceHandle, surface_size, share_buffer, 241 gpu::kNullSurfaceHandle, surface_size, share_buffer,
242 gpu::GpuChannelHost::kDefaultStreamId, 242 gpu::GpuChannelHost::kDefaultStreamId,
243 gpu::GpuChannelHost::kDefaultStreamPriority, attribs, GURL::EmptyGURL(), 243 gpu::GpuChannelHost::kDefaultStreamPriority, attribs, GURL::EmptyGURL(),
244 gpu_preference); 244 gpu_preference);
245 if (!command_buffer_) 245 if (!command_buffer_)
246 return false; 246 return false;
247
248 command_buffer_->SetGpuControlClient(this);
249
247 if (!command_buffer_->Initialize()) 250 if (!command_buffer_->Initialize())
248 return false; 251 return false;
252
249 if (shared_state_handle) 253 if (shared_state_handle)
250 *shared_state_handle = command_buffer_->GetSharedStateHandle(); 254 *shared_state_handle = command_buffer_->GetSharedStateHandle();
251 if (capabilities) 255 if (capabilities)
252 *capabilities = command_buffer_->GetCapabilities(); 256 *capabilities = command_buffer_->GetCapabilities();
253 if (command_buffer_id) 257 if (command_buffer_id)
254 *command_buffer_id = command_buffer_->GetCommandBufferID(); 258 *command_buffer_id = command_buffer_->GetCommandBufferID();
259
255 mailbox_ = gpu::Mailbox::Generate(); 260 mailbox_ = gpu::Mailbox::Generate();
256 if (!command_buffer_->ProduceFrontBuffer(mailbox_)) 261 if (!command_buffer_->ProduceFrontBuffer(mailbox_))
257 return false; 262 return false;
258 263
259 command_buffer_->SetContextLostCallback(base::Bind(
260 &PPB_Graphics3D_Impl::OnContextLost, weak_ptr_factory_.GetWeakPtr()));
261
262 command_buffer_->SetOnConsoleMessageCallback(base::Bind(
263 &PPB_Graphics3D_Impl::OnConsoleMessage, weak_ptr_factory_.GetWeakPtr()));
264 return true; 264 return true;
265 } 265 }
266 266
267 void PPB_Graphics3D_Impl::OnConsoleMessage(const std::string& message, int id) { 267 void PPB_Graphics3D_Impl::OnGpuControlErrorMessage(const char* message,
268 int32_t id) {
268 if (!bound_to_instance_) 269 if (!bound_to_instance_)
269 return; 270 return;
270 WebPluginContainer* container = 271 WebPluginContainer* container =
271 HostGlobals::Get()->GetInstance(pp_instance())->container(); 272 HostGlobals::Get()->GetInstance(pp_instance())->container();
272 if (!container) 273 if (!container)
273 return; 274 return;
274 WebLocalFrame* frame = container->element().document().frame(); 275 WebLocalFrame* frame = container->element().document().frame();
275 if (!frame) 276 if (!frame)
276 return; 277 return;
277 WebConsoleMessage console_message = WebConsoleMessage( 278 WebConsoleMessage console_message = WebConsoleMessage(
278 WebConsoleMessage::LevelError, WebString(base::UTF8ToUTF16(message))); 279 WebConsoleMessage::LevelError, WebString(base::UTF8ToUTF16(message)));
279 frame->addMessageToConsole(console_message); 280 frame->addMessageToConsole(console_message);
280 } 281 }
281 282
282 void PPB_Graphics3D_Impl::OnSwapBuffers() { 283 void PPB_Graphics3D_Impl::OnGpuControlLostContext() {
283 if (HasPendingSwap()) { 284 // Don't need to check for null from GetPluginInstance since when we're
284 // If we're off-screen, no need to trigger and wait for compositing.
285 // Just send the swap-buffers ACK to the plugin immediately.
286 commit_pending_ = false;
287 SwapBuffersACK(PP_OK);
288 }
289 }
290
291 void PPB_Graphics3D_Impl::OnContextLost() {
292 // Don't need to check for NULL from GetPluginInstance since when we're
293 // bound, we know our instance is valid. 285 // bound, we know our instance is valid.
294 if (bound_to_instance_) { 286 if (bound_to_instance_) {
295 HostGlobals::Get()->GetInstance(pp_instance())->BindGraphics(pp_instance(), 287 HostGlobals::Get()->GetInstance(pp_instance())->BindGraphics(pp_instance(),
296 0); 288 0);
297 } 289 }
298 290
299 // Send context lost to plugin. This may have been caused by a PPAPI call, so 291 // Send context lost to plugin. This may have been caused by a PPAPI call, so
300 // avoid re-entering. 292 // avoid re-entering.
301 base::ThreadTaskRunnerHandle::Get()->PostTask( 293 base::ThreadTaskRunnerHandle::Get()->PostTask(
302 FROM_HERE, base::Bind(&PPB_Graphics3D_Impl::SendContextLost, 294 FROM_HERE, base::Bind(&PPB_Graphics3D_Impl::SendContextLost,
303 weak_ptr_factory_.GetWeakPtr())); 295 weak_ptr_factory_.GetWeakPtr()));
304 } 296 }
305 297
298 void PPB_Graphics3D_Impl::OnSwapBuffers() {
299 if (HasPendingSwap()) {
300 // If we're off-screen, no need to trigger and wait for compositing.
301 // Just send the swap-buffers ACK to the plugin immediately.
302 commit_pending_ = false;
303 SwapBuffersACK(PP_OK);
304 }
305 }
306
306 void PPB_Graphics3D_Impl::SendContextLost() { 307 void PPB_Graphics3D_Impl::SendContextLost() {
307 // By the time we run this, the instance may have been deleted, or in the 308 // By the time we run this, the instance may have been deleted, or in the
308 // process of being deleted. Even in the latter case, we don't want to send a 309 // process of being deleted. Even in the latter case, we don't want to send a
309 // callback after DidDestroy. 310 // callback after DidDestroy.
310 PepperPluginInstanceImpl* instance = 311 PepperPluginInstanceImpl* instance =
311 HostGlobals::Get()->GetInstance(pp_instance()); 312 HostGlobals::Get()->GetInstance(pp_instance());
312 if (!instance || !instance->container()) 313 if (!instance || !instance->container())
313 return; 314 return;
314 315
315 // This PPB_Graphics3D_Impl could be deleted during the call to 316 // This PPB_Graphics3D_Impl could be deleted during the call to
316 // GetPluginInterface (which sends a sync message in some cases). We still 317 // GetPluginInterface (which sends a sync message in some cases). We still
317 // send the Graphics3DContextLost to the plugin; the instance may care about 318 // send the Graphics3DContextLost to the plugin; the instance may care about
318 // that event even though this context has been destroyed. 319 // that event even though this context has been destroyed.
319 PP_Instance this_pp_instance = pp_instance(); 320 PP_Instance this_pp_instance = pp_instance();
320 const PPP_Graphics3D* ppp_graphics_3d = static_cast<const PPP_Graphics3D*>( 321 const PPP_Graphics3D* ppp_graphics_3d = static_cast<const PPP_Graphics3D*>(
321 instance->module()->GetPluginInterface(PPP_GRAPHICS_3D_INTERFACE)); 322 instance->module()->GetPluginInterface(PPP_GRAPHICS_3D_INTERFACE));
322 // We have to check *again* that the instance exists, because it could have 323 // We have to check *again* that the instance exists, because it could have
323 // been deleted during GetPluginInterface(). Even the PluginModule could be 324 // been deleted during GetPluginInterface(). Even the PluginModule could be
324 // deleted, but in that case, the instance should also be gone, so the 325 // deleted, but in that case, the instance should also be gone, so the
325 // GetInstance check covers both cases. 326 // GetInstance check covers both cases.
326 if (ppp_graphics_3d && HostGlobals::Get()->GetInstance(this_pp_instance)) 327 if (ppp_graphics_3d && HostGlobals::Get()->GetInstance(this_pp_instance))
327 ppp_graphics_3d->Graphics3DContextLost(this_pp_instance); 328 ppp_graphics_3d->Graphics3DContextLost(this_pp_instance);
328 } 329 }
329 330
330 } // namespace content 331 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698