From: EverLEEst(SangHyeon Lee) Date: Wed, 22 Nov 2023 06:29:09 +0000 (+0900) Subject: [Tizen] Change precompile shader list for performance X-Git-Tag: accepted/tizen/8.0/unified/20231123.173042~6 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=d1ef77038f504e37ffd5d21dd06a867101aea3c3 [Tizen] Change precompile shader list for performance This reverts commit 0439cc4208c4f9c96fc19de6f2bca9d1636d3bd7. --- diff --git a/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp b/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp index 9af065d..2bda754 100644 --- a/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp +++ b/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp @@ -39,43 +39,23 @@ 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}; + "", // VisualFactoryCache::IMAGE_SHADER, + "#define IS_REQUIRED_ROUNDED_CORNER\n", //VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER, + "", //VisualFactoryCache::IMAGE_SHADER_YUV_TO_RGB, + "#define IS_REQUIRED_ROUNDED_CORNER\n", //VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_YUV_TO_RGB, + "", //VisualFactoryCache::IMAGE_SHADER_YUV_AND_RGB, + "#define IS_REQUIRED_ROUNDED_CORNER\n", //VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_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}; + "", // VisualFactoryCache::IMAGE_SHADER, + "#define IS_REQUIRED_ROUNDED_CORNER\n", //VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER, + "#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_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, }; ImageVisualShaderFactory::ImageVisualShaderFactory() @@ -184,7 +164,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..c893a89 100644 --- a/dali-toolkit/internal/visuals/text-visual-shader-factory.cpp +++ b/dali-toolkit/internal/visuals/text-visual-shader-factory.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 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. @@ -56,6 +56,14 @@ 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 +162,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..dcb60d3 100644 --- a/dali-toolkit/internal/visuals/text-visual-shader-factory.h +++ b/dali-toolkit/internal/visuals/text-visual-shader-factory.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_TEXT_VISUAL_SHADER_FACTORY_H /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 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. @@ -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 07e1ec9..77c7b8c 100644 --- a/dali-toolkit/internal/visuals/visual-factory-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-factory-impl.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -75,6 +76,16 @@ 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) @@ -401,10 +412,26 @@ 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() @@ -432,6 +459,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 04dce97..e628178 100644 --- a/dali-toolkit/internal/visuals/visual-factory-impl.h +++ b/dali-toolkit/internal/visuals/visual-factory-impl.h @@ -115,6 +115,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();