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 // CLProgramVk.h: Defines the class interface for CLProgramVk, implementing CLProgramImpl. 7*8975f5c5SAndroid Build Coastguard Worker 8*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_CLPROGRAMVK_H_ 9*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_CLPROGRAMVK_H_ 10*8975f5c5SAndroid Build Coastguard Worker 11*8975f5c5SAndroid Build Coastguard Worker #include <cstdint> 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "common/SimpleMutex.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "common/hash_containers.h" 15*8975f5c5SAndroid Build Coastguard Worker 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/CLContextVk.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/CLKernelVk.h" 18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/cl_types.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/clspv_utils.h" 20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_cache_utils.h" 21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h" 22*8975f5c5SAndroid Build Coastguard Worker 23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/CLProgramImpl.h" 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLProgram.h" 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker #include "clspv/Compiler.h" 28*8975f5c5SAndroid Build Coastguard Worker 29*8975f5c5SAndroid Build Coastguard Worker #include "vulkan/vulkan_core.h" 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker #include "spirv-tools/libspirv.h" 32*8975f5c5SAndroid Build Coastguard Worker 33*8975f5c5SAndroid Build Coastguard Worker #include "spirv/unified1/NonSemanticClspvReflection.h" 34*8975f5c5SAndroid Build Coastguard Worker 35*8975f5c5SAndroid Build Coastguard Worker namespace rx 36*8975f5c5SAndroid Build Coastguard Worker { 37*8975f5c5SAndroid Build Coastguard Worker 38*8975f5c5SAndroid Build Coastguard Worker class CLProgramVk : public CLProgramImpl 39*8975f5c5SAndroid Build Coastguard Worker { 40*8975f5c5SAndroid Build Coastguard Worker public: 41*8975f5c5SAndroid Build Coastguard Worker using Ptr = std::unique_ptr<CLProgramVk>; 42*8975f5c5SAndroid Build Coastguard Worker // TODO: Look into moving this information in CLKernelArgument 43*8975f5c5SAndroid Build Coastguard Worker // https://anglebug.com/378514267 44*8975f5c5SAndroid Build Coastguard Worker struct ImagePushConstant 45*8975f5c5SAndroid Build Coastguard Worker { 46*8975f5c5SAndroid Build Coastguard Worker VkPushConstantRange pcRange; 47*8975f5c5SAndroid Build Coastguard Worker uint32_t ordinal; 48*8975f5c5SAndroid Build Coastguard Worker }; 49*8975f5c5SAndroid Build Coastguard Worker struct SpvReflectionData 50*8975f5c5SAndroid Build Coastguard Worker { 51*8975f5c5SAndroid Build Coastguard Worker angle::HashMap<uint32_t, uint32_t> spvIntLookup; 52*8975f5c5SAndroid Build Coastguard Worker angle::HashMap<uint32_t, std::string> spvStrLookup; 53*8975f5c5SAndroid Build Coastguard Worker angle::HashMap<uint32_t, CLKernelVk::ArgInfo> kernelArgInfos; 54*8975f5c5SAndroid Build Coastguard Worker angle::HashMap<std::string, uint32_t> kernelFlags; 55*8975f5c5SAndroid Build Coastguard Worker angle::HashMap<std::string, std::string> kernelAttributes; 56*8975f5c5SAndroid Build Coastguard Worker angle::HashMap<std::string, std::array<uint32_t, 3>> kernelCompileWorkgroupSize; 57*8975f5c5SAndroid Build Coastguard Worker angle::HashMap<uint32_t, VkPushConstantRange> pushConstants; 58*8975f5c5SAndroid Build Coastguard Worker angle::PackedEnumMap<SpecConstantType, uint32_t> specConstantIDs; 59*8975f5c5SAndroid Build Coastguard Worker angle::PackedEnumBitSet<SpecConstantType, uint32_t> specConstantsUsed; 60*8975f5c5SAndroid Build Coastguard Worker angle::HashMap<uint32_t, std::vector<ImagePushConstant>> imagePushConstants; 61*8975f5c5SAndroid Build Coastguard Worker CLKernelArgsMap kernelArgsMap; 62*8975f5c5SAndroid Build Coastguard Worker angle::HashMap<std::string, CLKernelArgument> kernelArgMap; 63*8975f5c5SAndroid Build Coastguard Worker angle::HashSet<uint32_t> kernelIDs; 64*8975f5c5SAndroid Build Coastguard Worker ClspvPrintfBufferStorage printfBufferStorage; 65*8975f5c5SAndroid Build Coastguard Worker angle::HashMap<uint32_t, ClspvPrintfInfo> printfInfoMap; 66*8975f5c5SAndroid Build Coastguard Worker }; 67*8975f5c5SAndroid Build Coastguard Worker 68*8975f5c5SAndroid Build Coastguard Worker // Output binary structure (for CL_PROGRAM_BINARIES query) 69*8975f5c5SAndroid Build Coastguard Worker static constexpr uint32_t kBinaryVersion = 2; 70*8975f5c5SAndroid Build Coastguard Worker struct ProgramBinaryOutputHeader 71*8975f5c5SAndroid Build Coastguard Worker { 72*8975f5c5SAndroid Build Coastguard Worker uint32_t headerVersion{kBinaryVersion}; 73*8975f5c5SAndroid Build Coastguard Worker cl_program_binary_type binaryType{CL_PROGRAM_BINARY_TYPE_NONE}; 74*8975f5c5SAndroid Build Coastguard Worker cl_build_status buildStatus{CL_BUILD_NONE}; 75*8975f5c5SAndroid Build Coastguard Worker }; 76*8975f5c5SAndroid Build Coastguard Worker 77*8975f5c5SAndroid Build Coastguard Worker struct ScopedClspvContext : angle::NonCopyable 78*8975f5c5SAndroid Build Coastguard Worker { 79*8975f5c5SAndroid Build Coastguard Worker ScopedClspvContext() = default; ~ScopedClspvContextScopedClspvContext80*8975f5c5SAndroid Build Coastguard Worker ~ScopedClspvContext() { clspvFreeOutputBuildObjs(mOutputBin, mOutputBuildLog); } 81*8975f5c5SAndroid Build Coastguard Worker 82*8975f5c5SAndroid Build Coastguard Worker size_t mOutputBinSize{0}; 83*8975f5c5SAndroid Build Coastguard Worker char *mOutputBin{nullptr}; 84*8975f5c5SAndroid Build Coastguard Worker char *mOutputBuildLog{nullptr}; 85*8975f5c5SAndroid Build Coastguard Worker }; 86*8975f5c5SAndroid Build Coastguard Worker 87*8975f5c5SAndroid Build Coastguard Worker struct ScopedProgramCallback : angle::NonCopyable 88*8975f5c5SAndroid Build Coastguard Worker { 89*8975f5c5SAndroid Build Coastguard Worker ScopedProgramCallback() = delete; ScopedProgramCallbackScopedProgramCallback90*8975f5c5SAndroid Build Coastguard Worker ScopedProgramCallback(cl::Program *notify) : mNotify(notify) {} ~ScopedProgramCallbackScopedProgramCallback91*8975f5c5SAndroid Build Coastguard Worker ~ScopedProgramCallback() 92*8975f5c5SAndroid Build Coastguard Worker { 93*8975f5c5SAndroid Build Coastguard Worker if (mNotify) 94*8975f5c5SAndroid Build Coastguard Worker { 95*8975f5c5SAndroid Build Coastguard Worker mNotify->callback(); 96*8975f5c5SAndroid Build Coastguard Worker } 97*8975f5c5SAndroid Build Coastguard Worker } 98*8975f5c5SAndroid Build Coastguard Worker 99*8975f5c5SAndroid Build Coastguard Worker cl::Program *mNotify{nullptr}; 100*8975f5c5SAndroid Build Coastguard Worker }; 101*8975f5c5SAndroid Build Coastguard Worker 102*8975f5c5SAndroid Build Coastguard Worker enum class BuildType 103*8975f5c5SAndroid Build Coastguard Worker { 104*8975f5c5SAndroid Build Coastguard Worker BUILD = 0, 105*8975f5c5SAndroid Build Coastguard Worker COMPILE, 106*8975f5c5SAndroid Build Coastguard Worker LINK, 107*8975f5c5SAndroid Build Coastguard Worker BINARY 108*8975f5c5SAndroid Build Coastguard Worker }; 109*8975f5c5SAndroid Build Coastguard Worker 110*8975f5c5SAndroid Build Coastguard Worker struct DeviceProgramData 111*8975f5c5SAndroid Build Coastguard Worker { 112*8975f5c5SAndroid Build Coastguard Worker std::vector<char> IR; 113*8975f5c5SAndroid Build Coastguard Worker std::string buildLog; 114*8975f5c5SAndroid Build Coastguard Worker angle::spirv::Blob binary; 115*8975f5c5SAndroid Build Coastguard Worker SpvReflectionData reflectionData; 116*8975f5c5SAndroid Build Coastguard Worker VkPushConstantRange pushConstRange{}; 117*8975f5c5SAndroid Build Coastguard Worker cl_build_status buildStatus{CL_BUILD_NONE}; 118*8975f5c5SAndroid Build Coastguard Worker cl_program_binary_type binaryType{CL_PROGRAM_BINARY_TYPE_NONE}; 119*8975f5c5SAndroid Build Coastguard Worker numKernelsDeviceProgramData120*8975f5c5SAndroid Build Coastguard Worker size_t numKernels() const { return reflectionData.kernelArgsMap.size(); } 121*8975f5c5SAndroid Build Coastguard Worker numKernelArgsDeviceProgramData122*8975f5c5SAndroid Build Coastguard Worker size_t numKernelArgs(const std::string &kernelName) const 123*8975f5c5SAndroid Build Coastguard Worker { 124*8975f5c5SAndroid Build Coastguard Worker return containsKernel(kernelName) ? getKernelArgsMap().at(kernelName).size() : 0; 125*8975f5c5SAndroid Build Coastguard Worker } 126*8975f5c5SAndroid Build Coastguard Worker getKernelArgsMapDeviceProgramData127*8975f5c5SAndroid Build Coastguard Worker const CLKernelArgsMap &getKernelArgsMap() const { return reflectionData.kernelArgsMap; } 128*8975f5c5SAndroid Build Coastguard Worker containsKernelDeviceProgramData129*8975f5c5SAndroid Build Coastguard Worker bool containsKernel(const std::string &name) const 130*8975f5c5SAndroid Build Coastguard Worker { 131*8975f5c5SAndroid Build Coastguard Worker return reflectionData.kernelArgsMap.contains(name); 132*8975f5c5SAndroid Build Coastguard Worker } 133*8975f5c5SAndroid Build Coastguard Worker getKernelNamesDeviceProgramData134*8975f5c5SAndroid Build Coastguard Worker std::string getKernelNames() const 135*8975f5c5SAndroid Build Coastguard Worker { 136*8975f5c5SAndroid Build Coastguard Worker std::string names; 137*8975f5c5SAndroid Build Coastguard Worker for (auto name = getKernelArgsMap().begin(); name != getKernelArgsMap().end(); ++name) 138*8975f5c5SAndroid Build Coastguard Worker { 139*8975f5c5SAndroid Build Coastguard Worker names += name->first + (std::next(name) != getKernelArgsMap().end() ? ";" : "\0"); 140*8975f5c5SAndroid Build Coastguard Worker } 141*8975f5c5SAndroid Build Coastguard Worker return names; 142*8975f5c5SAndroid Build Coastguard Worker } 143*8975f5c5SAndroid Build Coastguard Worker getKernelFlagsDeviceProgramData144*8975f5c5SAndroid Build Coastguard Worker uint32_t getKernelFlags(const std::string &kernelName) const 145*8975f5c5SAndroid Build Coastguard Worker { 146*8975f5c5SAndroid Build Coastguard Worker if (containsKernel(kernelName)) 147*8975f5c5SAndroid Build Coastguard Worker { 148*8975f5c5SAndroid Build Coastguard Worker return reflectionData.kernelFlags.at(kernelName); 149*8975f5c5SAndroid Build Coastguard Worker } 150*8975f5c5SAndroid Build Coastguard Worker return 0; 151*8975f5c5SAndroid Build Coastguard Worker } 152*8975f5c5SAndroid Build Coastguard Worker getKernelArgumentsDeviceProgramData153*8975f5c5SAndroid Build Coastguard Worker CLKernelArguments getKernelArguments(const std::string &kernelName) const 154*8975f5c5SAndroid Build Coastguard Worker { 155*8975f5c5SAndroid Build Coastguard Worker CLKernelArguments kargsCopy; 156*8975f5c5SAndroid Build Coastguard Worker if (containsKernel(kernelName)) 157*8975f5c5SAndroid Build Coastguard Worker { 158*8975f5c5SAndroid Build Coastguard Worker const CLKernelArguments &kargs = getKernelArgsMap().at(kernelName); 159*8975f5c5SAndroid Build Coastguard Worker for (const CLKernelArgument &karg : kargs) 160*8975f5c5SAndroid Build Coastguard Worker { 161*8975f5c5SAndroid Build Coastguard Worker kargsCopy.push_back(karg); 162*8975f5c5SAndroid Build Coastguard Worker } 163*8975f5c5SAndroid Build Coastguard Worker } 164*8975f5c5SAndroid Build Coastguard Worker return kargsCopy; 165*8975f5c5SAndroid Build Coastguard Worker } 166*8975f5c5SAndroid Build Coastguard Worker getCompiledWorkgroupSizeDeviceProgramData167*8975f5c5SAndroid Build Coastguard Worker cl::WorkgroupSize getCompiledWorkgroupSize(const std::string &kernelName) const 168*8975f5c5SAndroid Build Coastguard Worker { 169*8975f5c5SAndroid Build Coastguard Worker cl::WorkgroupSize compiledWorkgroupSize{0, 0, 0}; 170*8975f5c5SAndroid Build Coastguard Worker if (reflectionData.kernelCompileWorkgroupSize.contains(kernelName)) 171*8975f5c5SAndroid Build Coastguard Worker { 172*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < compiledWorkgroupSize.size(); ++i) 173*8975f5c5SAndroid Build Coastguard Worker { 174*8975f5c5SAndroid Build Coastguard Worker compiledWorkgroupSize[i] = 175*8975f5c5SAndroid Build Coastguard Worker reflectionData.kernelCompileWorkgroupSize.at(kernelName)[i]; 176*8975f5c5SAndroid Build Coastguard Worker } 177*8975f5c5SAndroid Build Coastguard Worker } 178*8975f5c5SAndroid Build Coastguard Worker return compiledWorkgroupSize; 179*8975f5c5SAndroid Build Coastguard Worker } 180*8975f5c5SAndroid Build Coastguard Worker getKernelAttributesDeviceProgramData181*8975f5c5SAndroid Build Coastguard Worker std::string getKernelAttributes(const std::string &kernelName) const 182*8975f5c5SAndroid Build Coastguard Worker { 183*8975f5c5SAndroid Build Coastguard Worker if (containsKernel(kernelName)) 184*8975f5c5SAndroid Build Coastguard Worker { 185*8975f5c5SAndroid Build Coastguard Worker return reflectionData.kernelAttributes.at(kernelName.c_str()); 186*8975f5c5SAndroid Build Coastguard Worker } 187*8975f5c5SAndroid Build Coastguard Worker return std::string{}; 188*8975f5c5SAndroid Build Coastguard Worker } 189*8975f5c5SAndroid Build Coastguard Worker getPushConstantRangeFromClspvReflectionTypeDeviceProgramData190*8975f5c5SAndroid Build Coastguard Worker const VkPushConstantRange *getPushConstantRangeFromClspvReflectionType( 191*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionInstructions type) const 192*8975f5c5SAndroid Build Coastguard Worker { 193*8975f5c5SAndroid Build Coastguard Worker const VkPushConstantRange *pushConstantRangePtr = nullptr; 194*8975f5c5SAndroid Build Coastguard Worker if (reflectionData.pushConstants.contains(type)) 195*8975f5c5SAndroid Build Coastguard Worker { 196*8975f5c5SAndroid Build Coastguard Worker pushConstantRangePtr = &reflectionData.pushConstants.at(type); 197*8975f5c5SAndroid Build Coastguard Worker } 198*8975f5c5SAndroid Build Coastguard Worker return pushConstantRangePtr; 199*8975f5c5SAndroid Build Coastguard Worker } 200*8975f5c5SAndroid Build Coastguard Worker getGlobalOffsetRangeDeviceProgramData201*8975f5c5SAndroid Build Coastguard Worker inline const VkPushConstantRange *getGlobalOffsetRange() const 202*8975f5c5SAndroid Build Coastguard Worker { 203*8975f5c5SAndroid Build Coastguard Worker return getPushConstantRangeFromClspvReflectionType( 204*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionPushConstantGlobalOffset); 205*8975f5c5SAndroid Build Coastguard Worker } 206*8975f5c5SAndroid Build Coastguard Worker getGlobalSizeRangeDeviceProgramData207*8975f5c5SAndroid Build Coastguard Worker inline const VkPushConstantRange *getGlobalSizeRange() const 208*8975f5c5SAndroid Build Coastguard Worker { 209*8975f5c5SAndroid Build Coastguard Worker return getPushConstantRangeFromClspvReflectionType( 210*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionPushConstantGlobalSize); 211*8975f5c5SAndroid Build Coastguard Worker } 212*8975f5c5SAndroid Build Coastguard Worker getEnqueuedLocalSizeRangeDeviceProgramData213*8975f5c5SAndroid Build Coastguard Worker inline const VkPushConstantRange *getEnqueuedLocalSizeRange() const 214*8975f5c5SAndroid Build Coastguard Worker { 215*8975f5c5SAndroid Build Coastguard Worker return getPushConstantRangeFromClspvReflectionType( 216*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionPushConstantEnqueuedLocalSize); 217*8975f5c5SAndroid Build Coastguard Worker } 218*8975f5c5SAndroid Build Coastguard Worker getNumWorkgroupsRangeDeviceProgramData219*8975f5c5SAndroid Build Coastguard Worker inline const VkPushConstantRange *getNumWorkgroupsRange() const 220*8975f5c5SAndroid Build Coastguard Worker { 221*8975f5c5SAndroid Build Coastguard Worker return getPushConstantRangeFromClspvReflectionType( 222*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionPushConstantNumWorkgroups); 223*8975f5c5SAndroid Build Coastguard Worker } 224*8975f5c5SAndroid Build Coastguard Worker getRegionOffsetRangeDeviceProgramData225*8975f5c5SAndroid Build Coastguard Worker inline const VkPushConstantRange *getRegionOffsetRange() const 226*8975f5c5SAndroid Build Coastguard Worker { 227*8975f5c5SAndroid Build Coastguard Worker return getPushConstantRangeFromClspvReflectionType( 228*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionPushConstantRegionOffset); 229*8975f5c5SAndroid Build Coastguard Worker } 230*8975f5c5SAndroid Build Coastguard Worker getRegionGroupOffsetRangeDeviceProgramData231*8975f5c5SAndroid Build Coastguard Worker inline const VkPushConstantRange *getRegionGroupOffsetRange() const 232*8975f5c5SAndroid Build Coastguard Worker { 233*8975f5c5SAndroid Build Coastguard Worker return getPushConstantRangeFromClspvReflectionType( 234*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionPushConstantRegionGroupOffset); 235*8975f5c5SAndroid Build Coastguard Worker } 236*8975f5c5SAndroid Build Coastguard Worker getImageDataChannelOrderRangeDeviceProgramData237*8975f5c5SAndroid Build Coastguard Worker const VkPushConstantRange *getImageDataChannelOrderRange(size_t ordinal) const 238*8975f5c5SAndroid Build Coastguard Worker { 239*8975f5c5SAndroid Build Coastguard Worker const VkPushConstantRange *pushConstantRangePtr = nullptr; 240*8975f5c5SAndroid Build Coastguard Worker if (reflectionData.imagePushConstants.contains( 241*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionImageArgumentInfoChannelOrderPushConstant)) 242*8975f5c5SAndroid Build Coastguard Worker { 243*8975f5c5SAndroid Build Coastguard Worker for (const auto &imageConstant : reflectionData.imagePushConstants.at( 244*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionImageArgumentInfoChannelOrderPushConstant)) 245*8975f5c5SAndroid Build Coastguard Worker { 246*8975f5c5SAndroid Build Coastguard Worker if (static_cast<size_t>(imageConstant.ordinal) == ordinal) 247*8975f5c5SAndroid Build Coastguard Worker { 248*8975f5c5SAndroid Build Coastguard Worker pushConstantRangePtr = &imageConstant.pcRange; 249*8975f5c5SAndroid Build Coastguard Worker } 250*8975f5c5SAndroid Build Coastguard Worker } 251*8975f5c5SAndroid Build Coastguard Worker } 252*8975f5c5SAndroid Build Coastguard Worker return pushConstantRangePtr; 253*8975f5c5SAndroid Build Coastguard Worker } 254*8975f5c5SAndroid Build Coastguard Worker getImageDataChannelDataTypeRangeDeviceProgramData255*8975f5c5SAndroid Build Coastguard Worker const VkPushConstantRange *getImageDataChannelDataTypeRange(size_t ordinal) const 256*8975f5c5SAndroid Build Coastguard Worker { 257*8975f5c5SAndroid Build Coastguard Worker const VkPushConstantRange *pushConstantRangePtr = nullptr; 258*8975f5c5SAndroid Build Coastguard Worker if (reflectionData.imagePushConstants.contains( 259*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionImageArgumentInfoChannelDataTypePushConstant)) 260*8975f5c5SAndroid Build Coastguard Worker { 261*8975f5c5SAndroid Build Coastguard Worker for (const auto &imageConstant : reflectionData.imagePushConstants.at( 262*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionImageArgumentInfoChannelDataTypePushConstant)) 263*8975f5c5SAndroid Build Coastguard Worker { 264*8975f5c5SAndroid Build Coastguard Worker if (static_cast<size_t>(imageConstant.ordinal) == ordinal) 265*8975f5c5SAndroid Build Coastguard Worker { 266*8975f5c5SAndroid Build Coastguard Worker pushConstantRangePtr = &imageConstant.pcRange; 267*8975f5c5SAndroid Build Coastguard Worker } 268*8975f5c5SAndroid Build Coastguard Worker } 269*8975f5c5SAndroid Build Coastguard Worker } 270*8975f5c5SAndroid Build Coastguard Worker return pushConstantRangePtr; 271*8975f5c5SAndroid Build Coastguard Worker } 272*8975f5c5SAndroid Build Coastguard Worker getNormalizedSamplerMaskRangeDeviceProgramData273*8975f5c5SAndroid Build Coastguard Worker const VkPushConstantRange *getNormalizedSamplerMaskRange(size_t ordinal) const 274*8975f5c5SAndroid Build Coastguard Worker { 275*8975f5c5SAndroid Build Coastguard Worker const VkPushConstantRange *pushConstantRangePtr = nullptr; 276*8975f5c5SAndroid Build Coastguard Worker if (reflectionData.imagePushConstants.contains( 277*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionNormalizedSamplerMaskPushConstant)) 278*8975f5c5SAndroid Build Coastguard Worker { 279*8975f5c5SAndroid Build Coastguard Worker for (const auto &imageConstant : reflectionData.imagePushConstants.at( 280*8975f5c5SAndroid Build Coastguard Worker NonSemanticClspvReflectionNormalizedSamplerMaskPushConstant)) 281*8975f5c5SAndroid Build Coastguard Worker { 282*8975f5c5SAndroid Build Coastguard Worker if (static_cast<size_t>(imageConstant.ordinal) == ordinal) 283*8975f5c5SAndroid Build Coastguard Worker { 284*8975f5c5SAndroid Build Coastguard Worker pushConstantRangePtr = &imageConstant.pcRange; 285*8975f5c5SAndroid Build Coastguard Worker } 286*8975f5c5SAndroid Build Coastguard Worker } 287*8975f5c5SAndroid Build Coastguard Worker } 288*8975f5c5SAndroid Build Coastguard Worker return pushConstantRangePtr; 289*8975f5c5SAndroid Build Coastguard Worker } 290*8975f5c5SAndroid Build Coastguard Worker }; 291*8975f5c5SAndroid Build Coastguard Worker using DevicePrograms = angle::HashMap<const _cl_device_id *, DeviceProgramData>; 292*8975f5c5SAndroid Build Coastguard Worker using LinkPrograms = std::vector<const DeviceProgramData *>; 293*8975f5c5SAndroid Build Coastguard Worker using LinkProgramsList = std::vector<LinkPrograms>; 294*8975f5c5SAndroid Build Coastguard Worker 295*8975f5c5SAndroid Build Coastguard Worker CLProgramVk(const cl::Program &program); 296*8975f5c5SAndroid Build Coastguard Worker 297*8975f5c5SAndroid Build Coastguard Worker ~CLProgramVk() override; 298*8975f5c5SAndroid Build Coastguard Worker 299*8975f5c5SAndroid Build Coastguard Worker angle::Result init(); 300*8975f5c5SAndroid Build Coastguard Worker angle::Result init(const size_t *lengths, const unsigned char **binaries, cl_int *binaryStatus); 301*8975f5c5SAndroid Build Coastguard Worker 302*8975f5c5SAndroid Build Coastguard Worker angle::Result build(const cl::DevicePtrs &devices, 303*8975f5c5SAndroid Build Coastguard Worker const char *options, 304*8975f5c5SAndroid Build Coastguard Worker cl::Program *notify) override; 305*8975f5c5SAndroid Build Coastguard Worker 306*8975f5c5SAndroid Build Coastguard Worker angle::Result compile(const cl::DevicePtrs &devices, 307*8975f5c5SAndroid Build Coastguard Worker const char *options, 308*8975f5c5SAndroid Build Coastguard Worker const cl::ProgramPtrs &inputHeaders, 309*8975f5c5SAndroid Build Coastguard Worker const char **headerIncludeNames, 310*8975f5c5SAndroid Build Coastguard Worker cl::Program *notify) override; 311*8975f5c5SAndroid Build Coastguard Worker 312*8975f5c5SAndroid Build Coastguard Worker angle::Result getInfo(cl::ProgramInfo name, 313*8975f5c5SAndroid Build Coastguard Worker size_t valueSize, 314*8975f5c5SAndroid Build Coastguard Worker void *value, 315*8975f5c5SAndroid Build Coastguard Worker size_t *valueSizeRet) const override; 316*8975f5c5SAndroid Build Coastguard Worker 317*8975f5c5SAndroid Build Coastguard Worker angle::Result getBuildInfo(const cl::Device &device, 318*8975f5c5SAndroid Build Coastguard Worker cl::ProgramBuildInfo name, 319*8975f5c5SAndroid Build Coastguard Worker size_t valueSize, 320*8975f5c5SAndroid Build Coastguard Worker void *value, 321*8975f5c5SAndroid Build Coastguard Worker size_t *valueSizeRet) const override; 322*8975f5c5SAndroid Build Coastguard Worker 323*8975f5c5SAndroid Build Coastguard Worker angle::Result createKernel(const cl::Kernel &kernel, 324*8975f5c5SAndroid Build Coastguard Worker const char *name, 325*8975f5c5SAndroid Build Coastguard Worker CLKernelImpl::Ptr *kernelOut) override; 326*8975f5c5SAndroid Build Coastguard Worker 327*8975f5c5SAndroid Build Coastguard Worker angle::Result createKernels(cl_uint numKernels, 328*8975f5c5SAndroid Build Coastguard Worker CLKernelImpl::CreateFuncs &createFuncs, 329*8975f5c5SAndroid Build Coastguard Worker cl_uint *numKernelsRet) override; 330*8975f5c5SAndroid Build Coastguard Worker 331*8975f5c5SAndroid Build Coastguard Worker const DeviceProgramData *getDeviceProgramData(const char *kernelName) const; 332*8975f5c5SAndroid Build Coastguard Worker const DeviceProgramData *getDeviceProgramData(const _cl_device_id *device) const; getPlatform()333*8975f5c5SAndroid Build Coastguard Worker CLPlatformVk *getPlatform() { return mContext->getPlatform(); } getShaderModule()334*8975f5c5SAndroid Build Coastguard Worker const vk::ShaderModulePtr &getShaderModule() const { return mShader; } 335*8975f5c5SAndroid Build Coastguard Worker 336*8975f5c5SAndroid Build Coastguard Worker bool buildInternal(const cl::DevicePtrs &devices, 337*8975f5c5SAndroid Build Coastguard Worker std::string options, 338*8975f5c5SAndroid Build Coastguard Worker std::string internalOptions, 339*8975f5c5SAndroid Build Coastguard Worker BuildType buildType, 340*8975f5c5SAndroid Build Coastguard Worker const LinkProgramsList &LinkProgramsList); 341*8975f5c5SAndroid Build Coastguard Worker angle::spirv::Blob stripReflection(const DeviceProgramData *deviceProgramData); 342*8975f5c5SAndroid Build Coastguard Worker 343*8975f5c5SAndroid Build Coastguard Worker angle::Result allocateDescriptorSet(const DescriptorSetIndex setIndex, 344*8975f5c5SAndroid Build Coastguard Worker const vk::DescriptorSetLayout &descriptorSetLayout, 345*8975f5c5SAndroid Build Coastguard Worker vk::CommandBufferHelperCommon *commandBuffer, 346*8975f5c5SAndroid Build Coastguard Worker vk::DescriptorSetPointer *descriptorSetOut); 347*8975f5c5SAndroid Build Coastguard Worker 348*8975f5c5SAndroid Build Coastguard Worker // Sets the status for given associated device programs 349*8975f5c5SAndroid Build Coastguard Worker void setBuildStatus(const cl::DevicePtrs &devices, cl_build_status status); 350*8975f5c5SAndroid Build Coastguard Worker getMetaDescriptorPool(DescriptorSetIndex index)351*8975f5c5SAndroid Build Coastguard Worker vk::MetaDescriptorPool &getMetaDescriptorPool(DescriptorSetIndex index) 352*8975f5c5SAndroid Build Coastguard Worker { 353*8975f5c5SAndroid Build Coastguard Worker return mMetaDescriptorPools[index]; 354*8975f5c5SAndroid Build Coastguard Worker } 355*8975f5c5SAndroid Build Coastguard Worker getDynamicDescriptorPoolPointer(DescriptorSetIndex index)356*8975f5c5SAndroid Build Coastguard Worker vk::DynamicDescriptorPoolPointer &getDynamicDescriptorPoolPointer(DescriptorSetIndex index) 357*8975f5c5SAndroid Build Coastguard Worker { 358*8975f5c5SAndroid Build Coastguard Worker return mDynamicDescriptorPools[index]; 359*8975f5c5SAndroid Build Coastguard Worker } 360*8975f5c5SAndroid Build Coastguard Worker 361*8975f5c5SAndroid Build Coastguard Worker const angle::HashMap<uint32_t, ClspvPrintfInfo> *getPrintfDescriptors( 362*8975f5c5SAndroid Build Coastguard Worker const std::string &kernelName) const; 363*8975f5c5SAndroid Build Coastguard Worker 364*8975f5c5SAndroid Build Coastguard Worker private: 365*8975f5c5SAndroid Build Coastguard Worker CLContextVk *mContext; 366*8975f5c5SAndroid Build Coastguard Worker std::string mProgramOpts; 367*8975f5c5SAndroid Build Coastguard Worker vk::ShaderModulePtr mShader; 368*8975f5c5SAndroid Build Coastguard Worker DevicePrograms mAssociatedDevicePrograms; 369*8975f5c5SAndroid Build Coastguard Worker vk::DescriptorSetArray<vk::MetaDescriptorPool> mMetaDescriptorPools; 370*8975f5c5SAndroid Build Coastguard Worker vk::DescriptorSetArray<vk::DynamicDescriptorPoolPointer> mDynamicDescriptorPools; 371*8975f5c5SAndroid Build Coastguard Worker angle::SimpleMutex mProgramMutex; 372*8975f5c5SAndroid Build Coastguard Worker 373*8975f5c5SAndroid Build Coastguard Worker std::shared_ptr<angle::WaitableEvent> mAsyncBuildEvent; 374*8975f5c5SAndroid Build Coastguard Worker }; 375*8975f5c5SAndroid Build Coastguard Worker 376*8975f5c5SAndroid Build Coastguard Worker class CLAsyncBuildTask : public angle::Closure 377*8975f5c5SAndroid Build Coastguard Worker { 378*8975f5c5SAndroid Build Coastguard Worker public: CLAsyncBuildTask(CLProgramVk * programVk,const cl::DevicePtrs & devices,std::string options,std::string internalOptions,CLProgramVk::BuildType buildType,const CLProgramVk::LinkProgramsList & LinkProgramsList,cl::Program * notify)379*8975f5c5SAndroid Build Coastguard Worker CLAsyncBuildTask(CLProgramVk *programVk, 380*8975f5c5SAndroid Build Coastguard Worker const cl::DevicePtrs &devices, 381*8975f5c5SAndroid Build Coastguard Worker std::string options, 382*8975f5c5SAndroid Build Coastguard Worker std::string internalOptions, 383*8975f5c5SAndroid Build Coastguard Worker CLProgramVk::BuildType buildType, 384*8975f5c5SAndroid Build Coastguard Worker const CLProgramVk::LinkProgramsList &LinkProgramsList, 385*8975f5c5SAndroid Build Coastguard Worker cl::Program *notify) 386*8975f5c5SAndroid Build Coastguard Worker : mProgramVk(programVk), 387*8975f5c5SAndroid Build Coastguard Worker mDevices(devices), 388*8975f5c5SAndroid Build Coastguard Worker mOptions(options), 389*8975f5c5SAndroid Build Coastguard Worker mInternalOptions(internalOptions), 390*8975f5c5SAndroid Build Coastguard Worker mBuildType(buildType), 391*8975f5c5SAndroid Build Coastguard Worker mLinkProgramsList(LinkProgramsList), 392*8975f5c5SAndroid Build Coastguard Worker mNotify(notify) 393*8975f5c5SAndroid Build Coastguard Worker {} 394*8975f5c5SAndroid Build Coastguard Worker 395*8975f5c5SAndroid Build Coastguard Worker void operator()() override; 396*8975f5c5SAndroid Build Coastguard Worker 397*8975f5c5SAndroid Build Coastguard Worker private: 398*8975f5c5SAndroid Build Coastguard Worker CLProgramVk *mProgramVk; 399*8975f5c5SAndroid Build Coastguard Worker const cl::DevicePtrs mDevices; 400*8975f5c5SAndroid Build Coastguard Worker std::string mOptions; 401*8975f5c5SAndroid Build Coastguard Worker std::string mInternalOptions; 402*8975f5c5SAndroid Build Coastguard Worker CLProgramVk::BuildType mBuildType; 403*8975f5c5SAndroid Build Coastguard Worker const CLProgramVk::LinkProgramsList mLinkProgramsList; 404*8975f5c5SAndroid Build Coastguard Worker cl::Program *mNotify; 405*8975f5c5SAndroid Build Coastguard Worker }; 406*8975f5c5SAndroid Build Coastguard Worker 407*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 408*8975f5c5SAndroid Build Coastguard Worker 409*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_VULKAN_CLPROGRAMVK_H_ 410