1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef RENDER_DATA_STORE_RENDER_DATA_STORE_MANAGER_H 17 #define RENDER_DATA_STORE_RENDER_DATA_STORE_MANAGER_H 18 19 #include <mutex> 20 21 #include <base/containers/flat_map.h> 22 #include <base/containers/unique_ptr.h> 23 #include <base/containers/unordered_map.h> 24 #include <render/datastore/intf_render_data_store_manager.h> 25 #include <render/intf_plugin.h> 26 #include <render/namespace.h> 27 28 RENDER_BEGIN_NAMESPACE() 29 class IRenderContext; 30 31 /** 32 RenderDataManager class. 33 Implementation for render data manager class. 34 */ 35 class RenderDataStoreManager final : public IRenderDataStoreManager { 36 public: 37 explicit RenderDataStoreManager(IRenderContext& renderContext); 38 ~RenderDataStoreManager() override = default; 39 40 RenderDataStoreManager(const RenderDataStoreManager&) = delete; 41 RenderDataStoreManager& operator=(const RenderDataStoreManager&) = delete; 42 43 void CommitFrameData(); 44 void PreRender(); 45 void PostRender(); 46 void PreRenderBackend(); 47 void PostRenderBackend(); 48 49 // uses locking mechanism 50 BASE_NS::refcnt_ptr<IRenderDataStore> GetRenderDataStore(BASE_NS::string_view name) const override; 51 // Does not use lock. Call only from render nodes. 52 // This is only safe during PreRender() PostRender() scope. 53 IRenderDataStore* GetRenderTimeRenderDataStore(BASE_NS::string_view name) const; 54 55 BASE_NS::refcnt_ptr<IRenderDataStore> Create( 56 const BASE_NS::Uid& dataStoreTypeUid, const char* dataStoreName) override; 57 58 RenderDataStoreFlags GetRenderDataStoreFlags() const override; 59 60 // Not synchronized and not in API 61 void AddRenderDataStoreFactory(const RenderDataStoreTypeInfo& typeInfo); 62 // Not synchronized and not in API 63 void RemoveRenderDataStoreFactory(const RenderDataStoreTypeInfo& typeInfo); 64 65 private: 66 IRenderContext& renderContext_; 67 68 struct PendingRenderAccessStore { 69 uint64_t hash { 0u }; 70 BASE_NS::refcnt_ptr<IRenderDataStore> renderDataStore { nullptr }; 71 }; 72 73 mutable std::mutex mutex_; 74 75 // the following needs be locked with mutex 76 BASE_NS::unordered_map<uint64_t, BASE_NS::refcnt_ptr<IRenderDataStore>> stores_; 77 BASE_NS::unordered_map<IRenderDataStore*, uint64_t> pointerToStoreHash_; 78 BASE_NS::vector<PendingRenderAccessStore> pendingRenderAccess_; 79 80 // lock not needed for access 81 BASE_NS::flat_map<uint64_t, BASE_NS::refcnt_ptr<IRenderDataStore>> renderAccessStores_; 82 BASE_NS::unordered_map<uint64_t, RenderDataStoreTypeInfo> factories_; 83 84 RenderDataStoreFlags renderDataStoreFlags_ { 0u }; 85 }; 86 87 class RenderNodeRenderDataStoreManager final : public IRenderNodeRenderDataStoreManager { 88 public: 89 explicit RenderNodeRenderDataStoreManager(const RenderDataStoreManager& renderDataStoreMgr); 90 ~RenderNodeRenderDataStoreManager() override = default; 91 92 RenderNodeRenderDataStoreManager(const RenderNodeRenderDataStoreManager&) = delete; 93 RenderNodeRenderDataStoreManager& operator=(const RenderNodeRenderDataStoreManager&) = delete; 94 95 // calls the unsafe method from render data store 96 IRenderDataStore* GetRenderDataStore(BASE_NS::string_view name) const override; 97 98 private: 99 const RenderDataStoreManager& renderDataStoreMgr_; 100 }; 101 RENDER_END_NAMESPACE() 102 103 #endif // RENDER_DATA_STORE_RENDER_DATA_STORE_MANAGER_H 104