// // Copyright 2021 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // MonomorphizeUnsupportedFunctions: Monomorphize functions that are called with // parameters that are incompatible with both Vulkan GLSL and Metal: // // - Samplers in structs // - Structs that have samplers // - Partially subscripted array of array of samplers // - Partially subscripted array of array of images // - Atomic counters // - samplerCube variables when emulating ES2's cube map sampling // - image* variables with r32f formats (to emulate imageAtomicExchange) // // This transformation basically duplicates such functions, removes the // sampler/image/atomic_counter parameters and uses the opaque uniforms used by the caller. #ifndef COMPILER_TRANSLATOR_TREEOPS_VULKAN_MONOMORPHIZEUNSUPPORTEDFUNCTIONS_H_ #define COMPILER_TRANSLATOR_TREEOPS_VULKAN_MONOMORPHIZEUNSUPPORTEDFUNCTIONS_H_ #include "common/angleutils.h" #include "compiler/translator/Compiler.h" namespace sh { class TIntermBlock; class TSymbolTable; // Types of function prameters that should trigger monomorphization. enum class UnsupportedFunctionArgs { StructContainingSamplers = 0, ArrayOfArrayOfSamplerOrImage = 1, AtomicCounter = 2, SamplerCubeEmulation = 3, Image = 4, PixelLocalStorage = 5, InvalidEnum = 6, EnumCount = 6, }; using UnsupportedFunctionArgsBitSet = angle::PackedEnumBitSet; [[nodiscard]] bool MonomorphizeUnsupportedFunctions(TCompiler *compiler, TIntermBlock *root, TSymbolTable *symbolTable, const ShCompileOptions &compileOptions, UnsupportedFunctionArgsBitSet); } // namespace sh #endif // COMPILER_TRANSLATOR_TREEOPS_VULKAN_MONOMORPHIZEUNSUPPORTEDFUNCTIONS_H_