| Index: cc/output/gl_renderer_unittest.cc
|
| diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc
|
| index 48a595116e01b2e73fd07b847ffdfe4723e18a8c..0f901c58ba52f0d59d9f421622215a9589c8338f 100644
|
| --- a/cc/output/gl_renderer_unittest.cc
|
| +++ b/cc/output/gl_renderer_unittest.cc
|
| @@ -153,8 +153,7 @@ class FakeRendererClient : public RendererClient {
|
| memory_allocation_limit_bytes_(
|
| PrioritizedResourceManager::DefaultMemoryAllocationLimit()),
|
| viewport_size_(gfx::Size(1, 1)),
|
| - scale_factor_(1.f),
|
| - is_viewport_changed_(true) {
|
| + scale_factor_(1.f) {
|
| root_layer_->CreateRenderSurface();
|
| RenderPass::Id render_pass_id =
|
| root_layer_->render_surface()->RenderPassId();
|
| @@ -165,9 +164,9 @@ class FakeRendererClient : public RendererClient {
|
| }
|
|
|
| // RendererClient methods.
|
| - virtual gfx::Size DeviceViewportSize() const OVERRIDE {
|
| + virtual gfx::Rect DeviceViewport() const OVERRIDE {
|
| static gfx::Size fake_size(1, 1);
|
| - return fake_size;
|
| + return gfx::Rect(fake_size);
|
| }
|
| virtual float DeviceScaleFactor() const OVERRIDE {
|
| return scale_factor_;
|
| @@ -209,10 +208,7 @@ class FakeRendererClient : public RendererClient {
|
| gfx::Size viewport_size, float scale_factor) {
|
| viewport_size_ = viewport_size;
|
| scale_factor_ = scale_factor;
|
| - is_viewport_changed_ = true;
|
| }
|
| - bool is_viewport_changed() const { return is_viewport_changed_; }
|
| - void clear_viewport_changed() { is_viewport_changed_ = false; }
|
|
|
| RenderPass* root_render_pass() { return render_passes_in_draw_order_.back(); }
|
| RenderPassList* render_passes_in_draw_order() {
|
| @@ -233,7 +229,6 @@ class FakeRendererClient : public RendererClient {
|
| size_t memory_allocation_limit_bytes_;
|
| gfx::Size viewport_size_;
|
| float scale_factor_;
|
| - bool is_viewport_changed_;
|
| };
|
|
|
| class FakeRendererGL : public GLRenderer {
|
| @@ -1004,7 +999,7 @@ TEST(GLRendererTest2, ShouldClearRootRenderPass) {
|
| &mock_client, output_surface.get(), resource_provider.get());
|
| EXPECT_TRUE(renderer.Initialize());
|
|
|
| - gfx::Rect viewport_rect(mock_client.DeviceViewportSize());
|
| + gfx::Rect viewport_rect(mock_client.DeviceViewport());
|
| ScopedPtrVector<RenderPass>& render_passes =
|
| *mock_client.render_passes_in_draw_order();
|
| render_passes.clear();
|
| @@ -1075,7 +1070,7 @@ TEST(GLRendererTest2, ScissorTestWhenClearing) {
|
| EXPECT_TRUE(renderer.Initialize());
|
| EXPECT_FALSE(renderer.Capabilities().using_partial_swap);
|
|
|
| - gfx::Rect viewport_rect(mock_client.DeviceViewportSize());
|
| + gfx::Rect viewport_rect(mock_client.DeviceViewport());
|
| ScopedPtrVector<RenderPass>& render_passes =
|
| *mock_client.render_passes_in_draw_order();
|
| render_passes.clear();
|
| @@ -1105,12 +1100,89 @@ TEST(GLRendererTest2, ScissorTestWhenClearing) {
|
| renderer.DrawFrame(mock_client.render_passes_in_draw_order());
|
| }
|
|
|
| +class NonReshapableOutputSurface : public FakeOutputSurface {
|
| + public:
|
| + explicit NonReshapableOutputSurface(
|
| + scoped_ptr<WebKit::WebGraphicsContext3D> context3d)
|
| + : FakeOutputSurface(context3d.Pass(), false) {}
|
| + virtual gfx::Size SurfaceSize() const OVERRIDE { return gfx::Size(500, 500); }
|
| +};
|
| +
|
| +class OffsetViewportRendererClient : public FakeRendererClient {
|
| + public:
|
| + virtual gfx::Rect DeviceViewport() const OVERRIDE {
|
| + return gfx::Rect(10, 10, 100, 100);
|
| + }
|
| +};
|
| +
|
| +class FlippedScissorAndViewportContext : public TestWebGraphicsContext3D {
|
| + public:
|
| + FlippedScissorAndViewportContext()
|
| + : did_call_viewport_(false), did_call_scissor_(false) {}
|
| + virtual ~FlippedScissorAndViewportContext() {
|
| + EXPECT_TRUE(did_call_viewport_);
|
| + EXPECT_TRUE(did_call_scissor_);
|
| + }
|
| +
|
| + virtual void viewport(GLint x, GLint y, GLsizei width, GLsizei height) {
|
| + EXPECT_EQ(10, x);
|
| + EXPECT_EQ(390, y);
|
| + EXPECT_EQ(100, width);
|
| + EXPECT_EQ(100, height);
|
| + did_call_viewport_ = true;
|
| + }
|
| +
|
| + virtual void scissor(GLint x, GLint y, GLsizei width, GLsizei height) {
|
| + EXPECT_EQ(30, x);
|
| + EXPECT_EQ(450, y);
|
| + EXPECT_EQ(20, width);
|
| + EXPECT_EQ(20, height);
|
| + did_call_scissor_ = true;
|
| + }
|
| +
|
| + private:
|
| + bool did_call_viewport_;
|
| + bool did_call_scissor_;
|
| +};
|
| +
|
| +TEST(GLRendererTest2, ScissorAndViewportWithinNonreshapableSurface) {
|
| + // In Android WebView, the OutputSurface is unable to respect reshape() calls
|
| + // and maintains a fixed size. This test verifies that glViewport and
|
| + // glScissor's Y coordinate is flipped correctly in this environment, and that
|
| + // the glViewport can be at a nonzero origin within the surface.
|
| + OffsetViewportRendererClient mock_client;
|
| + scoped_ptr<OutputSurface> output_surface(make_scoped_ptr(
|
| + new NonReshapableOutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D>(
|
| + new FlippedScissorAndViewportContext))));
|
| + scoped_ptr<ResourceProvider> resource_provider(
|
| + ResourceProvider::Create(output_surface.get(), 0));
|
| + FakeRendererGL renderer(
|
| + &mock_client, output_surface.get(), resource_provider.get());
|
| + EXPECT_TRUE(renderer.Initialize());
|
| + EXPECT_FALSE(renderer.Capabilities().using_partial_swap);
|
| +
|
| + gfx::Rect viewport_rect(mock_client.DeviceViewport().size());
|
| + gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20);
|
| + ScopedPtrVector<RenderPass>& render_passes =
|
| + *mock_client.render_passes_in_draw_order();
|
| + render_passes.clear();
|
| +
|
| + RenderPass::Id root_pass_id(1, 0);
|
| + TestRenderPass* root_pass = AddRenderPass(
|
| + &render_passes, root_pass_id, viewport_rect, gfx::Transform());
|
| + AddClippedQuad(root_pass, quad_rect, SK_ColorGREEN);
|
| +
|
| + renderer.DecideRenderPassAllocationsForFrame(
|
| + *mock_client.render_passes_in_draw_order());
|
| + renderer.DrawFrame(mock_client.render_passes_in_draw_order());
|
| +}
|
| +
|
| // This test was never actually working as intended. Before adding
|
| // ShaderCreatorMockGraphicsContext, all shader programs received the same
|
| // program identifier from the TestWebGraphicsContext3D, so it always passed
|
| // when checking which shader was used.
|
| TEST_F(GLRendererShaderTest, DISABLED_DrawRenderPassQuadShaderPermutations) {
|
| - gfx::Rect viewport_rect(mock_client_.DeviceViewportSize());
|
| + gfx::Rect viewport_rect(mock_client_.DeviceViewport());
|
| ScopedPtrVector<RenderPass>* render_passes =
|
| mock_client_.render_passes_in_draw_order();
|
|
|
| @@ -1372,7 +1444,7 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadSkipsAAForClippingTransform) {
|
| RenderPass::Id child_pass_id(2, 0);
|
| TestRenderPass* child_pass;
|
|
|
| - gfx::Rect viewport_rect(mock_client_.DeviceViewportSize());
|
| + gfx::Rect viewport_rect(mock_client_.DeviceViewport());
|
| RenderPass::Id root_pass_id(1, 0);
|
| TestRenderPass* root_pass;
|
|
|
| @@ -1417,7 +1489,7 @@ TEST_F(GLRendererShaderTest, DrawRenderPassQuadSkipsAAForClippingTransform) {
|
| }
|
|
|
| TEST_F(GLRendererShaderTest, DrawSolidColorShader) {
|
| - gfx::Rect viewport_rect(mock_client_.DeviceViewportSize());
|
| + gfx::Rect viewport_rect(mock_client_.DeviceViewport());
|
| ScopedPtrVector<RenderPass>* render_passes =
|
| mock_client_.render_passes_in_draw_order();
|
|
|
| @@ -1474,7 +1546,9 @@ class MockOutputSurface : public OutputSurface {
|
| public:
|
| MockOutputSurface()
|
| : OutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D>(
|
| - new StrictMock<OutputSurfaceMockContext>)) {}
|
| + new StrictMock<OutputSurfaceMockContext>)) {
|
| + surface_size_ = gfx::Size(100, 100);
|
| + }
|
| virtual ~MockOutputSurface() {}
|
|
|
| MOCK_METHOD1(SendFrameToParentCompositor, void(CompositorFrame* frame));
|
| @@ -1497,7 +1571,7 @@ class MockOutputSurfaceTest : public testing::Test, public FakeRendererClient {
|
| void SwapBuffers() { renderer_.SwapBuffers(ui::LatencyInfo()); }
|
|
|
| void DrawFrame() {
|
| - gfx::Rect viewport_rect(DeviceViewportSize());
|
| + gfx::Rect viewport_rect(DeviceViewport());
|
| ScopedPtrVector<RenderPass>* render_passes = render_passes_in_draw_order();
|
| render_passes->clear();
|
|
|
| @@ -1508,11 +1582,8 @@ class MockOutputSurfaceTest : public testing::Test, public FakeRendererClient {
|
|
|
| EXPECT_CALL(output_surface_, EnsureBackbuffer()).WillRepeatedly(Return());
|
|
|
| - if (is_viewport_changed()) {
|
| - EXPECT_CALL(output_surface_,
|
| - Reshape(DeviceViewportSize(), DeviceScaleFactor())).Times(1);
|
| - clear_viewport_changed();
|
| - }
|
| + EXPECT_CALL(output_surface_,
|
| + Reshape(DeviceViewport().size(), DeviceScaleFactor())).Times(1);
|
|
|
| EXPECT_CALL(output_surface_, BindFramebuffer()).Times(1);
|
|
|
|
|