Add internal UTC to use ShaderFactory.SaveShader 75/314375/3
authorEunki, Hong <eunkiki.hong@samsung.com>
Thu, 11 Jul 2024 02:25:21 +0000 (11:25 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 23 Jul 2024 05:46:12 +0000 (14:46 +0900)
Since there was no UTC relative with it, platform abstraction code become broken.

To make code clean, let we implement something internal UTC about shader cache.

Change-Id: I83f10b5a7231af9f6a68c33336c92bc1f7ea1a68
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali-internal/utc-Dali-Internal-Shader.cpp
automated-tests/src/dali/dali-test-suite-utils/test-platform-abstraction.cpp
automated-tests/src/dali/dali-test-suite-utils/test-platform-abstraction.h

index ec9cfa9..e89c289 100644 (file)
@@ -95,4 +95,110 @@ int UtcDaliShaderWithPrefixTestVersion(void)
   DALI_TEST_EQUALS(shaderData->GetFragmentShaderVersion(), 101, TEST_LOCATION);
 
   END_TEST;
-}
\ No newline at end of file
+}
+
+int UtcDaliInternalShaderSaveAndLoad(void)
+{
+  TestApplication application;
+
+  std::string vertexShader1   = "some vertex code\n";
+  std::string fragmentShader1 = "some fragment code\n";
+
+  std::string vertexShader2   = "some another vertex code\n";
+  std::string fragmentShader2 = "some another fragment code\n";
+
+  Dali::Vector<uint8_t> dummyBuffer(5);
+  for(size_t i = 0; i < 5; ++i)
+  {
+    dummyBuffer[i] = static_cast<uint8_t>(i + 21);
+  }
+
+  // Make save and load failed successful
+  auto& platformAbstraction = application.GetPlatform();
+  platformAbstraction.SetLoadFileResult(false, dummyBuffer);
+
+  // Test version number in the shader data
+  Dali::Internal::ThreadLocalStorage& tls           = Dali::Internal::ThreadLocalStorage::Get();
+  Dali::Internal::ShaderFactory&      shaderFactory = tls.GetShaderFactory();
+
+  tet_printf("Load shader1. It should be fail to load from platform abstraction\n");
+  size_t                  shaderHash1 = 0u;
+  Internal::ShaderDataPtr shaderData1 = shaderFactory.Load(vertexShader1, fragmentShader1, Shader::Hint::NONE, 0u, "", shaderHash1);
+  DALI_TEST_CHECK(shaderHash1 != 0u);
+  DALI_TEST_EQUALS(shaderData1.Get()->HasBinary(), false, TEST_LOCATION);
+
+  DALI_TEST_EQUALS(platformAbstraction.WasCalled(TestPlatformAbstraction::SaveShaderBinaryFileFunc), false, TEST_LOCATION);
+  DALI_TEST_EQUALS(platformAbstraction.WasCalled(TestPlatformAbstraction::LoadShaderBinaryFileFunc), true, TEST_LOCATION);
+
+  // Reset trace callstack
+  platformAbstraction.GetTrace().Reset();
+
+  // Copy the memory of dummy
+  shaderData1.Get()->AllocateBuffer(7);
+  for(size_t i = 0; i < 7; ++i)
+  {
+    shaderData1.Get()->GetBuffer()[i] = static_cast<uint8_t>(i + 1);
+  }
+
+  DALI_TEST_EQUALS(shaderData1.Get()->HasBinary(), true, TEST_LOCATION);
+
+  tet_printf("Save shaderData1 as binary, but failed.\n");
+  shaderFactory.SaveBinary(shaderData1);
+
+  tet_printf("Check shader saved\n");
+  DALI_TEST_EQUALS(platformAbstraction.WasCalled(TestPlatformAbstraction::SaveShaderBinaryFileFunc), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(platformAbstraction.WasCalled(TestPlatformAbstraction::LoadShaderBinaryFileFunc), false, TEST_LOCATION);
+
+  // Reset trace callstack
+  platformAbstraction.GetTrace().Reset();
+
+  tet_printf("Save shaderData1 as binary, and success now.\n");
+  platformAbstraction.SetSaveFileResult(true);
+  shaderFactory.SaveBinary(shaderData1);
+
+  tet_printf("Check shader saved\n");
+  DALI_TEST_EQUALS(platformAbstraction.WasCalled(TestPlatformAbstraction::SaveShaderBinaryFileFunc), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(platformAbstraction.WasCalled(TestPlatformAbstraction::LoadShaderBinaryFileFunc), false, TEST_LOCATION);
+
+  // Reset trace callstack
+  platformAbstraction.GetTrace().Reset();
+
+  tet_printf("Load shaderData2 with same code as shaderData1\n");
+  size_t                  shaderHash2 = 0u;
+  Internal::ShaderDataPtr shaderData2 = shaderFactory.Load(vertexShader1, fragmentShader1, Shader::Hint::NONE, 0u, "", shaderHash2);
+
+  tet_printf("Check shaderData2 cached\n");
+  DALI_TEST_EQUALS(shaderHash2, shaderHash1, TEST_LOCATION);
+  DALI_TEST_EQUALS(shaderData2.Get()->HasBinary(), true, TEST_LOCATION);
+
+  DALI_TEST_EQUALS(shaderData2->GetBufferSize(), shaderData1->GetBufferSize(), TEST_LOCATION);
+  for(size_t i = 0; i < shaderData1->GetBufferSize(); ++i)
+  {
+    DALI_TEST_EQUALS(shaderData2->GetBuffer()[i], shaderData1->GetBuffer()[i], TEST_LOCATION);
+  }
+
+  DALI_TEST_EQUALS(platformAbstraction.WasCalled(TestPlatformAbstraction::SaveShaderBinaryFileFunc), false, TEST_LOCATION);
+  DALI_TEST_EQUALS(platformAbstraction.WasCalled(TestPlatformAbstraction::LoadShaderBinaryFileFunc), false, TEST_LOCATION);
+
+  // Reset trace callstack
+  platformAbstraction.GetTrace().Reset();
+
+  tet_printf("Make shaderData3 load dummyBuffer from filesystem\n");
+  platformAbstraction.SetLoadFileResult(true, dummyBuffer);
+
+  tet_printf("Load shader3. It will get binary same as dummyBuffer\n");
+  size_t                  shaderHash3 = 0u;
+  Internal::ShaderDataPtr shaderData3 = shaderFactory.Load(vertexShader2, fragmentShader2, Shader::Hint::NONE, 0u, "", shaderHash3);
+  DALI_TEST_CHECK(shaderHash3 != 0u);
+  DALI_TEST_EQUALS(shaderData3.Get()->HasBinary(), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(shaderData3->GetBufferSize(), dummyBuffer.Count(), TEST_LOCATION);
+  for(size_t i = 0; i < dummyBuffer.Count(); ++i)
+  {
+    DALI_TEST_EQUALS(shaderData3->GetBuffer()[i], dummyBuffer[i], TEST_LOCATION);
+  }
+
+  DALI_TEST_EQUALS(platformAbstraction.WasCalled(TestPlatformAbstraction::SaveShaderBinaryFileFunc), false, TEST_LOCATION);
+  DALI_TEST_EQUALS(platformAbstraction.WasCalled(TestPlatformAbstraction::LoadShaderBinaryFileFunc), true, TEST_LOCATION);
+
+  END_TEST;
+}
index 290f663..fa5ac89 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 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.
@@ -84,6 +84,13 @@ bool TestPlatformAbstraction::LoadShaderBinaryFile(const std::string& filename,
   return mLoadFileResult.loadResult;
 }
 
+bool TestPlatformAbstraction::SaveShaderBinaryFile(const std::string& filename, const unsigned char* buffer, unsigned int numBytes) const
+{
+  mTrace.PushCall("SaveShaderBinaryFile", "");
+
+  return mSaveFileResult;
+}
+
 /** Call this every test */
 void TestPlatformAbstraction::Initialize()
 {
index 3146e2d..707e2fe 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_TEST_PLATFORM_ABSTRACTION_H
 
 /*
- * Copyright (c) 2021 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.
@@ -85,10 +85,7 @@ public:
   /**
    * @copydoc PlatformAbstraction::SaveShaderBinaryFile()
    */
-  virtual bool SaveShaderBinaryFile(const std::string& filename, const unsigned char* buffer, unsigned int numBytes) const override
-  {
-    return true;
-  }
+  bool SaveShaderBinaryFile(const std::string& filename, const unsigned char* buffer, unsigned int numBytes) const override;
 
   /**
    * @copydoc PlatformAbstraction::StartTimer()