xref: /aosp_15_r20/external/angle/src/libANGLE/CLMemory.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // CLMemory.h: Defines the abstract cl::Memory class, which is a memory object
7*8975f5c5SAndroid Build Coastguard Worker // and the base class for OpenCL objects such as Buffer, Image and Pipe.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_CLMEMORY_H_
10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_CLMEMORY_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLObject.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/CLMemoryImpl.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include "common/SynchronizedValue.h"
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker #include <atomic>
18*8975f5c5SAndroid Build Coastguard Worker #include <stack>
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker namespace cl
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker 
23*8975f5c5SAndroid Build Coastguard Worker class Memory : public _cl_mem, public Object
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker   public:
26*8975f5c5SAndroid Build Coastguard Worker     // Front end entry functions, only called from OpenCL entry points
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker     angle::Result setDestructorCallback(MemoryCB pfnNotify, void *userData);
29*8975f5c5SAndroid Build Coastguard Worker 
30*8975f5c5SAndroid Build Coastguard Worker     angle::Result getInfo(MemInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const;
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker   public:
33*8975f5c5SAndroid Build Coastguard Worker     using PropArray = std::vector<cl_mem_properties>;
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker     ~Memory() override;
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker     virtual MemObjectType getType() const = 0;
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker     const Context &getContext() const;
40*8975f5c5SAndroid Build Coastguard Worker     const PropArray &getProperties() const;
41*8975f5c5SAndroid Build Coastguard Worker     MemFlags getFlags() const;
42*8975f5c5SAndroid Build Coastguard Worker     void *getHostPtr() const;
43*8975f5c5SAndroid Build Coastguard Worker     const MemoryPtr &getParent() const;
44*8975f5c5SAndroid Build Coastguard Worker     size_t getOffset() const;
45*8975f5c5SAndroid Build Coastguard Worker     size_t getSize() const;
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     template <typename T = rx::CLMemoryImpl>
48*8975f5c5SAndroid Build Coastguard Worker     T &getImpl() const;
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker     static Memory *Cast(cl_mem memobj);
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker   protected:
53*8975f5c5SAndroid Build Coastguard Worker     using CallbackData = std::pair<MemoryCB, void *>;
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker     Memory(const Buffer &buffer,
56*8975f5c5SAndroid Build Coastguard Worker            Context &context,
57*8975f5c5SAndroid Build Coastguard Worker            PropArray &&properties,
58*8975f5c5SAndroid Build Coastguard Worker            MemFlags flags,
59*8975f5c5SAndroid Build Coastguard Worker            size_t size,
60*8975f5c5SAndroid Build Coastguard Worker            void *hostPtr);
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker     Memory(const Buffer &buffer, Buffer &parent, MemFlags flags, size_t offset, size_t size);
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker     Memory(Context &context, PropArray &&properties, MemFlags flags, Memory *parent, void *hostPtr);
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker     const ContextPtr mContext;
67*8975f5c5SAndroid Build Coastguard Worker     const PropArray mProperties;
68*8975f5c5SAndroid Build Coastguard Worker     const MemFlags mFlags;
69*8975f5c5SAndroid Build Coastguard Worker     void *const mHostPtr = nullptr;
70*8975f5c5SAndroid Build Coastguard Worker     const MemoryPtr mParent;
71*8975f5c5SAndroid Build Coastguard Worker     const size_t mOffset = 0u;
72*8975f5c5SAndroid Build Coastguard Worker     rx::CLMemoryImpl::Ptr mImpl;
73*8975f5c5SAndroid Build Coastguard Worker     size_t mSize;
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker     angle::SynchronizedValue<std::stack<CallbackData>> mDestructorCallbacks;
76*8975f5c5SAndroid Build Coastguard Worker     std::atomic<cl_uint> mMapCount;
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     friend class Buffer;
79*8975f5c5SAndroid Build Coastguard Worker     friend class Context;
80*8975f5c5SAndroid Build Coastguard Worker };
81*8975f5c5SAndroid Build Coastguard Worker 
getContext()82*8975f5c5SAndroid Build Coastguard Worker inline const Context &Memory::getContext() const
83*8975f5c5SAndroid Build Coastguard Worker {
84*8975f5c5SAndroid Build Coastguard Worker     return *mContext;
85*8975f5c5SAndroid Build Coastguard Worker }
86*8975f5c5SAndroid Build Coastguard Worker 
getProperties()87*8975f5c5SAndroid Build Coastguard Worker inline const Memory::PropArray &Memory::getProperties() const
88*8975f5c5SAndroid Build Coastguard Worker {
89*8975f5c5SAndroid Build Coastguard Worker     return mProperties;
90*8975f5c5SAndroid Build Coastguard Worker }
91*8975f5c5SAndroid Build Coastguard Worker 
getFlags()92*8975f5c5SAndroid Build Coastguard Worker inline MemFlags Memory::getFlags() const
93*8975f5c5SAndroid Build Coastguard Worker {
94*8975f5c5SAndroid Build Coastguard Worker     return mFlags;
95*8975f5c5SAndroid Build Coastguard Worker }
96*8975f5c5SAndroid Build Coastguard Worker 
getHostPtr()97*8975f5c5SAndroid Build Coastguard Worker inline void *Memory::getHostPtr() const
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker     return mHostPtr;
100*8975f5c5SAndroid Build Coastguard Worker }
101*8975f5c5SAndroid Build Coastguard Worker 
getParent()102*8975f5c5SAndroid Build Coastguard Worker inline const MemoryPtr &Memory::getParent() const
103*8975f5c5SAndroid Build Coastguard Worker {
104*8975f5c5SAndroid Build Coastguard Worker     return mParent;
105*8975f5c5SAndroid Build Coastguard Worker }
106*8975f5c5SAndroid Build Coastguard Worker 
getOffset()107*8975f5c5SAndroid Build Coastguard Worker inline size_t Memory::getOffset() const
108*8975f5c5SAndroid Build Coastguard Worker {
109*8975f5c5SAndroid Build Coastguard Worker     return mOffset;
110*8975f5c5SAndroid Build Coastguard Worker }
111*8975f5c5SAndroid Build Coastguard Worker 
getSize()112*8975f5c5SAndroid Build Coastguard Worker inline size_t Memory::getSize() const
113*8975f5c5SAndroid Build Coastguard Worker {
114*8975f5c5SAndroid Build Coastguard Worker     return mSize;
115*8975f5c5SAndroid Build Coastguard Worker }
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker template <typename T>
getImpl()118*8975f5c5SAndroid Build Coastguard Worker inline T &Memory::getImpl() const
119*8975f5c5SAndroid Build Coastguard Worker {
120*8975f5c5SAndroid Build Coastguard Worker     return static_cast<T &>(*mImpl);
121*8975f5c5SAndroid Build Coastguard Worker }
122*8975f5c5SAndroid Build Coastguard Worker 
Cast(cl_mem memobj)123*8975f5c5SAndroid Build Coastguard Worker inline Memory *Memory::Cast(cl_mem memobj)
124*8975f5c5SAndroid Build Coastguard Worker {
125*8975f5c5SAndroid Build Coastguard Worker     return static_cast<Memory *>(memobj);
126*8975f5c5SAndroid Build Coastguard Worker }
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker }  // namespace cl
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_CLMEMORY_H_
131