From 5802734760978b0eb6f4a08ecf4755e42b350959 Mon Sep 17 00:00:00 2001 From: sunghyun kim Date: Wed, 11 Oct 2023 14:52:53 +0900 Subject: [PATCH 1/1] [Tizen] Change precompile shader list for performance for performance, change precompile shader list to a frequently used Change-Id: I4e1262f2265799af9ea076bda222c1348873dd21 --- .../visuals/image-visual-shader-factory.cpp | 24 +-------- .../visuals/text-visual-shader-factory.cpp | 29 +++++++++++ .../internal/visuals/text-visual-shader-factory.h | 6 +++ .../internal/visuals/visual-factory-impl.cpp | 57 ++++++++++++++++++++-- .../internal/visuals/visual-factory-impl.h | 6 +++ 5 files changed, 97 insertions(+), 25 deletions(-) diff --git a/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp b/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp index ac7d7de..6794a84 100644 --- a/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp +++ b/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp @@ -39,45 +39,25 @@ const int NATIVE_SHADER_TYPE_OFFSET = VisualFactoryCache::ShaderType::NATIVE_IMA } // unnamed namespace -static constexpr auto SHADER_TYPE_COUNT = 16u; +static constexpr auto SHADER_TYPE_COUNT = 6u; const std::string_view VertexPredefines[SHADER_TYPE_COUNT] { "", // VisualFactoryCache::IMAGE_SHADER, "#define IS_REQUIRED_ROUNDED_CORNER\n", //VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER, - "#define IS_REQUIRED_BORDERLINE\n", //VisualFactoryCache::IMAGE_SHADER_BORDERLINE, - "#define IS_REQUIRED_ROUNDED_CORNER\n#define IS_REQUIRED_BORDERLINE\n", //VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE, - "#define IS_REQUIRED_ALPHA_MASKING\n", // VisualFactoryCache::IMAGE_SHADER_MASKING, - "#define IS_REQUIRED_ROUNDED_CORNER\n#define IS_REQUIRED_ALPHA_MASKING\n",//VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_MASKING, - "#define IS_REQUIRED_BORDERLINE\n#define IS_REQUIRED_ALPHA_MASKING\n",//VisualFactoryCache::IMAGE_SHADER_BORDERLINE_MASKING, - "#define IS_REQUIRED_ROUNDED_CORNER\n#define IS_REQUIRED_BORDERLINE\n#define IS_REQUIRED_ALPHA_MASKING\n",//VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_MASKING, "",//VisualFactoryCache::IMAGE_SHADER_YUV_TO_RGB, "#define IS_REQUIRED_ROUNDED_CORNER\n",//VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_YUV_TO_RGB, - "#define IS_REQUIRED_BORDERLINE\n",//VisualFactoryCache::IMAGE_SHADER_BORDERLINE_YUV_TO_RGB, - "#define IS_REQUIRED_ROUNDED_CORNER\n#define IS_REQUIRED_BORDERLINE\n",//VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_TO_RGB}; "",//VisualFactoryCache::IMAGE_SHADER_YUV_AND_RGB, "#define IS_REQUIRED_ROUNDED_CORNER\n",//VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_YUV_AND_RGB, - "#define IS_REQUIRED_BORDERLINE\n",//VisualFactoryCache::IMAGE_SHADER_BORDERLINE_YUV_AND_RGB, - "#define IS_REQUIRED_ROUNDED_CORNER\n#define IS_REQUIRED_BORDERLINE\n"//VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_AND_RGB}; }; const std::string_view FragmentPredefines[SHADER_TYPE_COUNT] { "", // VisualFactoryCache::IMAGE_SHADER, "#define IS_REQUIRED_ROUNDED_CORNER\n", //VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER, - "#define IS_REQUIRED_BORDERLINE\n", //VisualFactoryCache::IMAGE_SHADER_BORDERLINE, - "#define IS_REQUIRED_ROUNDED_CORNER\n#define IS_REQUIRED_BORDERLINE\n", //VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE, - "#define IS_REQUIRED_ALPHA_MASKING\n", // VisualFactoryCache::IMAGE_SHADER_MASKING, - "#define IS_REQUIRED_ROUNDED_CORNER\n#define IS_REQUIRED_ALPHA_MASKING\n",//VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_MASKING, - "#define IS_REQUIRED_BORDERLINE\n#define IS_REQUIRED_ALPHA_MASKING\n",//VisualFactoryCache::IMAGE_SHADER_BORDERLINE_MASKING, - "#define IS_REQUIRED_ROUNDED_CORNER\n#define IS_REQUIRED_BORDERLINE\n#define IS_REQUIRED_ALPHA_MASKING\n",//VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_MASKING, "#define IS_REQUIRED_YUV_TO_RGB\n",//VisualFactoryCache::IMAGE_SHADER_YUV_TO_RGB, "#define IS_REQUIRED_YUV_TO_RGB\n#define IS_REQUIRED_ROUNDED_CORNER\n",//VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_YUV_TO_RGB, - "#define IS_REQUIRED_YUV_TO_RGB\n#define IS_REQUIRED_BORDERLINE\n",//VisualFactoryCache::IMAGE_SHADER_BORDERLINE_YUV_TO_RGB, - "#define IS_REQUIRED_YUV_TO_RGB\n#define IS_REQUIRED_ROUNDED_CORNER\n#define IS_REQUIRED_BORDERLINE\n",//VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_TO_RGB}; "#define IS_REQUIRED_UNIFIED_YUV_AND_RGB\n",//VisualFactoryCache::IMAGE_SHADER_YUV_AND_RGB, "#define IS_REQUIRED_UNIFIED_YUV_AND_RGB\n#define IS_REQUIRED_ROUNDED_CORNER\n",//VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_YUV_AND_RGB, - "#define IS_REQUIRED_UNIFIED_YUV_AND_RGB\n#define IS_REQUIRED_BORDERLINE\n",//VisualFactoryCache::IMAGE_SHADER_BORDERLINE_YUV_AND_RGB, - "#define IS_REQUIRED_UNIFIED_YUV_AND_RGB\n#define IS_REQUIRED_ROUNDED_CORNER\n#define IS_REQUIRED_BORDERLINE\n"//VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_AND_RGB}; }; ImageVisualShaderFactory::ImageVisualShaderFactory() @@ -186,7 +166,7 @@ void ImageVisualShaderFactory::GetPrecompiledShader(RawShaderData& shaders) shaders.fragmentPrefix = fragmentPrefix; shaders.vertexShader = SHADER_IMAGE_VISUAL_SHADER_VERT; shaders.fragmentShader = SHADER_IMAGE_VISUAL_SHADER_FRAG; - shaders.shaderCount += shaderCount; + shaders.shaderCount = shaderCount; } } // namespace Internal diff --git a/dali-toolkit/internal/visuals/text-visual-shader-factory.cpp b/dali-toolkit/internal/visuals/text-visual-shader-factory.cpp index 5f9b04b..a55bfee 100644 --- a/dali-toolkit/internal/visuals/text-visual-shader-factory.cpp +++ b/dali-toolkit/internal/visuals/text-visual-shader-factory.cpp @@ -56,6 +56,16 @@ const VisualFactoryCache::ShaderType SHADER_TYPE_TABLE[] = VisualFactoryCache::TEXT_SHADER_MULTI_COLOR_TEXT_WITH_STYLE_AND_OVERLAY, }; +static constexpr auto SHADER_TYPE_COUNT = 1u; +const std::string_view VertexPredefines[SHADER_TYPE_COUNT] +{ + "", // VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT +}; +const std::string_view FragmentPredefines[SHADER_TYPE_COUNT] +{ + "", // VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT +}; + } // unnamed namespace namespace TextVisualShaderFeature @@ -154,6 +164,25 @@ Shader TextVisualShaderFactory::GetShader(VisualFactoryCache& factoryCache, cons return shader; } +void TextVisualShaderFactory::GetPrecompiledShader(RawShaderData& shaders) +{ + std::vector vertexPrefix; + std::vector fragmentPrefix; + int shaderCount = 0; + for(int i=0; i< SHADER_TYPE_COUNT; ++i) + { + vertexPrefix.push_back(VertexPredefines[i]); + fragmentPrefix.push_back(FragmentPredefines[i]); + shaderCount++; + } + + shaders.vertexPrefix= vertexPrefix; + shaders.fragmentPrefix = fragmentPrefix; + shaders.vertexShader = SHADER_TEXT_VISUAL_SHADER_VERT; + shaders.fragmentShader = SHADER_TEXT_VISUAL_SHADER_FRAG; + shaders.shaderCount = shaderCount; +} + } // namespace Internal } // namespace Toolkit diff --git a/dali-toolkit/internal/visuals/text-visual-shader-factory.h b/dali-toolkit/internal/visuals/text-visual-shader-factory.h index 4a9969b..beeb1c4 100644 --- a/dali-toolkit/internal/visuals/text-visual-shader-factory.h +++ b/dali-toolkit/internal/visuals/text-visual-shader-factory.h @@ -149,6 +149,12 @@ public: */ Shader GetShader(VisualFactoryCache& factoryCache, const TextVisualShaderFeature::FeatureBuilder& featureBuilder); + /** + * @brief Get the default shader source. + * @param[in] shaders shaderList for precompile + */ + void GetPrecompiledShader(RawShaderData& shaders); + protected: /** * Undefined copy constructor. diff --git a/dali-toolkit/internal/visuals/visual-factory-impl.cpp b/dali-toolkit/internal/visuals/visual-factory-impl.cpp index bb73247..4656e59 100644 --- a/dali-toolkit/internal/visuals/visual-factory-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-factory-impl.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,7 @@ #include #include + namespace Dali { namespace Toolkit @@ -74,6 +76,18 @@ DALI_TYPE_REGISTRATION_BEGIN_CREATE(Toolkit::VisualFactory, Dali::BaseHandle, Cr DALI_TYPE_REGISTRATION_END() const char* const BROKEN_IMAGE_FILE_NAME = "broken.png"; ///< The file name of the broken image. +static constexpr auto SHADER_TYPE_COUNT = 2u; +const std::string_view VertexPredefines[SHADER_TYPE_COUNT] +{ + "", //VisualFactoryCache::COLOR_SHADER + "#define IS_REQUIRED_ROUNDED_CORNER\n", //VisualFactoryCache::COLOR_SHADER_ROUNDED_CORNER +}; +const std::string_view FragmentPredefines[SHADER_TYPE_COUNT] +{ + "", //VisualFactoryCache::COLOR_SHADER + "#define IS_REQUIRED_ROUNDED_CORNER\n", //VisualFactoryCache::COLOR_SHADER_ROUNDED_CORNER +}; + } // namespace VisualFactory::VisualFactory(bool debugEnabled) @@ -386,10 +400,27 @@ void VisualFactory::UsePreCompiledShader() } mPrecompiledShaderRequested = true; - RawShaderData rawShaderData; Integration::ShaderPrecompiler::Get().Enable(); - GetImageVisualShaderFactory().GetPrecompiledShader(rawShaderData); - Integration::ShaderPrecompiler::Get().SavePrecomipleShaderList(rawShaderData); + + // Get image shader + std::vector rawShaderList; + RawShaderData imageShaderData; + GetImageVisualShaderFactory().GetPrecompiledShader(imageShaderData); + rawShaderList.push_back(imageShaderData); + + // Get text shader + RawShaderData textShaderData; + GetTextVisualShaderFactory().GetPrecompiledShader(textShaderData); + rawShaderList.push_back(textShaderData); + + // Get color shader + RawShaderData colorShaderData; + GetPrecompiledShader(colorShaderData); + rawShaderList.push_back(colorShaderData); + + + // Save all shader + Integration::ShaderPrecompiler::Get().SavePrecomipleShaderList(rawShaderList); } Internal::TextureManager& VisualFactory::GetTextureManager() @@ -417,6 +448,26 @@ void VisualFactory::SetBrokenImageUrl(Toolkit::StyleManager& styleManager) mFactoryCache->SetBrokenImageUrl(brokenImageUrl, customBrokenImageUrlList); } +void VisualFactory::GetPrecompiledShader(RawShaderData& shaders) +{ + std::vector vertexPrefix; + std::vector fragmentPrefix; + int shaderCount = 0; + shaders.shaderCount = 0; + for(int i=0; i< SHADER_TYPE_COUNT; ++i) + { + vertexPrefix.push_back(VertexPredefines[i]); + fragmentPrefix.push_back(FragmentPredefines[i]); + shaderCount++; + } + + shaders.vertexPrefix = vertexPrefix; + shaders.fragmentPrefix = fragmentPrefix; + shaders.vertexShader = SHADER_COLOR_VISUAL_SHADER_VERT; + shaders.fragmentShader = SHADER_COLOR_VISUAL_SHADER_FRAG; + shaders.shaderCount = shaderCount; +} + Internal::VisualFactoryCache& VisualFactory::GetFactoryCache() { if(!mFactoryCache) diff --git a/dali-toolkit/internal/visuals/visual-factory-impl.h b/dali-toolkit/internal/visuals/visual-factory-impl.h index a3bc7cc..f516e45 100644 --- a/dali-toolkit/internal/visuals/visual-factory-impl.h +++ b/dali-toolkit/internal/visuals/visual-factory-impl.h @@ -109,6 +109,12 @@ private: void SetBrokenImageUrl(Toolkit::StyleManager& styleManager); /** + * @brief Get the default shader source. + * @param[in] shaders shaderList for precompile + */ + void GetPrecompiledShader(RawShaderData& shaders); + + /** * Get the factory cache, creating it if necessary. */ Internal::VisualFactoryCache& GetFactoryCache(); -- 2.7.4