1 // 2 // Copyright 2021 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 // CLKernelVk.h: Defines the class interface for CLKernelVk, implementing CLKernelImpl. 7 8 #ifndef LIBANGLE_RENDERER_VULKAN_CLKERNELVK_H_ 9 #define LIBANGLE_RENDERER_VULKAN_CLKERNELVK_H_ 10 11 #include "libANGLE/renderer/vulkan/cl_types.h" 12 #include "libANGLE/renderer/vulkan/vk_cache_utils.h" 13 #include "libANGLE/renderer/vulkan/vk_helpers.h" 14 #include "libANGLE/renderer/vulkan/vk_utils.h" 15 16 #include "libANGLE/renderer/CLKernelImpl.h" 17 18 namespace rx 19 { 20 21 struct CLKernelArgument 22 { 23 CLKernelImpl::ArgInfo info{}; 24 uint32_t type = 0; 25 uint32_t ordinal = 0; 26 size_t handleSize = 0; 27 void *handle = nullptr; 28 bool used = false; 29 30 // Shared operand words/regions for "OpExtInst" type spv instructions 31 // (starts from spv word index/offset 7 and onward) 32 // https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpExtInst 33 // https://github.com/google/clspv/blob/main/docs/OpenCLCOnVulkan.md#kernels 34 union 35 { 36 uint32_t op3; 37 uint32_t descriptorSet; 38 uint32_t pushConstOffset; 39 uint32_t workgroupSpecId; 40 }; 41 union 42 { 43 uint32_t op4; 44 uint32_t descriptorBinding; 45 uint32_t pushConstantSize; 46 uint32_t workgroupSize; 47 }; 48 union 49 { 50 uint32_t op5; 51 uint32_t podStorageBufferOffset; 52 uint32_t podUniformOffset; 53 uint32_t pointerUniformOffset; 54 }; 55 union 56 { 57 uint32_t op6; 58 uint32_t podStorageBufferSize; 59 uint32_t podUniformSize; 60 uint32_t pointerUniformSize; 61 }; 62 }; 63 using CLKernelArguments = std::vector<CLKernelArgument>; 64 using CLKernelArgsMap = angle::HashMap<std::string, CLKernelArguments>; 65 66 class CLKernelVk : public CLKernelImpl 67 { 68 public: 69 using Ptr = std::unique_ptr<CLKernelVk>; 70 CLKernelVk(const cl::Kernel &kernel, 71 std::string &name, 72 std::string &attributes, 73 CLKernelArguments &args); 74 ~CLKernelVk() override; 75 76 angle::Result setArg(cl_uint argIndex, size_t argSize, const void *argValue) override; 77 78 angle::Result createInfo(CLKernelImpl::Info *infoOut) const override; 79 getProgram()80 CLProgramVk *getProgram() { return mProgram; } getKernelName()81 const std::string &getKernelName() { return mName; } getArgs()82 const CLKernelArguments &getArgs() { return mArgs; } getPipelineLayout()83 vk::AtomicBindingPointer<vk::PipelineLayout> &getPipelineLayout() { return mPipelineLayout; } getDescriptorSetLayouts()84 vk::DescriptorSetLayoutPointerArray &getDescriptorSetLayouts() { return mDescriptorSetLayouts; } 85 86 angle::Result getOrCreateComputePipeline(vk::PipelineCacheAccess *pipelineCache, 87 const cl::NDRange &ndrange, 88 const cl::Device &device, 89 vk::PipelineHelper **pipelineOut, 90 cl::WorkgroupCount *workgroupCountOut); 91 92 private: 93 static constexpr std::array<size_t, 3> kEmptyWorkgroupSize = {0, 0, 0}; 94 95 CLProgramVk *mProgram; 96 CLContextVk *mContext; 97 std::string mName; 98 std::string mAttributes; 99 CLKernelArguments mArgs; 100 vk::ShaderProgramHelper mShaderProgramHelper; 101 vk::ComputePipelineCache mComputePipelineCache; 102 vk::AtomicBindingPointer<vk::PipelineLayout> mPipelineLayout; 103 vk::DescriptorSetLayoutPointerArray mDescriptorSetLayouts{}; 104 }; 105 106 } // namespace rx 107 108 #endif // LIBANGLE_RENDERER_VULKAN_CLKERNELVK_H_ 109