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

Side by Side Diff: ppapi/proxy/ppb_context_3d_proxy.cc

Issue 7206016: Convert most remaining resources to use the API/thunk system. The significant (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 6 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 | Annotate | Revision Log
OLDNEW
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 #include "ppapi/proxy/ppb_context_3d_proxy.h" 5 #include "ppapi/proxy/ppb_context_3d_proxy.h"
6 6
7 #include "base/hash_tables.h" 7 #include "base/hash_tables.h"
8 #include "gpu/command_buffer/client/gles2_cmd_helper.h" 8 #include "gpu/command_buffer/client/gles2_cmd_helper.h"
9 #include "gpu/command_buffer/client/gles2_implementation.h" 9 #include "gpu/command_buffer/client/gles2_implementation.h"
10 #include "ppapi/c/pp_errors.h" 10 #include "ppapi/c/pp_errors.h"
11 #include "ppapi/c/pp_resource.h" 11 #include "ppapi/c/pp_resource.h"
12 #include "ppapi/c/dev/ppb_context_3d_dev.h" 12 #include "ppapi/c/dev/ppb_context_3d_dev.h"
13 #include "ppapi/c/dev/ppb_context_3d_trusted_dev.h" 13 #include "ppapi/c/dev/ppb_context_3d_trusted_dev.h"
14 #include "ppapi/proxy/enter_proxy.h"
14 #include "ppapi/proxy/plugin_dispatcher.h" 15 #include "ppapi/proxy/plugin_dispatcher.h"
15 #include "ppapi/proxy/plugin_resource.h" 16 #include "ppapi/proxy/plugin_resource.h"
16 #include "ppapi/proxy/ppapi_messages.h" 17 #include "ppapi/proxy/ppapi_messages.h"
17 #include "ppapi/proxy/ppb_surface_3d_proxy.h" 18 #include "ppapi/proxy/ppb_surface_3d_proxy.h"
19 #include "ppapi/thunk/enter.h"
20 #include "ppapi/thunk/resource_creation_api.h"
21 #include "ppapi/thunk/thunk.h"
22
23 using ppapi::thunk::EnterFunctionNoLock;
24 using ppapi::thunk::EnterResourceNoLock;
25 using ppapi::thunk::PPB_Context3D_API;
26 using ppapi::thunk::PPB_Surface3D_API;
27 using ppapi::thunk::ResourceCreationAPI;
18 28
19 namespace pp { 29 namespace pp {
20 namespace proxy { 30 namespace proxy {
21 31
22 namespace { 32 namespace {
23 33
24 PP_Resource Create(PP_Instance instance,
25 PP_Config3D_Dev config,
26 PP_Resource share_context,
27 const int32_t* attrib_list) {
28 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
29 if (!dispatcher)
30 return PP_ERROR_BADARGUMENT;
31
32 // TODO(alokp): Support shared context.
33 DCHECK_EQ(0, share_context);
34 if (share_context != 0)
35 return 0;
36
37 std::vector<int32_t> attribs;
38 if (attrib_list) {
39 for (const int32_t* attr = attrib_list; attr; ++attr)
40 attribs.push_back(*attr);
41 } else {
42 attribs.push_back(0);
43 }
44
45 HostResource result;
46 dispatcher->Send(new PpapiHostMsg_PPBContext3D_Create(
47 INTERFACE_ID_PPB_CONTEXT_3D, instance, config, attribs, &result));
48
49 if (result.is_null())
50 return 0;
51 linked_ptr<Context3D> context_3d(new Context3D(result));
52 if (!context_3d->CreateImplementation())
53 return 0;
54 return PluginResourceTracker::GetInstance()->AddResource(context_3d);
55 }
56
57 PP_Bool IsContext3D(PP_Resource resource) {
58 Context3D* object = PluginResource::GetAs<Context3D>(resource);
59 return BoolToPPBool(!!object);
60 }
61
62 int32_t GetAttrib(PP_Resource context,
63 int32_t attribute,
64 int32_t* value) {
65 // TODO(alokp): Implement me.
66 return 0;
67 }
68
69 int32_t BindSurfaces(PP_Resource context_id,
70 PP_Resource draw,
71 PP_Resource read) {
72 Context3D* object = PluginResource::GetAs<Context3D>(context_id);
73 if (!object)
74 return PP_ERROR_BADRESOURCE;
75 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(
76 object->instance());
77 if (!dispatcher)
78 return PP_ERROR_FAILED;
79
80 // TODO(alokp): Support separate draw-read surfaces.
81 DCHECK_EQ(draw, read);
82 if (draw != read)
83 return PP_GRAPHICS3DERROR_BAD_MATCH;
84
85 Surface3D* draw_surface = PluginResource::GetAs<Surface3D>(draw);
86 Surface3D* read_surface = PluginResource::GetAs<Surface3D>(read);
87 if (draw && !draw_surface)
88 return PP_ERROR_BADRESOURCE;
89 if (read && !read_surface)
90 return PP_ERROR_BADRESOURCE;
91 HostResource host_draw =
92 draw_surface ? draw_surface->host_resource() : HostResource();
93 HostResource host_read =
94 read_surface ? read_surface->host_resource() : HostResource();
95
96 int32_t result;
97 dispatcher->Send(new PpapiHostMsg_PPBContext3D_BindSurfaces(
98 INTERFACE_ID_PPB_CONTEXT_3D,
99 object->host_resource(),
100 host_draw,
101 host_read,
102 &result));
103
104 if (result == PP_OK)
105 object->BindSurfaces(draw_surface, read_surface);
106
107 return result;
108 }
109
110 int32_t GetBoundSurfaces(PP_Resource context,
111 PP_Resource* draw,
112 PP_Resource* read) {
113 Context3D* object = PluginResource::GetAs<Context3D>(context);
114 if (!object)
115 return PP_ERROR_BADRESOURCE;
116
117 Surface3D* draw_surface = object->get_draw_surface();
118 Surface3D* read_surface = object->get_read_surface();
119
120 *draw = draw_surface ? draw_surface->resource() : 0;
121 *read = read_surface ? read_surface->resource() : 0;
122 return PP_OK;
123 }
124
125
126 const PPB_Context3D_Dev context_3d_interface = {
127 &Create,
128 &IsContext3D,
129 &GetAttrib,
130 &BindSurfaces,
131 &GetBoundSurfaces,
132 };
133
134 base::SharedMemoryHandle TransportSHMHandleFromInt(Dispatcher* dispatcher, 34 base::SharedMemoryHandle TransportSHMHandleFromInt(Dispatcher* dispatcher,
135 int shm_handle) { 35 int shm_handle) {
136 // TODO(piman): Change trusted interface to return a PP_FileHandle, those 36 // TODO(piman): Change trusted interface to return a PP_FileHandle, those
137 // casts are ugly. 37 // casts are ugly.
138 base::PlatformFile source = 38 base::PlatformFile source =
139 #if defined(OS_WIN) 39 #if defined(OS_WIN)
140 reinterpret_cast<HANDLE>(static_cast<intptr_t>(shm_handle)); 40 reinterpret_cast<HANDLE>(static_cast<intptr_t>(shm_handle));
141 #elif defined(OS_POSIX) 41 #elif defined(OS_POSIX)
142 shm_handle; 42 shm_handle;
143 #else 43 #else
144 #error Not implemented. 44 #error Not implemented.
145 #endif 45 #endif
146 // Don't close the handle, it doesn't belong to us. 46 // Don't close the handle, it doesn't belong to us.
147 return dispatcher->ShareHandleWithRemote(source, false); 47 return dispatcher->ShareHandleWithRemote(source, false);
148 } 48 }
149 49
50 PP_Context3DTrustedState GetErrorState() {
51 PP_Context3DTrustedState error_state = { 0 };
52 error_state.error = kGenericError;
53 return error_state;
54 }
55
150 gpu::CommandBuffer::State GPUStateFromPPState( 56 gpu::CommandBuffer::State GPUStateFromPPState(
151 const PP_Context3DTrustedState& s) { 57 const PP_Context3DTrustedState& s) {
152 gpu::CommandBuffer::State state; 58 gpu::CommandBuffer::State state;
153 state.num_entries = s.num_entries; 59 state.num_entries = s.num_entries;
154 state.get_offset = s.get_offset; 60 state.get_offset = s.get_offset;
155 state.put_offset = s.put_offset; 61 state.put_offset = s.put_offset;
156 state.token = s.token; 62 state.token = s.token;
157 state.error = static_cast<gpu::error::Error>(s.error); 63 state.error = static_cast<gpu::error::Error>(s.error);
158 state.generation = s.generation; 64 state.generation = s.generation;
159 return state; 65 return state;
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 return false; 318 return false;
413 } 319 }
414 320
415 void PepperCommandBuffer::UpdateState(const gpu::CommandBuffer::State& state) { 321 void PepperCommandBuffer::UpdateState(const gpu::CommandBuffer::State& state) {
416 // Handle wraparound. It works as long as we don't have more than 2B state 322 // Handle wraparound. It works as long as we don't have more than 2B state
417 // updates in flight across which reordering occurs. 323 // updates in flight across which reordering occurs.
418 if (state.generation - last_state_.generation < 0x80000000U) 324 if (state.generation - last_state_.generation < 0x80000000U)
419 last_state_ = state; 325 last_state_ = state;
420 } 326 }
421 327
328 // Context3D -------------------------------------------------------------------
329
422 Context3D::Context3D(const HostResource& resource) 330 Context3D::Context3D(const HostResource& resource)
423 : PluginResource(resource), 331 : PluginResource(resource),
424 draw_(NULL), 332 draw_(NULL),
425 read_(NULL), 333 read_(NULL),
426 transfer_buffer_id_(0) { 334 transfer_buffer_id_(0) {
427 } 335 }
428 336
429 Context3D::~Context3D() { 337 Context3D::~Context3D() {
430 if (draw_) 338 if (draw_)
431 draw_->set_context(NULL); 339 draw_->set_context(NULL);
432 } 340 }
433 341
342 PPB_Context3D_API* Context3D::AsPPB_Context3D_API() {
343 return this;
344 }
345
434 bool Context3D::CreateImplementation() { 346 bool Context3D::CreateImplementation() {
435 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance()); 347 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance());
436 if (!dispatcher) 348 if (!dispatcher)
437 return false; 349 return false;
438 350
439 command_buffer_.reset(new PepperCommandBuffer(host_resource(), dispatcher)); 351 command_buffer_.reset(new PepperCommandBuffer(host_resource(), dispatcher));
440 352
441 if (!command_buffer_->Initialize(kCommandBufferSize)) 353 if (!command_buffer_->Initialize(kCommandBufferSize))
442 return false; 354 return false;
443 355
(...skipping 14 matching lines...) Expand all
458 gles2_impl_.reset(new gpu::gles2::GLES2Implementation( 370 gles2_impl_.reset(new gpu::gles2::GLES2Implementation(
459 helper_.get(), 371 helper_.get(),
460 transfer_buffer.size, 372 transfer_buffer.size,
461 transfer_buffer.ptr, 373 transfer_buffer.ptr,
462 transfer_buffer_id_, 374 transfer_buffer_id_,
463 false)); 375 false));
464 376
465 return true; 377 return true;
466 } 378 }
467 379
468 void Context3D::BindSurfaces(Surface3D* draw, Surface3D* read) { 380 int32_t Context3D::GetAttrib(int32_t attribute, int32_t* value) {
469 if (draw != draw_) { 381 // TODO(alokp): Implement me.
382 return 0;
383 }
384
385 int32_t Context3D::BindSurfaces(PP_Resource pp_draw, PP_Resource pp_read) {
386 // TODO(alokp): Support separate draw-read surfaces.
387 DCHECK_EQ(pp_draw, pp_read);
388 if (pp_draw != pp_read)
389 return PP_GRAPHICS3DERROR_BAD_MATCH;
390
391 EnterResourceNoLock<PPB_Surface3D_API> enter_draw(pp_draw, false);
392 EnterResourceNoLock<PPB_Surface3D_API> enter_read(pp_read, false);
393 Surface3D* draw_surface = enter_draw.succeeded() ?
394 static_cast<Surface3D*>(enter_draw.object()) : NULL;
395 Surface3D* read_surface = enter_read.succeeded() ?
396 static_cast<Surface3D*>(enter_read.object()) : NULL;
397
398 if (pp_draw && !draw_surface)
399 return PP_ERROR_BADRESOURCE;
400 if (pp_read && !read_surface)
401 return PP_ERROR_BADRESOURCE;
402 HostResource host_draw =
403 draw_surface ? draw_surface->host_resource() : HostResource();
404 HostResource host_read =
405 read_surface ? read_surface->host_resource() : HostResource();
406
407 int32_t result;
408 GetDispatcher()->Send(new PpapiHostMsg_PPBContext3D_BindSurfaces(
409 INTERFACE_ID_PPB_CONTEXT_3D,
410 host_resource(), host_draw, host_read, &result));
411 if (result != PP_OK)
412 return result;
413
414 if (draw_surface != draw_) {
470 if (draw_) 415 if (draw_)
471 draw_->set_context(NULL); 416 draw_->set_context(NULL);
472 if (draw) { 417 if (draw_surface) {
473 draw->set_context(this); 418 draw_surface->set_context(this);
474 // Resize the backing texture to the size of the instance when it is 419 // Resize the backing texture to the size of the instance when it is
475 // bound. 420 // bound.
476 // TODO(alokp): This should be the responsibility of plugins. 421 // TODO(alokp): This should be the responsibility of plugins.
477 PluginDispatcher* dispatcher = 422 InstanceData* data = GetDispatcher()->GetInstanceData(instance());
478 PluginDispatcher::GetForInstance(instance());
479 DCHECK(dispatcher);
480 InstanceData* data = dispatcher->GetInstanceData(instance());
481 DCHECK(data);
482 gles2_impl()->ResizeCHROMIUM(data->position.size.width, 423 gles2_impl()->ResizeCHROMIUM(data->position.size.width,
483 data->position.size.height); 424 data->position.size.height);
484 } 425 }
485 draw_ = draw; 426 draw_ = draw_surface;
486 } 427 }
487 read_ = read; 428 read_ = read_surface;
429 return PP_OK;
488 } 430 }
489 431
432 int32_t Context3D::GetBoundSurfaces(PP_Resource* draw, PP_Resource* read) {
433 *draw = draw_ ? draw_->resource() : 0;
434 *read = read_ ? read_->resource() : 0;
435 return PP_OK;
436 }
437
438 PP_Bool Context3D::InitializeTrusted(int32_t size) {
439 // Trusted interface not implemented in the proxy.
440 return PP_FALSE;
441 }
442
443 PP_Bool Context3D::GetRingBuffer(int* shm_handle,
444 uint32_t* shm_size) {
445 // Trusted interface not implemented in the proxy.
446 return PP_FALSE;
447 }
448
449 PP_Context3DTrustedState Context3D::GetState() {
450 // Trusted interface not implemented in the proxy.
451 return GetErrorState();
452 }
453
454 PP_Bool Context3D::Flush(int32_t put_offset) {
455 // Trusted interface not implemented in the proxy.
456 return PP_FALSE;
457 }
458
459 PP_Context3DTrustedState Context3D::FlushSync(int32_t put_offset) {
460 // Trusted interface not implemented in the proxy.
461 return GetErrorState();
462 }
463
464 int32_t Context3D::CreateTransferBuffer(uint32_t size) {
465 // Trusted interface not implemented in the proxy.
466 return 0;
467 }
468
469 PP_Bool Context3D::DestroyTransferBuffer(int32_t id) {
470 // Trusted interface not implemented in the proxy.
471 return PP_FALSE;
472 }
473
474 PP_Bool Context3D::GetTransferBuffer(int32_t id,
475 int* shm_handle,
476 uint32_t* shm_size) {
477 // Trusted interface not implemented in the proxy.
478 return PP_FALSE;
479 }
480
481 PP_Context3DTrustedState Context3D::FlushSyncFast(int32_t put_offset,
482 int32_t last_known_get) {
483 // Trusted interface not implemented in the proxy.
484 return GetErrorState();
485 }
486
487 void* Context3D::MapTexSubImage2DCHROMIUM(GLenum target,
488 GLint level,
489 GLint xoffset,
490 GLint yoffset,
491 GLsizei width,
492 GLsizei height,
493 GLenum format,
494 GLenum type,
495 GLenum access) {
496 return gles2_impl_->MapTexSubImage2DCHROMIUM(
497 target, level, xoffset, yoffset, width, height, format, type, access);
498 }
499
500 void Context3D::UnmapTexSubImage2DCHROMIUM(const void* mem) {
501 gles2_impl_->UnmapTexSubImage2DCHROMIUM(mem);
502 }
503
504 // PPB_Context3D_Proxy ---------------------------------------------------------
505
490 PPB_Context3D_Proxy::PPB_Context3D_Proxy(Dispatcher* dispatcher, 506 PPB_Context3D_Proxy::PPB_Context3D_Proxy(Dispatcher* dispatcher,
491 const void* target_interface) 507 const void* target_interface)
492 : InterfaceProxy(dispatcher, target_interface) { 508 : InterfaceProxy(dispatcher, target_interface) {
493 } 509 }
494 510
495 PPB_Context3D_Proxy::~PPB_Context3D_Proxy() { 511 PPB_Context3D_Proxy::~PPB_Context3D_Proxy() {
496 } 512 }
497 513
498 // static 514 // static
499 const InterfaceProxy::Info* PPB_Context3D_Proxy::GetInfo() { 515 const InterfaceProxy::Info* PPB_Context3D_Proxy::GetInfo() {
500 static const Info info = { 516 static const Info info = {
501 &context_3d_interface, 517 ::ppapi::thunk::GetPPB_Context3D_Thunk(),
502 PPB_CONTEXT_3D_DEV_INTERFACE, 518 PPB_CONTEXT_3D_DEV_INTERFACE,
503 INTERFACE_ID_PPB_CONTEXT_3D, 519 INTERFACE_ID_PPB_CONTEXT_3D,
504 false, 520 false,
505 &CreateContext3DProxy, 521 &CreateContext3DProxy,
506 }; 522 };
507 return &info; 523 return &info;
508 } 524 }
509 525
510 const PPB_Context3DTrusted_Dev* 526 // static
511 PPB_Context3D_Proxy::ppb_context_3d_trusted() const { 527 const InterfaceProxy::Info* PPB_Context3D_Proxy::GetTextureMappingInfo() {
512 return static_cast<const PPB_Context3DTrusted_Dev*>( 528 static const Info info = {
513 dispatcher()->GetLocalInterface( 529 ::ppapi::thunk::GetPPB_GLESChromiumTextureMapping_Thunk(),
514 PPB_CONTEXT_3D_TRUSTED_DEV_INTERFACE)); 530 PPB_GLES_CHROMIUM_TEXTURE_MAPPING_DEV_INTERFACE,
531 INTERFACE_ID_NONE, // CONTEXT_3D is the canonical one.
532 false,
533 &CreateContext3DProxy,
534 };
535 return &info;
536 }
537
538 // static
539 PP_Resource PPB_Context3D_Proxy::Create(PP_Instance instance,
540 PP_Config3D_Dev config,
541 PP_Resource share_context,
542 const int32_t* attrib_list) {
543 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
544 if (!dispatcher)
545 return PP_ERROR_BADARGUMENT;
546
547 // TODO(alokp): Support shared context.
548 DCHECK_EQ(0, share_context);
549 if (share_context != 0)
550 return 0;
551
552 std::vector<int32_t> attribs;
553 if (attrib_list) {
554 for (const int32_t* attr = attrib_list; attr; ++attr)
555 attribs.push_back(*attr);
556 } else {
557 attribs.push_back(0);
558 }
559
560 HostResource result;
561 dispatcher->Send(new PpapiHostMsg_PPBContext3D_Create(
562 INTERFACE_ID_PPB_CONTEXT_3D, instance, config, attribs, &result));
563
564 if (result.is_null())
565 return 0;
566 linked_ptr<Context3D> context_3d(new Context3D(result));
567 if (!context_3d->CreateImplementation())
568 return 0;
569 return PluginResourceTracker::GetInstance()->AddResource(context_3d);
515 } 570 }
516 571
517 bool PPB_Context3D_Proxy::OnMessageReceived(const IPC::Message& msg) { 572 bool PPB_Context3D_Proxy::OnMessageReceived(const IPC::Message& msg) {
518 bool handled = true; 573 bool handled = true;
519 IPC_BEGIN_MESSAGE_MAP(PPB_Context3D_Proxy, msg) 574 IPC_BEGIN_MESSAGE_MAP(PPB_Context3D_Proxy, msg)
520 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBContext3D_Create, 575 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBContext3D_Create,
521 OnMsgCreate) 576 OnMsgCreate)
522 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBContext3D_BindSurfaces, 577 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBContext3D_BindSurfaces,
523 OnMsgBindSurfaces) 578 OnMsgBindSurfaces)
524 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBContext3D_Initialize, 579 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBContext3D_Initialize,
(...skipping 13 matching lines...) Expand all
538 IPC_MESSAGE_UNHANDLED(handled = false) 593 IPC_MESSAGE_UNHANDLED(handled = false)
539 594
540 IPC_END_MESSAGE_MAP() 595 IPC_END_MESSAGE_MAP()
541 // FIXME(brettw) handle bad messages! 596 // FIXME(brettw) handle bad messages!
542 return handled; 597 return handled;
543 } 598 }
544 599
545 void PPB_Context3D_Proxy::OnMsgCreate(PP_Instance instance, 600 void PPB_Context3D_Proxy::OnMsgCreate(PP_Instance instance,
546 PP_Config3D_Dev config, 601 PP_Config3D_Dev config,
547 std::vector<int32_t> attribs, 602 std::vector<int32_t> attribs,
548 HostResource* result) { 603 HostResource* result) {
549 DCHECK(attribs.back() == 0); 604 if (attribs.empty() || attribs.back() != 0)
550 PP_Resource resource = ppb_context_3d_trusted()->CreateRaw( 605 return; // Bad message.
551 instance, config, 0, &attribs.front()); 606 EnterFunctionNoLock<ResourceCreationAPI> enter(instance, true);
552 result->SetHostResource(instance, resource); 607 if (enter.succeeded()) {
608 result->SetHostResource(
609 instance,
610 enter.functions()->CreateContext3DRaw(instance, config, 0,
611 &attribs.front()));
612 }
553 } 613 }
554 614
555 void PPB_Context3D_Proxy::OnMsgBindSurfaces(const HostResource& context, 615 void PPB_Context3D_Proxy::OnMsgBindSurfaces(const HostResource& context,
556 const HostResource& draw, 616 const HostResource& draw,
557 const HostResource& read, 617 const HostResource& read,
558 int32_t* result) { 618 int32_t* result) {
559 *result = ppb_context_3d_target()->BindSurfaces(context.host_resource(), 619 EnterHostFromHostResource<PPB_Context3D_API> enter(context);
560 draw.host_resource(), 620 if (enter.succeeded()) {
561 read.host_resource()); 621 *result = enter.object()->BindSurfaces(draw.host_resource(),
622 read.host_resource());
623 } else {
624 *result = PP_ERROR_BADRESOURCE;
625 }
562 } 626 }
563 627
564 void PPB_Context3D_Proxy::OnMsgInitialize( 628 void PPB_Context3D_Proxy::OnMsgInitialize(
565 const HostResource& context, 629 const HostResource& context,
566 int32 size, 630 int32 size,
567 base::SharedMemoryHandle* ring_buffer) { 631 base::SharedMemoryHandle* ring_buffer) {
568 const PPB_Context3DTrusted_Dev* context_3d_trusted = ppb_context_3d_trusted();
569 *ring_buffer = base::SharedMemory::NULLHandle(); 632 *ring_buffer = base::SharedMemory::NULLHandle();
570 if (!context_3d_trusted->Initialize(context.host_resource(), size)) 633 EnterHostFromHostResource<PPB_Context3D_API> enter(context);
634 if (enter.failed())
635 return;
636
637 if (!enter.object()->InitializeTrusted(size))
571 return; 638 return;
572 639
573 int shm_handle; 640 int shm_handle;
574 uint32_t shm_size; 641 uint32_t shm_size;
575 if (!context_3d_trusted->GetRingBuffer(context.host_resource(), 642 if (!enter.object()->GetRingBuffer(&shm_handle, &shm_size))
576 &shm_handle,
577 &shm_size)) {
578 return; 643 return;
579 }
580
581 *ring_buffer = TransportSHMHandleFromInt(dispatcher(), shm_handle); 644 *ring_buffer = TransportSHMHandleFromInt(dispatcher(), shm_handle);
582 } 645 }
583 646
584 void PPB_Context3D_Proxy::OnMsgGetState(const HostResource& context, 647 void PPB_Context3D_Proxy::OnMsgGetState(const HostResource& context,
585 gpu::CommandBuffer::State* state) { 648 gpu::CommandBuffer::State* state) {
586 PP_Context3DTrustedState pp_state = 649 EnterHostFromHostResource<PPB_Context3D_API> enter(context);
587 ppb_context_3d_trusted()->GetState(context.host_resource()); 650 if (enter.failed())
651 return;
652 PP_Context3DTrustedState pp_state = enter.object()->GetState();
588 *state = GPUStateFromPPState(pp_state); 653 *state = GPUStateFromPPState(pp_state);
589 } 654 }
590 655
591 void PPB_Context3D_Proxy::OnMsgFlush(const HostResource& context, 656 void PPB_Context3D_Proxy::OnMsgFlush(const HostResource& context,
592 int32 put_offset, 657 int32 put_offset,
593 int32 last_known_get, 658 int32 last_known_get,
594 gpu::CommandBuffer::State* state) { 659 gpu::CommandBuffer::State* state) {
595 PP_Context3DTrustedState pp_state = ppb_context_3d_trusted()->FlushSyncFast( 660 EnterHostFromHostResource<PPB_Context3D_API> enter(context);
596 context.host_resource(), put_offset, last_known_get); 661 if (enter.failed())
662 return;
663 PP_Context3DTrustedState pp_state = enter.object()->FlushSyncFast(
664 put_offset, last_known_get);
597 *state = GPUStateFromPPState(pp_state); 665 *state = GPUStateFromPPState(pp_state);
598 } 666 }
599 667
600 void PPB_Context3D_Proxy::OnMsgAsyncFlush(const HostResource& context, 668 void PPB_Context3D_Proxy::OnMsgAsyncFlush(const HostResource& context,
601 int32 put_offset) { 669 int32 put_offset) {
602 ppb_context_3d_trusted()->Flush(context.host_resource(), put_offset); 670 EnterHostFromHostResource<PPB_Context3D_API> enter(context);
671 if (enter.succeeded())
672 enter.object()->Flush(put_offset);
603 } 673 }
604 674
605 void PPB_Context3D_Proxy::OnMsgCreateTransferBuffer( 675 void PPB_Context3D_Proxy::OnMsgCreateTransferBuffer(
606 const HostResource& context, 676 const HostResource& context,
607 int32 size, 677 int32 size,
608 int32* id) { 678 int32* id) {
609 *id = ppb_context_3d_trusted()->CreateTransferBuffer( 679 EnterHostFromHostResource<PPB_Context3D_API> enter(context);
610 context.host_resource(), size); 680 if (enter.succeeded())
681 *id = enter.object()->CreateTransferBuffer(size);
682 else
683 *id = 0;
611 } 684 }
612 685
613 void PPB_Context3D_Proxy::OnMsgDestroyTransferBuffer( 686 void PPB_Context3D_Proxy::OnMsgDestroyTransferBuffer(
614 const HostResource& context, 687 const HostResource& context,
615 int32 id) { 688 int32 id) {
616 ppb_context_3d_trusted()->DestroyTransferBuffer(context.host_resource(), id); 689 EnterHostFromHostResource<PPB_Context3D_API> enter(context);
690 if (enter.succeeded())
691 enter.object()->DestroyTransferBuffer(id);
617 } 692 }
618 693
619 void PPB_Context3D_Proxy::OnMsgGetTransferBuffer( 694 void PPB_Context3D_Proxy::OnMsgGetTransferBuffer(
620 const HostResource& context, 695 const HostResource& context,
621 int32 id, 696 int32 id,
622 base::SharedMemoryHandle* transfer_buffer, 697 base::SharedMemoryHandle* transfer_buffer,
623 uint32* size) { 698 uint32* size) {
624 *transfer_buffer = base::SharedMemory::NULLHandle(); 699 *transfer_buffer = base::SharedMemory::NULLHandle();
625 int shm_handle; 700 *size = 0;
626 uint32_t shm_size; 701
627 if (!ppb_context_3d_trusted()->GetTransferBuffer(context.host_resource(), 702 EnterHostFromHostResource<PPB_Context3D_API> enter(context);
628 id, 703 int shm_handle = 0;
629 &shm_handle, 704 uint32_t shm_size = 0;
630 &shm_size)) { 705 if (enter.succeeded() &&
631 return; 706 enter.object()->GetTransferBuffer(id, &shm_handle, &shm_size)) {
707 *transfer_buffer = TransportSHMHandleFromInt(dispatcher(), shm_handle);
708 *size = shm_size;
632 } 709 }
633 *transfer_buffer = TransportSHMHandleFromInt(dispatcher(), shm_handle);
634 *size = shm_size;
635 } 710 }
636 711
637 } // namespace proxy 712 } // namespace proxy
638 } // namespace pp 713 } // namespace pp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698