| // | |
| // Copyright (c) 2002-2010 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. | |
| // | |
| // UnfoldSelect is an AST traverser to output the select operator ?: as if-else statements | |
| // | |
| #include "compiler/UnfoldSelect.h" | |
| #include "compiler/InfoSink.h" | |
| #include "compiler/OutputHLSL.h" | |
| namespace sh | |
| { | |
| UnfoldSelect::UnfoldSelect(TParseContext &context, OutputHLSL *outputHLSL) : mContext(context), mOutputHLSL(outputHLSL) | |
| { | |
| mTemporaryIndex = 0; | |
| } | |
| void UnfoldSelect::traverse(TIntermNode *node) | |
| { | |
| mTemporaryIndex++; | |
| node->traverse(this); | |
| } | |
| bool UnfoldSelect::visitSelection(Visit visit, TIntermSelection *node) | |
| { | |
| TInfoSinkBase &out = mOutputHLSL->getBodyStream(); | |
| if (node->usesTernaryOperator()) | |
| { | |
| int i = mTemporaryIndex++; | |
| out << mOutputHLSL->typeString(node->getType()) << " t" << i << ";\n"; | |
| node->getCondition()->traverse(this); | |
| out << "if("; | |
| node->getCondition()->traverse(mOutputHLSL); | |
| out << ")\n" | |
| "{\n"; | |
| node->getTrueBlock()->traverse(this); | |
| out << " t" << i << " = "; | |
| node->getTrueBlock()->traverse(mOutputHLSL); | |
| out << ";\n" | |
| "}\n" | |
| "else\n" | |
| "{\n"; | |
| node->getFalseBlock()->traverse(this); | |
| out << " t" << i << " = "; | |
| node->getFalseBlock()->traverse(mOutputHLSL); | |
| out << ";\n" | |
| "}\n"; | |
| mTemporaryIndex--; | |
| } | |
| return false; | |
| } | |
| int UnfoldSelect::getTemporaryIndex() | |
| { | |
| return mTemporaryIndex; | |
| } | |
| } |