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

Side by Side Diff: gpu/command_buffer/client/transfer_buffer.cc

Issue 9387014: Add AsyncFlush when transferbuffer is > a certain size (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years, 10 months 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
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/client/transfer_buffer.h ('k') | gpu/command_buffer/client/transfer_buffer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698