X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fgraphics%2Fgles%2Fgl-implementation.h;h=61c2c08638411a50365681e6d324f7d30fdcffa2;hb=506d53a42adc8d786a4d3991cc71d981958bcafe;hp=40d764d9a999f697502a07cf09eae6cb7bd91594;hpb=3a63fe1a2fd7d1e6e17e1900fd1be412f0f5909b;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/graphics/gles/gl-implementation.h b/dali/internal/graphics/gles/gl-implementation.h index 40d764d..61c2c08 100644 --- a/dali/internal/graphics/gles/gl-implementation.h +++ b/dali/internal/graphics/gles/gl-implementation.h @@ -2,7 +2,7 @@ #define DALI_INTERNAL_GL_IMPLEMENTATION_H /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -24,10 +24,13 @@ #include #include #include +#include #include +#include #include // INTERNAL INCLUDES +#include #include #include #include @@ -42,12 +45,16 @@ namespace { static constexpr int32_t INITIAL_GLES_VERSION = 30; static constexpr int32_t GLES_VERSION_SUPPORT_BLEND_EQUATION_ADVANCED = 32; -static constexpr const char* KHR_BLEND_EQUATION_ADVANCED = "GL_KHR_blend_equation_advanced"; +static constexpr const char* LEGACY_SHADING_LANGUAGE_VERSION = "100"; + +static constexpr const char* DEFAULT_SAMPLER_TYPE = "sampler2D"; static constexpr const char* FRAGMENT_SHADER_ADVANCED_BLEND_EQUATION_PREFIX = + "#ifdef GL_KHR_blend_equation_advanced\n" "#extension GL_KHR_blend_equation_advanced : enable\n" + "#endif\n" - "#if GL_KHR_blend_equation_advanced==1 || __VERSION__>=320\n" + "#if defined(GL_KHR_blend_equation_advanced) || __VERSION__>=320\n" " layout(blend_support_all_equations) out;\n" "#endif\n"; @@ -57,6 +64,7 @@ static constexpr const char* FRAGMENT_SHADER_OUTPUT_COLOR_STRING = static constexpr const char* OES_EGL_IMAGE_EXTERNAL_STRING = "#extension GL_OES_EGL_image_external:require\n"; static constexpr const char* OES_EGL_IMAGE_EXTERNAL_STRING_ESSL3 = "#extension GL_OES_EGL_image_external_essl3:require\n"; + } // namespace /** @@ -68,15 +76,15 @@ class GlImplementation : public Dali::Integration::GlAbstraction { public: GlImplementation() - : mContextCreatedWaitCondition(), + : mGlExtensionSupportedCacheList(), + mContextCreatedWaitCondition(), mMaxTextureSize(0), + mMaxTextureSamples(0), mVertexShaderPrefix(""), mGlesVersion(INITIAL_GLES_VERSION), mShadingLanguageVersion(100), mShadingLanguageVersionCached(false), mIsSurfacelessContextSupported(false), - mIsAdvancedBlendEquationSupportedCached(false), - mIsAdvancedBlendEquationSupported(false), mIsContextCreated(false) { mImpl.reset(new Gles3Implementation()); @@ -111,25 +119,18 @@ public: if(mGlesVersion >= GLES_VERSION_SUPPORT_BLEND_EQUATION_ADVANCED) { - mIsAdvancedBlendEquationSupported = true; + SetIsAdvancedBlendEquationSupported(true); } - else + + if(mGlExtensionSupportedCacheList.NeedFullCheck()) { - // when mIsAdvancedBlendEquationSupported is cached, we don't need to check all the extensions. - if(!mIsAdvancedBlendEquationSupportedCached) - { - const char* const extensionStr = reinterpret_cast(glGetString(GL_EXTENSIONS)); - std::istringstream stream(extensionStr); - std::string currentExtension; - while(std::getline(stream, currentExtension, ' ')) - { - if(currentExtension == KHR_BLEND_EQUATION_ADVANCED) - { - mIsAdvancedBlendEquationSupported = true; - break; - } - } - } + // fully check gl extensions if we miss some extension supported + mGlExtensionSupportedCacheList.EnsureGlExtensionSupportedCheck(); + } + + if(IsMultisampledRenderToTextureSupported()) + { + glGetIntegerv(GL_MAX_SAMPLES_EXT, &mMaxTextureSamples); } if(!mShadingLanguageVersionCached) @@ -187,18 +188,36 @@ public: void SetIsAdvancedBlendEquationSupported(const bool isSupported) { - mIsAdvancedBlendEquationSupported = isSupported; - mIsAdvancedBlendEquationSupportedCached = true; + mGlExtensionSupportedCacheList.MarkSupported(GlExtensionCache::GlExtensionCheckerType::BLEND_EQUATION_ADVANCED, isSupported); } bool IsAdvancedBlendEquationSupported() { ConditionalWait::ScopedLock lock(mContextCreatedWaitCondition); - if(!mIsContextCreated && !mIsAdvancedBlendEquationSupportedCached) + + const auto type = GlExtensionCache::GlExtensionCheckerType::BLEND_EQUATION_ADVANCED; + if(!mIsContextCreated && !mGlExtensionSupportedCacheList.IsCached(type)) { mContextCreatedWaitCondition.Wait(lock); } - return mIsAdvancedBlendEquationSupported; + return mGlExtensionSupportedCacheList.IsSupported(type); + } + + void SetIsMultisampledRenderToTextureSupported(const bool isSupported) + { + mGlExtensionSupportedCacheList.MarkSupported(GlExtensionCache::GlExtensionCheckerType::MULTISAMPLED_RENDER_TO_TEXTURE, isSupported); + } + + bool IsMultisampledRenderToTextureSupported() + { + ConditionalWait::ScopedLock lock(mContextCreatedWaitCondition); + + const auto type = GlExtensionCache::GlExtensionCheckerType::MULTISAMPLED_RENDER_TO_TEXTURE; + if(!mIsContextCreated && !mGlExtensionSupportedCacheList.IsCached(type)) + { + mContextCreatedWaitCondition.Wait(lock); + } + return mGlExtensionSupportedCacheList.IsSupported(type); } bool IsBlendEquationSupported(DevelBlendEquation::Type blendEquation) @@ -331,6 +350,16 @@ public: return mMaxTextureSize; } + int GetMaxTextureSamples() + { + ConditionalWait::ScopedLock lock(mContextCreatedWaitCondition); + if(!mIsContextCreated) + { + mContextCreatedWaitCondition.Wait(lock); + } + return mMaxTextureSamples; + } + int GetGlesVersion() { ConditionalWait::ScopedLock lock(mContextCreatedWaitCondition); @@ -357,21 +386,52 @@ public: return mShadingLanguageVersion; } - const char* GetEglImageExtensionString() + bool ApplyNativeFragmentShader(std::string& shader, const char* customSamplerType) { - ConditionalWait::ScopedLock lock(mContextCreatedWaitCondition); - if(!mIsContextCreated) + bool modified = false; + std::string versionString = "#version"; + size_t versionPosition = shader.find(versionString); + if(versionPosition != std::string::npos) { - mContextCreatedWaitCondition.Wait(lock); + std::string extensionString; + size_t shadingLanguageVersionPosition = shader.find_first_not_of(" \t", versionPosition + versionString.length()); + if(shadingLanguageVersionPosition != std::string::npos && + shader.substr(shadingLanguageVersionPosition, 3) == LEGACY_SHADING_LANGUAGE_VERSION) + { + extensionString = OES_EGL_IMAGE_EXTERNAL_STRING; + } + else + { + extensionString = OES_EGL_IMAGE_EXTERNAL_STRING_ESSL3; + } + + if(shader.find(extensionString) == std::string::npos) + { + modified = true; + size_t extensionPosition = shader.find_first_of("\n", versionPosition) + 1; + shader.insert(extensionPosition, extensionString); + } } - if(mShadingLanguageVersion < 300) + else { - return OES_EGL_IMAGE_EXTERNAL_STRING; + if(shader.find(OES_EGL_IMAGE_EXTERNAL_STRING) == std::string::npos) + { + modified = true; + shader = OES_EGL_IMAGE_EXTERNAL_STRING + shader; + } } - else + + if(shader.find(customSamplerType) == std::string::npos) { - return OES_EGL_IMAGE_EXTERNAL_STRING_ESSL3; + size_t pos = shader.find(DEFAULT_SAMPLER_TYPE); + if(pos != std::string::npos) + { + modified = true; + shader.replace(pos, strlen(DEFAULT_SAMPLER_TYPE), customSamplerType); + } } + + return modified; } /* OpenGL ES 2.0 */ @@ -1213,6 +1273,11 @@ public: mImpl->RenderbufferStorageMultisample(target, samples, internalformat, width, height); } + void FramebufferTexture2DMultisample(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) override + { + mImpl->FramebufferTexture2DMultisample(target, attachment, textarget, texture, level, samples); + } + void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) override { mImpl->FramebufferTextureLayer(target, attachment, texture, level, layer); @@ -1610,7 +1675,7 @@ public: void BlendBarrier(void) { - if(mIsAdvancedBlendEquationSupported) + if(mGlExtensionSupportedCacheList.IsSupported(GlExtensionCache::GlExtensionCheckerType::BLEND_EQUATION_ADVANCED)) { mImpl->BlendBarrier(); } @@ -1619,8 +1684,11 @@ public: private: std::unique_ptr mImpl; + GlExtensionCache::GlExtensionSupportedCacheList mGlExtensionSupportedCacheList; + ConditionalWait mContextCreatedWaitCondition; GLint mMaxTextureSize; + GLint mMaxTextureSamples; std::string mShaderVersionPrefix; std::string mVertexShaderPrefix; std::string mFragmentShaderPrefix; @@ -1628,8 +1696,6 @@ private: int32_t mShadingLanguageVersion; bool mShadingLanguageVersionCached; bool mIsSurfacelessContextSupported; - bool mIsAdvancedBlendEquationSupportedCached; - bool mIsAdvancedBlendEquationSupported; bool mIsContextCreated; };