Separate out GLES dependency & remove Vulkan build options 26/315326/1
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Thu, 10 Oct 2024 11:14:27 +0000 (12:14 +0100)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Fri, 29 Nov 2024 22:34:48 +0000 (22:34 +0000)
Change-Id: Ib820513ca13f32f4b194a26e82583f7b98fc6149

39 files changed:
.gitignore
automated-tests/src/dali-physics2d/CMakeLists.txt
automated-tests/src/dali-physics2d/utc-Dali-PhysicsAdaptor.cpp
automated-tests/src/dali-physics3d/CMakeLists.txt
automated-tests/src/dali-physics3d/utc-Dali-PhysicsAdaptor.cpp
automated-tests/src/dali-toolkit-internal/CMakeLists.txt
automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/test-addon-manager.cpp [deleted file]
automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/test-addon-manager.h [deleted file]
automated-tests/src/dali-toolkit-internal/utc-Dali-AddOns.cpp
automated-tests/src/dali-toolkit/CMakeLists.txt
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-addon-manager.cpp [new file with mode: 0644]
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-addon-manager.h [new file with mode: 0644]
automated-tests/src/dali-toolkit/utc-Dali-GlView.cpp
automated-tests/src/dali-toolkit/utc-Dali-GlViewDirectRendering.cpp
build/tizen/CMakeLists.txt
build/tizen/dali-physics/CMakeLists.txt
dali-physics/internal/bullet-impl/bullet-physics-adaptor-impl.h
dali-physics/internal/bullet-impl/bullet-physics-debug-renderer-gles.cpp [new file with mode: 0644]
dali-physics/internal/bullet-impl/bullet-physics-debug-renderer.cpp
dali-physics/internal/bullet-impl/bullet-physics-debug-renderer.h
dali-physics/internal/chipmunk-impl/chipmunk-physics-adaptor-impl.cpp
dali-physics/internal/chipmunk-impl/chipmunk-physics-debug-renderer-gles.cpp [new file with mode: 0644]
dali-physics/internal/chipmunk-impl/chipmunk-physics-debug-renderer.cpp
dali-physics/internal/chipmunk-impl/chipmunk-physics-debug-renderer.h
dali-physics/internal/file.list
dali-physics/internal/physics-debug-renderer-gles.cpp [new file with mode: 0644]
dali-physics/internal/physics-debug-renderer-gles.h [new file with mode: 0644]
dali-toolkit/internal/controls/gl-view/gl-view-impl.cpp
dali-toolkit/internal/controls/gl-view/gl-view-impl.h
dali-toolkit/internal/file.list
dali-toolkit/internal/gles-addon/gles-addon.cpp [new file with mode: 0644]
dali-toolkit/internal/gles-addon/shaders/gl-view.frag [new file with mode: 0644]
dali-toolkit/internal/gles-addon/shaders/gl-view.vert [new file with mode: 0644]
dali-toolkit/internal/graphics/shaders/gl-view.frag [deleted file]
dali-toolkit/internal/graphics/shaders/gl-view.vert [deleted file]
dali-toolkit/public-api/controls/gl-view/gl-view.cpp
dali-toolkit/public-api/controls/gl-view/gl-view.h
dali-toolkit/public-api/file.list
packaging/dali-toolkit.spec

index f069b3a0a013c99980d7a9101cce874078bebcaf..e01f2b1472e33926fa5edf588b97c5e1086b625a 100644 (file)
@@ -78,4 +78,6 @@ dali-toolkit/internal/graphics/generated/*
 dali-toolkit/internal/graphics/builtin-shader-extern-gen.h
 dali-scene3d/internal/graphics/generated/*
 dali-scene3d/internal/graphics/builtin-shader-extern-gen.h
-automated-tests/resources/overwritable-image.jpg
\ No newline at end of file
+automated-tests/resources/overwritable-image.jpg
+dali-toolkit/internal/gles-addon/generated/*
+dali-toolkit/internal/gles-addon/builtin-shader-extern-gen.h
index b1fd2e9bfbc9dd7454d309fe4934dbdaa8c5803f..d3ab9e2727f0f28db1532172662c13f38c8eea8f 100644 (file)
@@ -35,6 +35,7 @@ SET(TEST_HARNESS_SOURCES
   ${TEST_HARNESS_DIR}/dummy-control.cpp
   ${TEST_HARNESS_DIR}/mesh-builder.cpp
   ${TEST_HARNESS_DIR}/test-actor-utils.cpp
+  ${TEST_HARNESS_DIR}/test-addon-manager.cpp
   ${TEST_HARNESS_DIR}/test-animation-data.cpp
   ${TEST_HARNESS_DIR}/test-application.cpp
   ${TEST_HARNESS_DIR}/test-button.cpp
index cf846bb6a6f0b542aa4a835d6058c80e13a42bdb..7422ffcf4863090e38f7650097ed7cb2bca8b481 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -22,6 +22,7 @@
 // test harness headers before dali headers.
 #include <dali-physics/dali-physics.h>
 #include <dali-toolkit-test-suite-utils.h>
+#include <test-addon-manager.h>
 #include <toolkit-event-thread-callback.h>
 
 #include <dali-toolkit/devel-api/controls/alignment/alignment.h>
@@ -322,7 +323,9 @@ int UtcDaliPhysics2DAdaptorGetRootActor(void)
 int UtcDaliPhysics2DAdaptorCreateDebugLayer(void)
 {
   ToolkitTestApplication application;
-  Matrix                 transform(true);
+  Test::AddOnManager::Initialize(); // DebugLayer requires GLES addon so initialize the manager
+
+  Matrix transform(true);
   transform.SetIdentityAndScale(Vector3(2.0f, 2.0f, 1.0f));
   Uint16Pair size(640, 480);
   auto       scene = application.GetScene();
@@ -377,6 +380,34 @@ int UtcDaliPhysics2DAdaptorCreateDebugLayer(void)
   END_TEST;
 }
 
+int UtcDaliPhysics2DAdaptorCreateDebugLayerN(void)
+{
+  ToolkitTestApplication application;
+  // DebugLayer requires GLES addon so don't initialize the manager so it's not loaded. This should cause us to throw.
+
+  Matrix transform(true);
+  transform.SetIdentityAndScale(Vector3(2.0f, 2.0f, 1.0f));
+  Uint16Pair size(640, 480);
+  auto       scene = application.GetScene();
+
+  PhysicsAdaptor adaptor   = PhysicsAdaptor::New(transform, size);
+  Actor          rootActor = adaptor.GetRootActor();
+  scene.Add(rootActor);
+  Window window = DevelWindow::Get(rootActor);
+
+  try
+  {
+    Layer layer = adaptor.CreateDebugLayer(window);
+    DALI_TEST_CHECK(false); // Should not get here.
+  }
+  catch(...)
+  {
+    DALI_TEST_CHECK(true);
+  }
+
+  END_TEST;
+}
+
 int UtcDaliPhysics2DAdaptorTranslateToPhysicsSpace1(void)
 {
   ToolkitTestApplication application;
index 3b7a46964ddb74d1638bbc31bc8f70380ca63698..f77286b29e3a4889171b24147467be177c626fd4 100644 (file)
@@ -34,6 +34,7 @@ SET(TEST_HARNESS_SOURCES
   ${TEST_HARNESS_DIR}/dummy-control.cpp
   ${TEST_HARNESS_DIR}/mesh-builder.cpp
   ${TEST_HARNESS_DIR}/test-actor-utils.cpp
+  ${TEST_HARNESS_DIR}/test-addon-manager.cpp
   ${TEST_HARNESS_DIR}/test-animation-data.cpp
   ${TEST_HARNESS_DIR}/test-application.cpp
   ${TEST_HARNESS_DIR}/test-button.cpp
index 1315a55881a92cfac94dc2c47f2f1c82d708674f..8479eae78d006cb666f794683ebf028e974b086e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -22,6 +22,7 @@
 // test harness headers before dali headers.
 #include <dali-physics/dali-physics.h>
 #include <dali-toolkit-test-suite-utils.h>
+#include <test-addon-manager.h>
 #include <toolkit-event-thread-callback.h>
 
 #include <dali-toolkit/devel-api/controls/alignment/alignment.h>
@@ -281,7 +282,9 @@ int UtcDaliPhysics3DAdaptorGetRootActor(void)
 int UtcDaliPhysics3DAdaptorCreateDebugLayer(void)
 {
   ToolkitTestApplication application;
-  Matrix                 transform(true);
+  Test::AddOnManager::Initialize(); // DebugLayer requires GLES addon so initialize the manager
+
+  Matrix transform(true);
   transform.SetIdentityAndScale(Vector3(2.0f, 2.0f, 2.0f));
   Uint16Pair size(640, 480);
   auto       scene = application.GetScene();
@@ -315,6 +318,34 @@ int UtcDaliPhysics3DAdaptorCreateDebugLayer(void)
   END_TEST;
 }
 
+int UtcDaliPhysics3DAdaptorCreateDebugLayerN(void)
+{
+  ToolkitTestApplication application;
+  // DebugLayer requires GLES addon so don't initialize the manager so it's not loaded. This should cause us to throw.
+
+  Matrix transform(true);
+  transform.SetIdentityAndScale(Vector3(2.0f, 2.0f, 2.0f));
+  Uint16Pair size(640, 480);
+  auto       scene = application.GetScene();
+
+  PhysicsAdaptor adaptor   = PhysicsAdaptor::New(transform, size);
+  Actor          rootActor = adaptor.GetRootActor();
+  scene.Add(rootActor);
+  Window window = DevelWindow::Get(rootActor);
+
+  try
+  {
+    Layer layer = adaptor.CreateDebugLayer(window);
+    DALI_TEST_CHECK(false); // Should not get here.
+  }
+  catch(...)
+  {
+    DALI_TEST_CHECK(true);
+  }
+
+  END_TEST;
+}
+
 int UtcDaliPhysics3DAdaptorTranslateToPhysicsSpace1(void)
 {
   ToolkitTestApplication application;
index 7fbb4dd4a6d9d575d2a6e39983addcbb083450d9..85b0cc51403b85e1f4d762b70f9159ae6e138501 100755 (executable)
@@ -87,6 +87,7 @@ SET(TEST_HARNESS_SOURCES
    ../dali-toolkit/dali-toolkit-test-utils/dummy-control.cpp
    ../dali-toolkit/dali-toolkit-test-utils/mesh-builder.cpp
    ../dali-toolkit/dali-toolkit-test-utils/test-actor-utils.cpp
+   ../dali-toolkit/dali-toolkit-test-utils/test-addon-manager.cpp
    ../dali-toolkit/dali-toolkit-test-utils/test-animation-data.cpp
    ../dali-toolkit/dali-toolkit-test-utils/test-application.cpp
    ../dali-toolkit/dali-toolkit-test-utils/test-button.cpp
@@ -112,7 +113,6 @@ SET(TEST_HARNESS_SOURCES
    ../dali-toolkit/dali-toolkit-test-utils/test-native-image.cpp
    dali-toolkit-test-utils/toolkit-text-utils.cpp
    dali-toolkit-test-utils/dummy-visual.cpp
-   dali-toolkit-test-utils/test-addon-manager.cpp
 )
 
 IF(ELDBUS_AVAILABLE)
diff --git a/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/test-addon-manager.cpp b/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/test-addon-manager.cpp
deleted file mode 100644 (file)
index bd2d16b..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (c) 2024 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include "test-addon-manager.h"
-
-#include <dali-test-suite-utils.h>
-#include <dlfcn.h>
-
-#include <cstring>
-
-#ifndef ADDON_LIBS_PATH
-#define ADDON_LIBS_PATH ""
-#endif
-
-namespace Dali
-{
-namespace Test
-{
-std::vector<std::string> AddOnManager::EnumerateAddOns()
-{
-  std::string listFileName(ADDON_LIBS_PATH);
-  listFileName += "/addons.txt";
-
-  // Read list of available test addons
-  tet_printf("Enumerating addons, file: %s\n", listFileName.c_str());
-  std::vector<std::string> addons{};
-  auto*                    fin     = fopen(listFileName.c_str(), "r");
-  char*                    lineBuf = new char[256];
-  memset(lineBuf, 0, 256);
-  size_t n = 256;
-  while(getline(&lineBuf, &n, fin) > 0)
-  {
-    char* c = lineBuf;
-    while(*c)
-    {
-      if(*c == '\n' || *c == '\r')
-      {
-        *c = 0;
-        break;
-      }
-      ++c;
-    }
-    tet_printf("Adding %s\n", lineBuf);
-    addons.emplace_back(lineBuf);
-    memset(lineBuf, 0, 256);
-  }
-  fclose(fin);
-  delete[] lineBuf;
-  std::vector<std::string> retval{};
-  // Open addons
-  for(auto& name : addons)
-  {
-    std::string path(ADDON_LIBS_PATH);
-    path += "/";
-    path += name;
-
-    mAddOnCache.emplace_back();
-    mAddOnCache.back().handle = dlopen(path.c_str(), RTLD_DEEPBIND | RTLD_LAZY);
-    if(!mAddOnCache.back().handle)
-    {
-      mAddOnCache.back().valid = false;
-      tet_printf("Can't open addon lib: %s\n", path.c_str());
-      continue;
-    }
-    // Here addon must self register
-    if(!mAddOnCache.back().valid)
-    {
-      puts("Addon invalid!");
-    }
-    else
-    {
-      tet_printf("Valid AddOn: %s\n", mAddOnCache.back().name.c_str());
-      retval.emplace_back(mAddOnCache.back().name);
-    }
-  }
-
-  return retval;
-
-  /**
-   * Check for self-registering addons
-   */
-}
-
-void AddOnManager::RegisterAddOnDispatchTable(const AddOnDispatchTable* dispatchTable)
-{
-  // Register the dispatch table
-  auto& entry = mAddOnCache.back();
-  entry.name  = dispatchTable->name;
-  tet_printf("Registering AddOn: %s\n", entry.name.c_str());
-  entry.GetGlobalProc   = dispatchTable->GetGlobalProc;
-  entry.GetInstanceProc = dispatchTable->GetInstanceProc;
-  entry.GetAddOnInfo    = dispatchTable->GetAddOnInfo;
-  entry.OnStart         = dispatchTable->OnStart;
-  entry.OnStop          = dispatchTable->OnStop;
-  entry.OnPause         = dispatchTable->OnPause;
-  entry.OnResume        = dispatchTable->OnResume;
-  entry.valid           = true;
-}
-
-bool AddOnManager::GetAddOnInfo(const std::string& name, AddOnInfo& info)
-{
-  auto retval = false;
-  std::find_if(mAddOnCache.begin(), mAddOnCache.end(), [&retval, name, &info](AddOnCacheEntry& entry) {
-    if(entry.name == name)
-    {
-      entry.GetAddOnInfo(info);
-      retval = true;
-      return true;
-    }
-    return false;
-  });
-  return retval;
-}
-
-std::vector<AddOnLibrary> AddOnManager::LoadAddOns(const std::vector<std::string>& addonNames)
-{
-  if(mAddOnCache.empty())
-  {
-    EnumerateAddOns();
-  }
-
-  std::vector<AddOnLibrary> retval{};
-  for(auto& name : addonNames)
-  {
-    size_t index = 0;
-    auto   iter  = std::find_if(mAddOnCache.begin(), mAddOnCache.end(), [&retval, name, &index](AddOnCacheEntry& entry) {
-      index++;
-      if(entry.name == name)
-      {
-        return true;
-      }
-      return false;
-    });
-    if(iter != mAddOnCache.end())
-    {
-      retval.emplace_back(*reinterpret_cast<void**>(&index));
-    }
-    else
-    {
-      retval.emplace_back(nullptr);
-    }
-  }
-
-  return retval;
-}
-
-AddOnLibrary AddOnManager::LoadAddOn(const std::string& addonName, const std::string& libraryName)
-{
-  AddOnLibrary addOnLibrary = nullptr;
-  size_t       index        = 0;
-  auto         iter         = std::find_if(mAddOnCache.begin(), mAddOnCache.end(), [&addonName, &index](AddOnCacheEntry& entry) {
-    index++;
-    return (entry.name == addonName);
-  });
-
-  if(iter != mAddOnCache.end())
-  {
-    addOnLibrary = reinterpret_cast<void*>(index);
-  }
-  else
-  {
-    mAddOnCache.emplace_back();
-    mAddOnCache.back().handle = dlopen(libraryName.c_str(), RTLD_DEEPBIND | RTLD_LAZY);
-    if(!mAddOnCache.back().handle)
-    {
-      mAddOnCache.back().valid = false;
-      tet_printf("Can't open addon lib: %s\n", libraryName.c_str());
-    }
-    // Here addon must self register
-    if(!mAddOnCache.back().valid)
-    {
-      puts("Addon invalid!");
-    }
-    else
-    {
-      tet_printf("Valid AddOn: %s\n", mAddOnCache.back().name.c_str());
-      addOnLibrary = reinterpret_cast<void*>(mAddOnCache.size());
-    }
-  }
-
-  return addOnLibrary;
-}
-
-void* AddOnManager::GetGlobalProc(const Dali::AddOnLibrary& addOnLibrary, const char* procName)
-{
-  auto index = *reinterpret_cast<const size_t*>(&addOnLibrary);
-  return mAddOnCache[index - 1].GetGlobalProc(procName);
-}
-
-void* AddOnManager::GetInstanceProc(const Dali::AddOnLibrary& addOnLibrary, const char* procName)
-{
-  auto index = *reinterpret_cast<const size_t*>(&addOnLibrary);
-  return mAddOnCache[index - 1].GetInstanceProc(procName);
-}
-
-void AddOnManager::Start()
-{
-  for(auto& entry : mAddOnCache)
-  {
-    if(entry.OnStart)
-    {
-      entry.OnStart();
-    }
-  }
-}
-
-void AddOnManager::Resume()
-{
-  for(auto& entry : mAddOnCache)
-  {
-    if(entry.OnResume)
-    {
-      entry.OnResume();
-    }
-  }
-}
-
-void AddOnManager::Stop()
-{
-  for(auto& entry : mAddOnCache)
-  {
-    if(entry.OnStop)
-    {
-      entry.OnStop();
-    }
-  }
-}
-
-void AddOnManager::Pause()
-{
-  for(auto& entry : mAddOnCache)
-  {
-    if(entry.OnPause)
-    {
-      entry.OnPause();
-    }
-  }
-}
-
-} // namespace Test
-} // namespace Dali
diff --git a/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/test-addon-manager.h b/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/test-addon-manager.h
deleted file mode 100644 (file)
index be6b637..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef TEST_ADDON_MANAGER_H
-#define TEST_ADDON_MANAGER_H
-
-/*
- * Copyright (c) 2024 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <dali/integration-api/addon-manager.h>
-#include <dali/public-api/common/vector-wrapper.h>
-
-#include <string>
-
-namespace Dali
-{
-namespace Test
-{
-class AddOnManager : public Dali::Integration::AddOnManager
-{
-public:
-  /**
-   * @brief Constructor, initialised by the Adaptor
-   */
-  AddOnManager() = default;
-
-  /**
-   * @brief Destructor
-   */
-  ~AddOnManager() override = default;
-
-  std::vector<std::string> EnumerateAddOns() override;
-
-  bool GetAddOnInfo(const std::string& name, AddOnInfo& info) override;
-
-  std::vector<AddOnLibrary> LoadAddOns(const std::vector<std::string>& addonNames) override;
-
-  AddOnLibrary LoadAddOn(const std::string& addonName, const std::string& libraryName) override;
-
-  void* GetGlobalProc(const Dali::AddOnLibrary& addOnLibrary, const char* procName) override;
-
-  void* GetInstanceProc(const Dali::AddOnLibrary& addOnLibrary, const char* procName) override;
-
-  void RegisterAddOnDispatchTable(const AddOnDispatchTable* dispatchTable) override;
-
-  void Start() override;
-
-  void Resume() override;
-
-  void Stop() override;
-
-  void Pause() override;
-
-  struct AddOnCacheEntry
-  {
-    std::string name{};
-    AddOnInfo   info{};
-
-    // library handle
-    void* handle{nullptr};
-
-    // main function pointers
-    void (*GetAddOnInfo)(AddOnInfo&)      = nullptr; ///< Returns AddOnInfo structure
-    void* (*GetInstanceProc)(const char*) = nullptr; ///< Returns pointer of instance function (member funtion)
-    void* (*GetGlobalProc)(const char*)   = nullptr; ///< Returns pointer of global function (non-member function)
-
-    void (*OnStart)()  = nullptr;
-    void (*OnResume)() = nullptr;
-    void (*OnPause)()  = nullptr;
-    void (*OnStop)()   = nullptr;
-
-    bool valid = false;
-  };
-
-  std::vector<AddOnCacheEntry> mAddOnCache;
-};
-} // Namespace Test
-} // namespace Dali
-
-#endif // TEST_ADDON_MANAGER_H
index bc82cac3ec86afff3d0ceb9e3042df205e046c0f..186350767cf3e676c5da420bb0d40ea103625794 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
  *
  */
 
