mirror of
				https://github.com/encounter/dawn-cmake.git
				synced 2025-10-27 04:00:29 +00:00 
			
		
		
		
	tint/ast: Clean up StorageClass enum
Remove unused enum entries. Add a ParseStorageClass() function. Have the WGSL parser use this. First step to standardizing the way we parse enum-backed token sets. Change-Id: I31c02816493beeabda740ff43946edce097f5fd1 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/97148 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Dan Sinclair <dsinclair@chromium.org> Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
This commit is contained in:
		
							parent
							
								
									ce8876074f
								
							
						
					
					
						commit
						48085845bd
					
				| @ -16,34 +16,52 @@ | |||||||
| 
 | 
 | ||||||
| namespace tint::ast { | namespace tint::ast { | ||||||
| 
 | 
 | ||||||
| const char* ToString(StorageClass sc) { | /// ParseStorageClass parses a StorageClass from a string.
 | ||||||
|     switch (sc) { | /// @param str the string to parse
 | ||||||
|         case StorageClass::kInvalid: | /// @returns the parsed enum, or StorageClass::kInvalid if the string could not be parsed.
 | ||||||
|             return "invalid"; | StorageClass ParseStorageClass(std::string_view str) { | ||||||
|         case StorageClass::kNone: |     if (str == "function") { | ||||||
|             return "none"; |         return StorageClass::kFunction; | ||||||
|         case StorageClass::kInput: |  | ||||||
|             return "in"; |  | ||||||
|         case StorageClass::kOutput: |  | ||||||
|             return "out"; |  | ||||||
|         case StorageClass::kUniform: |  | ||||||
|             return "uniform"; |  | ||||||
|         case StorageClass::kWorkgroup: |  | ||||||
|             return "workgroup"; |  | ||||||
|         case StorageClass::kHandle: |  | ||||||
|             return "handle"; |  | ||||||
|         case StorageClass::kStorage: |  | ||||||
|             return "storage"; |  | ||||||
|         case StorageClass::kPrivate: |  | ||||||
|             return "private"; |  | ||||||
|         case StorageClass::kFunction: |  | ||||||
|             return "function"; |  | ||||||
|     } |     } | ||||||
|     return "<unknown>"; |     if (str == "private") { | ||||||
|  |         return StorageClass::kPrivate; | ||||||
|  |     } | ||||||
|  |     if (str == "workgroup") { | ||||||
|  |         return StorageClass::kWorkgroup; | ||||||
|  |     } | ||||||
|  |     if (str == "uniform") { | ||||||
|  |         return StorageClass::kUniform; | ||||||
|  |     } | ||||||
|  |     if (str == "storage") { | ||||||
|  |         return StorageClass::kStorage; | ||||||
|  |     } | ||||||
|  |     return StorageClass::kInvalid; | ||||||
| } | } | ||||||
| std::ostream& operator<<(std::ostream& out, StorageClass sc) { | 
 | ||||||
|     out << ToString(sc); | std::ostream& operator<<(std::ostream& out, StorageClass value) { | ||||||
|     return out; |     switch (value) { | ||||||
|  |         case StorageClass::kInvalid: | ||||||
|  |             return out << "invalid"; | ||||||
|  |         case StorageClass::kNone: | ||||||
|  |             return out << "none"; | ||||||
|  |         case StorageClass::kFunction: | ||||||
|  |             return out << "function"; | ||||||
|  |         case StorageClass::kPrivate: | ||||||
|  |             return out << "private"; | ||||||
|  |         case StorageClass::kWorkgroup: | ||||||
|  |             return out << "workgroup"; | ||||||
|  |         case StorageClass::kUniform: | ||||||
|  |             return out << "uniform"; | ||||||
|  |         case StorageClass::kStorage: | ||||||
|  |             return out << "storage"; | ||||||
|  |         case StorageClass::kHandle: | ||||||
|  |             return out << "handle"; | ||||||
|  |         case StorageClass::kIn: | ||||||
|  |             return out << "in"; | ||||||
|  |         case StorageClass::kOut: | ||||||
|  |             return out << "out"; | ||||||
|  |     } | ||||||
|  |     return out << "<unknown>"; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| }  // namespace tint::ast
 | }  // namespace tint::ast
 | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| // Copyright 2020 The Tint Authors.
 | // Copyright 2022 The Tint Authors.
 | ||||||
| //
 | //
 | ||||||
| // Licensed under the Apache License, Version 2.0 (the "License");
 | // Licensed under the Apache License, Version 2.0 (the "License");
 | ||||||
| // you may not use this file except in compliance with the License.
 | // you may not use this file except in compliance with the License.
 | ||||||
| @ -21,18 +21,28 @@ namespace tint::ast { | |||||||
| 
 | 
 | ||||||
| /// Storage class of a given pointer.
 | /// Storage class of a given pointer.
 | ||||||
| enum class StorageClass { | enum class StorageClass { | ||||||
|     kInvalid = -1, |     kInvalid, | ||||||
|     kNone, |     kNone, | ||||||
|     kInput, |     kFunction, | ||||||
|     kOutput, |  | ||||||
|     kUniform, |  | ||||||
|     kWorkgroup, |  | ||||||
|     kHandle, |  | ||||||
|     kStorage, |  | ||||||
|     kPrivate, |     kPrivate, | ||||||
|     kFunction |     kWorkgroup, | ||||||
|  |     kUniform, | ||||||
|  |     kStorage, | ||||||
|  |     kHandle, | ||||||
|  |     kIn, | ||||||
|  |     kOut, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /// @param out the std::ostream to write to
 | ||||||
|  | /// @param sc the StorageClass
 | ||||||
|  | /// @return the std::ostream so calls can be chained
 | ||||||
|  | std::ostream& operator<<(std::ostream& out, StorageClass sc); | ||||||
|  | 
 | ||||||
|  | /// ParseStorageClass parses a StorageClass from a string.
 | ||||||
|  | /// @param str the string to parse
 | ||||||
|  | /// @returns the parsed enum, or StorageClass::kInvalid if the string could not be parsed.
 | ||||||
|  | StorageClass ParseStorageClass(std::string_view str); | ||||||
|  | 
 | ||||||
| /// @returns true if the StorageClass is host-shareable
 | /// @returns true if the StorageClass is host-shareable
 | ||||||
| /// @param sc the StorageClass
 | /// @param sc the StorageClass
 | ||||||
| /// @see https://gpuweb.github.io/gpuweb/wgsl.html#host-shareable
 | /// @see https://gpuweb.github.io/gpuweb/wgsl.html#host-shareable
 | ||||||
| @ -40,15 +50,6 @@ inline bool IsHostShareable(StorageClass sc) { | |||||||
|     return sc == ast::StorageClass::kUniform || sc == ast::StorageClass::kStorage; |     return sc == ast::StorageClass::kUniform || sc == ast::StorageClass::kStorage; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// @param sc the StorageClass
 |  | ||||||
| /// @return the name of the given storage class
 |  | ||||||
| const char* ToString(StorageClass sc); |  | ||||||
| 
 |  | ||||||
| /// @param out the std::ostream to write to
 |  | ||||||
| /// @param sc the StorageClass
 |  | ||||||
| /// @return the std::ostream so calls can be chained
 |  | ||||||
| std::ostream& operator<<(std::ostream& out, StorageClass sc); |  | ||||||
| 
 |  | ||||||
| }  // namespace tint::ast
 | }  // namespace tint::ast
 | ||||||
| 
 | 
 | ||||||
| #endif  // SRC_TINT_AST_STORAGE_CLASS_H_
 | #endif  // SRC_TINT_AST_STORAGE_CLASS_H_
 | ||||||
|  | |||||||
| @ -49,6 +49,7 @@ | |||||||
| #include "src/tint/sem/vector.h" | #include "src/tint/sem/vector.h" | ||||||
| #include "src/tint/sem/void.h" | #include "src/tint/sem/void.h" | ||||||
| #include "src/tint/utils/math.h" | #include "src/tint/utils/math.h" | ||||||
|  | #include "src/tint/utils/string.h" | ||||||
| #include "src/tint/utils/unique_vector.h" | #include "src/tint/utils/unique_vector.h" | ||||||
| 
 | 
 | ||||||
| namespace tint::inspector { | namespace tint::inspector { | ||||||
| @ -570,7 +571,7 @@ std::vector<std::string> Inspector::GetUsedExtensionNames() { | |||||||
|     std::vector<std::string> out; |     std::vector<std::string> out; | ||||||
|     out.reserve(extensions.size()); |     out.reserve(extensions.size()); | ||||||
|     for (auto ext : extensions) { |     for (auto ext : extensions) { | ||||||
|         out.push_back(ast::str(ext)); |         out.push_back(utils::ToString(ext)); | ||||||
|     } |     } | ||||||
|     return out; |     return out; | ||||||
| } | } | ||||||
| @ -582,7 +583,7 @@ std::vector<std::pair<std::string, Source>> Inspector::GetEnableDirectives() { | |||||||
|     auto global_decls = program_->AST().GlobalDeclarations(); |     auto global_decls = program_->AST().GlobalDeclarations(); | ||||||
|     for (auto* node : global_decls) { |     for (auto* node : global_decls) { | ||||||
|         if (auto* ext = node->As<ast::Enable>()) { |         if (auto* ext = node->As<ast::Enable>()) { | ||||||
|             result.push_back({ast::str(ext->extension), ext->source}); |             result.push_back({utils::ToString(ext->extension), ext->source}); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -39,9 +39,9 @@ ast::PipelineStage EnumConverter::ToPipelineStage(SpvExecutionModel model) { | |||||||
| ast::StorageClass EnumConverter::ToStorageClass(const SpvStorageClass sc) { | ast::StorageClass EnumConverter::ToStorageClass(const SpvStorageClass sc) { | ||||||
|     switch (sc) { |     switch (sc) { | ||||||
|         case SpvStorageClassInput: |         case SpvStorageClassInput: | ||||||
|             return ast::StorageClass::kInput; |             return ast::StorageClass::kIn; | ||||||
|         case SpvStorageClassOutput: |         case SpvStorageClassOutput: | ||||||
|             return ast::StorageClass::kOutput; |             return ast::StorageClass::kOut; | ||||||
|         case SpvStorageClassUniform: |         case SpvStorageClassUniform: | ||||||
|             return ast::StorageClass::kUniform; |             return ast::StorageClass::kUniform; | ||||||
|         case SpvStorageClassWorkgroup: |         case SpvStorageClassWorkgroup: | ||||||
|  | |||||||
| @ -125,8 +125,8 @@ INSTANTIATE_TEST_SUITE_P( | |||||||
|     EnumConverterGood, |     EnumConverterGood, | ||||||
|     SpvStorageClassTest, |     SpvStorageClassTest, | ||||||
|     testing::Values( |     testing::Values( | ||||||
|         StorageClassCase{SpvStorageClassInput, true, ast::StorageClass::kInput}, |         StorageClassCase{SpvStorageClassInput, true, ast::StorageClass::kIn}, | ||||||
|         StorageClassCase{SpvStorageClassOutput, true, ast::StorageClass::kOutput}, |         StorageClassCase{SpvStorageClassOutput, true, ast::StorageClass::kOut}, | ||||||
|         StorageClassCase{SpvStorageClassUniform, true, ast::StorageClass::kUniform}, |         StorageClassCase{SpvStorageClassUniform, true, ast::StorageClass::kUniform}, | ||||||
|         StorageClassCase{SpvStorageClassWorkgroup, true, ast::StorageClass::kWorkgroup}, |         StorageClassCase{SpvStorageClassWorkgroup, true, ast::StorageClass::kWorkgroup}, | ||||||
|         StorageClassCase{SpvStorageClassUniformConstant, true, ast::StorageClass::kNone}, |         StorageClassCase{SpvStorageClassUniformConstant, true, ast::StorageClass::kNone}, | ||||||
|  | |||||||
| @ -1219,8 +1219,8 @@ const Type* ParserImpl::ConvertType(uint32_t type_id, | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Pipeline input and output variables map to private variables.
 |     // Pipeline input and output variables map to private variables.
 | ||||||
|     if (ast_storage_class == ast::StorageClass::kInput || |     if (ast_storage_class == ast::StorageClass::kIn || | ||||||
|         ast_storage_class == ast::StorageClass::kOutput) { |         ast_storage_class == ast::StorageClass::kOut) { | ||||||
|         ast_storage_class = ast::StorageClass::kPrivate; |         ast_storage_class = ast::StorageClass::kPrivate; | ||||||
|     } |     } | ||||||
|     switch (ptr_as) { |     switch (ptr_as) { | ||||||
| @ -1446,8 +1446,8 @@ bool ParserImpl::EmitModuleScopeVariables() { | |||||||
|         } |         } | ||||||
|         switch (enum_converter_.ToStorageClass(spirv_storage_class)) { |         switch (enum_converter_.ToStorageClass(spirv_storage_class)) { | ||||||
|             case ast::StorageClass::kNone: |             case ast::StorageClass::kNone: | ||||||
|             case ast::StorageClass::kInput: |             case ast::StorageClass::kIn: | ||||||
|             case ast::StorageClass::kOutput: |             case ast::StorageClass::kOut: | ||||||
|             case ast::StorageClass::kUniform: |             case ast::StorageClass::kUniform: | ||||||
|             case ast::StorageClass::kHandle: |             case ast::StorageClass::kHandle: | ||||||
|             case ast::StorageClass::kStorage: |             case ast::StorageClass::kStorage: | ||||||
|  | |||||||
| @ -21,6 +21,7 @@ | |||||||
| #include "src/tint/program_builder.h" | #include "src/tint/program_builder.h" | ||||||
| #include "src/tint/utils/hash.h" | #include "src/tint/utils/hash.h" | ||||||
| #include "src/tint/utils/map.h" | #include "src/tint/utils/map.h" | ||||||
|  | #include "src/tint/utils/string.h" | ||||||
| #include "src/tint/utils/unique_allocator.h" | #include "src/tint/utils/unique_allocator.h" | ||||||
| 
 | 
 | ||||||
| TINT_INSTANTIATE_TYPEINFO(tint::reader::spirv::Type); | TINT_INSTANTIATE_TYPEINFO(tint::reader::spirv::Type); | ||||||
| @ -518,13 +519,13 @@ std::string I32::String() const { | |||||||
| 
 | 
 | ||||||
| std::string Pointer::String() const { | std::string Pointer::String() const { | ||||||
|     std::stringstream ss; |     std::stringstream ss; | ||||||
|     ss << "ptr<" << std::string(ast::ToString(storage_class)) << ", " << type->String() + ">"; |     ss << "ptr<" << utils::ToString(storage_class) << ", " << type->String() + ">"; | ||||||
|     return ss.str(); |     return ss.str(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::string Reference::String() const { | std::string Reference::String() const { | ||||||
|     std::stringstream ss; |     std::stringstream ss; | ||||||
|     ss << "ref<" + std::string(ast::ToString(storage_class)) << ", " << type->String() << ">"; |     ss << "ref<" + utils::ToString(storage_class) << ", " << type->String() << ">"; | ||||||
|     return ss.str(); |     return ss.str(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -56,7 +56,7 @@ TEST(SpvParserTypeTest, DifferentArgumentsGivesDifferentPointer) { | |||||||
|     EXPECT_NE(ty.Pointer(ty.I32(), ast::StorageClass::kNone), |     EXPECT_NE(ty.Pointer(ty.I32(), ast::StorageClass::kNone), | ||||||
|               ty.Pointer(ty.U32(), ast::StorageClass::kNone)); |               ty.Pointer(ty.U32(), ast::StorageClass::kNone)); | ||||||
|     EXPECT_NE(ty.Pointer(ty.I32(), ast::StorageClass::kNone), |     EXPECT_NE(ty.Pointer(ty.I32(), ast::StorageClass::kNone), | ||||||
|               ty.Pointer(ty.I32(), ast::StorageClass::kInput)); |               ty.Pointer(ty.I32(), ast::StorageClass::kIn)); | ||||||
|     EXPECT_NE(ty.Vector(ty.I32(), 3), ty.Vector(ty.U32(), 3)); |     EXPECT_NE(ty.Vector(ty.I32(), 3), ty.Vector(ty.U32(), 3)); | ||||||
|     EXPECT_NE(ty.Vector(ty.I32(), 3), ty.Vector(ty.I32(), 2)); |     EXPECT_NE(ty.Vector(ty.I32(), 3), ty.Vector(ty.I32(), 2)); | ||||||
|     EXPECT_NE(ty.Matrix(ty.I32(), 3, 2), ty.Matrix(ty.U32(), 3, 2)); |     EXPECT_NE(ty.Matrix(ty.I32(), 3, 2), ty.Matrix(ty.U32(), 3, 2)); | ||||||
|  | |||||||
| @ -400,7 +400,7 @@ Maybe<bool> ParserImpl::enable_directive() { | |||||||
|             synchronized_ = true; |             synchronized_ = true; | ||||||
|             next(); |             next(); | ||||||
|             name = {"f16", t.source()}; |             name = {"f16", t.source()}; | ||||||
|         } else if (t.Is(Token::Type::kParenLeft)){ |         } else if (t.Is(Token::Type::kParenLeft)) { | ||||||
|             // A common error case is writing `enable(foo);` instead of `enable foo;`.
 |             // A common error case is writing `enable(foo);` instead of `enable foo;`.
 | ||||||
|             synchronized_ = false; |             synchronized_ = false; | ||||||
|             return add_error(t.source(), "enable directives don't take parenthesis"); |             return add_error(t.source(), "enable directives don't take parenthesis"); | ||||||
| @ -1315,28 +1315,12 @@ Expect<ast::StorageClass> ParserImpl::expect_storage_class(std::string_view use) | |||||||
|         return Failure::kErrored; |         return Failure::kErrored; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     auto name = ident.value; |     auto storage_class = ast::ParseStorageClass(ident.value); | ||||||
|     if (name == "uniform") { |     if (storage_class == ast::StorageClass::kInvalid) { | ||||||
|         return {ast::StorageClass::kUniform, t.source()}; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (name == "workgroup") { |  | ||||||
|         return {ast::StorageClass::kWorkgroup, t.source()}; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (name == "storage" || name == "storage_buffer") { |  | ||||||
|         return {ast::StorageClass::kStorage, t.source()}; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (name == "private") { |  | ||||||
|         return {ast::StorageClass::kPrivate, t.source()}; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (name == "function") { |  | ||||||
|         return {ast::StorageClass::kFunction, t.source()}; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|         return add_error(t.source(), "invalid storage class", use); |         return add_error(t.source(), "invalid storage class", use); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return {storage_class, t.source()}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // struct_decl
 | // struct_decl
 | ||||||
|  | |||||||
| @ -46,7 +46,6 @@ INSTANTIATE_TEST_SUITE_P( | |||||||
|     testing::Values(StorageClassData{"uniform", ast::StorageClass::kUniform}, |     testing::Values(StorageClassData{"uniform", ast::StorageClass::kUniform}, | ||||||
|                     StorageClassData{"workgroup", ast::StorageClass::kWorkgroup}, |                     StorageClassData{"workgroup", ast::StorageClass::kWorkgroup}, | ||||||
|                     StorageClassData{"storage", ast::StorageClass::kStorage}, |                     StorageClassData{"storage", ast::StorageClass::kStorage}, | ||||||
|                     StorageClassData{"storage_buffer", ast::StorageClass::kStorage}, |  | ||||||
|                     StorageClassData{"private", ast::StorageClass::kPrivate}, |                     StorageClassData{"private", ast::StorageClass::kPrivate}, | ||||||
|                     StorageClassData{"function", ast::StorageClass::kFunction})); |                     StorageClassData{"function", ast::StorageClass::kFunction})); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -50,7 +50,6 @@ INSTANTIATE_TEST_SUITE_P( | |||||||
|         VariableStorageData{"uniform", ast::StorageClass::kUniform, ast::Access::kUndefined}, |         VariableStorageData{"uniform", ast::StorageClass::kUniform, ast::Access::kUndefined}, | ||||||
|         VariableStorageData{"workgroup", ast::StorageClass::kWorkgroup, ast::Access::kUndefined}, |         VariableStorageData{"workgroup", ast::StorageClass::kWorkgroup, ast::Access::kUndefined}, | ||||||
|         VariableStorageData{"storage", ast::StorageClass::kStorage, ast::Access::kUndefined}, |         VariableStorageData{"storage", ast::StorageClass::kStorage, ast::Access::kUndefined}, | ||||||
|         VariableStorageData{"storage_buffer", ast::StorageClass::kStorage, ast::Access::kUndefined}, |  | ||||||
|         VariableStorageData{"private", ast::StorageClass::kPrivate, ast::Access::kUndefined}, |         VariableStorageData{"private", ast::StorageClass::kPrivate, ast::Access::kUndefined}, | ||||||
|         VariableStorageData{"function", ast::StorageClass::kFunction, ast::Access::kUndefined}, |         VariableStorageData{"function", ast::StorageClass::kFunction, ast::Access::kUndefined}, | ||||||
|         VariableStorageData{"storage, read", ast::StorageClass::kStorage, ast::Access::kRead}, |         VariableStorageData{"storage, read", ast::StorageClass::kStorage, ast::Access::kRead}, | ||||||
|  | |||||||
| @ -807,8 +807,8 @@ TEST_P(ResolverFunctionParameterValidationTest, StorageClass) { | |||||||
| INSTANTIATE_TEST_SUITE_P(ResolverTest, | INSTANTIATE_TEST_SUITE_P(ResolverTest, | ||||||
|                          ResolverFunctionParameterValidationTest, |                          ResolverFunctionParameterValidationTest, | ||||||
|                          testing::Values(TestParams{ast::StorageClass::kNone, false}, |                          testing::Values(TestParams{ast::StorageClass::kNone, false}, | ||||||
|                                          TestParams{ast::StorageClass::kInput, false}, |                                          TestParams{ast::StorageClass::kIn, false}, | ||||||
|                                          TestParams{ast::StorageClass::kOutput, false}, |                                          TestParams{ast::StorageClass::kOut, false}, | ||||||
|                                          TestParams{ast::StorageClass::kUniform, false}, |                                          TestParams{ast::StorageClass::kUniform, false}, | ||||||
|                                          TestParams{ast::StorageClass::kWorkgroup, true}, |                                          TestParams{ast::StorageClass::kWorkgroup, true}, | ||||||
|                                          TestParams{ast::StorageClass::kHandle, false}, |                                          TestParams{ast::StorageClass::kHandle, false}, | ||||||
|  | |||||||
| @ -78,6 +78,7 @@ | |||||||
| #include "src/tint/utils/math.h" | #include "src/tint/utils/math.h" | ||||||
| #include "src/tint/utils/reverse.h" | #include "src/tint/utils/reverse.h" | ||||||
| #include "src/tint/utils/scoped_assignment.h" | #include "src/tint/utils/scoped_assignment.h" | ||||||
|  | #include "src/tint/utils/string.h" | ||||||
| #include "src/tint/utils/transform.h" | #include "src/tint/utils/transform.h" | ||||||
| 
 | 
 | ||||||
| namespace tint::resolver { | namespace tint::resolver { | ||||||
| @ -344,7 +345,7 @@ bool Validator::VariableInitializer(const ast::Variable* v, | |||||||
|                 // https://gpuweb.github.io/gpuweb/wgsl/#var-and-let
 |                 // https://gpuweb.github.io/gpuweb/wgsl/#var-and-let
 | ||||||
|                 // Optionally has an initializer expression, if the variable is in the
 |                 // Optionally has an initializer expression, if the variable is in the
 | ||||||
|                 // private or function storage classes.
 |                 // private or function storage classes.
 | ||||||
|                 AddError("var of storage class '" + std::string(ast::ToString(storage_class)) + |                 AddError("var of storage class '" + utils::ToString(storage_class) + | ||||||
|                              "' cannot have an initializer. var initializers are only " |                              "' cannot have an initializer. var initializers are only " | ||||||
|                              "supported for the storage classes " |                              "supported for the storage classes " | ||||||
|                              "'private' and 'function'", |                              "'private' and 'function'", | ||||||
| @ -396,8 +397,8 @@ bool Validator::StorageClassLayout(const sem::Type* store_ty, | |||||||
|     // TODO(tint:1473, tint:1502): Remove this error after f16 is supported in "uniform" and
 |     // TODO(tint:1473, tint:1502): Remove this error after f16 is supported in "uniform" and
 | ||||||
|     // "storage" storage class.
 |     // "storage" storage class.
 | ||||||
|     if (Is<sem::F16>(sem::Type::DeepestElementOf(store_ty))) { |     if (Is<sem::F16>(sem::Type::DeepestElementOf(store_ty))) { | ||||||
|         AddError("using f16 types in '" + std::string(ast::ToString(sc)) + |         AddError( | ||||||
|                      "' storage class is not implemented yet", |             "using f16 types in '" + utils::ToString(sc) + "' storage class is not implemented yet", | ||||||
|             source); |             source); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| @ -418,7 +419,7 @@ bool Validator::StorageClassLayout(const sem::Type* store_ty, | |||||||
|             if (m->Offset() % required_align != 0) { |             if (m->Offset() % required_align != 0) { | ||||||
|                 AddError("the offset of a struct member of type '" + |                 AddError("the offset of a struct member of type '" + | ||||||
|                              m->Type()->UnwrapRef()->FriendlyName(symbols_) + |                              m->Type()->UnwrapRef()->FriendlyName(symbols_) + | ||||||
|                              "' in storage class '" + ast::ToString(sc) + |                              "' in storage class '" + utils::ToString(sc) + | ||||||
|                              "' must be a multiple of " + std::to_string(required_align) + |                              "' must be a multiple of " + std::to_string(required_align) + | ||||||
|                              " bytes, but '" + member_name_of(m) + "' is currently at offset " + |                              " bytes, but '" + member_name_of(m) + "' is currently at offset " + | ||||||
|                              std::to_string(m->Offset()) + ". Consider setting @align(" + |                              std::to_string(m->Offset()) + ". Consider setting @align(" + | ||||||
| @ -583,8 +584,8 @@ bool Validator::GlobalVariable( | |||||||
|                 bool is_shader_io_attribute = |                 bool is_shader_io_attribute = | ||||||
|                     attr->IsAnyOf<ast::BuiltinAttribute, ast::InterpolateAttribute, |                     attr->IsAnyOf<ast::BuiltinAttribute, ast::InterpolateAttribute, | ||||||
|                                   ast::InvariantAttribute, ast::LocationAttribute>(); |                                   ast::InvariantAttribute, ast::LocationAttribute>(); | ||||||
|                 bool has_io_storage_class = global->StorageClass() == ast::StorageClass::kInput || |                 bool has_io_storage_class = global->StorageClass() == ast::StorageClass::kIn || | ||||||
|                                             global->StorageClass() == ast::StorageClass::kOutput; |                                             global->StorageClass() == ast::StorageClass::kOut; | ||||||
|                 if (!attr->IsAnyOf<ast::BindingAttribute, ast::GroupAttribute, |                 if (!attr->IsAnyOf<ast::BindingAttribute, ast::GroupAttribute, | ||||||
|                                    ast::InternalAttribute>() && |                                    ast::InternalAttribute>() && | ||||||
|                     (!is_shader_io_attribute || !has_io_storage_class)) { |                     (!is_shader_io_attribute || !has_io_storage_class)) { | ||||||
| @ -740,8 +741,8 @@ bool Validator::Var(const sem::Variable* v) const { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (IsValidationEnabled(var->attributes, ast::DisabledValidation::kIgnoreStorageClass) && |     if (IsValidationEnabled(var->attributes, ast::DisabledValidation::kIgnoreStorageClass) && | ||||||
|         (var->declared_storage_class == ast::StorageClass::kInput || |         (var->declared_storage_class == ast::StorageClass::kIn || | ||||||
|          var->declared_storage_class == ast::StorageClass::kOutput)) { |          var->declared_storage_class == ast::StorageClass::kOut)) { | ||||||
|         AddError("invalid use of input/output storage class", var->source); |         AddError("invalid use of input/output storage class", var->source); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -22,6 +22,7 @@ | |||||||
| #include "src/tint/program_builder.h" | #include "src/tint/program_builder.h" | ||||||
| #include "src/tint/sem/function.h" | #include "src/tint/sem/function.h" | ||||||
| #include "src/tint/sem/variable.h" | #include "src/tint/sem/variable.h" | ||||||
|  | #include "src/tint/utils/string.h" | ||||||
| 
 | 
 | ||||||
| TINT_INSTANTIATE_TYPEINFO(tint::transform::BindingRemapper); | TINT_INSTANTIATE_TYPEINFO(tint::transform::BindingRemapper); | ||||||
| TINT_INSTANTIATE_TYPEINFO(tint::transform::BindingRemapper::Remappings); | TINT_INSTANTIATE_TYPEINFO(tint::transform::BindingRemapper::Remappings); | ||||||
| @ -125,7 +126,7 @@ void BindingRemapper::Run(CloneContext& ctx, const DataMap& inputs, DataMap&) co | |||||||
|                     ctx.dst->Diagnostics().add_error( |                     ctx.dst->Diagnostics().add_error( | ||||||
|                         diag::System::Transform, |                         diag::System::Transform, | ||||||
|                         "cannot apply access control to variable with storage class " + |                         "cannot apply access control to variable with storage class " + | ||||||
|                             std::string(ast::ToString(sem->StorageClass()))); |                             std::string(utils::ToString(sem->StorageClass()))); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 auto* ty = sem->Type()->UnwrapRef(); |                 auto* ty = sem->Type()->UnwrapRef(); | ||||||
|  | |||||||
| @ -181,7 +181,7 @@ struct CanonicalizeEntryPointIO::State { | |||||||
|             auto* builtin = ast::GetAttribute<ast::BuiltinAttribute>(attributes); |             auto* builtin = ast::GetAttribute<ast::BuiltinAttribute>(attributes); | ||||||
|             if (cfg.shader_style == ShaderStyle::kGlsl && builtin) { |             if (cfg.shader_style == ShaderStyle::kGlsl && builtin) { | ||||||
|                 name = GLSLBuiltinToString(builtin->builtin, func_ast->PipelineStage(), |                 name = GLSLBuiltinToString(builtin->builtin, func_ast->PipelineStage(), | ||||||
|                                            ast::StorageClass::kInput); |                                            ast::StorageClass::kIn); | ||||||
|             } |             } | ||||||
|             auto symbol = ctx.dst->Symbols().New(name); |             auto symbol = ctx.dst->Symbols().New(name); | ||||||
| 
 | 
 | ||||||
| @ -198,7 +198,7 @@ struct CanonicalizeEntryPointIO::State { | |||||||
|                     value = ctx.dst->IndexAccessor(value, 0_i); |                     value = ctx.dst->IndexAccessor(value, 0_i); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             ctx.dst->GlobalVar(symbol, ast_type, ast::StorageClass::kInput, std::move(attributes)); |             ctx.dst->GlobalVar(symbol, ast_type, ast::StorageClass::kIn, std::move(attributes)); | ||||||
|             return value; |             return value; | ||||||
|         } else if (cfg.shader_style == ShaderStyle::kMsl && |         } else if (cfg.shader_style == ShaderStyle::kMsl && | ||||||
|                    ast::HasAttribute<ast::BuiltinAttribute>(attributes)) { |                    ast::HasAttribute<ast::BuiltinAttribute>(attributes)) { | ||||||
| @ -246,7 +246,7 @@ struct CanonicalizeEntryPointIO::State { | |||||||
|         if (cfg.shader_style == ShaderStyle::kGlsl) { |         if (cfg.shader_style == ShaderStyle::kGlsl) { | ||||||
|             if (auto* b = ast::GetAttribute<ast::BuiltinAttribute>(attributes)) { |             if (auto* b = ast::GetAttribute<ast::BuiltinAttribute>(attributes)) { | ||||||
|                 name = GLSLBuiltinToString(b->builtin, func_ast->PipelineStage(), |                 name = GLSLBuiltinToString(b->builtin, func_ast->PipelineStage(), | ||||||
|                                            ast::StorageClass::kOutput); |                                            ast::StorageClass::kOut); | ||||||
|                 value = ToGLSLBuiltin(b->builtin, value, type); |                 value = ToGLSLBuiltin(b->builtin, value, type); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -463,7 +463,7 @@ struct CanonicalizeEntryPointIO::State { | |||||||
|                 type = ctx.dst->ty.array(type, 1_u); |                 type = ctx.dst->ty.array(type, 1_u); | ||||||
|                 lhs = ctx.dst->IndexAccessor(lhs, 0_i); |                 lhs = ctx.dst->IndexAccessor(lhs, 0_i); | ||||||
|             } |             } | ||||||
|             ctx.dst->GlobalVar(name, type, ast::StorageClass::kOutput, std::move(attributes)); |             ctx.dst->GlobalVar(name, type, ast::StorageClass::kOut, std::move(attributes)); | ||||||
|             wrapper_body.push_back(ctx.dst->Assign(lhs, outval.value)); |             wrapper_body.push_back(ctx.dst->Assign(lhs, outval.value)); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -640,7 +640,7 @@ struct CanonicalizeEntryPointIO::State { | |||||||
|             case ast::Builtin::kSampleIndex: |             case ast::Builtin::kSampleIndex: | ||||||
|                 return "gl_SampleID"; |                 return "gl_SampleID"; | ||||||
|             case ast::Builtin::kSampleMask: |             case ast::Builtin::kSampleMask: | ||||||
|                 if (storage_class == ast::StorageClass::kInput) { |                 if (storage_class == ast::StorageClass::kIn) { | ||||||
|                     return "gl_SampleMaskIn"; |                     return "gl_SampleMaskIn"; | ||||||
|                 } else { |                 } else { | ||||||
|                     return "gl_SampleMask"; |                     return "gl_SampleMask"; | ||||||
|  | |||||||
| @ -15,6 +15,7 @@ | |||||||
| #ifndef SRC_TINT_UTILS_STRING_H_ | #ifndef SRC_TINT_UTILS_STRING_H_ | ||||||
| #define SRC_TINT_UTILS_STRING_H_ | #define SRC_TINT_UTILS_STRING_H_ | ||||||
| 
 | 
 | ||||||
|  | #include <sstream> | ||||||
| #include <string> | #include <string> | ||||||
| 
 | 
 | ||||||
| namespace tint::utils { | namespace tint::utils { | ||||||
| @ -34,6 +35,15 @@ inline std::string ReplaceAll(std::string str, | |||||||
|     return str; |     return str; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /// @param value the value to be printed as a string
 | ||||||
|  | /// @returns value printed as a string via the std::ostream `<<` operator
 | ||||||
|  | template <typename T> | ||||||
|  | std::string ToString(const T& value) { | ||||||
|  |     std::stringstream s; | ||||||
|  |     s << value; | ||||||
|  |     return s.str(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| }  // namespace tint::utils
 | }  // namespace tint::utils
 | ||||||
| 
 | 
 | ||||||
| #endif  // SRC_TINT_UTILS_STRING_H_
 | #endif  // SRC_TINT_UTILS_STRING_H_
 | ||||||
|  | |||||||
| @ -32,5 +32,10 @@ TEST(StringTest, ReplaceAll) { | |||||||
|     ASSERT_EQ("aabxybbxybcc", ReplaceAll("aabbcc", "b", "bxyb")); |     ASSERT_EQ("aabxybbxybcc", ReplaceAll("aabbcc", "b", "bxyb")); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | TEST(StringTest, ToString) { | ||||||
|  |     ASSERT_EQ("123", ToString(123)); | ||||||
|  |     ASSERT_EQ("hello", ToString("hello")); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| }  // namespace
 | }  // namespace
 | ||||||
| }  // namespace tint::utils
 | }  // namespace tint::utils
 | ||||||
|  | |||||||
| @ -1929,8 +1929,8 @@ bool GeneratorImpl::EmitGlobalVariable(const ast::Variable* global) { | |||||||
|                     return EmitPrivateVariable(sem); |                     return EmitPrivateVariable(sem); | ||||||
|                 case ast::StorageClass::kWorkgroup: |                 case ast::StorageClass::kWorkgroup: | ||||||
|                     return EmitWorkgroupVariable(sem); |                     return EmitWorkgroupVariable(sem); | ||||||
|                 case ast::StorageClass::kInput: |                 case ast::StorageClass::kIn: | ||||||
|                 case ast::StorageClass::kOutput: |                 case ast::StorageClass::kOut: | ||||||
|                     return EmitIOVariable(sem); |                     return EmitIOVariable(sem); | ||||||
|                 default: |                 default: | ||||||
|                     TINT_ICE(Writer, diagnostics_) |                     TINT_ICE(Writer, diagnostics_) | ||||||
| @ -2738,11 +2738,11 @@ bool GeneratorImpl::EmitType(std::ostream& out, | |||||||
|         *name_printed = false; |         *name_printed = false; | ||||||
|     } |     } | ||||||
|     switch (storage_class) { |     switch (storage_class) { | ||||||
|         case ast::StorageClass::kInput: { |         case ast::StorageClass::kIn: { | ||||||
|             out << "in "; |             out << "in "; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         case ast::StorageClass::kOutput: { |         case ast::StorageClass::kOut: { | ||||||
|             out << "out "; |             out << "out "; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -62,7 +62,7 @@ TEST_F(GlslGeneratorImplTest, GenerateSampleIndexES) { | |||||||
|                   Builtin(ast::Builtin::kSampleIndex), |                   Builtin(ast::Builtin::kSampleIndex), | ||||||
|                   Disable(ast::DisabledValidation::kIgnoreStorageClass), |                   Disable(ast::DisabledValidation::kIgnoreStorageClass), | ||||||
|               }, |               }, | ||||||
|               ast::StorageClass::kInput); |               ast::StorageClass::kIn); | ||||||
|     Func("my_func", {}, ty.i32(), |     Func("my_func", {}, ty.i32(), | ||||||
|          { |          { | ||||||
|              Return(Expr("gl_SampleID")), |              Return(Expr("gl_SampleID")), | ||||||
| @ -87,7 +87,7 @@ TEST_F(GlslGeneratorImplTest, GenerateSampleIndexDesktop) { | |||||||
|                   Builtin(ast::Builtin::kSampleIndex), |                   Builtin(ast::Builtin::kSampleIndex), | ||||||
|                   Disable(ast::DisabledValidation::kIgnoreStorageClass), |                   Disable(ast::DisabledValidation::kIgnoreStorageClass), | ||||||
|               }, |               }, | ||||||
|               ast::StorageClass::kInput); |               ast::StorageClass::kIn); | ||||||
|     Func("my_func", {}, ty.i32(), |     Func("my_func", {}, ty.i32(), | ||||||
|          { |          { | ||||||
|              Return(Expr("gl_SampleID")), |              Return(Expr("gl_SampleID")), | ||||||
|  | |||||||
| @ -477,8 +477,8 @@ bool Builder::GenerateEntryPoint(const ast::Function* func, uint32_t id) { | |||||||
|     for (const auto* var : func_sem->TransitivelyReferencedGlobals()) { |     for (const auto* var : func_sem->TransitivelyReferencedGlobals()) { | ||||||
|         // For SPIR-V 1.3 we only output Input/output variables. If we update to
 |         // For SPIR-V 1.3 we only output Input/output variables. If we update to
 | ||||||
|         // SPIR-V 1.4 or later this should be all variables.
 |         // SPIR-V 1.4 or later this should be all variables.
 | ||||||
|         if (var->StorageClass() != ast::StorageClass::kInput && |         if (var->StorageClass() != ast::StorageClass::kIn && | ||||||
|             var->StorageClass() != ast::StorageClass::kOutput) { |             var->StorageClass() != ast::StorageClass::kOut) { | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -856,7 +856,7 @@ bool Builder::GenerateGlobalVariable(const ast::Variable* v) { | |||||||
|             // VK_KHR_zero_initialize_workgroup_memory extension is enabled, we should
 |             // VK_KHR_zero_initialize_workgroup_memory extension is enabled, we should
 | ||||||
|             // also zero-initialize.
 |             // also zero-initialize.
 | ||||||
|             if (sem->StorageClass() == ast::StorageClass::kPrivate || |             if (sem->StorageClass() == ast::StorageClass::kPrivate || | ||||||
|                 sem->StorageClass() == ast::StorageClass::kOutput || |                 sem->StorageClass() == ast::StorageClass::kOut || | ||||||
|                 (zero_initialize_workgroup_memory_ && |                 (zero_initialize_workgroup_memory_ && | ||||||
|                  sem->StorageClass() == ast::StorageClass::kWorkgroup)) { |                  sem->StorageClass() == ast::StorageClass::kWorkgroup)) { | ||||||
|                 init_id = GenerateConstantNullIfNeeded(type); |                 init_id = GenerateConstantNullIfNeeded(type); | ||||||
| @ -4113,9 +4113,9 @@ SpvStorageClass Builder::ConvertStorageClass(ast::StorageClass klass) const { | |||||||
|     switch (klass) { |     switch (klass) { | ||||||
|         case ast::StorageClass::kInvalid: |         case ast::StorageClass::kInvalid: | ||||||
|             return SpvStorageClassMax; |             return SpvStorageClassMax; | ||||||
|         case ast::StorageClass::kInput: |         case ast::StorageClass::kIn: | ||||||
|             return SpvStorageClassInput; |             return SpvStorageClassInput; | ||||||
|         case ast::StorageClass::kOutput: |         case ast::StorageClass::kOut: | ||||||
|             return SpvStorageClassOutput; |             return SpvStorageClassOutput; | ||||||
|         case ast::StorageClass::kUniform: |         case ast::StorageClass::kUniform: | ||||||
|             return SpvStorageClassUniform; |             return SpvStorageClassUniform; | ||||||
| @ -4138,9 +4138,9 @@ SpvStorageClass Builder::ConvertStorageClass(ast::StorageClass klass) const { | |||||||
| SpvBuiltIn Builder::ConvertBuiltin(ast::Builtin builtin, ast::StorageClass storage) { | SpvBuiltIn Builder::ConvertBuiltin(ast::Builtin builtin, ast::StorageClass storage) { | ||||||
|     switch (builtin) { |     switch (builtin) { | ||||||
|         case ast::Builtin::kPosition: |         case ast::Builtin::kPosition: | ||||||
|             if (storage == ast::StorageClass::kInput) { |             if (storage == ast::StorageClass::kIn) { | ||||||
|                 return SpvBuiltInFragCoord; |                 return SpvBuiltInFragCoord; | ||||||
|             } else if (storage == ast::StorageClass::kOutput) { |             } else if (storage == ast::StorageClass::kOut) { | ||||||
|                 return SpvBuiltInPosition; |                 return SpvBuiltInPosition; | ||||||
|             } else { |             } else { | ||||||
|                 TINT_ICE(Writer, builder_.Diagnostics()) << "invalid storage class for builtin"; |                 TINT_ICE(Writer, builder_.Diagnostics()) << "invalid storage class for builtin"; | ||||||
|  | |||||||
| @ -443,29 +443,27 @@ INSTANTIATE_TEST_SUITE_P( | |||||||
|     BuiltinDataTest, |     BuiltinDataTest, | ||||||
|     testing::Values( |     testing::Values( | ||||||
|         BuiltinData{ast::Builtin::kNone, ast::StorageClass::kNone, SpvBuiltInMax}, |         BuiltinData{ast::Builtin::kNone, ast::StorageClass::kNone, SpvBuiltInMax}, | ||||||
|         BuiltinData{ast::Builtin::kPosition, ast::StorageClass::kInput, SpvBuiltInFragCoord}, |         BuiltinData{ast::Builtin::kPosition, ast::StorageClass::kIn, SpvBuiltInFragCoord}, | ||||||
|         BuiltinData{ast::Builtin::kPosition, ast::StorageClass::kOutput, SpvBuiltInPosition}, |         BuiltinData{ast::Builtin::kPosition, ast::StorageClass::kOut, SpvBuiltInPosition}, | ||||||
|         BuiltinData{ |         BuiltinData{ | ||||||
|             ast::Builtin::kVertexIndex, |             ast::Builtin::kVertexIndex, | ||||||
|             ast::StorageClass::kInput, |             ast::StorageClass::kIn, | ||||||
|             SpvBuiltInVertexIndex, |             SpvBuiltInVertexIndex, | ||||||
|         }, |         }, | ||||||
|         BuiltinData{ast::Builtin::kInstanceIndex, ast::StorageClass::kInput, |         BuiltinData{ast::Builtin::kInstanceIndex, ast::StorageClass::kIn, SpvBuiltInInstanceIndex}, | ||||||
|                     SpvBuiltInInstanceIndex}, |         BuiltinData{ast::Builtin::kFrontFacing, ast::StorageClass::kIn, SpvBuiltInFrontFacing}, | ||||||
|         BuiltinData{ast::Builtin::kFrontFacing, ast::StorageClass::kInput, SpvBuiltInFrontFacing}, |         BuiltinData{ast::Builtin::kFragDepth, ast::StorageClass::kOut, SpvBuiltInFragDepth}, | ||||||
|         BuiltinData{ast::Builtin::kFragDepth, ast::StorageClass::kOutput, SpvBuiltInFragDepth}, |         BuiltinData{ast::Builtin::kLocalInvocationId, ast::StorageClass::kIn, | ||||||
|         BuiltinData{ast::Builtin::kLocalInvocationId, ast::StorageClass::kInput, |  | ||||||
|                     SpvBuiltInLocalInvocationId}, |                     SpvBuiltInLocalInvocationId}, | ||||||
|         BuiltinData{ast::Builtin::kLocalInvocationIndex, ast::StorageClass::kInput, |         BuiltinData{ast::Builtin::kLocalInvocationIndex, ast::StorageClass::kIn, | ||||||
|                     SpvBuiltInLocalInvocationIndex}, |                     SpvBuiltInLocalInvocationIndex}, | ||||||
|         BuiltinData{ast::Builtin::kGlobalInvocationId, ast::StorageClass::kInput, |         BuiltinData{ast::Builtin::kGlobalInvocationId, ast::StorageClass::kIn, | ||||||
|                     SpvBuiltInGlobalInvocationId}, |                     SpvBuiltInGlobalInvocationId}, | ||||||
|         BuiltinData{ast::Builtin::kWorkgroupId, ast::StorageClass::kInput, SpvBuiltInWorkgroupId}, |         BuiltinData{ast::Builtin::kWorkgroupId, ast::StorageClass::kIn, SpvBuiltInWorkgroupId}, | ||||||
|         BuiltinData{ast::Builtin::kNumWorkgroups, ast::StorageClass::kInput, |         BuiltinData{ast::Builtin::kNumWorkgroups, ast::StorageClass::kIn, SpvBuiltInNumWorkgroups}, | ||||||
|                     SpvBuiltInNumWorkgroups}, |         BuiltinData{ast::Builtin::kSampleIndex, ast::StorageClass::kIn, SpvBuiltInSampleId}, | ||||||
|         BuiltinData{ast::Builtin::kSampleIndex, ast::StorageClass::kInput, SpvBuiltInSampleId}, |         BuiltinData{ast::Builtin::kSampleMask, ast::StorageClass::kIn, SpvBuiltInSampleMask}, | ||||||
|         BuiltinData{ast::Builtin::kSampleMask, ast::StorageClass::kInput, SpvBuiltInSampleMask}, |         BuiltinData{ast::Builtin::kSampleMask, ast::StorageClass::kOut, SpvBuiltInSampleMask})); | ||||||
|         BuiltinData{ast::Builtin::kSampleMask, ast::StorageClass::kOutput, SpvBuiltInSampleMask})); |  | ||||||
| 
 | 
 | ||||||
| TEST_F(BuilderTest, GlobalVar_DeclReadOnly) { | TEST_F(BuilderTest, GlobalVar_DeclReadOnly) { | ||||||
|     // struct A {
 |     // struct A {
 | ||||||
|  | |||||||
| @ -299,7 +299,7 @@ TEST_F(BuilderTest_Type, ReturnsGeneratedF16Matrix) { | |||||||
| 
 | 
 | ||||||
| TEST_F(BuilderTest_Type, GeneratePtr) { | TEST_F(BuilderTest_Type, GeneratePtr) { | ||||||
|     auto* i32 = create<sem::I32>(); |     auto* i32 = create<sem::I32>(); | ||||||
|     auto* ptr = create<sem::Pointer>(i32, ast::StorageClass::kOutput, ast::Access::kReadWrite); |     auto* ptr = create<sem::Pointer>(i32, ast::StorageClass::kOut, ast::Access::kReadWrite); | ||||||
| 
 | 
 | ||||||
|     spirv::Builder& b = Build(); |     spirv::Builder& b = Build(); | ||||||
| 
 | 
 | ||||||
| @ -314,7 +314,7 @@ TEST_F(BuilderTest_Type, GeneratePtr) { | |||||||
| 
 | 
 | ||||||
| TEST_F(BuilderTest_Type, ReturnsGeneratedPtr) { | TEST_F(BuilderTest_Type, ReturnsGeneratedPtr) { | ||||||
|     auto* i32 = create<sem::I32>(); |     auto* i32 = create<sem::I32>(); | ||||||
|     auto* ptr = create<sem::Pointer>(i32, ast::StorageClass::kOutput, ast::Access::kReadWrite); |     auto* ptr = create<sem::Pointer>(i32, ast::StorageClass::kOut, ast::Access::kReadWrite); | ||||||
| 
 | 
 | ||||||
|     spirv::Builder& b = Build(); |     spirv::Builder& b = Build(); | ||||||
| 
 | 
 | ||||||
| @ -601,8 +601,8 @@ INSTANTIATE_TEST_SUITE_P( | |||||||
|     BuilderTest_Type, |     BuilderTest_Type, | ||||||
|     PtrDataTest, |     PtrDataTest, | ||||||
|     testing::Values(PtrData{ast::StorageClass::kNone, SpvStorageClassMax}, |     testing::Values(PtrData{ast::StorageClass::kNone, SpvStorageClassMax}, | ||||||
|                     PtrData{ast::StorageClass::kInput, SpvStorageClassInput}, |                     PtrData{ast::StorageClass::kIn, SpvStorageClassInput}, | ||||||
|                     PtrData{ast::StorageClass::kOutput, SpvStorageClassOutput}, |                     PtrData{ast::StorageClass::kOut, SpvStorageClassOutput}, | ||||||
|                     PtrData{ast::StorageClass::kUniform, SpvStorageClassUniform}, |                     PtrData{ast::StorageClass::kUniform, SpvStorageClassUniform}, | ||||||
|                     PtrData{ast::StorageClass::kWorkgroup, SpvStorageClassWorkgroup}, |                     PtrData{ast::StorageClass::kWorkgroup, SpvStorageClassWorkgroup}, | ||||||
|                     PtrData{ast::StorageClass::kHandle, SpvStorageClassUniformConstant}, |                     PtrData{ast::StorageClass::kHandle, SpvStorageClassUniformConstant}, | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ struct PointLight { | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @binding(0) @group(0) var<uniform> uniforms : Uniforms; | @binding(0) @group(0) var<uniform> uniforms : Uniforms; | ||||||
| @binding(1) @group(0) var<storage_buffer, read> pointLights : PointLights; | @binding(1) @group(0) var<storage, read> pointLights : PointLights; | ||||||
| @binding(2) @group(0) var mySampler: sampler; | @binding(2) @group(0) var mySampler: sampler; | ||||||
| @binding(3) @group(0) var myTexture: texture_2d<f32>; | @binding(3) @group(0) var myTexture: texture_2d<f32>; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ | |||||||
| }; | }; | ||||||
| @group(0) @binding(0) var src : texture_2d<f32>; | @group(0) @binding(0) var src : texture_2d<f32>; | ||||||
| @group(0) @binding(1) var dst : texture_2d<f32>; | @group(0) @binding(1) var dst : texture_2d<f32>; | ||||||
| @group(0) @binding(2) var<storage_buffer, read_write> output : OutputBuf; | @group(0) @binding(2) var<storage, read_write> output : OutputBuf; | ||||||
| @group(0) @binding(3) var<uniform> uniforms : Uniforms; | @group(0) @binding(3) var<uniform> uniforms : Uniforms; | ||||||
| //@builtin(global_invocation_id) var<in> GlobalInvocationID : vec3<u32>; | //@builtin(global_invocation_id) var<in> GlobalInvocationID : vec3<u32>; | ||||||
| // Fp16 logic | // Fp16 logic | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user