Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Unified Diff: gpu/command_buffer/tests/gl_gpu_memory_buffer_unittests.cc

Issue 20017005: gpu: Refactor GpuMemoryBuffer framework for multi-process support. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/tests/gl_gpu_memory_buffer_unittests.cc
diff --git a/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittests.cc b/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittests.cc
index 4647465abd8bb75abb84dbc2cebf997050ddf112..c7f0e025216b80494f993f47d2073e64cb1df101 100644
--- a/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittests.cc
+++ b/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittests.cc
@@ -9,17 +9,16 @@
#include "base/bind.h"
#include "base/memory/ref_counted.h"
+#include "base/process_util.h"
#include "gpu/command_buffer/client/gles2_implementation.h"
-#include "gpu/command_buffer/client/gpu_memory_buffer_mock.h"
-#include "gpu/command_buffer/client/image_factory_mock.h"
+#include "gpu/command_buffer/client/gpu_memory_buffer_factory.h"
+#include "gpu/command_buffer/service/command_buffer_service.h"
#include "gpu/command_buffer/service/image_manager.h"
#include "gpu/command_buffer/tests/gl_manager.h"
#include "gpu/command_buffer/tests/gl_test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/native_widget_types.h"
#include "ui/gl/gl_image.h"
-#include "ui/gl/gl_image_mock.h"
using testing::_;
using testing::IgnoreResult;
@@ -32,77 +31,143 @@ using testing::StrictMock;
namespace gpu {
namespace gles2 {
-static const int kImageWidth = 256;
-static const int kImageHeight = 256;
+static const int kImageWidth = 32;
+static const int kImageHeight = 32;
static const int kImageBytesPerPixel = 4;
+class MockGpuMemoryBuffer : public gfx::GpuMemoryBuffer {
+ public:
+ MockGpuMemoryBuffer(int width, int height) {}
+ virtual ~MockGpuMemoryBuffer() {
+ Die();
+ }
+
+ MOCK_METHOD2(Map, void(gfx::GpuMemoryBuffer::AccessMode, void**));
+ MOCK_METHOD0(Unmap, void());
+ MOCK_CONST_METHOD0(IsMapped, bool());
+ MOCK_CONST_METHOD0(GetStride, uint32());
+ MOCK_CONST_METHOD0(GetHandle, gfx::GpuMemoryBufferHandle());
+ MOCK_METHOD0(Die, void());
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockGpuMemoryBuffer);
+};
+
+class MockGpuMemoryBufferFactory : public GpuMemoryBufferFactory {
+ public:
+ MockGpuMemoryBufferFactory() {}
+ virtual ~MockGpuMemoryBufferFactory() {}
+
+ MOCK_METHOD3(CreateGpuMemoryBuffer,
+ gfx::GpuMemoryBuffer*(size_t width,
+ size_t height,
+ unsigned internalformat));
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockGpuMemoryBufferFactory);
+};
+
class MockGpuMemoryBufferTest : public testing::Test {
protected:
virtual void SetUp() {
GLManager::Options options;
image_manager_ = new ImageManager;
- image_factory_.reset(
- new StrictMock<ImageFactoryMock>(image_manager_.get()));
+ gpu_memory_buffer_factory_.reset(new MockGpuMemoryBufferFactory);
options.image_manager = image_manager_.get();
- options.image_factory = image_factory_.get();
+ options.gpu_memory_buffer_factory = gpu_memory_buffer_factory_.get();
gl_.Initialize(options);
gl_.MakeCurrent();
+
+ glGenTextures(2, texture_ids_);
+ glBindTexture(GL_TEXTURE_2D, texture_ids_[1]);
+
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glGenFramebuffers(1, &framebuffer_id_);
+ glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id_);
+ glFramebufferTexture2D(GL_FRAMEBUFFER,
+ GL_COLOR_ATTACHMENT0,
+ GL_TEXTURE_2D,
+ texture_ids_[1],
+ 0);
}
virtual void TearDown() {
+ glDeleteTextures(2, texture_ids_);
+ glDeleteFramebuffers(1, &framebuffer_id_);
+
gl_.Destroy();
}
- scoped_ptr<StrictMock<ImageFactoryMock> > image_factory_;
scoped_refptr<ImageManager> image_manager_;
+ scoped_ptr<MockGpuMemoryBufferFactory> gpu_memory_buffer_factory_;
GLManager gl_;
+ GLuint texture_ids_[2];
+ GLuint framebuffer_id_;
};
// An end to end test that tests the whole GpuMemoryBuffer lifecycle.
TEST_F(MockGpuMemoryBufferTest, Lifecycle) {
- // Create a client texture id.
- GLuint texture_id;
- glGenTextures(1, &texture_id);
+ size_t bytes = kImageWidth * kImageHeight * kImageBytesPerPixel;
+ uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u };
// Buffer is owned and freed by GpuMemoryBufferTracker.
- StrictMock<GpuMemoryBufferMock>* gpu_memory_buffer =
- new StrictMock<GpuMemoryBufferMock>(kImageWidth, kImageHeight);
-
- const GLuint kImageId = 345u;
-
- EXPECT_CALL(*image_factory_.get(), CreateGpuMemoryBufferMock(
- kImageWidth, kImageHeight, GL_RGBA8_OES, _))
+ StrictMock<MockGpuMemoryBuffer>* gpu_memory_buffer =
+ new StrictMock<MockGpuMemoryBuffer>(kImageWidth, kImageHeight);
+ base::SharedMemory shared_memory;
+ shared_memory.CreateAnonymous(bytes);
+
+ base::SharedMemoryHandle duped_shared_memory_handle;
+ shared_memory.ShareToProcess(base::GetCurrentProcessHandle(),
+ &duped_shared_memory_handle);
+ gfx::GpuMemoryBufferHandle handle(
+ duped_shared_memory_handle, gfx::SHARED_MEMORY_BUFFER);
+
+ EXPECT_CALL(*gpu_memory_buffer_factory_.get(), CreateGpuMemoryBuffer(
+ kImageWidth, kImageHeight, GL_RGBA8_OES))
.Times(1)
- .WillOnce(DoAll(SetArgPointee<3>(kImageId),
- Return(gpu_memory_buffer)))
+ .WillOnce(Return(gpu_memory_buffer))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gpu_memory_buffer, GetHandle())
+ .Times(1)
+ .WillOnce(Return(handle))
.RetiresOnSaturation();
- // Create the GLImage and insert it into the ImageManager, which
- // would be done within CreateGpuMemoryBufferMock if it weren't a mock.
+ // Create the image. This should add the image ID to the ImageManager.
GLuint image_id = glCreateImageCHROMIUM(
kImageWidth, kImageHeight, GL_RGBA8_OES);
- EXPECT_EQ(kImageId, image_id);
-
- gfx::Size size(kImageWidth, kImageHeight);
- scoped_refptr<gfx::GLImageMock> gl_image(
- new gfx::GLImageMock(gpu_memory_buffer, size));
- image_manager_->AddImage(gl_image.get(), image_id);
+ EXPECT_NE(0u, image_id);
+ EXPECT_TRUE(image_manager_->LookupImage(image_id) != NULL);
EXPECT_CALL(*gpu_memory_buffer, IsMapped())
.WillOnce(Return(false))
.RetiresOnSaturation();
- scoped_ptr<uint8[]> buffer_pixels(new uint8[
- kImageWidth * kImageHeight * kImageBytesPerPixel]);
+ shared_memory.Map(bytes);
+ EXPECT_TRUE(shared_memory.memory());
EXPECT_CALL(*gpu_memory_buffer, Map(_, _))
.Times(1)
- .WillOnce(SetArgPointee<1>(buffer_pixels.get()))
+ .WillOnce(SetArgPointee<1>(shared_memory.memory()))
.RetiresOnSaturation();
- void* mapped_buffer =
- glMapImageCHROMIUM(image_id, GL_WRITE_ONLY);
- EXPECT_EQ(buffer_pixels.get(), mapped_buffer);
+ uint8* mapped_buffer = static_cast<uint8*>(
+ glMapImageCHROMIUM(image_id, GL_WRITE_ONLY));
+ ASSERT_TRUE(mapped_buffer != NULL);
+
+ // Assign a value to each pixel.
+ int stride = kImageWidth * kImageBytesPerPixel;
+ for (int x = 0; x < kImageWidth; ++x) {
+ for (int y = 0; y < kImageHeight; ++y) {
+ mapped_buffer[y * stride + x * kImageBytesPerPixel + 0] = pixels[2];
+ mapped_buffer[y * stride + x * kImageBytesPerPixel + 1] = pixels[1];
+ mapped_buffer[y * stride + x * kImageBytesPerPixel + 2] = pixels[0];
+ mapped_buffer[y * stride + x * kImageBytesPerPixel + 3] = pixels[3];
+ }
+ }
EXPECT_CALL(*gpu_memory_buffer, IsMapped())
.WillOnce(Return(true))
@@ -115,26 +180,30 @@ TEST_F(MockGpuMemoryBufferTest, Lifecycle) {
glUnmapImageCHROMIUM(image_id);
// Bind the texture and the image.
- glBindTexture(GL_TEXTURE_2D, texture_id);
- EXPECT_CALL(*gl_image.get(), BindTexImage()).Times(1).WillOnce(Return(true))
- .RetiresOnSaturation();
- EXPECT_CALL(*gl_image.get(), GetSize()).Times(1).WillOnce(Return(size))
- .RetiresOnSaturation();
+ glBindTexture(GL_TEXTURE_2D, texture_ids_[0]);
glBindTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id);
+ // Copy texture so we can verify result using CheckPixels.
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D,
+ texture_ids_[0],
+ texture_ids_[1],
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR);
+
+ // Check if pixels match the values that were assigned to the mapped buffer.
+ GLTestHelper::CheckPixels(0, 0, kImageWidth, kImageHeight, 0, pixels);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError());
+
+ // Release the image.
+ glReleaseTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id);
+
// Destroy the image.
EXPECT_CALL(*gpu_memory_buffer, Die())
.Times(1)
.RetiresOnSaturation();
-
- EXPECT_CALL(*image_factory_.get(), DeleteGpuMemoryBuffer(image_id))
- .Times(1)
- .RetiresOnSaturation();
-
glDestroyImageCHROMIUM(image_id);
-
- // Delete the texture.
- glDeleteTextures(1, &texture_id);
}
} // namespace gles2

Powered by Google App Engine
This is Rietveld 408576698