| // | |
| // Copyright 2018 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. | |
| // | |
| // RewriteAtomicFunctionExpressions rewrites the expressions that contain | |
| // atomic function calls and cannot be directly translated into HLSL into | |
| // several simple ones that can be easily handled in the HLSL translator. | |
| // | |
| // We need to rewite these expressions because: | |
| // 1. All GLSL atomic functions have return values, which all represent the | |
| // original value of the shared or ssbo variable; while all HLSL atomic | |
| // functions don't, and the original value can be stored in the last | |
| // parameter of the function call. | |
| // 2. For HLSL atomic functions, the last parameter that stores the original | |
| // value is optional except for InterlockedExchange and | |
| // InterlockedCompareExchange. Missing original_value in the call of | |
| // InterlockedExchange or InterlockedCompareExchange results in a compile | |
| // error from HLSL compiler. | |
| // | |
| // RewriteAtomicFunctionExpressions is a function that can modify the AST | |
| // to ensure all the expressions that contain atomic function calls can be | |
| // directly translated into HLSL expressions. | |
| #ifndef COMPILER_TRANSLATOR_TREEOPS_REWRITE_ATOMIC_FUNCTION_EXPRESSIONS_H_ | |
| #define COMPILER_TRANSLATOR_TREEOPS_REWRITE_ATOMIC_FUNCTION_EXPRESSIONS_H_ | |
| #include "common/angleutils.h" | |
| namespace sh | |
| { | |
| class TCompiler; | |
| class TIntermNode; | |
| class TSymbolTable; | |
| ANGLE_NO_DISCARD bool RewriteAtomicFunctionExpressions(TCompiler *compiler, | |
| TIntermNode *root, | |
| TSymbolTable *symbolTable, | |
| int shaderVersion); | |
| } // namespace sh | |
| #endif // COMPILER_TRANSLATOR_TREEOPS_REWRITE_ATOMIC_FUNCTION_EXPRESSIONS_H_ |