1 /* 2 * Copyright (C) 2023 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/unique_ptr.h> 22 #include <base/containers/unordered_map.h> 23 #include <render/datastore/intf_render_data_store_manager.h> 24 #include <render/intf_plugin.h> 25 #include <render/namespace.h> 26 27 RENDER_BEGIN_NAMESPACE() 28 class IRenderContext; 29 30 /** 31 RenderDataManager class. 32 Implementation for render data manager class. 33 */ 34 class RenderDataStoreManager final : public IRenderDataStoreManager { 35 public: 36 explicit RenderDataStoreManager(IRenderContext& renderContext); 37 ~RenderDataStoreManager() = default; 38 39 RenderDataStoreManager(const RenderDataStoreManager&) = delete; 40 RenderDataStoreManager& operator=(const RenderDataStoreManager&) = delete; 41 42 void PreRender(); 43 void PreRenderBackend(); 44 void PostRender(); 45 46 // uses locking mechanism 47 IRenderDataStore* GetRenderDataStore(const BASE_NS::string_view name) const override; 48 // Does not use lock. Call only from render nodes. 49 // This is only safe during PreRender() PostRender() scope. 50 IRenderDataStore* GetRenderTimeRenderDataStore(const BASE_NS::string_view name) const; 51 52 IRenderDataStore* Create(const BASE_NS::Uid& dataStoreTypeUid, char const* dataStoreName) override; 53 void Destroy(const BASE_NS::Uid& dataStoreTypeUid, IRenderDataStore* instance) override; 54 55 // Not synchronized and not in API 56 void AddRenderDataStoreFactory(const RenderDataStoreTypeInfo& typeInfo); 57 // Not synchronized and not in API 58 void RemoveRenderDataStoreFactory(const RenderDataStoreTypeInfo& typeInfo); 59 60 private: 61 IRenderContext& renderContext_; 62 63 void DeferredDestruction(); 64 65 using RenderDataStorePtr = BASE_NS::unique_ptr<IRenderDataStore, RenderDataStoreTypeInfo::DestroyRenderDataStoreFn>; 66 struct DeferredDataStoreDestroy { 67 uint64_t dataStoreHash { 0 }; 68 IRenderDataStore* instance { nullptr }; 69 }; 70 struct PendingRenderAccessStore { 71 uint64_t hash { 0u }; 72 IRenderDataStore* renderDataStore { nullptr }; 73 bool destroy { false }; 74 }; 75 76 mutable std::mutex mutex_; 77 78 // the following needs be locked with mutex 79 BASE_NS::unordered_map<uint64_t, RenderDataStorePtr> stores_; 80 BASE_NS::unordered_map<IRenderDataStore*, uint64_t> pointerToStoreHash_; 81 BASE_NS::vector<DeferredDataStoreDestroy> deferredDestructionDataStores_; 82 BASE_NS::vector<PendingRenderAccessStore> pendingRenderAccess_; 83 84 // lock not needed for access 85 BASE_NS::unordered_map<uint64_t, IRenderDataStore*> renderAccessStores_; 86 BASE_NS::unordered_map<uint64_t, RenderDataStoreTypeInfo> factories_; 87 }; 88 89 class RenderNodeRenderDataStoreManager final : public IRenderNodeRenderDataStoreManager { 90 public: 91 explicit RenderNodeRenderDataStoreManager(const RenderDataStoreManager& renderDataStoreMgr); 92 ~RenderNodeRenderDataStoreManager() = default; 93 94 RenderNodeRenderDataStoreManager(const RenderNodeRenderDataStoreManager&) = delete; 95 RenderNodeRenderDataStoreManager& operator=(const RenderNodeRenderDataStoreManager&) = delete; 96 97 // calls the unsafe method from render data store 98 IRenderDataStore* GetRenderDataStore(const BASE_NS::string_view name) const override; 99 100 private: 101 const RenderDataStoreManager& renderDataStoreMgr_; 102 }; 103 RENDER_END_NAMESPACE() 104 105 #endif // RENDER_DATA_STORE_RENDER_DATA_STORE_MANAGER_H 106