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

Side by Side Diff: gpu/command_buffer/service/buffer_manager.cc

Issue 12544006: Revert 186416 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 9 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 #include "gpu/command_buffer/service/buffer_manager.h" 5 #include "gpu/command_buffer/service/buffer_manager.h"
6 #include <limits> 6 #include <limits>
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 9 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
10 #include "gpu/command_buffer/service/feature_info.h"
11 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 10 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
12 #include "gpu/command_buffer/service/memory_tracking.h" 11 #include "gpu/command_buffer/service/memory_tracking.h"
13 #include "ui/gl/gl_bindings.h"
14 12
15 namespace gpu { 13 namespace gpu {
16 namespace gles2 { 14 namespace gles2 {
17 15
18 BufferManager::BufferManager( 16 BufferManager::BufferManager(MemoryTracker* memory_tracker)
19 MemoryTracker* memory_tracker,
20 FeatureInfo* feature_info)
21 : memory_tracker_( 17 : memory_tracker_(
22 new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)), 18 new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)),
23 feature_info_(feature_info),
24 allow_buffers_on_multiple_targets_(false), 19 allow_buffers_on_multiple_targets_(false),
25 buffer_info_count_(0), 20 buffer_info_count_(0),
26 have_context_(true), 21 have_context_(true) {
27 use_client_side_arrays_for_stream_buffers_(
28 feature_info ? feature_info->workarounds(
29 ).use_client_side_arrays_for_stream_buffers : 0) {
30 } 22 }
31 23
32 BufferManager::~BufferManager() { 24 BufferManager::~BufferManager() {
33 DCHECK(buffer_infos_.empty()); 25 DCHECK(buffer_infos_.empty());
34 CHECK_EQ(buffer_info_count_, 0u); 26 CHECK_EQ(buffer_info_count_, 0u);
35 } 27 }
36 28
37 void BufferManager::Destroy(bool have_context) { 29 void BufferManager::Destroy(bool have_context) {
38 have_context_ = have_context; 30 have_context_ = have_context;
39 buffer_infos_.clear(); 31 buffer_infos_.clear();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 --buffer_info_count_; 63 --buffer_info_count_;
72 } 64 }
73 65
74 Buffer::Buffer(BufferManager* manager, GLuint service_id) 66 Buffer::Buffer(BufferManager* manager, GLuint service_id)
75 : manager_(manager), 67 : manager_(manager),
76 deleted_(false), 68 deleted_(false),
77 service_id_(service_id), 69 service_id_(service_id),
78 target_(0), 70 target_(0),
79 size_(0), 71 size_(0),
80 usage_(GL_STATIC_DRAW), 72 usage_(GL_STATIC_DRAW),
81 shadowed_(false), 73 shadowed_(false) {
82 is_client_side_array_(false) {
83 manager_->StartTracking(this); 74 manager_->StartTracking(this);
84 } 75 }
85 76
86 Buffer::~Buffer() { 77 Buffer::~Buffer() {
87 if (manager_) { 78 if (manager_) {
88 if (manager_->have_context_) { 79 if (manager_->have_context_) {
89 GLuint id = service_id(); 80 GLuint id = service_id();
90 glDeleteBuffersARB(1, &id); 81 glDeleteBuffersARB(1, &id);
91 } 82 }
92 manager_->StopTracking(this); 83 manager_->StopTracking(this);
93 manager_ = NULL; 84 manager_ = NULL;
94 } 85 }
95 } 86 }
96 87
97 void Buffer::SetInfo( 88 void Buffer::SetInfo(
98 GLsizeiptr size, GLenum usage, bool shadow, const GLvoid* data, 89 GLsizeiptr size, GLenum usage, bool shadow) {
99 bool is_client_side_array) {
100 usage_ = usage; 90 usage_ = usage;
101 is_client_side_array_ = is_client_side_array;
102 if (size != size_ || shadow != shadowed_) { 91 if (size != size_ || shadow != shadowed_) {
103 shadowed_ = shadow; 92 shadowed_ = shadow;
104 size_ = size; 93 size_ = size;
105 ClearCache(); 94 ClearCache();
106 if (shadowed_) { 95 if (shadowed_) {
107 shadow_.reset(new int8[size]); 96 shadow_.reset(new int8[size]);
108 } else {
109 shadow_.reset();
110 }
111 }
112 if (shadowed_) {
113 if (data) {
114 memcpy(shadow_.get(), data, size);
115 } else {
116 memset(shadow_.get(), 0, size); 97 memset(shadow_.get(), 0, size);
117 } 98 }
118 } 99 }
119 } 100 }
120 101
121 bool Buffer::CheckRange( 102 bool Buffer::CheckRange(
122 GLintptr offset, GLsizeiptr size) const { 103 GLintptr offset, GLsizeiptr size) const {
123 int32 end = 0; 104 int32 end = 0;
124 return offset >= 0 && size >= 0 && 105 return offset >= 0 && size >= 0 &&
125 offset <= std::numeric_limits<int32>::max() && 106 offset <= std::numeric_limits<int32>::max() &&
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 for (BufferInfoMap::const_iterator it = buffer_infos_.begin(); 210 for (BufferInfoMap::const_iterator it = buffer_infos_.begin();
230 it != buffer_infos_.end(); ++it) { 211 it != buffer_infos_.end(); ++it) {
231 if (it->second->service_id() == service_id) { 212 if (it->second->service_id() == service_id) {
232 *client_id = it->first; 213 *client_id = it->first;
233 return true; 214 return true;
234 } 215 }
235 } 216 }
236 return false; 217 return false;
237 } 218 }
238 219
239 bool BufferManager::IsUsageClientSideArray(GLenum usage) {
240 return usage == GL_STREAM_DRAW && use_client_side_arrays_for_stream_buffers_;
241 }
242
243 void BufferManager::SetInfo( 220 void BufferManager::SetInfo(
244 Buffer* info, GLsizeiptr size, GLenum usage, const GLvoid* data) { 221 Buffer* info, GLsizeiptr size, GLenum usage) {
245 DCHECK(info); 222 DCHECK(info);
246 memory_tracker_->TrackMemFree(info->size()); 223 memory_tracker_->TrackMemFree(info->size());
247 bool is_client_side_array = IsUsageClientSideArray(usage); 224 info->SetInfo(size,
248 bool shadow = info->target() == GL_ELEMENT_ARRAY_BUFFER || 225 usage,
249 allow_buffers_on_multiple_targets_ || 226 info->target() == GL_ELEMENT_ARRAY_BUFFER ||
250 is_client_side_array; 227 allow_buffers_on_multiple_targets_);
251 info->SetInfo(size, usage, shadow, data, is_client_side_array);
252 memory_tracker_->TrackMemAlloc(info->size()); 228 memory_tracker_->TrackMemAlloc(info->size());
253 } 229 }
254 230
255 void BufferManager::DoBufferData(
256 GLES2Decoder* decoder,
257 Buffer* buffer,
258 GLsizeiptr size,
259 GLenum usage,
260 const GLvoid* data) {
261 // Clear the buffer to 0 if no initial data was passed in.
262 scoped_array<int8> zero;
263 if (!data) {
264 zero.reset(new int8[size]);
265 memset(zero.get(), 0, size);
266 data = zero.get();
267 }
268
269 decoder->CopyRealGLErrorsToWrapper();
270 if (IsUsageClientSideArray(usage)) {
271 glBufferData(buffer->target(), 0, NULL, usage);
272 } else {
273 glBufferData(buffer->target(), size, data, usage);
274 }
275 GLenum error = decoder->PeekGLError();
276 if (error == GL_NO_ERROR) {
277 SetInfo(buffer, size, usage, data);
278 } else {
279 SetInfo(buffer, 0, usage, NULL);
280 }
281 }
282
283 void BufferManager::DoBufferSubData(
284 GLES2Decoder* decoder,
285 Buffer* buffer,
286 GLintptr offset,
287 GLsizeiptr size,
288 const GLvoid* data) {
289 if (!buffer->SetRange(offset, size, data)) {
290 decoder->SetGLError(GL_INVALID_VALUE, "glBufferSubData", "out of range");
291 return;
292 }
293
294 if (!buffer->IsClientSideArray()) {
295 glBufferSubData(buffer->target(), offset, size, data);
296 }
297 }
298
299 bool BufferManager::SetTarget(Buffer* info, GLenum target) { 231 bool BufferManager::SetTarget(Buffer* info, GLenum target) {
300 // Check that we are not trying to bind it to a different target. 232 // Check that we are not trying to bind it to a different target.
301 if (info->target() != 0 && info->target() != target && 233 if (info->target() != 0 && info->target() != target &&
302 !allow_buffers_on_multiple_targets_) { 234 !allow_buffers_on_multiple_targets_) {
303 return false; 235 return false;
304 } 236 }
305 if (info->target() == 0) { 237 if (info->target() == 0) {
306 info->set_target(target); 238 info->set_target(target);
307 } 239 }
308 return true; 240 return true;
309 } 241 }
310 242
311 } // namespace gles2 243 } // namespace gles2
312 } // namespace gpu 244 } // namespace gpu
313 245
314 246
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/buffer_manager.h ('k') | gpu/command_buffer/service/buffer_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698