diff options
author | lpique@chromium.org <lpique@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-09 05:40:47 +0000 |
---|---|---|
committer | lpique@chromium.org <lpique@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-09 05:40:47 +0000 |
commit | 44456387e7880c898d02f40a128d429fae86c4db (patch) | |
tree | dc73c2ccef463402db302de870524cf7c85b33de /gpu | |
parent | a3702c5edd8e4cf690d500fc4194235d7235c838 (diff) | |
download | chromium_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.cc | 2 | ||||
-rw-r--r-- | gpu/command_buffer/service/buffer_manager_unittest.cc | 33 |
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 |