-#include <iostream>
 #include <stdlib.h>
+#include <iostream>
 
 #include <dali-toolkit-test-suite-utils.h>
 #include <dali-toolkit/dali-toolkit.h>
-#include "dali-toolkit-test-utils/test-addon-manager.h"
+#include <test-addon-manager.h>
 #include <toolkit-event-thread-callback.h>
 
 using namespace Dali::Toolkit::Internal;
 
 namespace
 {
-
-const char* TEST_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR "/application-icon-20.png";
-const char* TEST_IMAGE_FILE_NAME_9 =  TEST_RESOURCE_DIR "/heartsframe.9.png";
-const char* TEST_IMAGE_FILE_NAME2_9 =  TEST_RESOURCE_DIR "/button-up.9.png";
-int CountFunctionCalls( const std::vector<std::string>& callstack, const std::string& function )
+const char* TEST_IMAGE_FILE_NAME    = TEST_RESOURCE_DIR "/application-icon-20.png";
+const char* TEST_IMAGE_FILE_NAME_9  = TEST_RESOURCE_DIR "/heartsframe.9.png";
+const char* TEST_IMAGE_FILE_NAME2_9 = TEST_RESOURCE_DIR "/button-up.9.png";
+int         CountFunctionCalls(const std::vector<std::string>& callstack, const std::string& function)
 {
   int counter = 0;
-  std::find_if( callstack.begin(), callstack.end(), [&counter, &function]( const std::string& item )
-  {
-    if( item == function )
+  std::find_if(callstack.begin(), callstack.end(), [&counter, &function](const std::string& item) {
+    if(item == function)
     {
       counter++;
     }
@@ -46,56 +44,56 @@ int CountFunctionCalls( const std::vector<std::string>& callstack, const std::st
   return counter;
 }
 
-}
+} // namespace
 
 int UtcRenderingAddOnTestP(void)
 {
-  Dali::Integration::AddOnManager* addOnManager = new Dali::Test::AddOnManager();
+  Dali::Integration::AddOnManager* addOnManager = new Test::AddOnManager();
 
   bool valid = addOnManager->Get() != nullptr;
-  DALI_TEST_EQUALS( valid, true, TEST_LOCATION );
-  auto addon = addOnManager->GetAddOn( "oo-rendering" );
-  auto GetCallStack = addOnManager->GetGlobalProc<std::vector<std::string>(bool)>( addon, "GetCallStack" );
+  DALI_TEST_EQUALS(valid, true, TEST_LOCATION);
+  auto addon        = addOnManager->GetAddOn("oo-rendering");
+  auto GetCallStack = addOnManager->GetGlobalProc<std::vector<std::string>(bool)>(addon, "GetCallStack");
 
   ToolkitTestApplication application;
-  tet_infoline( "UtcRenderingAddOnTestP" );
+  tet_infoline("UtcRenderingAddOnTestP");
 
   // Load regular image view
-  auto imageView = Dali::Toolkit::ImageView::New( TEST_IMAGE_FILE_NAME );
-  imageView.SetProperty( Actor::Property::SIZE, Vector2( 400.f, 60.f ) );
-  imageView.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
-  imageView.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
+  auto imageView = Dali::Toolkit::ImageView::New(TEST_IMAGE_FILE_NAME);
+  imageView.SetProperty(Actor::Property::SIZE, Vector2(400.f, 60.f));
+  imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
 
   // Load npatch image view
-  auto imageView2 = Dali::Toolkit::ImageView::New( TEST_IMAGE_FILE_NAME_9 );
-  imageView2.SetProperty( Actor::Property::SIZE, Vector2( 400.f, 60.f ) );
-  imageView2.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
-  imageView2.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
+  auto imageView2 = Dali::Toolkit::ImageView::New(TEST_IMAGE_FILE_NAME_9);
+  imageView2.SetProperty(Actor::Property::SIZE, Vector2(400.f, 60.f));
+  imageView2.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  imageView2.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
 
   // Load npatch image view
-  auto imageView3 = Dali::Toolkit::ImageView::New( TEST_IMAGE_FILE_NAME2_9 );
-  imageView3.SetProperty( Actor::Property::SIZE, Vector2( 400.f, 60.f ) );
-  imageView3.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
-  imageView3.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
+  auto imageView3 = Dali::Toolkit::ImageView::New(TEST_IMAGE_FILE_NAME2_9);
+  imageView3.SetProperty(Actor::Property::SIZE, Vector2(400.f, 60.f));
+  imageView3.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  imageView3.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
 
-  application.GetScene().Add( imageView );
-  application.GetScene().Add( imageView2 );
-  application.GetScene().Add( imageView3 );
+  application.GetScene().Add(imageView);
+  application.GetScene().Add(imageView2);
+  application.GetScene().Add(imageView3);
 
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( ::Test::WaitForEventThreadTrigger( 3 ), true, TEST_LOCATION );
+  DALI_TEST_EQUALS(::Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
 
   application.SendNotification();
   application.Render();
 
   auto callstack = GetCallStack(true);
 
-  DALI_TEST_EQUALS( CountFunctionCalls( callstack, "GetGeometry" ), 2, TEST_LOCATION);
-  DALI_TEST_EQUALS( CountFunctionCalls( callstack, "CreateGeometry" ), 1, TEST_LOCATION);
-  DALI_TEST_EQUALS( CountFunctionCalls( callstack, "CreateGeometryGrid" ), 2, TEST_LOCATION);
-  DALI_TEST_EQUALS( CountFunctionCalls( callstack, "BuildNPatch" ), 2, TEST_LOCATION);
+  DALI_TEST_EQUALS(CountFunctionCalls(callstack, "GetGeometry"), 2, TEST_LOCATION);
+  DALI_TEST_EQUALS(CountFunctionCalls(callstack, "CreateGeometry"), 1, TEST_LOCATION);
+  DALI_TEST_EQUALS(CountFunctionCalls(callstack, "CreateGeometryGrid"), 2, TEST_LOCATION);
+  DALI_TEST_EQUALS(CountFunctionCalls(callstack, "BuildNPatch"), 2, TEST_LOCATION);
 
   delete addOnManager;
 
index 340f5f589553dfeb9e1bd00c309b255f787c888f..e031ae07659f81fe23fb13e7c5e0af995561b9fc 100755 (executable)
@@ -131,6 +131,7 @@ SET(TEST_HARNESS_SOURCES
   dali-toolkit-test-utils/dummy-control.cpp
   dali-toolkit-test-utils/mesh-builder.cpp
   dali-toolkit-test-utils/test-actor-utils.cpp
+  dali-toolkit-test-utils/test-addon-manager.cpp
   dali-toolkit-test-utils/test-animation-data.cpp
   dali-toolkit-test-utils/test-application.cpp
   dali-toolkit-test-utils/test-button.cpp
diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-addon-manager.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-addon-manager.cpp
new file mode 100644 (file)
index 0000000..71031c0
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ * Copyright (c) 2024 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "test-addon-manager.h"
+
+#include <dali-test-suite-utils.h>
+#include <dlfcn.h>
+#include <memory>
+
+#include <cstring>
+
+#ifndef ADDON_LIBS_PATH
+#define ADDON_LIBS_PATH ""
+#endif
+
+namespace Test
+{
+using namespace Dali;
+
+void AddOnManager::Initialize()
+{
+  // Only create an instance if we haven't created one already
+  if(!AddOnManager::Get())
+  {
+    static std::unique_ptr<AddOnManager> sAddonManager(new AddOnManager);
+    // Memory will be freed upon test completion
+  }
+}
+
+std::vector<std::string> AddOnManager::EnumerateAddOns()
+{
+  std::string listFileName(ADDON_LIBS_PATH);
+  listFileName += "/addons.txt";
+
+  // Read list of available test addons
+  tet_printf("Enumerating addons, file: %s\n", listFileName.c_str());
+  std::vector<std::string> addons{};
+  auto*                    fin     = fopen(listFileName.c_str(), "r");
+  char*                    lineBuf = new char[256];
+  memset(lineBuf, 0, 256);
+  size_t n = 256;
+  while(getline(&lineBuf, &n, fin) > 0)
+  {
+    char* c = lineBuf;
+    while(*c)
+    {
+      if(*c == '\n' || *c == '\r')
+      {
+        *c = 0;
+        break;
+      }
+      ++c;
+    }
+    tet_printf("Adding %s\n", lineBuf);
+    addons.emplace_back(lineBuf);
+    memset(lineBuf, 0, 256);
+  }
+  fclose(fin);
+  delete[] lineBuf;
+  std::vector<std::string> retval{};
+  // Open addons
+  for(auto& name : addons)
+  {
+    std::string path(ADDON_LIBS_PATH);
+    path += "/";
+    path += name;
+
+    mAddOnCache.emplace_back();
+    mAddOnCache.back().handle = dlopen(path.c_str(), RTLD_DEEPBIND | RTLD_LAZY);
+    if(!mAddOnCache.back().handle)
+    {
+      mAddOnCache.back().valid = false;
+      tet_printf("Can't open addon lib: %s\n", path.c_str());
+      continue;
+    }
+    // Here addon must self register
+    if(!mAddOnCache.back().valid)
+    {
+      puts("Addon invalid!");
+    }
+    else
+    {
+      tet_printf("Valid AddOn: %s\n", mAddOnCache.back().name.c_str());
+      retval.emplace_back(mAddOnCache.back().name);
+    }
+  }
+
+  return retval;
+
+  /**
+   * Check for self-registering addons
+   */
+}
+
+void AddOnManager::RegisterAddOnDispatchTable(const AddOnDispatchTable* dispatchTable)
+{
+  // Register the dispatch table
+  auto& entry = mAddOnCache.back();
+  entry.name  = dispatchTable->name;
+  tet_printf("Registering AddOn: %s\n", entry.name.c_str());
+  entry.GetGlobalProc   = dispatchTable->GetGlobalProc;
+  entry.GetInstanceProc = dispatchTable->GetInstanceProc;
+  entry.GetAddOnInfo    = dispatchTable->GetAddOnInfo;
+  entry.OnStart         = dispatchTable->OnStart;
+  entry.OnStop          = dispatchTable->OnStop;
+  entry.OnPause         = dispatchTable->OnPause;
+  entry.OnResume        = dispatchTable->OnResume;
+  entry.valid           = true;
+}
+
+bool AddOnManager::GetAddOnInfo(const std::string& name, AddOnInfo& info)
+{
+  auto retval = false;
+  std::find_if(mAddOnCache.begin(), mAddOnCache.end(), [&retval, name, &info](AddOnCacheEntry& entry) {
+    if(entry.name == name)
+    {
+      entry.GetAddOnInfo(info);
+      retval = true;
+      return true;
+    }
+    return false;
+  });
+  return retval;
+}
+
+std::vector<AddOnLibrary> AddOnManager::LoadAddOns(const std::vector<std::string>& addonNames)
+{
+  if(mAddOnCache.empty())
+  {
+    EnumerateAddOns();
+  }
+
+  std::vector<AddOnLibrary> retval{};
+  for(auto& name : addonNames)
+  {
+    size_t index = 0;
+    auto   iter  = std::find_if(mAddOnCache.begin(), mAddOnCache.end(), [&retval, name, &index](AddOnCacheEntry& entry) {
+      index++;
+      if(entry.name == name)
+      {
+        return true;
+      }
+      return false;
+    });
+    if(iter != mAddOnCache.end())
+    {
+      retval.emplace_back(*reinterpret_cast<void**>(&index));
+    }
+    else
+    {
+      retval.emplace_back(nullptr);
+    }
+  }
+
+  return retval;
+}
+
+AddOnLibrary AddOnManager::LoadAddOn(const std::string& addonName, const std::string& libraryName)
+{
+  AddOnLibrary addOnLibrary = nullptr;
+  size_t       index        = 0;
+  auto         iter         = std::find_if(mAddOnCache.begin(), mAddOnCache.end(), [&addonName, &index](AddOnCacheEntry& entry) {
+    index++;
+    return (entry.name == addonName);
+  });
+
+  if(iter != mAddOnCache.end())
+  {
+    addOnLibrary = reinterpret_cast<void*>(index);
+  }
+  else
+  {
+    mAddOnCache.emplace_back();
+    mAddOnCache.back().handle = dlopen(libraryName.c_str(), RTLD_LAZY); // We want to override some called methods in test code so don't do a deepbind
+    if(!mAddOnCache.back().handle)
+    {
+      mAddOnCache.back().valid = false;
+      tet_printf("Can't open addon lib: %s\n", libraryName.c_str());
+    }
+    // Here addon must self register
+    if(!mAddOnCache.back().valid)
+    {
+      puts("Addon invalid!");
+    }
+    else
+    {
+      tet_printf("Valid AddOn: %s\n", mAddOnCache.back().name.c_str());
+      addOnLibrary = reinterpret_cast<void*>(mAddOnCache.size());
+    }
+  }
+
+  return addOnLibrary;
+}
+
+void* AddOnManager::GetGlobalProc(const Dali::AddOnLibrary& addOnLibrary, const char* procName)
+{
+  auto index = *reinterpret_cast<const size_t*>(&addOnLibrary);
+  return mAddOnCache[index - 1].GetGlobalProc(procName);
+}
+
+void* AddOnManager::GetInstanceProc(const Dali::AddOnLibrary& addOnLibrary, const char* procName)
+{
+  auto index = *reinterpret_cast<const size_t*>(&addOnLibrary);
+  return mAddOnCache[index - 1].GetInstanceProc(procName);
+}
+
+void AddOnManager::Start()
+{
+  for(auto& entry : mAddOnCache)
+  {
+    if(entry.OnStart)
+    {
+      entry.OnStart();
+    }
+  }
+}
+
+void AddOnManager::Resume()
+{
+  for(auto& entry : mAddOnCache)
+  {
+    if(entry.OnResume)
+    {
+      entry.OnResume();
+    }
+  }
+}
+
+void AddOnManager::Stop()
+{
+  for(auto& entry : mAddOnCache)
+  {
+    if(entry.OnStop)
+    {
+      entry.OnStop();
+    }
+  }
+}
+
+void AddOnManager::Pause()
+{
+  for(auto& entry : mAddOnCache)
+  {
+    if(entry.OnPause)
+    {
+      entry.OnPause();
+    }
+  }
+}
+
+} // namespace Test
diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-addon-manager.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-addon-manager.h
new file mode 100644 (file)
index 0000000..ed7a775
--- /dev/null
@@ -0,0 +1,93 @@
+#ifndef TEST_ADDON_MANAGER_H
+#define TEST_ADDON_MANAGER_H
+
+/*
+ * Copyright (c) 2024 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <dali/integration-api/addon-manager.h>
+#include <dali/public-api/common/vector-wrapper.h>
+
+#include <string>
+
+namespace Test
+{
+class AddOnManager : public Dali::Integration::AddOnManager
+{
+public:
+  /**
+   * Initializes the test addon manager so that it can be used by DALi.
+   */
+  static void Initialize();
+
+  /**
+   * @brief Constructor, initialised by the Adaptor
+   */
+  AddOnManager() = default;
+
+  /**
+   * @brief Destructor
+   */
+  ~AddOnManager() override = default;
+
+  std::vector<std::string> EnumerateAddOns() override;
+
+  bool GetAddOnInfo(const std::string& name, Dali::AddOnInfo& info) override;
+
+  std::vector<Dali::AddOnLibrary> LoadAddOns(const std::vector<std::string>& addonNames) override;
+
+  Dali::AddOnLibrary LoadAddOn(const std::string& addonName, const std::string& libraryName) override;
+
+  void* GetGlobalProc(const Dali::AddOnLibrary& addOnLibrary, const char* procName) override;
+
+  void* GetInstanceProc(const Dali::AddOnLibrary& addOnLibrary, const char* procName) override;
+
+  void RegisterAddOnDispatchTable(const Dali::AddOnDispatchTable* dispatchTable) override;
+
+  void Start() override;
+
+  void Resume() override;
+
+  void Stop() override;
+
+  void Pause() override;
+
+  struct AddOnCacheEntry
+  {
+    std::string     name{};
+    Dali::AddOnInfo info{};
+
+    // library handle
+    void* handle{nullptr};
+
+    // main function pointers
+    void (*GetAddOnInfo)(Dali::AddOnInfo&) = nullptr; ///< Returns AddOnInfo structure
+    void* (*GetInstanceProc)(const char*)  = nullptr; ///< Returns pointer of instance function (member funtion)
+    void* (*GetGlobalProc)(const char*)    = nullptr; ///< Returns pointer of global function (non-member function)
+
+    void (*OnStart)()  = nullptr;
+    void (*OnResume)() = nullptr;
+    void (*OnPause)()  = nullptr;
+    void (*OnStop)()   = nullptr;
+
+    bool valid = false;
+  };
+
+  std::vector<AddOnCacheEntry> mAddOnCache;
+};
+} // Namespace Test
+
+#endif // TEST_ADDON_MANAGER_H
index 8fc3799c53cce10f3b365e39201f466ebc2f273d..27e5e79db44d871ac27c2f20e97837d89b9d187d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -19,6 +19,7 @@
 #include <thread>
 
 #include <dali-toolkit-test-suite-utils.h>
+#include <test-addon-manager.h>
 
 #include <dali-toolkit/dali-toolkit.h>
 #include <dali-toolkit/public-api/controls/gl-view/gl-view.h>
 using namespace Dali;
 using namespace Dali::Toolkit;
 
-// Positive test case for a method
 int UtcDaliGlViewNew(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline(" UtcDaliGlViewNew");
   GlView view = GlView::New(GlView::ColorFormat::RGBA8888);
   DALI_TEST_CHECK(view);
   END_TEST;
 }
 
-// Positive test case for a method
+int UtcDaliGlViewNewN(void)
+{
+  ToolkitTestApplication application;
+  // GlView requires GLES addon but don't initialize the manager which will mean the addon will not be loaded.
+  // We should throw
+
+  try
+  {
+    GlView view = GlView::New(GlView::ColorFormat::RGBA8888);
+    DALI_TEST_CHECK(false); // Should not get here!
+  }
+  catch(...)
+  {
+    DALI_TEST_CHECK(true);
+  }
+  END_TEST;
+}
+
 int UtcDaliGlViewDownCast(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline(" UtcDaliGlViewDownCast");
 
   GlView     view = GlView::New(GlView::ColorFormat::RGB888);
@@ -56,6 +75,7 @@ int UtcDaliGlViewDownCast(void)
 int UtcDaliGlViewCopyAndAssignment(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline("UtcDaliGlViewCopyAndAssignment");
 
   GlView view = Toolkit::GlView::New(GlView::ColorFormat::RGB888);
@@ -76,6 +96,7 @@ int UtcDaliGlViewCopyAndAssignment(void)
 int UtcDaliGlViewMoveAssignment(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline("UtcDaliGlViewMoveAssignment");
 
   GlView view = Toolkit::GlView::New(GlView::ColorFormat::RGB888);
@@ -93,6 +114,7 @@ int UtcDaliGlViewMoveAssignment(void)
 int UtcDaliGlViewSetGraphicsConfigGles20N(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline("UtcDaliGlViewSetGraphicsConfigGles20");
   GlView view;
   try
@@ -110,6 +132,7 @@ int UtcDaliGlViewSetGraphicsConfigGles20N(void)
 int UtcDaliGlViewSetGraphicsConfigGles30(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline("UtcDaliGlViewSetGraphicsConfigGles30");
   GlView view = Toolkit::GlView::New(GlView::ColorFormat::RGB888);
 
@@ -128,6 +151,7 @@ int UtcDaliGlViewSetGraphicsConfigGles30(void)
 int UtcDaliGlViewRenderingMode(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline("UtcDaliGlViewRenderingMode");
   GlView view = Toolkit::GlView::New(GlView::ColorFormat::RGB888);
 
@@ -143,6 +167,7 @@ int UtcDaliGlViewRenderingMode(void)
 int UtcDaliGlViewOnSizeSet(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline("UtcDaliGlViewOnSizeSet");
   GlView view = Toolkit::GlView::New(GlView::ColorFormat::RGB888);
 
@@ -184,6 +209,7 @@ void resizeCB(Vector2 size)
 int UtcDaliGlViewRegisterGlCallbacksN(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline("UtcDaliGlViewRegisterGlCallbacksN");
   GlView view;
 
@@ -202,6 +228,7 @@ int UtcDaliGlViewRegisterGlCallbacksN(void)
 int UtcDaliGlViewSetResizeCallbackN(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline("UtcDaliGlViewSetResizeCallback");
   GlView view;
 
@@ -220,6 +247,7 @@ int UtcDaliGlViewSetResizeCallbackN(void)
 int UtcDaliGlViewRenderOnce(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline("UtcDaliGlViewRenderOnce");
   GlView view = Toolkit::GlView::New(GlView::ColorFormat::RGB888);
 
@@ -238,6 +266,7 @@ int UtcDaliGlViewRenderOnce(void)
 int UtcDaliGlViewWindowVisibilityChanged(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
   tet_infoline("UtcDaliGlViewWindowVisibilityChanged");
   GlView view = Toolkit::GlView::New(GlView::ColorFormat::RGB888);
   application.GetScene().Add(view);
@@ -261,6 +290,7 @@ int UtcDaliGlViewWindowVisibilityChanged(void)
 int UtcDaliGlViewOnScene(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
 
   GlView view = Toolkit::GlView::New(GlView::ColorFormat::RGB888);
 
@@ -286,6 +316,7 @@ int UtcDaliGlViewOnScene(void)
 int UtcDaliGlViewControlVisibilityChanged(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
 
   GlView view = Toolkit::GlView::New(GlView::ColorFormat::RGB888);
   application.GetScene().Add(view);
@@ -309,6 +340,8 @@ int UtcDaliGlViewControlVisibilityChanged(void)
 int UtcDaliGlViewResize(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewResize");
   GlView view = Toolkit::GlView::New(GlView::ColorFormat::RGB888);
 
index 85f17461d7271b3e573bb8ebe4ea9e7bbb0c2967..7754da54c1d2830479abca0d600be585c3873d92 100644 (file)
@@ -19,6 +19,7 @@
 #include <thread>
 
 #include <dali-toolkit-test-suite-utils.h>
+#include <test-addon-manager.h>
 
 #include <dali-toolkit/dali-toolkit.h>
 #include <dali-toolkit/public-api/controls/gl-view/gl-view.h>
@@ -32,6 +33,8 @@ using namespace Dali::Toolkit;
 int UtcDaliGlViewDirectRenderingNew(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline(" UtcDaliGlViewDirectRenderingNew");
   GlView view = GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGBA8888);
   DALI_TEST_CHECK(view);
@@ -52,10 +55,19 @@ int UtcDaliGlViewDirectRenderingNew(void)
 int UtcDaliGlViewDirectRenderingNewN(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline(" UtcDaliGlViewDirectRenderingNewN");
   // Invalid backend mode
-  GlView view = GlView::New(GlView::BackendMode(11111), GlView::ColorFormat::RGBA8888);
-  DALI_TEST_CHECK(!view);
+  try
+  {
+    GlView view = GlView::New(GlView::BackendMode(11111), GlView::ColorFormat::RGBA8888);
+    DALI_TEST_CHECK(false); // Should not get here!
+  }
+  catch(...)
+  {
+    DALI_TEST_CHECK(true);
+  }
 
   END_TEST;
 }
@@ -64,6 +76,8 @@ int UtcDaliGlViewDirectRenderingNewN(void)
 int UtcDaliGlViewDirectRenderingDownCast(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline(" UtcDaliGlViewDirectRenderingDownCast");
 
   GlView     view = GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
@@ -79,6 +93,8 @@ int UtcDaliGlViewDirectRenderingDownCast(void)
 int UtcDaliGlViewDirectRenderingCopyAndAssignment(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingCopyAndAssignment");
 
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
@@ -99,6 +115,8 @@ int UtcDaliGlViewDirectRenderingCopyAndAssignment(void)
 int UtcDaliGlViewDirectRenderingMoveAssignment(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingMoveAssignment");
 
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
@@ -116,6 +134,8 @@ int UtcDaliGlViewDirectRenderingMoveAssignment(void)
 int UtcDaliGlViewDirectRenderingSetGraphicsConfigGles20N(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingSetGraphicsConfigGles20");
   GlView view;
   try
@@ -133,6 +153,8 @@ int UtcDaliGlViewDirectRenderingSetGraphicsConfigGles20N(void)
 int UtcDaliGlViewDirectRenderingSetGraphicsConfigGles30(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingSetGraphicsConfigGles30");
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
 
@@ -151,6 +173,8 @@ int UtcDaliGlViewDirectRenderingSetGraphicsConfigGles30(void)
 int UtcDaliGlViewDirectRenderingRenderingMode(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingRenderingMode");
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
 
@@ -166,6 +190,8 @@ int UtcDaliGlViewDirectRenderingRenderingMode(void)
 int UtcDaliGlViewDirectRenderingOnSizeSet(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingOnSizeSet");
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
 
@@ -236,6 +262,8 @@ void resizeCB(Vector2 size)
 int UtcDaliGlViewDirectRenderingRegisterGlCallbacksN(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingRegisterGlCallbacksN");
   GlView view;
 
@@ -254,6 +282,8 @@ int UtcDaliGlViewDirectRenderingRegisterGlCallbacksN(void)
 int UtcDaliGlViewDirectRenderingSetResizeCallbackN(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingSetResizeCallback");
   GlView view;
 
@@ -272,6 +302,8 @@ int UtcDaliGlViewDirectRenderingSetResizeCallbackN(void)
 int UtcDaliGlViewDirectRenderingRenderOnce(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingRenderOnce");
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
 
@@ -290,6 +322,8 @@ int UtcDaliGlViewDirectRenderingRenderOnce(void)
 int UtcDaliGlViewDirectRenderingWindowVisibilityChanged(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingWindowVisibilityChanged");
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
   application.GetScene().Add(view);
@@ -313,6 +347,7 @@ int UtcDaliGlViewDirectRenderingWindowVisibilityChanged(void)
 int UtcDaliGlViewDirectRenderingOnScene(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
 
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
 
@@ -338,6 +373,7 @@ int UtcDaliGlViewDirectRenderingOnScene(void)
 int UtcDaliGlViewDirectRenderingControlVisibilityChanged(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
 
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
   application.GetScene().Add(view);
@@ -361,6 +397,8 @@ int UtcDaliGlViewDirectRenderingControlVisibilityChanged(void)
 int UtcDaliGlViewDirectRenderingResize(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingResize");
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
 
@@ -387,6 +425,8 @@ int UtcDaliGlViewDirectRenderingResize(void)
 int UtcDaliGlViewDirectRenderingDirectResize(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingResize");
   GlView view = Toolkit::GlView::New(GlView::BackendMode::UNSAFE_DIRECT_RENDERING, GlView::ColorFormat::RGB888);
 
@@ -413,6 +453,8 @@ int UtcDaliGlViewDirectRenderingDirectResize(void)
 int UtcDaliGlViewDirectRenderingTerminateCallback(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline("UtcDaliGlViewDirectRenderingTerminateCallback");
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
 
@@ -439,6 +481,7 @@ int UtcDaliGlViewDirectRenderingTerminateCallback(void)
 int UtcDaliGlViewDirectRenderingTextureBinding(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
 
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING, GlView::ColorFormat::RGB888);
 
@@ -486,6 +529,8 @@ int UtcDaliGlViewDirectRenderingTextureBinding(void)
 int UtcDaliGlViewDirectRenderingThreadedNew(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
+
   tet_infoline(" UtcDaliGlViewDirectRenderingThreadedNew");
   GlView view = GlView::New(GlView::BackendMode::DIRECT_RENDERING_THREADED, GlView::ColorFormat::RGBA8888);
   DALI_TEST_CHECK(view);
@@ -500,6 +545,7 @@ int UtcDaliGlViewDirectRenderingThreadedNew(void)
 int UtcDaliGlViewDirectRenderingThreadedOnScene(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
 
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING_THREADED, GlView::ColorFormat::RGB888);
 
@@ -530,6 +576,7 @@ extern "C" bool gDirectRenderingFailCreateProgram;
 int UtcDaliGlViewDirectRenderingThreadedOnScene1(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
 
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING_THREADED, GlView::ColorFormat::RGB888);
 
@@ -560,6 +607,7 @@ int UtcDaliGlViewDirectRenderingThreadedOnScene1(void)
 int UtcDaliGlViewDirectRenderingThreadedOnScene2(void)
 {
   ToolkitTestApplication application;
+  Test::AddOnManager::Initialize(); // GlView requires GLES addon so initialize the manager
 
   GlView view = Toolkit::GlView::New(GlView::BackendMode::DIRECT_RENDERING_THREADED, GlView::ColorFormat::RGB888);
 
index 805d86f07eddb0416a9d9819d8bf144d99bfcf96..5007797e46d043196f924b0159259730f92fade0 100644 (file)
@@ -31,7 +31,6 @@ OPTION(ENABLE_I18N               "Turns on internationalisation" OFF)
 OPTION(ENABLE_COVERAGE           "Coverage" OFF)
 OPTION(ENABLE_PKG_CONFIGURE      "Use pkgconfig" ON)
 OPTION(ENABLE_LINK_TEST          "Enable the link test" ON)
-OPTION(ENABLE_VULKAN             "Enable Vulkan instead of GLES" OFF)
 OPTION(INSTALL_DOXYGEN_DOC       "Install doxygen doc" ON)
 OPTION(CONFIGURE_AUTOMATED_TESTS "Configure automated tests" ON)
 OPTION(USE_DEFAULT_RESOURCE_DIR  "Whether to use the default resource folders. Otherwise set environment variables for DALI_IMAGE_DIR, DALI_SOUND_DIR, DALI_STYLE_DIR, DALI_STYLE_IMAGE_DIR and DALI_DATA_READ_ONLY_DIR" ON)
@@ -300,10 +299,17 @@ ENDIF()
 SET(SHADER_SOURCE_DIR "${ROOT_SRC_DIR}/dali-toolkit/internal/graphics/shaders/")
 SET(SHADER_GENERATED_DIR "${ROOT_SRC_DIR}/dali-toolkit/internal/graphics/generated")
 
+# Shaders for GLES Addon
+SET(GLES_ADDON_DIR ${ROOT_SRC_DIR}/dali-toolkit/internal/gles-addon/)
+SET(GLES_ADDON_SHADER_SOURCE_DIR "${GLES_ADDON_DIR}/shaders/")
+SET(GLES_ADDON_SHADER_GENERATED_DIR "${GLES_ADDON_DIR}/generated/")
+
 SET(GENERATED_SHADER_DIR ${ROOT_SRC_DIR}/dali-toolkit/internal/graphics/)
 SET_PROPERTY(DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES
              "${GENERATED_SHADER_DIR}/generated/"
-             "${GENERATED_SHADER_DIR}/builtin-shader-extern-gen.h")
+             "${GENERATED_SHADER_DIR}/builtin-shader-extern-gen.h"
+             "${GLES_ADDON_SHADER_GENERATED_DIR}"
+             "${GLES_ADDON_DIR}/builtin-shader-extern-gen.h")
 
 SET(SHADER_GENERATOR_NAME dali-shader-generator)
 SET(SHADER_GENERATOR_SOURCES ${ROOT_SRC_DIR}/dali-toolkit/shader-generator/shader-generator.cpp)
@@ -347,6 +353,14 @@ ADD_CUSTOM_COMMAND(OUTPUT ${BUILT_IN_SHADER_GEN_CPP}
 
 SET(SOURCES ${SOURCES} ${BUILT_IN_SHADER_GEN_CPP})
 
+# Shaders for GLES Addon
+SET(GLES_ADDON_BUILT_IN_SHADER_GEN_CPP "${GLES_ADDON_SHADER_GENERATED_DIR}/builtin-shader-gen.cpp" )
+
+FILE(GLOB GLES_ADDON_SHADERS_SRC "${GLES_ADDON_SHADER_SOURCE_DIR}/*.vert" "${GLES_ADDON_SHADER_GENERATED_DIR}/*.frag" )
+ADD_CUSTOM_COMMAND(OUTPUT ${GLES_ADDON_BUILT_IN_SHADER_GEN_CPP}
+                   DEPENDS ${SHADER_GENERATOR_NAME} ${GLES_ADDON_SHADERS_SRC}
+                   COMMAND ${SHADER_GENERATOR_BINARY} ${GLES_ADDON_SHADER_SOURCE_DIR} ${GLES_ADDON_SHADER_GENERATED_DIR})
+
 IF( WIN32 OR APPLE )
   SET( DALICORE_LDFLAGS
         "${DALICORE_LDFLAGS}"
@@ -383,13 +397,6 @@ IF ( WIN32 )
   FIND_PACKAGE( pthreads REQUIRED )
 ENDIF()
 
-IF( NOT ENABLE_VULKAN)
-  SET(SOURCES ${SOURCES}
-    ${toolkit_internal_egl_src_files}
-    ${public_api_egl_src_files}
-  )
-ENDIF()
-
 ADD_LIBRARY( ${name} ${LIBTYPE} ${SOURCES} )
 
 SET(CUSTOM_COMPILE_OPTIONS "")
@@ -675,6 +682,22 @@ IF( CONFIGURE_AUTOMATED_TESTS )
                   ${ROOT_SRC_DIR}/automated-tests/CMakeLists.txt @ONLY )
 ENDIF()
 
+SET(TOOLKIT_GLES_NAME "dali2-toolkit-gles")
+PKG_CHECK_MODULES(OPENGLES glesv2 egl)
+ADD_LIBRARY(${TOOLKIT_GLES_NAME}
+            ${LIBTYPE}
+            ${toolkit_internal_egl_src_files}
+            ${GLES_ADDON_BUILT_IN_SHADER_GEN_CPP}
+)
+target_compile_options(${TOOLKIT_GLES_NAME} PRIVATE ${CUSTOM_COMPILE_OPTIONS})
+TARGET_LINK_LIBRARIES(${TOOLKIT_GLES_NAME}
+        ${name}
+        ${DALICORE_LDFLAGS}
+        ${DALIADAPTOR_LDFLAGS}
+        ${COVERAGE}
+        ${OPENGLES_LDFLAGS}
+)
+INSTALL(TARGETS ${TOOLKIT_GLES_NAME} DESTINATION ${LIB_DIR})
 
 # Configuration Messages
 MESSAGE( STATUS "Configuration:\n" )
@@ -685,7 +708,6 @@ MESSAGE( STATUS "Debug build:                   " ${ENABLE_DEBUG} )
 MESSAGE( STATUS "Export all symbols:            " ${ENABLE_EXPORTALL} )
 MESSAGE( STATUS "Coverage:                      " ${ENABLE_COVERAGE} )
 MESSAGE( STATUS "Trace:                         " ${ENABLE_TRACE} )
-MESSAGE( STATUS "Vulkan:                        " ${ENABLE_VULKAN} )
 MESSAGE( STATUS "Doxygen:                       " ${doxygenEnabled} )
 MESSAGE( STATUS "Data Dir (Read/Write):         " ${dataReadWriteDir} )
 MESSAGE( STATUS "Data Dir (Read Only):          " ${dataReadOnlyDir} )
index 63f4b9ef2edee5d6b0c9a816b475c31fedac00ad..7e5f6809a4cee2bfbb42a3bab02d827d28b7d56e 100644 (file)
@@ -87,22 +87,46 @@ include_directories(BEFORE
 include_directories(AFTER "${prefix_include_dir}")
 
 MESSAGE(STATUS "2D sources: ${physics2d_src_files}")
+MESSAGE(STATUS "2D sources (GLES): ${physics2d_gles_src_files}")
+
 MESSAGE(STATUS "3D sources: ${physics3d_src_files}")
+MESSAGE(STATUS "3D sources (GLES): ${physics3d_gles_src_files}")
 
-ADD_LIBRARY("${name}-2d" SHARED ${physics2d_src_files} )
-TARGET_LINK_LIBRARIES("${name}-2d" ${DALICORE_LDFLAGS}
+ADD_LIBRARY("${name}-2d" SHARED ${physics2d_src_files})
+TARGET_LINK_LIBRARIES("${name}-2d"
+  ${DALICORE_LDFLAGS}
   dali2-toolkit
   chipmunk
   ${COVERAGE})
 TARGET_COMPILE_OPTIONS("${name}-2d" PUBLIC "-I${repo_root_dir}/dali-physics/third-party/chipmunk2d/include")
 
-ADD_LIBRARY("${name}-3d" SHARED ${physics3d_src_files} )
-TARGET_LINK_LIBRARIES("${name}-3d" ${DALICORE_LDFLAGS}
+ADD_LIBRARY("${name}-2d-gles" SHARED ${physics2d_gles_src_files})
+TARGET_LINK_LIBRARIES("${name}-2d-gles"
+  ${DALICORE_LDFLAGS}
+  ${DALIADAPTOR_LDFLAGS}
+  dali2-toolkit
+  chipmunk
+  ${COVERAGE})
+TARGET_COMPILE_OPTIONS("${name}-2d-gles" PUBLIC "-I${repo_root_dir}/dali-physics/third-party/chipmunk2d/include")
+
+ADD_LIBRARY("${name}-3d" SHARED ${physics3d_src_files})
+TARGET_LINK_LIBRARIES("${name}-3d"
+  ${DALICORE_LDFLAGS}
+  ${DALIADAPTOR_LDFLAGS}
   dali2-toolkit
   bullet3
   ${COVERAGE})
 TARGET_COMPILE_OPTIONS("${name}-3d" PUBLIC "-I${repo_root_dir}/dali-physics/third-party/bullet3/src")
 
+ADD_LIBRARY("${name}-3d-gles" SHARED ${physics3d_gles_src_files})
+TARGET_LINK_LIBRARIES("${name}-3d-gles"
+  ${DALICORE_LDFLAGS}
+  ${DALIADAPTOR_LDFLAGS}
+  dali2-toolkit
+  bullet3
+  ${COVERAGE})
+TARGET_COMPILE_OPTIONS("${name}-3d-gles" PUBLIC "-I${repo_root_dir}/dali-physics/third-party/bullet3/src")
+
 IF (ENABLE_PKG_CONFIGURE)
   INSTALL(FILES
     ${CMAKE_CURRENT_BINARY_DIR}/${core_pkg_cfg_file_2d}
@@ -113,40 +137,68 @@ ENDIF()
 
 IF( INSTALL_CMAKE_MODULES )
   MESSAGE(STATUS "Installing cmake modules & libs")
-  SET_TARGET_PROPERTIES( ${name}-2d
+  SET_TARGET_PROPERTIES(${name}-2d
+    PROPERTIES
+    VERSION ${DALI_PHYSICS_VERSION}
+    SOVERSION ${${name}_VERSION_MAJOR}
+    CLEAN_DIRECT_OUPUT 1
+  )
+
+  SET_TARGET_PROPERTIES(${name}-2d-gles
+    PROPERTIES
+    VERSION ${DALI_PHYSICS_VERSION}
+    SOVERSION ${${name}_VERSION_MAJOR}
+    CLEAN_DIRECT_OUPUT 1
+  )
+
+  SET_TARGET_PROPERTIES(${name}-3d
     PROPERTIES
     VERSION ${DALI_PHYSICS_VERSION}
     SOVERSION ${${name}_VERSION_MAJOR}
     CLEAN_DIRECT_OUPUT 1
-    )
+  )
 
-  SET_TARGET_PROPERTIES( ${name}-3d
+  SET_TARGET_PROPERTIES(${name}-3d-gles
     PROPERTIES
     VERSION ${DALI_PHYSICS_VERSION}
     SOVERSION ${${name}_VERSION_MAJOR}
     CLEAN_DIRECT_OUPUT 1
-    )
+  )
 
-  IF( ENABLE_DEBUG )
+  IF(ENABLE_DEBUG)
     SET( BIN_DIR "${BIN_DIR}/debug" )
     SET( LIB_DIR "${LIB_DIR}/debug" )
   ENDIF()
 
   # Install library
-  INSTALL( TARGETS ${name}-2d
+  INSTALL(TARGETS ${name}-2d
     EXPORT ${name}-2d-targets
     LIBRARY DESTINATION ${LIB_DIR}
     ARCHIVE DESTINATION ${LIB_DIR}
     RUNTIME DESTINATION ${BIN_DIR}
   )
 
-  INSTALL( TARGETS ${name}-3d
+  INSTALL(TARGETS ${name}-2d-gles
+    EXPORT ${name}-2d-gles-targets
+    LIBRARY DESTINATION ${LIB_DIR}
+    ARCHIVE DESTINATION ${LIB_DIR}
+    RUNTIME DESTINATION ${BIN_DIR}
+  )
+
+  INSTALL(TARGETS ${name}-3d
     EXPORT ${name}-3d-targets
     LIBRARY DESTINATION ${LIB_DIR}
     ARCHIVE DESTINATION ${LIB_DIR}
     RUNTIME DESTINATION ${BIN_DIR}
   )
 
+  INSTALL(TARGETS ${name}-3d-gles
+    EXPORT ${name}-3d-gles-targets
+    LIBRARY DESTINATION ${LIB_DIR}
+    ARCHIVE DESTINATION ${LIB_DIR}
+    RUNTIME DESTINATION ${BIN_DIR}
+  )
+
   # Install the cmake modules.
   INSTALL(
     EXPORT ${name}-2d-targets
@@ -177,8 +229,9 @@ IF( INSTALL_CMAKE_MODULES )
 ELSE()
   MESSAGE(STATUS "Installing libs")
   INSTALL( TARGETS ${name}-2d DESTINATION ${LIB_DIR} )
+  INSTALL( TARGETS ${name}-2d-gles DESTINATION ${LIB_DIR} )
   INSTALL( TARGETS ${name}-3d DESTINATION ${LIB_DIR} )
-
+  INSTALL( TARGETS ${name}-3d-gles DESTINATION ${LIB_DIR} )
 ENDIF()
 
 # Install headers
index 3c9001aa4d8f6f32be767bcc9d7700f2278fbf30..a4130154c32abd91d2abd12985e3d20b015b6262 100644 (file)
@@ -1,7 +1,7 @@
 #pragma once
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -24,8 +24,6 @@
 
 namespace Dali::Toolkit::Physics::Internal
 {
-class PhysicsDebugRenderer;
-
 class BulletPhysicsAdaptor : public PhysicsAdaptor
 {
 public:
diff --git a/dali-physics/internal/bullet-impl/bullet-physics-debug-renderer-gles.cpp b/dali-physics/internal/bullet-impl/bullet-physics-debug-renderer-gles.cpp
new file mode 100644 (file)
index 0000000..56719a9
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2024 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// External Includes
+#include <GLES3/gl3.h>
+#include <dali/devel-api/addons/addon-base.h>
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/math/matrix.h>
+
+// Internal Includes
+#include <dali-physics/internal/physics-debug-renderer-gles.h>
+
+namespace Dali::Toolkit::Physics::Internal::Gles
+{
+struct DebugRenderer
+{
+  GLint  mVertexLocation{-1};
+  GLint  mVertexColourLocation{-1};
+  GLint  mProjectionLocation{-1};
+  GLint  mModelViewLocation{-1};
+  GLuint mBufferId{0u};
+  GLuint mProgramId{0u};
+};
+} // namespace Dali::Toolkit::Physics::Internal::Gles
+
+namespace
+{
+using DebugRenderer = Dali::Toolkit::Physics::Internal::Gles::DebugRenderer;
+const char* const DALI_PHYSICS_BULLET_GLES_ADDON_NAME("PhysicsBulletGlesAddOn");
+
+void PrepareShader(DebugRenderer& renderer)
+{
+  static const char glVertexShader[] =
+    "attribute vec4 vertexPosition;\n"
+    "attribute vec3 vertexColour;\n"
+    "varying vec3 fragColour;\n"
+    "uniform mat4 projection;\n"
+    "uniform mat4 modelView;\n"
+    "void main()\n"
+    "{\n"
+    "    gl_Position = projection * modelView * vertexPosition;\n"
+    "    fragColour = vertexColour;\n"
+    "}\n";
+
+  static const char glFragmentShader[] =
+    "precision mediump float;\n"
+    "varying vec3 fragColour;\n"
+    "void main()\n"
+    "{\n"
+    "    gl_FragColor = vec4(fragColour, 1.0);\n"
+    "}\n";
+
+  renderer.mProgramId = Dali::Toolkit::Physics::Internal::Gles::CreateProgram(glVertexShader, glFragmentShader);
+}
+
+DebugRenderer* CreateGlesPhysicsDebugRenderer()
+{
+  return new DebugRenderer;
+}
+
+void DeleteGlesPhysicsDebugRenderer(DebugRenderer* renderer)
+{
+  delete renderer;
+}
+
+void SetViewport(int width, int height)
+{
+  glViewport(0, 0, width, height);
+}
+
+void Setup(DebugRenderer& renderer, int width, int height)
+{
+  PrepareShader(renderer);
+  renderer.mVertexLocation       = glGetAttribLocation(renderer.mProgramId, "vertexPosition");
+  renderer.mVertexColourLocation = glGetAttribLocation(renderer.mProgramId, "vertexColour");
+  renderer.mProjectionLocation   = glGetUniformLocation(renderer.mProgramId, "projection");
+  renderer.mModelViewLocation    = glGetUniformLocation(renderer.mProgramId, "modelView");
+
+  glEnable(GL_DEPTH_TEST);
+  glViewport(0, 0, width, height);
+
+  glGenBuffers(1, &renderer.mBufferId);
+}
+
+void RenderLines(
+  DebugRenderer&      renderer,
+  const void*         data,
+  std::size_t         dataSize,
+  int                 arrayCount,
+  const Dali::Matrix& modelViewMatrix,
+  const Dali::Matrix& projectionMatrix)
+{
+  glUseProgram(renderer.mProgramId);
+
+  glBindBuffer(GL_ARRAY_BUFFER, renderer.mBufferId);
+  glBufferData(GL_ARRAY_BUFFER, GLsizeiptr(dataSize), data, GL_STATIC_DRAW);
+
+  glVertexAttribPointer(renderer.mVertexLocation, 3, GL_FLOAT, GL_FALSE, 24, 0);
+  glEnableVertexAttribArray(renderer.mVertexLocation);
+  glVertexAttribPointer(renderer.mVertexColourLocation, 3, GL_FLOAT, GL_FALSE, 24, reinterpret_cast<const void*>(12));
+  glEnableVertexAttribArray(renderer.mVertexColourLocation);
+  glUniformMatrix4fv(renderer.mProjectionLocation, 1, GL_FALSE, projectionMatrix.AsFloat());
+  glUniformMatrix4fv(renderer.mModelViewLocation, 1, GL_FALSE, modelViewMatrix.AsFloat());
+
+  glDrawArrays(GL_LINES, 0, arrayCount);
+}
+} // unnamed namespace
+
+class PhysicsBulletGlesAddOn : public Dali::AddOns::AddOnBase
+{
+public:
+  void GetAddOnInfo(Dali::AddOnInfo& info) override
+  {
+    info.type    = Dali::AddOnType::GENERIC;
+    info.name    = DALI_PHYSICS_BULLET_GLES_ADDON_NAME;
+    info.version = Dali::DALI_ADDON_VERSION(1, 0, 0);
+    info.next    = nullptr;
+  }
+
+  /**
+   * Dispatch table for global functions
+   * @return
+   */
+  Dali::AddOns::DispatchTable* GetGlobalDispatchTable() override
+  {
+    static Dali::AddOns::DispatchTable dispatchTable{};
+    if(dispatchTable.Empty())
+    {
+      dispatchTable["CreateGlesPhysicsDebugRenderer"] = CreateGlesPhysicsDebugRenderer;
+      dispatchTable["DeleteGlesPhysicsDebugRenderer"] = DeleteGlesPhysicsDebugRenderer;
+      dispatchTable["SetViewport"]                    = SetViewport;
+      dispatchTable["Setup"]                          = Setup;
+      dispatchTable["RenderLines"]                    = RenderLines;
+    }
+    return &dispatchTable;
+  }
+
+  /**
+   * Dispatch table for instance functions
+   * @return
+   */
+  Dali::AddOns::DispatchTable* GetInstanceDispatchTable() override
+  {
+    return nullptr;
+  }
+};
+
+REGISTER_ADDON_CLASS(PhysicsBulletGlesAddOn);
index f7b7db12088224ca4b0277658403b85e39bd818d..39e1ce938b7790c5015a59a7f7856d8f1c2ed403 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
 #include <dali-physics/internal/bullet-impl/bullet-physics-debug-renderer.h>
 
 // External Includes
-#include <dali/dali.h>
+#include <dali/devel-api/common/addon-binder.h>
+#include <dali/public-api/adaptor-framework/graphics-backend.h>
+#include <dali/public-api/math/degree.h>
+#include <dali/public-api/math/matrix.h>
+#include <dali/public-api/math/quaternion.h>
+#include <dali/public-api/math/radian.h>
+#include <dali/public-api/math/vector3.h>
+#include <dali/public-api/math/vector4.h>
 
 // Internal Includes
 #include <dali-physics/internal/physics-adaptor-impl.h>
@@ -30,80 +37,32 @@ using Dali::Radian;
 using Dali::Vector3;
 using Dali::Vector4;
 
-namespace
+namespace Dali::Toolkit::Physics::Internal
 {
-GLuint LoadShader(GLenum shaderType, const char* shaderSource)
+namespace
 {
-  GLuint shader = glCreateShader(shaderType);
-  if(shader != 0)
-  {
-    glShaderSource(shader, 1, &shaderSource, NULL);
-    glCompileShader(shader);
-    GLint compiled = 0;
-    glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
-    if(compiled != GL_TRUE)
-    {
-      GLint infoLen = 0;
-      glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
-
-      if(infoLen > 0)
-      {
-        std::vector<char> logBuffer;
-        logBuffer.resize(infoLen + 1);
-        glGetShaderInfoLog(shader, infoLen, NULL, &logBuffer[0]);
-        fprintf(stderr, "%s\n", &logBuffer[0]);
-        fflush(stderr);
-
-        glDeleteShader(shader);
-        shader = 0;
-      }
-    }
-  }
-  return shader;
-}
+const char* const DALI_PHYSICS_BULLET_GLES_SO("libdali2-physics-3d-gles.so");
+const char* const DALI_PHYSICS_BULLET_GLES_ADDON_NAME("PhysicsBulletGlesAddOn");
 
-GLuint CreateProgram(const char* vertexSource, const char* fragmentSource)
+struct PhysicsBulletGlesAddOn : public Dali::AddOn::AddOnBinder
 {
-  GLuint vertexShader = LoadShader(GL_VERTEX_SHADER, vertexSource);
-  if(!vertexShader)
-  {
-    return 0;
-  }
-  GLuint fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fragmentSource);
-  if(!fragmentShader)
+  PhysicsBulletGlesAddOn()
+  : Dali::AddOn::AddOnBinder(DALI_PHYSICS_BULLET_GLES_ADDON_NAME, DALI_PHYSICS_BULLET_GLES_SO)
   {
-    return 0;
   }
-  GLuint program = glCreateProgram();
-  if(program)
-  {
-    glAttachShader(program, vertexShader);
-    glAttachShader(program, fragmentShader);
-    glLinkProgram(program);
-    GLint linkStatus = GL_FALSE;
-    glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
-    if(linkStatus != GL_TRUE)
-    {
-      GLint bufLength = 0;
-      glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
-      if(bufLength)
-      {
-        std::vector<char> logBuffer;
-        logBuffer.resize(bufLength + 1);
-        glGetProgramInfoLog(program, bufLength, NULL, &logBuffer[0]);
-        fprintf(stderr, "%s\n", &logBuffer[0]);
-        fflush(stderr);
-      }
-      glDeleteProgram(program);
-      program = 0;
-    }
-  }
-  return program;
-}
+
+  ~PhysicsBulletGlesAddOn() = default;
+
+  ADDON_BIND_FUNCTION(CreateGlesPhysicsDebugRenderer, Gles::DebugRenderer*());
+  ADDON_BIND_FUNCTION(DeleteGlesPhysicsDebugRenderer, void(Gles::DebugRenderer*));
+  ADDON_BIND_FUNCTION(SetViewport, void(int, int));
+  ADDON_BIND_FUNCTION(Setup, void(Gles::DebugRenderer&, int, int));
+  ADDON_BIND_FUNCTION(RenderLines, void(Gles::DebugRenderer&, const void*, std::size_t, int, const Dali::Matrix&, const Dali::Matrix&));
+};
+
+std::unique_ptr<PhysicsBulletGlesAddOn> gPhysicsBulletGlesAddOn;
 } // namespace
 
-namespace Dali::Toolkit::Physics::Internal
-{
 std::unique_ptr<PhysicsDebugRenderer> PhysicsDebugRenderer::New(uint32_t width, uint32_t height, Dali::CameraActor camera, PhysicsAdaptor* adaptor)
 {
   auto renderer             = std::make_unique<PhysicsDebugRenderer>(width, height, camera, adaptor);
@@ -115,43 +74,43 @@ PhysicsDebugRenderer::PhysicsDebugRenderer(uint32_t width, uint32_t height, Dali
 : mCamera(camera),
   mWidth(width),
   mHeight(height),
-  mAdaptor(*adaptor),
-  mVertexLocation(-1),
-  mVertexColourLocation(-1),
-  mProjectionLocation(-1),
-  mModelViewLocation(-1),
-  mBufferId(0u),
-  mProgramId(0u)
+  mAdaptor(*adaptor)
 {
+  if(Graphics::GetCurrentGraphicsBackend() == Graphics::Backend::GLES)
+  {
+    if(!gPhysicsBulletGlesAddOn)
+    {
+      gPhysicsBulletGlesAddOn.reset(new PhysicsBulletGlesAddOn);
+    }
+    DALI_ASSERT_ALWAYS(gPhysicsBulletGlesAddOn && "Cannot load the Bullet Debug Renderer Gles Addon\n");
+    mImpl = gPhysicsBulletGlesAddOn->CreateGlesPhysicsDebugRenderer();
+  }
 }
 
-bool PhysicsDebugRenderer::OnRender(const Dali::RenderCallbackInput& input)
+PhysicsDebugRenderer::~PhysicsDebugRenderer()
 {
-  if(mState == State::INIT)
+  if(gPhysicsBulletGlesAddOn)
   {
-    Setup();
-    mState = State::RENDER;
+    gPhysicsBulletGlesAddOn->DeleteGlesPhysicsDebugRenderer(mImpl);
+    mImpl = nullptr;
   }
-  glViewport(0, 0, mWidth, mHeight);
-
-  RenderLines(input);
-
-  return false;
 }
 
-// Run on first invocation of callback
-void PhysicsDebugRenderer::Setup()
+bool PhysicsDebugRenderer::OnRender(const Dali::RenderCallbackInput& input)
 {
-  PrepareShader();
-  mVertexLocation       = glGetAttribLocation(mProgramId, "vertexPosition");
-  mVertexColourLocation = glGetAttribLocation(mProgramId, "vertexColour");
-  mProjectionLocation   = glGetUniformLocation(mProgramId, "projection");
-  mModelViewLocation    = glGetUniformLocation(mProgramId, "modelView");
+  if(gPhysicsBulletGlesAddOn && mImpl)
+  {
+    if(mState == State::INIT)
+    {
+      gPhysicsBulletGlesAddOn->Setup(*mImpl, mWidth, mHeight);
+      mState = State::RENDER;
+    }
+    gPhysicsBulletGlesAddOn->SetViewport(mWidth, mHeight);
 
-  glEnable(GL_DEPTH_TEST);
-  glViewport(0, 0, mWidth, mHeight);
+    Render(input);
+  }
 
-  glGenBuffers(1, &mBufferId);
+  return false;
 }
 
 void PhysicsDebugRenderer::UpdateWindowSize(Dali::Vector2 size)
@@ -160,53 +119,27 @@ void PhysicsDebugRenderer::UpdateWindowSize(Dali::Vector2 size)
   mHeight = size.height;
 }
 
-void PhysicsDebugRenderer::PrepareShader()
-{
-  static const char glVertexShader[] =
-    "attribute vec4 vertexPosition;\n"
-    "attribute vec3 vertexColour;\n"
-    "varying vec3 fragColour;\n"
-    "uniform mat4 projection;\n"
-    "uniform mat4 modelView;\n"
-    "void main()\n"
-    "{\n"
-    "    gl_Position = projection * modelView * vertexPosition;\n"
-    "    fragColour = vertexColour;\n"
-    "}\n";
-
-  static const char glFragmentShader[] =
-    "precision mediump float;\n"
-    "varying vec3 fragColour;\n"
-    "void main()\n"
-    "{\n"
-    "    gl_FragColor = vec4(fragColour, 1.0);\n"
-    "}\n";
-
-  mProgramId = CreateProgram(glVertexShader, glFragmentShader);
-}
-
-void PhysicsDebugRenderer::RenderLines(const Dali::RenderCallbackInput& input)
+void PhysicsDebugRenderer::Render(const Dali::RenderCallbackInput& input)
 {
   mModelViewMatrix.SetIdentity();
   mProjectionMatrix = input.projection;
 
   Matrix::Multiply(mModelViewMatrix, mModelViewMatrix, input.view);
-  glUseProgram(mProgramId);
 
   // In theory, input.clippingBox should tell us the actor position in clip-space.
   // But, it appears to be bugged.
 
-  glBindBuffer(GL_ARRAY_BUFFER, mBufferId);
-  glBufferData(GL_ARRAY_BUFFER, GLsizeiptr(mLines.size() * sizeof(VertexLine)), &mLines[0], GL_STATIC_DRAW);
-
-  glVertexAttribPointer(mVertexLocation, 3, GL_FLOAT, GL_FALSE, 24, 0);
-  glEnableVertexAttribArray(mVertexLocation);
-  glVertexAttribPointer(mVertexColourLocation, 3, GL_FLOAT, GL_FALSE, 24, reinterpret_cast<const void*>(12));
-  glEnableVertexAttribArray(mVertexColourLocation);
-  glUniformMatrix4fv(mProjectionLocation, 1, GL_FALSE, mProjectionMatrix.AsFloat());
-  glUniformMatrix4fv(mModelViewLocation, 1, GL_FALSE, mModelViewMatrix.AsFloat());
+  if(gPhysicsBulletGlesAddOn && mImpl)
+  {
+    gPhysicsBulletGlesAddOn->RenderLines(
+      *mImpl,
+      &mLines[0],
+      mLines.size() * sizeof(VertexLine),
+      mLines.size(),
+      mModelViewMatrix,
+      mProjectionMatrix);
+  }
 
-  glDrawArrays(GL_LINES, 0, mLines.size());
   mLines.clear();
 }
 
index 5c156012aeddaa0a7f7cbe52abeedae3913495ca..e69a7adde0f138cf78545638655ea908998b1f5b 100644 (file)
@@ -1,7 +1,7 @@
 #pragma once
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -17,7 +17,6 @@
  */
 
 // External includes
-#include <GLES3/gl3.h>
 #include <LinearMath/btIDebugDraw.h>
 #include <dali/dali.h>
 
@@ -30,6 +29,11 @@ using Dali::TextureSet;
 
 namespace Dali::Toolkit::Physics::Internal
 {
+namespace Gles
+{
+struct DebugRenderer;
+}
+
 class PhysicsAdaptor;
 
 class PhysicsDebugRenderer : public btIDebugDraw
@@ -55,6 +59,11 @@ public:
    */
   PhysicsDebugRenderer(uint32_t width, uint32_t height, Dali::CameraActor camera, PhysicsAdaptor* adaptor);
 
+  /**
+   * Destructor
+   */
+  ~PhysicsDebugRenderer() override;
+
 public: // Inherited from btIDebugDraw
   // Assume this is called during FrameCallback (i.e. in update manager, rather than during render...)
   // Generate stack of lines... render, then clear stack.
@@ -68,9 +77,7 @@ public: // Inherited from btIDebugDraw
 
 private:
   bool OnRender(const Dali::RenderCallbackInput& input);
-  void Setup();
-  void PrepareShader();
-  void RenderLines(const Dali::RenderCallbackInput& input);
+  void Render(const Dali::RenderCallbackInput& input);
 
 private:
   CameraActor                           mCamera;
@@ -90,18 +97,15 @@ private:
   };
   std::vector<VertexLine> mLines;
 
-  Dali::Matrix    mModelViewMatrix;
-  Dali::Matrix    mViewMatrix;
-  Dali::Matrix    mProjectionMatrix;
+  Dali::Matrix mModelViewMatrix;
+  Dali::Matrix mViewMatrix;
+  Dali::Matrix mProjectionMatrix;
+
   int             mWidth;
   int             mHeight;
   PhysicsAdaptor& mAdaptor;
-  GLint           mVertexLocation;
-  GLint           mVertexColourLocation;
-  GLint           mProjectionLocation;
-  GLint           mModelViewLocation;
-  GLuint          mBufferId;
-  GLuint          mProgramId;
+
+  Gles::DebugRenderer* mImpl{nullptr};
 };
 
 } // namespace Dali::Toolkit::Physics::Internal
index b909890f1d8abd415638c6dc17962f5cb9e37e35..84d3922b0edbcfedaa366e513aa429519f6418cb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -119,7 +119,7 @@ void ChipmunkPhysicsAdaptor::SetTransformAndSize(const Dali::Matrix& transform,
   GetRootActor()[Actor::Property::SIZE] = Vector3(worldSize.GetWidth(), worldSize.GetHeight(), 0);
 
   auto world = static_cast<ChipmunkPhysicsWorld*>(mPhysicsWorld.get());
-  if(world->HasDebugRenderer())
+  if(world->HasDebugRenderer() && mDebugActor)
   {
     Actor layer                  = mDebugActor.GetParent();
     layer[Actor::Property::SIZE] = Vector3(worldSize);
diff --git a/dali-physics/internal/chipmunk-impl/chipmunk-physics-debug-renderer-gles.cpp b/dali-physics/internal/chipmunk-impl/chipmunk-physics-debug-renderer-gles.cpp
new file mode 100644 (file)
index 0000000..95163e3
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2024 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// External Includes
+#include <GLES3/gl3.h>
+#include <dali/devel-api/addons/addon-base.h>
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/math/matrix.h>
+
+// Internal Includes
+#include <dali-physics/internal/physics-debug-renderer-gles.h>
+
+namespace Dali::Toolkit::Physics::Internal::Gles
+{
+struct DebugRenderer
+{
+  GLint  mPositionLocation{-1};
+  GLint  mUvsLocation{-1};
+  GLint  mRadiusLocation{-1};
+  GLint  mFillColourLocation{-1};
+  GLint  mOutlineColourLocation{-1};
+  GLint  mProjectionLocation{-1};
+  GLint  mModelViewLocation{-1};
+  GLuint mIndexBufferId{0u};
+  GLuint mVertexBufferId{0u};
+  GLuint mProgramId{0u};
+};
+} // namespace Dali::Toolkit::Physics::Internal::Gles
+
+namespace
+{
+using DebugRenderer = Dali::Toolkit::Physics::Internal::Gles::DebugRenderer;
+const char* const DALI_PHYSICS_CHIPMUNK_GLES_ADDON_NAME("PhysicsChipmunkGlesAddOn");
+
+void PrepareShader(DebugRenderer& renderer)
+{
+  static const char glVertexShader[] =
+    "#version 300 es\n"
+    "in vec2 position;\n"
+    "in vec2 uvs;\n"
+    "in float radius;\n"
+    "in vec4 fillColor;\n"
+    "in vec4 outlineColor;\n"
+    "out vec2 v_uvs;\n"
+    "out vec4 v_fill;\n"
+    "out vec4 v_outline;\n"
+    "uniform mat4 projection;\n"
+    "uniform mat4 modelView;\n"
+    "void main()\n"
+    "{\n"
+    "    gl_Position = projection * modelView * vec4(position.xy+radius*uvs, 0.0, 1.0);\n"
+    "    v_uvs=uvs;\n"
+    "    v_fill = fillColor;\n"
+    "    v_fill.rgb *= v_fill.a;\n"
+    "    v_outline = outlineColor;\n"
+    "    v_outline.a *= v_outline.a;\n"
+    "}\n";
+
+  static const char glFragmentShader[] =
+    "#version 300 es\n"
+    "precision mediump float;\n"
+    "in vec2 v_uvs;\n"
+    "in vec4 v_fill;\n"
+    "in vec4 v_outline;\n"
+    "out vec4 fragColor;\n"
+    "void main()\n"
+    "{\n"
+    "    float len=length(v_uvs);\n"
+    "    float fw = length(vec2(dFdx(len), dFdy(len)));\n"
+    "    float mask=smoothstep(-1.0, fw-1.0, -len);\n"
+    "    float outline=1.0-fw;\n"
+    "    float outline_mask=smoothstep(outline-fw, outline, len);\n"
+    "    vec4 color = v_fill + (v_outline - v_fill*v_outline.a)*outline_mask;\n"
+    "    fragColor = color*mask;\n"
+    "}\n";
+
+  renderer.mProgramId = Dali::Toolkit::Physics::Internal::Gles::CreateProgram(glVertexShader, glFragmentShader);
+}
+
+DebugRenderer* CreateGlesPhysicsDebugRenderer()
+{
+  return new DebugRenderer;
+}
+
+void DeleteGlesPhysicsDebugRenderer(DebugRenderer* renderer)
+{
+  delete renderer;
+}
+
+void SetViewport(int width, int height)
+{
+  glViewport(0, 0, width, height);
+}
+
+void Setup(DebugRenderer& renderer, int width, int height)
+{
+  PrepareShader(renderer);
+  renderer.mPositionLocation      = glGetAttribLocation(renderer.mProgramId, "position");
+  renderer.mUvsLocation           = glGetAttribLocation(renderer.mProgramId, "uvs");
+  renderer.mRadiusLocation        = glGetAttribLocation(renderer.mProgramId, "radius");
+  renderer.mFillColourLocation    = glGetAttribLocation(renderer.mProgramId, "fillColor");
+  renderer.mOutlineColourLocation = glGetAttribLocation(renderer.mProgramId, "outlineColor");
+
+  renderer.mProjectionLocation = glGetUniformLocation(renderer.mProgramId, "projection");
+  renderer.mModelViewLocation  = glGetUniformLocation(renderer.mProgramId, "modelView");
+
+  glEnable(GL_DEPTH_TEST);
+  glViewport(0, 0, width, height);
+
+  glGenBuffers(1, &renderer.mIndexBufferId);
+  glGenBuffers(1, &renderer.mVertexBufferId);
+}
+
+void RenderLines(
+  DebugRenderer&      renderer,
+  const void*         indicesData,
+  std::size_t         indicesDataSize,
+  int                 indicesCount,
+  const void*         verticesData,
+  std::size_t         verticesDataSize,
+  const Dali::Matrix& modelViewMatrix,
+  const Dali::Matrix& projectionMatrix)
+{
+  glUseProgram(renderer.mProgramId);
+
+  // In theory, input.clippingBox should tell us the actor position in clip-space.
+  // But, it appears to be bugged.
+  glEnable(GL_BLEND);
+  glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+
+  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, renderer.mIndexBufferId);
+  glBufferData(GL_ELEMENT_ARRAY_BUFFER, GLsizeiptr(indicesDataSize), indicesData, GL_STATIC_DRAW);
+  glBindBuffer(GL_ARRAY_BUFFER, renderer.mVertexBufferId);
+  glBufferData(GL_ARRAY_BUFFER, GLsizeiptr(verticesDataSize), verticesData, GL_STATIC_DRAW);
+
+  GLint stride = 52; // 4*(2 + 2 + 1 + 4 + 4) = 4*13=52
+  glVertexAttribPointer(renderer.mPositionLocation, 2, GL_FLOAT, GL_FALSE, stride, 0);
+  glEnableVertexAttribArray(renderer.mPositionLocation);
+
+  glVertexAttribPointer(renderer.mUvsLocation, 2, GL_FLOAT, GL_FALSE, stride, (const void*)8);
+  glEnableVertexAttribArray(renderer.mUvsLocation);
+
+  glVertexAttribPointer(renderer.mRadiusLocation, 1, GL_FLOAT, GL_FALSE, stride, (const void*)16);
+  glEnableVertexAttribArray(renderer.mRadiusLocation);
+
+  glVertexAttribPointer(renderer.mFillColourLocation, 4, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const void*>(20));
+  glEnableVertexAttribArray(renderer.mFillColourLocation);
+  glVertexAttribPointer(renderer.mOutlineColourLocation, 4, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const void*>(36));
+  glEnableVertexAttribArray(renderer.mOutlineColourLocation);
+
+  glUniformMatrix4fv(renderer.mProjectionLocation, 1, GL_FALSE, projectionMatrix.AsFloat());
+  glUniformMatrix4fv(renderer.mModelViewLocation, 1, GL_FALSE, modelViewMatrix.AsFloat());
+
+  glDrawElements(GL_TRIANGLES, indicesCount, GL_UNSIGNED_SHORT, 0);
+}
+
+} // unnamed namespace
+
+class PhysicsChipmunkGlesAddOn : public Dali::AddOns::AddOnBase
+{
+public:
+  void GetAddOnInfo(Dali::AddOnInfo& info) override
+  {
+    info.type    = Dali::AddOnType::GENERIC;
+    info.name    = DALI_PHYSICS_CHIPMUNK_GLES_ADDON_NAME;
+    info.version = Dali::DALI_ADDON_VERSION(1, 0, 0);
+    info.next    = nullptr;
+  }
+
+  /**
+   * Dispatch table for global functions
+   * @return
+   */
+  Dali::AddOns::DispatchTable* GetGlobalDispatchTable() override
+  {
+    static Dali::AddOns::DispatchTable dispatchTable{};
+    if(dispatchTable.Empty())
+    {
+      dispatchTable["CreateGlesPhysicsDebugRenderer"] = CreateGlesPhysicsDebugRenderer;
+      dispatchTable["DeleteGlesPhysicsDebugRenderer"] = DeleteGlesPhysicsDebugRenderer;
+      dispatchTable["SetViewport"]                    = SetViewport;
+      dispatchTable["Setup"]                          = Setup;
+      dispatchTable["RenderLines"]                    = RenderLines;
+    }
+    return &dispatchTable;
+  }
+
+  /**
+   * Dispatch table for instance functions
+   * @return
+   */
+  Dali::AddOns::DispatchTable* GetInstanceDispatchTable() override
+  {
+    return nullptr;
+  }
+};
+
+REGISTER_ADDON_CLASS(PhysicsChipmunkGlesAddOn);
index 9c776c67644113e35beff23f9493e16361b1476f..7afc14afbdc06ea858af0e4c39a75b7098cd25a5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
  * limitations under the License.
  */
 
+// External Includes
 #include <chipmunk/chipmunk.h>
+#include <dali/devel-api/common/addon-binder.h>
+#include <dali/public-api/adaptor-framework/graphics-backend.h>
+
+// Internal Includes
 #include <dali-physics/internal/chipmunk-impl/chipmunk-physics-adaptor-impl.h>
 #include <dali-physics/internal/chipmunk-impl/chipmunk-physics-debug-renderer.h>
 
-namespace
+namespace Dali::Toolkit::Physics::Internal
 {
-GLuint LoadShader(GLenum shaderType, const char* shaderSource)
+namespace
 {
-  GLuint shader = glCreateShader(shaderType);
-  if(shader != 0)
-  {
-    glShaderSource(shader, 1, &shaderSource, NULL);
-    glCompileShader(shader);
-    GLint compiled = 0;
-    glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
-    if(compiled != GL_TRUE)
-    {
-      GLint infoLen = 0;
-      glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
-
-      if(infoLen > 0)
-      {
-        std::vector<char> logBuffer;
-        logBuffer.resize(infoLen + 1);
-        glGetShaderInfoLog(shader, infoLen, NULL, &logBuffer[0]);
-        fprintf(stderr, "%s\n", &logBuffer[0]);
-        fflush(stderr);
-
-        glDeleteShader(shader);
-        shader = 0;
-      }
-    }
-  }
-  return shader;
-}
+const char* const DALI_PHYSICS_CHIPMUNK_GLES_SO("libdali2-physics-2d-gles.so");
+const char* const DALI_PHYSICS_CHIPMUNK_GLES_ADDON_NAME("PhysicsChipmunkGlesAddOn");
 
-GLuint CreateProgram(const char* vertexSource, const char* fragmentSource)
+struct PhysicsChipmunkGlesAddOn : public Dali::AddOn::AddOnBinder
 {
-  GLuint vertexShader = LoadShader(GL_VERTEX_SHADER, vertexSource);
-  if(!vertexShader)
-  {
-    return 0;
-  }
-  GLuint fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fragmentSource);
-  if(!fragmentShader)
-  {
-    return 0;
-  }
-  GLuint program = glCreateProgram();
-  if(program)
+  PhysicsChipmunkGlesAddOn()
+  : Dali::AddOn::AddOnBinder(DALI_PHYSICS_CHIPMUNK_GLES_ADDON_NAME, DALI_PHYSICS_CHIPMUNK_GLES_SO)
   {
-    glAttachShader(program, vertexShader);
-    glAttachShader(program, fragmentShader);
-    glLinkProgram(program);
-    GLint linkStatus = GL_FALSE;
-    glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
-    if(linkStatus != GL_TRUE)
-    {
-      GLint bufLength = 0;
-      glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
-      if(bufLength)
-      {
-        std::vector<char> logBuffer;
-        logBuffer.resize(bufLength + 1);
-        glGetProgramInfoLog(program, bufLength, NULL, &logBuffer[0]);
-        fprintf(stderr, "%s\n", &logBuffer[0]);
-        fflush(stderr);
-      }
-      glDeleteProgram(program);
-      program = 0;
-    }
   }
-  return program;
-}
+
+  ~PhysicsChipmunkGlesAddOn() = default;
+
+  ADDON_BIND_FUNCTION(CreateGlesPhysicsDebugRenderer, Gles::DebugRenderer*());
+  ADDON_BIND_FUNCTION(DeleteGlesPhysicsDebugRenderer, void(Gles::DebugRenderer*));
+  ADDON_BIND_FUNCTION(SetViewport, void(int, int));
+  ADDON_BIND_FUNCTION(Setup, void(Gles::DebugRenderer&, int, int));
+  ADDON_BIND_FUNCTION(RenderLines, void(Gles::DebugRenderer&, const void*, std::size_t, int, const void*, std::size_t, const Dali::Matrix&, const Dali::Matrix&));
+};
+
+std::unique_ptr<PhysicsChipmunkGlesAddOn> gPhysicsChipmunkGlesAddOn;
 } // namespace
 
-namespace Dali::Toolkit::Physics::Internal
-{
 static void DebugDrawCircleImpl(cpVect pos, cpFloat angle, cpFloat radius, cpSpaceDebugColor outlineColor, cpSpaceDebugColor fillColor, cpDataPointer data)
 {
   auto debugRenderer = static_cast<PhysicsDebugRenderer*>(data);
@@ -140,17 +97,7 @@ PhysicsDebugRenderer::PhysicsDebugRenderer(uint32_t width, uint32_t height, Dali
 : mCamera(camera),
   mWidth(width),
   mHeight(height),
-  mAdaptor(*adaptor),
-  mPositionLocation(-1),
-  mUvsLocation(-1),
-  mRadiusLocation(-1),
-  mFillColourLocation(-1),
-  mOutlineColourLocation(-1),
-  mProjectionLocation(-1),
-  mModelViewLocation(-1),
-  mIndexBufferId(0u),
-  mVertexBufferId(0u),
-  mProgramId(0u)
+  mAdaptor(*adaptor)
 {
   mDebugDrawOptions.drawCircle     = DebugDrawCircleImpl;
   mDebugDrawOptions.drawSegment    = DebugDrawSegmentImpl;
@@ -166,130 +113,76 @@ PhysicsDebugRenderer::PhysicsDebugRenderer(uint32_t width, uint32_t height, Dali
   mDebugDrawOptions.constraintColor     = cpSpaceDebugColor{0.5f, 0.5f, 0.5f, 0.9f};
   mDebugDrawOptions.collisionPointColor = cpSpaceDebugColor{1.0f, 0.0f, 0.0f, 1.0f};
   mDebugDrawOptions.data                = this;
+
+  if(Graphics::GetCurrentGraphicsBackend() == Graphics::Backend::GLES)
+  {
+    if(!gPhysicsChipmunkGlesAddOn)
+    {
+      gPhysicsChipmunkGlesAddOn.reset(new PhysicsChipmunkGlesAddOn);
+    }
+    DALI_ASSERT_ALWAYS(gPhysicsChipmunkGlesAddOn && "Cannot load the Chipmunk Debug Renderer Gles Addon\n");
+    mImpl = gPhysicsChipmunkGlesAddOn->CreateGlesPhysicsDebugRenderer();
+  }
+}
+
+PhysicsDebugRenderer::~PhysicsDebugRenderer()
+{
+  if(gPhysicsChipmunkGlesAddOn)
+  {
+    gPhysicsChipmunkGlesAddOn->DeleteGlesPhysicsDebugRenderer(mImpl);
+    mImpl = nullptr;
+  }
 }
 
 bool PhysicsDebugRenderer::OnRender(const Dali::RenderCallbackInput& input)
 {
   if(mState == State::INIT)
   {
-    Setup();
+    if(gPhysicsChipmunkGlesAddOn && mImpl)
+    {
+      gPhysicsChipmunkGlesAddOn->Setup(*mImpl, mWidth, mHeight);
+    }
     mState = State::RENDER;
   }
-  glViewport(0, 0, mWidth, mHeight);
 
-  RenderLines(input);
+  if(gPhysicsChipmunkGlesAddOn)
+  {
+    gPhysicsChipmunkGlesAddOn->SetViewport(mWidth, mHeight);
+  }
 
+  Render(input);
   return false;
 }
 
-// Run on first invocation of callback
-void PhysicsDebugRenderer::Setup()
-{
-  PrepareShader();
-  mPositionLocation      = glGetAttribLocation(mProgramId, "position");
-  mUvsLocation           = glGetAttribLocation(mProgramId, "uvs");
-  mRadiusLocation        = glGetAttribLocation(mProgramId, "radius");
-  mFillColourLocation    = glGetAttribLocation(mProgramId, "fillColor");
-  mOutlineColourLocation = glGetAttribLocation(mProgramId, "outlineColor");
-
-  mProjectionLocation = glGetUniformLocation(mProgramId, "projection");
-  mModelViewLocation  = glGetUniformLocation(mProgramId, "modelView");
-
-  glEnable(GL_DEPTH_TEST);
-  glViewport(0, 0, mWidth, mHeight);
-
-  glGenBuffers(1, &mIndexBufferId);
-  glGenBuffers(1, &mVertexBufferId);
-}
-
 void PhysicsDebugRenderer::UpdateWindowSize(Dali::Vector2 size)
 {
   mWidth  = size.width;
   mHeight = size.height;
 }
 
-void PhysicsDebugRenderer::PrepareShader()
-{
-  static const char glVertexShader[] =
-    "#version 300 es\n"
-    "in vec2 position;\n"
-    "in vec2 uvs;\n"
-    "in float radius;\n"
-    "in vec4 fillColor;\n"
-    "in vec4 outlineColor;\n"
-    "out vec2 v_uvs;\n"
-    "out vec4 v_fill;\n"
-    "out vec4 v_outline;\n"
-    "uniform mat4 projection;\n"
-    "uniform mat4 modelView;\n"
-    "void main()\n"
-    "{\n"
-    "    gl_Position = projection * modelView * vec4(position.xy+radius*uvs, 0.0, 1.0);\n"
-    "    v_uvs=uvs;\n"
-    "    v_fill = fillColor;\n"
-    "    v_fill.rgb *= v_fill.a;\n"
-    "    v_outline = outlineColor;\n"
-    "    v_outline.a *= v_outline.a;\n"
-    "}\n";
-
-  static const char glFragmentShader[] =
-    "#version 300 es\n"
-    "precision mediump float;\n"
-    "in vec2 v_uvs;\n"
-    "in vec4 v_fill;\n"
-    "in vec4 v_outline;\n"
-    "out vec4 fragColor;\n"
-    "void main()\n"
-    "{\n"
-    "    float len=length(v_uvs);\n"
-    "    float fw = length(vec2(dFdx(len), dFdy(len)));\n"
-    "    float mask=smoothstep(-1.0, fw-1.0, -len);\n"
-    "    float outline=1.0-fw;\n"
-    "    float outline_mask=smoothstep(outline-fw, outline, len);\n"
-    "    vec4 color = v_fill + (v_outline - v_fill*v_outline.a)*outline_mask;\n"
-    "    fragColor = color*mask;\n"
-    "}\n";
-
-  mProgramId = CreateProgram(glVertexShader, glFragmentShader);
-}
-
-void PhysicsDebugRenderer::RenderLines(const Dali::RenderCallbackInput& input)
+void PhysicsDebugRenderer::Render(const Dali::RenderCallbackInput& input)
 {
   mModelViewMatrix.SetIdentity();
   mProjectionMatrix = input.projection;
 
   Matrix::Multiply(mModelViewMatrix, mModelViewMatrix, input.view);
-  glUseProgram(mProgramId);
 
   // In theory, input.clippingBox should tell us the actor position in clip-space.
   // But, it appears to be bugged.
-  glEnable(GL_BLEND);
-  glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
-
-  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBufferId);
-  glBufferData(GL_ELEMENT_ARRAY_BUFFER, GLsizeiptr(mIndices.size() * sizeof(uint16_t)), &mIndices[0], GL_STATIC_DRAW);
-  glBindBuffer(GL_ARRAY_BUFFER, mVertexBufferId);
-  glBufferData(GL_ARRAY_BUFFER, GLsizeiptr(mVertices.size() * sizeof(Vertex)), &mVertices[0], GL_STATIC_DRAW);
 
-  GLint stride = 52; // 4*(2 + 2 + 1 + 4 + 4) = 4*13=52
-  glVertexAttribPointer(mPositionLocation, 2, GL_FLOAT, GL_FALSE, stride, 0);
-  glEnableVertexAttribArray(mPositionLocation);
-
-  glVertexAttribPointer(mUvsLocation, 2, GL_FLOAT, GL_FALSE, stride, (const void*)8);
-  glEnableVertexAttribArray(mUvsLocation);
-
-  glVertexAttribPointer(mRadiusLocation, 1, GL_FLOAT, GL_FALSE, stride, (const void*)16);
-  glEnableVertexAttribArray(mRadiusLocation);
-
-  glVertexAttribPointer(mFillColourLocation, 4, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const void*>(20));
-  glEnableVertexAttribArray(mFillColourLocation);
-  glVertexAttribPointer(mOutlineColourLocation, 4, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const void*>(36));
-  glEnableVertexAttribArray(mOutlineColourLocation);
-
-  glUniformMatrix4fv(mProjectionLocation, 1, GL_FALSE, mProjectionMatrix.AsFloat());
-  glUniformMatrix4fv(mModelViewLocation, 1, GL_FALSE, mModelViewMatrix.AsFloat());
+  if(gPhysicsChipmunkGlesAddOn && mImpl)
+  {
+    gPhysicsChipmunkGlesAddOn->RenderLines(
+      *mImpl,
+      &mIndices[0],
+      mIndices.size() * sizeof(uint16_t),
+      mIndices.size(),
+      &mVertices[0],
+      mVertices.size() * sizeof(Vertex),
+      mModelViewMatrix,
+      mProjectionMatrix);
+  }
 
-  glDrawElements(GL_TRIANGLES, mIndices.size(), GL_UNSIGNED_SHORT, 0);
   mIndices.clear();
   mVertices.clear();
 }
index 2a4335b671af76f6ec34bd9f506a3cabba1982e7..37f64a796d73ea933947debd6d941dd85900b5fe 100644 (file)
@@ -1,7 +1,7 @@
 #pragma once
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -16,7 +16,6 @@
  * limitations under the License.
  */
 
-#include <GLES3/gl3.h>
 #include <chipmunk/chipmunk.h>
 #include <dali/dali.h>
 
@@ -29,6 +28,11 @@ using Dali::TextureSet;
 
 namespace Dali::Toolkit::Physics::Internal
 {
+namespace Gles
+{
+struct DebugRenderer;
+}
+
 class PhysicsAdaptor;
 
 class PhysicsDebugRenderer
@@ -54,6 +58,11 @@ public:
    */
   PhysicsDebugRenderer(uint32_t width, uint32_t height, Dali::CameraActor camera, PhysicsAdaptor* adaptor);
 
+  /**
+   * Destructor
+   */
+  ~PhysicsDebugRenderer();
+
   /**
    * Get the drawing options struct ( construct only )
    */
@@ -83,7 +92,7 @@ private:
   bool OnRender(const Dali::RenderCallbackInput& input);
   void Setup();
   void PrepareShader();
-  void RenderLines(const Dali::RenderCallbackInput& input);
+  void Render(const Dali::RenderCallbackInput& input);
 
   Vertex* PushVertices(uint32_t vertexCount, uint32_t indexCount, const uint16_t* indices);
   Vertex  MakeVertex(cpVect pos, float u, float v, float r, Vector4 fill, Vector4 outline);
@@ -110,17 +119,9 @@ private:
   int             mHeight;
   PhysicsAdaptor& mAdaptor;
 
-  float  mPointLineScale{2.0f};
-  GLint  mPositionLocation;
-  GLint  mUvsLocation;
-  GLint  mRadiusLocation;
-  GLint  mFillColourLocation;
-  GLint  mOutlineColourLocation;
-  GLint  mProjectionLocation;
-  GLint  mModelViewLocation;
-  GLuint mIndexBufferId;
-  GLuint mVertexBufferId;
-  GLuint mProgramId;
+  float mPointLineScale{2.0f};
+
+  Gles::DebugRenderer* mImpl{nullptr};
 };
 
 } // namespace Dali::Toolkit::Physics::Internal
index 19137dde6ce180d6e183da7c4175a5dc7dc64aef..73122062882dc8e06d2bd690b15145dc7c5e16ad 100644 (file)
@@ -11,6 +11,11 @@ set(physics2d_src_files ${physics_src_files}
   ${physics_internal_dir}/physics-world-impl.cpp
 )
 
+set(physics2d_gles_src_files
+  ${physics2d_internal_dir}/chipmunk-physics-debug-renderer-gles.cpp
+  ${physics_internal_dir}/physics-debug-renderer-gles.cpp
+)
+
 set(physics3d_src_files ${physics_src_files}
   ${physics3d_internal_dir}/bullet-physics-actor-impl.cpp
   ${physics3d_internal_dir}/bullet-physics-adaptor-impl.cpp
@@ -19,3 +24,8 @@ set(physics3d_src_files ${physics_src_files}
   ${physics_internal_dir}/physics-adaptor-impl.cpp
   ${physics_internal_dir}/physics-world-impl.cpp
 )
+
+set(physics3d_gles_src_files
+  ${physics3d_internal_dir}/bullet-physics-debug-renderer-gles.cpp
+  ${physics_internal_dir}/physics-debug-renderer-gles.cpp
+)
diff --git a/dali-physics/internal/physics-debug-renderer-gles.cpp b/dali-physics/internal/physics-debug-renderer-gles.cpp
new file mode 100644 (file)
index 0000000..7cefce7
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2024 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Header
+#include <dali-physics/internal/physics-debug-renderer-gles.h>
+
+// External Includes
+#include <GLES3/gl3.h>
+#include <cstdio>
+#include <vector>
+
+namespace Dali::Toolkit::Physics::Internal::Gles
+{
+namespace
+{
+GLuint LoadShader(GLenum shaderType, const char* shaderSource)
+{
+  GLuint shader = glCreateShader(shaderType);
+  if(shader != 0)
+  {
+    glShaderSource(shader, 1, &shaderSource, NULL);
+    glCompileShader(shader);
+    GLint compiled = 0;
+    glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
+    if(compiled != GL_TRUE)
+    {
+      GLint infoLen = 0;
+      glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
+
+      if(infoLen > 0)
+      {
+        std::vector<char> logBuffer;
+        logBuffer.resize(infoLen + 1);
+        glGetShaderInfoLog(shader, infoLen, NULL, &logBuffer[0]);
+        fprintf(stderr, "%s\n", &logBuffer[0]);
+        fflush(stderr);
+
+        glDeleteShader(shader);
+        shader = 0;
+      }
+    }
+  }
+  return shader;
+}
+} // unnamed namespace
+
+GLuint CreateProgram(const char* vertexSource, const char* fragmentSource)
+{
+  GLuint vertexShader = LoadShader(GL_VERTEX_SHADER, vertexSource);
+  if(!vertexShader)
+  {
+    return 0;
+  }
+  GLuint fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fragmentSource);
+  if(!fragmentShader)
+  {
+    return 0;
+  }
+  GLuint program = glCreateProgram();
+  if(program)
+  {
+    glAttachShader(program, vertexShader);
+    glAttachShader(program, fragmentShader);
+    glLinkProgram(program);
+    GLint linkStatus = GL_FALSE;
+    glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
+    if(linkStatus != GL_TRUE)
+    {
+      GLint bufLength = 0;
+      glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
+      if(bufLength)
+      {
+        std::vector<char> logBuffer;
+        logBuffer.resize(bufLength + 1);
+        glGetProgramInfoLog(program, bufLength, NULL, &logBuffer[0]);
+        fprintf(stderr, "%s\n", &logBuffer[0]);
+        fflush(stderr);
+      }
+      glDeleteProgram(program);
+      program = 0;
+    }
+  }
+  return program;
+}
+
+} // namespace Dali::Toolkit::Physics::Internal::Gles
diff --git a/dali-physics/internal/physics-debug-renderer-gles.h b/dali-physics/internal/physics-debug-renderer-gles.h
new file mode 100644 (file)
index 0000000..e4da822
--- /dev/null
@@ -0,0 +1,31 @@
+#pragma once
+
+/*
+ * Copyright (c) 2024 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// External Includes
+#include <GLES3/gl3.h>
+
+namespace Dali::Toolkit::Physics::Internal::Gles
+{
+/**
+ * Given the vertex and the fragment source, compiles them and creates the program.
+ * @param vertexSource The vertex shader
+ * @param fragmentSource The fragment shader
+ * @return The program ID.
+ */
+GLuint CreateProgram(const char* vertexSource, const char* fragmentSource);
+} // namespace Dali::Toolkit::Physics::Internal::Gles
index 75de20157fa81fb0f265d29422d312b2c490706a..68778016450d34c672499ecb97e6d7c08c5bf704 100644 (file)
@@ -29,7 +29,7 @@
 #include <dali/public-api/rendering/texture.h>
 
 // INTERNAL INCLUDES
-#include <dali-toolkit/internal/graphics/builtin-shader-extern-gen.h>
+#include <dali-toolkit/internal/gles-addon/builtin-shader-extern-gen.h>
 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
 
 namespace Dali
@@ -48,13 +48,7 @@ Dali::Toolkit::GlView GlView::New(Dali::Toolkit::GlView::ColorFormat colorFormat
 
 GlView::GlView(Dali::Toolkit::GlView::ColorFormat colorFormat)
 : Dali::Toolkit::Internal::GlViewImpl(Toolkit::GlView::BackendMode::EGL_IMAGE_OFFSCREEN_RENDERING),
-  mRenderThread(nullptr),
-  mNativeImageQueue(nullptr),
-  mRenderingMode(Toolkit::GlView::RenderingMode::CONTINUOUS),
-  mColorFormat(colorFormat),
-  mDepth(false),
-  mStencil(false),
-  mMSAA(0)
+  mColorFormat(colorFormat)
 {
 }
 
@@ -134,11 +128,6 @@ void GlView::SetRenderingMode(Dali::Toolkit::GlView::RenderingMode mode)
   }
 }
 
-Dali::Toolkit::GlView::RenderingMode GlView::GetRenderingMode() const
-{
-  return mRenderingMode;
-}
-
 void GlView::RenderOnce()
 {
   if(mRenderThread)
@@ -212,7 +201,8 @@ void GlView::OnControlInheritedVisibilityChanged(Dali::Actor actor, bool visible
   Actor self = Self();
   if(mRenderThread)
   {
-    if(visible && DevelWindow::Get(self).IsVisible())
+    auto window = DevelWindow::Get(self);
+    if(visible && window && window.IsVisible())
     {
       mRenderThread->Resume();
     }
index faeafc5afb1aa76f062c07e0ce4bea5576ea4abe..859a02e8cacdf54540590e2f94a53725af35b415 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_TOOLKIT_INTERNAL_GL_VIEW_H
 
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -77,7 +77,10 @@ public:
   /**
    * @copydoc Dali::Toolkit::GlView::GetRenderingMode()
    */
-  Dali::Toolkit::GlView::RenderingMode GetRenderingMode() const override;
+  Dali::Toolkit::GlView::RenderingMode GetRenderingMode() const override
+  {
+    return mRenderingMode;
+  }
 
   /**
    * @copydoc Dali::Toolkit::GlView::RenderOnce()
@@ -150,12 +153,11 @@ private:
 private:
   std::unique_ptr<GlViewRenderThread>  mRenderThread;
   Dali::NativeImageSourceQueuePtr      mNativeImageQueue;
-  Dali::Toolkit::GlView::RenderingMode mRenderingMode;
-  Dali::Toolkit::GlView::ColorFormat   mColorFormat;
-
-  bool mDepth;
-  bool mStencil;
-  int  mMSAA;
+  Dali::Toolkit::GlView::RenderingMode mRenderingMode{Toolkit::GlView::RenderingMode::CONTINUOUS};
+  Dali::Toolkit::GlView::ColorFormat   mColorFormat{Toolkit::GlView::ColorFormat::RGB888};
+  bool                                 mDepth{false};
+  bool                                 mStencil{false};
+  int                                  mMSAA{0};
 };
 
 } // namespace Internal
index d13e3b559b1ce55b029630e5dc639fc556f42c00..54ac246b1629689727fa6e37e369c94676fe60e0 100644 (file)
@@ -272,6 +272,7 @@ SET(toolkit_internal_egl_src_files
    ${toolkit_src_dir}/controls/gl-view/drawable-view-native-renderer.cpp
    ${toolkit_src_dir}/controls/gl-view/gl-view-impl.cpp
    ${toolkit_src_dir}/controls/gl-view/gl-view-render-thread.cpp
+   ${toolkit_src_dir}/gles-addon/gles-addon.cpp
 )
 
 SET( SOURCES ${SOURCES}
diff --git a/dali-toolkit/internal/gles-addon/gles-addon.cpp b/dali-toolkit/internal/gles-addon/gles-addon.cpp
new file mode 100644 (file)
index 0000000..cd68582
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2024 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/devel-api/addons/addon-base.h>
+#include <dali/integration-api/debug.h>
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/internal/controls/gl-view/drawable-view-impl.h>
+#include <dali-toolkit/internal/controls/gl-view/gl-view-impl.h>
+#include <dali-toolkit/public-api/controls/gl-view/gl-view.h>
+
+using namespace Dali;
+using namespace Dali::Toolkit;
+using BackendMode = GlView::BackendMode;
+using GlViewImpl  = Dali::Toolkit::Internal::GlViewImpl;
+
+namespace
+{
+const char* const DALI_TOOLKIT_GLES_ADDON_NAME("ToolkitGlesAddOn");
+
+GlView GlViewNew(BackendMode backendMode, GlView::ColorFormat colorFormat)
+{
+  switch(backendMode)
+  {
+    case BackendMode::DIRECT_RENDERING:
+    case BackendMode::DIRECT_RENDERING_THREADED:
+    case BackendMode::UNSAFE_DIRECT_RENDERING:
+    {
+      return Toolkit::Internal::DrawableView::New(backendMode);
+    }
+    case BackendMode::EGL_IMAGE_OFFSCREEN_RENDERING:
+    {
+      return Toolkit::Internal::GlView::New(colorFormat);
+    }
+    default:
+    {
+      DALI_ABORT("Invalid BackendMode");
+    }
+  }
+}
+
+void GlViewRegisterGlCallbacks(
+  GlViewImpl&&  glView,
+  CallbackBase* initCallback,
+  CallbackBase* renderFrameCallback,
+  CallbackBase* terminateCallback)
+{
+  glView.RegisterGlCallbacks(initCallback, renderFrameCallback, terminateCallback);
+}
+
+void GlViewSetResizeCallback(GlViewImpl& glViewImpl, CallbackBase* resizeCallback)
+{
+  glViewImpl.SetResizeCallback(resizeCallback);
+}
+
+bool GlViewSetGraphicsConfig(
+  GlViewImpl&                glViewImpl,
+  bool                       depth,
+  bool                       stencil,
+  int                        msaa,
+  GlView::GraphicsApiVersion version)
+{
+  return glViewImpl.SetGraphicsConfig(depth, stencil, msaa, version);
+}
+
+void GlViewSetRenderingMode(GlViewImpl& glViewImpl, GlView::RenderingMode mode)
+{
+  glViewImpl.SetRenderingMode(mode);
+}
+
+GlView::RenderingMode GlViewGetRenderingMode(const GlViewImpl&& glViewImpl)
+{
+  return glViewImpl.GetRenderingMode();
+}
+
+BackendMode GlViewGetBackendMode(const GlViewImpl&& glViewImpl)
+{
+  return glViewImpl.GetBackendMode();
+}
+
+void GlViewRenderOnce(GlViewImpl&& glViewImpl)
+{
+  glViewImpl.RenderOnce();
+}
+
+void GlViewBindTextureResources(GlViewImpl&& glViewImpl, std::vector<Dali::Texture> textures)
+{
+  glViewImpl.BindTextureResources(std::move(textures));
+}
+} // unnamed namespace
+
+class ToolkitGlesAddOn : public Dali::AddOns::AddOnBase
+{
+public:
+  void GetAddOnInfo(Dali::AddOnInfo& info) override
+  {
+    info.type    = Dali::AddOnType::GENERIC;
+    info.name    = DALI_TOOLKIT_GLES_ADDON_NAME;
+    info.version = Dali::DALI_ADDON_VERSION(1, 0, 0);
+    info.next    = nullptr;
+  }
+
+  /**
+   * Dispatch table for global functions
+   * @return
+   */
+  Dali::AddOns::DispatchTable* GetGlobalDispatchTable() override
+  {
+    static Dali::AddOns::DispatchTable dispatchTable{};
+    if(dispatchTable.Empty())
+    {
+      dispatchTable["GlViewNew"]                  = GlViewNew;
+      dispatchTable["GlViewRegisterGlCallbacks"]  = GlViewRegisterGlCallbacks;
+      dispatchTable["GlViewSetResizeCallback"]    = GlViewSetResizeCallback;
+      dispatchTable["GlViewSetGraphicsConfig"]    = GlViewSetGraphicsConfig;
+      dispatchTable["GlViewSetRenderingMode"]     = GlViewSetRenderingMode;
+      dispatchTable["GlViewGetRenderingMode"]     = GlViewGetRenderingMode;
+      dispatchTable["GlViewGetBackendMode"]       = GlViewGetBackendMode;
+      dispatchTable["GlViewRenderOnce"]           = GlViewRenderOnce;
+      dispatchTable["GlViewBindTextureResources"] = GlViewBindTextureResources;
+    }
+    return &dispatchTable;
+  }
+
+  /**
+   * Dispatch table for instance functions
+   * @return
+   */
+  Dali::AddOns::DispatchTable* GetInstanceDispatchTable() override
+  {
+    return nullptr;
+  }
+};
+
+REGISTER_ADDON_CLASS(ToolkitGlesAddOn);
diff --git a/dali-toolkit/internal/gles-addon/shaders/gl-view.frag b/dali-toolkit/internal/gles-addon/shaders/gl-view.frag
new file mode 100644 (file)
index 0000000..6b1f51b
--- /dev/null
@@ -0,0 +1,15 @@
+//@name gl-view.frag
+
+//@version 100
+INPUT mediump vec2       vTexCoord;
+UNIFORM samplerExternalOES sTexture;
+
+UNIFORM_BLOCK FragBlock
+{
+  UNIFORM lowp vec4          uColor;
+};
+
+void main()
+{
+  gl_FragColor = TEXTURE(sTexture, vTexCoord) * uColor;
+}
\ No newline at end of file
diff --git a/dali-toolkit/internal/gles-addon/shaders/gl-view.vert b/dali-toolkit/internal/gles-addon/shaders/gl-view.vert
new file mode 100644 (file)
index 0000000..60f7d33
--- /dev/null
@@ -0,0 +1,18 @@
+//@name gl-view.vert
+
+//@version 100
+
+INPUT mediump vec2 aPosition;
+UNIFORM_BLOCK VertBlock
+{
+  UNIFORM mediump mat4   uMvpMatrix;
+  UNIFORM mediump vec3   uSize;
+};
+OUTPUT mediump vec2   vTexCoord;
+
+void main()
+{
+  vec4 position = vec4(aPosition, 0.0, 1.0) * vec4(uSize, 1.0);
+  vTexCoord     = aPosition + vec2(0.5);
+  gl_Position   = uMvpMatrix * position;
+}
\ No newline at end of file
diff --git a/dali-toolkit/internal/graphics/shaders/gl-view.frag b/dali-toolkit/internal/graphics/shaders/gl-view.frag
deleted file mode 100644 (file)
index 6b1f51b..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-//@name gl-view.frag
-
-//@version 100
-INPUT mediump vec2       vTexCoord;
-UNIFORM samplerExternalOES sTexture;
-
-UNIFORM_BLOCK FragBlock
-{
-  UNIFORM lowp vec4          uColor;
-};
-
-void main()
-{
-  gl_FragColor = TEXTURE(sTexture, vTexCoord) * uColor;
-}
\ No newline at end of file
diff --git a/dali-toolkit/internal/graphics/shaders/gl-view.vert b/dali-toolkit/internal/graphics/shaders/gl-view.vert
deleted file mode 100644 (file)
index 60f7d33..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-//@name gl-view.vert
-
-//@version 100
-
-INPUT mediump vec2 aPosition;
-UNIFORM_BLOCK VertBlock
-{
-  UNIFORM mediump mat4   uMvpMatrix;
-  UNIFORM mediump vec3   uSize;
-};
-OUTPUT mediump vec2   vTexCoord;
-
-void main()
-{
-  vec4 position = vec4(aPosition, 0.0, 1.0) * vec4(uSize, 1.0);
-  vTexCoord     = aPosition + vec2(0.5);
-  gl_Position   = uMvpMatrix * position;
-}
\ No newline at end of file
index 5060566dd4e1e825163263cc7cb29e1b4e8521f2..9ea2fa4a8fb6680045118a3897b68ffd1a4adf9e 100644 (file)
 #include <dali-toolkit/public-api/controls/gl-view/gl-view.h>
 
 // INTERNAL INCLUDES
-#include <dali-toolkit/internal/controls/gl-view/drawable-view-impl.h>
 #include <dali-toolkit/internal/controls/gl-view/gl-view-impl.h>
 
+// EXTERNAL INCLUDES
+#include <dali/devel-api/common/addon-binder.h>
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/adaptor-framework/graphics-backend.h>
+#include <dlfcn.h>
+#include <memory>
+
 namespace Dali::Toolkit
 {
+namespace
+{
+const char* const DALI_TOOLKIT_GLES_SO("libdali2-toolkit-gles.so");
+const char* const DALI_TOOLKIT_GLES_ADDON_NAME("ToolkitGlesAddOn");
+
+struct ToolkitGlesAddOn : public Dali::AddOn::AddOnBinder
+{
+  ToolkitGlesAddOn()
+  : Dali::AddOn::AddOnBinder(DALI_TOOLKIT_GLES_ADDON_NAME, DALI_TOOLKIT_GLES_SO)
+  {
+  }
+  ~ToolkitGlesAddOn() = default;
+
+  ADDON_BIND_FUNCTION(GlViewNew, GlView(GlView::BackendMode, GlView::ColorFormat));
+  ADDON_BIND_FUNCTION(GlViewRegisterGlCallbacks, void(Internal::GlViewImpl&, CallbackBase*, CallbackBase*, CallbackBase*));
+  ADDON_BIND_FUNCTION(GlViewSetResizeCallback, void(Internal::GlViewImpl&, CallbackBase*));
+  ADDON_BIND_FUNCTION(GlViewSetGraphicsConfig, bool(Internal::GlViewImpl&, bool, bool, int, GlView::GraphicsApiVersion));
+  ADDON_BIND_FUNCTION(GlViewSetRenderingMode, void(Internal::GlViewImpl&, GlView::RenderingMode));
+  ADDON_BIND_FUNCTION(GlViewGetRenderingMode, GlView::RenderingMode(const Internal::GlViewImpl&));
+  ADDON_BIND_FUNCTION(GlViewGetBackendMode, GlView::BackendMode(const Internal::GlViewImpl&));
+  ADDON_BIND_FUNCTION(GlViewRenderOnce, void(Internal::GlViewImpl&));
+  ADDON_BIND_FUNCTION(GlViewBindTextureResources, void(Internal::GlViewImpl&, std::vector<Dali::Texture>));
+};
+
+std::unique_ptr<ToolkitGlesAddOn> gToolkitGlesAddon;
+} // namespace
+
 GlView::GlView() = default;
 
 GlView::GlView(const GlView& GlView) = default;
@@ -38,31 +71,21 @@ GlView::~GlView() = default;
 
 GlView GlView::New(ColorFormat colorFormat)
 {
-  // This function is backward compatible and always returns
-  // backend based on NativeImage.
-  return Internal::GlView::New(colorFormat);
+  return New(BackendMode::EGL_IMAGE_OFFSCREEN_RENDERING, colorFormat);
 }
 
 GlView GlView::New(BackendMode backendMode, ColorFormat colorFormat)
 {
-  switch(backendMode)
+  if(Graphics::GetCurrentGraphicsBackend() == Graphics::Backend::GLES)
   {
-    case BackendMode::DIRECT_RENDERING:
-    case BackendMode::DIRECT_RENDERING_THREADED:
-    case BackendMode::UNSAFE_DIRECT_RENDERING:
-    {
-      return Internal::DrawableView::New(backendMode);
-    }
-    case BackendMode::EGL_IMAGE_OFFSCREEN_RENDERING:
-    {
-      return Internal::GlView::New(colorFormat);
-    }
-    default:
+    if(!gToolkitGlesAddon)
     {
-      DALI_ASSERT_ALWAYS("Invalid BackendMode");
+      gToolkitGlesAddon.reset(new ToolkitGlesAddOn);
     }
+    DALI_ASSERT_ALWAYS(gToolkitGlesAddon && "Cannot load the GlView Addon\n");
+    return gToolkitGlesAddon->GlViewNew(backendMode, colorFormat);
   }
-  return {};
+  DALI_ABORT("Current Graphics Backend does not support GlView\n");
 }
 
 GlView GlView::DownCast(BaseHandle handle)
@@ -72,42 +95,65 @@ GlView GlView::DownCast(BaseHandle handle)
 
 void GlView::RegisterGlCallbacks(CallbackBase* initCallback, CallbackBase* renderFrameCallback, CallbackBase* terminateCallback)
 {
-  Dali::Toolkit::GetImpl(*this).RegisterGlCallbacks(initCallback, renderFrameCallback, terminateCallback);
+  Internal::GlViewImpl& impl = GetImpl(*this); // Get Impl here to catch uninitialized usage
+  if(gToolkitGlesAddon)
+  {
+    gToolkitGlesAddon->GlViewRegisterGlCallbacks(impl, initCallback, renderFrameCallback, terminateCallback);
+  }
 }
 
 void GlView::SetResizeCallback(CallbackBase* resizeCallback)
 {
-  Dali::Toolkit::GetImpl(*this).SetResizeCallback(resizeCallback);
+  Internal::GlViewImpl& impl = GetImpl(*this); // Get Impl here to catch uninitialized usage
+  if(gToolkitGlesAddon)
+  {
+    gToolkitGlesAddon->GlViewSetResizeCallback(impl, resizeCallback);
+  }
 }
 
 bool GlView::SetGraphicsConfig(bool depth, bool stencil, int msaa, GraphicsApiVersion version)
 {
-  return Dali::Toolkit::GetImpl(*this).SetGraphicsConfig(depth, stencil, msaa, version);
+  Internal::GlViewImpl& impl = GetImpl(*this); // Get Impl here to catch uninitialized usage
+  return gToolkitGlesAddon ? gToolkitGlesAddon->GlViewSetGraphicsConfig(impl, depth, stencil, msaa, version) : false;
 }
 
 void GlView::SetRenderingMode(RenderingMode mode)
 {
-  Dali::Toolkit::GetImpl(*this).SetRenderingMode(mode);
+  Internal::GlViewImpl& impl = GetImpl(*this);
+  if(gToolkitGlesAddon)
+  {
+    gToolkitGlesAddon->GlViewSetRenderingMode(impl, mode);
+  }
 }
 
 Dali::Toolkit::GlView::RenderingMode GlView::GetRenderingMode() const
 {
-  return Dali::Toolkit::GetImpl(*this).GetRenderingMode();
+  const Internal::GlViewImpl& impl = GetImpl(*this); // Get Impl here to catch uninitialized usage
+  return gToolkitGlesAddon ? gToolkitGlesAddon->GlViewGetRenderingMode(impl) : RenderingMode::CONTINUOUS;
 }
 
 Dali::Toolkit::GlView::BackendMode GlView::GetBackendMode() const
 {
-  return Dali::Toolkit::GetImpl(*this).GetBackendMode();
+  const Internal::GlViewImpl& impl = GetImpl(*this); // Get Impl here to catch uninitialized usage
+  return gToolkitGlesAddon ? gToolkitGlesAddon->GlViewGetBackendMode(impl) : BackendMode::DEFAULT;
 }
 
 void GlView::RenderOnce()
 {
-  Dali::Toolkit::GetImpl(*this).RenderOnce();
+  Internal::GlViewImpl& impl = GetImpl(*this); // Get Impl here to catch uninitialized usage
+  if(gToolkitGlesAddon)
+  {
+    gToolkitGlesAddon->GlViewRenderOnce(impl);
+  }
 }
 
 void GlView::BindTextureResources(std::vector<Dali::Texture> textures)
 {
-  Dali::Toolkit::GetImpl(*this).BindTextureResources(std::move(textures));
+  Internal::GlViewImpl& impl = GetImpl(*this); // Get Impl here to catch uninitialized usage
+  if(gToolkitGlesAddon)
+  {
+    gToolkitGlesAddon->GlViewBindTextureResources(impl, std::move(textures));
+  }
 }
 
 GlView::GlView(Internal::GlViewImpl& implementation)
index 13cc2e9840e9a20764b4c0df09c3e8c321c4bf1f..5b81b77f3c0c7e7fb71fb1f78c727bf8d044f324 100644 (file)
@@ -367,7 +367,7 @@ public: // Not intended for application developers
    *
    * @SINCE_2_0.45
    */
-  DALI_INTERNAL GlView(Internal::GlViewImpl& implementation);
+  GlView(Internal::GlViewImpl& implementation);
 
   /**
    * @brief Allows the creation of this GlView from an Internal::CustomActor pointer.
@@ -375,7 +375,7 @@ public: // Not intended for application developers
    *
    * @SINCE_2_0.45
    */
-  DALI_INTERNAL GlView(Dali::Internal::CustomActor* internal);
+  GlView(Dali::Internal::CustomActor* internal);
   /// @endcond
 };
 
index 0a69c83c3ee85f9ee1486f0527e46986ff5a6a70..951ad525f5cc2f45dcb06ad162a8539912f967b2 100644 (file)
@@ -10,6 +10,7 @@ SET( public_api_src_files
   ${public_api_src_dir}/controls/buttons/push-button.cpp
   ${public_api_src_dir}/controls/buttons/radio-button.cpp
   ${public_api_src_dir}/controls/flex-container/flex-container.cpp
+  ${public_api_src_dir}/controls/gl-view/gl-view.cpp
   ${public_api_src_dir}/controls/image-view/image-view.cpp
   ${public_api_src_dir}/controls/model3d-view/model3d-view.cpp
   ${public_api_src_dir}/controls/progress-bar/progress-bar.cpp
@@ -52,10 +53,6 @@ SET( public_api_src_files
   ${public_api_src_dir}/enums.cpp
 )
 
-SET(public_api_egl_src_files
-  ${public_api_src_dir}/controls/gl-view/gl-view.cpp
-)
-
 # Add public header files here
 SET( public_api_header_files
   ${public_api_src_dir}/dali-toolkit-version.h
index e1214c70a96317b39bf936240c5b53a49353560a..6af564b1d3ba7d4bedcd84269a1298dbc33e5bbe 100644 (file)
@@ -246,7 +246,8 @@ cmake \
       -DCMAKE_INSTALL_PREFIX=%{_prefix} \
       -DCMAKE_INSTALL_LIBDIR=%{_libdir} \
       -DCMAKE_INSTALL_INCLUDEDIR=%{_includedir} \
-      -DENABLE_I18N=ON
+      -DENABLE_I18N=ON \
+      .
 
 make %{?jobs:-j%jobs}
 
@@ -511,6 +512,7 @@ exit 0
 %endif
 %defattr(-,root,root,-)
 %{_libdir}/libdali2-toolkit.so*
+%{_libdir}/libdali2-toolkit-gles.so*
 %license LICENSE
 
 %files devel
@@ -594,6 +596,7 @@ exit 0
 %defattr(-,root,root,-)
 %{_libdir}/libchipmunk.so*
 %{_libdir}/libdali2-physics-2d.so*
+%{_libdir}/libdali2-physics-2d-gles.so*
 %license LICENSE
 
 %files -n %{dali2_physics2d}-devel
@@ -614,6 +617,7 @@ exit 0
 %defattr(-,root,root,-)
 %{_libdir}/libbullet3.so*
 %{_libdir}/libdali2-physics-3d.so*
+%{_libdir}/libdali2-physics-3d-gles.so*
 %license LICENSE
 
 %files -n %{dali2_physics3d}-devel
@@ -639,4 +643,4 @@ exit 0
 %files -n %{dali2_usdloader}-devel
 %defattr(-,root,root,-)
 %{_libdir}/pkgconfig/dali2-usd-loader.pc
-%endif
\ No newline at end of file
+%endif