xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/CLKernelVk.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 // CLKernelVk.h: Defines the class interface for CLKernelVk, implementing CLKernelImpl.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_CLKERNELVK_H_
9*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_CLKERNELVK_H_
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/cl_types.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_cache_utils.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_utils.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/CLKernelImpl.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "vulkan/vulkan_core.h"
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace rx
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker struct CLKernelArgument
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker     CLKernelImpl::ArgInfo info{};
25*8975f5c5SAndroid Build Coastguard Worker     uint32_t type     = 0;
26*8975f5c5SAndroid Build Coastguard Worker     uint32_t ordinal  = 0;
27*8975f5c5SAndroid Build Coastguard Worker     size_t handleSize = 0;
28*8975f5c5SAndroid Build Coastguard Worker     void *handle      = nullptr;
29*8975f5c5SAndroid Build Coastguard Worker     bool used         = false;
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker     // Shared operand words/regions for "OpExtInst" type spv instructions
32*8975f5c5SAndroid Build Coastguard Worker     // (starts from spv word index/offset 7 and onward)
33*8975f5c5SAndroid Build Coastguard Worker     // https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpExtInst
34*8975f5c5SAndroid Build Coastguard Worker     // https://github.com/google/clspv/blob/main/docs/OpenCLCOnVulkan.md#kernels
35*8975f5c5SAndroid Build Coastguard Worker     union
36*8975f5c5SAndroid Build Coastguard Worker     {
37*8975f5c5SAndroid Build Coastguard Worker         uint32_t op3;
38*8975f5c5SAndroid Build Coastguard Worker         uint32_t descriptorSet;
39*8975f5c5SAndroid Build Coastguard Worker         uint32_t pushConstOffset;
40*8975f5c5SAndroid Build Coastguard Worker         uint32_t workgroupSpecId;
41*8975f5c5SAndroid Build Coastguard Worker     };
42*8975f5c5SAndroid Build Coastguard Worker     union
43*8975f5c5SAndroid Build Coastguard Worker     {
44*8975f5c5SAndroid Build Coastguard Worker         uint32_t op4;
45*8975f5c5SAndroid Build Coastguard Worker         uint32_t descriptorBinding;
46*8975f5c5SAndroid Build Coastguard Worker         uint32_t pushConstantSize;
47*8975f5c5SAndroid Build Coastguard Worker         uint32_t workgroupSize;
48*8975f5c5SAndroid Build Coastguard Worker     };
49*8975f5c5SAndroid Build Coastguard Worker     union
50*8975f5c5SAndroid Build Coastguard Worker     {
51*8975f5c5SAndroid Build Coastguard Worker         uint32_t op5;
52*8975f5c5SAndroid Build Coastguard Worker         uint32_t podStorageBufferOffset;
53*8975f5c5SAndroid Build Coastguard Worker         uint32_t podUniformOffset;
54*8975f5c5SAndroid Build Coastguard Worker         uint32_t pointerUniformOffset;
55*8975f5c5SAndroid Build Coastguard Worker     };
56*8975f5c5SAndroid Build Coastguard Worker     union
57*8975f5c5SAndroid Build Coastguard Worker     {
58*8975f5c5SAndroid Build Coastguard Worker         uint32_t op6;
59*8975f5c5SAndroid Build Coastguard Worker         uint32_t podStorageBufferSize;
60*8975f5c5SAndroid Build Coastguard Worker         uint32_t podUniformSize;
61*8975f5c5SAndroid Build Coastguard Worker         uint32_t pointerUniformSize;
62*8975f5c5SAndroid Build Coastguard Worker     };
63*8975f5c5SAndroid Build Coastguard Worker };
64*8975f5c5SAndroid Build Coastguard Worker using CLKernelArguments = std::vector<CLKernelArgument>;
65*8975f5c5SAndroid Build Coastguard Worker using CLKernelArgsMap   = angle::HashMap<std::string, CLKernelArguments>;
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker class CLKernelVk : public CLKernelImpl
68*8975f5c5SAndroid Build Coastguard Worker {
69*8975f5c5SAndroid Build Coastguard Worker   public:
70*8975f5c5SAndroid Build Coastguard Worker     using Ptr = std::unique_ptr<CLKernelVk>;
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     struct KernelSpecConstant
73*8975f5c5SAndroid Build Coastguard Worker     {
74*8975f5c5SAndroid Build Coastguard Worker         uint32_t ID;
75*8975f5c5SAndroid Build Coastguard Worker         uint32_t data;
76*8975f5c5SAndroid Build Coastguard Worker     };
77*8975f5c5SAndroid Build Coastguard Worker     // Setting a reasonable initial value
78*8975f5c5SAndroid Build Coastguard Worker     // https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_DEVICE_MAX_PARAMETER_SIZE
79*8975f5c5SAndroid Build Coastguard Worker     using KernelSpecConstants = angle::FastVector<KernelSpecConstant, 128>;
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker     CLKernelVk(const cl::Kernel &kernel,
82*8975f5c5SAndroid Build Coastguard Worker                std::string &name,
83*8975f5c5SAndroid Build Coastguard Worker                std::string &attributes,
84*8975f5c5SAndroid Build Coastguard Worker                CLKernelArguments &args);
85*8975f5c5SAndroid Build Coastguard Worker     ~CLKernelVk() override;
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker     angle::Result init();
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker     angle::Result setArg(cl_uint argIndex, size_t argSize, const void *argValue) override;
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     angle::Result createInfo(CLKernelImpl::Info *infoOut) const override;
92*8975f5c5SAndroid Build Coastguard Worker 
getProgram()93*8975f5c5SAndroid Build Coastguard Worker     CLProgramVk *getProgram() { return mProgram; }
getKernelName()94*8975f5c5SAndroid Build Coastguard Worker     const std::string &getKernelName() { return mName; }
getArgs()95*8975f5c5SAndroid Build Coastguard Worker     const CLKernelArguments &getArgs() { return mArgs; }
initPipelineLayout()96*8975f5c5SAndroid Build Coastguard Worker     angle::Result initPipelineLayout()
97*8975f5c5SAndroid Build Coastguard Worker     {
98*8975f5c5SAndroid Build Coastguard Worker         PipelineLayoutCache *pipelineLayoutCache = mContext->getPipelineLayoutCache();
99*8975f5c5SAndroid Build Coastguard Worker         return pipelineLayoutCache->getPipelineLayout(mContext, mPipelineLayoutDesc,
100*8975f5c5SAndroid Build Coastguard Worker                                                       mDescriptorSetLayouts, &mPipelineLayout);
101*8975f5c5SAndroid Build Coastguard Worker     }
getPipelineLayout()102*8975f5c5SAndroid Build Coastguard Worker     const vk::PipelineLayout &getPipelineLayout() const { return *mPipelineLayout; }
getDescriptorSetLayouts()103*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetLayoutPointerArray &getDescriptorSetLayouts() { return mDescriptorSetLayouts; }
getFrontendObject()104*8975f5c5SAndroid Build Coastguard Worker     cl::Kernel &getFrontendObject() { return const_cast<cl::Kernel &>(mKernel); }
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     angle::Result getOrCreateComputePipeline(vk::PipelineCacheAccess *pipelineCache,
107*8975f5c5SAndroid Build Coastguard Worker                                              const cl::NDRange &ndrange,
108*8975f5c5SAndroid Build Coastguard Worker                                              const cl::Device &device,
109*8975f5c5SAndroid Build Coastguard Worker                                              vk::PipelineHelper **pipelineOut,
110*8975f5c5SAndroid Build Coastguard Worker                                              cl::WorkgroupCount *workgroupCountOut);
111*8975f5c5SAndroid Build Coastguard Worker 
getDescriptorSetLayoutDesc(DescriptorSetIndex index)112*8975f5c5SAndroid Build Coastguard Worker     const vk::DescriptorSetLayoutDesc &getDescriptorSetLayoutDesc(DescriptorSetIndex index) const
113*8975f5c5SAndroid Build Coastguard Worker     {
114*8975f5c5SAndroid Build Coastguard Worker         return mDescriptorSetLayoutDescs[index];
115*8975f5c5SAndroid Build Coastguard Worker     }
getKernelArgDescriptorSetDesc()116*8975f5c5SAndroid Build Coastguard Worker     const vk::DescriptorSetLayoutDesc &getKernelArgDescriptorSetDesc() const
117*8975f5c5SAndroid Build Coastguard Worker     {
118*8975f5c5SAndroid Build Coastguard Worker         return getDescriptorSetLayoutDesc(DescriptorSetIndex::KernelArguments);
119*8975f5c5SAndroid Build Coastguard Worker     }
getLiteralSamplerDescriptorSetDesc()120*8975f5c5SAndroid Build Coastguard Worker     const vk::DescriptorSetLayoutDesc &getLiteralSamplerDescriptorSetDesc() const
121*8975f5c5SAndroid Build Coastguard Worker     {
122*8975f5c5SAndroid Build Coastguard Worker         return getDescriptorSetLayoutDesc(DescriptorSetIndex::LiteralSampler);
123*8975f5c5SAndroid Build Coastguard Worker     }
getPrintfDescriptorSetDesc()124*8975f5c5SAndroid Build Coastguard Worker     const vk::DescriptorSetLayoutDesc &getPrintfDescriptorSetDesc() const
125*8975f5c5SAndroid Build Coastguard Worker     {
126*8975f5c5SAndroid Build Coastguard Worker         return getDescriptorSetLayoutDesc(DescriptorSetIndex::Printf);
127*8975f5c5SAndroid Build Coastguard Worker     }
128*8975f5c5SAndroid Build Coastguard Worker 
getPipelineLayoutDesc()129*8975f5c5SAndroid Build Coastguard Worker     const vk::PipelineLayoutDesc &getPipelineLayoutDesc() { return mPipelineLayoutDesc; }
130*8975f5c5SAndroid Build Coastguard Worker 
getDescriptorSet(DescriptorSetIndex index)131*8975f5c5SAndroid Build Coastguard Worker     VkDescriptorSet getDescriptorSet(DescriptorSetIndex index)
132*8975f5c5SAndroid Build Coastguard Worker     {
133*8975f5c5SAndroid Build Coastguard Worker         return mDescriptorSets[index]->getDescriptorSet();
134*8975f5c5SAndroid Build Coastguard Worker     }
135*8975f5c5SAndroid Build Coastguard Worker 
getPodArgumentsData()136*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> &getPodArgumentsData() { return mPodArgumentsData; }
137*8975f5c5SAndroid Build Coastguard Worker 
138*8975f5c5SAndroid Build Coastguard Worker     bool usesPrintf() const;
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker     angle::Result allocateDescriptorSet(
141*8975f5c5SAndroid Build Coastguard Worker         DescriptorSetIndex index,
142*8975f5c5SAndroid Build Coastguard Worker         angle::EnumIterator<DescriptorSetIndex> layoutIndex,
143*8975f5c5SAndroid Build Coastguard Worker         vk::OutsideRenderPassCommandBufferHelper *computePassCommands);
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker   private:
146*8975f5c5SAndroid Build Coastguard Worker     static constexpr std::array<size_t, 3> kEmptyWorkgroupSize = {0, 0, 0};
147*8975f5c5SAndroid Build Coastguard Worker 
148*8975f5c5SAndroid Build Coastguard Worker     CLProgramVk *mProgram;
149*8975f5c5SAndroid Build Coastguard Worker     CLContextVk *mContext;
150*8975f5c5SAndroid Build Coastguard Worker     std::string mName;
151*8975f5c5SAndroid Build Coastguard Worker     std::string mAttributes;
152*8975f5c5SAndroid Build Coastguard Worker     CLKernelArguments mArgs;
153*8975f5c5SAndroid Build Coastguard Worker 
154*8975f5c5SAndroid Build Coastguard Worker     // Copy of the pod data
155*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> mPodArgumentsData;
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker     vk::ShaderProgramHelper mShaderProgramHelper;
158*8975f5c5SAndroid Build Coastguard Worker     vk::ComputePipelineCache mComputePipelineCache;
159*8975f5c5SAndroid Build Coastguard Worker     KernelSpecConstants mSpecConstants;
160*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineLayoutPtr mPipelineLayout;
161*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetLayoutPointerArray mDescriptorSetLayouts{};
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetArray<vk::DescriptorSetPointer> mDescriptorSets;
164*8975f5c5SAndroid Build Coastguard Worker 
165*8975f5c5SAndroid Build Coastguard Worker     vk::DescriptorSetArray<vk::DescriptorSetLayoutDesc> mDescriptorSetLayoutDescs;
166*8975f5c5SAndroid Build Coastguard Worker     vk::PipelineLayoutDesc mPipelineLayoutDesc;
167*8975f5c5SAndroid Build Coastguard Worker };
168*8975f5c5SAndroid Build Coastguard Worker 
169*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
170*8975f5c5SAndroid Build Coastguard Worker 
171*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_VULKAN_CLKERNELVK_H_
172