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