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(); |