sem::Matrix: Pass the column type to the constructor

It's common to want this when indexing matrices.

Change-Id: Ic60a3a8d05873119d78a3cb0860d129e33ac3525
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/49880
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@chromium.org>
This commit is contained in:
Ben Clayton
2021-05-05 16:48:32 +00:00
committed by Commit Bot service account
parent b432f232b5
commit 6c1cf6569e
8 changed files with 53 additions and 30 deletions

View File

@@ -347,8 +347,9 @@ const sem::Type* Resolver::Type(const ast::Type* ty) {
}
if (auto* t = ty->As<ast::Matrix>()) {
if (auto* el = Type(t->type())) {
return builder_->create<sem::Matrix>(const_cast<sem::Type*>(el),
t->rows(), t->columns());
auto* column_type = builder_->create<sem::Vector>(
const_cast<sem::Type*>(el), t->rows());
return builder_->create<sem::Matrix>(column_type, t->columns());
}
return nullptr;
}
@@ -1958,8 +1959,10 @@ bool Resolver::Binary(ast::BinaryExpression* expr) {
auto* rhs_vec = rhs_type->As<sem::Vector>();
const sem::Type* result_type = nullptr;
if (lhs_mat && rhs_mat) {
result_type = builder_->create<sem::Matrix>(
lhs_mat->type(), lhs_mat->rows(), rhs_mat->columns());
auto* column_type =
builder_->create<sem::Vector>(lhs_mat->type(), lhs_mat->rows());
result_type =
builder_->create<sem::Matrix>(column_type, rhs_mat->columns());
} else if (lhs_mat && rhs_vec) {
result_type =
builder_->create<sem::Vector>(lhs_mat->type(), lhs_mat->rows());
@@ -2886,9 +2889,9 @@ const sem::Type* Resolver::Canonical(const sem::Type* type) {
const_cast<sem::Type*>(make_canonical(v->type())), v->size());
}
if (auto* m = ct->As<Matrix>()) {
return builder_->create<Matrix>(
const_cast<sem::Type*>(make_canonical(m->type())), m->rows(),
m->columns());
auto* column_type =
builder_->create<sem::Vector>(make_canonical(m->type()), m->rows());
return builder_->create<Matrix>(column_type, m->columns());
}
if (auto* ac = ct->As<AccessControl>()) {
return builder_->create<AccessControl>(ac->access_control(),

View File

@@ -239,17 +239,20 @@ sem::Type* sem_vec4(const ProgramBuilder::TypesBuilder& ty) {
template <create_sem_type_func_ptr create_type>
sem::Type* sem_mat2x2(const ProgramBuilder::TypesBuilder& ty) {
return ty.builder->create<sem::Matrix>(create_type(ty), 2, 2);
auto* column_type = ty.builder->create<sem::Vector>(create_type(ty), 2u);
return ty.builder->create<sem::Matrix>(column_type, 2u);
}
template <create_sem_type_func_ptr create_type>
sem::Type* sem_mat3x3(const ProgramBuilder::TypesBuilder& ty) {
return ty.builder->create<sem::Matrix>(create_type(ty), 3, 3);
auto* column_type = ty.builder->create<sem::Vector>(create_type(ty), 3u);
return ty.builder->create<sem::Matrix>(column_type, 3u);
}
template <create_sem_type_func_ptr create_type>
sem::Type* sem_mat4x4(const ProgramBuilder::TypesBuilder& ty) {
return ty.builder->create<sem::Matrix>(create_type(ty), 4, 4);
auto* column_type = ty.builder->create<sem::Vector>(create_type(ty), 4u);
return ty.builder->create<sem::Matrix>(column_type, 4u);
}
template <create_sem_type_func_ptr create_type>