writer/hlsl: Clean up vector type emission

For HLSL emission instead of:
  `vector<float, N>` emit `floatN`
  `vector<int, N>` emit `intN`
  `vector<uint, N>` emit `uintN`

These are significantly shorter, more idiomatic, and is far easier to read.

Change-Id: Idef8cc550e0b49cc919087e281b72a7a0a0f11bc
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/33424
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index d0279cb..2fa9d83 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -2036,11 +2036,20 @@
     out << "uint";
   } else if (type->IsVector()) {
     auto* vec = type->AsVector();
-    out << "vector<";
-    if (!EmitType(out, vec->type(), "")) {
-      return false;
+    auto size = vec->size();
+    if (vec->type()->IsF32() && size >= 1 && size <= 4) {
+      out << "float" << size;
+    } else if (vec->type()->IsI32() && size >= 1 && size <= 4) {
+      out << "int" << size;
+    } else if (vec->type()->IsU32() && size >= 1 && size <= 4) {
+      out << "uint" << size;
+    } else {
+      out << "vector<";
+      if (!EmitType(out, vec->type(), "")) {
+        return false;
+      }
+      out << ", " << size << ">";
     }
-    out << ", " << vec->size() << ">";
   } else if (type->IsVoid()) {
     out << "void";
   } else {
diff --git a/src/writer/hlsl/generator_impl_cast_test.cc b/src/writer/hlsl/generator_impl_cast_test.cc
index f2fbcde..8002e27 100644
--- a/src/writer/hlsl/generator_impl_cast_test.cc
+++ b/src/writer/hlsl/generator_impl_cast_test.cc
@@ -50,7 +50,7 @@
   ast::TypeConstructorExpression cast(&vec3, params);
 
   ASSERT_TRUE(gen.EmitExpression(pre, out, &cast)) << gen.error();
-  EXPECT_EQ(result(), "vector<float, 3>(id)");
+  EXPECT_EQ(result(), "float3(id)");
 }
 
 }  // namespace
diff --git a/src/writer/hlsl/generator_impl_constructor_test.cc b/src/writer/hlsl/generator_impl_constructor_test.cc
index c0512e5..c17d547 100644
--- a/src/writer/hlsl/generator_impl_constructor_test.cc
+++ b/src/writer/hlsl/generator_impl_constructor_test.cc
@@ -140,8 +140,7 @@
   ast::TypeConstructorExpression expr(&vec, values);
 
   ASSERT_TRUE(gen.EmitConstructor(pre, out, &expr)) << gen.error();
-  EXPECT_EQ(result(),
-            "vector<float, 3>(1.00000000f, 2.00000000f, 3.00000000f)");
+  EXPECT_EQ(result(), "float3(1.00000000f, 2.00000000f, 3.00000000f)");
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Vec_Empty) {
@@ -152,7 +151,7 @@
   ast::TypeConstructorExpression expr(&vec, values);
 
   ASSERT_TRUE(gen.EmitConstructor(pre, out, &expr)) << gen.error();
-  EXPECT_EQ(result(), "vector<float, 3>(0.0f)");
+  EXPECT_EQ(result(), "float3(0.0f)");
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Mat) {
@@ -187,10 +186,9 @@
 
   // A matrix of type T with n columns and m rows can also be constructed from
   // n vectors of type T with m components.
-  EXPECT_EQ(result(),
-            std::string("matrix<float, 3, 2>(vector<float, 3>(1.00000000f, "
-                        "2.00000000f, 3.00000000f), ") +
-                "vector<float, 3>(3.00000000f, 4.00000000f, 5.00000000f))");
+  EXPECT_EQ(result(), std::string("matrix<float, 3, 2>(float3(1.00000000f, "
+                                  "2.00000000f, 3.00000000f), ") +
+                          "float3(3.00000000f, 4.00000000f, 5.00000000f))");
 }
 
 TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Array) {
@@ -219,11 +217,10 @@
   ast::TypeConstructorExpression expr(&ary, ary_values);
 
   ASSERT_TRUE(gen.EmitConstructor(pre, out, &expr)) << gen.error();
-  EXPECT_EQ(result(),
-            std::string("{") +
-                "vector<float, 3>(1.00000000f, 2.00000000f, 3.00000000f), " +
-                "vector<float, 3>(4.00000000f, 5.00000000f, 6.00000000f), " +
-                "vector<float, 3>(7.00000000f, 8.00000000f, 9.00000000f)}");
+  EXPECT_EQ(result(), std::string("{") +
+                          "float3(1.00000000f, 2.00000000f, 3.00000000f), " +
+                          "float3(4.00000000f, 5.00000000f, 6.00000000f), " +
+                          "float3(7.00000000f, 8.00000000f, 9.00000000f)}");
 }
 
 // TODO(dsinclair): Add struct constructor test.
