Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/libANGLE/CLProgram.h
1693 views
1
//
2
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
3
// Use of this source code is governed by a BSD-style license that can be
4
// found in the LICENSE file.
5
//
6
// CLProgram.h: Defines the cl::Program class, which consists of a set of OpenCL kernels.
7
8
#ifndef LIBANGLE_CLPROGRAM_H_
9
#define LIBANGLE_CLPROGRAM_H_
10
11
#include "libANGLE/CLDevice.h"
12
#include "libANGLE/CLKernel.h"
13
#include "libANGLE/renderer/CLProgramImpl.h"
14
15
#include "common/Spinlock.h"
16
#include "common/SynchronizedValue.h"
17
18
#include <atomic>
19
20
namespace cl
21
{
22
23
class Program final : public _cl_program, public Object
24
{
25
public:
26
// Front end entry functions, only called from OpenCL entry points
27
28
cl_int build(cl_uint numDevices,
29
const cl_device_id *deviceList,
30
const char *options,
31
ProgramCB pfnNotify,
32
void *userData);
33
34
cl_int compile(cl_uint numDevices,
35
const cl_device_id *deviceList,
36
const char *options,
37
cl_uint numInputHeaders,
38
const cl_program *inputHeaders,
39
const char **headerIncludeNames,
40
ProgramCB pfnNotify,
41
void *userData);
42
43
cl_int getInfo(ProgramInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const;
44
45
cl_int getBuildInfo(cl_device_id device,
46
ProgramBuildInfo name,
47
size_t valueSize,
48
void *value,
49
size_t *valueSizeRet) const;
50
51
cl_kernel createKernel(const char *kernel_name, cl_int &errorCode);
52
53
cl_int createKernels(cl_uint numKernels, cl_kernel *kernels, cl_uint *numKernelsRet);
54
55
public:
56
~Program() override;
57
58
Context &getContext();
59
const Context &getContext() const;
60
const DevicePtrs &getDevices() const;
61
bool hasDevice(const _cl_device_id *device) const;
62
63
bool isBuilding() const;
64
bool hasAttachedKernels() const;
65
66
template <typename T = rx::CLProgramImpl>
67
T &getImpl() const;
68
69
void callback();
70
71
private:
72
Program(Context &context, std::string &&source, cl_int &errorCode);
73
Program(Context &context, const void *il, size_t length, cl_int &errorCode);
74
75
Program(Context &context,
76
DevicePtrs &&devices,
77
const size_t *lengths,
78
const unsigned char **binaries,
79
cl_int *binaryStatus,
80
cl_int &errorCode);
81
82
Program(Context &context, DevicePtrs &&devices, const char *kernelNames, cl_int &errorCode);
83
84
Program(Context &context,
85
const DevicePtrs &devices,
86
const char *options,
87
const cl::ProgramPtrs &inputPrograms,
88
ProgramCB pfnNotify,
89
void *userData,
90
cl_int &errorCode);
91
92
using CallbackData = std::pair<ProgramCB, void *>;
93
94
const ContextPtr mContext;
95
const DevicePtrs mDevices;
96
const std::string mIL;
97
98
// mCallback might be accessed from implementation initialization
99
// and needs to be initialized first.
100
angle::SynchronizedValue<CallbackData, angle::Spinlock> mCallback;
101
std::atomic<cl_uint> mNumAttachedKernels;
102
103
const rx::CLProgramImpl::Ptr mImpl;
104
const std::string mSource;
105
106
friend class Kernel;
107
friend class Object;
108
};
109
110
inline Context &Program::getContext()
111
{
112
return *mContext;
113
}
114
115
inline const Context &Program::getContext() const
116
{
117
return *mContext;
118
}
119
120
inline const DevicePtrs &Program::getDevices() const
121
{
122
return mDevices;
123
}
124
125
inline bool Program::hasDevice(const _cl_device_id *device) const
126
{
127
return std::find(mDevices.cbegin(), mDevices.cend(), device) != mDevices.cend();
128
}
129
130
inline bool Program::isBuilding() const
131
{
132
return mCallback->first != nullptr;
133
}
134
135
inline bool Program::hasAttachedKernels() const
136
{
137
return mNumAttachedKernels != 0u;
138
}
139
140
template <typename T>
141
inline T &Program::getImpl() const
142
{
143
return static_cast<T &>(*mImpl);
144
}
145
146
} // namespace cl
147
148
#endif // LIBANGLE_CLPROGRAM_H_
149
150