From ae36a1ea75ac593961c2b9a06746d13b846d8762 Mon Sep 17 00:00:00 2001 From: "dongsug.song" Date: Mon, 14 Nov 2016 22:53:52 +0900 Subject: [PATCH] Revert "[3.0] remove Uniform name cache as its no longer used" This reverts commit 5a35dc806d3f0f846232014534295c577275dc4c. Change-Id: Ic5ee39d23e7beeace2d32cdfa1856382fd63fe44 --- dali/internal/file.list | 1 + dali/internal/render/common/render-manager.cpp | 6 +- .../render/data-providers/uniform-name-cache.cpp | 67 ++++++++++++++++++ .../render/data-providers/uniform-name-cache.h | 82 ++++++++++++++++++++++ dali/internal/render/renderers/render-renderer.cpp | 5 +- dali/internal/render/renderers/render-renderer.h | 9 ++- dali/internal/render/renderers/render-texture.h | 9 +++ 7 files changed, 173 insertions(+), 6 deletions(-) create mode 100644 dali/internal/render/data-providers/uniform-name-cache.cpp create mode 100644 dali/internal/render/data-providers/uniform-name-cache.h diff --git a/dali/internal/file.list b/dali/internal/file.list index f7bcf2b..92a2e1f 100644 --- a/dali/internal/file.list +++ b/dali/internal/file.list @@ -104,6 +104,7 @@ internal_src_files = \ $(internal_src_dir)/render/common/render-tracker.cpp \ $(internal_src_dir)/render/common/render-manager.cpp \ $(internal_src_dir)/render/data-providers/render-data-provider.cpp \ + $(internal_src_dir)/render/data-providers/uniform-name-cache.cpp \ $(internal_src_dir)/render/gl-resources/bitmap-texture.cpp \ $(internal_src_dir)/render/gl-resources/context.cpp \ $(internal_src_dir)/render/gl-resources/frame-buffer-state-cache.cpp \ diff --git a/dali/internal/render/common/render-manager.cpp b/dali/internal/render/common/render-manager.cpp index 96ab1ff..a4281eb 100644 --- a/dali/internal/render/common/render-manager.cpp +++ b/dali/internal/render/common/render-manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2015 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. @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -139,6 +140,7 @@ struct RenderManager::Impl Integration::GlSyncAbstraction& glSyncAbstraction; ///< GL sync abstraction RenderQueue renderQueue; ///< A message queue for receiving messages from the update-thread. TextureCache textureCache; ///< Cache for all GL textures + Render::UniformNameCache uniformNameCache; ///< Cache to provide unique indices for uniforms LockedResourceQueue& textureUploadedQueue; ///< A queue for requesting resource post processing in update thread // Render instructions describe what should be rendered during RenderManager::Render() @@ -262,7 +264,7 @@ void RenderManager::SetDefaultSurfaceRect(const Rect& rect) void RenderManager::AddRenderer( Render::Renderer* renderer ) { // Initialize the renderer as we are now in render thread - renderer->Initialize( mImpl->context, mImpl->textureCache ); + renderer->Initialize( mImpl->context, mImpl->textureCache, mImpl->uniformNameCache ); mImpl->rendererContainer.PushBack( renderer ); diff --git a/dali/internal/render/data-providers/uniform-name-cache.cpp b/dali/internal/render/data-providers/uniform-name-cache.cpp new file mode 100644 index 0000000..a98c171 --- /dev/null +++ b/dali/internal/render/data-providers/uniform-name-cache.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2015 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// CLASS HEADER +#include + +// INTERNAL INCLUDES +#include + +namespace Dali +{ +namespace Internal +{ +namespace Render +{ + +UniformNameCache::UniformNameCache() +{} + +UniformNameCache::~UniformNameCache() +{ // OwnerContainer cleans up +} + +int32_t UniformNameCache::GetSamplerUniformUniqueIndex( const std::string& uniformName ) +{ + OwnerContainer< UniformEntry* >::SizeType index = 0; + const OwnerContainer< UniformEntry* >::SizeType end = mSamplerUniformCache.Size(); + + const std::size_t hash = Dali::CalculateHash( uniformName ); + + for( ;index < end; ++index ) + { + // check hash first + if( hash == mSamplerUniformCache[ index ]->nameHash ) + { + // check full name in case of collision + if( mSamplerUniformCache[ index ]->uniformName == uniformName ) + { + // match, return the index + return index; + } + } + } + // no match found, add new entry to cache + mSamplerUniformCache.PushBack( new UniformEntry( uniformName, hash ) ); + + return end; +} + +} // namespace Render + +} // namespace Internal + +} // namespace Dali diff --git a/dali/internal/render/data-providers/uniform-name-cache.h b/dali/internal/render/data-providers/uniform-name-cache.h new file mode 100644 index 0000000..d251117 --- /dev/null +++ b/dali/internal/render/data-providers/uniform-name-cache.h @@ -0,0 +1,82 @@ +#ifndef DALI_INTERNAL_UNIFORM_NAME_CACHE_H +#define DALI_INTERNAL_UNIFORM_NAME_CACHE_H + +/* + * Copyright (c) 2015 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// EXTERNAL INCLUDES +#include + +// INTERNAL INCLUDES +#include + +namespace Dali +{ + +namespace Internal +{ + +namespace Render +{ + +/** + * This class maps uniform names to unique indices that can be used to cache the GL uniform + * index values in programs and only do the costly string lookup once + */ +class UniformNameCache +{ +public: + + /** + * Constructor + */ + UniformNameCache(); + + /** + * Destructor + */ + ~UniformNameCache(); + + /** + * This method can be used to query a cache for the unique index for a sampler uniform + * @param uniformName to get the index for + * @return a unique index for this sampler uniform + */ + int32_t GetSamplerUniformUniqueIndex( const std::string& uniformName ); + +private: // Data + + struct UniformEntry + { + UniformEntry( const std::string& name, std::size_t hash ) + : uniformName( name ), + nameHash( hash ) + { } + std::string uniformName; + std::size_t nameHash; + }; + + OwnerContainer< UniformEntry* > mSamplerUniformCache; + +}; + +} // namespace Render + +} // namespace Internal + +} // namespace Dali + +#endif // DALI_INTERNAL_UNIFORM_NAME_CACHE_H diff --git a/dali/internal/render/renderers/render-renderer.cpp b/dali/internal/render/renderers/render-renderer.cpp index 82e4a69..cbad8bb 100644 --- a/dali/internal/render/renderers/render-renderer.cpp +++ b/dali/internal/render/renderers/render-renderer.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -139,6 +140,7 @@ Renderer::Renderer( SceneGraph::RenderDataProvider* dataProvider, : mRenderDataProvider( dataProvider ), mContext( NULL), mTextureCache( NULL ), + mUniformNameCache( NULL ), mGeometry( geometry ), mUniformIndexMap(), mAttributesLocation(), @@ -165,10 +167,11 @@ Renderer::Renderer( SceneGraph::RenderDataProvider* dataProvider, } } -void Renderer::Initialize( Context& context, SceneGraph::TextureCache& textureCache ) +void Renderer::Initialize( Context& context, SceneGraph::TextureCache& textureCache, Render::UniformNameCache& uniformNameCache ) { mContext = &context; mTextureCache = &textureCache; + mUniformNameCache = &uniformNameCache; } Renderer::~Renderer() diff --git a/dali/internal/render/renderers/render-renderer.h b/dali/internal/render/renderers/render-renderer.h index 628b078..d7e6575 100644 --- a/dali/internal/render/renderers/render-renderer.h +++ b/dali/internal/render/renderers/render-renderer.h @@ -53,6 +53,7 @@ class NodeDataProvider; namespace Render { +class UniformNameCache; /** * Renderers are used to render meshes @@ -168,10 +169,11 @@ public: /** * Second-phase construction. * This is called when the renderer is inside render thread - * @param[in] context Context used by the renderer - * @param[in] textureCache The texture cache to use + * @param[in] context to use + * @param[in] textureCache to use + * @param[in] uniformNameCache to use */ - void Initialize( Context& context, SceneGraph::TextureCache& textureCache ); + void Initialize( Context& context, SceneGraph::TextureCache& textureCache, Render::UniformNameCache& uniformNameCache ); /** * Destructor @@ -439,6 +441,7 @@ private: Context* mContext; SceneGraph::TextureCache* mTextureCache; + Render::UniformNameCache* mUniformNameCache; Render::Geometry* mGeometry; struct UniformIndexMap diff --git a/dali/internal/render/renderers/render-texture.h b/dali/internal/render/renderers/render-texture.h index 8e3dc3d..35efb2e 100644 --- a/dali/internal/render/renderers/render-texture.h +++ b/dali/internal/render/renderers/render-texture.h @@ -45,6 +45,14 @@ class Texture public: /** + * Enumeration to tell that this sampler does not have a unique index yet + */ + enum + { + NOT_INITIALIZED = -1 + }; + + /** * Constructor */ Texture() @@ -78,6 +86,7 @@ public: public: // called from RenderThread /** + * @param[in] buffer A vector wit * Get the texture ID * @return the id of the associated texture */ -- 2.7.4