1 /* 2 * Copyright (c) 2024 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() override = default; 38 39 RenderDataStoreManager(const RenderDataStoreManager&) = delete; 40 RenderDataStoreManager& operator=(const RenderDataStoreManager&) = delete; 41 42 void CommitFrameData(); 43 void PreRender(); 44 void PostRender(); 45 void PreRenderBackend(); 46 void PostRenderBackend(); 47 48 // uses locking mechanism 49 BASE_NS::refcnt_ptr<IRenderDataStore> GetRenderDataStore(BASE_NS::string_view name) const override; 50 // Does not use lock. Call only from render nodes. 51 // This is only safe during PreRender() PostRender() scope. 52 IRenderDataStore* GetRenderTimeRenderDataStore(BASE_NS::string_view name) const; 53 54 BASE_NS::refcnt_ptr<IRenderDataStore> Create( 55 const BASE_NS::Uid& dataStoreTypeUid, const char* dataStoreName) override; 56 57 RenderDataStoreFlags GetRenderDataStoreFlags() const override; 58 59 // Not synchronized and not in API 60 void AddRenderDataStoreFactory(const RenderDataStoreTypeInfo& typeInfo); 61 // Not synchronized and not in API 62 void RemoveRenderDataStoreFactory(const RenderDataStoreTypeInfo& typeInfo); 63 64 private: 65 IRenderContext& renderContext_; 66 67 void DeferredDestruction(); 68 69 struct DeferredDataStoreDestroy { 70 uint64_t dataStoreHash { 0 }; 71 IRenderDataStore* instance { nullptr }; 72 }; 73 struct PendingRenderAccessStore { 74 uint64_t hash { 0u }; 75 BASE_NS::refcnt_ptr<IRenderDataStore> renderDataStore { nullptr }; 76 bool destroy { false }; 77 }; 78 79 mutable std::mutex mutex_; 80 81 // the following needs be locked with mutex 82 BASE_NS::unordered_map<uint64_t, BASE_NS::refcnt_ptr<IRenderDataStore>> stores_; 83 BASE_NS::unordered_map<IRenderDataStore*, uint64_t> pointerToStoreHash_; 84 BASE_NS::vector<DeferredDataStoreDestroy> deferredDestructionDataStores_; 85 BASE_NS::vector<PendingRenderAccessStore> pendingRenderAccess_; 86 87 // lock not needed for access 88 BASE_NS::unordered_map<uint64_t, BASE_NS::refcnt_ptr<IRenderDataStore>> renderAccessStores_; 89 BASE_NS::unordered_map<uint64_t, RenderDataStoreTypeInfo> factories_; 90 91 RenderDataStoreFlags renderDataStoreFlags_ { 0u }; 92 }; 93 94 class RenderNodeRenderDataStoreManager final : public IRenderNodeRenderDataStoreManager { 95 public: 96 explicit RenderNodeRenderDataStoreManager(const RenderDataStoreManager& renderDataStoreMgr); 97 ~RenderNodeRenderDataStoreManager() override = default; 98 99 RenderNodeRenderDataStoreManager(const RenderNodeRenderDataStoreManager&) = delete; 100 RenderNodeRenderDataStoreManager& operator=(const RenderNodeRenderDataStoreManager&) = delete; 101 102 // calls the unsafe method from render data store 103 IRenderDataStore* GetRenderDataStore(BASE_NS::string_view name) const override; 104 105 private: 106 const RenderDataStoreManager& renderDataStoreMgr_; 107 }; 108 RENDER_END_NAMESPACE() 109 110 #endif // RENDER_DATA_STORE_RENDER_DATA_STORE_MANAGER_H 111