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

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

Issue 8919014: Revert "Revert 113479 - Revert "Revert 113250 - Add CommandBuffer::SetGetBuffer"" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years 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
« no previous file with comments | « ppapi/proxy/ppb_graphics_3d_proxy.h ('k') | ppapi/thunk/ppb_graphics_3d_api.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_graphics_3d_proxy.h" 5 #include "ppapi/proxy/ppb_graphics_3d_proxy.h"
6 6
7 #include "gpu/command_buffer/client/gles2_implementation.h" 7 #include "gpu/command_buffer/client/gles2_implementation.h"
8 #include "ppapi/c/pp_errors.h" 8 #include "ppapi/c/pp_errors.h"
9 #include "ppapi/proxy/enter_proxy.h" 9 #include "ppapi/proxy/enter_proxy.h"
10 #include "ppapi/proxy/plugin_dispatcher.h" 10 #include "ppapi/proxy/plugin_dispatcher.h"
(...skipping 13 matching lines...) Expand all
24 namespace { 24 namespace {
25 const int32 kCommandBufferSize = 1024 * 1024; 25 const int32 kCommandBufferSize = 1024 * 1024;
26 const int32 kTransferBufferSize = 1024 * 1024; 26 const int32 kTransferBufferSize = 1024 * 1024;
27 27
28 class CommandBuffer : public gpu::CommandBuffer { 28 class CommandBuffer : public gpu::CommandBuffer {
29 public: 29 public:
30 CommandBuffer(const HostResource& resource, PluginDispatcher* dispatcher); 30 CommandBuffer(const HostResource& resource, PluginDispatcher* dispatcher);
31 virtual ~CommandBuffer(); 31 virtual ~CommandBuffer();
32 32
33 // gpu::CommandBuffer implementation: 33 // gpu::CommandBuffer implementation:
34 virtual bool Initialize(int32 size); 34 virtual bool Initialize();
35 virtual bool Initialize(base::SharedMemory* buffer, int32 size);
36 virtual gpu::Buffer GetRingBuffer();
37 virtual State GetState(); 35 virtual State GetState();
38 virtual State GetLastState(); 36 virtual State GetLastState();
39 virtual void Flush(int32 put_offset); 37 virtual void Flush(int32 put_offset);
40 virtual State FlushSync(int32 put_offset, int32 last_known_get); 38 virtual State FlushSync(int32 put_offset, int32 last_known_get);
39 virtual void SetGetBuffer(int32 transfer_buffer_id);
41 virtual void SetGetOffset(int32 get_offset); 40 virtual void SetGetOffset(int32 get_offset);
42 virtual int32 CreateTransferBuffer(size_t size, int32 id_request); 41 virtual int32 CreateTransferBuffer(size_t size, int32 id_request);
43 virtual int32 RegisterTransferBuffer(base::SharedMemory* shared_memory, 42 virtual int32 RegisterTransferBuffer(base::SharedMemory* shared_memory,
44 size_t size, 43 size_t size,
45 int32 id_request); 44 int32 id_request);
46 virtual void DestroyTransferBuffer(int32 id); 45 virtual void DestroyTransferBuffer(int32 id);
47 virtual gpu::Buffer GetTransferBuffer(int32 handle); 46 virtual gpu::Buffer GetTransferBuffer(int32 handle);
48 virtual void SetToken(int32 token); 47 virtual void SetToken(int32 token);
49 virtual void SetParseError(gpu::error::Error error); 48 virtual void SetParseError(gpu::error::Error error);
50 virtual void SetContextLostReason(gpu::error::ContextLostReason reason); 49 virtual void SetContextLostReason(gpu::error::ContextLostReason reason);
51 50
52 private: 51 private:
53 bool Send(IPC::Message* msg); 52 bool Send(IPC::Message* msg);
54 void UpdateState(const gpu::CommandBuffer::State& state); 53 void UpdateState(const gpu::CommandBuffer::State& state);
55 54
56 int32 num_entries_;
57 scoped_ptr<base::SharedMemory> ring_buffer_;
58
59 typedef base::hash_map<int32, gpu::Buffer> TransferBufferMap; 55 typedef base::hash_map<int32, gpu::Buffer> TransferBufferMap;
60 TransferBufferMap transfer_buffers_; 56 TransferBufferMap transfer_buffers_;
61 57
62 State last_state_; 58 State last_state_;
63 59
64 HostResource resource_; 60 HostResource resource_;
65 PluginDispatcher* dispatcher_; 61 PluginDispatcher* dispatcher_;
66 62
67 DISALLOW_COPY_AND_ASSIGN(CommandBuffer); 63 DISALLOW_COPY_AND_ASSIGN(CommandBuffer);
68 }; 64 };
69 65
70 CommandBuffer::CommandBuffer(const HostResource& resource, 66 CommandBuffer::CommandBuffer(const HostResource& resource,
71 PluginDispatcher* dispatcher) 67 PluginDispatcher* dispatcher)
72 : num_entries_(0), 68 : resource_(resource),
73 resource_(resource),
74 dispatcher_(dispatcher) { 69 dispatcher_(dispatcher) {
75 } 70 }
76 71
77 CommandBuffer::~CommandBuffer() { 72 CommandBuffer::~CommandBuffer() {
78 // Delete all the locally cached shared memory objects, closing the handle 73 // Delete all the locally cached shared memory objects, closing the handle
79 // in this process. 74 // in this process.
80 for (TransferBufferMap::iterator it = transfer_buffers_.begin(); 75 for (TransferBufferMap::iterator it = transfer_buffers_.begin();
81 it != transfer_buffers_.end(); ++it) { 76 it != transfer_buffers_.end(); ++it) {
82 delete it->second.shared_memory; 77 delete it->second.shared_memory;
83 it->second.shared_memory = NULL; 78 it->second.shared_memory = NULL;
84 } 79 }
85 } 80 }
86 81
87 bool CommandBuffer::Initialize(int32 size) { 82 bool CommandBuffer::Initialize() {
88 DCHECK(!ring_buffer_.get()); 83 return Send(new PpapiHostMsg_PPBGraphics3D_InitCommandBuffer(
89 84 API_ID_PPB_GRAPHICS_3D, resource_));
90 // Initialize the service. Assuming we are sandboxed, the GPU
91 // process is responsible for duplicating the handle. This might not be true
92 // for NaCl.
93 base::SharedMemoryHandle handle;
94 if (Send(new PpapiHostMsg_PPBGraphics3D_InitCommandBuffer(
95 API_ID_PPB_GRAPHICS_3D, resource_, size, &handle)) &&
96 base::SharedMemory::IsHandleValid(handle)) {
97 ring_buffer_.reset(new base::SharedMemory(handle, false));
98 if (ring_buffer_->Map(size)) {
99 num_entries_ = size / sizeof(gpu::CommandBufferEntry);
100 return true;
101 }
102
103 ring_buffer_.reset();
104 }
105
106 return false;
107 }
108
109 bool CommandBuffer::Initialize(base::SharedMemory* buffer, int32 size) {
110 // Not implemented in proxy.
111 NOTREACHED();
112 return false;
113 }
114
115 gpu::Buffer CommandBuffer::GetRingBuffer() {
116 // Return locally cached ring buffer.
117 gpu::Buffer buffer;
118 if (ring_buffer_.get()) {
119 buffer.ptr = ring_buffer_->memory();
120 buffer.size = num_entries_ * sizeof(gpu::CommandBufferEntry);
121 buffer.shared_memory = ring_buffer_.get();
122 } else {
123 buffer.ptr = NULL;
124 buffer.size = 0;
125 buffer.shared_memory = NULL;
126 }
127 return buffer;
128 } 85 }
129 86
130 gpu::CommandBuffer::State CommandBuffer::GetState() { 87 gpu::CommandBuffer::State CommandBuffer::GetState() {
131 // Send will flag state with lost context if IPC fails. 88 // Send will flag state with lost context if IPC fails.
132 if (last_state_.error == gpu::error::kNoError) { 89 if (last_state_.error == gpu::error::kNoError) {
133 gpu::CommandBuffer::State state; 90 gpu::CommandBuffer::State state;
134 if (Send(new PpapiHostMsg_PPBGraphics3D_GetState( 91 if (Send(new PpapiHostMsg_PPBGraphics3D_GetState(
135 API_ID_PPB_GRAPHICS_3D, resource_, &state))) 92 API_ID_PPB_GRAPHICS_3D, resource_, &state)))
136 UpdateState(state); 93 UpdateState(state);
137 } 94 }
(...skipping 30 matching lines...) Expand all
168 last_known_get, &state))) 125 last_known_get, &state)))
169 UpdateState(state); 126 UpdateState(state);
170 } 127 }
171 } else { 128 } else {
172 Flush(put_offset); 129 Flush(put_offset);
173 } 130 }
174 131
175 return last_state_; 132 return last_state_;
176 } 133 }
177 134
135 void CommandBuffer::SetGetBuffer(int32 transfer_buffer_id) {
136 if (last_state_.error == gpu::error::kNoError) {
137 Send(new PpapiHostMsg_PPBGraphics3D_SetGetBuffer(
138 API_ID_PPB_GRAPHICS_3D, resource_, transfer_buffer_id));
139 }
140 }
141
178 void CommandBuffer::SetGetOffset(int32 get_offset) { 142 void CommandBuffer::SetGetOffset(int32 get_offset) {
179 // Not implemented in proxy. 143 // Not implemented in proxy.
180 NOTREACHED(); 144 NOTREACHED();
181 } 145 }
182 146
183 int32 CommandBuffer::CreateTransferBuffer(size_t size, int32 id_request) { 147 int32 CommandBuffer::CreateTransferBuffer(size_t size, int32 id_request) {
184 if (last_state_.error == gpu::error::kNoError) { 148 if (last_state_.error == gpu::error::kNoError) {
185 int32 id; 149 int32 id;
186 if (Send(new PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer( 150 if (Send(new PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer(
187 API_ID_PPB_GRAPHICS_3D, resource_, size, &id))) { 151 API_ID_PPB_GRAPHICS_3D, resource_, size, &id))) {
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 Graphics3D::~Graphics3D() { 295 Graphics3D::~Graphics3D() {
332 DestroyGLES2Impl(); 296 DestroyGLES2Impl();
333 } 297 }
334 298
335 bool Graphics3D::Init() { 299 bool Graphics3D::Init() {
336 PluginDispatcher* dispatcher = PluginDispatcher::GetForResource(this); 300 PluginDispatcher* dispatcher = PluginDispatcher::GetForResource(this);
337 if (!dispatcher) 301 if (!dispatcher)
338 return false; 302 return false;
339 303
340 command_buffer_.reset(new CommandBuffer(host_resource(), dispatcher)); 304 command_buffer_.reset(new CommandBuffer(host_resource(), dispatcher));
341 if (!command_buffer_->Initialize(kCommandBufferSize)) 305 if (!command_buffer_->Initialize())
342 return false; 306 return false;
343 307
344 return CreateGLES2Impl(kCommandBufferSize, kTransferBufferSize); 308 return CreateGLES2Impl(kCommandBufferSize, kTransferBufferSize);
345 } 309 }
346 310
347 PP_Bool Graphics3D::InitCommandBuffer(int32_t size) { 311 PP_Bool Graphics3D::InitCommandBuffer() {
348 return PP_FALSE; 312 return PP_FALSE;
349 } 313 }
350 314
351 PP_Bool Graphics3D::GetRingBuffer(int* shm_handle, uint32_t* shm_size) { 315 PP_Bool Graphics3D::SetGetBuffer(int32_t /* transfer_buffer_id */) {
352 return PP_FALSE; 316 return PP_FALSE;
353 } 317 }
354 318
355 PP_Graphics3DTrustedState Graphics3D::GetState() { 319 PP_Graphics3DTrustedState Graphics3D::GetState() {
356 return GetErrorState(); 320 return GetErrorState();
357 } 321 }
358 322
359 PP_Bool Graphics3D::Flush(int32_t put_offset) { 323 PP_Bool Graphics3D::Flush(int32_t put_offset) {
360 return PP_FALSE; 324 return PP_FALSE;
361 } 325 }
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 return graphics_3d->GetReference(); 406 return graphics_3d->GetReference();
443 } 407 }
444 408
445 bool PPB_Graphics3D_Proxy::OnMessageReceived(const IPC::Message& msg) { 409 bool PPB_Graphics3D_Proxy::OnMessageReceived(const IPC::Message& msg) {
446 bool handled = true; 410 bool handled = true;
447 IPC_BEGIN_MESSAGE_MAP(PPB_Graphics3D_Proxy, msg) 411 IPC_BEGIN_MESSAGE_MAP(PPB_Graphics3D_Proxy, msg)
448 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_Create, 412 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_Create,
449 OnMsgCreate) 413 OnMsgCreate)
450 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_InitCommandBuffer, 414 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_InitCommandBuffer,
451 OnMsgInitCommandBuffer) 415 OnMsgInitCommandBuffer)
416 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_SetGetBuffer,
417 OnMsgSetGetBuffer)
452 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_GetState, 418 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_GetState,
453 OnMsgGetState) 419 OnMsgGetState)
454 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_Flush, 420 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_Flush,
455 OnMsgFlush) 421 OnMsgFlush)
456 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_AsyncFlush, 422 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_AsyncFlush,
457 OnMsgAsyncFlush) 423 OnMsgAsyncFlush)
458 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer, 424 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer,
459 OnMsgCreateTransferBuffer) 425 OnMsgCreateTransferBuffer)
460 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_DestroyTransferBuffer, 426 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_DestroyTransferBuffer,
461 OnMsgDestroyTransferBuffer) 427 OnMsgDestroyTransferBuffer)
(...skipping 19 matching lines...) Expand all
481 447
482 thunk::EnterResourceCreation enter(instance); 448 thunk::EnterResourceCreation enter(instance);
483 if (enter.succeeded()) { 449 if (enter.succeeded()) {
484 result->SetHostResource( 450 result->SetHostResource(
485 instance, 451 instance,
486 enter.functions()->CreateGraphics3DRaw(instance, 0, &attribs.front())); 452 enter.functions()->CreateGraphics3DRaw(instance, 0, &attribs.front()));
487 } 453 }
488 } 454 }
489 455
490 void PPB_Graphics3D_Proxy::OnMsgInitCommandBuffer( 456 void PPB_Graphics3D_Proxy::OnMsgInitCommandBuffer(
491 const HostResource& context, 457 const HostResource& context) {
492 int32 size,
493 base::SharedMemoryHandle* ring_buffer) {
494 *ring_buffer = base::SharedMemory::NULLHandle();
495 EnterHostFromHostResource<PPB_Graphics3D_API> enter(context); 458 EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
496 if (enter.failed()) 459 if (enter.failed())
497 return; 460 return;
498 461
499 if (!enter.object()->InitCommandBuffer(size)) 462 if (!enter.object()->InitCommandBuffer())
500 return; 463 return;
464 }
501 465
502 int shm_handle; 466 void PPB_Graphics3D_Proxy::OnMsgSetGetBuffer(
503 uint32_t shm_size; 467 const HostResource& context,
504 if (!enter.object()->GetRingBuffer(&shm_handle, &shm_size)) 468 int32 transfer_buffer_id) {
505 return; 469 EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
506 *ring_buffer = TransportSHMHandleFromInt(dispatcher(), shm_handle); 470 if (enter.succeeded())
471 enter.object()->SetGetBuffer(transfer_buffer_id);
507 } 472 }
508 473
509 void PPB_Graphics3D_Proxy::OnMsgGetState(const HostResource& context, 474 void PPB_Graphics3D_Proxy::OnMsgGetState(const HostResource& context,
510 gpu::CommandBuffer::State* state) { 475 gpu::CommandBuffer::State* state) {
511 EnterHostFromHostResource<PPB_Graphics3D_API> enter(context); 476 EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
512 if (enter.failed()) 477 if (enter.failed())
513 return; 478 return;
514 PP_Graphics3DTrustedState pp_state = enter.object()->GetState(); 479 PP_Graphics3DTrustedState pp_state = enter.object()->GetState();
515 *state = GPUStateFromPPState(pp_state); 480 *state = GPUStateFromPPState(pp_state);
516 } 481 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 void PPB_Graphics3D_Proxy::SendSwapBuffersACKToPlugin( 554 void PPB_Graphics3D_Proxy::SendSwapBuffersACKToPlugin(
590 int32_t result, 555 int32_t result,
591 const HostResource& context) { 556 const HostResource& context) {
592 dispatcher()->Send(new PpapiMsg_PPBGraphics3D_SwapBuffersACK( 557 dispatcher()->Send(new PpapiMsg_PPBGraphics3D_SwapBuffersACK(
593 API_ID_PPB_GRAPHICS_3D, context, result)); 558 API_ID_PPB_GRAPHICS_3D, context, result));
594 } 559 }
595 560
596 } // namespace proxy 561 } // namespace proxy
597 } // namespace ppapi 562 } // namespace ppapi
598 563
OLDNEW
« no previous file with comments | « ppapi/proxy/ppb_graphics_3d_proxy.h ('k') | ppapi/thunk/ppb_graphics_3d_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698