[Tizen] Allow to set empty data for vertex buffer (latest) 18/317618/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Mon, 6 Jan 2025 04:11:13 +0000 (13:11 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Mon, 6 Jan 2025 04:12:22 +0000 (13:12 +0900)
Let we allow to set data with nullptr and size 0 for VertexBuffer

Change-Id: Ibee9f3743cee4348602bf8a74f5ad9455a22c5b6
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali/utc-Dali-VertexBuffer.cpp
dali/internal/event/rendering/vertex-buffer-impl.cpp

index d72fa2babc362c13ab4ea37bf0a83dbb549bcf4f..b4358a3c474e9a1176e2c2d2ff74f834e5149a59 100644 (file)
@@ -411,7 +411,7 @@ int UtcDaliVertexBufferInvalidTypeN02(void)
   END_TEST;
 }
 
-int UtcDaliVertexBufferSetDataNegative(void)
+int UtcDaliVertexBufferSetDataNegative01(void)
 {
   TestApplication    application;
   Dali::VertexBuffer instance;
@@ -429,6 +429,88 @@ int UtcDaliVertexBufferSetDataNegative(void)
   END_TEST;
 }
 
+int UtcDaliVertexBufferSetDataNegative02(void)
+{
+  TestApplication    application;
+
+  Property::Map texturedQuadVertexFormat = Property::Map{{"aPosition", Property::VECTOR2},
+                                                         {"aTexCoord", Property::VECTOR2},
+                                                         {"aColor", Property::VECTOR4}};
+
+  try
+  {
+    VertexBuffer vertexBuffer = VertexBuffer::New(texturedQuadVertexFormat);
+
+    void*    data(nullptr);
+    uint32_t dataSize(1u);
+
+    vertexBuffer.SetData(data, dataSize);
+    DALI_TEST_CHECK(false); // Should not get here
+  }
+  catch(Dali::DaliException& e)
+  {
+    DALI_TEST_ASSERT(e, "VertexBuffer::SetData() data was nullptr but size is not zero!", TEST_LOCATION);
+  }
+  END_TEST;
+}
+
+int UtcDaliVertexBufferSetDataWithZeroLength(void)
+{
+  TestApplication    application;
+
+  Property::Map texturedQuadVertexFormat = Property::Map{{"aPosition", Property::VECTOR2},
+                                                         {"aTexCoord", Property::VECTOR2},
+                                                         {"aColor", Property::VECTOR4}};
+
+  try
+  {
+    VertexBuffer vertexBuffer = VertexBuffer::New(texturedQuadVertexFormat);
+
+    void*    data(nullptr);
+    uint32_t dataSize(0u);
+
+    vertexBuffer.SetData(data, dataSize);
+
+    Geometry geometry = Geometry::New();
+    geometry.AddVertexBuffer(vertexBuffer);
+
+    Shader   shader   = CreateShader();
+    Renderer renderer = Renderer::New(geometry, shader);
+    Actor    actor    = Actor::New();
+    actor.SetProperty(Actor::Property::SIZE, Vector3::ONE * 100.f);
+    actor.AddRenderer(renderer);
+    application.GetScene().Add(actor);
+
+    application.SendNotification();
+    application.Render();
+
+    const float halfQuadSize = .5f;
+    struct TexturedQuadVertex
+    {
+      Vector2 position;
+      Vector2 textureCoordinates;
+    };
+    TexturedQuadVertex texturedQuadVertexData[4] = {
+      {Vector2(-halfQuadSize, -halfQuadSize), Vector2(0.f, 0.f)},
+      {Vector2(halfQuadSize, -halfQuadSize), Vector2(1.f, 0.f)},
+      {Vector2(-halfQuadSize, halfQuadSize), Vector2(0.f, 1.f)},
+      {Vector2(halfQuadSize, halfQuadSize), Vector2(1.f, 1.f)}};
+
+    // Re-upload the data on the vertexBuffer with zero length
+    vertexBuffer.SetData(texturedQuadVertexData, 0u);
+
+    application.SendNotification();
+    application.Render(0);
+
+    DALI_TEST_CHECK(true); // Should get here without exception
+  }
+  catch(Dali::DaliException& e)
+  {
+    DALI_TEST_CHECK(false); // Should not get here
+  }
+  END_TEST;
+}
+
 int UtcDaliVertexBufferGetSizeNegative(void)
 {
   TestApplication    application;
index 7666908a54b99cab87acfdb7f209236b1b674f4a..24b24c53209ab06fc8914795ba1bf9a20ad712bf 100644 (file)
@@ -148,6 +148,8 @@ VertexBufferPtr VertexBuffer::New(Dali::Property::Map& format)
 
 void VertexBuffer::SetData(const void* data, uint32_t size)
 {
+  DALI_ASSERT_ALWAYS((data || (size == 0u)) && "VertexBuffer::SetData() data was nullptr but size is not zero!");
+
   mSize = size; // size is the number of elements
 
   uint32_t bufferSize = mBufferFormatSize * mSize;