OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/output/gl_renderer.h" | 5 #include "cc/output/gl_renderer.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <set> | 9 #include <set> |
10 | 10 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 gpu::SyncToken other; | 57 gpu::SyncToken other; |
58 memcpy(&other, arg, sizeof(other)); | 58 memcpy(&other, arg, sizeof(other)); |
59 return other == sync_token; | 59 return other == sync_token; |
60 } | 60 } |
61 | 61 |
62 class GLRendererTest : public testing::Test { | 62 class GLRendererTest : public testing::Test { |
63 protected: | 63 protected: |
64 RenderPass* root_render_pass() { | 64 RenderPass* root_render_pass() { |
65 return render_passes_in_draw_order_.back().get(); | 65 return render_passes_in_draw_order_.back().get(); |
66 } | 66 } |
| 67 void DrawFrame(Renderer* renderer, const gfx::Rect& viewport_rect) { |
| 68 renderer->DrawFrame(&render_passes_in_draw_order_, 1.f, gfx::ColorSpace(), |
| 69 viewport_rect, viewport_rect, false); |
| 70 } |
| 71 void DrawFrame(Renderer* renderer, |
| 72 const gfx::Rect& viewport_rect, |
| 73 const gfx::Rect& clip_rect) { |
| 74 renderer->DrawFrame(&render_passes_in_draw_order_, 1.f, gfx::ColorSpace(), |
| 75 viewport_rect, clip_rect, false); |
| 76 } |
67 | 77 |
68 RenderPassList render_passes_in_draw_order_; | 78 RenderPassList render_passes_in_draw_order_; |
69 }; | 79 }; |
70 | 80 |
71 #define EXPECT_PROGRAM_VALID(program_binding) \ | 81 #define EXPECT_PROGRAM_VALID(program_binding) \ |
72 do { \ | 82 do { \ |
73 EXPECT_TRUE((program_binding)->program()); \ | 83 EXPECT_TRUE((program_binding)->program()); \ |
74 EXPECT_TRUE((program_binding)->initialized()); \ | 84 EXPECT_TRUE((program_binding)->initialized()); \ |
75 } while (false) | 85 } while (false) |
76 | 86 |
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 renderer_->SetVisible(false); | 543 renderer_->SetVisible(false); |
534 EXPECT_TRUE(renderer_->IsBackbufferDiscarded()); | 544 EXPECT_TRUE(renderer_->IsBackbufferDiscarded()); |
535 EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count()); | 545 EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count()); |
536 | 546 |
537 AddRenderPass(&render_passes_in_draw_order_, | 547 AddRenderPass(&render_passes_in_draw_order_, |
538 RenderPassId(1, 0), | 548 RenderPassId(1, 0), |
539 viewport_rect, | 549 viewport_rect, |
540 gfx::Transform()); | 550 gfx::Transform()); |
541 | 551 |
542 renderer_->SetVisible(true); | 552 renderer_->SetVisible(true); |
543 renderer_->DrawFrame(&render_passes_in_draw_order_, | 553 DrawFrame(renderer_.get(), viewport_rect); |
544 1.f, | |
545 viewport_rect, | |
546 viewport_rect, | |
547 false); | |
548 EXPECT_FALSE(renderer_->IsBackbufferDiscarded()); | 554 EXPECT_FALSE(renderer_->IsBackbufferDiscarded()); |
549 | 555 |
550 SwapBuffers(); | 556 SwapBuffers(); |
551 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 557 EXPECT_EQ(1u, output_surface_->num_sent_frames()); |
552 } | 558 } |
553 | 559 |
554 TEST_F(GLRendererWithDefaultHarnessTest, ExternalStencil) { | 560 TEST_F(GLRendererWithDefaultHarnessTest, ExternalStencil) { |
555 gfx::Rect viewport_rect(1, 1); | 561 gfx::Rect viewport_rect(1, 1); |
556 EXPECT_FALSE(renderer_->stencil_enabled()); | 562 EXPECT_FALSE(renderer_->stencil_enabled()); |
557 | 563 |
558 output_surface_->set_has_external_stencil_test(true); | 564 output_surface_->set_has_external_stencil_test(true); |
559 | 565 |
560 RenderPass* root_pass = | 566 RenderPass* root_pass = |
561 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 567 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
562 viewport_rect, gfx::Transform()); | 568 viewport_rect, gfx::Transform()); |
563 root_pass->has_transparent_background = false; | 569 root_pass->has_transparent_background = false; |
564 | 570 |
565 renderer_->DrawFrame(&render_passes_in_draw_order_, | 571 DrawFrame(renderer_.get(), viewport_rect); |
566 1.f, | |
567 viewport_rect, | |
568 viewport_rect, | |
569 false); | |
570 EXPECT_TRUE(renderer_->stencil_enabled()); | 572 EXPECT_TRUE(renderer_->stencil_enabled()); |
571 } | 573 } |
572 | 574 |
573 class ForbidSynchronousCallContext : public TestWebGraphicsContext3D { | 575 class ForbidSynchronousCallContext : public TestWebGraphicsContext3D { |
574 public: | 576 public: |
575 ForbidSynchronousCallContext() {} | 577 ForbidSynchronousCallContext() {} |
576 | 578 |
577 void getAttachedShaders(GLuint program, | 579 void getAttachedShaders(GLuint program, |
578 GLsizei max_count, | 580 GLsizei max_count, |
579 GLsizei* count, | 581 GLsizei* count, |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 // On DEBUG builds, render passes with opaque background clear to blue to | 768 // On DEBUG builds, render passes with opaque background clear to blue to |
767 // easily see regions that were not drawn on the screen. | 769 // easily see regions that were not drawn on the screen. |
768 EXPECT_CALL(*context, discardFramebufferEXT(GL_FRAMEBUFFER, _, _)) | 770 EXPECT_CALL(*context, discardFramebufferEXT(GL_FRAMEBUFFER, _, _)) |
769 .With(Args<2, 1>(ElementsAre(GL_COLOR_EXT))) | 771 .With(Args<2, 1>(ElementsAre(GL_COLOR_EXT))) |
770 .Times(1); | 772 .Times(1); |
771 #ifdef NDEBUG | 773 #ifdef NDEBUG |
772 EXPECT_CALL(*context, clear(_)).Times(0); | 774 EXPECT_CALL(*context, clear(_)).Times(0); |
773 #else | 775 #else |
774 EXPECT_CALL(*context, clear(_)).Times(1); | 776 EXPECT_CALL(*context, clear(_)).Times(1); |
775 #endif | 777 #endif |
776 renderer.DrawFrame(&render_passes_in_draw_order_, | 778 DrawFrame(&renderer, viewport_rect); |
777 1.f, | |
778 viewport_rect, | |
779 viewport_rect, | |
780 false); | |
781 Mock::VerifyAndClearExpectations(context); | 779 Mock::VerifyAndClearExpectations(context); |
782 } | 780 } |
783 | 781 |
784 TEST_F(GLRendererTest, TransparentBackground) { | 782 TEST_F(GLRendererTest, TransparentBackground) { |
785 std::unique_ptr<ClearCountingContext> context_owned(new ClearCountingContext); | 783 std::unique_ptr<ClearCountingContext> context_owned(new ClearCountingContext); |
786 ClearCountingContext* context = context_owned.get(); | 784 ClearCountingContext* context = context_owned.get(); |
787 | 785 |
788 FakeOutputSurfaceClient output_surface_client; | 786 FakeOutputSurfaceClient output_surface_client; |
789 std::unique_ptr<OutputSurface> output_surface( | 787 std::unique_ptr<OutputSurface> output_surface( |
790 FakeOutputSurface::Create3d(std::move(context_owned))); | 788 FakeOutputSurface::Create3d(std::move(context_owned))); |
(...skipping 13 matching lines...) Expand all Loading... |
804 resource_provider.get()); | 802 resource_provider.get()); |
805 | 803 |
806 gfx::Rect viewport_rect(1, 1); | 804 gfx::Rect viewport_rect(1, 1); |
807 RenderPass* root_pass = | 805 RenderPass* root_pass = |
808 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 806 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
809 viewport_rect, gfx::Transform()); | 807 viewport_rect, gfx::Transform()); |
810 root_pass->has_transparent_background = true; | 808 root_pass->has_transparent_background = true; |
811 | 809 |
812 EXPECT_CALL(*context, discardFramebufferEXT(GL_FRAMEBUFFER, 1, _)).Times(1); | 810 EXPECT_CALL(*context, discardFramebufferEXT(GL_FRAMEBUFFER, 1, _)).Times(1); |
813 EXPECT_CALL(*context, clear(_)).Times(1); | 811 EXPECT_CALL(*context, clear(_)).Times(1); |
814 renderer.DrawFrame(&render_passes_in_draw_order_, | 812 DrawFrame(&renderer, viewport_rect); |
815 1.f, | |
816 viewport_rect, | |
817 viewport_rect, | |
818 false); | |
819 | 813 |
820 Mock::VerifyAndClearExpectations(context); | 814 Mock::VerifyAndClearExpectations(context); |
821 } | 815 } |
822 | 816 |
823 TEST_F(GLRendererTest, OffscreenOutputSurface) { | 817 TEST_F(GLRendererTest, OffscreenOutputSurface) { |
824 std::unique_ptr<ClearCountingContext> context_owned(new ClearCountingContext); | 818 std::unique_ptr<ClearCountingContext> context_owned(new ClearCountingContext); |
825 ClearCountingContext* context = context_owned.get(); | 819 ClearCountingContext* context = context_owned.get(); |
826 | 820 |
827 FakeOutputSurfaceClient output_surface_client; | 821 FakeOutputSurfaceClient output_surface_client; |
828 std::unique_ptr<OutputSurface> output_surface( | 822 std::unique_ptr<OutputSurface> output_surface( |
(...skipping 16 matching lines...) Expand all Loading... |
845 gfx::Rect viewport_rect(1, 1); | 839 gfx::Rect viewport_rect(1, 1); |
846 AddRenderPass(&render_passes_in_draw_order_, | 840 AddRenderPass(&render_passes_in_draw_order_, |
847 RenderPassId(1, 0), | 841 RenderPassId(1, 0), |
848 viewport_rect, | 842 viewport_rect, |
849 gfx::Transform()); | 843 gfx::Transform()); |
850 | 844 |
851 EXPECT_CALL(*context, discardFramebufferEXT(GL_FRAMEBUFFER, _, _)) | 845 EXPECT_CALL(*context, discardFramebufferEXT(GL_FRAMEBUFFER, _, _)) |
852 .With(Args<2, 1>(ElementsAre(GL_COLOR_ATTACHMENT0))) | 846 .With(Args<2, 1>(ElementsAre(GL_COLOR_ATTACHMENT0))) |
853 .Times(1); | 847 .Times(1); |
854 EXPECT_CALL(*context, clear(_)).Times(AnyNumber()); | 848 EXPECT_CALL(*context, clear(_)).Times(AnyNumber()); |
855 renderer.DrawFrame(&render_passes_in_draw_order_, | 849 DrawFrame(&renderer, viewport_rect); |
856 1.f, | |
857 viewport_rect, | |
858 viewport_rect, | |
859 false); | |
860 Mock::VerifyAndClearExpectations(context); | 850 Mock::VerifyAndClearExpectations(context); |
861 } | 851 } |
862 | 852 |
863 class TextureStateTrackingContext : public TestWebGraphicsContext3D { | 853 class TextureStateTrackingContext : public TestWebGraphicsContext3D { |
864 public: | 854 public: |
865 TextureStateTrackingContext() : active_texture_(GL_INVALID_ENUM) { | 855 TextureStateTrackingContext() : active_texture_(GL_INVALID_ENUM) { |
866 test_capabilities_.egl_image_external = true; | 856 test_capabilities_.egl_image_external = true; |
867 } | 857 } |
868 | 858 |
869 MOCK_METHOD1(waitSyncToken, void(const GLbyte* sync_token)); | 859 MOCK_METHOD1(waitSyncToken, void(const GLbyte* sync_token)); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
946 | 936 |
947 // scaled_tile_quad also uses GL_LINEAR. | 937 // scaled_tile_quad also uses GL_LINEAR. |
948 EXPECT_CALL(*context, drawElements(_, _, _, _)); | 938 EXPECT_CALL(*context, drawElements(_, _, _, _)); |
949 | 939 |
950 // The remaining quads also use GL_LINEAR because nearest neighbor | 940 // The remaining quads also use GL_LINEAR because nearest neighbor |
951 // filtering is currently only used with tile quads. | 941 // filtering is currently only used with tile quads. |
952 EXPECT_CALL(*context, drawElements(_, _, _, _)).Times(5); | 942 EXPECT_CALL(*context, drawElements(_, _, _, _)).Times(5); |
953 } | 943 } |
954 | 944 |
955 gfx::Rect viewport_rect(100, 100); | 945 gfx::Rect viewport_rect(100, 100); |
956 renderer.DrawFrame(&render_passes_in_draw_order_, | 946 DrawFrame(&renderer, viewport_rect); |
957 1.f, | |
958 viewport_rect, | |
959 viewport_rect, | |
960 false); | |
961 Mock::VerifyAndClearExpectations(context); | 947 Mock::VerifyAndClearExpectations(context); |
962 } | 948 } |
963 | 949 |
964 class NoClearRootRenderPassMockContext : public TestWebGraphicsContext3D { | 950 class NoClearRootRenderPassMockContext : public TestWebGraphicsContext3D { |
965 public: | 951 public: |
966 MOCK_METHOD1(clear, void(GLbitfield mask)); | 952 MOCK_METHOD1(clear, void(GLbitfield mask)); |
967 MOCK_METHOD4(drawElements, | 953 MOCK_METHOD4(drawElements, |
968 void(GLenum mode, GLsizei count, GLenum type, GLintptr offset)); | 954 void(GLenum mode, GLsizei count, GLenum type, GLintptr offset)); |
969 }; | 955 }; |
970 | 956 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1023 EXPECT_CALL(*mock_context, drawElements(_, _, _, _)).Times(1); | 1009 EXPECT_CALL(*mock_context, drawElements(_, _, _, _)).Times(1); |
1024 | 1010 |
1025 // The second render pass is the root one, clearing should be prevented. | 1011 // The second render pass is the root one, clearing should be prevented. |
1026 EXPECT_CALL(*mock_context, clear(clear_bits)).Times(0).After( | 1012 EXPECT_CALL(*mock_context, clear(clear_bits)).Times(0).After( |
1027 first_render_pass); | 1013 first_render_pass); |
1028 | 1014 |
1029 EXPECT_CALL(*mock_context, drawElements(_, _, _, _)).Times(AnyNumber()).After( | 1015 EXPECT_CALL(*mock_context, drawElements(_, _, _, _)).Times(AnyNumber()).After( |
1030 first_render_pass); | 1016 first_render_pass); |
1031 | 1017 |
1032 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1018 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1033 renderer.DrawFrame(&render_passes_in_draw_order_, | 1019 DrawFrame(&renderer, viewport_rect); |
1034 1.f, | |
1035 viewport_rect, | |
1036 viewport_rect, | |
1037 false); | |
1038 | 1020 |
1039 // In multiple render passes all but the root pass should clear the | 1021 // In multiple render passes all but the root pass should clear the |
1040 // framebuffer. | 1022 // framebuffer. |
1041 Mock::VerifyAndClearExpectations(&mock_context); | 1023 Mock::VerifyAndClearExpectations(&mock_context); |
1042 } | 1024 } |
1043 | 1025 |
1044 class ScissorTestOnClearCheckingContext : public TestWebGraphicsContext3D { | 1026 class ScissorTestOnClearCheckingContext : public TestWebGraphicsContext3D { |
1045 public: | 1027 public: |
1046 ScissorTestOnClearCheckingContext() : scissor_enabled_(false) {} | 1028 ScissorTestOnClearCheckingContext() : scissor_enabled_(false) {} |
1047 | 1029 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1103 RenderPassId root_pass_id(1, 0); | 1085 RenderPassId root_pass_id(1, 0); |
1104 RenderPass* root_pass = | 1086 RenderPass* root_pass = |
1105 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, viewport_rect, | 1087 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, viewport_rect, |
1106 gfx::Transform()); | 1088 gfx::Transform()); |
1107 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); | 1089 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
1108 | 1090 |
1109 AddRenderPassQuad(root_pass, child_pass); | 1091 AddRenderPassQuad(root_pass, child_pass); |
1110 AddRenderPassQuad(child_pass, grand_child_pass); | 1092 AddRenderPassQuad(child_pass, grand_child_pass); |
1111 | 1093 |
1112 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1094 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1113 renderer.DrawFrame(&render_passes_in_draw_order_, | 1095 DrawFrame(&renderer, viewport_rect); |
1114 1.f, | |
1115 viewport_rect, | |
1116 viewport_rect, | |
1117 false); | |
1118 } | 1096 } |
1119 | 1097 |
1120 class DiscardCheckingContext : public TestWebGraphicsContext3D { | 1098 class DiscardCheckingContext : public TestWebGraphicsContext3D { |
1121 public: | 1099 public: |
1122 DiscardCheckingContext() : discarded_(0) { | 1100 DiscardCheckingContext() : discarded_(0) { |
1123 set_have_post_sub_buffer(true); | 1101 set_have_post_sub_buffer(true); |
1124 set_have_discard_framebuffer(true); | 1102 set_have_discard_framebuffer(true); |
1125 } | 1103 } |
1126 | 1104 |
1127 void discardFramebufferEXT(GLenum target, | 1105 void discardFramebufferEXT(GLenum target, |
(...skipping 13 matching lines...) Expand all Loading... |
1141 public: | 1119 public: |
1142 explicit NonReshapableOutputSurface( | 1120 explicit NonReshapableOutputSurface( |
1143 std::unique_ptr<TestWebGraphicsContext3D> context3d) | 1121 std::unique_ptr<TestWebGraphicsContext3D> context3d) |
1144 : FakeOutputSurface(TestContextProvider::Create(std::move(context3d)), | 1122 : FakeOutputSurface(TestContextProvider::Create(std::move(context3d)), |
1145 nullptr, | 1123 nullptr, |
1146 false) { | 1124 false) { |
1147 surface_size_ = gfx::Size(500, 500); | 1125 surface_size_ = gfx::Size(500, 500); |
1148 } | 1126 } |
1149 void Reshape(const gfx::Size& size, | 1127 void Reshape(const gfx::Size& size, |
1150 float scale_factor, | 1128 float scale_factor, |
| 1129 const gfx::ColorSpace& color_space, |
1151 bool has_alpha) override {} | 1130 bool has_alpha) override {} |
1152 void set_fixed_size(const gfx::Size& size) { surface_size_ = size; } | 1131 void set_fixed_size(const gfx::Size& size) { surface_size_ = size; } |
1153 }; | 1132 }; |
1154 | 1133 |
1155 TEST_F(GLRendererTest, NoDiscardOnPartialUpdates) { | 1134 TEST_F(GLRendererTest, NoDiscardOnPartialUpdates) { |
1156 std::unique_ptr<DiscardCheckingContext> context_owned( | 1135 std::unique_ptr<DiscardCheckingContext> context_owned( |
1157 new DiscardCheckingContext); | 1136 new DiscardCheckingContext); |
1158 DiscardCheckingContext* context = context_owned.get(); | 1137 DiscardCheckingContext* context = context_owned.get(); |
1159 | 1138 |
1160 FakeOutputSurfaceClient output_surface_client; | 1139 FakeOutputSurfaceClient output_surface_client; |
(...skipping 23 matching lines...) Expand all Loading... |
1184 { | 1163 { |
1185 // Partial frame, should not discard. | 1164 // Partial frame, should not discard. |
1186 RenderPassId root_pass_id(1, 0); | 1165 RenderPassId root_pass_id(1, 0); |
1187 RenderPass* root_pass = | 1166 RenderPass* root_pass = |
1188 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, | 1167 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, |
1189 viewport_rect, gfx::Transform()); | 1168 viewport_rect, gfx::Transform()); |
1190 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); | 1169 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
1191 root_pass->damage_rect = gfx::Rect(2, 2, 3, 3); | 1170 root_pass->damage_rect = gfx::Rect(2, 2, 3, 3); |
1192 | 1171 |
1193 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1172 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1194 renderer.DrawFrame(&render_passes_in_draw_order_, | 1173 DrawFrame(&renderer, viewport_rect, clip_rect); |
1195 1.f, | |
1196 viewport_rect, | |
1197 clip_rect, | |
1198 false); | |
1199 EXPECT_EQ(0, context->discarded()); | 1174 EXPECT_EQ(0, context->discarded()); |
1200 context->reset(); | 1175 context->reset(); |
1201 } | 1176 } |
1202 { | 1177 { |
1203 // Full frame, should discard. | 1178 // Full frame, should discard. |
1204 RenderPassId root_pass_id(1, 0); | 1179 RenderPassId root_pass_id(1, 0); |
1205 RenderPass* root_pass = | 1180 RenderPass* root_pass = |
1206 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, | 1181 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, |
1207 viewport_rect, gfx::Transform()); | 1182 viewport_rect, gfx::Transform()); |
1208 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); | 1183 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
1209 root_pass->damage_rect = root_pass->output_rect; | 1184 root_pass->damage_rect = root_pass->output_rect; |
1210 | 1185 |
1211 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1186 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1212 renderer.DrawFrame(&render_passes_in_draw_order_, | 1187 DrawFrame(&renderer, viewport_rect, clip_rect); |
1213 1.f, | |
1214 viewport_rect, | |
1215 clip_rect, | |
1216 false); | |
1217 EXPECT_EQ(1, context->discarded()); | 1188 EXPECT_EQ(1, context->discarded()); |
1218 context->reset(); | 1189 context->reset(); |
1219 } | 1190 } |
1220 { | 1191 { |
1221 // Full frame, external scissor is set, should not discard. | 1192 // Full frame, external scissor is set, should not discard. |
1222 output_surface->set_has_external_stencil_test(true); | 1193 output_surface->set_has_external_stencil_test(true); |
1223 RenderPassId root_pass_id(1, 0); | 1194 RenderPassId root_pass_id(1, 0); |
1224 RenderPass* root_pass = | 1195 RenderPass* root_pass = |
1225 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, | 1196 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, |
1226 viewport_rect, gfx::Transform()); | 1197 viewport_rect, gfx::Transform()); |
1227 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); | 1198 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
1228 root_pass->damage_rect = root_pass->output_rect; | 1199 root_pass->damage_rect = root_pass->output_rect; |
1229 root_pass->has_transparent_background = false; | 1200 root_pass->has_transparent_background = false; |
1230 | 1201 |
1231 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1202 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1232 renderer.DrawFrame(&render_passes_in_draw_order_, | 1203 DrawFrame(&renderer, viewport_rect, clip_rect); |
1233 1.f, | |
1234 viewport_rect, | |
1235 clip_rect, | |
1236 false); | |
1237 EXPECT_EQ(0, context->discarded()); | 1204 EXPECT_EQ(0, context->discarded()); |
1238 context->reset(); | 1205 context->reset(); |
1239 output_surface->set_has_external_stencil_test(false); | 1206 output_surface->set_has_external_stencil_test(false); |
1240 } | 1207 } |
1241 { | 1208 { |
1242 // Full frame, clipped, should not discard. | 1209 // Full frame, clipped, should not discard. |
1243 clip_rect = gfx::Rect(10, 10, 10, 10); | 1210 clip_rect = gfx::Rect(10, 10, 10, 10); |
1244 RenderPassId root_pass_id(1, 0); | 1211 RenderPassId root_pass_id(1, 0); |
1245 RenderPass* root_pass = | 1212 RenderPass* root_pass = |
1246 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, | 1213 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, |
1247 viewport_rect, gfx::Transform()); | 1214 viewport_rect, gfx::Transform()); |
1248 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); | 1215 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
1249 root_pass->damage_rect = root_pass->output_rect; | 1216 root_pass->damage_rect = root_pass->output_rect; |
1250 | 1217 |
1251 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1218 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1252 renderer.DrawFrame(&render_passes_in_draw_order_, | 1219 DrawFrame(&renderer, viewport_rect, clip_rect); |
1253 1.f, | |
1254 viewport_rect, | |
1255 clip_rect, | |
1256 false); | |
1257 EXPECT_EQ(0, context->discarded()); | 1220 EXPECT_EQ(0, context->discarded()); |
1258 context->reset(); | 1221 context->reset(); |
1259 } | 1222 } |
1260 { | 1223 { |
1261 // Full frame, doesn't cover the surface, should not discard. | 1224 // Full frame, doesn't cover the surface, should not discard. |
1262 viewport_rect = gfx::Rect(10, 10, 10, 10); | 1225 viewport_rect = gfx::Rect(10, 10, 10, 10); |
1263 RenderPassId root_pass_id(1, 0); | 1226 RenderPassId root_pass_id(1, 0); |
1264 RenderPass* root_pass = | 1227 RenderPass* root_pass = |
1265 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, | 1228 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, |
1266 viewport_rect, gfx::Transform()); | 1229 viewport_rect, gfx::Transform()); |
1267 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); | 1230 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
1268 root_pass->damage_rect = root_pass->output_rect; | 1231 root_pass->damage_rect = root_pass->output_rect; |
1269 | 1232 |
1270 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1233 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1271 renderer.DrawFrame(&render_passes_in_draw_order_, | 1234 DrawFrame(&renderer, viewport_rect, clip_rect); |
1272 1.f, | |
1273 viewport_rect, | |
1274 clip_rect, | |
1275 false); | |
1276 EXPECT_EQ(0, context->discarded()); | 1235 EXPECT_EQ(0, context->discarded()); |
1277 context->reset(); | 1236 context->reset(); |
1278 } | 1237 } |
1279 { | 1238 { |
1280 // Full frame, doesn't cover the surface (no offset), should not discard. | 1239 // Full frame, doesn't cover the surface (no offset), should not discard. |
1281 clip_rect = gfx::Rect(100, 100); | 1240 clip_rect = gfx::Rect(100, 100); |
1282 viewport_rect = gfx::Rect(50, 50); | 1241 viewport_rect = gfx::Rect(50, 50); |
1283 RenderPassId root_pass_id(1, 0); | 1242 RenderPassId root_pass_id(1, 0); |
1284 RenderPass* root_pass = | 1243 RenderPass* root_pass = |
1285 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, | 1244 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, |
1286 viewport_rect, gfx::Transform()); | 1245 viewport_rect, gfx::Transform()); |
1287 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); | 1246 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
1288 root_pass->damage_rect = root_pass->output_rect; | 1247 root_pass->damage_rect = root_pass->output_rect; |
1289 | 1248 |
1290 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1249 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1291 renderer.DrawFrame(&render_passes_in_draw_order_, | 1250 DrawFrame(&renderer, viewport_rect, clip_rect); |
1292 1.f, | |
1293 viewport_rect, | |
1294 clip_rect, | |
1295 false); | |
1296 EXPECT_EQ(0, context->discarded()); | 1251 EXPECT_EQ(0, context->discarded()); |
1297 context->reset(); | 1252 context->reset(); |
1298 } | 1253 } |
1299 } | 1254 } |
1300 | 1255 |
1301 class FlippedScissorAndViewportContext : public TestWebGraphicsContext3D { | 1256 class FlippedScissorAndViewportContext : public TestWebGraphicsContext3D { |
1302 public: | 1257 public: |
1303 MOCK_METHOD4(viewport, void(GLint x, GLint y, GLsizei width, GLsizei height)); | 1258 MOCK_METHOD4(viewport, void(GLint x, GLint y, GLsizei width, GLsizei height)); |
1304 MOCK_METHOD4(scissor, void(GLint x, GLint y, GLsizei width, GLsizei height)); | 1259 MOCK_METHOD4(scissor, void(GLint x, GLint y, GLsizei width, GLsizei height)); |
1305 }; | 1260 }; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1341 gfx::Rect viewport_rect(device_viewport_rect.size()); | 1296 gfx::Rect viewport_rect(device_viewport_rect.size()); |
1342 gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20); | 1297 gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20); |
1343 | 1298 |
1344 RenderPassId root_pass_id(1, 0); | 1299 RenderPassId root_pass_id(1, 0); |
1345 RenderPass* root_pass = | 1300 RenderPass* root_pass = |
1346 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, viewport_rect, | 1301 AddRenderPass(&render_passes_in_draw_order_, root_pass_id, viewport_rect, |
1347 gfx::Transform()); | 1302 gfx::Transform()); |
1348 AddClippedQuad(root_pass, quad_rect, SK_ColorGREEN); | 1303 AddClippedQuad(root_pass, quad_rect, SK_ColorGREEN); |
1349 | 1304 |
1350 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1305 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1351 renderer.DrawFrame(&render_passes_in_draw_order_, | 1306 DrawFrame(&renderer, device_viewport_rect); |
1352 1.f, | |
1353 device_viewport_rect, | |
1354 device_viewport_rect, | |
1355 false); | |
1356 } | 1307 } |
1357 | 1308 |
1358 TEST_F(GLRendererTest, DrawFramePreservesFramebuffer) { | 1309 TEST_F(GLRendererTest, DrawFramePreservesFramebuffer) { |
1359 // When using render-to-FBO to display the surface, all rendering is done | 1310 // When using render-to-FBO to display the surface, all rendering is done |
1360 // to a non-zero FBO. Make sure that the framebuffer is always restored to | 1311 // to a non-zero FBO. Make sure that the framebuffer is always restored to |
1361 // the correct framebuffer during rendering, if changed. | 1312 // the correct framebuffer during rendering, if changed. |
1362 // Note: there is one path that will set it to 0, but that is after the render | 1313 // Note: there is one path that will set it to 0, but that is after the render |
1363 // has finished. | 1314 // has finished. |
1364 FakeOutputSurfaceClient output_surface_client; | 1315 FakeOutputSurfaceClient output_surface_client; |
1365 std::unique_ptr<FakeOutputSurface> output_surface( | 1316 std::unique_ptr<FakeOutputSurface> output_surface( |
(...skipping 22 matching lines...) Expand all Loading... |
1388 gfx::Transform()); | 1339 gfx::Transform()); |
1389 AddClippedQuad(root_pass, quad_rect, SK_ColorGREEN); | 1340 AddClippedQuad(root_pass, quad_rect, SK_ColorGREEN); |
1390 | 1341 |
1391 unsigned fbo; | 1342 unsigned fbo; |
1392 gpu::gles2::GLES2Interface* gl = | 1343 gpu::gles2::GLES2Interface* gl = |
1393 output_surface->context_provider()->ContextGL(); | 1344 output_surface->context_provider()->ContextGL(); |
1394 gl->GenFramebuffers(1, &fbo); | 1345 gl->GenFramebuffers(1, &fbo); |
1395 output_surface->set_framebuffer(fbo, GL_RGB); | 1346 output_surface->set_framebuffer(fbo, GL_RGB); |
1396 | 1347 |
1397 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1348 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1398 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, device_viewport_rect, | 1349 DrawFrame(&renderer, device_viewport_rect); |
1399 device_viewport_rect, false); | |
1400 | 1350 |
1401 int bound_fbo; | 1351 int bound_fbo; |
1402 gl->GetIntegerv(GL_FRAMEBUFFER_BINDING, &bound_fbo); | 1352 gl->GetIntegerv(GL_FRAMEBUFFER_BINDING, &bound_fbo); |
1403 EXPECT_EQ(static_cast<int>(fbo), bound_fbo); | 1353 EXPECT_EQ(static_cast<int>(fbo), bound_fbo); |
1404 } | 1354 } |
1405 | 1355 |
1406 TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) { | 1356 TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) { |
1407 gfx::Rect viewport_rect(1, 1); | 1357 gfx::Rect viewport_rect(1, 1); |
1408 | 1358 |
1409 gfx::Rect child_rect(50, 50); | 1359 gfx::Rect child_rect(50, 50); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1460 | 1410 |
1461 AddRenderPassQuad(root_pass, | 1411 AddRenderPassQuad(root_pass, |
1462 child_pass, | 1412 child_pass, |
1463 0, | 1413 0, |
1464 FilterOperations(), | 1414 FilterOperations(), |
1465 gfx::Transform(), | 1415 gfx::Transform(), |
1466 xfer_mode); | 1416 xfer_mode); |
1467 | 1417 |
1468 renderer_->DecideRenderPassAllocationsForFrame( | 1418 renderer_->DecideRenderPassAllocationsForFrame( |
1469 render_passes_in_draw_order_); | 1419 render_passes_in_draw_order_); |
1470 renderer_->DrawFrame(&render_passes_in_draw_order_, | 1420 DrawFrame(renderer_.get(), viewport_rect); |
1471 1.f, | |
1472 viewport_rect, | |
1473 viewport_rect, | |
1474 false); | |
1475 TestRenderPassProgram(TEX_COORD_PRECISION_MEDIUM, blend_mode); | 1421 TestRenderPassProgram(TEX_COORD_PRECISION_MEDIUM, blend_mode); |
1476 | 1422 |
1477 // RenderPassColorMatrixProgram | 1423 // RenderPassColorMatrixProgram |
1478 render_passes_in_draw_order_.clear(); | 1424 render_passes_in_draw_order_.clear(); |
1479 | 1425 |
1480 child_pass = AddRenderPass(&render_passes_in_draw_order_, | 1426 child_pass = AddRenderPass(&render_passes_in_draw_order_, |
1481 child_pass_id, | 1427 child_pass_id, |
1482 child_rect, | 1428 child_rect, |
1483 transform_causing_aa); | 1429 transform_causing_aa); |
1484 | 1430 |
1485 root_pass = AddRenderPass(&render_passes_in_draw_order_, | 1431 root_pass = AddRenderPass(&render_passes_in_draw_order_, |
1486 root_pass_id, | 1432 root_pass_id, |
1487 viewport_rect, | 1433 viewport_rect, |
1488 gfx::Transform()); | 1434 gfx::Transform()); |
1489 | 1435 |
1490 AddRenderPassQuad( | 1436 AddRenderPassQuad( |
1491 root_pass, child_pass, 0, filters, gfx::Transform(), xfer_mode); | 1437 root_pass, child_pass, 0, filters, gfx::Transform(), xfer_mode); |
1492 | 1438 |
1493 renderer_->DecideRenderPassAllocationsForFrame( | 1439 renderer_->DecideRenderPassAllocationsForFrame( |
1494 render_passes_in_draw_order_); | 1440 render_passes_in_draw_order_); |
1495 renderer_->DrawFrame(&render_passes_in_draw_order_, | 1441 DrawFrame(renderer_.get(), viewport_rect); |
1496 1.f, | |
1497 viewport_rect, | |
1498 viewport_rect, | |
1499 false); | |
1500 TestRenderPassColorMatrixProgram(TEX_COORD_PRECISION_MEDIUM, blend_mode); | 1442 TestRenderPassColorMatrixProgram(TEX_COORD_PRECISION_MEDIUM, blend_mode); |
1501 | 1443 |
1502 // RenderPassMaskProgram | 1444 // RenderPassMaskProgram |
1503 render_passes_in_draw_order_.clear(); | 1445 render_passes_in_draw_order_.clear(); |
1504 | 1446 |
1505 child_pass = AddRenderPass(&render_passes_in_draw_order_, | 1447 child_pass = AddRenderPass(&render_passes_in_draw_order_, |
1506 child_pass_id, | 1448 child_pass_id, |
1507 child_rect, | 1449 child_rect, |
1508 gfx::Transform()); | 1450 gfx::Transform()); |
1509 | 1451 |
1510 root_pass = AddRenderPass(&render_passes_in_draw_order_, | 1452 root_pass = AddRenderPass(&render_passes_in_draw_order_, |
1511 root_pass_id, | 1453 root_pass_id, |
1512 viewport_rect, | 1454 viewport_rect, |
1513 gfx::Transform()); | 1455 gfx::Transform()); |
1514 | 1456 |
1515 AddRenderPassQuad(root_pass, | 1457 AddRenderPassQuad(root_pass, |
1516 child_pass, | 1458 child_pass, |
1517 mask, | 1459 mask, |
1518 FilterOperations(), | 1460 FilterOperations(), |
1519 gfx::Transform(), | 1461 gfx::Transform(), |
1520 xfer_mode); | 1462 xfer_mode); |
1521 | 1463 |
1522 renderer_->DecideRenderPassAllocationsForFrame( | 1464 renderer_->DecideRenderPassAllocationsForFrame( |
1523 render_passes_in_draw_order_); | 1465 render_passes_in_draw_order_); |
1524 renderer_->DrawFrame(&render_passes_in_draw_order_, | 1466 DrawFrame(renderer_.get(), viewport_rect); |
1525 1.f, | |
1526 viewport_rect, | |
1527 viewport_rect, | |
1528 false); | |
1529 TestRenderPassMaskProgram(TEX_COORD_PRECISION_MEDIUM, SAMPLER_TYPE_2D, | 1467 TestRenderPassMaskProgram(TEX_COORD_PRECISION_MEDIUM, SAMPLER_TYPE_2D, |
1530 blend_mode); | 1468 blend_mode); |
1531 | 1469 |
1532 // RenderPassMaskColorMatrixProgram | 1470 // RenderPassMaskColorMatrixProgram |
1533 render_passes_in_draw_order_.clear(); | 1471 render_passes_in_draw_order_.clear(); |
1534 | 1472 |
1535 child_pass = AddRenderPass(&render_passes_in_draw_order_, | 1473 child_pass = AddRenderPass(&render_passes_in_draw_order_, |
1536 child_pass_id, | 1474 child_pass_id, |
1537 child_rect, | 1475 child_rect, |
1538 gfx::Transform()); | 1476 gfx::Transform()); |
1539 | 1477 |
1540 root_pass = AddRenderPass(&render_passes_in_draw_order_, | 1478 root_pass = AddRenderPass(&render_passes_in_draw_order_, |
1541 root_pass_id, | 1479 root_pass_id, |
1542 viewport_rect, | 1480 viewport_rect, |
1543 gfx::Transform()); | 1481 gfx::Transform()); |
1544 | 1482 |
1545 AddRenderPassQuad( | 1483 AddRenderPassQuad( |
1546 root_pass, child_pass, mask, filters, gfx::Transform(), xfer_mode); | 1484 root_pass, child_pass, mask, filters, gfx::Transform(), xfer_mode); |
1547 | 1485 |
1548 renderer_->DecideRenderPassAllocationsForFrame( | 1486 renderer_->DecideRenderPassAllocationsForFrame( |
1549 render_passes_in_draw_order_); | 1487 render_passes_in_draw_order_); |
1550 renderer_->DrawFrame(&render_passes_in_draw_order_, | 1488 DrawFrame(renderer_.get(), viewport_rect); |
1551 1.f, | |
1552 viewport_rect, | |
1553 viewport_rect, | |
1554 false); | |
1555 TestRenderPassMaskColorMatrixProgram(TEX_COORD_PRECISION_MEDIUM, | 1489 TestRenderPassMaskColorMatrixProgram(TEX_COORD_PRECISION_MEDIUM, |
1556 SAMPLER_TYPE_2D, blend_mode); | 1490 SAMPLER_TYPE_2D, blend_mode); |
1557 | 1491 |
1558 // RenderPassProgramAA | 1492 // RenderPassProgramAA |
1559 render_passes_in_draw_order_.clear(); | 1493 render_passes_in_draw_order_.clear(); |
1560 | 1494 |
1561 child_pass = AddRenderPass(&render_passes_in_draw_order_, | 1495 child_pass = AddRenderPass(&render_passes_in_draw_order_, |
1562 child_pass_id, | 1496 child_pass_id, |
1563 child_rect, | 1497 child_rect, |
1564 transform_causing_aa); | 1498 transform_causing_aa); |
1565 | 1499 |
1566 root_pass = AddRenderPass(&render_passes_in_draw_order_, | 1500 root_pass = AddRenderPass(&render_passes_in_draw_order_, |
1567 root_pass_id, | 1501 root_pass_id, |
1568 viewport_rect, | 1502 viewport_rect, |
1569 gfx::Transform()); | 1503 gfx::Transform()); |
1570 | 1504 |
1571 AddRenderPassQuad(root_pass, | 1505 AddRenderPassQuad(root_pass, |
1572 child_pass, | 1506 child_pass, |
1573 0, | 1507 0, |
1574 FilterOperations(), | 1508 FilterOperations(), |
1575 transform_causing_aa, | 1509 transform_causing_aa, |
1576 xfer_mode); | 1510 xfer_mode); |
1577 | 1511 |
1578 renderer_->DecideRenderPassAllocationsForFrame( | 1512 renderer_->DecideRenderPassAllocationsForFrame( |
1579 render_passes_in_draw_order_); | 1513 render_passes_in_draw_order_); |
1580 renderer_->DrawFrame(&render_passes_in_draw_order_, | 1514 DrawFrame(renderer_.get(), viewport_rect); |
1581 1.f, | |
1582 viewport_rect, | |
1583 viewport_rect, | |
1584 false); | |
1585 TestRenderPassProgramAA(TEX_COORD_PRECISION_MEDIUM, blend_mode); | 1515 TestRenderPassProgramAA(TEX_COORD_PRECISION_MEDIUM, blend_mode); |
1586 | 1516 |
1587 // RenderPassColorMatrixProgramAA | 1517 // RenderPassColorMatrixProgramAA |
1588 render_passes_in_draw_order_.clear(); | 1518 render_passes_in_draw_order_.clear(); |
1589 | 1519 |
1590 child_pass = AddRenderPass(&render_passes_in_draw_order_, | 1520 child_pass = AddRenderPass(&render_passes_in_draw_order_, |
1591 child_pass_id, | 1521 child_pass_id, |
1592 child_rect, | 1522 child_rect, |
1593 transform_causing_aa); | 1523 transform_causing_aa); |
1594 | 1524 |
1595 root_pass = AddRenderPass(&render_passes_in_draw_order_, | 1525 root_pass = AddRenderPass(&render_passes_in_draw_order_, |
1596 root_pass_id, | 1526 root_pass_id, |
1597 viewport_rect, | 1527 viewport_rect, |
1598 gfx::Transform()); | 1528 gfx::Transform()); |
1599 | 1529 |
1600 AddRenderPassQuad( | 1530 AddRenderPassQuad( |
1601 root_pass, child_pass, 0, filters, transform_causing_aa, xfer_mode); | 1531 root_pass, child_pass, 0, filters, transform_causing_aa, xfer_mode); |
1602 | 1532 |
1603 renderer_->DecideRenderPassAllocationsForFrame( | 1533 renderer_->DecideRenderPassAllocationsForFrame( |
1604 render_passes_in_draw_order_); | 1534 render_passes_in_draw_order_); |
1605 renderer_->DrawFrame(&render_passes_in_draw_order_, | 1535 DrawFrame(renderer_.get(), viewport_rect); |
1606 1.f, | |
1607 viewport_rect, | |
1608 viewport_rect, | |
1609 false); | |
1610 TestRenderPassColorMatrixProgramAA(TEX_COORD_PRECISION_MEDIUM, blend_mode); | 1536 TestRenderPassColorMatrixProgramAA(TEX_COORD_PRECISION_MEDIUM, blend_mode); |
1611 | 1537 |
1612 // RenderPassMaskProgramAA | 1538 // RenderPassMaskProgramAA |
1613 render_passes_in_draw_order_.clear(); | 1539 render_passes_in_draw_order_.clear(); |
1614 | 1540 |
1615 child_pass = AddRenderPass(&render_passes_in_draw_order_, | 1541 child_pass = AddRenderPass(&render_passes_in_draw_order_, |
1616 child_pass_id, | 1542 child_pass_id, |
1617 child_rect, | 1543 child_rect, |
1618 transform_causing_aa); | 1544 transform_causing_aa); |
1619 | 1545 |
1620 root_pass = AddRenderPass(&render_passes_in_draw_order_, | 1546 root_pass = AddRenderPass(&render_passes_in_draw_order_, |
1621 root_pass_id, | 1547 root_pass_id, |
1622 viewport_rect, | 1548 viewport_rect, |
1623 gfx::Transform()); | 1549 gfx::Transform()); |
1624 | 1550 |
1625 AddRenderPassQuad(root_pass, | 1551 AddRenderPassQuad(root_pass, |
1626 child_pass, | 1552 child_pass, |
1627 mask, | 1553 mask, |
1628 FilterOperations(), | 1554 FilterOperations(), |
1629 transform_causing_aa, | 1555 transform_causing_aa, |
1630 xfer_mode); | 1556 xfer_mode); |
1631 | 1557 |
1632 renderer_->DecideRenderPassAllocationsForFrame( | 1558 renderer_->DecideRenderPassAllocationsForFrame( |
1633 render_passes_in_draw_order_); | 1559 render_passes_in_draw_order_); |
1634 renderer_->DrawFrame(&render_passes_in_draw_order_, | 1560 DrawFrame(renderer_.get(), viewport_rect); |
1635 1.f, | |
1636 viewport_rect, | |
1637 viewport_rect, | |
1638 false); | |
1639 TestRenderPassMaskProgramAA(TEX_COORD_PRECISION_MEDIUM, SAMPLER_TYPE_2D, | 1561 TestRenderPassMaskProgramAA(TEX_COORD_PRECISION_MEDIUM, SAMPLER_TYPE_2D, |
1640 blend_mode); | 1562 blend_mode); |
1641 | 1563 |
1642 // RenderPassMaskColorMatrixProgramAA | 1564 // RenderPassMaskColorMatrixProgramAA |
1643 render_passes_in_draw_order_.clear(); | 1565 render_passes_in_draw_order_.clear(); |
1644 | 1566 |
1645 child_pass = AddRenderPass(&render_passes_in_draw_order_, | 1567 child_pass = AddRenderPass(&render_passes_in_draw_order_, |
1646 child_pass_id, | 1568 child_pass_id, |
1647 child_rect, | 1569 child_rect, |
1648 transform_causing_aa); | 1570 transform_causing_aa); |
1649 | 1571 |
1650 root_pass = AddRenderPass(&render_passes_in_draw_order_, | 1572 root_pass = AddRenderPass(&render_passes_in_draw_order_, |
1651 root_pass_id, | 1573 root_pass_id, |
1652 viewport_rect, | 1574 viewport_rect, |
1653 transform_causing_aa); | 1575 transform_causing_aa); |
1654 | 1576 |
1655 AddRenderPassQuad( | 1577 AddRenderPassQuad( |
1656 root_pass, child_pass, mask, filters, transform_causing_aa, xfer_mode); | 1578 root_pass, child_pass, mask, filters, transform_causing_aa, xfer_mode); |
1657 | 1579 |
1658 renderer_->DecideRenderPassAllocationsForFrame( | 1580 renderer_->DecideRenderPassAllocationsForFrame( |
1659 render_passes_in_draw_order_); | 1581 render_passes_in_draw_order_); |
1660 renderer_->DrawFrame(&render_passes_in_draw_order_, | 1582 DrawFrame(renderer_.get(), viewport_rect); |
1661 1.f, | |
1662 viewport_rect, | |
1663 viewport_rect, | |
1664 false); | |
1665 TestRenderPassMaskColorMatrixProgramAA(TEX_COORD_PRECISION_MEDIUM, | 1583 TestRenderPassMaskColorMatrixProgramAA(TEX_COORD_PRECISION_MEDIUM, |
1666 SAMPLER_TYPE_2D, blend_mode); | 1584 SAMPLER_TYPE_2D, blend_mode); |
1667 } | 1585 } |
1668 } | 1586 } |
1669 | 1587 |
1670 // At this time, the AA code path cannot be taken if the surface's rect would | 1588 // At this time, the AA code path cannot be taken if the surface's rect would |
1671 // project incorrectly by the given transform, because of w<0 clipping. | 1589 // project incorrectly by the given transform, because of w<0 clipping. |
1672 TEST_F(GLRendererShaderTest, DrawRenderPassQuadSkipsAAForClippingTransform) { | 1590 TEST_F(GLRendererShaderTest, DrawRenderPassQuadSkipsAAForClippingTransform) { |
1673 gfx::Rect child_rect(50, 50); | 1591 gfx::Rect child_rect(50, 50); |
1674 RenderPassId child_pass_id(2, 0); | 1592 RenderPassId child_pass_id(2, 0); |
(...skipping 26 matching lines...) Expand all Loading... |
1701 gfx::Transform()); | 1619 gfx::Transform()); |
1702 | 1620 |
1703 AddRenderPassQuad(root_pass, | 1621 AddRenderPassQuad(root_pass, |
1704 child_pass, | 1622 child_pass, |
1705 0, | 1623 0, |
1706 FilterOperations(), | 1624 FilterOperations(), |
1707 transform_preventing_aa, | 1625 transform_preventing_aa, |
1708 SkXfermode::kSrcOver_Mode); | 1626 SkXfermode::kSrcOver_Mode); |
1709 | 1627 |
1710 renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1628 renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1711 renderer_->DrawFrame(&render_passes_in_draw_order_, | 1629 DrawFrame(renderer_.get(), viewport_rect); |
1712 1.f, | |
1713 viewport_rect, | |
1714 viewport_rect, | |
1715 false); | |
1716 | 1630 |
1717 // If use_aa incorrectly ignores clipping, it will use the | 1631 // If use_aa incorrectly ignores clipping, it will use the |
1718 // RenderPassProgramAA shader instead of the RenderPassProgram. | 1632 // RenderPassProgramAA shader instead of the RenderPassProgram. |
1719 TestRenderPassProgram(TEX_COORD_PRECISION_MEDIUM, BLEND_MODE_NONE); | 1633 TestRenderPassProgram(TEX_COORD_PRECISION_MEDIUM, BLEND_MODE_NONE); |
1720 } | 1634 } |
1721 | 1635 |
1722 TEST_F(GLRendererShaderTest, DrawSolidColorShader) { | 1636 TEST_F(GLRendererShaderTest, DrawSolidColorShader) { |
1723 gfx::Rect viewport_rect(1, 1); | 1637 gfx::Rect viewport_rect(1, 1); |
1724 RenderPassId root_pass_id(1, 0); | 1638 RenderPassId root_pass_id(1, 0); |
1725 RenderPass* root_pass; | 1639 RenderPass* root_pass; |
1726 | 1640 |
1727 gfx::Transform pixel_aligned_transform_causing_aa; | 1641 gfx::Transform pixel_aligned_transform_causing_aa; |
1728 pixel_aligned_transform_causing_aa.Translate(25.5f, 25.5f); | 1642 pixel_aligned_transform_causing_aa.Translate(25.5f, 25.5f); |
1729 pixel_aligned_transform_causing_aa.Scale(0.5f, 0.5f); | 1643 pixel_aligned_transform_causing_aa.Scale(0.5f, 0.5f); |
1730 | 1644 |
1731 root_pass = AddRenderPass(&render_passes_in_draw_order_, | 1645 root_pass = AddRenderPass(&render_passes_in_draw_order_, |
1732 root_pass_id, | 1646 root_pass_id, |
1733 viewport_rect, | 1647 viewport_rect, |
1734 gfx::Transform()); | 1648 gfx::Transform()); |
1735 AddTransformedQuad(root_pass, | 1649 AddTransformedQuad(root_pass, |
1736 viewport_rect, | 1650 viewport_rect, |
1737 SK_ColorYELLOW, | 1651 SK_ColorYELLOW, |
1738 pixel_aligned_transform_causing_aa); | 1652 pixel_aligned_transform_causing_aa); |
1739 | 1653 |
1740 renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 1654 renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
1741 renderer_->DrawFrame(&render_passes_in_draw_order_, | 1655 DrawFrame(renderer_.get(), viewport_rect); |
1742 1.f, | |
1743 viewport_rect, | |
1744 viewport_rect, | |
1745 false); | |
1746 | 1656 |
1747 TestSolidColorProgramAA(); | 1657 TestSolidColorProgramAA(); |
1748 } | 1658 } |
1749 | 1659 |
1750 class OutputSurfaceMockContext : public TestWebGraphicsContext3D { | 1660 class OutputSurfaceMockContext : public TestWebGraphicsContext3D { |
1751 public: | 1661 public: |
1752 OutputSurfaceMockContext() { test_capabilities_.post_sub_buffer = true; } | 1662 OutputSurfaceMockContext() { test_capabilities_.post_sub_buffer = true; } |
1753 | 1663 |
1754 // Specifically override methods even if they are unused (used in conjunction | 1664 // Specifically override methods even if they are unused (used in conjunction |
1755 // with StrictMock). We need to make sure that GLRenderer does not issue | 1665 // with StrictMock). We need to make sure that GLRenderer does not issue |
(...skipping 13 matching lines...) Expand all Loading... |
1769 TestContextProvider::Create( | 1679 TestContextProvider::Create( |
1770 base::MakeUnique<StrictMock<OutputSurfaceMockContext>>()), | 1680 base::MakeUnique<StrictMock<OutputSurfaceMockContext>>()), |
1771 nullptr, | 1681 nullptr, |
1772 nullptr) { | 1682 nullptr) { |
1773 surface_size_ = gfx::Size(100, 100); | 1683 surface_size_ = gfx::Size(100, 100); |
1774 } | 1684 } |
1775 virtual ~MockOutputSurface() {} | 1685 virtual ~MockOutputSurface() {} |
1776 | 1686 |
1777 MOCK_METHOD0(EnsureBackbuffer, void()); | 1687 MOCK_METHOD0(EnsureBackbuffer, void()); |
1778 MOCK_METHOD0(DiscardBackbuffer, void()); | 1688 MOCK_METHOD0(DiscardBackbuffer, void()); |
1779 MOCK_METHOD3(Reshape, | 1689 MOCK_METHOD4(Reshape, |
1780 void(const gfx::Size& size, float scale_factor, bool has_alpha)); | 1690 void(const gfx::Size& size, |
| 1691 float scale_factor, |
| 1692 const gfx::ColorSpace& color_space, |
| 1693 bool has_alpha)); |
1781 MOCK_METHOD0(BindFramebuffer, void()); | 1694 MOCK_METHOD0(BindFramebuffer, void()); |
1782 MOCK_METHOD0(GetFramebufferCopyTextureFormat, GLenum()); | 1695 MOCK_METHOD0(GetFramebufferCopyTextureFormat, GLenum()); |
1783 MOCK_METHOD1(SwapBuffers_, void(CompositorFrame& frame)); | 1696 MOCK_METHOD1(SwapBuffers_, void(CompositorFrame& frame)); |
1784 void SwapBuffers(CompositorFrame frame) override { SwapBuffers_(frame); } | 1697 void SwapBuffers(CompositorFrame frame) override { SwapBuffers_(frame); } |
1785 }; | 1698 }; |
1786 | 1699 |
1787 class MockOutputSurfaceTest : public GLRendererTest { | 1700 class MockOutputSurfaceTest : public GLRendererTest { |
1788 protected: | 1701 protected: |
1789 virtual void SetUp() { | 1702 virtual void SetUp() { |
1790 FakeOutputSurfaceClient output_surface_client_; | 1703 FakeOutputSurfaceClient output_surface_client_; |
(...skipping 17 matching lines...) Expand all Loading... |
1808 RenderPassId render_pass_id(1, 0); | 1721 RenderPassId render_pass_id(1, 0); |
1809 RenderPass* render_pass = | 1722 RenderPass* render_pass = |
1810 AddRenderPass(&render_passes_in_draw_order_, render_pass_id, | 1723 AddRenderPass(&render_passes_in_draw_order_, render_pass_id, |
1811 device_viewport_rect, gfx::Transform()); | 1724 device_viewport_rect, gfx::Transform()); |
1812 AddQuad(render_pass, device_viewport_rect, SK_ColorGREEN); | 1725 AddQuad(render_pass, device_viewport_rect, SK_ColorGREEN); |
1813 render_pass->has_transparent_background = transparent; | 1726 render_pass->has_transparent_background = transparent; |
1814 | 1727 |
1815 EXPECT_CALL(output_surface_, EnsureBackbuffer()).WillRepeatedly(Return()); | 1728 EXPECT_CALL(output_surface_, EnsureBackbuffer()).WillRepeatedly(Return()); |
1816 | 1729 |
1817 EXPECT_CALL(output_surface_, Reshape(device_viewport_rect.size(), | 1730 EXPECT_CALL(output_surface_, Reshape(device_viewport_rect.size(), |
1818 device_scale_factor, transparent)) | 1731 device_scale_factor, _, transparent)) |
1819 .Times(1); | 1732 .Times(1); |
1820 | 1733 |
1821 EXPECT_CALL(output_surface_, BindFramebuffer()).Times(1); | 1734 EXPECT_CALL(output_surface_, BindFramebuffer()).Times(1); |
1822 | 1735 |
1823 EXPECT_CALL(*Context(), drawElements(_, _, _, _)).Times(1); | 1736 EXPECT_CALL(*Context(), drawElements(_, _, _, _)).Times(1); |
1824 | 1737 |
1825 renderer_->DecideRenderPassAllocationsForFrame( | 1738 renderer_->DecideRenderPassAllocationsForFrame( |
1826 render_passes_in_draw_order_); | 1739 render_passes_in_draw_order_); |
1827 renderer_->DrawFrame(&render_passes_in_draw_order_, | 1740 renderer_->DrawFrame(&render_passes_in_draw_order_, device_scale_factor, |
1828 device_scale_factor, | 1741 gfx::ColorSpace(), device_viewport_rect, |
1829 device_viewport_rect, | 1742 device_viewport_rect, false); |
1830 device_viewport_rect, | |
1831 false); | |
1832 } | 1743 } |
1833 | 1744 |
1834 OutputSurfaceMockContext* Context() { | 1745 OutputSurfaceMockContext* Context() { |
1835 return static_cast<OutputSurfaceMockContext*>( | 1746 return static_cast<OutputSurfaceMockContext*>( |
1836 static_cast<TestContextProvider*>(output_surface_.context_provider()) | 1747 static_cast<TestContextProvider*>(output_surface_.context_provider()) |
1837 ->TestContext3d()); | 1748 ->TestContext3d()); |
1838 } | 1749 } |
1839 | 1750 |
1840 RendererSettings settings_; | 1751 RendererSettings settings_; |
1841 FakeOutputSurfaceClient output_surface_client_; | 1752 FakeOutputSurfaceClient output_surface_client_; |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1988 gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity, | 1899 gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity, |
1989 flipped, nearest_neighbor, false); | 1900 flipped, nearest_neighbor, false); |
1990 | 1901 |
1991 // DirectRenderer::DrawFrame calls into OverlayProcessor::ProcessForOverlays. | 1902 // DirectRenderer::DrawFrame calls into OverlayProcessor::ProcessForOverlays. |
1992 // Attempt will be called for each strategy in OverlayProcessor. We have | 1903 // Attempt will be called for each strategy in OverlayProcessor. We have |
1993 // added a fake strategy, so checking for Attempt calls checks if there was | 1904 // added a fake strategy, so checking for Attempt calls checks if there was |
1994 // any attempt to overlay, which there shouldn't be. We can't use the quad | 1905 // any attempt to overlay, which there shouldn't be. We can't use the quad |
1995 // list because the render pass is cleaned up by DrawFrame. | 1906 // list because the render pass is cleaned up by DrawFrame. |
1996 EXPECT_CALL(*processor->strategy_, Attempt(_, _, _)).Times(0); | 1907 EXPECT_CALL(*processor->strategy_, Attempt(_, _, _)).Times(0); |
1997 EXPECT_CALL(*validator, AllowCALayerOverlays()).Times(0); | 1908 EXPECT_CALL(*validator, AllowCALayerOverlays()).Times(0); |
1998 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, | 1909 DrawFrame(&renderer, viewport_rect); |
1999 viewport_rect, false); | |
2000 Mock::VerifyAndClearExpectations(processor->strategy_); | 1910 Mock::VerifyAndClearExpectations(processor->strategy_); |
2001 Mock::VerifyAndClearExpectations(validator.get()); | 1911 Mock::VerifyAndClearExpectations(validator.get()); |
2002 | 1912 |
2003 // Without a copy request Attempt() should be called once. | 1913 // Without a copy request Attempt() should be called once. |
2004 root_pass = AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 1914 root_pass = AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
2005 viewport_rect, gfx::Transform()); | 1915 viewport_rect, gfx::Transform()); |
2006 root_pass->has_transparent_background = false; | 1916 root_pass->has_transparent_background = false; |
2007 | 1917 |
2008 overlay_quad = root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 1918 overlay_quad = root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
2009 overlay_quad->SetNew(root_pass->CreateAndAppendSharedQuadState(), | 1919 overlay_quad->SetNew(root_pass->CreateAndAppendSharedQuadState(), |
2010 viewport_rect, viewport_rect, viewport_rect, resource_id, | 1920 viewport_rect, viewport_rect, viewport_rect, resource_id, |
2011 premultiplied_alpha, gfx::PointF(0, 0), | 1921 premultiplied_alpha, gfx::PointF(0, 0), |
2012 gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity, | 1922 gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity, |
2013 flipped, nearest_neighbor, false); | 1923 flipped, nearest_neighbor, false); |
2014 EXPECT_CALL(*validator, AllowCALayerOverlays()) | 1924 EXPECT_CALL(*validator, AllowCALayerOverlays()) |
2015 .Times(1) | 1925 .Times(1) |
2016 .WillOnce(::testing::Return(false)); | 1926 .WillOnce(::testing::Return(false)); |
2017 EXPECT_CALL(*processor->strategy_, Attempt(_, _, _)).Times(1); | 1927 EXPECT_CALL(*processor->strategy_, Attempt(_, _, _)).Times(1); |
2018 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, | 1928 DrawFrame(&renderer, viewport_rect); |
2019 viewport_rect, false); | |
2020 | 1929 |
2021 // If the CALayerOverlay path is taken, then the ordinary overlay path should | 1930 // If the CALayerOverlay path is taken, then the ordinary overlay path should |
2022 // not be called. | 1931 // not be called. |
2023 root_pass = AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 1932 root_pass = AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
2024 viewport_rect, gfx::Transform()); | 1933 viewport_rect, gfx::Transform()); |
2025 root_pass->has_transparent_background = false; | 1934 root_pass->has_transparent_background = false; |
2026 | 1935 |
2027 overlay_quad = root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 1936 overlay_quad = root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
2028 overlay_quad->SetNew(root_pass->CreateAndAppendSharedQuadState(), | 1937 overlay_quad->SetNew(root_pass->CreateAndAppendSharedQuadState(), |
2029 viewport_rect, viewport_rect, viewport_rect, resource_id, | 1938 viewport_rect, viewport_rect, viewport_rect, resource_id, |
2030 premultiplied_alpha, gfx::PointF(0, 0), | 1939 premultiplied_alpha, gfx::PointF(0, 0), |
2031 gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity, | 1940 gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity, |
2032 flipped, nearest_neighbor, false); | 1941 flipped, nearest_neighbor, false); |
2033 EXPECT_CALL(*validator, AllowCALayerOverlays()) | 1942 EXPECT_CALL(*validator, AllowCALayerOverlays()) |
2034 .Times(1) | 1943 .Times(1) |
2035 .WillOnce(::testing::Return(true)); | 1944 .WillOnce(::testing::Return(true)); |
2036 EXPECT_CALL(*processor->strategy_, Attempt(_, _, _)).Times(0); | 1945 EXPECT_CALL(*processor->strategy_, Attempt(_, _, _)).Times(0); |
2037 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, | 1946 DrawFrame(&renderer, viewport_rect); |
2038 viewport_rect, false); | |
2039 } | 1947 } |
2040 | 1948 |
2041 class SingleOverlayOnTopProcessor : public OverlayProcessor { | 1949 class SingleOverlayOnTopProcessor : public OverlayProcessor { |
2042 public: | 1950 public: |
2043 class SingleOverlayValidator : public OverlayCandidateValidator { | 1951 class SingleOverlayValidator : public OverlayCandidateValidator { |
2044 public: | 1952 public: |
2045 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { | 1953 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { |
2046 strategies->push_back( | 1954 strategies->push_back( |
2047 base::WrapUnique(new OverlayStrategySingleOnTop(this))); | 1955 base::WrapUnique(new OverlayStrategySingleOnTop(this))); |
2048 strategies->push_back( | 1956 strategies->push_back( |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2150 uv_top_left, uv_bottom_right, SK_ColorTRANSPARENT, | 2058 uv_top_left, uv_bottom_right, SK_ColorTRANSPARENT, |
2151 vertex_opacity, flipped, nearest_neighbor, false); | 2059 vertex_opacity, flipped, nearest_neighbor, false); |
2152 | 2060 |
2153 // Verify that overlay_quad actually gets turned into an overlay, and even | 2061 // Verify that overlay_quad actually gets turned into an overlay, and even |
2154 // though it's not drawn, that its sync point is waited on. | 2062 // though it's not drawn, that its sync point is waited on. |
2155 EXPECT_CALL(*context, waitSyncToken(MatchesSyncToken(sync_token))).Times(1); | 2063 EXPECT_CALL(*context, waitSyncToken(MatchesSyncToken(sync_token))).Times(1); |
2156 EXPECT_CALL(overlay_scheduler, | 2064 EXPECT_CALL(overlay_scheduler, |
2157 Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, viewport_rect, | 2065 Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, viewport_rect, |
2158 BoundingRect(uv_top_left, uv_bottom_right))).Times(1); | 2066 BoundingRect(uv_top_left, uv_bottom_right))).Times(1); |
2159 | 2067 |
2160 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, | 2068 DrawFrame(&renderer, viewport_rect); |
2161 viewport_rect, false); | |
2162 } | 2069 } |
2163 | 2070 |
2164 } // namespace | 2071 } // namespace |
2165 } // namespace cc | 2072 } // namespace cc |
OLD | NEW |