blob: 90e8b74a239ef039565084e954066d3ebc7cb96b [file] [log] [blame]
//
// 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