// // 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; } }