// // Copyright 2017 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. // // InitializeUninitializedVariables_test.cpp: Tests InitializeUninitializedVariables pass. // #include "common/angleutils.h" #include "tests/test_utils/compiler_test.h" namespace sh { namespace { class InitializeUninitializedVariables : public MatchOutputCodeTest { public: InitializeUninitializedVariables() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, SH_ESSL_OUTPUT) { ShCompileOptions options{}; options.intermediateTree = true; options.initializeUninitializedLocals = true; options.validateAST = true; setDefaultCompileOptions(options); } }; // Tests that when unnamed variables must be initialized, the variables get internal names. TEST_F(InitializeUninitializedVariables, VariableNamesInPrototypesUnnamedOut) { const char kShader[] = R"(#version 300 es precision highp float; out vec4 o; void f(out float, out float); void main() { o = vec4(0.5); f(o.r, o.g); } void f(out float r, out float) { r = 1.0; } )"; const char kExpected[] = R"(#version 300 es out highp vec4 _uo; void _uf(out highp float _ur, out highp float sbc2); void main(){ (_uo = vec4(0.5, 0.5, 0.5, 0.5)); _uf(_uo.x, _uo.y); } void _uf(out highp float _ur, out highp float sbc2){ (_ur = 0.0); (sbc2 = 0.0); (_ur = 1.0); } )"; compile(kShader); EXPECT_EQ(kExpected, outputCode(SH_ESSL_OUTPUT)); } // Tests that when unnamed variables must be initialized, the variables get internal names. TEST_F(InitializeUninitializedVariables, VariableNamesInPrototypesUnnamedOut2) { const char kShader[] = R"(#version 300 es precision highp float; out vec4 o; void f(out float, out float); void g(out float a, out float b) { f(a, b); } void main() { o = vec4(0.5); g(o.r, o.g); } void f(out float r, out float) { r = 1.0; } )"; const char kExpected[] = R"(#version 300 es out highp vec4 _uo; void _uf(out highp float _ur, out highp float sbc5); void _ug(out highp float _ua, out highp float _ub){ (_ua = 0.0); (_ub = 0.0); _uf(_ua, _ub); } void main(){ (_uo = vec4(0.5, 0.5, 0.5, 0.5)); _ug(_uo.x, _uo.y); } void _uf(out highp float _ur, out highp float sbc5){ (_ur = 0.0); (sbc5 = 0.0); (_ur = 1.0); } )"; compile(kShader); EXPECT_EQ(kExpected, outputCode(SH_ESSL_OUTPUT)); } // Tests that when unnamed variables must be initialized, the variables get internal names. // Tests the case where local z is initialized with a function f, when f must be rewritten. TEST_F(InitializeUninitializedVariables, VariableNamesInPrototypesUnnamedOut3) { const char kShader[] = R"(#version 300 es precision highp float; out vec4 o; float f(out float r, out float) { r = 1.0; return 3.0; } void main() { o = vec4(0.5); float z = f(o.r, o.g); } )"; const char kExpected[] = R"(#version 300 es out highp vec4 _uo; highp float _uf(out highp float _ur, out highp float sbc0){ (_ur = 0.0); (sbc0 = 0.0); (_ur = 1.0); return 3.0; } void main(){ (_uo = vec4(0.5, 0.5, 0.5, 0.5)); highp float _uz = _uf(_uo.x, _uo.y); } )"; compile(kShader); EXPECT_EQ(kExpected, outputCode(SH_ESSL_OUTPUT)); } } // namespace } // namespace sh