Generate 3 param GLSL methods.
This CL adds the needed code to handle three parameter methods in the type determinater. Bug: tint:5 Change-Id: Id8584fbb1d308de585b59a4034e184b41f5bd74c Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/20141 Reviewed-by: David Neto <dneto@google.com>
This commit is contained in:
parent
21244880f8
commit
2287d01233
|
@ -733,6 +733,42 @@ ast::type::Type* TypeDeterminer::GetImportData(
|
|||
: result_type->AsVector()->type();
|
||||
}
|
||||
|
||||
return result_type;
|
||||
} else if (name == "fclamp" || name == "fmix" || name == "smoothstep" ||
|
||||
name == "fma" || name == "nclamp" || name == "faceforward") {
|
||||
if (params.size() != 3) {
|
||||
error_ = "incorrect number of parameters for " + name +
|
||||
". Expected 3 got " + std::to_string(params.size());
|
||||
return nullptr;
|
||||
}
|
||||
if (!params[0]->result_type()->is_float_scalar_or_vector() ||
|
||||
!params[1]->result_type()->is_float_scalar_or_vector() ||
|
||||
!params[2]->result_type()->is_float_scalar_or_vector()) {
|
||||
error_ = "incorrect type for " + name +
|
||||
". Requires float scalar or a float vector values";
|
||||
return nullptr;
|
||||
}
|
||||
if (params[0]->result_type() != params[1]->result_type() ||
|
||||
params[0]->result_type() != params[2]->result_type()) {
|
||||
error_ = "mismatched parameter types for " + name;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto* result_type = params[0]->result_type();
|
||||
if (name == "fclamp") {
|
||||
*id = GLSLstd450FClamp;
|
||||
} else if (name == "fmix") {
|
||||
*id = GLSLstd450FMix;
|
||||
} else if (name == "smoothstep") {
|
||||
*id = GLSLstd450SmoothStep;
|
||||
} else if (name == "fma") {
|
||||
*id = GLSLstd450Fma;
|
||||
} else if (name == "nclamp") {
|
||||
*id = GLSLstd450NClamp;
|
||||
} else if (name == "faceforward") {
|
||||
*id = GLSLstd450FaceForward;
|
||||
}
|
||||
|
||||
return result_type;
|
||||
}
|
||||
|
||||
|
|
|
@ -2130,5 +2130,265 @@ TEST_F(TypeDeterminerTest, ImportData_Distance_Error_TooManyParams) {
|
|||
"incorrect number of parameters for distance. Expected 2 got 3");
|
||||
}
|
||||
|
||||
using ImportData_ThreeParamTest = TypeDeterminerTestWithParam<GLSLData>;
|
||||
|
||||
TEST_P(ImportData_ThreeParamTest, Scalar) {
|
||||
auto param = GetParam();
|
||||
|
||||
ast::type::F32Type f32;
|
||||
|
||||
ast::ExpressionList params;
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.f)));
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.f)));
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.f)));
|
||||
|
||||
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
|
||||
|
||||
uint32_t id = 0;
|
||||
auto* type =
|
||||
td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
|
||||
ASSERT_NE(type, nullptr);
|
||||
EXPECT_TRUE(type->is_float_scalar());
|
||||
EXPECT_EQ(id, param.value);
|
||||
}
|
||||
|
||||
TEST_P(ImportData_ThreeParamTest, Vector) {
|
||||
auto param = GetParam();
|
||||
|
||||
ast::type::F32Type f32;
|
||||
ast::type::VectorType vec(&f32, 3);
|
||||
|
||||
ast::ExpressionList vals_1;
|
||||
vals_1.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals_1.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals_1.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 3.0f)));
|
||||
|
||||
ast::ExpressionList vals_2;
|
||||
vals_2.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals_2.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals_2.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 3.0f)));
|
||||
|
||||
ast::ExpressionList vals_3;
|
||||
vals_3.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals_3.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals_3.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 3.0f)));
|
||||
|
||||
ast::ExpressionList params;
|
||||
params.push_back(std::make_unique<ast::TypeConstructorExpression>(
|
||||
&vec, std::move(vals_1)));
|
||||
params.push_back(std::make_unique<ast::TypeConstructorExpression>(
|
||||
&vec, std::move(vals_2)));
|
||||
params.push_back(std::make_unique<ast::TypeConstructorExpression>(
|
||||
&vec, std::move(vals_3)));
|
||||
|
||||
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
|
||||
|
||||
uint32_t id = 0;
|
||||
auto* type =
|
||||
td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
|
||||
ASSERT_NE(type, nullptr);
|
||||
EXPECT_TRUE(type->is_float_vector());
|
||||
EXPECT_EQ(type->AsVector()->size(), 3);
|
||||
EXPECT_EQ(id, param.value);
|
||||
}
|
||||
|
||||
TEST_P(ImportData_ThreeParamTest, Error_Integer) {
|
||||
auto param = GetParam();
|
||||
|
||||
ast::type::I32Type i32;
|
||||
|
||||
ast::ExpressionList params;
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::IntLiteral>(&i32, 1)));
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::IntLiteral>(&i32, 2)));
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::IntLiteral>(&i32, 3)));
|
||||
|
||||
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
|
||||
|
||||
uint32_t id = 0;
|
||||
auto* type =
|
||||
td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
|
||||
ASSERT_EQ(type, nullptr);
|
||||
EXPECT_EQ(td()->error(),
|
||||
std::string("incorrect type for ") + param.name +
|
||||
". Requires float scalar or a float vector values");
|
||||
}
|
||||
|
||||
TEST_P(ImportData_ThreeParamTest, Error_NoParams) {
|
||||
auto param = GetParam();
|
||||
|
||||
ast::ExpressionList params;
|
||||
uint32_t id = 0;
|
||||
auto* type =
|
||||
td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
|
||||
ASSERT_EQ(type, nullptr);
|
||||
EXPECT_EQ(td()->error(), std::string("incorrect number of parameters for ") +
|
||||
param.name + ". Expected 3 got 0");
|
||||
}
|
||||
|
||||
TEST_P(ImportData_ThreeParamTest, Error_OneParam) {
|
||||
auto param = GetParam();
|
||||
|
||||
ast::type::F32Type f32;
|
||||
ast::ExpressionList params;
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.f)));
|
||||
|
||||
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
|
||||
|
||||
uint32_t id = 0;
|
||||
auto* type =
|
||||
td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
|
||||
ASSERT_EQ(type, nullptr);
|
||||
EXPECT_EQ(td()->error(), std::string("incorrect number of parameters for ") +
|
||||
param.name + ". Expected 3 got 1");
|
||||
}
|
||||
|
||||
TEST_P(ImportData_ThreeParamTest, Error_TwoParams) {
|
||||
auto param = GetParam();
|
||||
|
||||
ast::type::F32Type f32;
|
||||
ast::ExpressionList params;
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.f)));
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.f)));
|
||||
|
||||
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
|
||||
|
||||
uint32_t id = 0;
|
||||
auto* type =
|
||||
td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
|
||||
ASSERT_EQ(type, nullptr);
|
||||
EXPECT_EQ(td()->error(), std::string("incorrect number of parameters for ") +
|
||||
param.name + ". Expected 3 got 2");
|
||||
}
|
||||
|
||||
TEST_P(ImportData_ThreeParamTest, Error_MismatchedParamCount) {
|
||||
auto param = GetParam();
|
||||
|
||||
ast::type::F32Type f32;
|
||||
ast::type::VectorType vec2(&f32, 2);
|
||||
ast::type::VectorType vec3(&f32, 3);
|
||||
|
||||
ast::ExpressionList vals_1;
|
||||
vals_1.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals_1.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
|
||||
ast::ExpressionList vals_2;
|
||||
vals_2.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals_2.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals_2.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 3.0f)));
|
||||
|
||||
ast::ExpressionList vals_3;
|
||||
vals_3.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals_3.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals_3.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 3.0f)));
|
||||
|
||||
ast::ExpressionList params;
|
||||
params.push_back(std::make_unique<ast::TypeConstructorExpression>(
|
||||
&vec2, std::move(vals_1)));
|
||||
params.push_back(std::make_unique<ast::TypeConstructorExpression>(
|
||||
&vec3, std::move(vals_2)));
|
||||
params.push_back(std::make_unique<ast::TypeConstructorExpression>(
|
||||
&vec3, std::move(vals_3)));
|
||||
|
||||
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
|
||||
|
||||
uint32_t id = 0;
|
||||
auto* type =
|
||||
td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
|
||||
ASSERT_EQ(type, nullptr);
|
||||
EXPECT_EQ(td()->error(),
|
||||
std::string("mismatched parameter types for ") + param.name);
|
||||
}
|
||||
|
||||
TEST_P(ImportData_ThreeParamTest, Error_MismatchedParamType) {
|
||||
auto param = GetParam();
|
||||
|
||||
ast::type::F32Type f32;
|
||||
ast::type::VectorType vec(&f32, 3);
|
||||
|
||||
ast::ExpressionList vals;
|
||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
vals.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 3.0f)));
|
||||
|
||||
ast::ExpressionList params;
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.0f)));
|
||||
params.push_back(
|
||||
std::make_unique<ast::TypeConstructorExpression>(&vec, std::move(vals)));
|
||||
|
||||
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
|
||||
|
||||
uint32_t id = 0;
|
||||
auto* type =
|
||||
td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
|
||||
ASSERT_EQ(type, nullptr);
|
||||
EXPECT_EQ(td()->error(),
|
||||
std::string("mismatched parameter types for ") + param.name);
|
||||
}
|
||||
|
||||
TEST_P(ImportData_ThreeParamTest, Error_TooManyParams) {
|
||||
auto param = GetParam();
|
||||
|
||||
ast::type::F32Type f32;
|
||||
ast::ExpressionList params;
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.f)));
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.f)));
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.f)));
|
||||
params.push_back(std::make_unique<ast::ScalarConstructorExpression>(
|
||||
std::make_unique<ast::FloatLiteral>(&f32, 1.f)));
|
||||
|
||||
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
|
||||
|
||||
uint32_t id = 0;
|
||||
auto* type =
|
||||
td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
|
||||
ASSERT_EQ(type, nullptr);
|
||||
EXPECT_EQ(td()->error(), std::string("incorrect number of parameters for ") +
|
||||
param.name + ". Expected 3 got 4");
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
TypeDeterminerTest,
|
||||
ImportData_ThreeParamTest,
|
||||
testing::Values(GLSLData{"fclamp", GLSLstd450FClamp},
|
||||
GLSLData{"fmix", GLSLstd450FMix},
|
||||
GLSLData{"smoothstep", GLSLstd450SmoothStep},
|
||||
GLSLData{"fma", GLSLstd450Fma},
|
||||
GLSLData{"faceforward", GLSLstd450FaceForward},
|
||||
GLSLData{"nclamp", GLSLstd450NClamp}));
|
||||
} // namespace
|
||||
} // namespace tint
|
||||
|
|
Loading…
Reference in New Issue