xref: /aosp_15_r20/external/angle/src/libANGLE/CLKernel.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 // CLKernel.h: Defines the cl::Kernel class, which is a function declared in an OpenCL program.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_CLKERNEL_H_
9*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_CLKERNEL_H_
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLObject.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/CLKernelImpl.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker namespace cl
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker class Kernel final : public _cl_kernel, public Object
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker   public:
20*8975f5c5SAndroid Build Coastguard Worker     // Front end entry functions, only called from OpenCL entry points
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker     angle::Result setArg(cl_uint argIndex, size_t argSize, const void *argValue);
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker     angle::Result getInfo(KernelInfo name,
25*8975f5c5SAndroid Build Coastguard Worker                           size_t valueSize,
26*8975f5c5SAndroid Build Coastguard Worker                           void *value,
27*8975f5c5SAndroid Build Coastguard Worker                           size_t *valueSizeRet) const;
28*8975f5c5SAndroid Build Coastguard Worker 
29*8975f5c5SAndroid Build Coastguard Worker     angle::Result getWorkGroupInfo(cl_device_id device,
30*8975f5c5SAndroid Build Coastguard Worker                                    KernelWorkGroupInfo name,
31*8975f5c5SAndroid Build Coastguard Worker                                    size_t valueSize,
32*8975f5c5SAndroid Build Coastguard Worker                                    void *value,
33*8975f5c5SAndroid Build Coastguard Worker                                    size_t *valueSizeRet) const;
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker     angle::Result getArgInfo(cl_uint argIndex,
36*8975f5c5SAndroid Build Coastguard Worker                              KernelArgInfo name,
37*8975f5c5SAndroid Build Coastguard Worker                              size_t valueSize,
38*8975f5c5SAndroid Build Coastguard Worker                              void *value,
39*8975f5c5SAndroid Build Coastguard Worker                              size_t *valueSizeRet) const;
40*8975f5c5SAndroid Build Coastguard Worker 
getName()41*8975f5c5SAndroid Build Coastguard Worker     const std::string &getName() const { return mInfo.functionName; }
42*8975f5c5SAndroid Build Coastguard Worker 
areAllArgsSet()43*8975f5c5SAndroid Build Coastguard Worker     bool areAllArgsSet() const
44*8975f5c5SAndroid Build Coastguard Worker     {
45*8975f5c5SAndroid Build Coastguard Worker         return std::all_of(mSetArguments.begin(), mSetArguments.end(),
46*8975f5c5SAndroid Build Coastguard Worker                            [](KernelArg arg) { return arg.isSet == true; });
47*8975f5c5SAndroid Build Coastguard Worker     }
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker     Kernel *clone() const;
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker   public:
52*8975f5c5SAndroid Build Coastguard Worker     ~Kernel() override;
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker     const Program &getProgram() const;
55*8975f5c5SAndroid Build Coastguard Worker     const rx::CLKernelImpl::Info &getInfo() const;
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker     template <typename T = rx::CLKernelImpl>
58*8975f5c5SAndroid Build Coastguard Worker     T &getImpl() const;
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker   private:
61*8975f5c5SAndroid Build Coastguard Worker     Kernel(Program &program, const char *name);
62*8975f5c5SAndroid Build Coastguard Worker     Kernel(Program &program, const rx::CLKernelImpl::CreateFunc &createFunc);
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker     void initImpl();
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker     const ProgramPtr mProgram;
67*8975f5c5SAndroid Build Coastguard Worker     rx::CLKernelImpl::Ptr mImpl;
68*8975f5c5SAndroid Build Coastguard Worker     rx::CLKernelImpl::Info mInfo;
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker     std::vector<KernelArg> mSetArguments;
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     friend class Object;
73*8975f5c5SAndroid Build Coastguard Worker     friend class Program;
74*8975f5c5SAndroid Build Coastguard Worker };
75*8975f5c5SAndroid Build Coastguard Worker 
getProgram()76*8975f5c5SAndroid Build Coastguard Worker inline const Program &Kernel::getProgram() const
77*8975f5c5SAndroid Build Coastguard Worker {
78*8975f5c5SAndroid Build Coastguard Worker     return *mProgram;
79*8975f5c5SAndroid Build Coastguard Worker }
80*8975f5c5SAndroid Build Coastguard Worker 
getInfo()81*8975f5c5SAndroid Build Coastguard Worker inline const rx::CLKernelImpl::Info &Kernel::getInfo() const
82*8975f5c5SAndroid Build Coastguard Worker {
83*8975f5c5SAndroid Build Coastguard Worker     return mInfo;
84*8975f5c5SAndroid Build Coastguard Worker }
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker template <typename T>
getImpl()87*8975f5c5SAndroid Build Coastguard Worker inline T &Kernel::getImpl() const
88*8975f5c5SAndroid Build Coastguard Worker {
89*8975f5c5SAndroid Build Coastguard Worker     return static_cast<T &>(*mImpl);
90*8975f5c5SAndroid Build Coastguard Worker }
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker }  // namespace cl
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_CLKERNEL_H_
95