2 * Copyright (c) 2023 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/public-api/dali-core.h>
23 #include <mesh-builder.h>
25 void vertexBuffer_test_startup(void)
27 test_return_value = TET_UNDEF;
30 void vertexBuffer_test_cleanup(void)
32 test_return_value = TET_PASS;
35 int UtcDaliVertexBufferNew01(void)
37 TestApplication application;
39 Property::Map texturedQuadVertexFormat;
40 texturedQuadVertexFormat["aPosition"] = Property::VECTOR2;
41 texturedQuadVertexFormat["aVertexCoord"] = Property::VECTOR2;
43 VertexBuffer vertexBuffer = VertexBuffer::New(texturedQuadVertexFormat);
45 DALI_TEST_EQUALS((bool)vertexBuffer, true, TEST_LOCATION);
49 int UtcDaliVertexBufferNew02(void)
51 TestApplication application;
52 VertexBuffer vertexBuffer;
53 DALI_TEST_EQUALS((bool)vertexBuffer, false, TEST_LOCATION);
57 int UtcDaliVertexBufferDownCast01(void)
59 TestApplication application;
61 Property::Map texturedQuadVertexFormat;
62 texturedQuadVertexFormat["aPosition"] = Property::VECTOR2;
63 texturedQuadVertexFormat["aVertexCoord"] = Property::VECTOR2;
65 VertexBuffer vertexBuffer = VertexBuffer::New(texturedQuadVertexFormat);
67 BaseHandle handle(vertexBuffer);
68 VertexBuffer vertexBuffer2 = VertexBuffer::DownCast(handle);
69 DALI_TEST_EQUALS((bool)vertexBuffer2, true, TEST_LOCATION);
73 int UtcDaliVertexBufferDownCast02(void)
75 TestApplication application;
77 Handle handle = Handle::New(); // Create a custom object
78 VertexBuffer vertexBuffer = VertexBuffer::DownCast(handle);
79 DALI_TEST_EQUALS((bool)vertexBuffer, false, TEST_LOCATION);
83 int UtcDaliVertexBufferCopyConstructor(void)
85 TestApplication application;
87 VertexBuffer vertexBuffer = CreateVertexBuffer();
89 VertexBuffer vertexBufferCopy(vertexBuffer);
91 DALI_TEST_EQUALS((bool)vertexBufferCopy, true, TEST_LOCATION);
92 DALI_TEST_EQUALS(vertexBufferCopy.GetSize(), 0u, TEST_LOCATION);
97 int UtcDaliVertexBufferAssignmentOperator(void)
99 TestApplication application;
101 VertexBuffer vertexBuffer = CreateVertexBuffer();
103 VertexBuffer vertexBuffer2;
104 DALI_TEST_EQUALS((bool)vertexBuffer2, false, TEST_LOCATION);
106 vertexBuffer2 = vertexBuffer;
107 DALI_TEST_EQUALS((bool)vertexBuffer2, true, TEST_LOCATION);
108 DALI_TEST_EQUALS(vertexBuffer2.GetSize(), 0u, TEST_LOCATION);
113 int UtcDaliVertexBufferMoveConstructor(void)
115 TestApplication application;
117 VertexBuffer vertexBuffer = CreateVertexBuffer();
118 DALI_TEST_CHECK(vertexBuffer);
119 DALI_TEST_EQUALS(1, vertexBuffer.GetBaseObject().ReferenceCount(), TEST_LOCATION);
120 DALI_TEST_EQUALS(0u, vertexBuffer.GetSize(), TEST_LOCATION);
122 VertexBuffer move = std::move(vertexBuffer);
123 DALI_TEST_CHECK(move);
124 DALI_TEST_EQUALS(1, move.GetBaseObject().ReferenceCount(), TEST_LOCATION);
125 DALI_TEST_EQUALS(0u, move.GetSize(), TEST_LOCATION);
126 DALI_TEST_CHECK(!vertexBuffer);
131 int UtcDaliVertexBufferMoveAssignment(void)
133 TestApplication application;
135 VertexBuffer vertexBuffer = CreateVertexBuffer();
136 DALI_TEST_CHECK(vertexBuffer);
137 DALI_TEST_EQUALS(1, vertexBuffer.GetBaseObject().ReferenceCount(), TEST_LOCATION);
138 DALI_TEST_EQUALS(0u, vertexBuffer.GetSize(), TEST_LOCATION);
141 move = std::move(vertexBuffer);
142 DALI_TEST_CHECK(move);
143 DALI_TEST_EQUALS(1, move.GetBaseObject().ReferenceCount(), TEST_LOCATION);
144 DALI_TEST_EQUALS(0u, move.GetSize(), TEST_LOCATION);
145 DALI_TEST_CHECK(!vertexBuffer);
150 int UtcDaliVertexBufferSetData01(void)
152 TestApplication application;
154 Property::Map texturedQuadVertexFormat;
155 texturedQuadVertexFormat["aPosition"] = Property::VECTOR2;
156 texturedQuadVertexFormat["aVertexCoord"] = Property::VECTOR2;
159 VertexBuffer vertexBuffer = VertexBuffer::New(texturedQuadVertexFormat);
160 DALI_TEST_EQUALS((bool)vertexBuffer, true, TEST_LOCATION);
162 const float halfQuadSize = .5f;
163 struct TexturedQuadVertex
166 Vector2 textureCoordinates;
168 TexturedQuadVertex texturedQuadVertexData[4] = {
169 {Vector2(-halfQuadSize, -halfQuadSize), Vector2(0.f, 0.f)},
170 {Vector2(halfQuadSize, -halfQuadSize), Vector2(1.f, 0.f)},
171 {Vector2(-halfQuadSize, halfQuadSize), Vector2(0.f, 1.f)},
172 {Vector2(halfQuadSize, halfQuadSize), Vector2(1.f, 1.f)}};
174 vertexBuffer.SetData(texturedQuadVertexData, 4);
176 Geometry geometry = Geometry::New();
177 geometry.AddVertexBuffer(vertexBuffer);
179 Shader shader = CreateShader();
180 Renderer renderer = Renderer::New(geometry, shader);
181 Actor actor = Actor::New();
182 actor.SetProperty(Actor::Property::SIZE, Vector3::ONE * 100.f);
183 actor.AddRenderer(renderer);
184 application.GetScene().Add(actor);
186 auto& drawTrace = application.GetGlAbstraction().GetDrawTrace();
187 drawTrace.Enable(true);
189 application.SendNotification();
190 application.Render(0);
191 application.Render();
192 application.SendNotification();
194 const TestGlAbstraction::BufferDataCalls& bufferDataCalls =
195 application.GetGlAbstraction().GetBufferDataCalls();
197 DALI_TEST_CHECK(drawTrace.FindMethod("DrawArrays"));
199 DALI_TEST_EQUALS(bufferDataCalls.size(), 3u, TEST_LOCATION);
201 DALI_TEST_EQUALS(bufferDataCalls[0], sizeof(texturedQuadVertexData), TEST_LOCATION);
203 // end of scope to let the buffer and geometry die; do another notification and render to get the deletion processed
204 application.SendNotification();
205 application.Render(0);
210 int UtcDaliVertexBufferSetData02(void)
212 TestApplication application;
214 Property::Map texturedQuadVertexFormat;
215 texturedQuadVertexFormat["aPosition"] = Property::VECTOR2;
216 texturedQuadVertexFormat["aVertexCoord"] = Property::VECTOR2;
218 VertexBuffer vertexBuffer = VertexBuffer::New(texturedQuadVertexFormat);
219 DALI_TEST_EQUALS((bool)vertexBuffer, true, TEST_LOCATION);
221 const float halfQuadSize = .5f;
222 struct TexturedQuadVertex
225 Vector2 textureCoordinates;
227 TexturedQuadVertex texturedQuadVertexData[4] = {
228 {Vector2(-halfQuadSize, -halfQuadSize), Vector2(0.f, 0.f)},
229 {Vector2(halfQuadSize, -halfQuadSize), Vector2(1.f, 0.f)},
230 {Vector2(-halfQuadSize, halfQuadSize), Vector2(0.f, 1.f)},
231 {Vector2(halfQuadSize, halfQuadSize), Vector2(1.f, 1.f)}};
233 vertexBuffer.SetData(texturedQuadVertexData, 4);
235 Geometry geometry = Geometry::New();
236 geometry.AddVertexBuffer(vertexBuffer);
238 Shader shader = CreateShader();
239 Renderer renderer = Renderer::New(geometry, shader);
240 Actor actor = Actor::New();
241 actor.SetProperty(Actor::Property::SIZE, Vector3::ONE * 100.f);
242 actor.AddRenderer(renderer);
243 application.GetScene().Add(actor);
245 application.SendNotification();
246 application.Render();
249 const TestGlAbstraction::BufferSubDataCalls& bufferSubDataCalls =
250 application.GetGlAbstraction().GetBufferSubDataCalls();
252 const TestGlAbstraction::BufferDataCalls& bufferDataCalls =
253 application.GetGlAbstraction().GetBufferDataCalls();
255 // Should be 1 (Flush standalone uniform buffer per each RenderScene)
256 DALI_TEST_EQUALS(bufferSubDataCalls.size(), 1u, TEST_LOCATION);
257 DALI_TEST_EQUALS(bufferDataCalls.size(), 2u, TEST_LOCATION);
259 DALI_TEST_EQUALS(bufferDataCalls[0], sizeof(texturedQuadVertexData), TEST_LOCATION);
262 // Re-upload the data on the vertexBuffer
263 vertexBuffer.SetData(texturedQuadVertexData, 4);
265 application.SendNotification();
266 application.Render(0);
271 int UtcDaliVertexBufferMapInitializerList(void)
273 TestApplication application;
275 Property::Map texturedQuadVertexFormat = Property::Map{{"aPosition", Property::VECTOR2},
276 {"aTexCoord", Property::VECTOR2},
277 {"aColor", Property::VECTOR4}};
281 VertexBuffer vertexBuffer = VertexBuffer::New(texturedQuadVertexFormat);
282 tet_result(TET_PASS);
284 catch(Dali::DaliException& e)
286 // Shouldn't assert any more
287 tet_result(TET_FAIL);
292 int UtcDaliVertexBufferInvalidTypeN01(void)
294 TestApplication application;
296 Property::Map texturedQuadVertexFormat;
297 texturedQuadVertexFormat["aPosition"] = Property::MAP;
298 texturedQuadVertexFormat["aVertexCoord"] = Property::STRING;
302 VertexBuffer vertexBuffer = VertexBuffer::New(texturedQuadVertexFormat);
303 tet_result(TET_FAIL);
305 catch(Dali::DaliException& e)
307 DALI_TEST_ASSERT(e, "Property::Type not supported in VertexBuffer", TEST_LOCATION);
312 int UtcDaliVertexBufferInvalidTypeN02(void)
314 TestApplication application;
316 Property::Map texturedQuadVertexFormat = Property::Map{{"aPosition", Property::MAP},
317 {"aTexCoord", Property::STRING},
318 {"aColor", Property::VECTOR4}};
322 VertexBuffer vertexBuffer = VertexBuffer::New(texturedQuadVertexFormat);
323 tet_result(TET_FAIL);
325 catch(Dali::DaliException& e)
327 DALI_TEST_ASSERT(e, "Property::Type not supported in VertexBuffer", TEST_LOCATION);
332 int UtcDaliVertexBufferSetDataNegative(void)
334 TestApplication application;
335 Dali::VertexBuffer instance;
339 unsigned long arg2(0u);
340 instance.SetData(arg1, arg2);
341 DALI_TEST_CHECK(false); // Should not get here
345 DALI_TEST_CHECK(true); // We expect an assert
350 int UtcDaliVertexBufferGetSizeNegative(void)
352 TestApplication application;
353 Dali::VertexBuffer instance;
357 DALI_TEST_CHECK(false); // Should not get here
361 DALI_TEST_CHECK(true); // We expect an assert
366 int UtcDaliVertexBufferSetDivisor(void)
368 TestApplication application;
370 Property::Map texturedQuadVertexFormat;
371 texturedQuadVertexFormat["aPosition"] = Property::VECTOR2;
372 texturedQuadVertexFormat["aTexCoord"] = Property::VECTOR2;
374 Property::Map instanceFormat{{"aTranslate", Property::VECTOR2}, {"aColor", Property::VECTOR4}};
376 VertexBuffer vertexBuffer = VertexBuffer::New(texturedQuadVertexFormat);
377 DALI_TEST_EQUALS((bool)vertexBuffer, true, TEST_LOCATION);
379 DALI_TEST_EQUALS(0, vertexBuffer.GetDivisor(), TEST_LOCATION);
381 VertexBuffer instanceBuffer = VertexBuffer::New(instanceFormat);
382 DALI_TEST_EQUALS((bool)instanceBuffer, true, TEST_LOCATION);
384 const float halfQuadSize = .5f;
385 struct TexturedQuadVertex
388 Vector2 textureCoordinates;
390 TexturedQuadVertex texturedQuadVertexData[4] = {
391 {Vector2(-halfQuadSize, -halfQuadSize), Vector2(0.f, 0.f)},
392 {Vector2(halfQuadSize, -halfQuadSize), Vector2(1.f, 0.f)},
393 {Vector2(-halfQuadSize, halfQuadSize), Vector2(0.f, 1.f)},
394 {Vector2(halfQuadSize, halfQuadSize), Vector2(1.f, 1.f)}};
396 vertexBuffer.SetData(texturedQuadVertexData, 4);
404 InstanceData instanceData[] = {{Vector2(12, 33), Color::WHITE},
405 {Vector2(-2000, 43), Color::BLUE},
406 {Vector2(200, 43), Color::GREEN},
407 {Vector2(-243, 43), Color::TURQUOISE},
408 {Vector2(192, 43), Color::CYAN},
409 {Vector2(-2000, 43), Color::MAGENTA},
410 {Vector2(-292, 393), Color::BLUE},
411 {Vector2(-499, 128), Color::BLUE},
412 {Vector2(328, 43), Color::BLUE},
413 {Vector2(726, 43), Color::BLUE}};
414 instanceBuffer.SetData(instanceData, sizeof(instanceData) / sizeof(InstanceData));
415 instanceBuffer.SetDivisor(1);
416 DALI_TEST_EQUALS(1, instanceBuffer.GetDivisor(), TEST_LOCATION);
418 Geometry geometry = Geometry::New();
419 geometry.AddVertexBuffer(vertexBuffer);
420 geometry.AddVertexBuffer(instanceBuffer);
422 Shader shader = CreateShader();
423 Renderer renderer = Renderer::New(geometry, shader);
424 Actor actor = Actor::New();
425 actor.SetProperty(Actor::Property::SIZE, Vector3::ONE * 100.f);
426 actor.AddRenderer(renderer);
427 application.GetScene().Add(actor);
429 TestGlAbstraction& gl = application.GetGlAbstraction();
430 auto& bufferTrace = gl.GetBufferTrace();
431 auto& drawTrace = gl.GetDrawTrace();
432 bufferTrace.Enable(true);
433 drawTrace.Enable(true);
435 application.SendNotification();
436 application.Render();
438 TraceCallStack::NamedParams params;
439 params["divisor"] << "1";
440 DALI_TEST_CHECK(bufferTrace.FindMethodAndParams("VertexAttribDivisor", params));
442 TraceCallStack::NamedParams params2;
443 DALI_TEST_CHECK(drawTrace.FindMethodAndGetParameters("DrawArraysInstanced", params2));
444 std::ostringstream oss;
445 oss << sizeof(instanceData) / sizeof(InstanceData);
446 DALI_TEST_EQUALS(params2["instanceCount"].str(), oss.str(), TEST_LOCATION);