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