| 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 db978e1cd8d2bbdc44df4d06c9421c64973ea9f4..2dc4bf831dbaad3b613dd6fcb6f063bfe6424a01 100644
|
| --- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
|
| +++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
|
| @@ -133,6 +133,7 @@ class MockTransferBuffer : public TransferBufferInterface {
|
| void* AllocUpTo(unsigned int size, unsigned int* size_allocated) override;
|
| void* Alloc(unsigned int size) override;
|
| RingBuffer::Offset GetOffset(void* pointer) const override;
|
| + void DiscardBlock(void* p) override;
|
| void FreePendingToken(void* p, unsigned int /* token */) override;
|
|
|
| size_t MaxTransferBufferSize() {
|
| @@ -296,6 +297,11 @@ RingBuffer::Offset MockTransferBuffer::GetOffset(void* pointer) const {
|
| return static_cast<uint8*>(pointer) - actual_buffer();
|
| }
|
|
|
| +void MockTransferBuffer::DiscardBlock(void* p) {
|
| + EXPECT_EQ(last_alloc_, p);
|
| + last_alloc_ = NULL;
|
| +}
|
| +
|
| void MockTransferBuffer::FreePendingToken(void* p, unsigned int /* token */) {
|
| EXPECT_EQ(last_alloc_, p);
|
| last_alloc_ = NULL;
|
| @@ -585,6 +591,10 @@ class GLES2ImplementationTest : public testing::Test {
|
| return transfer_buffer_->MaxTransferBufferSize();
|
| }
|
|
|
| + void SetMappedMemoryLimit(size_t limit) {
|
| + gl_->mapped_memory_->set_max_allocated_bytes(limit);
|
| + }
|
| +
|
| ExpectedMemoryInfo GetExpectedMemory(size_t size) {
|
| return transfer_buffer_->GetExpectedMemory(size);
|
| }
|
| @@ -593,6 +603,18 @@ class GLES2ImplementationTest : public testing::Test {
|
| return transfer_buffer_->GetExpectedResultMemory(size);
|
| }
|
|
|
| + ExpectedMemoryInfo GetExpectedMappedMemory(size_t size) {
|
| + ExpectedMemoryInfo mem;
|
| +
|
| + // Temporarily allocate memory and expect that memory block to be reused.
|
| + mem.ptr = static_cast<uint8*>(gl_->mapped_memory_->Alloc(size,
|
| + &mem.id,
|
| + &mem.offset));
|
| + gl_->mapped_memory_->Free(mem.ptr);
|
| +
|
| + return mem;
|
| + }
|
| +
|
| // Sets the ProgramInfoManager. The manager will be owned
|
| // by the ShareGroup.
|
| void SetProgramInfoManager(ProgramInfoManager* manager) {
|
| @@ -2301,8 +2323,57 @@ TEST_F(GLES2ImplementationTest, TexImage2D) {
|
| pixels, mem2.ptr));
|
| }
|
|
|
| +TEST_F(GLES2ImplementationTest, TexImage2DViaMappedMem) {
|
| + struct Cmds {
|
| + cmds::TexImage2D tex_image_2d;
|
| + cmd::SetToken set_token;
|
| + };
|
| + const GLenum kTarget = GL_TEXTURE_2D;
|
| + const GLint kLevel = 0;
|
| + const GLenum kFormat = GL_RGB;
|
| + const GLsizei kWidth = 3;
|
| + const GLint kBorder = 0;
|
| + const GLenum kType = GL_UNSIGNED_BYTE;
|
| + const GLint kPixelStoreUnpackAlignment = 4;
|
| +
|
| + 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 kMaxHeight = (MaxTransferBufferSize() / padded_row_size) * 2;
|
| + const GLsizei kHeight = kMaxHeight * 2;
|
| + ASSERT_TRUE(GLES2Util::ComputeImageDataSizes(
|
| + kWidth, kHeight, 1, kFormat, kType, kPixelStoreUnpackAlignment,
|
| + &size, &unpadded_row_size, &padded_row_size));
|
| +
|
| + scoped_ptr<uint8[]> pixels(new uint8[size]);
|
| + for (uint32 ii = 0; ii < size; ++ii) {
|
| + pixels[ii] = static_cast<uint8>(ii);
|
| + }
|
| +
|
| + ExpectedMemoryInfo mem1 = GetExpectedMappedMemory(size);
|
| +
|
| + Cmds expected;
|
| + expected.tex_image_2d.Init(
|
| + kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType,
|
| + mem1.id, mem1.offset);
|
| + expected.set_token.Init(GetNextToken());
|
| + gl_->TexImage2D(
|
| + kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
|
| + pixels.get());
|
| + EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
|
| + EXPECT_TRUE(CheckRect(
|
| + kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, false,
|
| + pixels.get(), mem1.ptr));
|
| +}
|
| +
|
| // Test TexImage2D with 2 writes
|
| -TEST_F(GLES2ImplementationTest, TexImage2D2Writes) {
|
| +TEST_F(GLES2ImplementationTest, TexImage2DViaTexSubImage2D) {
|
| + // Set limit to 1 to effectively disable mapped memory.
|
| + SetMappedMemoryLimit(1);
|
| +
|
| struct Cmds {
|
| cmds::TexImage2D tex_image_2d;
|
| cmds::TexSubImage2D tex_sub_image_2d1;
|
| @@ -2726,7 +2797,58 @@ TEST_F(GLES2ImplementationTest, TexImage3DSingleCommand) {
|
| false, reinterpret_cast<uint8*>(pixels.get()), mem.ptr));
|
| }
|
|
|
| +TEST_F(GLES2ImplementationTest, TexImage3DViaMappedMem) {
|
| + 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 kMaxHeight = MaxTransferBufferSize() / padded_row_size / kDepth;
|
| + const GLsizei kHeight = kMaxHeight * 2;
|
| + ASSERT_TRUE(GLES2Util::ComputeImageDataSizes(
|
| + kWidth, kHeight, kDepth, kFormat, kType, kPixelStoreUnpackAlignment,
|
| + &size, NULL, NULL));
|
| +
|
| + scoped_ptr<uint8[]> pixels(new uint8[size]);
|
| + for (uint32 ii = 0; ii < size; ++ii) {
|
| + pixels[ii] = static_cast<uint8>(ii);
|
| + }
|
| +
|
| + ExpectedMemoryInfo mem = GetExpectedMappedMemory(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) {
|
| + // Set limit to 1 to effectively disable mapped memory.
|
| + SetMappedMemoryLimit(1);
|
| +
|
| struct Cmds {
|
| cmds::TexImage3D tex_image_3d;
|
| cmds::TexSubImage3D tex_sub_image_3d1;
|
|
|