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-test-suite-utils.h>
26 void utc_dali_shader_effect_startup(void)
28 test_return_value = TET_UNDEF;
31 void utc_dali_shader_effect_cleanup(void)
33 test_return_value = TET_PASS;
39 static const char* VertexSource =
40 "This is a custom vertex shader\n"
41 "made on purpose to look nothing like a normal vertex shader inside dali\n";
43 static const char* FragmentSource =
44 "This is a custom fragment shader\n"
45 "made on purpose to look nothing like a normal fragment shader inside dali\n";
47 static const char* FragmentSourceUsingExtensions =
48 "This is a custom fragment shader using extensions\n"
49 "made on purpose to look nothing like a normal fragment shader inside dali\n";
51 const int GETSOURCE_BUFFER_SIZE = 0x10000;
54 struct TestConstraintToVector3
56 TestConstraintToVector3(Vector3 target)
61 Vector3 operator()(const Vector3& current)
69 struct TestConstraintFromPositionToVector3
71 TestConstraintFromPositionToVector3()
75 Vector3 operator()(const Vector3& current, const PropertyInput& position)
78 return position.GetVector3();
82 struct TestConstraintToVector3Double
84 TestConstraintToVector3Double(Vector3 target)
89 Vector3 operator()(const Vector3& current)
91 return mTarget * 2.0f;
97 class ShaderEffectExtension : public ShaderEffect::Extension {};
100 class TestExtension : public ShaderEffect::Extension
103 TestExtension( bool& deleted )
123 int UtcDaliShaderEffectMethodNew01(void)
125 TestApplication application;
127 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
128 DALI_TEST_CHECK(effect);
132 int UtcDaliShaderEffectMethodNew02(void)
134 TestApplication application;
140 // New must be called to create a ShaderEffect or it wont be valid.
141 effect.SetUniform( "uUniform", 0 );
142 DALI_TEST_CHECK( false );
144 catch (Dali::DaliException& e)
146 // Tests that a negative test of an assertion succeeds
147 tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
148 DALI_TEST_CHECK( !effect );
153 int UtcDaliShaderEffectMethodNew03(void)
155 TestApplication application;
157 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource, VertexSource, FragmentSource, ShaderEffect::HINT_NONE );
158 DALI_TEST_CHECK(effect);
162 int UtcDaliShaderEffectMethodNew04(void)
164 TestApplication application;
165 tet_infoline("Testing prefixed version of Dali::ShaderEffect::New()");
167 std::string fragmentShaderPrefix = "#define TEST_FS 1\n#extension GL_OES_standard_derivatives : enable";
168 std::string vertexShaderPrefix = "#define TEST_VS 1";
172 // Call render to compile default shaders.
173 application.SendNotification();
174 application.Render();
175 application.Render();
176 application.Render();
178 GLuint lastShaderCompiledBefore = application.GetGlAbstraction().GetLastShaderCompiled();
179 ShaderEffect effect = ShaderEffect::NewWithPrefix( vertexShaderPrefix, VertexSource,
180 fragmentShaderPrefix, FragmentSourceUsingExtensions,
181 GEOMETRY_TYPE_IMAGE, ShaderEffect::HINT_NONE );
183 BitmapImage image = CreateBitmapImage();
184 ImageActor actor = ImageActor::New( image );
185 actor.SetSize( 100.0f, 100.0f );
186 actor.SetName("TestImageFilenameActor");
187 actor.SetShaderEffect(effect);
188 Stage::GetCurrent().Add(actor);
190 application.SendNotification();
191 application.Render();
192 GLuint lastShaderCompiledAfter = application.GetGlAbstraction().GetLastShaderCompiled();
193 bool testResult = false;
195 // we should have compiled 2 shaders.
196 DALI_TEST_EQUALS( lastShaderCompiledAfter, lastShaderCompiledBefore + 2, TEST_LOCATION );
198 char testVertexSourceResult[GETSOURCE_BUFFER_SIZE];
199 char testFragmentSourceResult[GETSOURCE_BUFFER_SIZE];
201 // we are interested in the first two.
202 GLuint vertexShaderId = lastShaderCompiledBefore + 1;
203 GLuint fragmentShaderId = lastShaderCompiledBefore + 2;
205 GLsizei lengthVertexResult;
206 GLsizei lengthFragmentResult;
208 application.GetGlAbstraction().GetShaderSource(vertexShaderId, GETSOURCE_BUFFER_SIZE, &lengthVertexResult, testVertexSourceResult);
209 application.GetGlAbstraction().GetShaderSource(fragmentShaderId, GETSOURCE_BUFFER_SIZE, &lengthFragmentResult, testFragmentSourceResult);
211 int vertexShaderHasPrefix = strncmp(testVertexSourceResult, "#define ", strlen("#define "));
212 int fragmentShaderHasPrefix = strncmp(testFragmentSourceResult, "#define ", strlen("#define "));
213 testResult = (vertexShaderHasPrefix == 0) && (fragmentShaderHasPrefix == 0);
215 DALI_TEST_CHECK(testResult);
217 catch(Dali::DaliException& e)
219 tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
220 tet_result( TET_FAIL );
225 int UtcDaliShaderEffectMethodNew05(void)
227 TestApplication application;
229 // heap constructor / destructor
230 DefaultFunctionCoverage<ShaderEffect> shaderEffect;
231 DefaultFunctionCoverage<ShaderEffectExtension> shaderEffectExtension;
236 int UtcDaliShaderEffectMethodNew06(void)
238 TestApplication application;
239 tet_infoline("Testing Dali::ShaderEffect::New() with shader sources for different geometry types");
241 ShaderEffect effect = ShaderEffect::New( "imageVertexShader", "imageFragmentShader",
242 "textVertexShader", "textFragmentShader",
243 "texturedMeshVertexShader", "texturedMeshFragmentShader",
244 "meshVertexShader", "meshFragmentShader",
245 ShaderEffect::HINT_NONE );
246 DALI_TEST_CHECK(effect);
251 int UtcDaliShaderEffectMethodDownCast(void)
253 TestApplication application;
254 tet_infoline("Testing Dali::ShaderEffect::DownCast()");
256 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
258 BaseHandle object(effect);
260 ShaderEffect effect2 = ShaderEffect::DownCast(object);
261 DALI_TEST_CHECK(effect2);
263 ShaderEffect effect3 = DownCast< ShaderEffect >(object);
264 DALI_TEST_CHECK(effect3);
266 BaseHandle unInitializedObject;
267 ShaderEffect effect4 = ShaderEffect::DownCast(unInitializedObject);
268 DALI_TEST_CHECK(!effect4);
270 ShaderEffect effect5 = DownCast< ShaderEffect >(unInitializedObject);
271 DALI_TEST_CHECK(!effect5);
275 int UtcDaliShaderEffectMethodDelete01(void)
277 TestApplication application;
279 // get the default shaders built, this is not required but makes it
280 // easier to debug the TET case and isolate the custom shader compilation.
281 application.SendNotification();
282 application.Render();
284 // create a new shader effect
285 // the vertex and fragment shader will be cached in the ShaderFactory
286 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
288 // destroy the shader effect
291 // Create the same shader effect again, this should now use the cached version
292 // held in the shader factory
293 effect= ShaderEffect::New( VertexSource, FragmentSource );
295 // Compile the shader effect
296 application.SendNotification();
297 application.Render();
299 GLuint lastShaderCompiled = application.GetGlAbstraction().GetLastShaderCompiled();
301 // get the vertex shader (compiled before fragment shader).
302 // this last shaders compiled is for text.
303 GLuint vertexShaderId = lastShaderCompiled - 1;
305 // compare the vertex shader sent to be compiled, with the shader string that ended up being compiled
306 // this is to confirm the string hasn't been deleted / corrupted.
307 std::string actualVertexShader = application.GetGlAbstraction().GetShaderSource( vertexShaderId );
308 DALI_TEST_EQUALS( VertexSource,
309 actualVertexShader.substr( actualVertexShader.length() - strlen( VertexSource ) ), TEST_LOCATION );
314 int UtcDaliShaderEffectMethodSetUniformFloat(void)
316 TestApplication application;
318 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
319 DALI_TEST_CHECK( effect );
321 BitmapImage image = CreateBitmapImage();
323 effect.SetUniform( "uFloat", 1.0f );
325 ImageActor actor = ImageActor::New( image );
326 actor.SetSize( 100.0f, 100.0f );
327 actor.SetName("TestImageFilenameActor");
328 actor.SetShaderEffect(effect);
329 Stage::GetCurrent().Add(actor);
331 application.SendNotification();
332 application.Render();
335 application.GetGlAbstraction().CheckUniformValue(
340 int UtcDaliShaderEffectMethodSetUniformVector2(void)
342 TestApplication application;
344 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
345 DALI_TEST_CHECK( effect );
347 BitmapImage image = CreateBitmapImage();
349 effect.SetUniform( "uVec2", Vector2( 2.0f, 3.0f ) );
351 ImageActor actor = ImageActor::New( image );
352 actor.SetSize( 100.0f, 100.0f );
353 actor.SetName("TestImageFilenameActor");
354 actor.SetShaderEffect(effect);
355 Stage::GetCurrent().Add(actor);
357 application.SendNotification();
358 application.Render();
361 application.GetGlAbstraction().CheckUniformValue(
362 "uVec2", Vector2( 2.0f, 3.0f ) ) );
366 int UtcDaliShaderEffectMethodSetUniformVector3(void)
368 TestApplication application;
370 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
371 DALI_TEST_CHECK( effect );
373 BitmapImage image = CreateBitmapImage();
375 effect.SetUniform( "uVec3", Vector3( 4.0f, 5.0f, 6.0f ) );
377 ImageActor actor = ImageActor::New( image );
378 actor.SetSize( 100.0f, 100.0f );
379 actor.SetName("TestImageFilenameActor");
380 actor.SetShaderEffect(effect);
381 Stage::GetCurrent().Add(actor);
383 application.SendNotification();
384 application.Render();
387 application.GetGlAbstraction().CheckUniformValue(
388 "uVec3", Vector3( 4.0f, 5.0f, 6.0f ) ) );
392 int UtcDaliShaderEffectMethodSetUniformVector4(void)
394 TestApplication application;
396 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
397 DALI_TEST_CHECK( effect );
399 BitmapImage image = CreateBitmapImage();
401 effect.SetUniform( "uVec4", Vector4( 7.0f, 8.0f, 9.0f, 10.0f ) );
403 ImageActor actor = ImageActor::New( image );
404 actor.SetSize( 100.0f, 100.0f );
405 actor.SetName("TestImageFilenameActor");
406 actor.SetShaderEffect(effect);
407 Stage::GetCurrent().Add(actor);
409 application.SendNotification();
410 application.Render();
413 application.GetGlAbstraction().CheckUniformValue(
414 "uVec4", Vector4( 7.0f, 8.0f, 9.0f, 10.0f ) ) );
418 int UtcDaliShaderEffectMethodSetUniformMatrix(void)
420 TestApplication application;
422 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
423 DALI_TEST_CHECK( effect );
425 BitmapImage image = CreateBitmapImage();
427 effect.SetUniform( "uModelView", Matrix::IDENTITY );
429 ImageActor actor = ImageActor::New( image );
430 actor.SetSize( 100.0f, 100.0f );
431 actor.SetName("TestImageFilenameActor");
432 actor.SetShaderEffect(effect);
433 Stage::GetCurrent().Add(actor);
435 application.SendNotification();
436 application.Render();
439 application.GetGlAbstraction().CheckUniformValue(
440 "uModelView", Matrix::IDENTITY ) );
444 int UtcDaliShaderEffectMethodSetUniformMatrix3(void)
446 TestApplication application;
448 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
449 DALI_TEST_CHECK( effect );
451 BitmapImage image = CreateBitmapImage();
453 Matrix3 matIdentity(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f);
454 effect.SetUniform( "uMatrix3", matIdentity );
456 ImageActor actor = ImageActor::New( image );
457 actor.SetSize( 100.0f, 100.0f );
458 actor.SetName("TestImageFilenameActor");
459 actor.SetShaderEffect(effect);
460 Stage::GetCurrent().Add(actor);
462 application.SendNotification();
463 application.Render();
465 DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue("uMatrix3", matIdentity) );
469 int UtcDaliShaderEffectMethodSetUniformViewport(void)
471 TestApplication application;
473 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
474 DALI_TEST_CHECK( effect );
476 BitmapImage image = CreateBitmapImage();
478 ImageActor actor = ImageActor::New( image );
479 actor.SetSize( 100.0f, 100.0f );
480 actor.SetName("TestImageFilenameActor");
481 actor.SetShaderEffect(effect);
482 Stage::GetCurrent().Add(actor);
484 effect.SetUniform( "uVec2", Vector2( 0.0f, 0.0f ), ShaderEffect::COORDINATE_TYPE_VIEWPORT_POSITION );
485 effect.SetUniform( "uVec2Dir", Vector2( 1.0f, 2.0f ), ShaderEffect::COORDINATE_TYPE_VIEWPORT_DIRECTION );
487 application.SendNotification();
488 application.Render();
490 const Vector2& stageSize(Stage::GetCurrent().GetSize());
493 application.GetGlAbstraction().CheckUniformValue(
494 "uVec2", Vector2( stageSize.x/2, -stageSize.y/2 ) ) );
497 application.GetGlAbstraction().CheckUniformValue(
498 "uVec2Dir", Vector2( -1.0f, 2.0f ) ) );
502 int UtcDaliShaderEffectMethodSetEffectImage(void)
504 TestApplication application;
506 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
507 DALI_TEST_CHECK( effect );
509 BitmapImage image = CreateBitmapImage();
511 effect.SetEffectImage(image);
513 ImageActor actor = ImageActor::New( image );
514 actor.SetSize( 100.0f, 100.0f );
515 actor.SetName("TestImageFilenameActor");
516 actor.SetShaderEffect(effect);
517 Stage::GetCurrent().Add(actor);
519 application.SendNotification();
520 application.Render(16);
521 application.SendNotification();
522 application.Render(16);
523 application.SendNotification();
525 DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "sEffect", 1 ) );
529 int UtcDaliShaderEffectMethodSetEffectImageAndDelete(void)
531 TestApplication application;
533 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
535 BitmapImage effectImage = CreateBitmapImage();
536 effect.SetEffectImage(effectImage);
538 ImageActor actor = ImageActor::New();
540 actor.SetShaderEffect(effect);
543 Stage::GetCurrent().Add(actor);
545 // do an update / render cycle
546 application.SendNotification();
547 application.Render(16);
548 application.SendNotification();
549 application.Render(16);
550 application.SendNotification();
551 application.Render(16);
553 printf("removing image actor from stage and Reseting handle\n");
554 Stage::GetCurrent().Remove(actor);
557 tet_printf("### Update & Render \n");
559 application.SendNotification();
560 application.Render(16);
562 tet_printf("#### Update Only \n");
564 tet_printf("effectImage.Reset \n");
566 // this releases the effect texture resource,
567 // Update will send a DispatchDiscardTexture message to render
569 application.SendNotification();
570 application.UpdateOnly(16);
572 tet_printf("#### Update Only \n");
574 // at this point shader is deleted, during clear discard queue
575 // and it sends a Shader:: DispatchRemoveObserver message to render thread
576 application.UpdateOnly(16);
578 tet_printf("#### Render Only \n");
579 // This is where it used to crash, there is a message in the queue to perform DispatchDiscardTexture
580 // which tries to call observer->TextureDiscarded, where observer == shader that was deleted
581 // in previous update.
582 application.RenderOnly();
585 // process the discard texture message
586 application.RenderOnly();
587 application.SendNotification();
588 application.Render(16);
590 tet_result(TET_PASS);
595 int UtcDaliShaderEffectMethodApplyConstraint(void)
597 // Test whether Shader's uniform can be constrained to a stationary constraint.
598 TestApplication application;
600 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
601 DALI_TEST_CHECK( effect );
603 BitmapImage image = CreateBitmapImage();
605 effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
607 ImageActor actor = ImageActor::New( image );
608 actor.SetSize( 100.0f, 100.0f );
609 actor.SetName("TestImageFilenameActor");
610 actor.SetShaderEffect(effect);
611 Stage::GetCurrent().Add(actor);
613 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
615 application.SendNotification();
616 application.Render();
618 // Test effects of SetUniform...
620 application.GetGlAbstraction().CheckUniformValue(
621 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
623 Constraint constraint = Constraint::New<Vector3>( uVecProperty,
624 TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
626 effect.ApplyConstraint(constraint);
628 application.SendNotification();
629 application.Render();
631 // Test effects of Constraint.
633 application.GetGlAbstraction().CheckUniformValue(
634 "uVec3", Vector3( 4.0f, 9.0f, 16.0f ) ) );
639 int UtcDaliShaderEffectMethodApplyConstraintFromActor(void)
641 // Test whether Shader's uniform can be constrained to Actor's position.
642 TestApplication application;
644 const Vector3 targetPosition = Vector3( 100.0f, 70.0f, 20.0f);
646 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
647 DALI_TEST_CHECK( effect );
649 BitmapImage image = CreateBitmapImage();
651 effect.SetUniform( "uVec3", Vector3( 50.0f, 25.0f, 0.0f ) );
653 ImageActor actor = ImageActor::New( image );
654 actor.SetPosition(targetPosition);
655 actor.SetSize( 100.0f, 100.0f );
656 actor.SetName("TestImageFilenameActor");
657 actor.SetShaderEffect(effect);
658 Stage::GetCurrent().Add(actor);
660 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
662 Constraint constraint = Constraint::New<Vector3>( uVecProperty,
663 Source(actor, Actor::POSITION),
664 TestConstraintFromPositionToVector3() );
666 effect.ApplyConstraint(constraint);
668 application.SendNotification();
669 application.Render();
671 // Test effects of Constraint.
673 application.GetGlAbstraction().CheckUniformValue(
674 "uVec3", targetPosition ) );
678 int UtcDaliShaderEffectMethodApplyConstraintFromActor2(void)
680 // Test whether Shader's uniform can be constrained to Actor's position.
681 // While Actor's position is constrained to another point * 2.0f
682 TestApplication application;
684 const Vector3 targetPosition = Vector3( 25.0f, 36.0f, 49.0f );
686 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
687 DALI_TEST_CHECK( effect );
689 BitmapImage image = CreateBitmapImage();
691 effect.SetUniform( "uVec3", Vector3( 50.0f, 25.0f, 0.0f ) );
693 ImageActor actor = ImageActor::New( image );
694 actor.SetPosition(Vector3( 100.0f, 70.0f, 20.0f));
695 actor.SetSize( 100.0f, 100.0f );
696 actor.SetName("TestImageFilenameActor");
697 actor.SetShaderEffect(effect);
698 Stage::GetCurrent().Add(actor);
700 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
702 Constraint shaderConstraint = Constraint::New<Vector3>( uVecProperty,
703 Source(actor, Actor::POSITION),
704 TestConstraintFromPositionToVector3() );
706 effect.ApplyConstraint(shaderConstraint);
708 Constraint actorConstraint = Constraint::New<Vector3>( Actor::POSITION,
709 TestConstraintToVector3Double(targetPosition) );
711 actor.ApplyConstraint(actorConstraint);
713 application.SendNotification();
714 application.Render();
716 // Test effects of Constraint.
718 application.GetGlAbstraction().CheckUniformValue(
719 "uVec3", targetPosition * 2.0f ) );
723 int UtcDaliShaderEffectMethodApplyConstraintCallback(void)
725 // Test whether Shader's uniform can be constrained to a stationary constraint.
726 TestApplication application;
728 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
729 DALI_TEST_CHECK( effect );
731 BitmapImage image = CreateBitmapImage();
733 effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
735 ImageActor actor = ImageActor::New( image );
736 actor.SetSize( 100.0f, 100.0f );
737 actor.SetName("TestImageFilenameActor");
738 actor.SetShaderEffect(effect);
739 Stage::GetCurrent().Add(actor);
741 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
743 application.SendNotification();
744 application.Render();
746 // Test effects of SetUniform...
748 application.GetGlAbstraction().CheckUniformValue(
749 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
751 Constraint constraint = Constraint::New<Vector3>( uVecProperty,
752 TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
754 constraint.SetApplyTime( 10.0f );
756 bool constraintCheck( false );
757 ConstraintAppliedCheck appliedCheck( constraintCheck );
759 // We should receive the "Applied" signal after 10 seconds
760 ActiveConstraint active = effect.ApplyConstraint(constraint);
761 active.AppliedSignal().Connect( &application, appliedCheck );
763 application.SendNotification();
764 application.Render(static_cast<unsigned int>(1000.0f)); // 1 elapsed second
766 // Check signal has not fired
767 application.SendNotification();
768 appliedCheck.CheckSignalNotReceived();
770 application.Render(static_cast<unsigned int>(4000.0f)); // 5 elapsed seconds
772 // Check signal has not fired
773 application.SendNotification();
774 appliedCheck.CheckSignalNotReceived();
776 application.Render(static_cast<unsigned int>(5000.0f - 1.0f)); // <10 elapsed seconds
778 // Check signal has not fired
779 application.SendNotification();
780 appliedCheck.CheckSignalNotReceived();
782 application.Render(static_cast<unsigned int>(2.0f)); // >10 elapsed seconds
784 // Signal should have fired
785 application.SendNotification();
786 appliedCheck.CheckSignalReceived();
788 // Test effects of Constraint.
790 application.GetGlAbstraction().CheckUniformValue(
791 "uVec3", Vector3( 4.0f, 9.0f, 16.0f ) ) );
795 int UtcDaliShaderEffectMethodRemoveConstraints(void)
797 // Test if constrains can be removed before they are ever applyed.
798 TestApplication application;
800 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
801 DALI_TEST_CHECK( effect );
803 BitmapImage image = CreateBitmapImage();
805 effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
807 ImageActor actor = ImageActor::New( image );
808 actor.SetSize( 100.0f, 100.0f );
809 actor.SetName("TestImageFilenameActor");
810 actor.SetShaderEffect(effect);
811 Stage::GetCurrent().Add(actor);
813 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
815 application.SendNotification();
816 application.Render();
818 // Test effects of SetUniform...
820 application.GetGlAbstraction().CheckUniformValue(
821 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
823 Constraint constraint = Constraint::New<Vector3>( uVecProperty,
824 TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
826 effect.ApplyConstraint(constraint);
828 // Remove the constraints
829 effect.RemoveConstraints();
831 application.SendNotification();
832 application.Render();
834 // Test effects of Constraint.
836 application.GetGlAbstraction().CheckUniformValue(
837 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
841 int UtcDaliShaderEffectMethodRemoveConstraints2(void)
843 // Test whether Shader's uniform constrains can be removed after they are applyed.
844 TestApplication application;
846 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
847 DALI_TEST_CHECK( effect );
849 BitmapImage image = CreateBitmapImage();
851 effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
853 ImageActor actor = ImageActor::New( image );
854 actor.SetSize( 100.0f, 100.0f );
855 actor.SetName("TestImageFilenameActor");
856 actor.SetShaderEffect(effect);
857 Stage::GetCurrent().Add(actor);
859 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
861 application.SendNotification();
862 application.Render();
864 // Test effects of SetUniform...
866 application.GetGlAbstraction().CheckUniformValue(
867 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
869 Constraint constraint = Constraint::New<Vector3>( uVecProperty,
870 TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
872 effect.ApplyConstraint(constraint);
874 application.SendNotification();
875 application.Render();
877 // Reset the value and remove the constraints
878 effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
879 effect.RemoveConstraints();
881 application.SendNotification();
882 application.Render();
884 // Test effects of Constraint.
886 application.GetGlAbstraction().CheckUniformValue(
887 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
891 int UtcDaliShaderEffectMethodCreateExtension(void)
893 // Test creation of a shader extension
894 TestApplication aplication;
898 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
899 DALI_TEST_CHECK( effect );
901 TestExtension* extension = new TestExtension ( deleted );
903 effect.AttachExtension( extension );
905 DALI_TEST_CHECK( static_cast<TestExtension&>(effect.GetExtension()).IsAlive() );
908 DALI_TEST_CHECK( deleted );
912 int UtcDaliShaderEffectMethodCreateExtension2(void)
914 // Test creation of a shader extension
917 TestApplication application;
919 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
920 DALI_TEST_CHECK( effect );
922 BitmapImage image = CreateBitmapImage();
924 effect.SetUniform( "uFloat", 1.0f );
926 ImageActor actor = ImageActor::New( image );
927 actor.SetSize( 100.0f, 100.0f );
928 actor.SetName("TestImageFilenameActor");
929 actor.SetShaderEffect(effect);
930 Stage::GetCurrent().Add(actor);
932 application.SendNotification();
933 application.Render();
935 TestExtension* extension = new TestExtension ( deleted );
937 effect.AttachExtension( extension );
939 const ShaderEffect& constEffect(effect);
940 const TestExtension& ext( static_cast<const TestExtension&>(constEffect.GetExtension()) );
942 DALI_TEST_CHECK( ext.IsAlive() );
945 DALI_TEST_CHECK( deleted );
949 int UtcDaliShaderEffectMethodNoExtension(void)
951 TestApplication application;
957 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
958 DALI_TEST_CHECK( effect );
960 // Don't attach extension
961 ShaderEffect::Extension& extension = effect.GetExtension();
964 DALI_TEST_CHECK( false );
966 catch (Dali::DaliException& e)
968 // Tests that a negative test of an assertion succeeds
969 tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
970 DALI_TEST_CHECK( !effect );
976 int UtcDaliShaderEffectPropertyIndices(void)
978 TestApplication application;
979 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
981 Property::IndexContainer indices;
982 effect.GetPropertyIndices( indices );
983 DALI_TEST_CHECK( ! indices.empty() );
984 DALI_TEST_EQUALS( indices.size(), effect.GetPropertyCount(), TEST_LOCATION );