1 // Copyright (C) 2018 Intel Corporation
2 //
3 //
4 // SPDX-License-Identifier: Apache-2.0
5 //
6 
7 /// @file memory_descriptor.hpp
8 
9 #ifndef ADE_MEMORY_DESCRIPTOR_HPP
10 #define ADE_MEMORY_DESCRIPTOR_HPP
11 
12 #include "ade/util/memory_range.hpp"
13 
14 #include "ade/memory/memory_types.hpp"
15 #include "ade/memory/memory_accessor.hpp"
16 
17 namespace ade
18 {
19 
20 class MemoryDescriptorRef;
21 class MemoryDescriptorView;
22 
23 /// This class represents continuous buffer used in graph
24 /// It can have optional memory view, accessible to external users
25 class MemoryDescriptor final
26 {
27 public:
28     /// MemoryDescriptor constructor
29     ///
30     /// @param element_size Data element size in bytes
31     /// @param dims Memory dimensions in elements
32     explicit MemoryDescriptor(size_t element_size,
33                               const memory::DynMdSize& dims);
34     MemoryDescriptor(const MemoryDescriptor&) = delete;
35     MemoryDescriptor& operator=(const MemoryDescriptor&) = delete;
36     ~MemoryDescriptor();
37 
38     /// Add events listener
39     ///
40     /// @param listener Listener to be added, must not be null
41     /// Same listener must not be added twice
42     void addListener(IMemoryAccessListener* listener);
43 
44     /// Remove events listener
45     ///
46     /// @param listener Listener to be removed, must not be null
47     /// Listener must be previously added via addListener call
48     void removeListener(IMemoryAccessListener* listener);
49 
50     using AccessHandle = MemoryAccessor::AccessHandle;
51 
52     /// Notify all listeners about memory access
53     ///
54     /// @param span Span that represents a ROI of current view to be accessed
55     /// @param accessType Access type for this view, it must be Read, Write or ReadWrite
56     /// @returns Handle which later will be passed to commit
57     AccessHandle access(const memory::DynMdSpan& span, MemoryAccessType accessType);
58 
59     /// Notify all listeners about memory commit
60     ///
61     /// @param handle Handle returned from successuful access call
62     void commit(AccessHandle handle);
63 
64     /// Get memory dimensions
65     ///
66     /// @returns Dimensions
67     const memory::DynMdSize& dimensions() const;
68 
69     /// Get buffer element size
70     ///
71     /// @returns Size in bytes, always greater than 0
72     std::size_t elementSize() const;
73 
74     /// Update externally accessible memory view and notify all listeners
75     ///
76     /// @param view New memory view
77     void setExternalView(const memory::DynMdView<void>& view);
78 
79     /// Returns externally accessible memory view if any
80     ///
81     /// @returns View into externally accessible memory or null view
82     memory::DynMdView<void> getExternalView() const;
83 
84 private:
85     friend class MemoryDescriptorView;
86 
87     const size_t m_elementSize;
88     const memory::DynMdSize m_dims;
89     memory::DynMdView<void> m_externalView;
90 
91     MemoryAccessor m_accessor;
92 };
93 
94 }
95 
96 #endif // ADE_MEMORY_DESCRIPTOR_HPP
97