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 =
42 " gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);\n"
43 " vTexCoord = aTexCoord;\n"
46 static const char* FragmentSource =
49 " gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
52 static const char* FragmentSourceUsingExtensions =
55 " float floatValue = 0.5f;\n"
56 " float test = fwidth(floatValue);\n"
57 " gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
58 " gl_FragColor.a *= test;\n"
61 const int GETSOURCE_BUFFER_SIZE = 0x10000;
64 struct TestConstraintToVector3
66 TestConstraintToVector3(Vector3 target)
71 Vector3 operator()(const Vector3& current)
79 struct TestConstraintFromPositionToVector3
81 TestConstraintFromPositionToVector3()
85 Vector3 operator()(const Vector3& current, const PropertyInput& position)
88 return position.GetVector3();
92 struct TestConstraintToVector3Double
94 TestConstraintToVector3Double(Vector3 target)
99 Vector3 operator()(const Vector3& current)
101 return mTarget * 2.0f;
107 class ShaderEffectExtension : public ShaderEffect::Extension {};
110 class TestExtension : public ShaderEffect::Extension
113 TestExtension( bool& deleted )
133 int UtcDaliShaderEffectMethodNew01(void)
135 TestApplication application;
137 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
138 DALI_TEST_CHECK(effect);
142 int UtcDaliShaderEffectMethodNew02(void)
144 TestApplication application;
150 // New must be called to create a ShaderEffect or it wont be valid.
151 effect.SetUniform( "uUniform", 0 );
152 DALI_TEST_CHECK( false );
154 catch (Dali::DaliException& e)
156 // Tests that a negative test of an assertion succeeds
157 tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
158 DALI_TEST_CHECK( !effect );
163 int UtcDaliShaderEffectMethodNew03(void)
165 TestApplication application;
167 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource, VertexSource, FragmentSource, ShaderEffect::HINT_NONE );
168 DALI_TEST_CHECK(effect);
172 int UtcDaliShaderEffectMethodNew04(void)
174 TestApplication application;
175 tet_infoline("Testing prefixed version of Dali::ShaderEffect::New()");
177 std::string fragmentShaderPrefix = "#define TEST_FS 1\n#extension GL_OES_standard_derivatives : enable";
178 std::string vertexShaderPrefix = "#define TEST_VS 1";
182 // Call render to compile default shaders.
183 application.SendNotification();
184 application.Render();
185 application.Render();
186 application.Render();
188 GLuint lastShaderCompiledBefore = application.GetGlAbstraction().GetLastShaderCompiled();
189 ShaderEffect effect = ShaderEffect::NewWithPrefix( vertexShaderPrefix, VertexSource,
190 fragmentShaderPrefix, FragmentSourceUsingExtensions,
191 GEOMETRY_TYPE_IMAGE, ShaderEffect::HINT_NONE );
193 BitmapImage image = CreateBitmapImage();
194 ImageActor actor = ImageActor::New( image );
195 actor.SetSize( 100.0f, 100.0f );
196 actor.SetName("TestImageFilenameActor");
197 actor.SetShaderEffect(effect);
198 Stage::GetCurrent().Add(actor);
200 application.SendNotification();
201 application.Render();
202 GLuint lastShaderCompiledAfter = application.GetGlAbstraction().GetLastShaderCompiled();
203 bool testResult = false;
205 // we should have compiled 4 shaders.
206 if (lastShaderCompiledAfter - lastShaderCompiledBefore == 4)
208 char testVertexSourceResult[GETSOURCE_BUFFER_SIZE];
209 char testFragmentSourceResult[GETSOURCE_BUFFER_SIZE];
211 // we are interested in the first two.
212 GLuint vertexShaderId = lastShaderCompiledBefore + 1;
213 GLuint fragmentShaderId = lastShaderCompiledBefore + 2;
215 GLsizei lengthVertexResult;
216 GLsizei lengthFragmentResult;
218 application.GetGlAbstraction().GetShaderSource(vertexShaderId, GETSOURCE_BUFFER_SIZE, &lengthVertexResult, testVertexSourceResult);
219 application.GetGlAbstraction().GetShaderSource(fragmentShaderId, GETSOURCE_BUFFER_SIZE, &lengthFragmentResult, testFragmentSourceResult);
221 int vertexShaderHasPrefix = strncmp(testVertexSourceResult, "#define ", strlen("#define "));
222 int fragmentShaderHasPrefix = strncmp(testFragmentSourceResult, "#define ", strlen("#define "));
223 testResult = (vertexShaderHasPrefix == 0) && (fragmentShaderHasPrefix == 0);
226 DALI_TEST_CHECK(testResult);
228 catch(Dali::DaliException& e)
230 tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
231 tet_result( TET_FAIL );
236 int UtcDaliShaderEffectMethodNew05(void)
238 TestApplication application;
240 // heap constructor / destructor
241 DefaultFunctionCoverage<ShaderEffect> shaderEffect;
242 DefaultFunctionCoverage<ShaderEffectExtension> shaderEffectExtension;
247 int UtcDaliShaderEffectMethodNew06(void)
249 TestApplication application;
250 tet_infoline("Testing Dali::ShaderEffect::New() with shader sources for different geometry types");
252 ShaderEffect effect = ShaderEffect::New( "imageVertexShader", "imageFragmentShader",
253 "textVertexShader", "textFragmentShader",
254 "texturedMeshVertexShader", "texturedMeshFragmentShader",
255 "meshVertexShader", "meshFragmentShader",
256 ShaderEffect::HINT_NONE );
257 DALI_TEST_CHECK(effect);
262 int UtcDaliShaderEffectMethodDownCast(void)
264 TestApplication application;
265 tet_infoline("Testing Dali::ShaderEffect::DownCast()");
267 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
269 BaseHandle object(effect);
271 ShaderEffect effect2 = ShaderEffect::DownCast(object);
272 DALI_TEST_CHECK(effect2);
274 ShaderEffect effect3 = DownCast< ShaderEffect >(object);
275 DALI_TEST_CHECK(effect3);
277 BaseHandle unInitializedObject;
278 ShaderEffect effect4 = ShaderEffect::DownCast(unInitializedObject);
279 DALI_TEST_CHECK(!effect4);
281 ShaderEffect effect5 = DownCast< ShaderEffect >(unInitializedObject);
282 DALI_TEST_CHECK(!effect5);
286 int UtcDaliShaderEffectMethodDelete01(void)
288 TestApplication application;
290 // Only want to test the first few characters
291 std::string customFontPrefixVertShader =
293 " attribute mediump vec3 aPosition;\n"
294 " attribute mediump vec2 aTexCoord;\n";
297 // get the default shaders built, this is not required but makes it
298 // easier to debug the TET case and isolate the custom shader compilation.
299 application.SendNotification();
300 application.Render();
302 application.SendNotification();
303 application.Render();
305 // create a new shader effect
306 // the vertex and fragment shader will be cached in the ShaderFactory
307 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource);
309 // destroy the shader effect
312 // Create the same shader effect again, this should now use the cached version
313 // held in the shader factory
314 effect= ShaderEffect::New( VertexSource, FragmentSource );
316 // Compile the shader effect
317 application.SendNotification();
318 application.Render();
320 GLuint lastShaderCompiled = application.GetGlAbstraction().GetLastShaderCompiled();
322 // get the vertex shader (compiled before fragment shader).
323 // this last shaders compiled is for text.
324 GLuint vertexShaderId = lastShaderCompiled-1;
325 GLsizei lengthVertexResult;
327 char testVertexSourceResult[GETSOURCE_BUFFER_SIZE];
328 application.GetGlAbstraction().GetShaderSource(vertexShaderId, GETSOURCE_BUFFER_SIZE, &lengthVertexResult, testVertexSourceResult);
330 // compare the first 40 bytes of the vertex shader sent to be compiled, with
331 // the shader string that ended up being compiled (in the render task)
332 // this is to confirm the string hasn't been deleted / corrupted.
333 int testPassed = strncmp( testVertexSourceResult , customFontPrefixVertShader.c_str(), 40 ) ;
335 DALI_TEST_CHECK( testPassed == 0 );
340 int UtcDaliShaderEffectMethodSetUniformFloat(void)
342 TestApplication application;
344 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
345 DALI_TEST_CHECK( effect );
347 BitmapImage image = CreateBitmapImage();
349 effect.SetUniform( "uFloat", 1.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(
366 int UtcDaliShaderEffectMethodSetUniformVector2(void)
368 TestApplication application;
370 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
371 DALI_TEST_CHECK( effect );
373 BitmapImage image = CreateBitmapImage();
375 effect.SetUniform( "uVec2", Vector2( 2.0f, 3.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 "uVec2", Vector2( 2.0f, 3.0f ) ) );
392 int UtcDaliShaderEffectMethodSetUniformVector3(void)
394 TestApplication application;
396 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
397 DALI_TEST_CHECK( effect );
399 BitmapImage image = CreateBitmapImage();
401 effect.SetUniform( "uVec3", Vector3( 4.0f, 5.0f, 6.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 "uVec3", Vector3( 4.0f, 5.0f, 6.0f ) ) );
418 int UtcDaliShaderEffectMethodSetUniformVector4(void)
420 TestApplication application;
422 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
423 DALI_TEST_CHECK( effect );
425 BitmapImage image = CreateBitmapImage();
427 effect.SetUniform( "uVec4", Vector4( 7.0f, 8.0f, 9.0f, 10.0f ) );
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 "uVec4", Vector4( 7.0f, 8.0f, 9.0f, 10.0f ) ) );
444 int UtcDaliShaderEffectMethodSetUniformMatrix(void)
446 TestApplication application;
448 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
449 DALI_TEST_CHECK( effect );
451 BitmapImage image = CreateBitmapImage();
453 effect.SetUniform( "uModelView", Matrix::IDENTITY );
455 ImageActor actor = ImageActor::New( image );
456 actor.SetSize( 100.0f, 100.0f );
457 actor.SetName("TestImageFilenameActor");
458 actor.SetShaderEffect(effect);
459 Stage::GetCurrent().Add(actor);
461 application.SendNotification();
462 application.Render();
465 application.GetGlAbstraction().CheckUniformValue(
466 "uModelView", Matrix::IDENTITY ) );
470 int UtcDaliShaderEffectMethodSetUniformMatrix3(void)
472 TestApplication application;
474 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
475 DALI_TEST_CHECK( effect );
477 BitmapImage image = CreateBitmapImage();
479 Matrix3 matIdentity(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f);
480 effect.SetUniform( "uMatrix3", matIdentity );
482 ImageActor actor = ImageActor::New( image );
483 actor.SetSize( 100.0f, 100.0f );
484 actor.SetName("TestImageFilenameActor");
485 actor.SetShaderEffect(effect);
486 Stage::GetCurrent().Add(actor);
488 application.SendNotification();
489 application.Render();
491 DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue("uMatrix3", matIdentity) );
495 int UtcDaliShaderEffectMethodSetUniformViewport(void)
497 TestApplication application;
499 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
500 DALI_TEST_CHECK( effect );
502 BitmapImage image = CreateBitmapImage();
504 ImageActor actor = ImageActor::New( image );
505 actor.SetSize( 100.0f, 100.0f );
506 actor.SetName("TestImageFilenameActor");
507 actor.SetShaderEffect(effect);
508 Stage::GetCurrent().Add(actor);
510 effect.SetUniform( "uVec2", Vector2( 0.0f, 0.0f ), ShaderEffect::COORDINATE_TYPE_VIEWPORT_POSITION );
511 effect.SetUniform( "uVec2Dir", Vector2( 1.0f, 2.0f ), ShaderEffect::COORDINATE_TYPE_VIEWPORT_DIRECTION );
513 application.SendNotification();
514 application.Render();
516 const Vector2& stageSize(Stage::GetCurrent().GetSize());
519 application.GetGlAbstraction().CheckUniformValue(
520 "uVec2", Vector2( stageSize.x/2, -stageSize.y/2 ) ) );
523 application.GetGlAbstraction().CheckUniformValue(
524 "uVec2Dir", Vector2( -1.0f, 2.0f ) ) );
528 int UtcDaliShaderEffectMethodSetEffectImage(void)
530 TestApplication application;
532 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
533 DALI_TEST_CHECK( effect );
535 BitmapImage image = CreateBitmapImage();
537 effect.SetEffectImage(image);
539 ImageActor actor = ImageActor::New( image );
540 actor.SetSize( 100.0f, 100.0f );
541 actor.SetName("TestImageFilenameActor");
542 actor.SetShaderEffect(effect);
543 Stage::GetCurrent().Add(actor);
545 application.SendNotification();
546 application.Render(16);
547 application.SendNotification();
548 application.Render(16);
549 application.SendNotification();
551 DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "sEffect", 1 ) );
555 int UtcDaliShaderEffectMethodSetEffectImageAndDelete(void)
557 TestApplication application;
559 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
561 BitmapImage effectImage = CreateBitmapImage();
562 effect.SetEffectImage(effectImage);
564 ImageActor actor = ImageActor::New();
566 actor.SetShaderEffect(effect);
569 Stage::GetCurrent().Add(actor);
571 // do an update / render cycle
572 application.SendNotification();
573 application.Render(16);
574 application.SendNotification();
575 application.Render(16);
576 application.SendNotification();
577 application.Render(16);
579 printf("removing image actor from stage and Reseting handle\n");
580 Stage::GetCurrent().Remove(actor);
583 tet_printf("### Update & Render \n");
585 application.SendNotification();
586 application.Render(16);
588 tet_printf("#### Update Only \n");
590 tet_printf("effectImage.Reset \n");
592 // this releases the effect texture resource,
593 // Update will send a DispatchDiscardTexture message to render
595 application.SendNotification();
596 application.UpdateOnly(16);
598 tet_printf("#### Update Only \n");
600 // at this point shader is deleted, during clear discard queue
601 // and it sends a Shader:: DispatchRemoveObserver message to render thread
602 application.UpdateOnly(16);
604 tet_printf("#### Render Only \n");
605 // This is where it used to crash, there is a message in the queue to perform DispatchDiscardTexture
606 // which tries to call observer->TextureDiscarded, where observer == shader that was deleted
607 // in previous update.
608 application.RenderOnly();
611 // process the discard texture message
612 application.RenderOnly();
613 application.SendNotification();
614 application.Render(16);
616 tet_result(TET_PASS);
621 int UtcDaliShaderEffectMethodApplyConstraint(void)
623 // Test whether Shader's uniform can be constrained to a stationary constraint.
624 TestApplication application;
626 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
627 DALI_TEST_CHECK( effect );
629 BitmapImage image = CreateBitmapImage();
631 effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
633 ImageActor actor = ImageActor::New( image );
634 actor.SetSize( 100.0f, 100.0f );
635 actor.SetName("TestImageFilenameActor");
636 actor.SetShaderEffect(effect);
637 Stage::GetCurrent().Add(actor);
639 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
641 application.SendNotification();
642 application.Render();
644 // Test effects of SetUniform...
646 application.GetGlAbstraction().CheckUniformValue(
647 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
649 Constraint constraint = Constraint::New<Vector3>( uVecProperty,
650 TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
652 effect.ApplyConstraint(constraint);
654 application.SendNotification();
655 application.Render();
657 // Test effects of Constraint.
659 application.GetGlAbstraction().CheckUniformValue(
660 "uVec3", Vector3( 4.0f, 9.0f, 16.0f ) ) );
665 int UtcDaliShaderEffectMethodApplyConstraintFromActor(void)
667 // Test whether Shader's uniform can be constrained to Actor's position.
668 TestApplication application;
670 const Vector3 targetPosition = Vector3( 100.0f, 70.0f, 20.0f);
672 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
673 DALI_TEST_CHECK( effect );
675 BitmapImage image = CreateBitmapImage();
677 effect.SetUniform( "uVec3", Vector3( 50.0f, 25.0f, 0.0f ) );
679 ImageActor actor = ImageActor::New( image );
680 actor.SetPosition(targetPosition);
681 actor.SetSize( 100.0f, 100.0f );
682 actor.SetName("TestImageFilenameActor");
683 actor.SetShaderEffect(effect);
684 Stage::GetCurrent().Add(actor);
686 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
688 Constraint constraint = Constraint::New<Vector3>( uVecProperty,
689 Source(actor, Actor::POSITION),
690 TestConstraintFromPositionToVector3() );
692 effect.ApplyConstraint(constraint);
694 application.SendNotification();
695 application.Render();
697 // Test effects of Constraint.
699 application.GetGlAbstraction().CheckUniformValue(
700 "uVec3", targetPosition ) );
704 int UtcDaliShaderEffectMethodApplyConstraintFromActor2(void)
706 // Test whether Shader's uniform can be constrained to Actor's position.
707 // While Actor's position is constrained to another point * 2.0f
708 TestApplication application;
710 const Vector3 targetPosition = Vector3( 25.0f, 36.0f, 49.0f );
712 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
713 DALI_TEST_CHECK( effect );
715 BitmapImage image = CreateBitmapImage();
717 effect.SetUniform( "uVec3", Vector3( 50.0f, 25.0f, 0.0f ) );
719 ImageActor actor = ImageActor::New( image );
720 actor.SetPosition(Vector3( 100.0f, 70.0f, 20.0f));
721 actor.SetSize( 100.0f, 100.0f );
722 actor.SetName("TestImageFilenameActor");
723 actor.SetShaderEffect(effect);
724 Stage::GetCurrent().Add(actor);
726 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
728 Constraint shaderConstraint = Constraint::New<Vector3>( uVecProperty,
729 Source(actor, Actor::POSITION),
730 TestConstraintFromPositionToVector3() );
732 effect.ApplyConstraint(shaderConstraint);
734 Constraint actorConstraint = Constraint::New<Vector3>( Actor::POSITION,
735 TestConstraintToVector3Double(targetPosition) );
737 actor.ApplyConstraint(actorConstraint);
739 application.SendNotification();
740 application.Render();
742 // Test effects of Constraint.
744 application.GetGlAbstraction().CheckUniformValue(
745 "uVec3", targetPosition * 2.0f ) );
749 int UtcDaliShaderEffectMethodApplyConstraintCallback(void)
751 // Test whether Shader's uniform can be constrained to a stationary constraint.
752 TestApplication application;
754 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
755 DALI_TEST_CHECK( effect );
757 BitmapImage image = CreateBitmapImage();
759 effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
761 ImageActor actor = ImageActor::New( image );
762 actor.SetSize( 100.0f, 100.0f );
763 actor.SetName("TestImageFilenameActor");
764 actor.SetShaderEffect(effect);
765 Stage::GetCurrent().Add(actor);
767 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
769 application.SendNotification();
770 application.Render();
772 // Test effects of SetUniform...
774 application.GetGlAbstraction().CheckUniformValue(
775 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
777 Constraint constraint = Constraint::New<Vector3>( uVecProperty,
778 TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
780 constraint.SetApplyTime( 10.0f );
782 bool constraintCheck( false );
783 ConstraintAppliedCheck appliedCheck( constraintCheck );
785 // We should receive the "Applied" signal after 10 seconds
786 ActiveConstraint active = effect.ApplyConstraint(constraint);
787 active.AppliedSignal().Connect( &application, appliedCheck );
789 application.SendNotification();
790 application.Render(static_cast<unsigned int>(1000.0f)); // 1 elapsed second
792 // Check signal has not fired
793 application.SendNotification();
794 appliedCheck.CheckSignalNotReceived();
796 application.Render(static_cast<unsigned int>(4000.0f)); // 5 elapsed seconds
798 // Check signal has not fired
799 application.SendNotification();
800 appliedCheck.CheckSignalNotReceived();
802 application.Render(static_cast<unsigned int>(5000.0f - 1.0f)); // <10 elapsed seconds
804 // Check signal has not fired
805 application.SendNotification();
806 appliedCheck.CheckSignalNotReceived();
808 application.Render(static_cast<unsigned int>(2.0f)); // >10 elapsed seconds
810 // Signal should have fired
811 application.SendNotification();
812 appliedCheck.CheckSignalReceived();
814 // Test effects of Constraint.
816 application.GetGlAbstraction().CheckUniformValue(
817 "uVec3", Vector3( 4.0f, 9.0f, 16.0f ) ) );
821 int UtcDaliShaderEffectMethodRemoveConstraints(void)
823 // Test if constrains can be removed before they are ever applyed.
824 TestApplication application;
826 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
827 DALI_TEST_CHECK( effect );
829 BitmapImage image = CreateBitmapImage();
831 effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
833 ImageActor actor = ImageActor::New( image );
834 actor.SetSize( 100.0f, 100.0f );
835 actor.SetName("TestImageFilenameActor");
836 actor.SetShaderEffect(effect);
837 Stage::GetCurrent().Add(actor);
839 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
841 application.SendNotification();
842 application.Render();
844 // Test effects of SetUniform...
846 application.GetGlAbstraction().CheckUniformValue(
847 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
849 Constraint constraint = Constraint::New<Vector3>( uVecProperty,
850 TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
852 effect.ApplyConstraint(constraint);
854 // Remove the constraints
855 effect.RemoveConstraints();
857 application.SendNotification();
858 application.Render();
860 // Test effects of Constraint.
862 application.GetGlAbstraction().CheckUniformValue(
863 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
867 int UtcDaliShaderEffectMethodRemoveConstraints2(void)
869 // Test whether Shader's uniform constrains can be removed after they are applyed.
870 TestApplication application;
872 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
873 DALI_TEST_CHECK( effect );
875 BitmapImage image = CreateBitmapImage();
877 effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
879 ImageActor actor = ImageActor::New( image );
880 actor.SetSize( 100.0f, 100.0f );
881 actor.SetName("TestImageFilenameActor");
882 actor.SetShaderEffect(effect);
883 Stage::GetCurrent().Add(actor);
885 Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
887 application.SendNotification();
888 application.Render();
890 // Test effects of SetUniform...
892 application.GetGlAbstraction().CheckUniformValue(
893 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
895 Constraint constraint = Constraint::New<Vector3>( uVecProperty,
896 TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
898 effect.ApplyConstraint(constraint);
900 application.SendNotification();
901 application.Render();
903 // Reset the value and remove the constraints
904 effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
905 effect.RemoveConstraints();
907 application.SendNotification();
908 application.Render();
910 // Test effects of Constraint.
912 application.GetGlAbstraction().CheckUniformValue(
913 "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
917 int UtcDaliShaderEffectMethodCreateExtension(void)
919 // Test creation of a shader extension
920 TestApplication aplication;
924 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
925 DALI_TEST_CHECK( effect );
927 TestExtension* extension = new TestExtension ( deleted );
929 effect.AttachExtension( extension );
931 DALI_TEST_CHECK( static_cast<TestExtension&>(effect.GetExtension()).IsAlive() );
934 DALI_TEST_CHECK( deleted );
938 int UtcDaliShaderEffectMethodCreateExtension2(void)
940 // Test creation of a shader extension
943 TestApplication application;
945 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
946 DALI_TEST_CHECK( effect );
948 BitmapImage image = CreateBitmapImage();
950 effect.SetUniform( "uFloat", 1.0f );
952 ImageActor actor = ImageActor::New( image );
953 actor.SetSize( 100.0f, 100.0f );
954 actor.SetName("TestImageFilenameActor");
955 actor.SetShaderEffect(effect);
956 Stage::GetCurrent().Add(actor);
958 application.SendNotification();
959 application.Render();
961 TestExtension* extension = new TestExtension ( deleted );
963 effect.AttachExtension( extension );
965 const ShaderEffect& constEffect(effect);
966 const TestExtension& ext( static_cast<const TestExtension&>(constEffect.GetExtension()) );
968 DALI_TEST_CHECK( ext.IsAlive() );
971 DALI_TEST_CHECK( deleted );
975 int UtcDaliShaderEffectMethodNoExtension(void)
977 TestApplication application;
983 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
984 DALI_TEST_CHECK( effect );
986 // Don't attach extension
987 ShaderEffect::Extension& extension = effect.GetExtension();
990 DALI_TEST_CHECK( false );
992 catch (Dali::DaliException& e)
994 // Tests that a negative test of an assertion succeeds
995 tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
996 DALI_TEST_CHECK( !effect );
1002 int UtcDaliShaderEffectPropertyIndices(void)
1004 TestApplication application;
1005 ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
1007 Property::IndexContainer indices;
1008 effect.GetPropertyIndices( indices );
1009 DALI_TEST_CHECK( ! indices.empty() );
1010 DALI_TEST_EQUALS( indices.size(), effect.GetPropertyCount(), TEST_LOCATION );