// // 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. // // RewriteR32fImages: Change images qualified with r32f to use r32ui instead. // #include "compiler/translator/tree_ops/spirv/RewriteR32fImages.h" #include "compiler/translator/Compiler.h" #include "compiler/translator/ImmutableStringBuilder.h" #include "compiler/translator/StaticType.h" #include "compiler/translator/SymbolTable.h" #include "compiler/translator/tree_util/IntermNode_util.h" #include "compiler/translator/tree_util/IntermTraverse.h" #include "compiler/translator/tree_util/ReplaceVariable.h" namespace sh { namespace { bool IsR32fImage(const TType &type) { … } ImageMap; TIntermTyped *RewriteBuiltinFunctionCall(TCompiler *compiler, TSymbolTable *symbolTable, TIntermAggregate *node, const ImageMap &imageMap); // Given an expression, this traverser calculates a new expression where builtin function calls to // r32f images are replaced with ones to the mapped r32ui image. In particular, this is run on the // right node of EOpIndexIndirect binary nodes, so that the expression in the index gets a chance to // go through this transformation. class RewriteExpressionTraverser final : public TIntermTraverser { … }; // Rewrite the index of an EOpIndexIndirect expression as well as any arguments to the builtin // function call. TIntermTyped *RewriteExpression(TCompiler *compiler, TSymbolTable *symbolTable, TIntermTyped *expression, const ImageMap &imageMap) { … } // Given a builtin function call such as the following: // // imageLoad(expression, ...); // // expression is in the form of: // // - image uniform // - image uniform array indexed with EOpIndexDirect or EOpIndexIndirect. Note that // RewriteArrayOfArrayOfOpaqueUniforms has already ensured that the image array is // single-dimension. // // The latter case (with EOpIndexIndirect) is not valid GLSL (up to GL_EXT_gpu_shader5), but if it // were, the index itself could have contained an image builtin function call, so is recursively // processed (in case supported in future). Additionally, the other builtin function arguments may // need processing too. // // This function creates a similar expression where the image uniforms (of type r32f) are replaced // with those of r32ui type. // TIntermTyped *RewriteBuiltinFunctionCall(TCompiler *compiler, TSymbolTable *symbolTable, TIntermAggregate *node, const ImageMap &imageMap) { … } // Traverser that: // // 1. Converts the layout(r32f, ...) ... image* name; declarations to use the r32ui format // 2. Converts |imageLoad| and |imageStore| functions to use |uintBitsToFloat| and |floatBitsToUint| // respectively. // 3. Converts |imageAtomicExchange| to use |floatBitsToUint| and |uintBitsToFloat|. class RewriteR32fImagesTraverser : public TIntermTraverser { … }; } // anonymous namespace bool RewriteR32fImages(TCompiler *compiler, TIntermBlock *root, TSymbolTable *symbolTable) { … } } // namespace sh