• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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