//
// Copyright (c) 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_

namespace sh
{
class TIntermNode;
class TSymbolTable;

void RewriteAtomicFunctionExpressions(TIntermNode *root,
                                      TSymbolTable *symbolTable,
                                      int shaderVersion);
}  // namespace sh

#endif  // COMPILER_TRANSLATOR_TREEOPS_REWRITE_ATOMIC_FUNCTION_EXPRESSIONS_H_