summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-28 23:15:19 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-28 23:15:19 +0000
commit254330724d03cc36555ce0b3f742f0f52cf9a839 (patch)
tree80ee68fd2972b875e5047752d372edb53983388b
parent74534a8782d00091a5d2d25b1e111793c1652305 (diff)
downloadchromium_src-254330724d03cc36555ce0b3f742f0f52cf9a839.zip
chromium_src-254330724d03cc36555ce0b3f742f0f52cf9a839.tar.gz
chromium_src-254330724d03cc36555ce0b3f742f0f52cf9a839.tar.bz2
Merge 199131 "Fix maximum value index caching"
> 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 TBR=lpique@chromium.org Review URL: https://codereview.chromium.org/15692017 git-svn-id: svn://svn.chromium.org/chrome/branches/1500/src@202683 0039d316-1c4b-4281-b951-d872f2087c98
-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