2 * Copyright (c) 2021 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 * 2;
210 buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
211 PixelData pixelDataSubImage = PixelData::New(buffer, bufferSize, width, height, 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, width, height, 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, width, height, 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 * 2;
538 buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
539 PixelData pixelDataSubImage = PixelData::New(buffer, bufferSize, width, height, 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 UtcDaliTextureUploadPixelFormats(void)
659 TestApplication application;
660 application.GetGlAbstraction().EnableTextureCallTrace(true);
663 unsigned int width(64);
664 unsigned int height(64);
666 std::vector<Pixel::Format> formats =
682 Pixel::DEPTH_UNSIGNED_INT,
684 Pixel::DEPTH_STENCIL,
690 for(auto format : formats)
692 tet_infoline("Creating a Texure with a new or recent format");
693 Texture texture = CreateTexture(TextureType::TEXTURE_2D, format, width, height);
695 application.SendNotification();
696 application.Render();
698 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
700 tet_infoline("TexImage2D should be called twice per texture");
701 DALI_TEST_EQUALS(callStack.CountMethod("TexImage2D"), 2, TEST_LOCATION);
703 std::stringstream out;
704 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
705 DALI_TEST_CHECK(callStack.FindMethodAndParams("TexImage2D", out.str().c_str()));
713 int UtcDaliTextureUploadSmallerThanSize(void)
715 TestApplication application;
718 unsigned int width(64);
719 unsigned int height(64);
720 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
722 application.GetGlAbstraction().EnableTextureCallTrace(true);
724 application.SendNotification();
725 application.Render();
727 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
728 callStack.EnableLogging(true);
729 TraceCallStack& texParamCallStack = application.GetGlAbstraction().GetTexParameterTrace();
730 texParamCallStack.EnableLogging(true);
732 tet_infoline("TexImage2D should be called with a null pointer to reserve storage for the texture in the gpu");
734 std::stringstream out;
735 out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height;
737 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters("TexImage2D", params));
738 DALI_TEST_EQUALS(out.str(), params, TEST_LOCATION);
741 //Upload data to the texture
744 unsigned int bufferSize(width * height * 4);
745 unsigned char* buffer = reinterpret_cast<unsigned char*>(malloc(bufferSize));
746 PixelData pixelData = PixelData::New(buffer, bufferSize, width / 2, height / 2, Pixel::RGBA8888, PixelData::FREE);
747 texture.Upload(pixelData);
748 application.SendNotification();
749 application.Render();
751 //TexSubImage2D should be called to upload the data
753 std::stringstream out;
754 out << GL_TEXTURE_2D << ", " << 0u << ", " << 0u << ", " << 0u << ", " << width / 2 << ", " << height / 2;
756 DALI_TEST_CHECK(callStack.FindMethodAndGetParameters("TexSubImage2D", params));
757 DALI_TEST_EQUALS(out.str(), params, TEST_LOCATION);
762 int UtcDaliTextureGenerateMipmaps(void)
764 TestApplication application;
765 unsigned int width(64);
766 unsigned int height(64);
768 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
769 texture.GenerateMipmaps();
771 Texture textureCubemap = CreateTexture(TextureType::TEXTURE_CUBE, Pixel::RGBA8888, width, height);
772 textureCubemap.GenerateMipmaps();
774 application.GetGlAbstraction().EnableTextureCallTrace(true);
775 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
776 application.SendNotification();
777 application.Render();
780 std::stringstream out;
781 out << GL_TEXTURE_2D;
782 DALI_TEST_CHECK(callStack.FindMethodAndParams("GenerateMipmap", out.str().c_str()));
785 std::stringstream out;
786 out << GL_TEXTURE_CUBE_MAP;
787 DALI_TEST_CHECK(callStack.FindMethodAndParams("GenerateMipmap", out.str().c_str()));
793 int UtcDaliTextureGetWidth(void)
795 TestApplication application;
796 unsigned int width(64);
797 unsigned int height(64);
799 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
800 DALI_TEST_EQUALS(texture.GetWidth(), width, TEST_LOCATION);
804 int UtcDaliTextureGetHeight(void)
806 TestApplication application;
807 unsigned int width(64);
808 unsigned int height(64);
810 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
811 DALI_TEST_EQUALS(texture.GetHeight(), height, TEST_LOCATION);
816 int UtcDaliTextureContextLoss(void)
818 tet_infoline("UtcDaliTextureContextLoss\n");
819 TestApplication application;
822 unsigned int width(64);
823 unsigned int height(64);
824 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
825 DALI_TEST_CHECK(texture);
827 application.SendNotification();
828 application.Render(16);
830 // Lose & regain context (in render 'thread')
831 application.ResetContext();
832 DALI_TEST_CHECK(texture);
837 int UtcDaliNativeImageTexture01(void)
839 TestApplication application;
840 tet_infoline("UtcDaliNativeImageTexture01");
842 TestNativeImagePointer imageInterface = TestNativeImage::New(16, 16);
844 Texture texture = Texture::New(*(imageInterface.Get()));
845 Actor actor = CreateRenderableActor(texture, "", "");
846 application.GetScene().Add(actor);
848 DALI_TEST_CHECK(texture);
850 application.SendNotification();
851 application.Render(16);
853 DALI_TEST_EQUALS(imageInterface->mExtensionCreateCalls, 1, TEST_LOCATION);
854 DALI_TEST_EQUALS(imageInterface->mExtensionDestroyCalls, 0, TEST_LOCATION);
855 DALI_TEST_EQUALS(actor.GetProperty(Actor::Property::SIZE), Property::Value(Vector3(16, 16, 0)), TEST_LOCATION);
857 UnparentAndReset(actor);
859 application.SendNotification();
860 application.Render(16);
862 application.SendNotification();
863 application.Render(16);
865 DALI_TEST_EQUALS(imageInterface->mExtensionCreateCalls, 1, TEST_LOCATION);
866 DALI_TEST_EQUALS(imageInterface->mExtensionDestroyCalls, 1, TEST_LOCATION);
871 int UtcDaliNativeImageTexture02(void)
873 TestApplication application;
874 tet_infoline("UtcDaliNativeImageTexture02 - test error on TargetTexture");
876 TestNativeImagePointer imageInterface = TestNativeImage::New(16, 16);
877 imageInterface->mTargetTextureError = 1u;
879 Texture texture = Texture::New(*(imageInterface.Get()));
880 Actor actor = CreateRenderableActor(texture, "", "");
881 application.GetScene().Add(actor);
883 DALI_TEST_CHECK(texture);
885 application.SendNotification();
886 application.Render(16);
888 // Expect 2 attempts to create the texture - once when adding the texture
889 // to the scene-graph, and again since that failed, during the Bind.
890 // The second one succeeds (TargetTexture only errors once)
891 DALI_TEST_EQUALS(imageInterface->mExtensionCreateCalls, 2, TEST_LOCATION);
892 DALI_TEST_EQUALS(imageInterface->mExtensionDestroyCalls, 1, TEST_LOCATION);
894 UnparentAndReset(actor);
896 application.SendNotification();
897 application.Render(16);
899 application.SendNotification();
900 application.Render(16);
902 // Expect that there are no further calls to create/destroy resource
903 DALI_TEST_EQUALS(imageInterface->mExtensionCreateCalls, 2, TEST_LOCATION);
904 DALI_TEST_EQUALS(imageInterface->mExtensionDestroyCalls, 2, TEST_LOCATION);
909 int UtcDaliTextureGenerateMipmapsNegative(void)
911 TestApplication application;
912 Dali::Texture instance;
915 instance.GenerateMipmaps();
916 DALI_TEST_CHECK(false); // Should not get here
920 DALI_TEST_CHECK(true); // We expect an assert
925 int UtcDaliTextureUploadNegative01(void)
927 TestApplication application;
928 Dali::Texture instance;
931 Dali::PixelData arg1;
932 instance.Upload(arg1);
933 DALI_TEST_CHECK(false); // Should not get here
937 DALI_TEST_CHECK(true); // We expect an assert
942 int UtcDaliTextureUploadNegative02(void)
944 TestApplication application;
945 Dali::Texture instance;
948 Dali::PixelData arg1;
949 unsigned int arg2(0u);
950 unsigned int arg3(0u);
951 unsigned int arg4(0u);
952 unsigned int arg5(0u);
953 unsigned int arg6(0u);
954 unsigned int arg7(0u);
955 instance.Upload(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
956 DALI_TEST_CHECK(false); // Should not get here
960 DALI_TEST_CHECK(true); // We expect an assert
965 int UtcDaliTextureGetWidthNegative(void)
967 TestApplication application;
968 Dali::Texture instance;
972 DALI_TEST_CHECK(false); // Should not get here
976 DALI_TEST_CHECK(true); // We expect an assert
981 int UtcDaliTextureGetHeightNegative(void)
983 TestApplication application;
984 Dali::Texture instance;
987 instance.GetHeight();
988 DALI_TEST_CHECK(false); // Should not get here
992 DALI_TEST_CHECK(true); // We expect an assert
997 int UtcDaliTextureCheckNativeP(void)
999 TestApplication application;
1000 TestNativeImagePointer testNativeImage = TestNativeImage::New(64u, 64u);
1001 Texture nativeTexture = Texture::New(*testNativeImage);
1003 DALI_TEST_CHECK(nativeTexture);
1004 DALI_TEST_CHECK(DevelTexture::IsNative(nativeTexture));
1008 int UtcDaliTextureCheckNativeN1(void)
1010 TestApplication application;
1011 unsigned int width(64);
1012 unsigned int height(64);
1013 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
1015 DALI_TEST_CHECK(texture);
1016 DALI_TEST_CHECK(!DevelTexture::IsNative(texture));
1020 int UtcDaliTextureCheckNativeN2(void)
1022 TestApplication application;
1026 bool native = DevelTexture::IsNative(texture);
1027 DALI_TEST_CHECK(native != native);
1031 DALI_TEST_CHECK(true);
1036 int UtcDaliTextureApplyFragShaderP1(void)
1038 TestApplication application;
1039 TestNativeImagePointer testNativeImage = TestNativeImage::New(64u, 64u);
1040 Texture nativeTexture = Texture::New(*testNativeImage);
1041 DALI_TEST_CHECK(nativeTexture);
1043 const std::string baseFragShader =
1044 "varying mediump vec4 uColor;\n"
1046 " gl_FragColor=uColor;\n"
1048 std::string fragShader = baseFragShader;
1049 bool applied = DevelTexture::ApplyNativeFragmentShader(nativeTexture, fragShader);
1051 std::string fragPrefix = "#extension GL_OES_EGL_image_external:require\n";
1053 DALI_TEST_CHECK(applied);
1054 DALI_TEST_CHECK(baseFragShader.compare(fragShader));
1055 DALI_TEST_CHECK(fragShader.compare(fragPrefix + baseFragShader) == 0);
1056 DALI_TEST_CHECK(!fragShader.empty());
1060 int UtcDaliTextureApplyFragShaderP2(void)
1062 TestApplication application;
1063 TestNativeImagePointer testNativeImage = TestNativeImage::New(64u, 64u);
1064 Texture nativeTexture = Texture::New(*testNativeImage);
1065 DALI_TEST_CHECK(nativeTexture);
1067 const std::string baseFragShader =
1068 "varying mediump vec4 uColor;\n"
1069 "varying vec2 vTexCoord;\n"
1070 "uniform sampler2D uNative;\n"
1072 " gl_FragColor=uColor*texture2D(uNative, vTexCoord);\n"
1074 std::string fragShader = baseFragShader;
1075 bool applied = DevelTexture::ApplyNativeFragmentShader(nativeTexture, fragShader);
1077 DALI_TEST_CHECK(applied);
1078 DALI_TEST_CHECK(baseFragShader.compare(fragShader));
1079 DALI_TEST_CHECK(!fragShader.empty());
1080 DALI_TEST_CHECK(fragShader.find("samplerExternalOES") < fragShader.length());
1084 int UtcDaliTextureApplyFragShaderN1(void)
1086 TestApplication application;
1087 TestNativeImagePointer testNativeImage = TestNativeImage::New(64u, 64u);
1088 Texture nativeTexture = Texture::New(*testNativeImage);
1089 DALI_TEST_CHECK(nativeTexture);
1091 std::string fragShader;
1092 bool applied = DevelTexture::ApplyNativeFragmentShader(nativeTexture, fragShader);
1094 DALI_TEST_CHECK(!applied);
1095 DALI_TEST_CHECK(fragShader.empty());
1099 int UtcDaliTextureApplyFragShaderN2(void)
1101 TestApplication application;
1102 unsigned int width(64);
1103 unsigned int height(64);
1104 Texture texture = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height);
1106 const std::string baseFragShader =
1107 "varying mediump vec4 uColor;\n"
1109 " gl_FragColor=uColor;\n"
1111 std::string fragShader = baseFragShader;
1112 bool applied = DevelTexture::ApplyNativeFragmentShader(texture, fragShader);
1114 DALI_TEST_CHECK(!applied);
1115 DALI_TEST_CHECK(!baseFragShader.compare(fragShader));