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