// // Copyright (c) 2002-2014 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. // #ifndef COMPILER_TRANSLATOR_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS_H_ #define COMPILER_TRANSLATOR_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS_H_ #include "compiler/translator/IntermNode.h" class ScalarizeVecAndMatConstructorArgs : public TIntermTraverser { public: ScalarizeVecAndMatConstructorArgs(sh::GLenum shaderType, bool fragmentPrecisionHigh) : mTempVarCount(0), mShaderType(shaderType), mFragmentPrecisionHigh(fragmentPrecisionHigh) {} protected: virtual bool visitAggregate(Visit visit, TIntermAggregate *node); private: void scalarizeArgs(TIntermAggregate *aggregate, bool scalarizeVector, bool scalarizeMatrix); // If we have the following code: // mat4 m(0); // vec4 v(1, m); // We will rewrite to: // mat4 m(0); // mat4 _webgl_tmp_mat_0 = m; // vec4 v(1, _webgl_tmp_mat_0[0][0], _webgl_tmp_mat_0[0][1], _webgl_tmp_mat_0[0][2]); // This function is to create nodes for "mat4 _webgl_tmp_mat_0 = m;" and insert it to // the code sequence. // Return the temporary variable name. TString createTempVariable(TIntermTyped *original); std::vector mSequenceStack; int mTempVarCount; sh::GLenum mShaderType; bool mFragmentPrecisionHigh; }; #endif // COMPILER_TRANSLATOR_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS_H_