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