Add ApplyCustomFragmentPrefix 08/260408/5
authorseungho <sbsh.baek@samsung.com>
Thu, 24 Jun 2021 07:11:20 +0000 (16:11 +0900)
committerseungho <sbsh.baek@samsung.com>
Mon, 28 Jun 2021 09:57:14 +0000 (18:57 +0900)
 - Apply suitable prefix for the native image fragment shader

Change-Id: I86b34a3086e1326b0568cc1ac1a3a37e6c8c37b0
Signed-off-by: seungho <sbsh.baek@samsung.com>
automated-tests/src/dali/dali-test-suite-utils/test-native-image.h
automated-tests/src/dali/utc-Dali-Texture.cpp
dali/internal/event/rendering/texture-impl.cpp
dali/public-api/images/native-image-interface.h

index d134942..fb9451c 100644 (file)
@@ -83,6 +83,23 @@ public:
     mCallStack.PushCall("GetCustomFragmentPrefix", "");
     return "#extension GL_OES_EGL_image_external:require\n";
   };
+  inline virtual bool ApplyNativeFragmentShader(std::string& shader)
+  {
+    mCallStack.PushCall("ApplyNativeFragmentShader", "");
+    shader = "#extension GL_OES_EGL_image_external:require\n" + shader;
+
+    //Get custom sampler type name
+    const char* customSamplerTypename = GetCustomSamplerTypename();
+    if(customSamplerTypename)
+    {
+      size_t samplerPosition = shader.find("sampler2D");
+      if(samplerPosition != std::string::npos)
+      {
+        shader.replace(samplerPosition, strlen("sampler2D"), customSamplerTypename);
+      }
+    }
+    return true;
+  };
   inline const char* GetCustomSamplerTypename() const override
   {
     mCallStack.PushCall("GetCustomSamplerTypename", "");
index 810cc39..60b568d 100644 (file)
@@ -1048,8 +1048,11 @@ int UtcDaliTextureApplyFragShaderP1(void)
   std::string fragShader = baseFragShader;
   bool        applied    = DevelTexture::ApplyNativeFragmentShader(nativeTexture, fragShader);
 
+  std::string fragPrefix = testNativeImage->GetCustomFragmentPrefix();
+
   DALI_TEST_CHECK(applied);
   DALI_TEST_CHECK(baseFragShader.compare(fragShader));
+  DALI_TEST_CHECK(fragShader.compare(fragPrefix + baseFragShader) == 0);
   DALI_TEST_CHECK(!fragShader.empty());
   END_TEST;
 }
index 08ae532..3ddf52b 100644 (file)
 #include <dali/internal/event/common/stage-impl.h>
 #include <dali/internal/update/manager/update-manager.h>
 
-// EXTERNAL INCLUDES
-#include <cstring>
-
-namespace
-{
-const char* DEFAULT_SAMPLER_TYPENAME = "sampler2D";
-} // namespace
-
 namespace Dali
 {
 namespace Internal
@@ -210,44 +202,10 @@ bool Texture::IsNative() const
 
 bool Texture::ApplyNativeFragmentShader(std::string& shader)
 {
-  std::string fragmentShader;
-  bool        modified = false;
+  bool modified = false;
   if(mNativeImage != nullptr && !shader.empty())
   {
-    const char* fragmentPrefix        = mNativeImage->GetCustomFragmentPrefix();
-    const char* customSamplerTypename = mNativeImage->GetCustomSamplerTypename();
-
-    size_t prefixIndex = shader.find(Dali::Shader::GetShaderVersionPrefix());
-    if(fragmentPrefix != nullptr)
-    {
-      modified = true;
-      if(prefixIndex == std::string::npos)
-      {
-        fragmentShader = fragmentPrefix;
-        fragmentShader += "\n";
-      }
-      else
-      {
-        fragmentShader.clear();
-        shader.insert(prefixIndex + Dali::Shader::GetShaderVersionPrefix().length(), std::string(fragmentPrefix) + "\n");
-      }
-    }
-    fragmentShader += shader;
-
-    if(customSamplerTypename != nullptr)
-    {
-      modified   = true;
-      size_t pos = fragmentShader.find(DEFAULT_SAMPLER_TYPENAME);
-      if(pos < fragmentShader.length())
-      {
-        fragmentShader.replace(pos, strlen(DEFAULT_SAMPLER_TYPENAME), customSamplerTypename);
-      }
-    }
-  }
-
-  if(modified)
-  {
-    shader = fragmentShader;
+    modified = mNativeImage->ApplyNativeFragmentShader(shader);
   }
 
   return modified;
index 717e365..d69643e 100644 (file)
@@ -21,6 +21,7 @@
 // EXTERNAL INCLUDES
 #include <cstddef>
 #include <cstdint> // uint32_t
+#include <string>
 
 // INTERNAL INCLUDES
 #include <dali/public-api/object/any.h>
@@ -121,6 +122,14 @@ public:
   virtual const char* GetCustomFragmentPrefix() const = 0;
 
   /**
+   * @brief Apply custom fragment prefix for rendering native image.
+   *
+   * @param[in,out] shader shader code that will be applied fragment prefix.
+   * @return True if the shader is changed.
+   */
+  virtual bool ApplyNativeFragmentShader(std::string& shader) = 0;
+
+  /**
    * @brief Get custom sampler type name for rendering native image.
    *
    * @SINCE_1_9.23