Chromium Code Reviews| 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 default_buffer_size_(0), | |
| 19 min_buffer_size_(0), | 20 min_buffer_size_(0), |
| 20 max_buffer_size_(0), | 21 max_buffer_size_(0), |
| 21 alignment_(0), | 22 alignment_(0), |
| 22 size_to_flush_(0), | 23 size_to_flush_(0), |
| 23 bytes_since_last_flush_(0), | 24 bytes_since_last_flush_(0), |
| 24 buffer_id_(-1), | 25 buffer_id_(-1), |
| 25 result_buffer_(NULL), | 26 result_buffer_(NULL), |
| 26 result_shm_offset_(0), | 27 result_shm_offset_(0), |
| 27 usable_(true) { | 28 usable_(true) { |
| 28 } | 29 } |
| 29 | 30 |
| 30 TransferBuffer::~TransferBuffer() { | 31 TransferBuffer::~TransferBuffer() { |
| 31 Free(); | 32 Free(); |
| 32 } | 33 } |
| 33 | 34 |
| 34 bool TransferBuffer::Initialize( | 35 bool TransferBuffer::Initialize( |
| 35 unsigned int starting_buffer_size, | 36 unsigned int default_buffer_size, |
| 36 unsigned int result_size, | 37 unsigned int result_size, |
| 37 unsigned int min_buffer_size, | 38 unsigned int min_buffer_size, |
| 38 unsigned int max_buffer_size, | 39 unsigned int max_buffer_size, |
| 39 unsigned int alignment, | 40 unsigned int alignment, |
| 40 unsigned int size_to_flush) { | 41 unsigned int size_to_flush) { |
| 41 result_size_ = result_size; | 42 result_size_ = result_size; |
| 43 default_buffer_size_ = default_buffer_size; | |
| 42 min_buffer_size_ = min_buffer_size; | 44 min_buffer_size_ = min_buffer_size; |
| 43 max_buffer_size_ = max_buffer_size; | 45 max_buffer_size_ = max_buffer_size; |
| 44 alignment_ = alignment; | 46 alignment_ = alignment; |
| 45 size_to_flush_ = size_to_flush; | 47 size_to_flush_ = size_to_flush; |
| 46 ReallocateRingBuffer(starting_buffer_size - result_size); | 48 ReallocateRingBuffer(default_buffer_size_ - result_size); |
|
vangelis
2012/04/23 23:46:35
Why do we subtract the result_size here?
greggman
2012/04/24 20:04:46
because the start of the buffer is reserved. I cou
| |
| 47 return HaveBuffer(); | 49 return HaveBuffer(); |
| 48 } | 50 } |
| 49 | 51 |
| 50 void TransferBuffer::Free() { | 52 void TransferBuffer::Free() { |
| 51 if (HaveBuffer()) { | 53 if (HaveBuffer()) { |
| 52 helper_->Finish(); | 54 helper_->Finish(); |
| 53 helper_->command_buffer()->DestroyTransferBuffer(buffer_id_); | 55 helper_->command_buffer()->DestroyTransferBuffer(buffer_id_); |
| 54 buffer_id_ = -1; | 56 buffer_id_ = -1; |
| 55 buffer_.ptr = NULL; | 57 buffer_.ptr = NULL; |
| 56 buffer_.size = 0; | 58 buffer_.size = 0; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 129 } | 131 } |
| 130 | 132 |
| 131 static unsigned int ComputePOTSize(unsigned int dimension) { | 133 static unsigned int ComputePOTSize(unsigned int dimension) { |
| 132 return (dimension == 0) ? 0 : 1 << Log2Ceiling(dimension); | 134 return (dimension == 0) ? 0 : 1 << Log2Ceiling(dimension); |
| 133 } | 135 } |
| 134 | 136 |
| 135 void TransferBuffer::ReallocateRingBuffer(unsigned int size) { | 137 void TransferBuffer::ReallocateRingBuffer(unsigned int size) { |
| 136 // What size buffer would we ask for if we needed a new one? | 138 // What size buffer would we ask for if we needed a new one? |
| 137 unsigned int needed_buffer_size = ComputePOTSize(size + result_size_); | 139 unsigned int needed_buffer_size = ComputePOTSize(size + result_size_); |
| 138 needed_buffer_size = std::max(needed_buffer_size, min_buffer_size_); | 140 needed_buffer_size = std::max(needed_buffer_size, min_buffer_size_); |
| 141 needed_buffer_size = std::max(needed_buffer_size, default_buffer_size_); | |
| 139 needed_buffer_size = std::min(needed_buffer_size, max_buffer_size_); | 142 needed_buffer_size = std::min(needed_buffer_size, max_buffer_size_); |
| 140 | 143 |
| 141 if (usable_ && (!HaveBuffer() || needed_buffer_size > buffer_.size)) { | 144 if (usable_ && (!HaveBuffer() || needed_buffer_size > buffer_.size)) { |
| 142 if (HaveBuffer()) { | 145 if (HaveBuffer()) { |
| 143 Free(); | 146 Free(); |
| 144 } | 147 } |
| 145 AllocateRingBuffer(needed_buffer_size); | 148 AllocateRingBuffer(needed_buffer_size); |
| 146 } | 149 } |
| 147 } | 150 } |
| 148 | 151 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 213 Release(); | 216 Release(); |
| 214 // NOTE: we allocate buffers of size 0 so that HaveBuffer will be true, so | 217 // NOTE: we allocate buffers of size 0 so that HaveBuffer will be true, so |
| 215 // that address will return a pointer just like malloc, and so that GetShmId | 218 // that address will return a pointer just like malloc, and so that GetShmId |
| 216 // will be valid. That has the side effect that we'll insert a token on free. | 219 // will be valid. That has the side effect that we'll insert a token on free. |
| 217 // We could add code skip the token for a zero size buffer but it doesn't seem | 220 // We could add code skip the token for a zero size buffer but it doesn't seem |
| 218 // worth the complication. | 221 // worth the complication. |
| 219 buffer_ = transfer_buffer_->AllocUpTo(new_size, &size_); | 222 buffer_ = transfer_buffer_->AllocUpTo(new_size, &size_); |
| 220 } | 223 } |
| 221 | 224 |
| 222 } // namespace gpu | 225 } // namespace gpu |
| OLD | NEW |