blob: 83b30e07a39b88f642f5898091afe91daaedbd3f [file]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gpu/command_buffer/tests/lpm/gl_lpm_shader_to_string.h"
#include <string>
#include <utility>
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/protobuf/src/google/protobuf/text_format.h"
class LpmShaderTest
: public ::testing::TestWithParam<std::pair<std::string, std::string>> {};
TEST_P(LpmShaderTest, CheckTranslation) {
const std::pair<std::string, std::string>& param = GetParam();
fuzzing::Shader shader;
EXPECT_TRUE(
google::protobuf::TextFormat::ParseFromString(param.first, &shader));
ASSERT_EQ(gl_lpm_fuzzer::GetShader(shader), param.second);
}
static const char* kProtoAssignment = R"(
functions {
function_name: MAIN
block {
statements {
assignment {
lvalue { var: VAR_0 }
rvalue {}
}
}
}
return_stmt {}
type: VOID_TYPE
})";
static const char* kShaderAssignment = R"(#version 300 es
void main() {
var0 = 1;
return 1;
})";
static const char* kProtoLoop = R"(functions {
function_name: MAIN
block {
statements {
while_stmt {
cond {
binary_op {
op: PLUS
left {
cons {
int32: 0
}
}
right {
}
}
}
body {
}
}
}
}
return_stmt {
}
type: VOID_TYPE
})";
static const char* kShaderLoop = R"(#version 300 es
void main() {
while ((0 + 1)) {
}
return 1;
})";
static const char* kProtoTwoFunctions = R"(functions {
function_name: MAIN
block {
statements {
while_stmt {
cond {
var: VAR_0
}
body {
}
}
}
}
return_stmt {
}
type: VOID_TYPE
}
functions {
function_name: MAIN
block {
statements {
}
}
return_stmt {
}
type: VOID_TYPE
})";
static const char* kShaderTwoFunctions = R"(#version 300 es
void main() {
while (0) {
}
return 1;
}
void main() {
return 1;
})";
static const char* kProtoDeclareFloat = R"(functions {
function_name: NAME_2
block {
}
return_stmt {
}
type: VOID_TYPE
}
functions {
function_name: NAME_1
block {
statements {
declare {
type: VOID_TYPE
var: VAR_2
}
}
}
return_stmt {
}
type: VOID_TYPE
})";
static const char* kShaderDeclareFloat = R"(#version 300 es
void f2() {
return 1;
}
void f1() {
float var2;
return 1;
})";
static const char* kProtoIfElse = R"(functions {
function_name: NAME_2
block {
}
return_stmt {
}
type: VOID_TYPE
}
functions {
function_name: MAIN
block {
statements {
ifelse {
cond {
cons {
int32: 0
}
}
if_body {
}
else_body {
}
}
}
}
return_stmt {
cons {
int32: 0
}
}
type: VOID_TYPE
})";
static const char* kShaderIfElse = R"(#version 300 es
void f2() {
return 1;
}
void main() {
if (0) {
} else {
}
return 0;
})";
static const char* kProtoConstInt32 = R"(functions {
return_stmt {
cons {
int32: 117506048
}
}
})";
static const char* kShaderConstInt32 = R"(#version 300 es
void main() {
return 117506048;
})";
// Uniform only applies at global scope
static const char* kProtoNoLocalUniform = R"(functions {
block {
statements {
while_stmt {
body {
statements {
declare {
qualifier: UNIFORM_QUALIFIER
}
}
}
}
}
}
})";
static const char* kShaderNoLocalUniform = R"(#version 300 es
void main() {
while (1) {
float var0;
}
return;
})";
INSTANTIATE_TEST_SUITE_P(
LpmFuzzer,
LpmShaderTest,
::testing::Values(std::make_pair(kProtoAssignment, kShaderAssignment),
std::make_pair(kProtoLoop, kShaderLoop),
std::make_pair(kProtoTwoFunctions, kShaderTwoFunctions),
std::make_pair(kProtoDeclareFloat, kShaderDeclareFloat),
std::make_pair(kProtoIfElse, kShaderIfElse),
std::make_pair(kProtoConstInt32, kShaderConstInt32),
std::make_pair(kProtoNoLocalUniform,
kShaderNoLocalUniform)));