2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include <dali/public-api/dali-core.h>
22 #include <dali/integration-api/events/touch-event-integ.h>
23 #include <dali-test-suite-utils.h>
27 void renderable_actor_startup(void)
29 test_return_value = TET_UNDEF;
32 void renderable_actor_cleanup(void)
34 test_return_value = TET_PASS;
40 static bool gIsActor1SortModifierCorrect;
41 static bool gIsActor2SortModifierCorrect;
42 const float gActor1SortModifierValue = 96.0f;
43 const float gActor2SortModifierValue = 53.0f;
45 static float TestSortFunction(const Vector3& position, float sortModifier)
47 if ( fabs(sortModifier - gActor1SortModifierValue) < 0.01)
48 gIsActor1SortModifierCorrect = true;
50 if ( fabs(sortModifier - gActor2SortModifierValue) < 0.01)
51 gIsActor2SortModifierCorrect = true;
58 int UtcDaliRenderableActorDownCast(void)
60 TestApplication application;
62 tet_infoline("Testing Dali::RenderableActor::DownCast()");
64 ImageActor imageActor = ImageActor::New();
66 Actor anActor = Actor::New();
67 anActor.Add( imageActor );
69 Actor child = anActor.GetChildAt(0);
70 RenderableActor renderableActor = RenderableActor::DownCast( child );
71 DALI_TEST_CHECK( renderableActor );
73 renderableActor.Reset();
74 DALI_TEST_CHECK( !renderableActor );
76 renderableActor = DownCast< RenderableActor >( child );
77 DALI_TEST_CHECK( renderableActor );
79 renderableActor = DownCast< RenderableActor >( anActor );
80 DALI_TEST_CHECK( !renderableActor );
82 Actor unInitialzedActor;
83 renderableActor = RenderableActor::DownCast( unInitialzedActor );
84 DALI_TEST_CHECK( !renderableActor );
86 renderableActor = DownCast< RenderableActor >( unInitialzedActor );
87 DALI_TEST_CHECK( !renderableActor );
91 int UtcDaliRenderableActorSetSortModifier(void)
93 TestApplication application;
95 tet_infoline("Testing Dali::RenderableActor::SetSortModifier()");
99 ImageActor actor = ImageActor::New();
100 Stage::GetCurrent().Add(actor);
102 actor.SetSortModifier( val );
104 float returnValue = actor.GetSortModifier();
106 //Verify through actor api
107 DALI_TEST_EQUALS(returnValue, val, TEST_LOCATION);
109 Stage::GetCurrent().Remove(actor);
112 //Verify through layer SetSortFunction
113 gIsActor1SortModifierCorrect = false;
114 gIsActor2SortModifierCorrect = false;
115 BufferImage img = BufferImage::New( 1,1 );
116 // create two transparent actors so there is something to sort
117 ImageActor actor1 = ImageActor::New( img );
118 ImageActor actor2 = ImageActor::New( img );
120 actor1.SetPosition( 0, 0, 0);
121 actor1.SetSortModifier( gActor1SortModifierValue );
122 actor1.SetColor( Vector4(1, 1, 1, 0.5f ) ); // 50% transparent
124 actor2.SetPosition( 0, 0, 1);
125 actor2.SetSortModifier( gActor2SortModifierValue );
126 actor2.SetColor( Vector4(1, 1, 1, 0.5f ) ); // 50% transparent
129 Stage::GetCurrent().Add( actor1 );
130 Stage::GetCurrent().Add( actor2 );
132 Layer root = Stage::GetCurrent().GetLayer( 0 );
133 root.SetSortFunction( TestSortFunction );
135 // flush the queue and render once
136 application.SendNotification();
137 application.Render();
139 DALI_TEST_CHECK( gIsActor1SortModifierCorrect && gIsActor2SortModifierCorrect );
144 int UtcDaliRenderableActorGetSortModifier(void)
146 TestApplication application;
148 tet_infoline("Testing Dali::RenderableActor::GetSortModifier()");
150 ImageActor actor = ImageActor::New();
151 Stage::GetCurrent().Add(actor);
153 DALI_TEST_EQUALS(actor.GetSortModifier(), 0.0f, TEST_LOCATION);
155 Stage::GetCurrent().Remove(actor);
159 int UtcDaliRenderableActorSetGetBlendMode(void)
161 TestApplication application;
163 tet_infoline("Testing Dali::RenderableActor::SetBlendMode() / Dali::RenderableActor::GetBlendMode()");
165 ImageActor actor = ImageActor::New();
167 actor.SetBlendMode( BlendingMode::OFF );
168 DALI_TEST_CHECK( BlendingMode::OFF == actor.GetBlendMode() );
170 actor.SetBlendMode( BlendingMode::AUTO );
171 DALI_TEST_CHECK( BlendingMode::AUTO == actor.GetBlendMode() );
173 actor.SetBlendMode( BlendingMode::ON );
174 DALI_TEST_CHECK( BlendingMode::ON == actor.GetBlendMode() );
178 int UtcDaliRenderableActorSetCullFace(void)
180 TestApplication application;
182 tet_infoline("Testing Dali::RenderableActor::SetCullFace()");
184 BufferImage img = BufferImage::New( 1,1 );
185 ImageActor actor = ImageActor::New( img );
186 ImageActor actor2 = ImageActor::New( img );
188 actor.SetSize(100.0f, 100.0f);
189 actor.SetParentOrigin(ParentOrigin::CENTER);
190 actor.SetAnchorPoint(AnchorPoint::CENTER);
192 actor2.SetSize(100.0f, 100.0f);
193 actor2.SetParentOrigin(ParentOrigin::CENTER);
194 actor2.SetAnchorPoint(AnchorPoint::CENTER);
196 Stage::GetCurrent().Add(actor);
197 Stage::GetCurrent().Add(actor2);
199 //Verify whether the correct GL calls are made when actor is face culled in front and back, and
200 // face culling is disabled for actor2
201 TraceCallStack& cullFaceTrace = application.GetGlAbstraction().GetCullFaceTrace();
202 cullFaceTrace.Enable(true);
203 actor.SetCullFace( CullFrontAndBack );
205 // flush the queue and render once
206 application.SendNotification();
207 application.Render();
209 cullFaceTrace.Enable(false);
210 std::stringstream out;
212 //Verify actor gl state
215 DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(0, "Enable", out.str()), true, TEST_LOCATION);
219 DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(1, "Enable", out.str()), true, TEST_LOCATION);
222 out << GL_FRONT_AND_BACK;
223 DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(2, "CullFace", out.str()), true, TEST_LOCATION);
225 //Verify actor2 gl state
228 DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(3, "Disable", out.str()), true, TEST_LOCATION);
230 //Verify state through the actor api
231 DALI_TEST_CHECK( CullFrontAndBack == actor.GetCullFace() );
232 DALI_TEST_CHECK( CullNone == actor2.GetCullFace() );
234 /**************************************************************/
236 //Verify whether the correct GL calls are made when actor2 is face culled in the front
237 cullFaceTrace.Reset();
238 cullFaceTrace.Enable(true);
239 actor2.SetCullFace( CullFront );
241 // flush the queue and render once
242 application.SendNotification();
243 application.Render();
245 cullFaceTrace.Enable(false);
247 //Verify actor gl state
250 DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(0, "Enable", out.str()), true, TEST_LOCATION);
253 out << GL_FRONT_AND_BACK;
254 DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(1, "CullFace", out.str()), true, TEST_LOCATION);
256 //Verify actor2 gl state
259 DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(2, "Enable", out.str()), true, TEST_LOCATION);
263 DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(3, "CullFace", out.str()), true, TEST_LOCATION);
265 //Verify state through the actor api
266 DALI_TEST_CHECK( CullFrontAndBack == actor.GetCullFace() );
267 DALI_TEST_CHECK( CullFront == actor2.GetCullFace() );
269 /**************************************************************/
270 //Verify whether the correct GL calls are made when face culling is disabled for both actors
271 cullFaceTrace.Reset();
272 cullFaceTrace.Enable(true);
273 actor.SetCullFace( CullNone );
274 actor2.SetCullFace( CullNone );
276 // flush the queue and render once
277 application.SendNotification();
278 application.Render();
280 cullFaceTrace.Enable(false);
284 DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(0, "Disable", out.str()), true, TEST_LOCATION);
286 //Verify state through the actor api
287 DALI_TEST_CHECK( CullNone == actor.GetCullFace() );
288 DALI_TEST_CHECK( CullNone == actor2.GetCullFace() );
290 Stage::GetCurrent().Remove(actor);
291 Stage::GetCurrent().Remove(actor2);
295 int UtcDaliRenderableActorGetCullFace(void)
297 TestApplication application;
299 tet_infoline("Testing Dali::RenderableActor::GetCullFace()");
301 ImageActor imageActor = ImageActor::New();
303 DALI_TEST_CHECK( CullNone == imageActor.GetCullFace() );
305 imageActor.SetCullFace( CullBack );
307 DALI_TEST_CHECK( CullBack == imageActor.GetCullFace() );
312 int UtcDaliRenderableActorSetGetBlendFunc(void)
314 TestApplication application;
315 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
317 tet_infoline("Testing Dali::RenderableActor::UtcDaliRenderableActorSetGetBlendFunc()");
319 BufferImage img = BufferImage::New( 1,1 );
320 ImageActor actor = ImageActor::New( img );
321 Stage::GetCurrent().Add( actor );
322 application.SendNotification();
323 application.Render();
325 // Test the defaults as documented int blending.h
327 BlendingFactor::Type srcFactorRgb( BlendingFactor::ZERO );
328 BlendingFactor::Type destFactorRgb( BlendingFactor::ZERO );
329 BlendingFactor::Type srcFactorAlpha( BlendingFactor::ZERO );
330 BlendingFactor::Type destFactorAlpha( BlendingFactor::ZERO );
331 actor.GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
332 DALI_TEST_EQUALS( BlendingFactor::SRC_ALPHA, srcFactorRgb, TEST_LOCATION );
333 DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_ALPHA, destFactorRgb, TEST_LOCATION );
334 DALI_TEST_EQUALS( BlendingFactor::ONE, srcFactorAlpha, TEST_LOCATION );
335 DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_ALPHA, destFactorAlpha, TEST_LOCATION );
338 // Set to non-default values
339 actor.SetBlendFunc( BlendingFactor::ONE_MINUS_SRC_COLOR, BlendingFactor::SRC_ALPHA_SATURATE, BlendingFactor::ONE_MINUS_SRC_COLOR, BlendingFactor::SRC_ALPHA_SATURATE );
341 // Test that Set was successful
343 BlendingFactor::Type srcFactorRgb( BlendingFactor::ZERO );
344 BlendingFactor::Type destFactorRgb( BlendingFactor::ZERO );
345 BlendingFactor::Type srcFactorAlpha( BlendingFactor::ZERO );
346 BlendingFactor::Type destFactorAlpha( BlendingFactor::ZERO );
347 actor.GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
348 DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_COLOR, srcFactorRgb, TEST_LOCATION );
349 DALI_TEST_EQUALS( BlendingFactor::SRC_ALPHA_SATURATE, destFactorRgb, TEST_LOCATION );
350 DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_COLOR, srcFactorAlpha, TEST_LOCATION );
351 DALI_TEST_EQUALS( BlendingFactor::SRC_ALPHA_SATURATE, destFactorAlpha, TEST_LOCATION );
354 // Render & check GL commands
355 application.SendNotification();
356 application.Render();
357 DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_SRC_COLOR, glAbstraction.GetLastBlendFuncSrcRgb(), TEST_LOCATION );
358 DALI_TEST_EQUALS( (GLenum)GL_SRC_ALPHA_SATURATE, glAbstraction.GetLastBlendFuncDstRgb(), TEST_LOCATION );
359 DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_SRC_COLOR, glAbstraction.GetLastBlendFuncSrcAlpha(), TEST_LOCATION );
360 DALI_TEST_EQUALS( (GLenum)GL_SRC_ALPHA_SATURATE, glAbstraction.GetLastBlendFuncDstAlpha(), TEST_LOCATION );
362 // Set using separate alpha settings
363 actor.SetBlendFunc( BlendingFactor::CONSTANT_COLOR, BlendingFactor::ONE_MINUS_CONSTANT_COLOR,
364 BlendingFactor::CONSTANT_ALPHA, BlendingFactor::ONE_MINUS_CONSTANT_ALPHA );
366 // Test that Set was successful
368 BlendingFactor::Type srcFactorRgb( BlendingFactor::ZERO );
369 BlendingFactor::Type destFactorRgb( BlendingFactor::ZERO );
370 BlendingFactor::Type srcFactorAlpha( BlendingFactor::ZERO );
371 BlendingFactor::Type destFactorAlpha( BlendingFactor::ZERO );
372 actor.GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
373 DALI_TEST_EQUALS( BlendingFactor::CONSTANT_COLOR, srcFactorRgb, TEST_LOCATION );
374 DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_CONSTANT_COLOR, destFactorRgb, TEST_LOCATION );
375 DALI_TEST_EQUALS( BlendingFactor::CONSTANT_ALPHA, srcFactorAlpha, TEST_LOCATION );
376 DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_CONSTANT_ALPHA, destFactorAlpha, TEST_LOCATION );
379 // Render & check GL commands
380 application.SendNotification();
381 application.Render();
382 DALI_TEST_EQUALS( (GLenum)GL_CONSTANT_COLOR, glAbstraction.GetLastBlendFuncSrcRgb(), TEST_LOCATION );
383 DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_CONSTANT_COLOR, glAbstraction.GetLastBlendFuncDstRgb(), TEST_LOCATION );
384 DALI_TEST_EQUALS( (GLenum)GL_CONSTANT_ALPHA, glAbstraction.GetLastBlendFuncSrcAlpha(), TEST_LOCATION );
385 DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_CONSTANT_ALPHA, glAbstraction.GetLastBlendFuncDstAlpha(), TEST_LOCATION );
389 int UtcDaliRenderableActorSetGetAlpha(void)
391 TestApplication application;
393 tet_infoline("Testing Dali::RenderableActor::SetGetAlpha()");
395 BufferImage img = BufferImage::New( 1,1 );
396 ImageActor actor = ImageActor::New( img );
397 Stage::GetCurrent().Add( actor );
398 application.SendNotification();
399 application.Render();
401 // use the image alpha on actor
402 actor.SetBlendMode(BlendingMode::ON);
404 // Test that Set was successful
405 DALI_TEST_EQUALS( BlendingMode::ON, actor.GetBlendMode(), TEST_LOCATION );
407 // Now test that it can be set to false
408 actor.SetBlendMode(BlendingMode::OFF);
409 DALI_TEST_EQUALS(BlendingMode::OFF, actor.GetBlendMode(), TEST_LOCATION );
413 int UtcDaliRenderableActorCreateDestroy(void)
415 tet_infoline("Testing Dali::RenderableActor::CreateDestroy()");
416 RenderableActor* ractor = new RenderableActor;
417 RenderableActor ractor2( *ractor );
418 DALI_TEST_CHECK( ractor );
423 int UtcDaliRenderableActorSetGetFilterModes(void)
425 TestApplication application;
427 tet_infoline("Testing Dali::RenderableActor::SetFilterMode() / Dali::RenderableActor::GetFilterMode()");
429 ImageActor actor = ImageActor::New();
431 FilterMode::Type minifyFilter = FilterMode::NEAREST;
432 FilterMode::Type magnifyFilter = FilterMode::NEAREST;
435 actor.GetFilterMode( minifyFilter, magnifyFilter );
436 DALI_TEST_CHECK( FilterMode::DEFAULT == minifyFilter );
437 DALI_TEST_CHECK( FilterMode::DEFAULT == magnifyFilter );
440 actor.SetFilterMode( FilterMode::DEFAULT, FilterMode::DEFAULT );
441 actor.GetFilterMode( minifyFilter, magnifyFilter );
442 DALI_TEST_CHECK( FilterMode::DEFAULT == minifyFilter );
443 DALI_TEST_CHECK( FilterMode::DEFAULT == magnifyFilter );
446 actor.SetFilterMode( FilterMode::NEAREST, FilterMode::NEAREST );
447 actor.GetFilterMode( minifyFilter, magnifyFilter );
448 DALI_TEST_CHECK( FilterMode::NEAREST == minifyFilter );
449 DALI_TEST_CHECK( FilterMode::NEAREST == magnifyFilter );
452 actor.SetFilterMode( FilterMode::LINEAR, FilterMode::LINEAR );
453 actor.GetFilterMode( minifyFilter, magnifyFilter );
454 DALI_TEST_CHECK( FilterMode::LINEAR == minifyFilter );
455 DALI_TEST_CHECK( FilterMode::LINEAR == magnifyFilter );
458 actor.SetFilterMode( FilterMode::NEAREST, FilterMode::LINEAR );
459 actor.GetFilterMode( minifyFilter, magnifyFilter );
460 DALI_TEST_CHECK( FilterMode::NEAREST == minifyFilter );
461 DALI_TEST_CHECK( FilterMode::LINEAR == magnifyFilter );
464 actor.SetFilterMode( FilterMode::LINEAR, FilterMode::NEAREST );
465 actor.GetFilterMode( minifyFilter, magnifyFilter );
466 DALI_TEST_CHECK( FilterMode::LINEAR == minifyFilter );
467 DALI_TEST_CHECK( FilterMode::NEAREST == magnifyFilter );
472 int UtcDaliRenderableActorSetFilterMode(void)
474 TestApplication application;
476 tet_infoline("Testing Dali::RenderableActor::SetFilterMode()");
478 BufferImage img = BufferImage::New( 1,1 );
479 ImageActor actor = ImageActor::New( img );
481 actor.SetSize(100.0f, 100.0f);
482 actor.SetParentOrigin(ParentOrigin::CENTER);
483 actor.SetAnchorPoint(AnchorPoint::CENTER);
485 Stage::GetCurrent().Add(actor);
487 /**************************************************************/
490 TraceCallStack& texParameterTrace = application.GetGlAbstraction().GetTexParameterTrace();
491 texParameterTrace.Reset();
492 texParameterTrace.Enable( true );
494 actor.SetFilterMode( FilterMode::DEFAULT, FilterMode::DEFAULT );
496 // Flush the queue and render once
497 application.SendNotification();
498 application.Render();
500 texParameterTrace.Enable( false );
502 std::stringstream out;
504 // Verify actor gl state
506 // There are two calls to TexParameteri when the texture is first created
507 // Texture mag filter is not called as the first time set it uses the system default
508 DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 3, TEST_LOCATION);
511 out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_LINEAR;
512 DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(2, "TexParameteri", out.str()), true, TEST_LOCATION);
514 /**************************************************************/
517 texParameterTrace = application.GetGlAbstraction().GetTexParameterTrace();
518 texParameterTrace.Reset();
519 texParameterTrace.Enable( true );
521 actor.SetFilterMode( FilterMode::DEFAULT, FilterMode::DEFAULT );
523 // Flush the queue and render once
524 application.SendNotification();
525 application.Render();
527 texParameterTrace.Enable( false );
529 // Verify actor gl state
531 // Should not make any calls when settings are the same
532 DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 0, TEST_LOCATION);
534 /**************************************************************/
537 texParameterTrace.Reset();
538 texParameterTrace.Enable( true );
540 actor.SetFilterMode( FilterMode::NEAREST, FilterMode::NEAREST );
542 // Flush the queue and render once
543 application.SendNotification();
544 application.Render();
546 texParameterTrace.Enable( false );
548 // Verify actor gl state
549 DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 2, TEST_LOCATION);
552 out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_NEAREST;
553 DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
556 out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MAG_FILTER << ", " << GL_NEAREST;
557 DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(1, "TexParameteri", out.str()), true, TEST_LOCATION);
559 /**************************************************************/
562 texParameterTrace.Reset();
563 texParameterTrace.Enable( true );
565 actor.SetFilterMode( FilterMode::LINEAR, FilterMode::LINEAR );
567 // Flush the queue and render once
568 application.SendNotification();
569 application.Render();
571 texParameterTrace.Enable( false );
573 // Verify actor gl state
574 DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 2, TEST_LOCATION);
577 out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_LINEAR;
578 DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
581 out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MAG_FILTER << ", " << GL_LINEAR;
582 DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(1, "TexParameteri", out.str()), true, TEST_LOCATION);
585 /**************************************************************/
588 texParameterTrace.Reset();
589 texParameterTrace.Enable( true );
591 actor.SetFilterMode( FilterMode::NEAREST, FilterMode::LINEAR );
593 // Flush the queue and render once
594 application.SendNotification();
595 application.Render();
597 texParameterTrace.Enable( false );
599 // Verify actor gl state
600 DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 1, TEST_LOCATION);
603 out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_NEAREST;
604 DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
606 /**************************************************************/
609 texParameterTrace.Reset();
610 texParameterTrace.Enable( true );
612 actor.SetFilterMode( FilterMode::DEFAULT, FilterMode::DEFAULT );
614 // Flush the queue and render once
615 application.SendNotification();
616 application.Render();
618 texParameterTrace.Enable( false );
620 // Verify actor gl state
621 DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 1, TEST_LOCATION);
624 out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_LINEAR;
625 DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
627 /**************************************************************/
630 texParameterTrace.Reset();
631 texParameterTrace.Enable( true );
633 actor.SetFilterMode( FilterMode::NONE, FilterMode::NONE );
635 // Flush the queue and render once
636 application.SendNotification();
637 application.Render();
639 texParameterTrace.Enable( false );
641 // Verify actor gl state
642 DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 1, TEST_LOCATION);
645 out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_NEAREST_MIPMAP_LINEAR;
646 DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
648 /**************************************************************/
650 Stage::GetCurrent().Remove(actor);
655 int UtcDaliRenderableActorSetShaderEffect(void)
657 TestApplication application;
658 BufferImage img = BufferImage::New( 1,1 );
659 ImageActor actor = ImageActor::New( img );
660 Stage::GetCurrent().Add( actor );
662 // flush the queue and render once
663 application.SendNotification();
664 application.Render();
665 GLuint lastShaderCompiledBefore = application.GetGlAbstraction().GetLastShaderCompiled();
667 application.GetGlAbstraction().EnableShaderCallTrace( true );
669 const std::string vertexShader = "UtcDaliRenderableActorSetShaderEffect-VertexSource";
670 const std::string fragmentShader = "UtcDaliRenderableActorSetShaderEffect-FragmentSource";
671 ShaderEffect effect = ShaderEffect::New(vertexShader, fragmentShader );
672 DALI_TEST_CHECK( effect != actor.GetShaderEffect() );
674 actor.SetShaderEffect( effect );
675 DALI_TEST_CHECK( effect == actor.GetShaderEffect() );
677 // flush the queue and render once
678 application.SendNotification();
679 application.Render();
681 GLuint lastShaderCompiledAfter = application.GetGlAbstraction().GetLastShaderCompiled();
682 DALI_TEST_EQUALS( lastShaderCompiledAfter, lastShaderCompiledBefore + 2, TEST_LOCATION );
684 std::string actualVertexShader = application.GetGlAbstraction().GetShaderSource( lastShaderCompiledBefore + 1 );
685 DALI_TEST_EQUALS( vertexShader,
686 actualVertexShader.substr( actualVertexShader.length() - vertexShader.length() ), TEST_LOCATION );
687 std::string actualFragmentShader = application.GetGlAbstraction().GetShaderSource( lastShaderCompiledBefore + 2 );
688 DALI_TEST_EQUALS( fragmentShader,
689 actualFragmentShader.substr( actualFragmentShader.length() - fragmentShader.length() ), TEST_LOCATION );
694 int UtcDaliRenderableActorGetShaderEffect(void)
696 TestApplication application;
697 ImageActor actor = ImageActor::New();
699 ShaderEffect effect = ShaderEffect::New("UtcDaliRenderableActorGetShaderEffect-VertexSource", "UtcDaliRenderableActorGetShaderEffect-FragmentSource" );
700 actor.SetShaderEffect(effect);
702 DALI_TEST_CHECK(effect == actor.GetShaderEffect());
706 int UtcDaliRenderableActorRemoveShaderEffect01(void)
708 TestApplication application;
709 ImageActor actor = ImageActor::New();
711 ShaderEffect defaultEffect = actor.GetShaderEffect();
713 ShaderEffect effect = ShaderEffect::New("UtcDaliRenderableActorRemoveShaderEffect-VertexSource", "UtcDaliRenderableActorRemoveShaderEffect-FragmentSource" );
714 actor.SetShaderEffect(effect);
716 DALI_TEST_CHECK(effect == actor.GetShaderEffect());
718 actor.RemoveShaderEffect();
720 DALI_TEST_CHECK(defaultEffect == actor.GetShaderEffect());
724 int UtcDaliRenderableActorRemoveShaderEffect02(void)
726 TestApplication application;
727 ImageActor actor = ImageActor::New();
729 ShaderEffect defaultEffect = actor.GetShaderEffect();
731 actor.RemoveShaderEffect();
733 DALI_TEST_CHECK(defaultEffect == actor.GetShaderEffect());
737 int UtcDaliSetShaderEffectRecursively(void)
739 TestApplication application;
747 BufferImage img = BufferImage::New( 1,1 );
748 ImageActor actor1 = ImageActor::New( img );
749 Actor actor2 = Actor::New();
750 actor1.Add( actor2 );
751 Actor actor3 = Actor::New();
752 actor2.Add( actor3 );
753 ImageActor imageactor1 = ImageActor::New( img );
754 actor2.Add( imageactor1 );
755 ImageActor imageactor2 = ImageActor::New( img );
756 actor3.Add( imageactor2 );
757 Actor actor4 = Actor::New();
758 actor1.Add( actor4 );
759 Stage::GetCurrent().Add( actor1 );
761 // flush the queue and render once
762 application.SendNotification();
763 application.Render();
764 GLuint lastShaderCompiledBefore = application.GetGlAbstraction().GetLastShaderCompiled();
766 application.GetGlAbstraction().EnableShaderCallTrace( true );
768 const std::string vertexShader = "UtcDaliRenderableActorSetShaderEffect-VertexSource";
769 const std::string fragmentShader = "UtcDaliRenderableActorSetShaderEffect-FragmentSource";
770 // test with empty effect
772 SetShaderEffectRecursively( actor1, effect );
774 effect = ShaderEffect::New(vertexShader, fragmentShader );
776 DALI_TEST_CHECK( effect != actor1.GetShaderEffect() );
777 DALI_TEST_CHECK( effect != imageactor1.GetShaderEffect() );
778 DALI_TEST_CHECK( effect != imageactor2.GetShaderEffect() );
780 SetShaderEffectRecursively( actor1, effect );
781 DALI_TEST_CHECK( effect == imageactor1.GetShaderEffect() );
782 DALI_TEST_CHECK( effect == imageactor2.GetShaderEffect() );
784 // flush the queue and render once
785 application.SendNotification();
786 application.Render();
788 GLuint lastShaderCompiledAfter = application.GetGlAbstraction().GetLastShaderCompiled();
789 DALI_TEST_EQUALS( lastShaderCompiledAfter, lastShaderCompiledBefore + 2, TEST_LOCATION );
791 std::string actualVertexShader = application.GetGlAbstraction().GetShaderSource( lastShaderCompiledBefore + 1 );
792 DALI_TEST_EQUALS( vertexShader,
793 actualVertexShader.substr( actualVertexShader.length() - vertexShader.length() ), TEST_LOCATION );
794 std::string actualFragmentShader = application.GetGlAbstraction().GetShaderSource( lastShaderCompiledBefore + 2 );
795 DALI_TEST_EQUALS( fragmentShader,
796 actualFragmentShader.substr( actualFragmentShader.length() - fragmentShader.length() ), TEST_LOCATION );
798 // remove from one that does not have shader
799 RemoveShaderEffectRecursively( actor4 );
802 RemoveShaderEffectRecursively( actor3 );
803 DALI_TEST_CHECK( effect == imageactor1.GetShaderEffect() );
804 DALI_TEST_CHECK( effect != imageactor2.GetShaderEffect() );
806 // test with empty actor just to check it does not crash
808 SetShaderEffectRecursively( empty, effect );
809 RemoveShaderEffectRecursively( empty );
811 // test with actor with no children just to check it does not crash
812 Actor loner = Actor::New();
813 Stage::GetCurrent().Add( loner );
814 SetShaderEffectRecursively( loner, effect );
815 RemoveShaderEffectRecursively( loner );
820 int UtcDaliRenderableActorTestClearCache01(void)
822 // Testing the framebuffer state caching in frame-buffer-state-caching.cpp
823 TestApplication application;
825 tet_infoline("Testing Dali::RenderableActor::ClearCache01()");
827 BufferImage img = BufferImage::New( 1,1 );
828 ImageActor actor = ImageActor::New( img );
830 actor.SetParentOrigin(ParentOrigin::CENTER);
831 actor.SetAnchorPoint(AnchorPoint::CENTER);
833 Stage::GetCurrent().Add(actor);
835 /**************************************************************/
836 // Flush the queue and render once
837 application.SendNotification();
838 application.Render();
840 // There should be a single call to Clear
841 DALI_TEST_EQUALS( application.GetGlAbstraction().GetClearCountCalled() , 1u, TEST_LOCATION );
843 // the last set clear mask should be COLOR, DEPTH & STENCIL which occurs at the start of each frame
844 GLbitfield mask = application.GetGlAbstraction().GetLastClearMask();
845 DALI_TEST_CHECK( mask & GL_DEPTH_BUFFER_BIT );
846 DALI_TEST_CHECK( mask & GL_STENCIL_BUFFER_BIT );
847 DALI_TEST_CHECK( mask & GL_COLOR_BUFFER_BIT );
852 int UtcDaliRenderableActorTestClearCache02(void)
854 // Testing the framebuffer state caching in frame-buffer-state-caching.cpp
855 TestApplication application;
857 tet_infoline("Testing Dali::RenderableActor::ClearCache02()");
859 // use RGB so alpha is disabled and the actors are drawn opaque
860 BufferImage img = BufferImage::New( 10,10 ,Pixel::RGB888 );
862 // Without caching DALi perform clears in the following places
864 // | glClear #1 ( everything at start of frame )
867 // | glClear #2 ( start of layer with opaque actors )
869 // | -> Actor 1 ( opaque )
870 // | -> Actor 2 ( opaque )
873 // | glClear #3 ( start of layer with opaque actors )
875 // | -> Actor 3 ( opaque )
876 // | -> Actor 4 ( opaque )
878 // With caching enabled glClear should only be called twice, at points #1 and #3.
879 // At #1 with depth, color and stencil cleared
880 // At #3 with depth cleared
881 // #2 is not required because the buffer has already been cleared at #1
883 Layer layer1 = Layer::New();
884 layer1.Add( ImageActor::New( img ) );
885 layer1.Add( ImageActor::New( img ) );
887 Layer layer2 = Layer::New();
888 layer2.Add( ImageActor::New( img ) );
889 layer2.Add( ImageActor::New( img ) );
891 Stage::GetCurrent().Add( layer1 );
892 Stage::GetCurrent().Add( layer2 );
894 /**************************************************************/
896 // Flush the queue and render once
897 application.SendNotification();
898 application.Render();
900 // There should be a 2 calls to Clear
901 DALI_TEST_EQUALS( application.GetGlAbstraction().GetClearCountCalled() , 2u, TEST_LOCATION );
903 // the last set clear mask should be DEPTH & STENCIL & COLOR
904 GLbitfield mask = application.GetGlAbstraction().GetLastClearMask();
906 tet_printf(" clear count = %d \n", application.GetGlAbstraction().GetClearCountCalled() );
908 // The last clear should just be DEPTH BUFFER, not color and stencil which were cleared at the start of the frame
909 DALI_TEST_CHECK( mask & GL_DEPTH_BUFFER_BIT );
910 DALI_TEST_CHECK( ! ( mask & GL_COLOR_BUFFER_BIT ) );
911 DALI_TEST_CHECK( ! ( mask & GL_STENCIL_BUFFER_BIT ) );
916 int UtcDaliRenderableActorTestClearCache03(void)
918 // Testing the framebuffer state caching in frame-buffer-state-caching.cpp
919 TestApplication application;
921 tet_infoline("Testing Dali::RenderableActor::ClearCache03()");
923 // use RGB so alpha is disabled and the actors are drawn opaque
924 BufferImage img = BufferImage::New( 10,10 ,Pixel::RGB888 );
926 // Without caching DALi perform clears in the following places
928 // | 1-## glClear ( COLOR, DEPTH, STENCIL )
931 // | 2-## glClear ( STENCIL )
932 // | -> Actor 1 ( stencil )
933 // | 3-## glClear ( DEPTH )
934 // | -> Actor 2 ( opaque ) // need 2 opaque actors to bypass optimisation of turning off depth test
935 // | -> Actor 3 ( opaque )
939 // | 4-## glClear ( STENCIL )
940 // | -> Actor 4 ( stencil )
941 // | 5-## glClear ( DEPTH )
942 // | -> Actor 5 ( opaque ) // need 2 opaque actors to bypass optimisation of turning off depth test
943 // | -> Actor 6 ( opaque )
945 // With caching enabled glClear will not be called at ## 2 and ## 3 ( because those buffers are already clear).
947 // @TODO Add further optimisation to look-ahead in the render-list to see if
948 // When performing STENCIL clear, check if there another layer after it.
949 // If there is, combine the STENCIL with a DEPTH clear.
952 Layer layer1 = Layer::New();
953 ImageActor actor1 = ImageActor::New( img );
954 ImageActor actor2 = ImageActor::New( img );
955 ImageActor actor3 = ImageActor::New( img );
957 actor2.SetDrawMode( DrawMode::STENCIL );
959 layer1.Add( actor1 );
960 layer1.Add( actor2 );
961 layer1.Add( actor3 );
963 Layer layer2 = Layer::New();
964 ImageActor actor4 = ImageActor::New( img );
965 ImageActor actor5 = ImageActor::New( img );
966 ImageActor actor6 = ImageActor::New( img );
968 actor4.SetDrawMode( DrawMode::STENCIL );
970 layer2.Add( actor4 );
971 layer2.Add( actor5 );
972 layer2.Add( actor6 );
974 Stage::GetCurrent().Add( layer1 );
975 Stage::GetCurrent().Add( layer2 );
978 /**************************************************************/
980 // Flush the queue and render once
981 application.SendNotification();
982 application.Render();
984 // There should be a 3 calls to Clear ( one for everything, one for stencil, one for depth buffer).
985 DALI_TEST_EQUALS( application.GetGlAbstraction().GetClearCountCalled() , 3u, TEST_LOCATION );
987 // the last set clear mask should be DEPTH & STENCIL & COLOR
988 GLbitfield mask = application.GetGlAbstraction().GetLastClearMask();
990 tet_printf(" clear count = %d \n", application.GetGlAbstraction().GetClearCountCalled() );
991 tet_printf(" clear mask = %x \n", mask);
993 // The last clear should just be DEPTH BUFFER and stencil
994 DALI_TEST_CHECK( !( mask & GL_COLOR_BUFFER_BIT ) );
995 DALI_TEST_CHECK( !( mask & GL_STENCIL_BUFFER_BIT ) );
996 DALI_TEST_CHECK( mask & GL_DEPTH_BUFFER_BIT );