X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fimage-visual-shader-factory.cpp;h=7f2cac7b82b9e19e10a8c013f6ce5ad6b4da8445;hb=HEAD;hp=7bbe186f4ce566c4a6223a238c4483dee7afea1c;hpb=093b82a746bf46752a9c94b1346f876ee8c228f1;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp b/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp index 7bbe186..f0e413c 100644 --- a/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp +++ b/dali-toolkit/internal/visuals/image-visual-shader-factory.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 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. @@ -22,6 +22,7 @@ // INTERNAL INCLUDES #include +#include #include #include @@ -35,31 +36,37 @@ namespace { const Vector4 FULL_TEXTURE_RECT(0.f, 0.f, 1.f, 1.f); -const int NATIVE_SHADER_TYPE_OFFSET = VisualFactoryCache::ShaderType::NATIVE_IMAGE_SHADER - VisualFactoryCache::ShaderType::IMAGE_SHADER; -static constexpr std::string_view Y_FLIP_MASK_TEXTURE = "uYFlipMaskTexture"; -static constexpr float NOT_FLIP_MASK_TEXTURE = 0.0f; -} // unnamed namespace +constexpr int NATIVE_SHADER_TYPE_OFFSET = VisualFactoryCache::ShaderType::NATIVE_IMAGE_SHADER - VisualFactoryCache::ShaderType::IMAGE_SHADER; +constexpr std::string_view Y_FLIP_MASK_TEXTURE = "uYFlipMaskTexture"; +constexpr float NOT_FLIP_MASK_TEXTURE = 0.0f; -static constexpr auto SHADER_TYPE_COUNT = 6u; +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, - "",//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, +constexpr std::string_view VertexPredefines[SHADER_TYPE_COUNT]{ + "", // 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_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, +constexpr std::string_view FragmentPredefines[SHADER_TYPE_COUNT]{ + "", // 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_ROUNDED_CORNER\n#define IS_REQUIRED_YUV_TO_RGB\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_ROUNDED_CORNER\n#define IS_REQUIRED_UNIFIED_YUV_AND_RGB\n", // VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_YUV_AND_RGB, }; +constexpr VisualFactoryCache::ShaderType ShaderTypePredefines[SHADER_TYPE_COUNT]{ + VisualFactoryCache::ShaderType::IMAGE_SHADER, + VisualFactoryCache::ShaderType::IMAGE_SHADER_ROUNDED_CORNER, + VisualFactoryCache::ShaderType::IMAGE_SHADER_YUV_TO_RGB, + VisualFactoryCache::ShaderType::IMAGE_SHADER_ROUNDED_CORNER_YUV_TO_RGB, + VisualFactoryCache::ShaderType::IMAGE_SHADER_YUV_AND_RGB, + VisualFactoryCache::ShaderType::IMAGE_SHADER_ROUNDED_CORNER_YUV_AND_RGB, +}; +} // unnamed namespace ImageVisualShaderFactory::ImageVisualShaderFactory() : mFragmentShaderNeedChange(ImageVisualShaderFeature::ChangeFragmentShader::UNDECIDED) @@ -79,6 +86,9 @@ Shader ImageVisualShaderFactory::GetShader(VisualFactoryCache& factoryCache, Ima (mFragmentShaderNeedChange == ImageVisualShaderFeature::ChangeFragmentShader::UNDECIDED || mFragmentShaderNeedChange == ImageVisualShaderFeature::ChangeFragmentShader::NEED_CHANGE)) { + DALI_ASSERT_DEBUG((static_cast(shaderType) >= static_cast(VisualFactoryCache::IMAGE_SHADER)) && + (static_cast(shaderType) <= static_cast(VisualFactoryCache::IMAGE_SHADER_ATLAS_CUSTOM_WRAP)) && + "Do not support native image shader for given feature!!"); shaderType = static_cast(static_cast(shaderType) + NATIVE_SHADER_TYPE_OFFSET); } @@ -93,9 +103,20 @@ Shader ImageVisualShaderFactory::GetShader(VisualFactoryCache& factoryCache, Ima featureBuilder.GetVertexShaderPrefixList(vertexShaderPrefixList); featureBuilder.GetFragmentShaderPrefixList(fragmentShaderPrefixList); + if(Dali::Toolkit::Internal::ImageVisualShaderDebug::DebugImageVisualShaderEnabled()) + { + vertexShaderPrefixList += "#define IS_REQUIRED_DEBUG_VISUAL_SHADER\n"; + fragmentShaderPrefixList += "#define IS_REQUIRED_DEBUG_VISUAL_SHADER\n"; + } + std::string vertexShader = std::string(Dali::Shader::GetVertexShaderPrefix() + vertexShaderPrefixList + SHADER_IMAGE_VISUAL_SHADER_VERT.data()); std::string fragmentShader = std::string(Dali::Shader::GetFragmentShaderPrefix() + fragmentShaderPrefixList + SHADER_IMAGE_VISUAL_SHADER_FRAG.data()); + if(Dali::Toolkit::Internal::ImageVisualShaderDebug::DebugImageVisualShaderEnabled()) + { + Dali::Toolkit::Internal::ImageVisualShaderDebug::ApplyImageVisualShaderDebugScriptCode(vertexShader, fragmentShader); + } + if(featureBuilder.NeedToChangeFragmentShader() == ImageVisualShaderFeature::ChangeFragmentShader::NEED_CHANGE) { bool modified = DevelTexture::ApplyNativeFragmentShader(featureBuilder.GetTexture(), fragmentShader); @@ -120,13 +141,12 @@ Shader ImageVisualShaderFactory::GetShader(VisualFactoryCache& factoryCache, Ima return shader; } - shader = Shader::New(vertexShader, fragmentShader); + shader = factoryCache.GenerateAndSaveShader(shaderType, vertexShader, fragmentShader); shader.RegisterProperty(PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT); if(featureBuilder.IsEnabledAlphaMaskingOnRendering()) { shader.RegisterProperty(Y_FLIP_MASK_TEXTURE, NOT_FLIP_MASK_TEXTURE); } - factoryCache.SaveShader(shaderType, shader); return shader; } @@ -158,20 +178,23 @@ void ImageVisualShaderFactory::GetPreCompiledShader(RawShaderData& shaders) { std::vector vertexPrefix; std::vector fragmentPrefix; + std::vector shaderName; shaders.shaderCount = 0; - int shaderCount = 0; - for(uint32_t i=0; i< SHADER_TYPE_COUNT; ++i) + int shaderCount = 0; + for(uint32_t i = 0; i < SHADER_TYPE_COUNT; ++i) { vertexPrefix.push_back(VertexPredefines[i]); fragmentPrefix.push_back(FragmentPredefines[i]); + shaderName.push_back(Scripting::GetLinearEnumerationName(ShaderTypePredefines[i], VISUAL_SHADER_TYPE_TABLE, VISUAL_SHADER_TYPE_TABLE_COUNT)); shaderCount++; } - shaders.vertexPrefix= vertexPrefix; + shaders.vertexPrefix = vertexPrefix; shaders.fragmentPrefix = fragmentPrefix; - shaders.vertexShader = SHADER_IMAGE_VISUAL_SHADER_VERT; + shaders.shaderName = shaderName; + shaders.vertexShader = SHADER_IMAGE_VISUAL_SHADER_VERT; shaders.fragmentShader = SHADER_IMAGE_VISUAL_SHADER_FRAG; - shaders.shaderCount = shaderCount; + shaders.shaderCount = shaderCount; } } // namespace Internal