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 |