| OLD | NEW |
| 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 // A class to Manage a growing transfer buffer. | 5 // A class to Manage a growing transfer buffer. |
| 6 | 6 |
| 7 #include "../client/transfer_buffer.h" | 7 #include "../client/transfer_buffer.h" |
| 8 #include "../client/cmd_buffer_helper.h" | 8 #include "../client/cmd_buffer_helper.h" |
| 9 | 9 |
| 10 namespace gpu { | 10 namespace gpu { |
| 11 | 11 |
| 12 AlignedRingBuffer::~AlignedRingBuffer() { | 12 AlignedRingBuffer::~AlignedRingBuffer() { |
| 13 } | 13 } |
| 14 | 14 |
| 15 TransferBuffer::TransferBuffer( | 15 TransferBuffer::TransferBuffer( |
| 16 CommandBufferHelper* helper) | 16 CommandBufferHelper* helper) |
| 17 : helper_(helper), | 17 : helper_(helper), |
| 18 result_size_(0), | 18 result_size_(0), |
| 19 min_buffer_size_(0), | 19 min_buffer_size_(0), |
| 20 max_buffer_size_(0), | 20 max_buffer_size_(0), |
| 21 alignment_(), | 21 alignment_(0), |
| 22 size_to_flush_(0), |
| 23 bytes_since_last_flush_(0), |
| 22 buffer_id_(-1), | 24 buffer_id_(-1), |
| 23 result_buffer_(NULL), | 25 result_buffer_(NULL), |
| 24 result_shm_offset_(0), | 26 result_shm_offset_(0), |
| 25 usable_(true) { | 27 usable_(true) { |
| 26 } | 28 } |
| 27 | 29 |
| 28 TransferBuffer::~TransferBuffer() { | 30 TransferBuffer::~TransferBuffer() { |
| 29 Free(); | 31 Free(); |
| 30 } | 32 } |
| 31 | 33 |
| 32 bool TransferBuffer::Initialize( | 34 bool TransferBuffer::Initialize( |
| 33 unsigned int starting_buffer_size, | 35 unsigned int starting_buffer_size, |
| 34 unsigned int result_size, | 36 unsigned int result_size, |
| 35 unsigned int min_buffer_size, | 37 unsigned int min_buffer_size, |
| 36 unsigned int max_buffer_size, | 38 unsigned int max_buffer_size, |
| 37 unsigned int alignment) { | 39 unsigned int alignment, |
| 40 unsigned int size_to_flush) { |
| 38 result_size_ = result_size; | 41 result_size_ = result_size; |
| 39 min_buffer_size_ = min_buffer_size; | 42 min_buffer_size_ = min_buffer_size; |
| 40 max_buffer_size_ = max_buffer_size; | 43 max_buffer_size_ = max_buffer_size; |
| 41 alignment_ = alignment; | 44 alignment_ = alignment; |
| 45 size_to_flush_ = size_to_flush; |
| 42 ReallocateRingBuffer(starting_buffer_size - result_size); | 46 ReallocateRingBuffer(starting_buffer_size - result_size); |
| 43 return HaveBuffer(); | 47 return HaveBuffer(); |
| 44 } | 48 } |
| 45 | 49 |
| 46 void TransferBuffer::Free() { | 50 void TransferBuffer::Free() { |
| 47 if (HaveBuffer()) { | 51 if (HaveBuffer()) { |
| 48 helper_->Finish(); | 52 helper_->Finish(); |
| 49 helper_->command_buffer()->DestroyTransferBuffer(buffer_id_); | 53 helper_->command_buffer()->DestroyTransferBuffer(buffer_id_); |
| 50 buffer_id_ = -1; | 54 buffer_id_ = -1; |
| 51 buffer_.ptr = NULL; | 55 buffer_.ptr = NULL; |
| 52 buffer_.size = 0; | 56 buffer_.size = 0; |
| 53 result_buffer_ = NULL; | 57 result_buffer_ = NULL; |
| 54 result_shm_offset_ = 0; | 58 result_shm_offset_ = 0; |
| 55 ring_buffer_.reset(); | 59 ring_buffer_.reset(); |
| 60 bytes_since_last_flush_ = 0; |
| 56 } | 61 } |
| 57 } | 62 } |
| 58 | 63 |
| 59 bool TransferBuffer::HaveBuffer() const { | 64 bool TransferBuffer::HaveBuffer() const { |
| 60 return buffer_id_ != -1; | 65 return buffer_id_ != -1; |
| 61 } | 66 } |
| 62 | 67 |
| 63 RingBuffer::Offset TransferBuffer::GetOffset(void* pointer) const { | 68 RingBuffer::Offset TransferBuffer::GetOffset(void* pointer) const { |
| 64 return ring_buffer_->GetOffset(pointer); | 69 return ring_buffer_->GetOffset(pointer); |
| 65 } | 70 } |
| 66 | 71 |
| 67 void TransferBuffer::FreePendingToken(void* p, unsigned int token) { | 72 void TransferBuffer::FreePendingToken(void* p, unsigned int token) { |
| 68 ring_buffer_->FreePendingToken(p, token); | 73 ring_buffer_->FreePendingToken(p, token); |
| 74 if (bytes_since_last_flush_ >= size_to_flush_ && size_to_flush_ > 0) { |
| 75 helper_->Flush(); |
| 76 bytes_since_last_flush_ = 0; |
| 77 } |
| 69 } | 78 } |
| 70 | 79 |
| 71 void TransferBuffer::AllocateRingBuffer(unsigned int size) { | 80 void TransferBuffer::AllocateRingBuffer(unsigned int size) { |
| 72 for (;size >= min_buffer_size_; size /= 2) { | 81 for (;size >= min_buffer_size_; size /= 2) { |
| 73 int32 id = helper_->command_buffer()->CreateTransferBuffer(size, -1); | 82 int32 id = helper_->command_buffer()->CreateTransferBuffer(size, -1); |
| 74 if (id != -1) { | 83 if (id != -1) { |
| 75 buffer_ = helper_->command_buffer()->GetTransferBuffer(id); | 84 buffer_ = helper_->command_buffer()->GetTransferBuffer(id); |
| 76 ring_buffer_.reset(new AlignedRingBuffer( | 85 ring_buffer_.reset(new AlignedRingBuffer( |
| 77 alignment_, | 86 alignment_, |
| 78 id, | 87 id, |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 GPU_DCHECK(size_allocated); | 151 GPU_DCHECK(size_allocated); |
| 143 | 152 |
| 144 ReallocateRingBuffer(size); | 153 ReallocateRingBuffer(size); |
| 145 | 154 |
| 146 if (!HaveBuffer()) { | 155 if (!HaveBuffer()) { |
| 147 return NULL; | 156 return NULL; |
| 148 } | 157 } |
| 149 | 158 |
| 150 unsigned int max_size = ring_buffer_->GetLargestFreeOrPendingSize(); | 159 unsigned int max_size = ring_buffer_->GetLargestFreeOrPendingSize(); |
| 151 *size_allocated = std::min(max_size, size); | 160 *size_allocated = std::min(max_size, size); |
| 161 bytes_since_last_flush_ += *size_allocated; |
| 152 return ring_buffer_->Alloc(*size_allocated); | 162 return ring_buffer_->Alloc(*size_allocated); |
| 153 } | 163 } |
| 154 | 164 |
| 155 void* TransferBuffer::Alloc(unsigned int size) { | 165 void* TransferBuffer::Alloc(unsigned int size) { |
| 156 ReallocateRingBuffer(size); | 166 ReallocateRingBuffer(size); |
| 157 | 167 |
| 158 if (!HaveBuffer()) { | 168 if (!HaveBuffer()) { |
| 159 return NULL; | 169 return NULL; |
| 160 } | 170 } |
| 161 | 171 |
| 162 unsigned int max_size = ring_buffer_->GetLargestFreeOrPendingSize(); | 172 unsigned int max_size = ring_buffer_->GetLargestFreeOrPendingSize(); |
| 163 if (size > max_size) { | 173 if (size > max_size) { |
| 164 return NULL; | 174 return NULL; |
| 165 } | 175 } |
| 166 | 176 |
| 177 bytes_since_last_flush_ += size; |
| 167 return ring_buffer_->Alloc(size); | 178 return ring_buffer_->Alloc(size); |
| 168 } | 179 } |
| 169 | 180 |
| 170 void* TransferBuffer::GetResultBuffer() { | 181 void* TransferBuffer::GetResultBuffer() { |
| 171 ReallocateRingBuffer(result_size_); | 182 ReallocateRingBuffer(result_size_); |
| 172 return result_buffer_; | 183 return result_buffer_; |
| 173 } | 184 } |
| 174 | 185 |
| 175 int TransferBuffer::GetResultOffset() { | 186 int TransferBuffer::GetResultOffset() { |
| 176 ReallocateRingBuffer(result_size_); | 187 ReallocateRingBuffer(result_size_); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 202 Release(); | 213 Release(); |
| 203 // NOTE: we allocate buffers of size 0 so that HaveBuffer will be true, so | 214 // NOTE: we allocate buffers of size 0 so that HaveBuffer will be true, so |
| 204 // that address will return a pointer just like malloc, and so that GetShmId | 215 // that address will return a pointer just like malloc, and so that GetShmId |
| 205 // will be valid. That has the side effect that we'll insert a token on free. | 216 // will be valid. That has the side effect that we'll insert a token on free. |
| 206 // We could add code skip the token for a zero size buffer but it doesn't seem | 217 // We could add code skip the token for a zero size buffer but it doesn't seem |
| 207 // worth the complication. | 218 // worth the complication. |
| 208 buffer_ = transfer_buffer_->AllocUpTo(new_size, &size_); | 219 buffer_ = transfer_buffer_->AllocUpTo(new_size, &size_); |
| 209 } | 220 } |
| 210 | 221 |
| 211 } // namespace gpu | 222 } // namespace gpu |
| OLD | NEW |