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 <set> | 7 #include <set> |
8 | 8 |
9 #include "cc/base/math_util.h" | 9 #include "cc/base/math_util.h" |
10 #include "cc/debug/test_web_graphics_context_3d.h" | 10 #include "cc/debug/test_web_graphics_context_3d.h" |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 private: | 136 private: |
137 int frame_; | 137 int frame_; |
138 }; | 138 }; |
139 | 139 |
140 class FakeRendererClient : public RendererClient { | 140 class FakeRendererClient : public RendererClient { |
141 public: | 141 public: |
142 FakeRendererClient() | 142 FakeRendererClient() |
143 : host_impl_(&proxy_), | 143 : host_impl_(&proxy_), |
144 set_full_root_layer_damage_count_(0), | 144 set_full_root_layer_damage_count_(0), |
145 root_layer_(LayerImpl::Create(host_impl_.active_tree(), 1)), | 145 root_layer_(LayerImpl::Create(host_impl_.active_tree(), 1)), |
146 viewport_size_(gfx::Size(1, 1)) { | 146 viewport_(gfx::Rect(0, 0, 1, 1)), |
| 147 clip_(gfx::Rect(0, 0, 1, 1)) { |
147 root_layer_->CreateRenderSurface(); | 148 root_layer_->CreateRenderSurface(); |
148 RenderPass::Id render_pass_id = | 149 RenderPass::Id render_pass_id = |
149 root_layer_->render_surface()->RenderPassId(); | 150 root_layer_->render_surface()->RenderPassId(); |
150 scoped_ptr<RenderPass> root_render_pass = RenderPass::Create(); | 151 scoped_ptr<RenderPass> root_render_pass = RenderPass::Create(); |
151 root_render_pass->SetNew( | 152 root_render_pass->SetNew( |
152 render_pass_id, gfx::Rect(), gfx::Rect(), gfx::Transform()); | 153 render_pass_id, gfx::Rect(), gfx::Rect(), gfx::Transform()); |
153 render_passes_in_draw_order_.push_back(root_render_pass.Pass()); | 154 render_passes_in_draw_order_.push_back(root_render_pass.Pass()); |
154 } | 155 } |
155 | 156 |
156 // RendererClient methods. | 157 // RendererClient methods. |
157 virtual gfx::Rect DeviceViewport() const OVERRIDE { | 158 virtual gfx::Rect DeviceViewport() const OVERRIDE { |
158 static gfx::Size fake_size(1, 1); | 159 return viewport_; |
159 return gfx::Rect(fake_size); | |
160 } | 160 } |
161 virtual gfx::Rect DeviceClip() const OVERRIDE { return DeviceViewport(); } | 161 virtual gfx::Rect DeviceClip() const OVERRIDE { |
| 162 return clip_; |
| 163 } |
162 virtual void SetFullRootLayerDamage() OVERRIDE { | 164 virtual void SetFullRootLayerDamage() OVERRIDE { |
163 set_full_root_layer_damage_count_++; | 165 set_full_root_layer_damage_count_++; |
164 } | 166 } |
165 virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const OVERRIDE { | 167 virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const OVERRIDE { |
166 return CompositorFrameMetadata(); | 168 return CompositorFrameMetadata(); |
167 } | 169 } |
168 | 170 |
169 // Methods added for test. | 171 // Methods added for test. |
170 int set_full_root_layer_damage_count() const { | 172 int set_full_root_layer_damage_count() const { |
171 return set_full_root_layer_damage_count_; | 173 return set_full_root_layer_damage_count_; |
172 } | 174 } |
173 void set_viewport(gfx::Size viewport_size) { viewport_size_ = viewport_size; } | 175 void set_viewport(gfx::Rect viewport) { viewport_ = viewport; } |
| 176 void set_clip(gfx::Rect clip) { clip_ = clip; } |
174 | 177 |
175 RenderPass* root_render_pass() { return render_passes_in_draw_order_.back(); } | 178 RenderPass* root_render_pass() { return render_passes_in_draw_order_.back(); } |
176 RenderPassList* render_passes_in_draw_order() { | 179 RenderPassList* render_passes_in_draw_order() { |
177 return &render_passes_in_draw_order_; | 180 return &render_passes_in_draw_order_; |
178 } | 181 } |
179 | 182 |
180 private: | 183 private: |
181 FakeImplProxy proxy_; | 184 FakeImplProxy proxy_; |
182 FakeLayerTreeHostImpl host_impl_; | 185 FakeLayerTreeHostImpl host_impl_; |
183 int set_full_root_layer_damage_count_; | 186 int set_full_root_layer_damage_count_; |
184 scoped_ptr<LayerImpl> root_layer_; | 187 scoped_ptr<LayerImpl> root_layer_; |
185 RenderPassList render_passes_in_draw_order_; | 188 RenderPassList render_passes_in_draw_order_; |
186 gfx::Size viewport_size_; | 189 gfx::Rect viewport_; |
| 190 gfx::Rect clip_; |
187 }; | 191 }; |
188 | 192 |
189 class FakeRendererGL : public GLRenderer { | 193 class FakeRendererGL : public GLRenderer { |
190 public: | 194 public: |
191 FakeRendererGL(RendererClient* client, | 195 FakeRendererGL(RendererClient* client, |
192 const LayerTreeSettings* settings, | 196 const LayerTreeSettings* settings, |
193 OutputSurface* output_surface, | 197 OutputSurface* output_surface, |
194 ResourceProvider* resource_provider) | 198 ResourceProvider* resource_provider) |
195 : GLRenderer(client, | 199 : GLRenderer(client, |
196 settings, | 200 settings, |
(...skipping 933 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1130 | 1134 |
1131 AddRenderPassQuad(root_pass, child_pass); | 1135 AddRenderPassQuad(root_pass, child_pass); |
1132 AddRenderPassQuad(child_pass, grand_child_pass); | 1136 AddRenderPassQuad(child_pass, grand_child_pass); |
1133 | 1137 |
1134 renderer.DecideRenderPassAllocationsForFrame( | 1138 renderer.DecideRenderPassAllocationsForFrame( |
1135 *renderer_client.render_passes_in_draw_order()); | 1139 *renderer_client.render_passes_in_draw_order()); |
1136 renderer.DrawFrame( | 1140 renderer.DrawFrame( |
1137 renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); | 1141 renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
1138 } | 1142 } |
1139 | 1143 |
| 1144 class DiscardCheckingContext : public TestWebGraphicsContext3D { |
| 1145 public: |
| 1146 DiscardCheckingContext() : discarded_(0) { |
| 1147 set_have_post_sub_buffer(true); |
| 1148 set_have_discard_framebuffer(true); |
| 1149 } |
| 1150 |
| 1151 virtual void discardFramebufferEXT(WGC3Denum target, |
| 1152 WGC3Dsizei numAttachments, |
| 1153 const WGC3Denum* attachments) { |
| 1154 ++discarded_; |
| 1155 } |
| 1156 |
| 1157 int discarded() const { return discarded_; } |
| 1158 void reset() { discarded_ = 0; } |
| 1159 |
| 1160 private: |
| 1161 int discarded_; |
| 1162 }; |
| 1163 |
1140 class NonReshapableOutputSurface : public FakeOutputSurface { | 1164 class NonReshapableOutputSurface : public FakeOutputSurface { |
1141 public: | 1165 public: |
1142 explicit NonReshapableOutputSurface( | 1166 explicit NonReshapableOutputSurface( |
1143 scoped_ptr<TestWebGraphicsContext3D> context3d) | 1167 scoped_ptr<TestWebGraphicsContext3D> context3d) |
1144 : FakeOutputSurface( | 1168 : FakeOutputSurface( |
1145 TestContextProvider::Create(context3d.Pass()), | 1169 TestContextProvider::Create(context3d.Pass()), |
1146 false) {} | 1170 false) { |
1147 virtual gfx::Size SurfaceSize() const OVERRIDE { return gfx::Size(500, 500); } | 1171 surface_size_ = gfx::Size(500, 500); |
| 1172 } |
| 1173 virtual void Reshape(gfx::Size size, float scale_factor) OVERRIDE {} |
| 1174 void set_fixed_size(gfx::Size size) { surface_size_ = size; } |
1148 }; | 1175 }; |
1149 | 1176 |
1150 class OffsetViewportRendererClient : public FakeRendererClient { | 1177 TEST(GLRendererTest2, NoDiscardOnPartialUpdates) { |
1151 public: | 1178 scoped_ptr<DiscardCheckingContext> context_owned(new DiscardCheckingContext); |
1152 virtual gfx::Rect DeviceViewport() const OVERRIDE { | 1179 DiscardCheckingContext* context = context_owned.get(); |
1153 return gfx::Rect(10, 10, 100, 100); | 1180 |
| 1181 FakeOutputSurfaceClient output_surface_client; |
| 1182 scoped_ptr<NonReshapableOutputSurface> output_surface( |
| 1183 new NonReshapableOutputSurface( |
| 1184 context_owned.PassAs<TestWebGraphicsContext3D>())); |
| 1185 CHECK(output_surface->BindToClient(&output_surface_client)); |
| 1186 output_surface->set_fixed_size(gfx::Size(100, 100)); |
| 1187 |
| 1188 scoped_ptr<ResourceProvider> resource_provider( |
| 1189 ResourceProvider::Create(output_surface.get(), 0)); |
| 1190 |
| 1191 LayerTreeSettings settings; |
| 1192 settings.partial_swap_enabled = true; |
| 1193 FakeRendererClient renderer_client; |
| 1194 renderer_client.set_viewport(gfx::Rect(0, 0, 100, 100)); |
| 1195 renderer_client.set_clip(gfx::Rect(0, 0, 100, 100)); |
| 1196 FakeRendererGL renderer(&renderer_client, |
| 1197 &settings, |
| 1198 output_surface.get(), |
| 1199 resource_provider.get()); |
| 1200 EXPECT_TRUE(renderer.Initialize()); |
| 1201 EXPECT_TRUE(renderer.Capabilities().using_partial_swap); |
| 1202 |
| 1203 gfx::Rect viewport_rect(renderer_client.DeviceViewport()); |
| 1204 ScopedPtrVector<RenderPass>& render_passes = |
| 1205 *renderer_client.render_passes_in_draw_order(); |
| 1206 render_passes.clear(); |
| 1207 |
| 1208 { |
| 1209 // Partial frame, should not discard. |
| 1210 RenderPass::Id root_pass_id(1, 0); |
| 1211 TestRenderPass* root_pass = AddRenderPass( |
| 1212 &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
| 1213 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
| 1214 root_pass->damage_rect = gfx::RectF(2.f, 2.f, 3.f, 3.f); |
| 1215 |
| 1216 renderer.DecideRenderPassAllocationsForFrame( |
| 1217 *renderer_client.render_passes_in_draw_order()); |
| 1218 renderer.DrawFrame( |
| 1219 renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
| 1220 EXPECT_EQ(0, context->discarded()); |
| 1221 context->reset(); |
1154 } | 1222 } |
1155 }; | 1223 { |
| 1224 // Full frame, should discard. |
| 1225 RenderPass::Id root_pass_id(1, 0); |
| 1226 TestRenderPass* root_pass = AddRenderPass( |
| 1227 &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
| 1228 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
| 1229 root_pass->damage_rect = gfx::RectF(root_pass->output_rect); |
| 1230 |
| 1231 renderer.DecideRenderPassAllocationsForFrame( |
| 1232 *renderer_client.render_passes_in_draw_order()); |
| 1233 renderer.DrawFrame( |
| 1234 renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
| 1235 EXPECT_EQ(1, context->discarded()); |
| 1236 context->reset(); |
| 1237 } |
| 1238 { |
| 1239 // Partial frame, disallow partial swap, should discard. |
| 1240 RenderPass::Id root_pass_id(1, 0); |
| 1241 TestRenderPass* root_pass = AddRenderPass( |
| 1242 &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
| 1243 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
| 1244 root_pass->damage_rect = gfx::RectF(2.f, 2.f, 3.f, 3.f); |
| 1245 |
| 1246 renderer.DecideRenderPassAllocationsForFrame( |
| 1247 *renderer_client.render_passes_in_draw_order()); |
| 1248 renderer.DrawFrame( |
| 1249 renderer_client.render_passes_in_draw_order(), NULL, 1.f, false); |
| 1250 EXPECT_EQ(1, context->discarded()); |
| 1251 context->reset(); |
| 1252 } |
| 1253 { |
| 1254 // Full frame, external scissor is set, should not discard. |
| 1255 output_surface->set_has_external_stencil_test(true); |
| 1256 RenderPass::Id root_pass_id(1, 0); |
| 1257 TestRenderPass* root_pass = AddRenderPass( |
| 1258 &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
| 1259 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
| 1260 root_pass->damage_rect = gfx::RectF(root_pass->output_rect); |
| 1261 |
| 1262 renderer.DecideRenderPassAllocationsForFrame( |
| 1263 *renderer_client.render_passes_in_draw_order()); |
| 1264 renderer.DrawFrame( |
| 1265 renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
| 1266 EXPECT_EQ(0, context->discarded()); |
| 1267 context->reset(); |
| 1268 output_surface->set_has_external_stencil_test(false); |
| 1269 } |
| 1270 { |
| 1271 // Full frame, clipped, should not discard. |
| 1272 renderer_client.set_clip(gfx::Rect(10, 10, 10, 10)); |
| 1273 RenderPass::Id root_pass_id(1, 0); |
| 1274 TestRenderPass* root_pass = AddRenderPass( |
| 1275 &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
| 1276 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
| 1277 root_pass->damage_rect = gfx::RectF(root_pass->output_rect); |
| 1278 |
| 1279 renderer.DecideRenderPassAllocationsForFrame( |
| 1280 *renderer_client.render_passes_in_draw_order()); |
| 1281 renderer.DrawFrame( |
| 1282 renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
| 1283 EXPECT_EQ(0, context->discarded()); |
| 1284 context->reset(); |
| 1285 } |
| 1286 { |
| 1287 // Full frame, doesn't cover the surface, should not discard. |
| 1288 renderer_client.set_viewport(gfx::Rect(10, 10, 10, 10)); |
| 1289 viewport_rect = renderer_client.DeviceViewport(); |
| 1290 RenderPass::Id root_pass_id(1, 0); |
| 1291 TestRenderPass* root_pass = AddRenderPass( |
| 1292 &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
| 1293 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
| 1294 root_pass->damage_rect = gfx::RectF(root_pass->output_rect); |
| 1295 |
| 1296 renderer.DecideRenderPassAllocationsForFrame( |
| 1297 *renderer_client.render_passes_in_draw_order()); |
| 1298 renderer.DrawFrame( |
| 1299 renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
| 1300 EXPECT_EQ(0, context->discarded()); |
| 1301 context->reset(); |
| 1302 } |
| 1303 { |
| 1304 // Full frame, doesn't cover the surface (no offset), should not discard. |
| 1305 renderer_client.set_viewport(gfx::Rect(0, 0, 50, 50)); |
| 1306 renderer_client.set_clip(gfx::Rect(0, 0, 100, 100)); |
| 1307 viewport_rect = renderer_client.DeviceViewport(); |
| 1308 RenderPass::Id root_pass_id(1, 0); |
| 1309 TestRenderPass* root_pass = AddRenderPass( |
| 1310 &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
| 1311 AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
| 1312 root_pass->damage_rect = gfx::RectF(root_pass->output_rect); |
| 1313 |
| 1314 renderer.DecideRenderPassAllocationsForFrame( |
| 1315 *renderer_client.render_passes_in_draw_order()); |
| 1316 renderer.DrawFrame( |
| 1317 renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
| 1318 EXPECT_EQ(0, context->discarded()); |
| 1319 context->reset(); |
| 1320 } |
| 1321 } |
1156 | 1322 |
1157 class FlippedScissorAndViewportContext : public TestWebGraphicsContext3D { | 1323 class FlippedScissorAndViewportContext : public TestWebGraphicsContext3D { |
1158 public: | 1324 public: |
1159 FlippedScissorAndViewportContext() | 1325 FlippedScissorAndViewportContext() |
1160 : did_call_viewport_(false), did_call_scissor_(false) {} | 1326 : did_call_viewport_(false), did_call_scissor_(false) {} |
1161 virtual ~FlippedScissorAndViewportContext() { | 1327 virtual ~FlippedScissorAndViewportContext() { |
1162 EXPECT_TRUE(did_call_viewport_); | 1328 EXPECT_TRUE(did_call_viewport_); |
1163 EXPECT_TRUE(did_call_scissor_); | 1329 EXPECT_TRUE(did_call_scissor_); |
1164 } | 1330 } |
1165 | 1331 |
(...skipping 28 matching lines...) Expand all Loading... |
1194 | 1360 |
1195 FakeOutputSurfaceClient output_surface_client; | 1361 FakeOutputSurfaceClient output_surface_client; |
1196 scoped_ptr<OutputSurface> output_surface(new NonReshapableOutputSurface( | 1362 scoped_ptr<OutputSurface> output_surface(new NonReshapableOutputSurface( |
1197 context_owned.PassAs<TestWebGraphicsContext3D>())); | 1363 context_owned.PassAs<TestWebGraphicsContext3D>())); |
1198 CHECK(output_surface->BindToClient(&output_surface_client)); | 1364 CHECK(output_surface->BindToClient(&output_surface_client)); |
1199 | 1365 |
1200 scoped_ptr<ResourceProvider> resource_provider( | 1366 scoped_ptr<ResourceProvider> resource_provider( |
1201 ResourceProvider::Create(output_surface.get(), 0, false)); | 1367 ResourceProvider::Create(output_surface.get(), 0, false)); |
1202 | 1368 |
1203 LayerTreeSettings settings; | 1369 LayerTreeSettings settings; |
1204 OffsetViewportRendererClient renderer_client; | 1370 FakeRendererClient renderer_client; |
| 1371 renderer_client.set_viewport(gfx::Rect(10, 10, 100, 100)); |
| 1372 renderer_client.set_clip(gfx::Rect(10, 10, 100, 100)); |
1205 FakeRendererGL renderer(&renderer_client, | 1373 FakeRendererGL renderer(&renderer_client, |
1206 &settings, | 1374 &settings, |
1207 output_surface.get(), | 1375 output_surface.get(), |
1208 resource_provider.get()); | 1376 resource_provider.get()); |
1209 EXPECT_TRUE(renderer.Initialize()); | 1377 EXPECT_TRUE(renderer.Initialize()); |
1210 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); | 1378 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); |
1211 | 1379 |
1212 gfx::Rect viewport_rect(renderer_client.DeviceViewport().size()); | 1380 gfx::Rect viewport_rect(renderer_client.DeviceViewport().size()); |
1213 gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20); | 1381 gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20); |
1214 ScopedPtrVector<RenderPass>& render_passes = | 1382 ScopedPtrVector<RenderPass>& render_passes = |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1599 | 1767 |
1600 EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); | 1768 EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); |
1601 renderer_->SwapBuffers(); | 1769 renderer_->SwapBuffers(); |
1602 } | 1770 } |
1603 | 1771 |
1604 TEST_F(MockOutputSurfaceTest, DrawFrameAndResizeAndSwap) { | 1772 TEST_F(MockOutputSurfaceTest, DrawFrameAndResizeAndSwap) { |
1605 DrawFrame(1.f); | 1773 DrawFrame(1.f); |
1606 EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); | 1774 EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); |
1607 renderer_->SwapBuffers(); | 1775 renderer_->SwapBuffers(); |
1608 | 1776 |
1609 set_viewport(gfx::Size(2, 2)); | 1777 set_viewport(gfx::Rect(0, 0, 2, 2)); |
1610 renderer_->ViewportChanged(); | 1778 renderer_->ViewportChanged(); |
1611 | 1779 |
1612 DrawFrame(2.f); | 1780 DrawFrame(2.f); |
1613 EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); | 1781 EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); |
1614 renderer_->SwapBuffers(); | 1782 renderer_->SwapBuffers(); |
1615 | 1783 |
1616 DrawFrame(2.f); | 1784 DrawFrame(2.f); |
1617 EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); | 1785 EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); |
1618 renderer_->SwapBuffers(); | 1786 renderer_->SwapBuffers(); |
1619 | 1787 |
1620 set_viewport(gfx::Size(1, 1)); | 1788 set_viewport(gfx::Rect(0, 0, 1, 1)); |
1621 renderer_->ViewportChanged(); | 1789 renderer_->ViewportChanged(); |
1622 | 1790 |
1623 DrawFrame(1.f); | 1791 DrawFrame(1.f); |
1624 EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); | 1792 EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); |
1625 renderer_->SwapBuffers(); | 1793 renderer_->SwapBuffers(); |
1626 } | 1794 } |
1627 | 1795 |
1628 class GLRendererTestSyncPoint : public GLRendererPixelTest { | 1796 class GLRendererTestSyncPoint : public GLRendererPixelTest { |
1629 protected: | 1797 protected: |
1630 static void SyncPointCallback(int* callback_count) { | 1798 static void SyncPointCallback(int* callback_count) { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1692 base::MessageLoop::current()->Run(); | 1860 base::MessageLoop::current()->Run(); |
1693 | 1861 |
1694 // The sync point should have happened. | 1862 // The sync point should have happened. |
1695 EXPECT_EQ(1, sync_point_callback_count); | 1863 EXPECT_EQ(1, sync_point_callback_count); |
1696 EXPECT_EQ(1, other_callback_count); | 1864 EXPECT_EQ(1, other_callback_count); |
1697 } | 1865 } |
1698 #endif // OS_ANDROID | 1866 #endif // OS_ANDROID |
1699 | 1867 |
1700 } // namespace | 1868 } // namespace |
1701 } // namespace cc | 1869 } // namespace cc |
OLD | NEW |