Index: gpu/command_buffer/client/gles2_implementation_unittest.cc |
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc |
index 3d0f1b06b9b6acb7c3c0e335d68b85b48e02218e..0d49e421708b13f9d9f7b80eb532445948ec20ae 100644 |
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc |
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc |
@@ -2163,7 +2163,7 @@ static bool CheckRect( |
uint32 unpadded_row_size = 0; |
uint32 padded_row_size = 0; |
if (!GLES2Util::ComputeImageDataSizes( |
- width, height, format, type, alignment, &size, &unpadded_row_size, |
+ width, height, 1, format, type, alignment, &size, &unpadded_row_size, |
&padded_row_size)) { |
return false; |
} |
@@ -2269,15 +2269,15 @@ TEST_F(GLES2ImplementationTest, TexImage2D2Writes) { |
uint32 unpadded_row_size = 0; |
uint32 padded_row_size = 0; |
ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
- kWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment, |
+ kWidth, 2, 1, kFormat, kType, kPixelStoreUnpackAlignment, |
&size, &unpadded_row_size, &padded_row_size)); |
const GLsizei kHeight = (MaxTransferBufferSize() / padded_row_size) * 2; |
ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
- kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, |
+ kWidth, kHeight, 1, kFormat, kType, kPixelStoreUnpackAlignment, |
&size, NULL, NULL)); |
uint32 half_size = 0; |
ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
- kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, |
+ kWidth, kHeight / 2, 1, kFormat, kType, kPixelStoreUnpackAlignment, |
&half_size, NULL, NULL)); |
scoped_ptr<uint8[]> pixels(new uint8[size]); |
@@ -2378,7 +2378,7 @@ TEST_F(GLES2ImplementationTest, TexSubImage2DFlipY) { |
uint32 sub_2_high_size = 0; |
ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
- kSubImageWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment, |
+ kSubImageWidth, 2, 1, kFormat, kType, kPixelStoreUnpackAlignment, |
&sub_2_high_size, NULL, NULL)); |
ExpectedMemoryInfo mem1 = GetExpectedMemory(sub_2_high_size); |
@@ -2460,7 +2460,7 @@ TEST_F(GLES2ImplementationTest, SubImageUnpack) { |
uint32 src_size; |
ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
- kSrcWidth, kSrcSubImageY1, kFormat, kType, 8, &src_size, NULL, NULL)); |
+ kSrcWidth, kSrcSubImageY1, 1, kFormat, kType, 8, &src_size, NULL, NULL)); |
scoped_ptr<uint8[]> src_pixels; |
src_pixels.reset(new uint8[src_size]); |
for (size_t i = 0; i < src_size; ++i) { |
@@ -2475,7 +2475,7 @@ TEST_F(GLES2ImplementationTest, SubImageUnpack) { |
uint32 unpadded_row_size; |
uint32 padded_row_size; |
ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
- kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, alignment, |
+ kSrcSubImageWidth, kSrcSubImageHeight, 1, kFormat, kType, alignment, |
&size, &unpadded_row_size, &padded_row_size)); |
ASSERT_TRUE(size <= MaxTransferBufferSize()); |
ExpectedMemoryInfo mem = GetExpectedMemory(size); |
@@ -2626,6 +2626,181 @@ TEST_F(GLES2ImplementationTest, TextureInvalidArguments) { |
EXPECT_EQ(GL_INVALID_VALUE, CheckError()); |
} |
+TEST_F(GLES2ImplementationTest, TexImage3DSingleCommand) { |
+ struct Cmds { |
+ cmds::TexImage3D tex_image_3d; |
+ }; |
+ const GLenum kTarget = GL_TEXTURE_3D; |
+ const GLint kLevel = 0; |
+ const GLint kBorder = 0; |
+ const GLenum kFormat = GL_RGB; |
+ const GLenum kType = GL_UNSIGNED_BYTE; |
+ const GLint kPixelStoreUnpackAlignment = 4; |
+ const GLsizei kWidth = 3; |
+ const GLsizei kDepth = 2; |
+ |
+ uint32 size = 0; |
+ uint32 unpadded_row_size = 0; |
+ uint32 padded_row_size = 0; |
+ ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
+ kWidth, 2, kDepth, kFormat, kType, kPixelStoreUnpackAlignment, |
+ &size, &unpadded_row_size, &padded_row_size)); |
+ // Makes sure we can just send over the data in one command. |
+ const GLsizei kHeight = MaxTransferBufferSize() / padded_row_size / kDepth; |
+ |
+ scoped_ptr<uint8[]> pixels(new uint8[size]); |
+ for (uint32 ii = 0; ii < size; ++ii) { |
+ pixels[ii] = static_cast<uint8>(ii); |
+ } |
+ |
+ ExpectedMemoryInfo mem = GetExpectedMemory(size); |
+ |
+ Cmds expected; |
+ expected.tex_image_3d.Init( |
+ kTarget, kLevel, kFormat, kWidth, kHeight, kDepth, |
+ kFormat, kType, mem.id, mem.offset); |
+ |
+ gl_->TexImage3D( |
+ kTarget, kLevel, kFormat, kWidth, kHeight, kDepth, kBorder, |
+ kFormat, kType, pixels.get()); |
+ |
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
+ EXPECT_TRUE(CheckRect( |
+ kWidth, kHeight * kDepth, kFormat, kType, kPixelStoreUnpackAlignment, |
+ false, reinterpret_cast<uint8*>(pixels.get()), mem.ptr)); |
+} |
+ |
+TEST_F(GLES2ImplementationTest, TexImage3DViaTexSubImage3D) { |
+ struct Cmds { |
+ cmds::TexImage3D tex_image_3d; |
+ cmds::TexSubImage3D tex_sub_image_3d1; |
+ cmd::SetToken set_token; |
+ cmds::TexSubImage3D tex_sub_image_3d2; |
+ }; |
+ const GLenum kTarget = GL_TEXTURE_3D; |
+ const GLint kLevel = 0; |
+ const GLint kBorder = 0; |
+ const GLenum kFormat = GL_RGB; |
+ const GLenum kType = GL_UNSIGNED_BYTE; |
+ const GLint kPixelStoreUnpackAlignment = 4; |
+ const GLsizei kWidth = 3; |
+ |
+ uint32 size = 0; |
+ uint32 unpadded_row_size = 0; |
+ uint32 padded_row_size = 0; |
+ ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
+ kWidth, 2, 1, kFormat, kType, kPixelStoreUnpackAlignment, |
+ &size, &unpadded_row_size, &padded_row_size)); |
+ // Makes sure the data is more than one command can hold. |
+ const GLsizei kHeight = MaxTransferBufferSize() / padded_row_size + 3; |
+ ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
+ kWidth, kHeight, 1, kFormat, kType, kPixelStoreUnpackAlignment, |
+ &size, NULL, NULL)); |
+ uint32 first_size = padded_row_size * (kHeight - 3); |
+ uint32 second_size = |
+ padded_row_size * 3 - (padded_row_size - unpadded_row_size); |
+ EXPECT_EQ(size, first_size + second_size); |
+ ExpectedMemoryInfo mem1 = GetExpectedMemory(first_size); |
+ ExpectedMemoryInfo mem2 = GetExpectedMemory(second_size); |
+ scoped_ptr<uint8[]> pixels(new uint8[size]); |
+ for (uint32 ii = 0; ii < size; ++ii) { |
+ pixels[ii] = static_cast<uint8>(ii); |
+ } |
+ |
+ Cmds expected; |
+ expected.tex_image_3d.Init( |
+ kTarget, kLevel, kFormat, kWidth, kHeight, 1, kFormat, kType, 0, 0); |
+ expected.tex_sub_image_3d1.Init( |
+ kTarget, kLevel, 0, 0, 0, kWidth, kHeight - 3, 1, kFormat, kType, |
+ mem1.id, mem1.offset, GL_TRUE); |
+ expected.tex_sub_image_3d2.Init( |
+ kTarget, kLevel, 0, kHeight - 3, 0, kWidth, 3, 1, kFormat, kType, |
+ mem2.id, mem2.offset, GL_TRUE); |
+ expected.set_token.Init(GetNextToken()); |
+ |
+ gl_->TexImage3D( |
+ kTarget, kLevel, kFormat, kWidth, kHeight, 1, kBorder, |
+ kFormat, kType, pixels.get()); |
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
+} |
+ |
+// Test TexSubImage3D with 4 writes |
+TEST_F(GLES2ImplementationTest, TexSubImage3D4Writes) { |
+ struct Cmds { |
+ cmds::TexSubImage3D tex_sub_image_3d1_1; |
+ cmd::SetToken set_token1; |
+ cmds::TexSubImage3D tex_sub_image_3d1_2; |
+ cmd::SetToken set_token2; |
+ cmds::TexSubImage3D tex_sub_image_3d2_1; |
+ cmd::SetToken set_token3; |
+ cmds::TexSubImage3D tex_sub_image_3d2_2; |
+ }; |
+ const GLenum kTarget = GL_TEXTURE_3D; |
+ const GLint kLevel = 0; |
+ const GLint kXOffset = 0; |
+ const GLint kYOffset = 0; |
+ const GLint kZOffset = 0; |
+ const GLenum kFormat = GL_RGB; |
+ const GLenum kType = GL_UNSIGNED_BYTE; |
+ const GLint kPixelStoreUnpackAlignment = 4; |
+ const GLsizei kWidth = 3; |
+ const GLsizei kDepth = 2; |
+ |
+ uint32 size = 0; |
+ uint32 unpadded_row_size = 0; |
+ uint32 padded_row_size = 0; |
+ ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
+ kWidth, 2, 1, kFormat, kType, kPixelStoreUnpackAlignment, |
+ &size, &unpadded_row_size, &padded_row_size)); |
+ const GLsizei kHeight = MaxTransferBufferSize() / padded_row_size + 2; |
+ ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
+ kWidth, kHeight, kDepth, kFormat, kType, kPixelStoreUnpackAlignment, |
+ &size, NULL, NULL)); |
+ uint32 first_size = (kHeight - 2) * padded_row_size; |
+ uint32 second_size = 2 * padded_row_size; |
+ uint32 third_size = first_size; |
+ uint32 fourth_size = second_size - (padded_row_size - unpadded_row_size); |
+ EXPECT_EQ(size, first_size + second_size + third_size + fourth_size); |
+ |
+ scoped_ptr<uint8[]> pixels(new uint8[size]); |
+ for (uint32 ii = 0; ii < size; ++ii) { |
+ pixels[ii] = static_cast<uint8>(ii); |
+ } |
+ |
+ ExpectedMemoryInfo mem1_1 = GetExpectedMemory(first_size); |
+ ExpectedMemoryInfo mem1_2 = GetExpectedMemory(second_size); |
+ ExpectedMemoryInfo mem2_1 = GetExpectedMemory(third_size); |
+ ExpectedMemoryInfo mem2_2 = GetExpectedMemory(fourth_size); |
+ |
+ Cmds expected; |
+ expected.tex_sub_image_3d1_1.Init( |
+ kTarget, kLevel, kXOffset, kYOffset, kZOffset, |
+ kWidth, kHeight - 2, 1, kFormat, kType, |
+ mem1_1.id, mem1_1.offset, GL_FALSE); |
+ expected.tex_sub_image_3d1_2.Init( |
+ kTarget, kLevel, kXOffset, kYOffset + kHeight - 2, kZOffset, |
+ kWidth, 2, 1, kFormat, kType, mem1_2.id, mem1_2.offset, GL_FALSE); |
+ expected.tex_sub_image_3d2_1.Init( |
+ kTarget, kLevel, kXOffset, kYOffset, kZOffset + 1, |
+ kWidth, kHeight - 2, 1, kFormat, kType, |
+ mem2_1.id, mem2_1.offset, GL_FALSE); |
+ expected.tex_sub_image_3d2_2.Init( |
+ kTarget, kLevel, kXOffset, kYOffset + kHeight - 2, kZOffset + 1, |
+ kWidth, 2, 1, kFormat, kType, mem2_2.id, mem2_2.offset, GL_FALSE); |
+ expected.set_token1.Init(GetNextToken()); |
+ expected.set_token2.Init(GetNextToken()); |
+ expected.set_token3.Init(GetNextToken()); |
+ |
+ gl_->TexSubImage3D( |
+ kTarget, kLevel, kXOffset, kYOffset, kZOffset, kWidth, kHeight, kDepth, |
+ kFormat, kType, pixels.get()); |
+ |
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
+ uint32 offset_to_last = first_size + second_size + third_size; |
+ EXPECT_TRUE(CheckRect( |
+ kWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment, false, |
+ reinterpret_cast<uint8*>(pixels.get()) + offset_to_last, mem2_2.ptr)); |
+} |
// Binds can not be cached with bind_generates_resource = false because |
// our id might not be valid. More specifically if you bind on contextA then |
@@ -3266,6 +3441,76 @@ TEST_F(GLES2ImplementationTest, LimitSizeAndOffsetTo32Bit) { |
EXPECT_STREQ(kOffsetOverflowMessage, GetLastError().c_str()); |
} |
+TEST_F(GLES2ImplementationTest, TraceBeginCHROMIUM) { |
+ const uint32 kCategoryBucketId = GLES2Implementation::kResultBucketId; |
+ const uint32 kNameBucketId = GLES2Implementation::kResultBucketId + 1; |
+ const std::string category_name = "test category"; |
+ const std::string trace_name = "test trace"; |
+ const size_t kPaddedString1Size = |
+ transfer_buffer_->RoundToAlignment(category_name.size() + 1); |
+ const size_t kPaddedString2Size = |
+ transfer_buffer_->RoundToAlignment(trace_name.size() + 1); |
+ |
+ gl_->TraceBeginCHROMIUM(category_name.c_str(), trace_name.c_str()); |
+ EXPECT_EQ(GL_NO_ERROR, CheckError()); |
+ |
+ struct Cmds { |
+ cmd::SetBucketSize category_size1; |
+ cmd::SetBucketData category_data; |
+ cmd::SetToken set_token1; |
+ cmd::SetBucketSize name_size1; |
+ cmd::SetBucketData name_data; |
+ cmd::SetToken set_token2; |
+ cmds::TraceBeginCHROMIUM trace_call_begin; |
+ cmd::SetBucketSize category_size2; |
+ cmd::SetBucketSize name_size2; |
+ }; |
+ |
+ ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedString1Size); |
+ ExpectedMemoryInfo mem2 = GetExpectedMemory(kPaddedString2Size); |
+ |
+ ASSERT_STREQ(category_name.c_str(), reinterpret_cast<char*>(mem1.ptr)); |
+ ASSERT_STREQ(trace_name.c_str(), reinterpret_cast<char*>(mem2.ptr)); |
+ |
+ Cmds expected; |
+ expected.category_size1.Init(kCategoryBucketId, category_name.size() + 1); |
+ expected.category_data.Init( |
+ kCategoryBucketId, 0, category_name.size() + 1, mem1.id, mem1.offset); |
+ expected.set_token1.Init(GetNextToken()); |
+ expected.name_size1.Init(kNameBucketId, trace_name.size() + 1); |
+ expected.name_data.Init( |
+ kNameBucketId, 0, trace_name.size() + 1, mem2.id, mem2.offset); |
+ expected.set_token2.Init(GetNextToken()); |
+ expected.trace_call_begin.Init(kCategoryBucketId, kNameBucketId); |
+ expected.category_size2.Init(kCategoryBucketId, 0); |
+ expected.name_size2.Init(kNameBucketId, 0); |
+ |
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
+} |
+ |
+TEST_F(GLES2ImplementationTest, AllowNestedTracesCHROMIUM) { |
+ const std::string category1_name = "test category 1"; |
+ const std::string trace1_name = "test trace 1"; |
+ const std::string category2_name = "test category 2"; |
+ const std::string trace2_name = "test trace 2"; |
+ |
+ gl_->TraceBeginCHROMIUM(category1_name.c_str(), trace1_name.c_str()); |
+ EXPECT_EQ(GL_NO_ERROR, CheckError()); |
+ |
+ gl_->TraceBeginCHROMIUM(category2_name.c_str(), trace2_name.c_str()); |
+ EXPECT_EQ(GL_NO_ERROR, CheckError()); |
+ |
+ gl_->TraceEndCHROMIUM(); |
+ EXPECT_EQ(GL_NO_ERROR, CheckError()); |
+ |
+ gl_->TraceEndCHROMIUM(); |
+ EXPECT_EQ(GL_NO_ERROR, CheckError()); |
+ |
+ // No more corresponding begin tracer marker should error. |
+ gl_->TraceEndCHROMIUM(); |
+ EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); |
+} |
+ |
TEST_F(GLES2ImplementationManualInitTest, LoseContextOnOOM) { |
ContextInitOptions init_options; |
init_options.lose_context_when_out_of_memory = true; |