UTC public API updates: stage.h
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-RenderableActor.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 #include <iostream>
19
20 #include <stdlib.h>
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>
24
25 using namespace Dali;
26
27 void renderable_actor_startup(void)
28 {
29   test_return_value = TET_UNDEF;
30 }
31
32 void renderable_actor_cleanup(void)
33 {
34   test_return_value = TET_PASS;
35 }
36
37 namespace
38 {
39
40 static bool gIsActor1SortModifierCorrect;
41 static bool gIsActor2SortModifierCorrect;
42 const float gActor1SortModifierValue = 96.0f;
43 const float gActor2SortModifierValue = 53.0f;
44
45 static float TestSortFunction(const Vector3& position, float sortModifier)
46 {
47   if ( fabs(sortModifier - gActor1SortModifierValue) < 0.01)
48     gIsActor1SortModifierCorrect = true;
49
50   if ( fabs(sortModifier - gActor2SortModifierValue) < 0.01)
51     gIsActor2SortModifierCorrect = true;
52
53   return 0.0f;
54 }
55
56 } // anon namespace
57
58 int UtcDaliRenderableActorDownCast(void)
59 {
60   TestApplication application;
61
62   tet_infoline("Testing Dali::RenderableActor::DownCast()");
63
64   ImageActor imageActor = ImageActor::New();
65
66   Actor anActor = Actor::New();
67   anActor.Add( imageActor );
68
69   Actor child = anActor.GetChildAt(0);
70   RenderableActor renderableActor = RenderableActor::DownCast( child );
71   DALI_TEST_CHECK( renderableActor );
72
73   renderableActor.Reset();
74   DALI_TEST_CHECK( !renderableActor );
75
76   renderableActor = DownCast< RenderableActor >( child );
77   DALI_TEST_CHECK( renderableActor );
78
79   renderableActor = DownCast< RenderableActor >( anActor );
80   DALI_TEST_CHECK( !renderableActor );
81
82   Actor unInitialzedActor;
83   renderableActor = RenderableActor::DownCast( unInitialzedActor );
84   DALI_TEST_CHECK( !renderableActor );
85
86   renderableActor = DownCast< RenderableActor >( unInitialzedActor );
87   DALI_TEST_CHECK( !renderableActor );
88   END_TEST;
89 }
90
91 int UtcDaliRenderableActorSetSortModifier(void)
92 {
93   TestApplication application;
94
95   tet_infoline("Testing Dali::RenderableActor::SetSortModifier()");
96
97   float val = -500.0f;
98
99   ImageActor actor = ImageActor::New();
100   Stage::GetCurrent().Add(actor);
101
102   actor.SetSortModifier( val );
103
104   float returnValue = actor.GetSortModifier();
105
106   //Verify through actor api
107   DALI_TEST_EQUALS(returnValue, val, TEST_LOCATION);
108
109   Stage::GetCurrent().Remove(actor);
110
111
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 );
119   actor1.SetSize(1,1);
120   actor1.SetPosition( 0, 0, 0);
121   actor1.SetSortModifier( gActor1SortModifierValue );
122   actor1.SetColor( Vector4(1, 1, 1, 0.5f ) ); // 50% transparent
123   actor2.SetSize(1,1);
124   actor2.SetPosition( 0, 0, 1);
125   actor2.SetSortModifier( gActor2SortModifierValue );
126   actor2.SetColor( Vector4(1, 1, 1, 0.5f ) ); // 50% transparent
127
128   // add to stage
129    Stage::GetCurrent().Add( actor1 );
130    Stage::GetCurrent().Add( actor2 );
131
132    Layer root = Stage::GetCurrent().GetLayer( 0 );
133    root.SetSortFunction( TestSortFunction );
134
135    // flush the queue and render once
136    application.SendNotification();
137    application.Render();
138
139    DALI_TEST_CHECK( gIsActor1SortModifierCorrect && gIsActor2SortModifierCorrect );
140    END_TEST;
141
142 }
143
144 int UtcDaliRenderableActorGetSortModifier(void)
145 {
146   TestApplication application;
147
148   tet_infoline("Testing Dali::RenderableActor::GetSortModifier()");
149
150   ImageActor actor = ImageActor::New();
151   Stage::GetCurrent().Add(actor);
152
153   DALI_TEST_EQUALS(actor.GetSortModifier(), 0.0f, TEST_LOCATION);
154
155   Stage::GetCurrent().Remove(actor);
156   END_TEST;
157 }
158
159 int UtcDaliRenderableActorSetGetBlendMode(void)
160 {
161   TestApplication application;
162
163   tet_infoline("Testing Dali::RenderableActor::SetBlendMode() / Dali::RenderableActor::GetBlendMode()");
164
165   ImageActor actor = ImageActor::New();
166
167   actor.SetBlendMode( BlendingMode::OFF );
168   DALI_TEST_CHECK( BlendingMode::OFF == actor.GetBlendMode() );
169
170   actor.SetBlendMode( BlendingMode::AUTO );
171   DALI_TEST_CHECK( BlendingMode::AUTO == actor.GetBlendMode() );
172
173   actor.SetBlendMode( BlendingMode::ON );
174   DALI_TEST_CHECK( BlendingMode::ON == actor.GetBlendMode() );
175   END_TEST;
176 }
177
178 int UtcDaliRenderableActorSetCullFace(void)
179 {
180   TestApplication application;
181
182   tet_infoline("Testing Dali::RenderableActor::SetCullFace()");
183
184   BufferImage img = BufferImage::New( 1,1 );
185   ImageActor actor = ImageActor::New( img );
186   ImageActor actor2 = ImageActor::New( img );
187
188   actor.SetSize(100.0f, 100.0f);
189   actor.SetParentOrigin(ParentOrigin::CENTER);
190   actor.SetAnchorPoint(AnchorPoint::CENTER);
191
192   actor2.SetSize(100.0f, 100.0f);
193   actor2.SetParentOrigin(ParentOrigin::CENTER);
194   actor2.SetAnchorPoint(AnchorPoint::CENTER);
195
196   Stage::GetCurrent().Add(actor);
197   Stage::GetCurrent().Add(actor2);
198
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 );
204
205   // flush the queue and render once
206   application.SendNotification();
207   application.Render();
208
209   cullFaceTrace.Enable(false);
210   std::stringstream out;
211
212   //Verify actor gl state
213   out.str("");
214   out << GL_BLEND;
215   DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(0, "Enable", out.str()), true, TEST_LOCATION);
216
217   out.str("");
218   out << GL_CULL_FACE;
219   DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(1, "Enable", out.str()), true, TEST_LOCATION);
220
221   out.str("");
222   out << GL_FRONT_AND_BACK;
223   DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(2, "CullFace", out.str()), true, TEST_LOCATION);
224
225   //Verify actor2 gl state
226   out.str("");
227   out << GL_CULL_FACE;
228   DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(3, "Disable", out.str()), true, TEST_LOCATION);
229
230   //Verify state through the actor api
231   DALI_TEST_CHECK( CullFrontAndBack == actor.GetCullFace() );
232   DALI_TEST_CHECK( CullNone == actor2.GetCullFace() );
233
234   /**************************************************************/
235
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 );
240
241   // flush the queue and render once
242   application.SendNotification();
243   application.Render();
244
245   cullFaceTrace.Enable(false);
246
247   //Verify actor gl state
248   out.str("");
249   out << GL_CULL_FACE;
250   DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(0, "Enable", out.str()), true, TEST_LOCATION);
251
252   out.str("");
253   out << GL_FRONT_AND_BACK;
254   DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(1, "CullFace", out.str()), true, TEST_LOCATION);
255
256   //Verify actor2 gl state
257   out.str("");
258   out << GL_CULL_FACE;
259   DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(2, "Enable", out.str()), true, TEST_LOCATION);
260
261   out.str("");
262   out << GL_FRONT;
263   DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(3, "CullFace", out.str()), true, TEST_LOCATION);
264
265   //Verify state through the actor api
266   DALI_TEST_CHECK( CullFrontAndBack == actor.GetCullFace() );
267   DALI_TEST_CHECK( CullFront == actor2.GetCullFace() );
268
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 );
275
276   // flush the queue and render once
277   application.SendNotification();
278   application.Render();
279
280   cullFaceTrace.Enable(false);
281
282   out.str("");
283   out << GL_CULL_FACE;
284   DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(0, "Disable", out.str()), true, TEST_LOCATION);
285
286   //Verify state through the actor api
287   DALI_TEST_CHECK( CullNone == actor.GetCullFace() );
288   DALI_TEST_CHECK( CullNone == actor2.GetCullFace() );
289
290   Stage::GetCurrent().Remove(actor);
291   Stage::GetCurrent().Remove(actor2);
292   END_TEST;
293 }
294
295 int UtcDaliRenderableActorGetCullFace(void)
296 {
297   TestApplication application;
298
299   tet_infoline("Testing Dali::RenderableActor::GetCullFace()");
300
301   ImageActor imageActor = ImageActor::New();
302
303   DALI_TEST_CHECK( CullNone == imageActor.GetCullFace() );
304
305   imageActor.SetCullFace( CullBack );
306
307   DALI_TEST_CHECK( CullBack == imageActor.GetCullFace() );
308
309   END_TEST;
310 }
311
312 int UtcDaliRenderableActorSetGetBlendFunc(void)
313 {
314   TestApplication application;
315   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
316
317   tet_infoline("Testing Dali::RenderableActor::UtcDaliRenderableActorSetGetBlendFunc()");
318
319   BufferImage img = BufferImage::New( 1,1 );
320   ImageActor actor = ImageActor::New( img );
321   Stage::GetCurrent().Add( actor );
322   application.SendNotification();
323   application.Render();
324
325   // Test the defaults as documented int blending.h
326   {
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 );
336   }
337
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 );
340
341   // Test that Set was successful
342   {
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 );
352   }
353
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 );
361
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 );
365
366   // Test that Set was successful
367   {
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 );
377   }
378
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 );
386   END_TEST;
387 }
388
389 int UtcDaliRenderableActorSetGetAlpha(void)
390 {
391   TestApplication application;
392
393   tet_infoline("Testing Dali::RenderableActor::SetGetAlpha()");
394
395   BufferImage img = BufferImage::New( 1,1 );
396   ImageActor actor = ImageActor::New( img );
397   Stage::GetCurrent().Add( actor );
398   application.SendNotification();
399   application.Render();
400
401   // use the image alpha on actor
402   actor.SetBlendMode(BlendingMode::ON);
403
404   // Test that Set was successful
405   DALI_TEST_EQUALS( BlendingMode::ON, actor.GetBlendMode(), TEST_LOCATION );
406
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 );
410   END_TEST;
411 }
412
413 int UtcDaliRenderableActorCreateDestroy(void)
414 {
415   tet_infoline("Testing Dali::RenderableActor::CreateDestroy()");
416   RenderableActor* ractor = new RenderableActor;
417   RenderableActor ractor2( *ractor );
418   DALI_TEST_CHECK( ractor );
419   delete ractor;
420   END_TEST;
421 }
422
423 int UtcDaliRenderableActorSetGetFilterModes(void)
424 {
425   TestApplication application;
426
427   tet_infoline("Testing Dali::RenderableActor::SetFilterMode() / Dali::RenderableActor::GetFilterMode()");
428
429   ImageActor actor = ImageActor::New();
430
431   FilterMode::Type minifyFilter = FilterMode::NEAREST;
432   FilterMode::Type magnifyFilter = FilterMode::NEAREST;
433
434   // Default test
435   actor.GetFilterMode( minifyFilter, magnifyFilter );
436   DALI_TEST_CHECK( FilterMode::DEFAULT == minifyFilter );
437   DALI_TEST_CHECK( FilterMode::DEFAULT == magnifyFilter );
438
439   // Default/Default
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 );
444
445   // Nearest/Nearest
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 );
450
451   // Linear/Linear
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 );
456
457   // Nearest/Linear
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 );
462
463   // Linear/Nearest
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 );
468
469   END_TEST;
470 }
471
472 int UtcDaliRenderableActorSetFilterMode(void)
473 {
474   TestApplication application;
475
476   tet_infoline("Testing Dali::RenderableActor::SetFilterMode()");
477
478   BufferImage img = BufferImage::New( 1,1 );
479   ImageActor actor = ImageActor::New( img );
480
481   actor.SetSize(100.0f, 100.0f);
482   actor.SetParentOrigin(ParentOrigin::CENTER);
483   actor.SetAnchorPoint(AnchorPoint::CENTER);
484
485   Stage::GetCurrent().Add(actor);
486
487   /**************************************************************/
488
489   // Default/Default
490   TraceCallStack& texParameterTrace = application.GetGlAbstraction().GetTexParameterTrace();
491   texParameterTrace.Reset();
492   texParameterTrace.Enable( true );
493
494   actor.SetFilterMode( FilterMode::DEFAULT, FilterMode::DEFAULT );
495
496   // Flush the queue and render once
497   application.SendNotification();
498   application.Render();
499
500   texParameterTrace.Enable( false );
501
502   std::stringstream out;
503
504   // Verify actor gl state
505
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);
509
510   out.str("");
511   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_LINEAR;
512   DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(2, "TexParameteri", out.str()), true, TEST_LOCATION);
513
514   /**************************************************************/
515
516   // Default/Default
517   texParameterTrace = application.GetGlAbstraction().GetTexParameterTrace();
518   texParameterTrace.Reset();
519   texParameterTrace.Enable( true );
520
521   actor.SetFilterMode( FilterMode::DEFAULT, FilterMode::DEFAULT );
522
523   // Flush the queue and render once
524   application.SendNotification();
525   application.Render();
526
527   texParameterTrace.Enable( false );
528
529   // Verify actor gl state
530
531   // Should not make any calls when settings are the same
532   DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 0, TEST_LOCATION);
533
534   /**************************************************************/
535
536   // Nearest/Nearest
537   texParameterTrace.Reset();
538   texParameterTrace.Enable( true );
539
540   actor.SetFilterMode( FilterMode::NEAREST, FilterMode::NEAREST );
541
542   // Flush the queue and render once
543   application.SendNotification();
544   application.Render();
545
546   texParameterTrace.Enable( false );
547
548   // Verify actor gl state
549   DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 2, TEST_LOCATION);
550
551   out.str("");
552   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_NEAREST;
553   DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
554
555   out.str("");
556   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MAG_FILTER << ", " << GL_NEAREST;
557   DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(1, "TexParameteri", out.str()), true, TEST_LOCATION);
558
559   /**************************************************************/
560
561   // Linear/Linear
562   texParameterTrace.Reset();
563   texParameterTrace.Enable( true );
564
565   actor.SetFilterMode( FilterMode::LINEAR, FilterMode::LINEAR );
566
567   // Flush the queue and render once
568   application.SendNotification();
569   application.Render();
570
571   texParameterTrace.Enable( false );
572
573   // Verify actor gl state
574   DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 2, TEST_LOCATION);
575
576   out.str("");
577   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_LINEAR;
578   DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
579
580   out.str("");
581   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MAG_FILTER << ", " << GL_LINEAR;
582   DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(1, "TexParameteri", out.str()), true, TEST_LOCATION);
583
584
585   /**************************************************************/
586
587   // Nearest/Linear
588   texParameterTrace.Reset();
589   texParameterTrace.Enable( true );
590
591   actor.SetFilterMode( FilterMode::NEAREST, FilterMode::LINEAR );
592
593   // Flush the queue and render once
594   application.SendNotification();
595   application.Render();
596
597   texParameterTrace.Enable( false );
598
599   // Verify actor gl state
600   DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 1, TEST_LOCATION);
601
602   out.str("");
603   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_NEAREST;
604   DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
605
606   /**************************************************************/
607
608   // Default/Default
609   texParameterTrace.Reset();
610   texParameterTrace.Enable( true );
611
612   actor.SetFilterMode( FilterMode::DEFAULT, FilterMode::DEFAULT );
613
614   // Flush the queue and render once
615   application.SendNotification();
616   application.Render();
617
618   texParameterTrace.Enable( false );
619
620   // Verify actor gl state
621   DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 1, TEST_LOCATION);
622
623   out.str("");
624   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_LINEAR;
625   DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
626
627   /**************************************************************/
628
629   // None/None
630   texParameterTrace.Reset();
631   texParameterTrace.Enable( true );
632
633   actor.SetFilterMode( FilterMode::NONE, FilterMode::NONE );
634
635   // Flush the queue and render once
636   application.SendNotification();
637   application.Render();
638
639   texParameterTrace.Enable( false );
640
641   // Verify actor gl state
642   DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 1, TEST_LOCATION);
643
644   out.str("");
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);
647
648   /**************************************************************/
649
650   Stage::GetCurrent().Remove(actor);
651
652   END_TEST;
653 }
654
655 int UtcDaliRenderableActorSetShaderEffect(void)
656 {
657   TestApplication application;
658   BufferImage img = BufferImage::New( 1,1 );
659   ImageActor actor = ImageActor::New( img );
660   Stage::GetCurrent().Add( actor );
661
662   // flush the queue and render once
663   application.SendNotification();
664   application.Render();
665   GLuint lastShaderCompiledBefore = application.GetGlAbstraction().GetLastShaderCompiled();
666
667   application.GetGlAbstraction().EnableShaderCallTrace( true );
668
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() );
673
674   actor.SetShaderEffect( effect );
675   DALI_TEST_CHECK( effect == actor.GetShaderEffect() );
676
677   // flush the queue and render once
678   application.SendNotification();
679   application.Render();
680
681   GLuint lastShaderCompiledAfter = application.GetGlAbstraction().GetLastShaderCompiled();
682   DALI_TEST_EQUALS( lastShaderCompiledAfter, lastShaderCompiledBefore + 2, TEST_LOCATION );
683
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 );
690
691   END_TEST;
692 }
693
694 int UtcDaliRenderableActorGetShaderEffect(void)
695 {
696   TestApplication application;
697   ImageActor actor = ImageActor::New();
698
699   ShaderEffect effect = ShaderEffect::New("UtcDaliRenderableActorGetShaderEffect-VertexSource", "UtcDaliRenderableActorGetShaderEffect-FragmentSource" );
700   actor.SetShaderEffect(effect);
701
702   DALI_TEST_CHECK(effect == actor.GetShaderEffect());
703   END_TEST;
704 }
705
706 int UtcDaliRenderableActorRemoveShaderEffect01(void)
707 {
708   TestApplication application;
709   ImageActor actor = ImageActor::New();
710
711   ShaderEffect defaultEffect = actor.GetShaderEffect();
712
713   ShaderEffect effect = ShaderEffect::New("UtcDaliRenderableActorRemoveShaderEffect-VertexSource", "UtcDaliRenderableActorRemoveShaderEffect-FragmentSource" );
714   actor.SetShaderEffect(effect);
715
716   DALI_TEST_CHECK(effect == actor.GetShaderEffect());
717
718   actor.RemoveShaderEffect();
719
720   DALI_TEST_CHECK(defaultEffect == actor.GetShaderEffect());
721   END_TEST;
722 }
723
724 int UtcDaliRenderableActorRemoveShaderEffect02(void)
725 {
726   TestApplication application;
727   ImageActor actor = ImageActor::New();
728
729   ShaderEffect defaultEffect = actor.GetShaderEffect();
730
731   actor.RemoveShaderEffect();
732
733   DALI_TEST_CHECK(defaultEffect == actor.GetShaderEffect());
734   END_TEST;
735 }
736
737 int UtcDaliSetShaderEffectRecursively(void)
738 {
739   TestApplication application;
740   /**
741    * create a tree
742    *                 actor1
743    *           actor2       actor4
744    *       actor3 imageactor1
745    * imageactor2
746    */
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 );
760
761   // flush the queue and render once
762   application.SendNotification();
763   application.Render();
764   GLuint lastShaderCompiledBefore = application.GetGlAbstraction().GetLastShaderCompiled();
765
766   application.GetGlAbstraction().EnableShaderCallTrace( true );
767
768   const std::string vertexShader = "UtcDaliRenderableActorSetShaderEffect-VertexSource";
769   const std::string fragmentShader = "UtcDaliRenderableActorSetShaderEffect-FragmentSource";
770   // test with empty effect
771   ShaderEffect effect;
772   SetShaderEffectRecursively( actor1, effect );
773
774   effect = ShaderEffect::New(vertexShader, fragmentShader );
775
776   DALI_TEST_CHECK( effect != actor1.GetShaderEffect() );
777   DALI_TEST_CHECK( effect != imageactor1.GetShaderEffect() );
778   DALI_TEST_CHECK( effect != imageactor2.GetShaderEffect() );
779
780   SetShaderEffectRecursively( actor1, effect );
781   DALI_TEST_CHECK( effect == imageactor1.GetShaderEffect() );
782   DALI_TEST_CHECK( effect == imageactor2.GetShaderEffect() );
783
784   // flush the queue and render once
785   application.SendNotification();
786   application.Render();
787
788   GLuint lastShaderCompiledAfter = application.GetGlAbstraction().GetLastShaderCompiled();
789   DALI_TEST_EQUALS( lastShaderCompiledAfter, lastShaderCompiledBefore + 2, TEST_LOCATION );
790
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 );
797
798   // remove from one that does not have shader
799   RemoveShaderEffectRecursively( actor4 );
800
801   // remove partially
802   RemoveShaderEffectRecursively( actor3 );
803   DALI_TEST_CHECK( effect == imageactor1.GetShaderEffect() );
804   DALI_TEST_CHECK( effect != imageactor2.GetShaderEffect() );
805
806   // test with empty actor just to check it does not crash
807   Actor empty;
808   SetShaderEffectRecursively( empty, effect );
809   RemoveShaderEffectRecursively( empty );
810
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 );
816
817   END_TEST;
818 }
819
820 int UtcDaliRenderableActorTestClearCache01(void)
821 {
822   // Testing the framebuffer state caching in frame-buffer-state-caching.cpp
823   TestApplication application;
824
825   tet_infoline("Testing Dali::RenderableActor::ClearCache01()");
826
827   BufferImage img = BufferImage::New( 1,1 );
828   ImageActor actor = ImageActor::New( img );
829
830   actor.SetParentOrigin(ParentOrigin::CENTER);
831   actor.SetAnchorPoint(AnchorPoint::CENTER);
832
833   Stage::GetCurrent().Add(actor);
834
835   /**************************************************************/
836   // Flush the queue and render once
837   application.SendNotification();
838   application.Render();
839
840   // There should be a single call to Clear
841   DALI_TEST_EQUALS( application.GetGlAbstraction().GetClearCountCalled() , 1u, TEST_LOCATION );
842
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 );
848
849   END_TEST;
850 }
851
852 int UtcDaliRenderableActorTestClearCache02(void)
853 {
854   // Testing the framebuffer state caching in frame-buffer-state-caching.cpp
855   TestApplication application;
856
857   tet_infoline("Testing Dali::RenderableActor::ClearCache02()");
858
859   // use RGB so alpha is disabled and the actors are drawn opaque
860   BufferImage img = BufferImage::New( 10,10 ,Pixel::RGB888 );
861
862   // Without caching DALi perform clears in the following places
863   // Root
864   // | glClear #1 ( everything at start of frame )
865   // |
866   // |
867   // | glClear #2 ( start of layer with opaque actors )
868   // | ----> Layer1
869   // |     -> Actor 1 ( opaque )
870   // |     -> Actor 2 ( opaque )
871   // |
872   // |
873   // | glClear  #3 ( start of layer with opaque actors )
874   // |----> Layer 2
875   // |     -> Actor 3 ( opaque )
876   // |     -> Actor 4 ( opaque )
877   //
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
882
883   Layer layer1 = Layer::New();
884   layer1.Add( ImageActor::New( img ) );
885   layer1.Add( ImageActor::New( img ) );
886
887   Layer layer2 = Layer::New();
888   layer2.Add( ImageActor::New( img ) );
889   layer2.Add( ImageActor::New( img ) );
890
891   Stage::GetCurrent().Add( layer1 );
892   Stage::GetCurrent().Add( layer2 );
893
894   /**************************************************************/
895
896   // Flush the queue and render once
897   application.SendNotification();
898   application.Render();
899
900   // There should be a 2 calls to Clear
901   DALI_TEST_EQUALS( application.GetGlAbstraction().GetClearCountCalled() , 2u, TEST_LOCATION );
902
903   // the last set clear mask should be  DEPTH & STENCIL & COLOR
904   GLbitfield mask = application.GetGlAbstraction().GetLastClearMask();
905
906   tet_printf(" clear count = %d \n",  application.GetGlAbstraction().GetClearCountCalled() );
907
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 ) );
912
913   END_TEST;
914 }
915
916 int UtcDaliRenderableActorTestClearCache03(void)
917 {
918   // Testing the framebuffer state caching in frame-buffer-state-caching.cpp
919   TestApplication application;
920
921   tet_infoline("Testing Dali::RenderableActor::ClearCache03()");
922
923   // use RGB so alpha is disabled and the actors are drawn opaque
924   BufferImage img = BufferImage::New( 10,10 ,Pixel::RGB888 );
925
926   // Without caching DALi perform clears in the following places
927   // Root
928   // | 1-## glClear ( COLOR, DEPTH, STENCIL )
929   // |
930   // | ----> Layer1
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 )
936   // |
937   // |
938   // |----> Layer 2
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 )
944   //
945   // With caching enabled glClear will not be called at ## 2 and ## 3 ( because those buffers are already clear).
946   //
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.
950   //
951
952   Layer layer1 = Layer::New();
953   ImageActor actor1 =  ImageActor::New( img );
954   ImageActor actor2 =  ImageActor::New( img );
955   ImageActor actor3 =  ImageActor::New( img );
956
957   actor2.SetDrawMode( DrawMode::STENCIL );
958
959   layer1.Add( actor1 );
960   layer1.Add( actor2 );
961   layer1.Add( actor3 );
962
963   Layer layer2 = Layer::New();
964   ImageActor actor4 =  ImageActor::New( img );
965   ImageActor actor5 =  ImageActor::New( img );
966   ImageActor actor6 =  ImageActor::New( img );
967
968   actor4.SetDrawMode( DrawMode::STENCIL );
969
970   layer2.Add( actor4 );
971   layer2.Add( actor5 );
972   layer2.Add( actor6 );
973
974   Stage::GetCurrent().Add( layer1 );
975   Stage::GetCurrent().Add( layer2 );
976
977
978   /**************************************************************/
979
980   // Flush the queue and render once
981   application.SendNotification();
982   application.Render();
983
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 );
986
987   // the last set clear mask should be  DEPTH & STENCIL & COLOR
988   GLbitfield mask = application.GetGlAbstraction().GetLastClearMask();
989
990   tet_printf(" clear count = %d \n",  application.GetGlAbstraction().GetClearCountCalled() );
991   tet_printf(" clear mask  = %x \n",  mask);
992
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 );
997
998
999   END_TEST;
1000 }