summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorlpique@chromium.org <lpique@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-09 05:40:47 +0000
committerlpique@chromium.org <lpique@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-09 05:40:47 +0000
commit44456387e7880c898d02f40a128d429fae86c4db (patch)
treedc73c2ccef463402db302de870524cf7c85b33de /gpu
parenta3702c5edd8e4cf690d500fc4194235d7235c838 (diff)
downloadchromium_src-44456387e7880c898d02f40a128d429fae86c4db.zip
chromium_src-44456387e7880c898d02f40a128d429fae86c4db.tar.gz
chromium_src-44456387e7880c898d02f40a128d429fae86c4db.tar.bz2
Fix maximum value index caching
If a GL_ELEMENT_ARRAY_BUFFER is reloaded with new data such that the size does not change, the maximum value index cache is not properly invalidated, leading to subsequent errors validating the size of attribute arrays. A one line fix, with additional unit test coverage. TEST=Unit Test BUG=237874 Review URL: https://chromiumcodereview.appspot.com/14932002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@199131 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r--gpu/command_buffer/service/buffer_manager.cc2
-rw-r--r--gpu/command_buffer/service/buffer_manager_unittest.cc33
2 files changed, 34 insertions, 1 deletions
diff --git a/gpu/command_buffer/service/buffer_manager.cc b/gpu/command_buffer/service/buffer_manager.cc
index 7fe9d20..298b78b 100644
--- a/gpu/command_buffer/service/buffer_manager.cc
+++ b/gpu/command_buffer/service/buffer_manager.cc
@@ -99,10 +99,10 @@ void Buffer::SetInfo(
bool is_client_side_array) {
usage_ = usage;
is_client_side_array_ = is_client_side_array;
+ ClearCache();
if (size != size_ || shadow != shadowed_) {
shadowed_ = shadow;
size_ = size;
- ClearCache();
if (shadowed_) {
shadow_.reset(new int8[size]);
} else {
diff --git a/gpu/command_buffer/service/buffer_manager_unittest.cc b/gpu/command_buffer/service/buffer_manager_unittest.cc
index f2ada75..72c9175 100644
--- a/gpu/command_buffer/service/buffer_manager_unittest.cc
+++ b/gpu/command_buffer/service/buffer_manager_unittest.cc
@@ -388,6 +388,39 @@ TEST_F(BufferManagerClientSideArraysTest, StreamBuffersAreShadowed) {
EXPECT_FALSE(buffer->IsClientSideArray());
}
+TEST_F(BufferManagerTest, MaxValueCacheClearedCorrectly) {
+ const GLuint kClientBufferId = 1;
+ const GLuint kServiceBufferId = 11;
+ const uint32 data1[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
+ const uint32 data2[] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ const uint32 data3[] = {30, 29, 28};
+ manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
+ Buffer* buffer = manager_->GetBuffer(kClientBufferId);
+ ASSERT_TRUE(buffer != NULL);
+ manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
+ GLuint max_value;
+ // Load the buffer with some initial data, and then get the maximum value for
+ // a range, which has the side effect of caching it.
+ DoBufferData(buffer, sizeof(data1), GL_STATIC_DRAW, data1, GL_NO_ERROR);
+ EXPECT_TRUE(
+ buffer->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value));
+ EXPECT_EQ(10u, max_value);
+ // Check that any cached values are invalidated if the buffer is reloaded
+ // with the same amount of data (but different content)
+ ASSERT_EQ(sizeof(data2), sizeof(data1));
+ DoBufferData(buffer, sizeof(data2), GL_STATIC_DRAW, data2, GL_NO_ERROR);
+ EXPECT_TRUE(
+ buffer->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value));
+ EXPECT_EQ(20u, max_value);
+ // Check that any cached values are invalidated if the buffer is reloaded
+ // with entirely different content.
+ ASSERT_NE(sizeof(data3), sizeof(data1));
+ DoBufferData(buffer, sizeof(data3), GL_STATIC_DRAW, data3, GL_NO_ERROR);
+ EXPECT_TRUE(
+ buffer->GetMaxValueForRange(0, 3, GL_UNSIGNED_INT, &max_value));
+ EXPECT_EQ(30u, max_value);
+}
+
} // namespace gles2
} // namespace gpu