2 * Copyright (c) 2022 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.
18 #include <dali-test-suite-utils.h>
19 #include <dali/devel-api/images/pixel-data-devel.h>
20 #include <dali/devel-api/rendering/texture-devel.h>
21 #include <dali/public-api/dali-core.h>
22 #include <test-native-image.h>
26 #include <mesh-builder.h>
28 void texture_set_startup(void)
30 test_return_value = TET_UNDEF;
33 void texture_set_cleanup(void)
35 test_return_value = TET_PASS;
38 int UtcDaliTextureNew01(void)
40 TestApplication application;
42 unsigned int width(64);
43 unsigned int height(64);
44 Texture texture = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
46 DALI_TEST_CHECK(texture);
50 int UtcDaliTextureNew02(void)
52 TestApplication application;
54 DALI_TEST_CHECK(!texture);
58 int UtcDaliTextureNew03(void)
60 TestApplication application;
62 // Create a native image source.
63 TestNativeImagePointer testNativeImage = TestNativeImage::New(64u, 64u);
65 // Create a texture from the native image source.
66 Texture nativeTexture = Texture::New(*testNativeImage);
68 // Check the texture was created OK.
69 DALI_TEST_CHECK(nativeTexture);
74 int UtcDaliTextureCopyConstructor(void)
76 TestApplication application;
78 unsigned int width(64);
79 unsigned int height(64);
80 Texture texture = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
82 Texture textureCopy(texture);
84 DALI_TEST_CHECK(textureCopy);
89 int UtcDaliTextureAssignmentOperator(void)
91 TestApplication application;
92 unsigned int width(64);
93 unsigned int height(64);
94 Texture texture = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
97 DALI_TEST_CHECK(!texture2);
100 DALI_TEST_CHECK(texture2);
105 int UtcDaliTextureMoveConstructor(void)
107 TestApplication application;
110 uint32_t height = 64;
111 Texture texture = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
112 DALI_TEST_CHECK(texture);
113 DALI_TEST_EQUALS(1, texture.GetBaseObject().ReferenceCount(), TEST_LOCATION);
114 DALI_TEST_EQUALS(texture.GetWidth(), width, TEST_LOCATION);
115 DALI_TEST_EQUALS(texture.GetHeight(), height, TEST_LOCATION);
117 Texture move = std::move(texture);
118 DALI_TEST_CHECK(move);
119 DALI_TEST_EQUALS(1, move.GetBaseObject().ReferenceCount(), TEST_LOCATION);
120 DALI_TEST_EQUALS(move.GetWidth(), width, TEST_LOCATION);
121 DALI_TEST_EQUALS(move.GetHeight(), height, TEST_LOCATION);
122 DALI_TEST_CHECK(!texture);
127 int UtcDaliTextureMoveAssignment(void)
129 TestApplication application;
132 uint32_t height = 64;
133 Texture texture = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
134 DALI_TEST_CHECK(texture);
135 DALI_TEST_EQUALS(1, texture.GetBaseObject().ReferenceCount(), TEST_LOCATION);
136 DALI_TEST_EQUALS(texture.GetWidth(), width, TEST_LOCATION);
137 DALI_TEST_EQUALS(texture.GetHeight(), height, TEST_LOCATION);
140 move = std::move(texture);
141 DALI_TEST_CHECK(move);
142 DALI_TEST_EQUALS(1, move.GetBaseObject().ReferenceCount(), TEST_LOCATION);
143 DALI_TEST_EQUALS(move.GetWidth(), width, TEST_LOCATION);
144 DALI_TEST_EQUALS(move.GetHeight(), height, TEST_LOCATION);
145 DALI_TEST_CHECK(!texture);
150 int UtcDaliTextureDownCast01(void)
152 TestApplication application;
153 unsigned int width(64);
154 unsigned int height(64);
155 Texture texture = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
157 BaseHandle handle(texture);
158 Texture texture2 = Texture::DownCast(handle);
159 DALI_TEST_CHECK(texture2);
164 int UtcDaliTextureDownCast02(void)
166 TestApplication application;
168 Handle handle = Handle::New(); // Create a custom object
169 Texture texture = Texture::DownCast(handle);
170 DALI_TEST_CHECK(!texture);
174 int UtcDaliTextureUpload01(void)
176 TestApplication application;
179 unsigned int width(64);
180 unsigned int height(64);
181 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
183 application.GetGlAbstraction().EnableTextureCallTrace(true);
185 application.SendNotification();
186 application.Render();
188 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
190 //Upload data to the texture
193 unsigned int bufferSize(width * height * 4);
194 unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
195 PixelData pixelData = PixelData::New(buffer, bufferSize, width, height, Pixel::RGBA8888, PixelData::FREE);
196 texture.Upload(pixelData);
197 application.SendNotification();
198 application.Render();
200 //TexImage2D should be called to upload the data
202 std::stringstream out;
203 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
204 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
207 //Upload part of the texture
209 bufferSize = width * height;
210 buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
211 PixelData pixelDataSubImage = PixelData::New(buffer, bufferSize, width / 2, height / 2, Pixel::RGBA8888, PixelData::FREE);
212 texture.Upload(pixelDataSubImage, 0u, 0u, width / 2, height / 2, width / 2, height / 2);
213 application.SendNotification();
214 application.Render();
216 //TexSubImage2D should be called to upload the data
218 std::stringstream out;
219 out << GL_TEXTURE_2D << ", " << 0u << ", " << width / 2 << ", " << height / 2 << ", " << width / 2 << ", " << height / 2;
220 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexSubImage2D", out.str().c_str()));
226 int UtcDaliTextureUpload02(void)
228 TestApplication application;
231 unsigned int width(64);
232 unsigned int height(64);
233 Texture texture = CreateTexture(TextureType::TEXTURE_CUBE, Pixel::RGBA8888, width, height);
235 application.GetGlAbstraction().EnableTextureCallTrace(true);
237 application.SendNotification();
238 application.Render();
240 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
242 tet_infoline("TexImage2D should be called six times with a null pointer to reserve storage for the six textures of the cube map");
243 for(unsigned int i(0); i < 6; ++i)
245 std::stringstream out;
246 out << GL_TEXTURE_CUBE_MAP_POSITIVE_X + i << ", " << 0u << ", " << width << ", " << height;
247 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
250 unsigned int bufferSize(width * height * 4);
251 unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
252 PixelData pixelData = PixelData::New(buffer, bufferSize, width, height, Pixel::RGBA8888, PixelData::FREE);
254 //Upload data to the POSITIVE_X face of the texture
258 texture.Upload(pixelData, CubeMapLayer::POSITIVE_X, 0u, 0u, 0u, width, height);
259 application.SendNotification();
260 application.Render();
262 //TexImage2D should be called to upload the data to the POSITIVE_X face
264 std::stringstream out;
265 out << GL_TEXTURE_CUBE_MAP_POSITIVE_X << ", " << 0u << ", " << width << ", " << height;
266 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
270 //Upload data to the NEGATIVE_X face of the texture
274 texture.Upload(pixelData, CubeMapLayer::NEGATIVE_X, 0u, 0u, 0u, width, height);
275 application.SendNotification();
276 application.Render();
278 //TexImage2D should be called to upload the data to the NEGATIVE_X face
280 std::stringstream out;
281 out << GL_TEXTURE_CUBE_MAP_NEGATIVE_X << ", " << 0u << ", " << width << ", " << height;
282 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
286 //Upload data to the POSITIVE_Y face of the texture
289 texture.Upload(pixelData, CubeMapLayer::POSITIVE_Y, 0u, 0u, 0u, width, height);
290 application.SendNotification();
291 application.Render();
293 //TexImage2D should be called to upload the data to the POSITIVE_Y face
295 std::stringstream out;
296 out << GL_TEXTURE_CUBE_MAP_POSITIVE_Y << ", " << 0u << ", " << width << ", " << height;
297 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
301 //Upload data to the NEGATIVE_Y face of the texture
304 texture.Upload(pixelData, CubeMapLayer::NEGATIVE_Y, 0u, 0u, 0u, width, height);
305 application.SendNotification();
306 application.Render();
308 //TexImage2D should be called to upload the data to the NEGATIVE_Y face
310 std::stringstream out;
311 out << GL_TEXTURE_CUBE_MAP_NEGATIVE_Y << ", " << 0u << ", " << width << ", " << height;
312 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
316 //Upload data to the POSITIVE_Z face of the texture
319 texture.Upload(pixelData, CubeMapLayer::POSITIVE_Z, 0u, 0u, 0u, width, height);
320 application.SendNotification();
321 application.Render();
323 //TexImage2D should be called to upload the data to the POSITIVE_Z face
325 std::stringstream out;
326 out << GL_TEXTURE_CUBE_MAP_POSITIVE_Z << ", " << 0u << ", " << width << ", " << height;
327 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
331 //Upload data to the NEGATIVE_Z face of the texture
334 texture.Upload(pixelData, CubeMapLayer::NEGATIVE_Z, 0u, 0u, 0u, width, height);
335 application.SendNotification();
336 application.Render();
338 //TexImage2D should be called to upload the data to the NEGATIVE_Z face
340 std::stringstream out;
341 out << GL_TEXTURE_CUBE_MAP_NEGATIVE_Z << ", " << 0u << ", " << width << ", " << height;
342 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
349 int UtcDaliTextureUpload03(void)
351 TestApplication application;
354 unsigned int width(64);
355 unsigned int height(64);
356 unsigned int widthMipmap1(32);
357 unsigned int heightMipmap1(32);
359 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
361 application.GetGlAbstraction().EnableTextureCallTrace(true);
363 application.SendNotification();
364 application.Render();
366 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
368 tet_infoline("TexImage2D should be called with a null pointer to reserve storage for the texture in the gpu");
370 std::stringstream out;
371 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
372 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
375 //Upload data to the texture mipmap 0 and mipmap 1
378 unsigned int bufferSize(width * height * 4);
379 unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
380 PixelData pixelData = PixelData::New(buffer, bufferSize, width, height, Pixel::RGBA8888, PixelData::FREE);
381 texture.Upload(pixelData, 0u, 0u, 0u, 0u, width, height);
383 bufferSize = widthMipmap1 * heightMipmap1 * 4;
384 buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
385 PixelData pixelDataMipmap1 = PixelData::New(buffer, bufferSize, widthMipmap1, heightMipmap1, Pixel::RGBA8888, PixelData::FREE);
386 texture.Upload(pixelDataMipmap1, 0u, 1u, 0u, 0u, widthMipmap1, heightMipmap1);
387 application.SendNotification();
388 application.Render();
390 //TexImage2D should be called to upload the data to mipmaps 0 and 1
392 std::stringstream out;
393 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
394 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
397 std::stringstream out;
398 out << GL_TEXTURE_2D << ", " << 1u << ", " << widthMipmap1 << ", " << heightMipmap1;
399 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
405 int UtcDaliTextureUpload04(void)
407 TestApplication application;
410 unsigned int width(64);
411 unsigned int height(64);
412 unsigned int widthMipmap1(32);
413 unsigned int heightMipmap1(32);
415 Texture texture = CreateTexture(TextureType::TEXTURE_CUBE, Pixel::RGBA8888, width, height);
417 application.GetGlAbstraction().EnableTextureCallTrace(true);
418 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
420 //Upload data to the NEGATIVE_X face mipmap 0 and mipmap 1
421 unsigned int bufferSize(width * height * 4);
422 unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
423 PixelData pixelData = PixelData::New(buffer, bufferSize, width, height, Pixel::RGBA8888, PixelData::FREE);
424 texture.Upload(pixelData, CubeMapLayer::NEGATIVE_X, 0u, 0u, 0u, width, height);
426 bufferSize = widthMipmap1 * heightMipmap1 * 4;
427 buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
428 PixelData pixelDataMipmap1 = PixelData::New(buffer, bufferSize, widthMipmap1, heightMipmap1, Pixel::RGBA8888, PixelData::FREE);
429 texture.Upload(pixelDataMipmap1, CubeMapLayer::NEGATIVE_X, 1u, 0u, 0u, widthMipmap1, heightMipmap1);
430 application.SendNotification();
431 application.Render();
433 //TexImage2D should be called to upload the data to mipmaps 0 and 1
435 std::stringstream out;
436 out << GL_TEXTURE_CUBE_MAP_NEGATIVE_X << ", " << 0u << ", " << width << ", " << height;
437 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
440 std::stringstream out;
441 out << GL_TEXTURE_CUBE_MAP_NEGATIVE_X << ", " << 1u << ", " << widthMipmap1 << ", " << heightMipmap1;
442 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
448 int UtcDaliTextureUpload05(void)
450 Pixel::Format COMPRESSED_PIXEL_FORMATS[] =
452 Pixel::COMPRESSED_R11_EAC,
453 Pixel::COMPRESSED_SIGNED_R11_EAC,
454 Pixel::COMPRESSED_RG11_EAC,
455 Pixel::COMPRESSED_SIGNED_RG11_EAC,
456 Pixel::COMPRESSED_RGB8_ETC2,
457 Pixel::COMPRESSED_SRGB8_ETC2,
458 Pixel::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
459 Pixel::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
460 Pixel::COMPRESSED_RGBA8_ETC2_EAC,
461 Pixel::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,
462 Pixel::COMPRESSED_RGB8_ETC1,
463 Pixel::COMPRESSED_RGB_PVRTC_4BPPV1,
464 Pixel::COMPRESSED_RGBA_ASTC_4x4_KHR,
465 Pixel::COMPRESSED_RGBA_ASTC_5x4_KHR,
466 Pixel::COMPRESSED_RGBA_ASTC_5x5_KHR,
467 Pixel::COMPRESSED_RGBA_ASTC_6x5_KHR,
468 Pixel::COMPRESSED_RGBA_ASTC_6x6_KHR,
469 Pixel::COMPRESSED_RGBA_ASTC_8x5_KHR,
470 Pixel::COMPRESSED_RGBA_ASTC_8x6_KHR,
471 Pixel::COMPRESSED_RGBA_ASTC_8x8_KHR,
472 Pixel::COMPRESSED_RGBA_ASTC_10x5_KHR,
473 Pixel::COMPRESSED_RGBA_ASTC_10x6_KHR,
474 Pixel::COMPRESSED_RGBA_ASTC_10x8_KHR,
475 Pixel::COMPRESSED_RGBA_ASTC_10x10_KHR,
476 Pixel::COMPRESSED_RGBA_ASTC_12x10_KHR,
477 Pixel::COMPRESSED_RGBA_ASTC_12x12_KHR,
478 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,
479 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,
480 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,
481 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,
482 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,
483 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,
484 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,
485 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,
486 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,
487 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,
488 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,
489 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,
490 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR,
491 Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR,
493 const unsigned int NUMBER_OF_COMPRESSED_PIXEL_FORMATS = sizeof(COMPRESSED_PIXEL_FORMATS) / sizeof(Pixel::Format);
495 for(unsigned int index = 0; index < NUMBER_OF_COMPRESSED_PIXEL_FORMATS; ++index)
497 TestApplication application;
499 //Create a texture with a compressed format
500 unsigned int width(64);
501 unsigned int height(64);
502 Texture texture = CreateTexture(TextureType::TEXTURE_2D, COMPRESSED_PIXEL_FORMATS[index], width, height);
504 application.GetGlAbstraction().EnableTextureCallTrace(true);
506 application.SendNotification();
507 application.Render();
509 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
511 tet_infoline("CompressedTexImage2D should be called with a null pointer to reserve storage for the texture in the gpu");
513 std::stringstream out;
514 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
515 DALI_TEST_CHECK(callStack.FindMethodAndParams("CompressedTexImage2D", out.str().c_str()));
518 //Upload data to the texture
521 unsigned int bufferSize(width * height * 4);
522 unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
523 PixelData pixelData = PixelData::New(buffer, bufferSize, width, height, COMPRESSED_PIXEL_FORMATS[index], PixelData::FREE);
524 texture.Upload(pixelData);
525 application.SendNotification();
526 application.Render();
528 //CompressedTexImage2D should be called to upload the data
530 std::stringstream out;
531 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
532 DALI_TEST_CHECK(callStack.FindMethodAndParams("CompressedTexImage2D", out.str().c_str()));
535 //Upload part of the texture
537 bufferSize = width * height;
538 buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
539 PixelData pixelDataSubImage = PixelData::New(buffer, bufferSize, width / 2, height / 2, COMPRESSED_PIXEL_FORMATS[index], PixelData::FREE);
540 texture.Upload(pixelDataSubImage, 0u, 0u, width / 2, height / 2, width / 2, height / 2);
541 application.SendNotification();
542 application.Render();
544 //CompressedTexSubImage2D should be called to upload the data
546 std::stringstream out;
547 out << GL_TEXTURE_2D << ", " << 0u << ", " << width / 2 << ", " << height / 2 << ", " << width / 2 << ", " << height / 2;
548 DALI_TEST_CHECK(callStack.FindMethodAndParams("CompressedTexSubImage2D", out.str().c_str()));
551 application.GetGlAbstraction().ResetTextureCallStack();
557 int UtcDaliTextureUpload06(void)
559 TestApplication application;
562 unsigned int width(64);
563 unsigned int height(64);
564 tet_infoline("Creating a Texure with an alpha channel");
565 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
567 application.GetGlAbstraction().EnableTextureCallTrace(true);
569 application.SendNotification();
570 application.Render();
572 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
574 tet_infoline("TexImage2D should be called with a null pointer to reserve storage for the texture in the gpu");
576 std::stringstream out;
577 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
578 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
581 tet_infoline("Upload data to the texture");
584 tet_infoline("Creating a RGB pixel buffer and adding that to the texture to ensure it is handled correctly");
585 unsigned int bufferSize(width * height * 3);
586 unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
587 PixelData pixelData = PixelData::New(buffer, bufferSize, width, height, Pixel::RGB888, PixelData::FREE);
588 texture.Upload(pixelData);
589 application.SendNotification();
590 application.Render();
592 tet_infoline("TexImage2D should be called to upload the data");
594 std::stringstream out;
595 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
596 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
602 int UtcDaliTextureUpload07(void)
604 Pixel::Format FLOATING_POINT_PIXEL_FORMATS[] =
609 const unsigned int NUMBER_OF_FLOATING_POINT_PIXEL_FORMATS = sizeof(FLOATING_POINT_PIXEL_FORMATS) / sizeof(Pixel::Format);
611 for(unsigned int index = 0; index < NUMBER_OF_FLOATING_POINT_PIXEL_FORMATS; ++index)
613 TestApplication application;
616 unsigned int width(64);
617 unsigned int height(64);
618 tet_infoline("Creating a floating point texture");
619 Texture texture = CreateTexture(TextureType::TEXTURE_2D, FLOATING_POINT_PIXEL_FORMATS[index], width, height);
621 application.GetGlAbstraction().EnableTextureCallTrace(true);
623 application.SendNotification();
624 application.Render();
626 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
628 tet_infoline("TexImage2D should be called with a null pointer to reserve storage for the texture in the gpu");
630 std::stringstream out;
631 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
632 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
635 tet_infoline("Upload data to the texture");
638 tet_infoline("Creating a RGB pixel buffer and adding that to the texture to ensure it is handled correctly");
639 unsigned int bufferSize(width * height * 3);
640 unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
641 PixelData pixelData = PixelData::New(buffer, bufferSize, width, height, FLOATING_POINT_PIXEL_FORMATS[index], PixelData::FREE);
642 texture.Upload(pixelData);
643 application.SendNotification();
644 application.Render();
646 tet_infoline("TexImage2D should be called to upload the data");
648 std::stringstream out;
649 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
650 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
657 int UtcDaliTextureUploadSubPixelData01(void)
659 TestApplication application;
662 unsigned int width(64);
663 unsigned int height(64);
664 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
666 application.GetGlAbstraction().EnableTextureCallTrace(true);
668 application.SendNotification();
669 application.Render();
671 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
673 //Upload data to the texture
676 uint32_t bufferWidth = width * 2;
677 uint32_t bufferHeight = height * 2;
678 uint32_t bufferXOffset = width;
679 uint32_t bufferYOffset = height;
681 unsigned int bufferSize(bufferWidth * bufferHeight * 4);
682 unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
683 PixelData pixelData = PixelData::New(buffer, bufferSize, bufferWidth, bufferHeight, Pixel::RGBA8888, PixelData::FREE);
684 DevelTexture::UploadSubPixelData(texture, pixelData, bufferXOffset, bufferYOffset, width, height);
685 application.SendNotification();
686 application.Render();
688 //TexImage2D should be called to upload the data
690 std::stringstream out;
691 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
692 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
695 //Upload part of the texture
697 DevelTexture::UploadSubPixelData(texture, pixelData, bufferXOffset, bufferYOffset, width / 2, height / 2, 0u, 0u, width / 2, height / 2, width / 2, height / 2);
698 application.SendNotification();
699 application.Render();
701 //TexSubImage2D should be called to upload the data
703 std::stringstream out;
704 out << GL_TEXTURE_2D << ", " << 0u << ", " << width / 2 << ", " << height / 2 << ", " << width / 2 << ", " << height / 2;
705 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexSubImage2D", out.str().c_str()));
711 int UtcDaliTextureUploadSubPixelData02(void)
713 TestApplication application;
716 unsigned int width(64);
717 unsigned int height(64);
718 Texture texture = CreateTexture(TextureType::TEXTURE_CUBE, Pixel::RGBA8888, width, height);
720 application.GetGlAbstraction().EnableTextureCallTrace(true);
722 application.SendNotification();
723 application.Render();
725 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
727 tet_infoline("TexImage2D should be called six times with a null pointer to reserve storage for the six textures of the cube map");
728 for(unsigned int i(0); i < 6; ++i)
730 std::stringstream out;
731 out << GL_TEXTURE_CUBE_MAP_POSITIVE_X + i << ", " << 0u << ", " << width << ", " << height;
732 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
735 uint32_t bufferWidth = width * 2;
736 uint32_t bufferHeight = height * 2;
737 uint32_t bufferXOffset = width;
738 uint32_t bufferYOffset = height;
740 unsigned int bufferSize(bufferWidth * bufferHeight * 4);
741 unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
742 PixelData pixelData = PixelData::New(buffer, bufferSize, bufferWidth, bufferHeight, Pixel::RGBA8888, PixelData::FREE);
744 //Upload data to the POSITIVE_X face of the texture
748 DevelTexture::UploadSubPixelData(texture, pixelData, bufferXOffset, bufferYOffset, width, height, CubeMapLayer::POSITIVE_X, 0u, 0u, 0u, width, height);
749 application.SendNotification();
750 application.Render();
752 //TexImage2D should be called to upload the data to the POSITIVE_X face
754 std::stringstream out;
755 out << GL_TEXTURE_CUBE_MAP_POSITIVE_X << ", " << 0u << ", " << width << ", " << height;
756 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
760 //Upload data to the NEGATIVE_X face of the texture
764 DevelTexture::UploadSubPixelData(texture, pixelData, bufferXOffset, bufferYOffset, width, height, CubeMapLayer::NEGATIVE_X, 0u, 0u, 0u, width, height);
765 application.SendNotification();
766 application.Render();
768 //TexImage2D should be called to upload the data to the NEGATIVE_X face
770 std::stringstream out;
771 out << GL_TEXTURE_CUBE_MAP_NEGATIVE_X << ", " << 0u << ", " << width << ", " << height;
772 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
776 //Upload data to the POSITIVE_Y face of the texture
779 DevelTexture::UploadSubPixelData(texture, pixelData, bufferXOffset, bufferYOffset, width, height, CubeMapLayer::POSITIVE_Y, 0u, 0u, 0u, width, height);
780 application.SendNotification();
781 application.Render();
783 //TexImage2D should be called to upload the data to the POSITIVE_Y face
785 std::stringstream out;
786 out << GL_TEXTURE_CUBE_MAP_POSITIVE_Y << ", " << 0u << ", " << width << ", " << height;
787 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
791 //Upload data to the NEGATIVE_Y face of the texture
794 DevelTexture::UploadSubPixelData(texture, pixelData, bufferXOffset, bufferYOffset, width, height, CubeMapLayer::NEGATIVE_Y, 0u, 0u, 0u, width, height);
795 application.SendNotification();
796 application.Render();
798 //TexImage2D should be called to upload the data to the NEGATIVE_Y face
800 std::stringstream out;
801 out << GL_TEXTURE_CUBE_MAP_NEGATIVE_Y << ", " << 0u << ", " << width << ", " << height;
802 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
806 //Upload data to the POSITIVE_Z face of the texture
809 DevelTexture::UploadSubPixelData(texture, pixelData, bufferXOffset, bufferYOffset, width, height, CubeMapLayer::POSITIVE_Z, 0u, 0u, 0u, width, height);
810 application.SendNotification();
811 application.Render();
813 //TexImage2D should be called to upload the data to the POSITIVE_Z face
815 std::stringstream out;
816 out << GL_TEXTURE_CUBE_MAP_POSITIVE_Z << ", " << 0u << ", " << width << ", " << height;
817 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
821 //Upload data to the NEGATIVE_Z face of the texture
824 DevelTexture::UploadSubPixelData(texture, pixelData, bufferXOffset, bufferYOffset, width, height, CubeMapLayer::NEGATIVE_Z, 0u, 0u, 0u, width, height);
825 application.SendNotification();
826 application.Render();
828 //TexImage2D should be called to upload the data to the NEGATIVE_Z face
830 std::stringstream out;
831 out << GL_TEXTURE_CUBE_MAP_NEGATIVE_Z << ", " << 0u << ", " << width << ", " << height;
832 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
839 int UtcDaliTextureUploadPixelFormats(void)
841 TestApplication application;
842 application.GetGlAbstraction().EnableTextureCallTrace(true);
845 unsigned int width(64);
846 unsigned int height(64);
848 std::vector<Pixel::Format> formats =
864 Pixel::DEPTH_UNSIGNED_INT,
866 Pixel::DEPTH_STENCIL,
870 Pixel::CHROMINANCE_U,
871 Pixel::CHROMINANCE_V};
873 for(auto format : formats)
875 tet_infoline("Creating a Texure with a new or recent format");
876 Texture texture = CreateTexture(TextureType::TEXTURE_2D, format, width, height);
878 application.SendNotification();
879 application.Render();
881 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
883 tet_infoline("TexImage2D should be called twice per texture");
884 DALI_TEST_EQUALS(callStack.CountMethod("TexImage2D"), 2, TEST_LOCATION);
886 std::stringstream out;
887 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
888 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
896 int UtcDaliTextureUploadSmallerThanSize(void)
898 TestApplication application;
901 unsigned int width(64);
902 unsigned int height(64);
903 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
905 application.GetGlAbstraction().EnableTextureCallTrace(true);
907 application.SendNotification();
908 application.Render();
910 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
911 callStack.EnableLogging(true);
912 TraceCallStack& texParamCallStack = application.GetGlAbstraction().GetTexParameterTrace();
913 texParamCallStack.EnableLogging(true);
915 tet_infoline("TexImage2D should be called with a null pointer to reserve storage for the texture in the gpu");
917 std::stringstream out;
918 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
920 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters("TexImage2D", params));
921 DALI_TEST_EQUALS(out.str(), params, TEST_LOCATION);
924 //Upload data to the texture
927 unsigned int bufferSize(width * height * 4);
928 unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
929 PixelData pixelData = PixelData::New(buffer, bufferSize, width / 2, height / 2, Pixel::RGBA8888, PixelData::FREE);
930 texture.Upload(pixelData);
931 application.SendNotification();
932 application.Render();
934 //TexSubImage2D should be called to upload the data
936 std::stringstream out;
937 out << GL_TEXTURE_2D << ", " << 0u << ", " << 0u << ", " << 0u << ", " << width / 2 << ", " << height / 2;
939 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters("TexSubImage2D", params));
940 DALI_TEST_EQUALS(out.str(), params, TEST_LOCATION);
945 int UtcDaliTextureGenerateMipmaps(void)
947 TestApplication application;
948 unsigned int width(64);
949 unsigned int height(64);
951 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
952 texture.GenerateMipmaps();
954 Texture textureCubemap = CreateTexture(TextureType::TEXTURE_CUBE, Pixel::RGBA8888, width, height);
955 textureCubemap.GenerateMipmaps();
957 application.GetGlAbstraction().EnableTextureCallTrace(true);
958 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
959 application.SendNotification();
960 application.Render();
963 std::stringstream out;
964 out << GL_TEXTURE_2D;
965 DALI_TEST_CHECK(callStack.FindMethodAndParams("GenerateMipmap", out.str().c_str()));
968 std::stringstream out;
969 out << GL_TEXTURE_CUBE_MAP;
970 DALI_TEST_CHECK(callStack.FindMethodAndParams("GenerateMipmap", out.str().c_str()));
976 int UtcDaliTextureGetWidth(void)
978 TestApplication application;
979 unsigned int width(64);
980 unsigned int height(64);
982 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
983 DALI_TEST_EQUALS(texture.GetWidth(), width, TEST_LOCATION);
987 int UtcDaliTextureGetHeight(void)
989 TestApplication application;
990 unsigned int width(64);
991 unsigned int height(64);
993 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
994 DALI_TEST_EQUALS(texture.GetHeight(), height, TEST_LOCATION);
999 int UtcDaliTextureContextLoss(void)
1001 tet_infoline("UtcDaliTextureContextLoss\n");
1002 TestApplication application;
1004 //Create the texture
1005 unsigned int width(64);
1006 unsigned int height(64);
1007 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
1008 DALI_TEST_CHECK(texture);
1010 application.SendNotification();
1011 application.Render(16);
1013 // Lose & regain context (in render 'thread')
1014 application.ResetContext();
1015 DALI_TEST_CHECK(texture);
1020 int UtcDaliNativeImageTexture01(void)
1022 TestApplication application;
1023 tet_infoline("UtcDaliNativeImageTexture01");
1025 TestNativeImagePointer imageInterface = TestNativeImage::New(16, 16);
1027 Texture texture = Texture::New(*(imageInterface.Get()));
1028 Actor actor = CreateRenderableActor(texture, "", "");
1029 application.GetScene().Add(actor);
1031 DALI_TEST_CHECK(texture);
1033 application.SendNotification();
1034 application.Render(16);
1036 DALI_TEST_EQUALS(imageInterface->mExtensionCreateCalls, 1, TEST_LOCATION);
1037 DALI_TEST_EQUALS(imageInterface->mExtensionDestroyCalls, 0, TEST_LOCATION);
1038 DALI_TEST_EQUALS(actor.GetProperty(Actor::Property::SIZE), Property::Value(Vector3(16, 16, 0)), TEST_LOCATION);
1040 UnparentAndReset(actor);
1042 application.SendNotification();
1043 application.Render(16);
1045 application.SendNotification();
1046 application.Render(16);
1048 DALI_TEST_EQUALS(imageInterface->mExtensionCreateCalls, 1, TEST_LOCATION);
1049 DALI_TEST_EQUALS(imageInterface->mExtensionDestroyCalls, 1, TEST_LOCATION);
1054 int UtcDaliNativeImageTexture02(void)
1056 TestApplication application;
1057 tet_infoline("UtcDaliNativeImageTexture02 - test error on TargetTexture");
1059 TestNativeImagePointer imageInterface = TestNativeImage::New(16, 16);
1060 imageInterface->mTargetTextureError = 1u;
1062 Texture texture = Texture::New(*(imageInterface.Get()));
1063 Actor actor = CreateRenderableActor(texture, "", "");
1064 application.GetScene().Add(actor);
1066 DALI_TEST_CHECK(texture);
1068 application.SendNotification();
1069 application.Render(16);
1071 // Expect 2 attempts to create the texture - once when adding the texture
1072 // to the scene-graph, and again since that failed, during the Bind.
1073 // The second one succeeds (TargetTexture only errors once)
1074 DALI_TEST_EQUALS(imageInterface->mExtensionCreateCalls, 2, TEST_LOCATION);
1075 DALI_TEST_EQUALS(imageInterface->mExtensionDestroyCalls, 1, TEST_LOCATION);
1077 UnparentAndReset(actor);
1079 application.SendNotification();
1080 application.Render(16);
1082 application.SendNotification();
1083 application.Render(16);
1085 // Expect that there are no further calls to create/destroy resource
1086 DALI_TEST_EQUALS(imageInterface->mExtensionCreateCalls, 2, TEST_LOCATION);
1087 DALI_TEST_EQUALS(imageInterface->mExtensionDestroyCalls, 2, TEST_LOCATION);
1092 int UtcDaliTextureGenerateMipmapsNegative(void)
1094 TestApplication application;
1095 Dali::Texture instance;
1098 instance.GenerateMipmaps();
1099 DALI_TEST_CHECK(false); // Should not get here
1103 DALI_TEST_CHECK(true); // We expect an assert
1108 int UtcDaliTextureUploadNegative01(void)
1110 TestApplication application;
1111 Dali::Texture instance;
1114 Dali::PixelData arg1;
1115 instance.Upload(arg1);
1116 DALI_TEST_CHECK(false); // Should not get here
1120 DALI_TEST_CHECK(true); // We expect an assert
1125 int UtcDaliTextureUploadNegative02(void)
1127 TestApplication application;
1128 Dali::Texture instance;
1131 Dali::PixelData arg1;
1132 unsigned int arg2(0u);
1133 unsigned int arg3(0u);
1134 unsigned int arg4(0u);
1135 unsigned int arg5(0u);
1136 unsigned int arg6(0u);
1137 unsigned int arg7(0u);
1138 instance.Upload(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
1139 DALI_TEST_CHECK(false); // Should not get here
1143 DALI_TEST_CHECK(true); // We expect an assert
1148 int UtcDaliTextureGetWidthNegative(void)
1150 TestApplication application;
1151 Dali::Texture instance;
1154 instance.GetWidth();
1155 DALI_TEST_CHECK(false); // Should not get here
1159 DALI_TEST_CHECK(true); // We expect an assert
1164 int UtcDaliTextureGetHeightNegative(void)
1166 TestApplication application;
1167 Dali::Texture instance;
1170 instance.GetHeight();
1171 DALI_TEST_CHECK(false); // Should not get here
1175 DALI_TEST_CHECK(true); // We expect an assert
1180 int UtcDaliTextureCheckNativeP(void)
1182 TestApplication application;
1183 TestNativeImagePointer testNativeImage = TestNativeImage::New(64u, 64u);
1184 Texture nativeTexture = Texture::New(*testNativeImage);
1186 DALI_TEST_CHECK(nativeTexture);
1187 DALI_TEST_CHECK(DevelTexture::IsNative(nativeTexture));
1191 int UtcDaliTextureCheckNativeN1(void)
1193 TestApplication application;
1194 unsigned int width(64);
1195 unsigned int height(64);
1196 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
1198 DALI_TEST_CHECK(texture);
1199 DALI_TEST_CHECK(!DevelTexture::IsNative(texture));
1203 int UtcDaliTextureCheckNativeN2(void)
1205 TestApplication application;
1209 bool native = DevelTexture::IsNative(texture);
1210 DALI_TEST_CHECK(native != native);
1214 DALI_TEST_CHECK(true);
1219 int UtcDaliTextureApplyFragShaderP1(void)
1221 TestApplication application;
1222 TestNativeImagePointer testNativeImage = TestNativeImage::New(64u, 64u);
1223 Texture nativeTexture = Texture::New(*testNativeImage);
1224 DALI_TEST_CHECK(nativeTexture);
1226 const std::string baseFragShader =
1227 "varying mediump vec4 uColor;\n"
1229 " gl_FragColor=uColor;\n"
1231 std::string fragShader = baseFragShader;
1232 bool applied = DevelTexture::ApplyNativeFragmentShader(nativeTexture, fragShader);
1234 std::string fragPrefix = "#extension GL_OES_EGL_image_external:require\n";
1236 DALI_TEST_CHECK(applied);
1237 DALI_TEST_CHECK(baseFragShader.compare(fragShader));
1238 DALI_TEST_CHECK(fragShader.compare(fragPrefix + baseFragShader) == 0);
1239 DALI_TEST_CHECK(!fragShader.empty());
1243 int UtcDaliTextureApplyFragShaderP2(void)
1245 TestApplication application;
1246 TestNativeImagePointer testNativeImage = TestNativeImage::New(64u, 64u);
1247 Texture nativeTexture = Texture::New(*testNativeImage);
1248 DALI_TEST_CHECK(nativeTexture);
1250 const std::string baseFragShader =
1251 "varying mediump vec4 uColor;\n"
1252 "varying vec2 vTexCoord;\n"
1253 "uniform sampler2D uNative;\n"
1255 " gl_FragColor=uColor*texture2D(uNative, vTexCoord);\n"
1257 std::string fragShader = baseFragShader;
1258 bool applied = DevelTexture::ApplyNativeFragmentShader(nativeTexture, fragShader);
1260 DALI_TEST_CHECK(applied);
1261 DALI_TEST_CHECK(baseFragShader.compare(fragShader));
1262 DALI_TEST_CHECK(!fragShader.empty());
1263 DALI_TEST_CHECK(fragShader.find("samplerExternalOES") < fragShader.length());
1267 int UtcDaliTextureApplyFragShaderN1(void)
1269 TestApplication application;
1270 TestNativeImagePointer testNativeImage = TestNativeImage::New(64u, 64u);
1271 Texture nativeTexture = Texture::New(*testNativeImage);
1272 DALI_TEST_CHECK(nativeTexture);
1274 std::string fragShader;
1275 bool applied = DevelTexture::ApplyNativeFragmentShader(nativeTexture, fragShader);
1277 DALI_TEST_CHECK(!applied);
1278 DALI_TEST_CHECK(fragShader.empty());
1282 int UtcDaliTextureApplyFragShaderN2(void)
1284 TestApplication application;
1285 unsigned int width(64);
1286 unsigned int height(64);
1287 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
1289 const std::string baseFragShader =
1290 "varying mediump vec4 uColor;\n"
1292 " gl_FragColor=uColor;\n"
1294 std::string fragShader = baseFragShader;
1295 bool applied = DevelTexture::ApplyNativeFragmentShader(texture, fragShader);
1297 DALI_TEST_CHECK(!applied);
1298 DALI_TEST_CHECK(!baseFragShader.compare(fragShader));
1302 int UtcDaliTextureGetPixelFormat(void)
1304 TestApplication application;
1306 uint32_t height(64);
1308 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
1309 DALI_TEST_EQUALS(texture.GetPixelFormat(), Pixel::RGBA8888, TEST_LOCATION);
1311 texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGB888, width, height);
1312 DALI_TEST_EQUALS(texture.GetPixelFormat(), Pixel::RGB888, TEST_LOCATION);
1314 texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::L8, width, height);
1315 DALI_TEST_EQUALS(texture.GetPixelFormat(), Pixel::L8, TEST_LOCATION);
1317 texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::CHROMINANCE_U, width, height);
1318 DALI_TEST_EQUALS(texture.GetPixelFormat(), Pixel::CHROMINANCE_U, TEST_LOCATION);
1323 int utcDaliTexturePartialUpdate01(void)
1325 TestApplication application(
1326 TestApplication::DEFAULT_SURFACE_WIDTH,
1327 TestApplication::DEFAULT_SURFACE_HEIGHT,
1328 TestApplication::DEFAULT_HORIZONTAL_DPI,
1329 TestApplication::DEFAULT_VERTICAL_DPI,
1333 tet_infoline("Check the damaged rect with partial update and texture change");
1335 const TestGlAbstraction::ScissorParams& glScissorParams(application.GetGlAbstraction().GetScissorParams());
1337 std::vector<Rect<int32_t>> damagedRects;
1338 Rect<int32_t> clippingRect;
1340 Geometry geometry = CreateQuadGeometry();
1341 Shader shader = Shader::New("vertexSrc", "fragmentSrc");
1342 Renderer renderer = Renderer::New(geometry, shader);
1346 Texture texture = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
1347 TextureSet textureSet = TextureSet::New();
1348 textureSet.SetTexture(0u, texture);
1349 renderer.SetTextures(textureSet);
1351 Actor actor = Actor::New();
1352 actor.AddRenderer(renderer);
1354 actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1355 actor.SetProperty(Actor::Property::POSITION, Vector3(16.0f, 16.0f, 0.0f));
1356 actor.SetProperty(Actor::Property::SIZE, Vector3(16.0f, 16.0f, 0.0f));
1357 application.GetScene().Add(actor);
1359 damagedRects.clear();
1360 application.SendNotification();
1361 application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects);
1362 DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION);
1365 clippingRect = Rect<int32_t>(16, 768, 32, 32); // in screen coordinates
1366 DALI_TEST_EQUALS<Rect<int32_t>>(clippingRect, damagedRects[0], TEST_LOCATION);
1367 application.RenderWithPartialUpdate(damagedRects, clippingRect);
1368 DALI_TEST_EQUALS(clippingRect.x, glScissorParams.x, TEST_LOCATION);
1369 DALI_TEST_EQUALS(clippingRect.y, glScissorParams.y, TEST_LOCATION);
1370 DALI_TEST_EQUALS(clippingRect.width, glScissorParams.width, TEST_LOCATION);
1371 DALI_TEST_EQUALS(clippingRect.height, glScissorParams.height, TEST_LOCATION);
1373 damagedRects.clear();
1374 application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects);
1375 application.RenderWithPartialUpdate(damagedRects, clippingRect);
1377 // Ensure the damaged rect is empty
1378 DALI_TEST_EQUALS(damagedRects.size(), 0, TEST_LOCATION);
1381 uint32_t bufferSize(width * height * 4);
1382 uint8_t* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
1383 PixelData pixelData = PixelData::New(buffer, bufferSize, width, height, Pixel::RGBA8888, PixelData::FREE);
1384 texture.Upload(pixelData);
1386 damagedRects.clear();
1387 application.SendNotification();
1388 application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects);
1389 DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION);
1392 clippingRect = Rect<int32_t>(16, 768, 32, 32); // in screen coordinates
1393 DALI_TEST_EQUALS<Rect<int32_t>>(clippingRect, damagedRects[0], TEST_LOCATION);
1394 application.RenderWithPartialUpdate(damagedRects, clippingRect);
1395 DALI_TEST_EQUALS(clippingRect.x, glScissorParams.x, TEST_LOCATION);
1396 DALI_TEST_EQUALS(clippingRect.y, glScissorParams.y, TEST_LOCATION);
1397 DALI_TEST_EQUALS(clippingRect.width, glScissorParams.width, TEST_LOCATION);
1398 DALI_TEST_EQUALS(clippingRect.height, glScissorParams.height, TEST_LOCATION);
1400 damagedRects.clear();
1401 application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects);
1402 application.RenderWithPartialUpdate(damagedRects, clippingRect);
1404 // Ensure the damaged rect is empty
1405 DALI_TEST_EQUALS(damagedRects.size(), 0, TEST_LOCATION);
1410 int utcDaliTexturePartialUpdate02(void)
1412 TestApplication application(
1413 TestApplication::DEFAULT_SURFACE_WIDTH,
1414 TestApplication::DEFAULT_SURFACE_HEIGHT,
1415 TestApplication::DEFAULT_HORIZONTAL_DPI,
1416 TestApplication::DEFAULT_VERTICAL_DPI,
1420 tet_infoline("Check the damaged rect with partial update and texture change");
1422 const TestGlAbstraction::ScissorParams& glScissorParams(application.GetGlAbstraction().GetScissorParams());
1424 std::vector<Rect<int32_t>> damagedRects;
1425 Rect<int32_t> clippingRect;
1427 Geometry geometry = CreateQuadGeometry();
1428 Shader shader = Shader::New("vertexSrc", "fragmentSrc");
1429 Renderer renderer = Renderer::New(geometry, shader);
1433 Texture texture1 = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
1434 Texture texture2 = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
1435 TextureSet textureSet = TextureSet::New();
1436 textureSet.SetTexture(0u, texture1);
1437 renderer.SetTextures(textureSet);
1439 Actor actor = Actor::New();
1440 actor.AddRenderer(renderer);
1442 actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1443 actor.SetProperty(Actor::Property::POSITION, Vector3(16.0f, 16.0f, 0.0f));
1444 actor.SetProperty(Actor::Property::SIZE, Vector3(16.0f, 16.0f, 0.0f));
1445 application.GetScene().Add(actor);
1447 damagedRects.clear();
1448 application.SendNotification();
1449 application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects);
1450 DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION);
1453 clippingRect = Rect<int32_t>(16, 768, 32, 32); // in screen coordinates, includes 3 last frames updates
1454 DALI_TEST_EQUALS<Rect<int32_t>>(clippingRect, damagedRects[0], TEST_LOCATION);
1455 application.RenderWithPartialUpdate(damagedRects, clippingRect);
1456 DALI_TEST_EQUALS(clippingRect.x, glScissorParams.x, TEST_LOCATION);
1457 DALI_TEST_EQUALS(clippingRect.y, glScissorParams.y, TEST_LOCATION);
1458 DALI_TEST_EQUALS(clippingRect.width, glScissorParams.width, TEST_LOCATION);
1459 DALI_TEST_EQUALS(clippingRect.height, glScissorParams.height, TEST_LOCATION);
1461 damagedRects.clear();
1462 application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects);
1463 application.RenderWithPartialUpdate(damagedRects, clippingRect);
1465 // Ensure the damaged rect is empty
1466 DALI_TEST_EQUALS(damagedRects.size(), 0, TEST_LOCATION);
1468 // Set another texture
1469 textureSet.SetTexture(0u, texture2);
1471 damagedRects.clear();
1472 application.SendNotification();
1473 application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects);
1474 DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION);
1477 clippingRect = Rect<int32_t>(16, 768, 32, 32); // in screen coordinates, includes 3 last frames updates
1478 DALI_TEST_EQUALS<Rect<int32_t>>(clippingRect, damagedRects[0], TEST_LOCATION);
1479 application.RenderWithPartialUpdate(damagedRects, clippingRect);
1480 DALI_TEST_EQUALS(clippingRect.x, glScissorParams.x, TEST_LOCATION);
1481 DALI_TEST_EQUALS(clippingRect.y, glScissorParams.y, TEST_LOCATION);
1482 DALI_TEST_EQUALS(clippingRect.width, glScissorParams.width, TEST_LOCATION);
1483 DALI_TEST_EQUALS(clippingRect.height, glScissorParams.height, TEST_LOCATION);
1485 damagedRects.clear();
1486 application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects);
1487 application.RenderWithPartialUpdate(damagedRects, clippingRect);
1489 // Ensure the damaged rect is empty
1490 DALI_TEST_EQUALS(damagedRects.size(), 0, TEST_LOCATION);