diff --git a/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc b/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
index 9215cca..d224ccc 100644
--- a/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
+++ b/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
@@ -364,7 +364,7 @@
   // [[builtin frag_depth]] var<out> depth : f32;
   //
   // struct main_in {
-  //   vector<float, 4> coord : SV_Position;
+  //   float4 coord : SV_Position;
   // };
   //
   // struct main_out {
@@ -410,7 +410,7 @@
   ASSERT_TRUE(td.Determine()) << td.error();
   ASSERT_TRUE(gen.EmitEntryPointData(out, func, globals)) << gen.error();
   EXPECT_EQ(result(), R"(struct main_in {
-  vector<float, 4> coord : SV_Position;
+  float4 coord : SV_Position;
 };
 
 struct main_out {
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index 9d84e94..9d07d84 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -207,7 +207,7 @@
   ASSERT_TRUE(td.Determine()) << td.error();
   ASSERT_TRUE(gen.Generate(out)) << gen.error();
   EXPECT_EQ(result(), R"(struct frag_main_in {
-  vector<float, 4> coord : SV_Position;
+  float4 coord : SV_Position;
 };
 
 struct frag_main_out {
@@ -258,7 +258,7 @@
   ASSERT_TRUE(td.Determine()) << td.error();
   ASSERT_TRUE(gen.Generate(out)) << gen.error();
   EXPECT_EQ(result(), R"(cbuffer : register(b0) {
-  vector<float, 4> coord;
+  float4 coord;
 };
 
 void frag_main() {
@@ -317,7 +317,7 @@
   ASSERT_TRUE(td.Determine()) << td.error();
   ASSERT_TRUE(gen.Generate(out)) << gen.error();
   EXPECT_EQ(result(), R"(struct Uniforms {
-  vector<float, 4> coord;
+  float4 coord;
 };
 
 ConstantBuffer<Uniforms> uniforms : register(b0);
@@ -717,7 +717,7 @@
   ASSERT_TRUE(td.Determine()) << td.error();
   ASSERT_TRUE(gen.Generate(out)) << gen.error();
   EXPECT_EQ(result(), R"(struct ep_1_in {
-  vector<float, 4> coord : SV_Position;
+  float4 coord : SV_Position;
 };
 
 struct ep_1_out {
@@ -789,7 +789,7 @@
   ASSERT_TRUE(td.Determine()) << td.error();
   ASSERT_TRUE(gen.Generate(out)) << gen.error();
   EXPECT_EQ(result(), R"(cbuffer : register(b0) {
-  vector<float, 4> coord;
+  float4 coord;
 };
 
 float sub_func(float param) {
diff --git a/src/writer/hlsl/generator_impl_import_test.cc b/src/writer/hlsl/generator_impl_import_test.cc
index bfb5a85..fff3fcd 100644
--- a/src/writer/hlsl/generator_impl_import_test.cc
+++ b/src/writer/hlsl/generator_impl_import_test.cc
@@ -176,10 +176,9 @@
 
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
   ASSERT_TRUE(gen.EmitCall(pre, out, &expr)) << gen.error();
-  EXPECT_EQ(result(),
-            std::string(param.hlsl_name) +
-                "(vector<float, 3>(1.00000000f, 2.00000000f, 3.00000000f), "
-                "vector<float, 3>(4.00000000f, 5.00000000f, 6.00000000f))");
+  EXPECT_EQ(result(), std::string(param.hlsl_name) +
+                          "(float3(1.00000000f, 2.00000000f, 3.00000000f), "
+                          "float3(4.00000000f, 5.00000000f, 6.00000000f))");
 }
 INSTANTIATE_TEST_SUITE_P(HlslGeneratorImplTest_Import,
                          HlslImportData_DualParam_VectorTest,
diff --git a/src/writer/hlsl/generator_impl_member_accessor_test.cc b/src/writer/hlsl/generator_impl_member_accessor_test.cc
index 7005f7e..f0c4592 100644
--- a/src/writer/hlsl/generator_impl_member_accessor_test.cc
+++ b/src/writer/hlsl/generator_impl_member_accessor_test.cc
@@ -780,7 +780,7 @@
   // var<storage_buffer> data : Data;
   // data.b = vec3<f32>(2.3f, 1.2f, 0.2f);
   //
-  // -> data.Store(16, asuint(vector<float, 3>(2.3f, 1.2f, 0.2f)));
+  // -> data.Store(16, asuint(float3(2.3f, 1.2f, 0.2f)));
 
   ast::type::F32Type f32;
   ast::type::I32Type i32;
@@ -829,7 +829,7 @@
   ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
   EXPECT_EQ(
       result(),
-      R"(data.Store3(16, asuint(vector<float, 3>(1.00000000f, 2.00000000f, 3.00000000f)));
+      R"(data.Store3(16, asuint(float3(1.00000000f, 2.00000000f, 3.00000000f)));
 )");
 }
 
@@ -1131,7 +1131,7 @@
   // var<storage_buffer> data : Pre;
   // data.c[2].b = vec3<f32>(1.f, 2.f, 3.f);
   //
-  // -> data.Store3(16 + (2 * 32), asuint(vector<float, 3>(1.0f, 2.0f, 3.0f)));
+  // -> data.Store3(16 + (2 * 32), asuint(float3(1.0f, 2.0f, 3.0f)));
 
   ast::type::F32Type f32;
   ast::type::I32Type i32;
@@ -1197,7 +1197,7 @@
   ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
   EXPECT_EQ(
       result(),
-      R"(data.Store3(16 + (32 * 2) + 0, asuint(vector<float, 3>(1.00000000f, 2.00000000f, 3.00000000f)));
+      R"(data.Store3(16 + (32 * 2) + 0, asuint(float3(1.00000000f, 2.00000000f, 3.00000000f)));
 )");
 }
 
diff --git a/src/writer/hlsl/generator_impl_type_test.cc b/src/writer/hlsl/generator_impl_type_test.cc
index a4ee48b..9c5937d 100644
--- a/src/writer/hlsl/generator_impl_type_test.cc
+++ b/src/writer/hlsl/generator_impl_type_test.cc
@@ -310,7 +310,7 @@
   ast::type::VectorType v(&f32, 3);
 
   ASSERT_TRUE(gen.EmitType(out, &v, "")) << gen.error();
-  EXPECT_EQ(result(), "vector<float, 3>");
+  EXPECT_EQ(result(), "float3");
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitType_Void) {
diff --git a/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc b/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc
index 813cdaa..f4bc962 100644
--- a/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc
@@ -118,7 +118,7 @@
 
   ast::VariableDeclStatement stmt(var);
   ASSERT_TRUE(gen.EmitStatement(out, &stmt)) << gen.error();
-  EXPECT_EQ(result(), R"(vector<float, 3> a = vector<float, 3>(0.0f);
+  EXPECT_EQ(result(), R"(float3 a = float3(0.0f);
 )");
 }