[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / dali-toolkit-test-utils / test-graphics-buffer.cpp
index 83b7899..456d978 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 namespace Dali
 {
-TestGraphicsBuffer::TestGraphicsBuffer(TraceCallStack& callStack, TestGlAbstraction& glAbstraction, uint32_t size, Graphics::BufferUsageFlags usage)
+TestGraphicsBuffer::TestGraphicsBuffer(const Graphics::BufferCreateInfo& createInfo, TestGraphicsController& controller, TestGlAbstraction& glAbstraction, TraceCallStack& callStack)
 : mCallStack(callStack),
+  mController(controller),
   mGl(glAbstraction),
-  mUsage(usage)
+  mCreateInfo(createInfo),
+  mUsage(createInfo.usage)
 {
-  memory.resize(size);
-  mGl.GetBufferTrace().EnableLogging(true);
+  if(createInfo.propertiesFlags & int(Graphics::BufferPropertiesFlagBit::CPU_ALLOCATED))
+  {
+    mCpuOnly = true;
+  }
+  else
+  {
+    mGl.GenBuffers(1, &mId);
+  }
+  memory.resize(createInfo.size);
+}
+
+TestGraphicsBuffer::~TestGraphicsBuffer()
+{
+  // Not strictly parameters, but useful for testing
+  TraceCallStack::NamedParams namedParams;
+  namedParams["usage"] << "0x" << std::hex << mCreateInfo.usage;
+  namedParams["propertiesFlags"] << mCreateInfo.propertiesFlags;
+
+  mCallStack.PushCall("Buffer::~Buffer", namedParams.str(), namedParams);
+  if(!mCpuOnly && mId)
+  {
+    mGl.DeleteBuffers(1, &mId);
+  }
+}
+
+void TestGraphicsBuffer::DiscardResource()
+{
+  mController.DiscardBuffer(this);
 }
 
 void TestGraphicsBuffer::Bind()
 {
   mCallStack.PushCall("Buffer::Bind", "");
-  if(!mId)
+  if(!mCpuOnly && mId > 0)
   {
-    mGl.GenBuffers(1, &mId);
+    mGl.BindBuffer(GetTarget(), mId);
   }
-  mGl.BindBuffer(GetTarget(), mId);
 }
 
 void TestGraphicsBuffer::Unbind()
 {
   mCallStack.PushCall("Buffer::Unbind", "");
-  if(mId)
+  if(!mCpuOnly)
   {
-    mGl.BindBuffer(GetTarget(), 0);
+    if(mId)
+    {
+      mGl.BindBuffer(GetTarget(), 0);
+    }
   }
 }
 
@@ -58,15 +88,19 @@ void TestGraphicsBuffer::Upload(uint32_t offset, uint32_t size)
   namedParams["offset"] << offset;
   namedParams["size"] << size;
   mCallStack.PushCall("Buffer::Upload", o.str(), namedParams);
-  if(size <= memory.size() && mCreated)
-  {
-    // Use subData to avoid re-allocation
-    mGl.BufferSubData(GetTarget(), offset, size, &memory[offset]);
-  }
-  else
+
+  if(!mCpuOnly)
   {
-    mGl.BufferData(GetTarget(), GLsizeiptr(size), &memory[0], GL_STATIC_DRAW); //@todo Query - do we need other usages?
-    mCreated = true;
+    if(size <= memory.size() && mCreated)
+    {
+      // Use subData to avoid re-allocation
+      mGl.BufferSubData(GetTarget(), static_cast<GLintptr>(static_cast<unsigned long>(offset)), static_cast<GLsizeiptr>(static_cast<unsigned long>(size)), &memory[offset]);
+    }
+    else
+    {
+      mGl.BufferData(GetTarget(), static_cast<GLsizeiptr>(static_cast<unsigned long>(size)), &memory[0], GL_STATIC_DRAW); //@todo Query - do we need other usages?
+      mCreated = true;
+    }
   }
 }
 
@@ -82,65 +116,67 @@ GLenum TestGraphicsBuffer::GetTarget()
 
 void TestGraphicsBuffer::BindAsUniformBuffer(const TestGraphicsProgram* program, const Dali::UniformBufferBindingDescriptor& uboBinding) const
 {
-  auto* reflection = static_cast<const TestGraphicsReflection*>(&program->GetReflection());
-
-  Graphics::UniformBlockInfo uboInfo{};
-  reflection->GetUniformBlock(0, uboInfo);
+  auto*       reflection = static_cast<const TestGraphicsReflection*>(&program->GetReflection());
+  const auto& uboInfo    = reflection->GetTestUniformBlock(0u);
 
   auto  offset = uboBinding.offset;
   auto* data   = memory.data() + offset;
 
   for(const auto& member : uboInfo.members)
   {
-    auto type = reflection->GetMemberType(0, member.location);
-    switch(type)
+    uint32_t numElements = member.numElements > 0 ? member.numElements : 1;
+
+    for(uint32_t i = 0; i < numElements; ++i)
     {
-      case Property::VECTOR4:
-      {
-        auto value = *reinterpret_cast<const Dali::Vector4*>(data + member.offset);
-        mGl.Uniform4f(member.location, value.x, value.y, value.z, value.w);
-        break;
-      }
-      case Property::VECTOR3:
-      {
-        auto value = *reinterpret_cast<const Dali::Vector3*>(data + member.offset);
-        mGl.Uniform3f(member.location, value.x, value.y, value.z);
-        break;
-      }
-      case Property::VECTOR2:
-      {
-        auto value = *reinterpret_cast<const Dali::Vector2*>(data + member.offset);
-        mGl.Uniform2f(member.location, value.x, value.y);
-        break;
-      }
-      case Property::FLOAT:
-      {
-        auto value = *reinterpret_cast<const float*>(data + member.offset);
-        mGl.Uniform1f(member.location, value);
-        break;
-      }
-      case Property::INTEGER:
-      {
-        auto ptr   = reinterpret_cast<const GLint*>(data + member.offset);
-        auto value = *ptr;
-        mGl.Uniform1i(member.location, value);
-        break;
-      }
-      case Property::MATRIX:
-      {
-        auto value = reinterpret_cast<const float*>(data + member.offset);
-        mGl.UniformMatrix4fv(member.location, 1, GL_FALSE, value);
-        break;
-      }
-      case Property::MATRIX3:
-      {
-        auto value = reinterpret_cast<const float*>(data + member.offset);
-        mGl.UniformMatrix3fv(member.location, 1, GL_FALSE, value);
-        break;
-      }
-      default:
+      switch(member.type)
       {
-        fprintf(stderr, "\n%s type not found\n", member.name.c_str());
+        case Property::VECTOR4:
+        {
+          auto value = *reinterpret_cast<const Dali::Vector4*>(data + member.offsets[i]);
+          mGl.Uniform4f(member.locations[i], value.x, value.y, value.z, value.w);
+          break;
+        }
+        case Property::VECTOR3:
+        {
+          auto value = *reinterpret_cast<const Dali::Vector3*>(data + member.offsets[i]);
+          mGl.Uniform3f(member.locations[i], value.x, value.y, value.z);
+          break;
+        }
+        case Property::VECTOR2:
+        {
+          auto value = *reinterpret_cast<const Dali::Vector2*>(data + member.offsets[i]);
+          mGl.Uniform2f(member.locations[i], value.x, value.y);
+          break;
+        }
+        case Property::FLOAT:
+        {
+          auto value = *reinterpret_cast<const float*>(data + member.offsets[i]);
+          mGl.Uniform1f(member.locations[i], value);
+          break;
+        }
+        case Property::INTEGER:
+        {
+          auto ptr   = reinterpret_cast<const GLint*>(data + member.offsets[i]);
+          auto value = *ptr;
+          mGl.Uniform1i(member.locations[i], value);
+          break;
+        }
+        case Property::MATRIX:
+        {
+          auto value = reinterpret_cast<const float*>(data + member.offsets[i]);
+          mGl.UniformMatrix4fv(member.locations[i], 1, GL_FALSE, value);
+          break;
+        }
+        case Property::MATRIX3:
+        {
+          auto value = reinterpret_cast<const float*>(data + member.offsets[i]);
+          mGl.UniformMatrix3fv(member.locations[i], 1, GL_FALSE, value);
+          break;
+        }
+        default:
+        {
+          fprintf(stderr, "\n%s type not found\n", member.name.c_str());
+        }
       }
     }
   }