| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "gpu/command_buffer/service/command_buffer_service.h" | 5 #include "gpu/command_buffer/service/command_buffer_service.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/process_util.h" | 10 #include "base/process_util.h" |
| 11 #include "gpu/command_buffer/common/cmd_buffer_common.h" | 11 #include "gpu/command_buffer/common/cmd_buffer_common.h" |
| 12 | 12 |
| 13 using ::base::SharedMemory; | 13 using ::base::SharedMemory; |
| 14 | 14 |
| 15 namespace gpu { | 15 namespace gpu { |
| 16 | 16 |
| 17 CommandBufferService::CommandBufferService() | 17 CommandBufferService::CommandBufferService() |
| 18 : num_entries_(0), | 18 : num_entries_(0), |
| 19 get_offset_(0), | 19 get_offset_(0), |
| 20 put_offset_(0), | 20 put_offset_(0), |
| 21 token_(0), | 21 token_(0), |
| 22 error_(error::kNoError) { | 22 error_(error::kNoError) { |
| 23 // Element zero is always NULL. | 23 // Element zero is always NULL. |
| 24 registered_objects_.push_back(Buffer()); | 24 registered_objects_.push_back(Buffer()); |
| 25 } | 25 } |
| 26 | 26 |
| 27 CommandBufferService::~CommandBufferService() { | 27 CommandBufferService::~CommandBufferService() { |
| 28 delete ring_buffer_.shared_memory; |
| 29 |
| 28 for (size_t i = 0; i < registered_objects_.size(); ++i) { | 30 for (size_t i = 0; i < registered_objects_.size(); ++i) { |
| 29 if (registered_objects_[i].shared_memory) | 31 if (registered_objects_[i].shared_memory) |
| 30 delete registered_objects_[i].shared_memory; | 32 delete registered_objects_[i].shared_memory; |
| 31 } | 33 } |
| 32 } | 34 } |
| 33 | 35 |
| 34 bool CommandBufferService::Initialize(int32 size) { | 36 bool CommandBufferService::Initialize(int32 size) { |
| 35 // Fail if already initialized. | 37 // Fail if already initialized. |
| 36 if (ring_buffer_.get()) { | 38 if (ring_buffer_.shared_memory) { |
| 37 LOG(ERROR) << "CommandBufferService::Initialize " | 39 LOG(ERROR) << "Failed because already initialized."; |
| 38 << "failed because already initialized."; | |
| 39 return false; | 40 return false; |
| 40 } | 41 } |
| 41 | 42 |
| 42 if (size <= 0 || size > kMaxCommandBufferSize) { | 43 if (size <= 0 || size > kMaxCommandBufferSize) { |
| 43 LOG(ERROR) << "CommandBufferService::Initialize " | 44 LOG(ERROR) << "Failed because command buffer size was invalid."; |
| 44 << "because command buffer size was invalid."; | |
| 45 return false; | 45 return false; |
| 46 } | 46 } |
| 47 | 47 |
| 48 num_entries_ = size / sizeof(CommandBufferEntry); | 48 num_entries_ = size / sizeof(CommandBufferEntry); |
| 49 | 49 |
| 50 ring_buffer_.reset(new SharedMemory); | 50 SharedMemory shared_memory; |
| 51 if (ring_buffer_->CreateAndMapAnonymous(size)) { | 51 if (!shared_memory.CreateAnonymous(size)) { |
| 52 LOG(ERROR) << "Failed to create shared memory for command buffer."; |
| 52 return true; | 53 return true; |
| 53 } | 54 } |
| 54 | 55 |
| 55 num_entries_ = 0; | 56 return Initialize(&shared_memory, size); |
| 56 ring_buffer_.reset(); | 57 } |
| 57 | 58 |
| 58 LOG(ERROR) << "CommandBufferService::Initialize failed because ring buffer " | 59 bool CommandBufferService::Initialize(base::SharedMemory* buffer, int32 size) { |
| 59 << "could not be created or mapped "; | 60 // Fail if already initialized. |
| 61 if (ring_buffer_.shared_memory) { |
| 62 LOG(ERROR) << "Failed because already initialized."; |
| 63 return false; |
| 64 } |
| 60 | 65 |
| 61 return false; | 66 base::SharedMemoryHandle shared_memory_handle; |
| 67 if (!buffer->ShareToProcess(base::GetCurrentProcessHandle(), |
| 68 &shared_memory_handle)) { |
| 69 LOG(ERROR) << "Failed to duplicate command buffer shared memory handle."; |
| 70 return false; |
| 71 } |
| 72 |
| 73 ring_buffer_.shared_memory = new base::SharedMemory(shared_memory_handle, |
| 74 false); |
| 75 if (!ring_buffer_.shared_memory->Map(size)) { |
| 76 LOG(ERROR) << "Failed because ring buffer could not be created or mapped "; |
| 77 delete ring_buffer_.shared_memory; |
| 78 ring_buffer_.shared_memory = NULL; |
| 79 return false; |
| 80 } |
| 81 |
| 82 ring_buffer_.ptr = ring_buffer_.shared_memory->memory(); |
| 83 ring_buffer_.size = size; |
| 84 num_entries_ = size / sizeof(CommandBufferEntry); |
| 85 |
| 86 return true; |
| 62 } | 87 } |
| 63 | 88 |
| 64 Buffer CommandBufferService::GetRingBuffer() { | 89 Buffer CommandBufferService::GetRingBuffer() { |
| 65 Buffer buffer; | 90 return ring_buffer_; |
| 66 if (ring_buffer_.get()) { | |
| 67 buffer.ptr = ring_buffer_->memory(); | |
| 68 buffer.size = ring_buffer_->created_size(); | |
| 69 buffer.shared_memory = ring_buffer_.get(); | |
| 70 } | |
| 71 return buffer; | |
| 72 } | 91 } |
| 73 | 92 |
| 74 CommandBufferService::State CommandBufferService::GetState() { | 93 CommandBufferService::State CommandBufferService::GetState() { |
| 75 State state; | 94 State state; |
| 76 state.num_entries = num_entries_; | 95 state.num_entries = num_entries_; |
| 77 state.get_offset = get_offset_; | 96 state.get_offset = get_offset_; |
| 78 state.put_offset = put_offset_; | 97 state.put_offset = put_offset_; |
| 79 state.token = token_; | 98 state.token = token_; |
| 80 state.error = error_; | 99 state.error = error_; |
| 81 | 100 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 error_ = error; | 216 error_ = error; |
| 198 } | 217 } |
| 199 } | 218 } |
| 200 | 219 |
| 201 void CommandBufferService::SetPutOffsetChangeCallback( | 220 void CommandBufferService::SetPutOffsetChangeCallback( |
| 202 Callback0::Type* callback) { | 221 Callback0::Type* callback) { |
| 203 put_offset_change_callback_.reset(callback); | 222 put_offset_change_callback_.reset(callback); |
| 204 } | 223 } |
| 205 | 224 |
| 206 } // namespace gpu | 225 } // namespace gpu |
| OLD | NEW |