blob: 4647465abd8bb75abb84dbc2cebf997050ddf112 [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <GLES2/gl2.h>
#include <GLES2/gl2chromium.h>
#include <GLES2/gl2ext.h>
#include <GLES2/gl2extchromium.h>
#include "base/bind.h"
#include "base/memory/ref_counted.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/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;
using testing::InvokeWithoutArgs;
using testing::Invoke;
using testing::Return;
using testing::SetArgPointee;
using testing::StrictMock;
namespace gpu {
namespace gles2 {
static const int kImageWidth = 256;
static const int kImageHeight = 256;
static const int kImageBytesPerPixel = 4;
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()));
options.image_manager = image_manager_.get();
options.image_factory = image_factory_.get();
gl_.Initialize(options);
gl_.MakeCurrent();
}
virtual void TearDown() {
gl_.Destroy();
}
scoped_ptr<StrictMock<ImageFactoryMock> > image_factory_;
scoped_refptr<ImageManager> image_manager_;
GLManager gl_;
};
// 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);
// 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, _))
.Times(1)
.WillOnce(DoAll(SetArgPointee<3>(kImageId),
Return(gpu_memory_buffer)))
.RetiresOnSaturation();
// Create the GLImage and insert it into the ImageManager, which
// would be done within CreateGpuMemoryBufferMock if it weren't a mock.
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_CALL(*gpu_memory_buffer, IsMapped())
.WillOnce(Return(false))
.RetiresOnSaturation();
scoped_ptr<uint8[]> buffer_pixels(new uint8[
kImageWidth * kImageHeight * kImageBytesPerPixel]);
EXPECT_CALL(*gpu_memory_buffer, Map(_, _))
.Times(1)
.WillOnce(SetArgPointee<1>(buffer_pixels.get()))
.RetiresOnSaturation();
void* mapped_buffer =
glMapImageCHROMIUM(image_id, GL_WRITE_ONLY);
EXPECT_EQ(buffer_pixels.get(), mapped_buffer);
EXPECT_CALL(*gpu_memory_buffer, IsMapped())
.WillOnce(Return(true))
.RetiresOnSaturation();
// Unmap the image.
EXPECT_CALL(*gpu_memory_buffer, Unmap())
.Times(1)
.RetiresOnSaturation();
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();
glBindTexImage2DCHROMIUM(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
} // namespace gpu