| 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 914d9b09da06e8fb3a71c2162e9a8e6291dea962..cdcd91a093e3822daa39f7c7811704a86991bbdf 100644
|
| --- a/gpu/command_buffer/service/buffer_manager.cc
|
| +++ b/gpu/command_buffer/service/buffer_manager.cc
|
| @@ -34,6 +34,7 @@ BufferManager::BufferManager(MemoryTracker* memory_tracker,
|
| allow_buffers_on_multiple_targets_(false),
|
| allow_fixed_attribs_(false),
|
| buffer_count_(0),
|
| + primitive_restart_enabled_(false),
|
| have_context_(true),
|
| use_client_side_arrays_for_stream_buffers_(
|
| feature_info
|
| @@ -199,13 +200,17 @@ void Buffer::ClearCache() {
|
| }
|
|
|
| template <typename T>
|
| -GLuint GetMaxValue(const void* data, GLuint offset, GLsizei count) {
|
| +GLuint GetMaxValue(const void* data, GLuint offset, GLsizei count,
|
| + GLuint primitive_restart_index) {
|
| GLuint max_value = 0;
|
| const T* element =
|
| reinterpret_cast<const T*>(static_cast<const int8_t*>(data) + offset);
|
| const T* end = element + count;
|
| for (; element < end; ++element) {
|
| if (*element > max_value) {
|
| + if (*element == primitive_restart_index) {
|
| + continue;
|
| + }
|
| max_value = *element;
|
| }
|
| }
|
| @@ -217,8 +222,16 @@ bool Buffer::GetMaxValueForRange(
|
| Range range(offset, count, type);
|
| RangeToMaxValueMap::iterator it = range_set_.find(range);
|
| if (it != range_set_.end()) {
|
| - *max_value = it->second;
|
| - return true;
|
| + if (it->second.max_value_ == it->second.max_value_pr_enabled_ ||
|
| + (!manager_->primitive_restart_enabled_ && it->second.max_value_)) {
|
| + *max_value = it->second.max_value_;
|
| + return true;
|
| + }
|
| + if (!manager_->primitive_restart_enabled_ &&
|
| + it->second.max_value_pr_enabled_) {
|
| + *max_value = it->second.max_value_pr_enabled_;
|
| + return true;
|
| + }
|
| }
|
|
|
| uint32_t size;
|
| @@ -240,30 +253,67 @@ bool Buffer::GetMaxValueForRange(
|
| }
|
|
|
| // Scan the range for the max value and store
|
| + bool index_buffer =
|
| + this->initial_target() == GL_ELEMENT_ARRAY_BUFFER ? true : false;
|
| + GLuint primitive_restart_index = 0;
|
| +
|
| GLuint max_v = 0;
|
| switch (type) {
|
| case GL_UNSIGNED_BYTE:
|
| - max_v = GetMaxValue<uint8_t>(shadow_.get(), offset, count);
|
| + if (index_buffer && manager_->primitive_restart_enabled_) {
|
| + primitive_restart_index = 0xFF;
|
| + }
|
| + max_v = GetMaxValue<uint8_t>(shadow_.get(), offset, count,
|
| + primitive_restart_index);
|
| break;
|
| case GL_UNSIGNED_SHORT:
|
| // Check we are not accessing an odd byte for a 2 byte value.
|
| if ((offset & 1) != 0) {
|
| return false;
|
| }
|
| - max_v = GetMaxValue<uint16_t>(shadow_.get(), offset, count);
|
| + if (index_buffer && manager_->primitive_restart_enabled_) {
|
| + primitive_restart_index = 0xFFFF;
|
| + }
|
| + max_v = GetMaxValue<uint16_t>(shadow_.get(), offset, count,
|
| + primitive_restart_index);
|
| break;
|
| case GL_UNSIGNED_INT:
|
| // Check we are not accessing a non aligned address for a 4 byte value.
|
| if ((offset & 3) != 0) {
|
| return false;
|
| }
|
| - max_v = GetMaxValue<uint32_t>(shadow_.get(), offset, count);
|
| + if (index_buffer && manager_->primitive_restart_enabled_) {
|
| + primitive_restart_index = 0xFFFFFFFF;
|
| + }
|
| + max_v = GetMaxValue<uint32_t>(shadow_.get(), offset, count,
|
| + primitive_restart_index);
|
| break;
|
| default:
|
| NOTREACHED(); // should never get here by validation.
|
| break;
|
| }
|
| - range_set_.insert(std::make_pair(range, max_v));
|
| +
|
| + if (it != range_set_.end()) {
|
| + if (manager_->primitive_restart_enabled_) {
|
| + it->second.max_value_ = max_v;
|
| + } else {
|
| + it->second.max_value_pr_enabled_ = max_v;
|
| + }
|
| + } else {
|
| + GLuint temp_max_value = 0, temp_max_value_pr_enabled = 0;
|
| + if (!index_buffer) {
|
| + temp_max_value = max_v;
|
| + temp_max_value_pr_enabled = max_v;
|
| + } else {
|
| + if (manager_->primitive_restart_enabled_) {
|
| + temp_max_value_pr_enabled = max_v;
|
| + } else {
|
| + temp_max_value = max_v;
|
| + }
|
| + }
|
| + struct MaxValue value(temp_max_value, temp_max_value_pr_enabled);
|
| + range_set_.insert(std::make_pair(range, value));
|
| + }
|
| *max_value = max_v;
|
| return true;
|
| }
|
| @@ -536,6 +586,12 @@ Buffer* BufferManager::GetBufferInfoForTarget(
|
| }
|
| }
|
|
|
| +void BufferManager::SetPrimitiveRestartState(bool enabled) {
|
| + if (primitive_restart_enabled_ != enabled) {
|
| + primitive_restart_enabled_ = enabled;
|
| + }
|
| +}
|
| +
|
| bool BufferManager::OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
|
| base::trace_event::ProcessMemoryDump* pmd) {
|
| const int client_id = memory_tracker_->ClientId();
|
|
|