CompositeProcessD3D11FencesHolderMap.h (2408B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef MOZILLA_GFX_CompositeProcessD3D11FencesHolderMap_H 8 #define MOZILLA_GFX_CompositeProcessD3D11FencesHolderMap_H 9 10 #include <d3d11.h> 11 #include <vector> 12 13 #include "mozilla/gfx/FileHandleWrapper.h" 14 #include "mozilla/layers/LayersTypes.h" 15 #include "mozilla/Monitor.h" 16 #include "mozilla/StaticPtr.h" 17 18 namespace mozilla { 19 namespace layers { 20 21 class FenceD3D11; 22 23 /** 24 * A class to manage FenceD3D11 that is shared in GPU process. 25 */ 26 class CompositeProcessD3D11FencesHolderMap { 27 public: 28 static void Init(); 29 static void Shutdown(); 30 static CompositeProcessD3D11FencesHolderMap* Get() { return sInstance; } 31 32 CompositeProcessD3D11FencesHolderMap(); 33 ~CompositeProcessD3D11FencesHolderMap(); 34 35 void Register(CompositeProcessFencesHolderId aHolderId); 36 void RegisterReference(CompositeProcessFencesHolderId aHolderId); 37 void Unregister(CompositeProcessFencesHolderId aHolderId); 38 39 void SetWriteFence(CompositeProcessFencesHolderId aHolderId, 40 RefPtr<FenceD3D11> aWriteFence); 41 void SetReadFence(CompositeProcessFencesHolderId aHolderId, 42 RefPtr<FenceD3D11> aReadFence); 43 44 bool WaitWriteFence(CompositeProcessFencesHolderId aHolderId, 45 ID3D11Device* aDevice); 46 std::pair<const RefPtr<gfx::FileHandleWrapper>, uint64_t> 47 GetWriteFenceHandleAndValue(CompositeProcessFencesHolderId aHolderId) const; 48 bool WaitAllFencesAndForget(CompositeProcessFencesHolderId aHolderId, 49 ID3D11Device* aDevice); 50 51 private: 52 struct FencesHolder { 53 FencesHolder() = default; 54 55 RefPtr<FenceD3D11> mWriteFence; 56 std::vector<RefPtr<FenceD3D11>> mReadFences; 57 uint32_t mOwners = 1; 58 }; 59 60 mutable Monitor mMonitor; 61 62 std::unordered_map<CompositeProcessFencesHolderId, UniquePtr<FencesHolder>, 63 CompositeProcessFencesHolderId::HashFn> 64 mFencesHolderById MOZ_GUARDED_BY(mMonitor); 65 66 static StaticAutoPtr<CompositeProcessD3D11FencesHolderMap> sInstance; 67 }; 68 69 } // namespace layers 70 } // namespace mozilla 71 72 #endif /* MOZILLA_GFX_CompositeProcessD3D11FencesHolderMap_H */