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", "");
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;
}
#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
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;
// EXTERNAL INCLUDES
#include <cstddef>
#include <cstdint> // uint32_t
+#include <string>
// INTERNAL INCLUDES
#include <dali/public-api/object/any.h>
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