Index: gpu/command_buffer/service/buffer_manager.cc |
diff --git a/gpu/command_buffer/service/buffer_manager.cc b/gpu/command_buffer/service/buffer_manager.cc |
index cb3062afb602827e3d4911cec9a8d8d97119f328..576fb846b21961432fa2ca24f925eba3aa9b6da6 100644 |
--- a/gpu/command_buffer/service/buffer_manager.cc |
+++ b/gpu/command_buffer/service/buffer_manager.cc |
@@ -7,15 +7,19 @@ |
#include "base/debug/trace_event.h" |
#include "base/logging.h" |
#include "gpu/command_buffer/common/gles2_cmd_utils.h" |
+#include "gpu/command_buffer/service/feature_info.h" |
#include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
#include "gpu/command_buffer/service/memory_tracking.h" |
namespace gpu { |
namespace gles2 { |
-BufferManager::BufferManager(MemoryTracker* memory_tracker) |
+BufferManager::BufferManager( |
+ MemoryTracker* memory_tracker, |
+ FeatureInfo* feature_info) |
: memory_tracker_( |
new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)), |
+ feature_info_(feature_info), |
allow_buffers_on_multiple_targets_(false), |
buffer_info_count_(0), |
have_context_(true) { |
@@ -70,7 +74,8 @@ Buffer::Buffer(BufferManager* manager, GLuint service_id) |
target_(0), |
size_(0), |
usage_(GL_STATIC_DRAW), |
- shadowed_(false) { |
+ shadowed_(false), |
+ is_client_side_array_(false) { |
manager_->StartTracking(this); |
} |
@@ -86,17 +91,26 @@ Buffer::~Buffer() { |
} |
void Buffer::SetInfo( |
- GLsizeiptr size, GLenum usage, bool shadow) { |
+ GLsizeiptr size, GLenum usage, bool shadow, const GLvoid* data, |
+ bool is_client_side_array) { |
usage_ = usage; |
+ is_client_side_array_ = is_client_side_array; |
if (size != size_ || shadow != shadowed_) { |
shadowed_ = shadow; |
size_ = size; |
ClearCache(); |
if (shadowed_) { |
shadow_.reset(new int8[size]); |
- memset(shadow_.get(), 0, size); |
+ if (!data) { |
+ memset(shadow_.get(), 0, size); |
+ } |
+ } else { |
+ shadow_.reset(); |
} |
} |
+ if (shadowed_ && data) { |
+ memcpy(shadow_.get(), data, size); |
+ } |
} |
bool Buffer::CheckRange( |
@@ -218,13 +232,16 @@ bool BufferManager::GetClientId(GLuint service_id, GLuint* client_id) const { |
} |
void BufferManager::SetInfo( |
- Buffer* info, GLsizeiptr size, GLenum usage) { |
+ Buffer* info, GLsizeiptr size, GLenum usage, const GLvoid* data) { |
DCHECK(info); |
memory_tracker_->TrackMemFree(info->size()); |
- info->SetInfo(size, |
- usage, |
- info->target() == GL_ELEMENT_ARRAY_BUFFER || |
- allow_buffers_on_multiple_targets_); |
+ bool is_client_side_array = |
+ (usage == GL_STREAM_DRAW && |
+ feature_info_->workarounds().use_client_side_arrays_for_stream_buffers); |
+ bool shadow = info->target() == GL_ELEMENT_ARRAY_BUFFER || |
+ allow_buffers_on_multiple_targets_ || |
+ is_client_side_array; |
+ info->SetInfo(size, usage, shadow, data, is_client_side_array); |
memory_tracker_->TrackMemAlloc(info->size()); |
} |