xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/CLKernelImpl.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 // CLKernelImpl.h: Defines the abstract rx::CLKernelImpl class.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_CLKERNELIMPL_H_
9*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_CLKERNELIMPL_H_
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/cl_types.h"
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker namespace rx
14*8975f5c5SAndroid Build Coastguard Worker {
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker class CLKernelImpl : angle::NonCopyable
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker   public:
19*8975f5c5SAndroid Build Coastguard Worker     using Ptr         = std::unique_ptr<CLKernelImpl>;
20*8975f5c5SAndroid Build Coastguard Worker     using CreateFunc  = std::function<Ptr(const cl::Kernel &)>;
21*8975f5c5SAndroid Build Coastguard Worker     using CreateFuncs = std::list<CreateFunc>;
22*8975f5c5SAndroid Build Coastguard Worker 
23*8975f5c5SAndroid Build Coastguard Worker     struct WorkGroupInfo
24*8975f5c5SAndroid Build Coastguard Worker     {
25*8975f5c5SAndroid Build Coastguard Worker         WorkGroupInfo();
26*8975f5c5SAndroid Build Coastguard Worker         ~WorkGroupInfo();
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker         WorkGroupInfo(const WorkGroupInfo &)            = delete;
29*8975f5c5SAndroid Build Coastguard Worker         WorkGroupInfo &operator=(const WorkGroupInfo &) = delete;
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker         WorkGroupInfo(WorkGroupInfo &&);
32*8975f5c5SAndroid Build Coastguard Worker         WorkGroupInfo &operator=(WorkGroupInfo &&);
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker         std::array<size_t, 3u> globalWorkSize       = {};
35*8975f5c5SAndroid Build Coastguard Worker         size_t workGroupSize                        = 0u;
36*8975f5c5SAndroid Build Coastguard Worker         std::array<size_t, 3u> compileWorkGroupSize = {};
37*8975f5c5SAndroid Build Coastguard Worker         cl_ulong localMemSize                       = 0u;
38*8975f5c5SAndroid Build Coastguard Worker         size_t prefWorkGroupSizeMultiple            = 0u;
39*8975f5c5SAndroid Build Coastguard Worker         cl_ulong privateMemSize                     = 0u;
40*8975f5c5SAndroid Build Coastguard Worker     };
41*8975f5c5SAndroid Build Coastguard Worker 
42*8975f5c5SAndroid Build Coastguard Worker     struct ArgInfo
43*8975f5c5SAndroid Build Coastguard Worker     {
44*8975f5c5SAndroid Build Coastguard Worker         ArgInfo();
45*8975f5c5SAndroid Build Coastguard Worker         ~ArgInfo();
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker         ArgInfo(const ArgInfo &)            = default;
48*8975f5c5SAndroid Build Coastguard Worker         ArgInfo &operator=(const ArgInfo &) = default;
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker         ArgInfo(ArgInfo &&);
51*8975f5c5SAndroid Build Coastguard Worker         ArgInfo &operator=(ArgInfo &&);
52*8975f5c5SAndroid Build Coastguard Worker 
isAvailableArgInfo53*8975f5c5SAndroid Build Coastguard Worker         bool isAvailable() const { return !name.empty(); }
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker         cl_kernel_arg_address_qualifier addressQualifier = 0u;
56*8975f5c5SAndroid Build Coastguard Worker         cl_kernel_arg_access_qualifier accessQualifier   = 0u;
57*8975f5c5SAndroid Build Coastguard Worker         std::string typeName;
58*8975f5c5SAndroid Build Coastguard Worker         cl_kernel_arg_type_qualifier typeQualifier = 0u;
59*8975f5c5SAndroid Build Coastguard Worker         std::string name;
60*8975f5c5SAndroid Build Coastguard Worker     };
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker     struct Info
63*8975f5c5SAndroid Build Coastguard Worker     {
64*8975f5c5SAndroid Build Coastguard Worker         Info();
65*8975f5c5SAndroid Build Coastguard Worker         ~Info();
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker         Info(const Info &)            = delete;
68*8975f5c5SAndroid Build Coastguard Worker         Info &operator=(const Info &) = delete;
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker         Info(Info &&);
71*8975f5c5SAndroid Build Coastguard Worker         Info &operator=(Info &&);
72*8975f5c5SAndroid Build Coastguard Worker 
isValidInfo73*8975f5c5SAndroid Build Coastguard Worker         bool isValid() const { return !functionName.empty(); }
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker         std::string functionName;
76*8975f5c5SAndroid Build Coastguard Worker         cl_uint numArgs = 0u;
77*8975f5c5SAndroid Build Coastguard Worker         std::string attributes;
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker         std::vector<WorkGroupInfo> workGroups;
80*8975f5c5SAndroid Build Coastguard Worker         std::vector<ArgInfo> args;
81*8975f5c5SAndroid Build Coastguard Worker     };
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker     CLKernelImpl(const cl::Kernel &kernel);
84*8975f5c5SAndroid Build Coastguard Worker     virtual ~CLKernelImpl();
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result setArg(cl_uint argIndex, size_t argSize, const void *argValue) = 0;
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result createInfo(Info *infoOut) const = 0;
89*8975f5c5SAndroid Build Coastguard Worker 
90*8975f5c5SAndroid Build Coastguard Worker   protected:
91*8975f5c5SAndroid Build Coastguard Worker     const cl::Kernel &mKernel;
92*8975f5c5SAndroid Build Coastguard Worker };
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_CLKERNELIMPL_H_
97