[wgsl-reader] Parsing image storage type

Bug: tint:147
Change-Id: I79713b5dfa0a4b219cff7a6bb3c514557cf4f261
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/28121
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: David Neto <dneto@google.com>
This commit is contained in:
Tomek Ponitka 2020-09-08 16:38:39 +00:00 committed by Commit Bot service account
parent 4e2d2484f8
commit 03f5e2fc9d
13 changed files with 799 additions and 0 deletions

View File

@ -898,6 +898,7 @@ source_set("tint_unittests_wgsl_reader_src") {
"src/reader/wgsl/parser_impl_global_decl_test.cc", "src/reader/wgsl/parser_impl_global_decl_test.cc",
"src/reader/wgsl/parser_impl_global_variable_decl_test.cc", "src/reader/wgsl/parser_impl_global_variable_decl_test.cc",
"src/reader/wgsl/parser_impl_if_stmt_test.cc", "src/reader/wgsl/parser_impl_if_stmt_test.cc",
"src/reader/wgsl/parser_impl_image_storage_type_test.cc",
"src/reader/wgsl/parser_impl_import_decl_test.cc", "src/reader/wgsl/parser_impl_import_decl_test.cc",
"src/reader/wgsl/parser_impl_inclusive_or_expression_test.cc", "src/reader/wgsl/parser_impl_inclusive_or_expression_test.cc",
"src/reader/wgsl/parser_impl_logical_and_expression_test.cc", "src/reader/wgsl/parser_impl_logical_and_expression_test.cc",

View File

@ -429,6 +429,7 @@ if(${TINT_BUILD_WGSL_READER})
reader/wgsl/parser_impl_global_decl_test.cc reader/wgsl/parser_impl_global_decl_test.cc
reader/wgsl/parser_impl_global_variable_decl_test.cc reader/wgsl/parser_impl_global_variable_decl_test.cc
reader/wgsl/parser_impl_if_stmt_test.cc reader/wgsl/parser_impl_if_stmt_test.cc
reader/wgsl/parser_impl_image_storage_type_test.cc
reader/wgsl/parser_impl_import_decl_test.cc reader/wgsl/parser_impl_import_decl_test.cc
reader/wgsl/parser_impl_inclusive_or_expression_test.cc reader/wgsl/parser_impl_inclusive_or_expression_test.cc
reader/wgsl/parser_impl_logical_and_expression_test.cc reader/wgsl/parser_impl_logical_and_expression_test.cc

View File

@ -48,6 +48,9 @@ std::ostream& operator<<(std::ostream& out, StorageAccess access) {
std::ostream& operator<<(std::ostream& out, ImageFormat format) { std::ostream& operator<<(std::ostream& out, ImageFormat format) {
switch (format) { switch (format) {
case ImageFormat::kNone:
out << "none";
break;
case ImageFormat::kR8Unorm: case ImageFormat::kR8Unorm:
out << "r8unorm"; out << "r8unorm";
break; break;

View File

@ -29,6 +29,7 @@ std::ostream& operator<<(std::ostream& out, StorageAccess dim);
/// The image format in the storage texture /// The image format in the storage texture
enum class ImageFormat { enum class ImageFormat {
kNone = -1,
kR8Unorm, kR8Unorm,
kR8Snorm, kR8Snorm,
kR8Uint, kR8Uint,

View File

@ -515,6 +515,76 @@ Token Lexer::check_keyword(const Source& source, const std::string& str) {
return {Token::Type::kFn, source, "fn"}; return {Token::Type::kFn, source, "fn"};
if (str == "for") if (str == "for")
return {Token::Type::kFor, source, "for"}; return {Token::Type::kFor, source, "for"};
if (str == "bgra8unorm")
return {Token::Type::kFormatBgra8Unorm, source, "bgra8unorm"};
if (str == "bgra8unorm_srgb")
return {Token::Type::kFormatBgra8UnormSrgb, source, "bgra8unorm_srgb"};
if (str == "r16float")
return {Token::Type::kFormatR16Float, source, "r16float"};
if (str == "r16sint")
return {Token::Type::kFormatR16Sint, source, "r16sint"};
if (str == "r16uint")
return {Token::Type::kFormatR16Uint, source, "r16uint"};
if (str == "r32float")
return {Token::Type::kFormatR32Float, source, "r32float"};
if (str == "r32sint")
return {Token::Type::kFormatR32Sint, source, "r32sint"};
if (str == "r32uint")
return {Token::Type::kFormatR32Uint, source, "r32uint"};
if (str == "r8sint")
return {Token::Type::kFormatR8Sint, source, "r8sint"};
if (str == "r8snorm")
return {Token::Type::kFormatR8Snorm, source, "r8snorm"};
if (str == "r8uint")
return {Token::Type::kFormatR8Uint, source, "r8uint"};
if (str == "r8unorm")
return {Token::Type::kFormatR8Unorm, source, "r8unorm"};
if (str == "rg11b10float")
return {Token::Type::kFormatRg11B10Float, source, "rg11b10float"};
if (str == "rg16float")
return {Token::Type::kFormatRg16Float, source, "rg16float"};
if (str == "rg16sint")
return {Token::Type::kFormatRg16Sint, source, "rg16sint"};
if (str == "rg16uint")
return {Token::Type::kFormatRg16Uint, source, "rg16uint"};
if (str == "rg32float")
return {Token::Type::kFormatRg32Float, source, "rg32float"};
if (str == "rg32sint")
return {Token::Type::kFormatRg32Sint, source, "rg32sint"};
if (str == "rg32uint")
return {Token::Type::kFormatRg32Uint, source, "rg32uint"};
if (str == "rg8sint")
return {Token::Type::kFormatRg8Sint, source, "rg8sint"};
if (str == "rg8snorm")
return {Token::Type::kFormatRg8Snorm, source, "rg8snorm"};
if (str == "rg8uint")
return {Token::Type::kFormatRg8Uint, source, "rg8uint"};
if (str == "rg8unorm")
return {Token::Type::kFormatRg8Unorm, source, "rg8unorm"};
if (str == "rgb10a2unorm")
return {Token::Type::kFormatRgb10A2Unorm, source, "rgb10a2unorm"};
if (str == "rgba16float")
return {Token::Type::kFormatRgba16Float, source, "rgba16float"};
if (str == "rgba16sint")
return {Token::Type::kFormatRgba16Sint, source, "rgba16sint"};
if (str == "rgba16uint")
return {Token::Type::kFormatRgba16Uint, source, "rgba16uint"};
if (str == "rgba32float")
return {Token::Type::kFormatRgba32Float, source, "rgba32float"};
if (str == "rgba32sint")
return {Token::Type::kFormatRgba32Sint, source, "rgba32sint"};
if (str == "rgba32uint")
return {Token::Type::kFormatRgba32Uint, source, "rgba32uint"};
if (str == "rgba8sint")
return {Token::Type::kFormatRgba8Sint, source, "rgba8sint"};
if (str == "rgba8snorm")
return {Token::Type::kFormatRgba8Snorm, source, "rgba8snorm"};
if (str == "rgba8uint")
return {Token::Type::kFormatRgba8Uint, source, "rgba8uint"};
if (str == "rgba8unorm")
return {Token::Type::kFormatRgba8Unorm, source, "rgba8unorm"};
if (str == "rgba8unorm_srgb")
return {Token::Type::kFormatRgba8UnormSrgb, source, "rgba8unorm_srgb"};
if (str == "fragment") if (str == "fragment")
return {Token::Type::kFragment, source, "fragment"}; return {Token::Type::kFragment, source, "fragment"};
if (str == "function") if (str == "function")

View File

@ -435,6 +435,41 @@ INSTANTIATE_TEST_SUITE_P(
TokenData{"false", Token::Type::kFalse}, TokenData{"false", Token::Type::kFalse},
TokenData{"fn", Token::Type::kFn}, TokenData{"fn", Token::Type::kFn},
TokenData{"for", Token::Type::kFor}, TokenData{"for", Token::Type::kFor},
TokenData{"bgra8unorm", Token::Type::kFormatBgra8Unorm},
TokenData{"bgra8unorm_srgb", Token::Type::kFormatBgra8UnormSrgb},
TokenData{"r16float", Token::Type::kFormatR16Float},
TokenData{"r16sint", Token::Type::kFormatR16Sint},
TokenData{"r16uint", Token::Type::kFormatR16Uint},
TokenData{"r32float", Token::Type::kFormatR32Float},
TokenData{"r32sint", Token::Type::kFormatR32Sint},
TokenData{"r32uint", Token::Type::kFormatR32Uint},
TokenData{"r8sint", Token::Type::kFormatR8Sint},
TokenData{"r8snorm", Token::Type::kFormatR8Snorm},
TokenData{"r8uint", Token::Type::kFormatR8Uint},
TokenData{"r8unorm", Token::Type::kFormatR8Unorm},
TokenData{"rg11b10float", Token::Type::kFormatRg11B10Float},
TokenData{"rg16float", Token::Type::kFormatRg16Float},
TokenData{"rg16sint", Token::Type::kFormatRg16Sint},
TokenData{"rg16uint", Token::Type::kFormatRg16Uint},
TokenData{"rg32float", Token::Type::kFormatRg32Float},
TokenData{"rg32sint", Token::Type::kFormatRg32Sint},
TokenData{"rg32uint", Token::Type::kFormatRg32Uint},
TokenData{"rg8sint", Token::Type::kFormatRg8Sint},
TokenData{"rg8snorm", Token::Type::kFormatRg8Snorm},
TokenData{"rg8uint", Token::Type::kFormatRg8Uint},
TokenData{"rg8unorm", Token::Type::kFormatRg8Unorm},
TokenData{"rgb10a2unorm", Token::Type::kFormatRgb10A2Unorm},
TokenData{"rgba16float", Token::Type::kFormatRgba16Float},
TokenData{"rgba16sint", Token::Type::kFormatRgba16Sint},
TokenData{"rgba16uint", Token::Type::kFormatRgba16Uint},
TokenData{"rgba32float", Token::Type::kFormatRgba32Float},
TokenData{"rgba32sint", Token::Type::kFormatRgba32Sint},
TokenData{"rgba32uint", Token::Type::kFormatRgba32Uint},
TokenData{"rgba8sint", Token::Type::kFormatRgba8Sint},
TokenData{"rgba8snorm", Token::Type::kFormatRgba8Snorm},
TokenData{"rgba8uint", Token::Type::kFormatRgba8Uint},
TokenData{"rgba8unorm", Token::Type::kFormatRgba8Unorm},
TokenData{"rgba8unorm_srgb", Token::Type::kFormatRgba8UnormSrgb},
TokenData{"fragment", Token::Type::kFragment}, TokenData{"fragment", Token::Type::kFragment},
TokenData{"function", Token::Type::kFunction}, TokenData{"function", Token::Type::kFunction},
TokenData{"i32", Token::Type::kI32}, TokenData{"i32", Token::Type::kI32},

View File

@ -723,6 +723,187 @@ ast::type::Type* ParserImpl::depth_texture_type() {
return nullptr; return nullptr;
} }
// image_storage_type
// : R8UNORM
// | R8SNORM
// | R8UINT
// | R8SINT
// | R16UINT
// | R16SINT
// | R16FLOAT
// | RG8UNORM
// | RG8SNORM
// | RG8UINT
// | RG8SINT
// | R32UINT
// | R32SINT
// | R32FLOAT
// | RG16UINT
// | RG16SINT
// | RG16FLOAT
// | RGBA8UNORM
/// | RGBA8UNORM-SRGB
// | RGBA8SNORM
// | RGBA8UINT
// | RGBA8SINT
// | BGRA8UNORM
// | BGRA8UNORM-SRGB
// | RGB10A2UNORM
// | RG11B10FLOAT
// | RG32UINT
// | RG32SINT
// | RG32FLOAT
// | RGBA16UINT
// | RGBA16SINT
// | RGBA16FLOAT
// | RGBA32UINT
// | RGBA32SINT
// | RGBA32FLOAT
ast::type::ImageFormat ParserImpl::image_storage_type() {
auto t = peek();
if (t.IsFormatR8Unorm()) {
next(); // Consume the peek
return ast::type::ImageFormat::kR8Unorm;
}
if (t.IsFormatR8Snorm()) {
next(); // Consume the peek
return ast::type::ImageFormat::kR8Snorm;
}
if (t.IsFormatR8Uint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kR8Uint;
}
if (t.IsFormatR8Sint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kR8Sint;
}
if (t.IsFormatR16Uint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kR16Uint;
}
if (t.IsFormatR16Sint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kR16Sint;
}
if (t.IsFormatR16Float()) {
next(); // Consume the peek
return ast::type::ImageFormat::kR16Float;
}
if (t.IsFormatRg8Unorm()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRg8Unorm;
}
if (t.IsFormatRg8Snorm()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRg8Snorm;
}
if (t.IsFormatRg8Uint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRg8Uint;
}
if (t.IsFormatRg8Sint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRg8Sint;
}
if (t.IsFormatR32Uint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kR32Uint;
}
if (t.IsFormatR32Sint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kR32Sint;
}
if (t.IsFormatR32Float()) {
next(); // Consume the peek
return ast::type::ImageFormat::kR32Float;
}
if (t.IsFormatRg16Uint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRg16Uint;
}
if (t.IsFormatRg16Sint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRg16Sint;
}
if (t.IsFormatRg16Float()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRg16Float;
}
if (t.IsFormatRgba8Unorm()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgba8Unorm;
}
if (t.IsFormatRgba8UnormSrgb()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgba8UnormSrgb;
}
if (t.IsFormatRgba8Snorm()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgba8Snorm;
}
if (t.IsFormatRgba8Uint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgba8Uint;
}
if (t.IsFormatRgba8Sint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgba8Sint;
}
if (t.IsFormatBgra8Unorm()) {
next(); // Consume the peek
return ast::type::ImageFormat::kBgra8Unorm;
}
if (t.IsFormatBgra8UnormSrgb()) {
next(); // Consume the peek
return ast::type::ImageFormat::kBgra8UnormSrgb;
}
if (t.IsFormatRgb10A2Unorm()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgb10A2Unorm;
}
if (t.IsFormatRg11B10Float()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRg11B10Float;
}
if (t.IsFormatRg32Uint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRg32Uint;
}
if (t.IsFormatRg32Sint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRg32Sint;
}
if (t.IsFormatRg32Float()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRg32Float;
}
if (t.IsFormatRgba16Uint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgba16Uint;
}
if (t.IsFormatRgba16Sint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgba16Sint;
}
if (t.IsFormatRgba16Float()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgba16Float;
}
if (t.IsFormatRgba32Uint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgba32Uint;
}
if (t.IsFormatRgba32Sint()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgba32Sint;
}
if (t.IsFormatRgba32Float()) {
next(); // Consume the peek
return ast::type::ImageFormat::kRgba32Float;
}
return ast::type::ImageFormat::kNone;
}
// variable_ident_decl // variable_ident_decl
// : IDENT COLON type_decl // : IDENT COLON type_decl
std::pair<std::string, ast::type::Type*> ParserImpl::variable_ident_decl() { std::pair<std::string, ast::type::Type*> ParserImpl::variable_ident_decl() {

View File

@ -40,6 +40,7 @@
#include "src/ast/struct_decoration.h" #include "src/ast/struct_decoration.h"
#include "src/ast/struct_member.h" #include "src/ast/struct_member.h"
#include "src/ast/struct_member_decoration.h" #include "src/ast/struct_member_decoration.h"
#include "src/ast/type/storage_texture_type.h"
#include "src/ast/type/texture_type.h" #include "src/ast/type/texture_type.h"
#include "src/ast/type/type.h" #include "src/ast/type/type.h"
#include "src/ast/variable.h" #include "src/ast/variable.h"
@ -193,6 +194,9 @@ class ParserImpl {
/// Parses a `depth_texture_type` grammar element /// Parses a `depth_texture_type` grammar element
/// @returns the parsed Type or nullptr if none matched. /// @returns the parsed Type or nullptr if none matched.
ast::type::Type* depth_texture_type(); ast::type::Type* depth_texture_type();
/// Parses a `image_storage_type` grammar element
/// @returns returns the image format or kNone if none matched.
ast::type::ImageFormat image_storage_type();
/// Parses a `function_type_decl` grammar element /// Parses a `function_type_decl` grammar element
/// @returns the parsed type or nullptr otherwise /// @returns the parsed type or nullptr otherwise
ast::type::Type* function_type_decl(); ast::type::Type* function_type_decl();

View File

@ -0,0 +1,280 @@
// Copyright 2020 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "gtest/gtest.h"
#include "src/ast/type/texture_type.h"
#include "src/reader/wgsl/parser_impl.h"
#include "src/reader/wgsl/parser_impl_test_helper.h"
namespace tint {
namespace reader {
namespace wgsl {
namespace {
TEST_F(ParserImplTest, ImageStorageType_Invalid) {
auto* p = parser("1234");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kNone);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_R8Unorm) {
auto* p = parser("r8unorm");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kR8Unorm);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_R8Snorm) {
auto* p = parser("r8snorm");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kR8Snorm);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_R8Uint) {
auto* p = parser("r8uint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kR8Uint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_R8Sint) {
auto* p = parser("r8sint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kR8Sint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_R16Uint) {
auto* p = parser("r16uint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kR16Uint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_R16Sint) {
auto* p = parser("r16sint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kR16Sint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_R16Float) {
auto* p = parser("r16float");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kR16Float);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rg8Unorm) {
auto* p = parser("rg8unorm");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRg8Unorm);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rg8Snorm) {
auto* p = parser("rg8snorm");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRg8Snorm);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rg8Uint) {
auto* p = parser("rg8uint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRg8Uint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rg8Sint) {
auto* p = parser("rg8sint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRg8Sint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_R32Uint) {
auto* p = parser("r32uint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kR32Uint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_R32Sint) {
auto* p = parser("r32sint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kR32Sint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_R32Float) {
auto* p = parser("r32float");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kR32Float);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rg16Uint) {
auto* p = parser("rg16uint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRg16Uint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rg16Sint) {
auto* p = parser("rg16sint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRg16Sint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rg16Float) {
auto* p = parser("rg16float");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRg16Float);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgba8Unorm) {
auto* p = parser("rgba8unorm");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgba8Unorm);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgba8UnormSrgb) {
auto* p = parser("rgba8unorm_srgb");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgba8UnormSrgb);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgba8Snorm) {
auto* p = parser("rgba8snorm");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgba8Snorm);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgba8Uint) {
auto* p = parser("rgba8uint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgba8Uint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgba8Sint) {
auto* p = parser("rgba8sint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgba8Sint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Bgra8Unorm) {
auto* p = parser("bgra8unorm");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kBgra8Unorm);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Bgra8UnormSrgb) {
auto* p = parser("bgra8unorm_srgb");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kBgra8UnormSrgb);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgb10A2Unorm) {
auto* p = parser("rgb10a2unorm");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgb10A2Unorm);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rg11B10Float) {
auto* p = parser("rg11b10float");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRg11B10Float);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rg32Uint) {
auto* p = parser("rg32uint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRg32Uint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rg32Sint) {
auto* p = parser("rg32sint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRg32Sint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rg32Float) {
auto* p = parser("rg32float");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRg32Float);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgba16Uint) {
auto* p = parser("rgba16uint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgba16Uint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgba16Sint) {
auto* p = parser("rgba16sint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgba16Sint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgba16Float) {
auto* p = parser("rgba16float");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgba16Float);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgba32Uint) {
auto* p = parser("rgba32uint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgba32Uint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgba32Sint) {
auto* p = parser("rgba32sint");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgba32Sint);
EXPECT_FALSE(p->has_error());
}
TEST_F(ParserImplTest, ImageStorageType_Rgba32Float) {
auto* p = parser("rgba32float");
auto t = p->image_storage_type();
EXPECT_EQ(t, ast::type::ImageFormat::kRgba32Float);
EXPECT_FALSE(p->has_error());
}
} // namespace
} // namespace wgsl
} // namespace reader
} // namespace tint

View File

@ -151,6 +151,76 @@ std::string Token::TypeToName(Type type) {
return "fn"; return "fn";
case Token::Type::kFor: case Token::Type::kFor:
return "for"; return "for";
case Token::Type::kFormatBgra8Unorm:
return "bgra8unorm";
case Token::Type::kFormatBgra8UnormSrgb:
return "bgra8unorm_srgb";
case Token::Type::kFormatR16Float:
return "r16float";
case Token::Type::kFormatR16Sint:
return "r16sint";
case Token::Type::kFormatR16Uint:
return "r16uint";
case Token::Type::kFormatR32Float:
return "r32float";
case Token::Type::kFormatR32Sint:
return "r32sint";
case Token::Type::kFormatR32Uint:
return "r32uint";
case Token::Type::kFormatR8Sint:
return "r8sint";
case Token::Type::kFormatR8Snorm:
return "r8snorm";
case Token::Type::kFormatR8Uint:
return "r8uint";
case Token::Type::kFormatR8Unorm:
return "r8unorm";
case Token::Type::kFormatRg11B10Float:
return "rg11b10float";
case Token::Type::kFormatRg16Float:
return "rg16float";
case Token::Type::kFormatRg16Sint:
return "rg16sint";
case Token::Type::kFormatRg16Uint:
return "rg16uint";
case Token::Type::kFormatRg32Float:
return "rg32float";
case Token::Type::kFormatRg32Sint:
return "rg32sint";
case Token::Type::kFormatRg32Uint:
return "rg32uint";
case Token::Type::kFormatRg8Sint:
return "rg8sint";
case Token::Type::kFormatRg8Snorm:
return "rg8snorm";
case Token::Type::kFormatRg8Uint:
return "rg8uint";
case Token::Type::kFormatRg8Unorm:
return "rg8unorm";
case Token::Type::kFormatRgb10A2Unorm:
return "rgb10a2unorm";
case Token::Type::kFormatRgba16Float:
return "rgba16float";
case Token::Type::kFormatRgba16Sint:
return "rgba16sint";
case Token::Type::kFormatRgba16Uint:
return "rgba16uint";
case Token::Type::kFormatRgba32Float:
return "rgba32float";
case Token::Type::kFormatRgba32Sint:
return "rgba32sint";
case Token::Type::kFormatRgba32Uint:
return "rgba32uint";
case Token::Type::kFormatRgba8Sint:
return "rgba8sint";
case Token::Type::kFormatRgba8Snorm:
return "rgba8snorm";
case Token::Type::kFormatRgba8Uint:
return "rgba8uint";
case Token::Type::kFormatRgba8Unorm:
return "rgba8unorm";
case Token::Type::kFormatRgba8UnormSrgb:
return "rgba8unorm_srgb";
case Token::Type::kFragment: case Token::Type::kFragment:
return "fragment"; return "fragment";
case Token::Type::kFunction: case Token::Type::kFunction:

View File

@ -162,6 +162,76 @@ class Token {
kFn, kFn,
// A 'for' // A 'for'
kFor, kFor,
// A 'Bgra8Unorm' format
kFormatBgra8Unorm,
// A 'Bgra8UnormSrgb' format
kFormatBgra8UnormSrgb,
// A 'R16Float' format
kFormatR16Float,
// A 'R16Sint' format
kFormatR16Sint,
// A 'R16Uint' format
kFormatR16Uint,
// A 'R32Float' format
kFormatR32Float,
// A 'R32Sint' format
kFormatR32Sint,
// A 'R32Uint' format
kFormatR32Uint,
// A 'R8Sint' format
kFormatR8Sint,
// A 'R8Snorm' format
kFormatR8Snorm,
// A 'R8Uint' format
kFormatR8Uint,
// A 'R8Unorm' format
kFormatR8Unorm,
// A 'Rg11B10Float' format
kFormatRg11B10Float,
// A 'Rg16Float' format
kFormatRg16Float,
// A 'Rg16Sint' format
kFormatRg16Sint,
// A 'Rg16Uint' format
kFormatRg16Uint,
// A 'Rg32Float' format
kFormatRg32Float,
// A 'Rg32Sint' format
kFormatRg32Sint,
// A 'Rg32Uint' format
kFormatRg32Uint,
// A 'Rg8Sint' format
kFormatRg8Sint,
// A 'Rg8Snorm' format
kFormatRg8Snorm,
// A 'Rg8Uint' format
kFormatRg8Uint,
// A 'Rg8Unorm' format
kFormatRg8Unorm,
// A 'Rgb10A2Unorm' format
kFormatRgb10A2Unorm,
// A 'Rgba16Float' format
kFormatRgba16Float,
// A 'Rgba16Sint' format
kFormatRgba16Sint,
// A 'Rgba16Uint' format
kFormatRgba16Uint,
// A 'Rgba32Float' format
kFormatRgba32Float,
// A 'Rgba32Sint' format
kFormatRgba32Sint,
// A 'Rgba32Uint' format
kFormatRgba32Uint,
// A 'Rgba8Sint' format
kFormatRgba8Sint,
// A 'Rgba8Snorm' format
kFormatRgba8Snorm,
// A 'Rgba8Uint' format
kFormatRgba8Uint,
// A 'Rgba8Unorm' format
kFormatRgba8Unorm,
// A 'Rgba8UnormSrgb' format
kFormatRgba8UnormSrgb,
/// A 'fragment' /// A 'fragment'
kFragment, kFragment,
/// A 'function' /// A 'function'
@ -449,6 +519,84 @@ class Token {
bool IsFn() const { return type_ == Type::kFn; } bool IsFn() const { return type_ == Type::kFn; }
/// @returns true if token is a 'for' /// @returns true if token is a 'for'
bool IsFor() const { return type_ == Type::kFor; } bool IsFor() const { return type_ == Type::kFor; }
/// @returns true if token is a 'Bgra8Unorm' format
bool IsFormatBgra8Unorm() const { return type_ == Type::kFormatBgra8Unorm; }
/// @returns true if token is a 'Bgra8UnormSrgb' format
bool IsFormatBgra8UnormSrgb() const {
return type_ == Type::kFormatBgra8UnormSrgb;
}
/// @returns true if token is a 'R16Float' format
bool IsFormatR16Float() const { return type_ == Type::kFormatR16Float; }
/// @returns true if token is a 'R16Sint' format
bool IsFormatR16Sint() const { return type_ == Type::kFormatR16Sint; }
/// @returns true if token is a 'R16Uint' format
bool IsFormatR16Uint() const { return type_ == Type::kFormatR16Uint; }
/// @returns true if token is a 'R32Float' format
bool IsFormatR32Float() const { return type_ == Type::kFormatR32Float; }
/// @returns true if token is a 'R32Sint' format
bool IsFormatR32Sint() const { return type_ == Type::kFormatR32Sint; }
/// @returns true if token is a 'R32Uint' format
bool IsFormatR32Uint() const { return type_ == Type::kFormatR32Uint; }
/// @returns true if token is a 'R8Sint' format
bool IsFormatR8Sint() const { return type_ == Type::kFormatR8Sint; }
/// @returns true if token is a 'R8Snorm' format
bool IsFormatR8Snorm() const { return type_ == Type::kFormatR8Snorm; }
/// @returns true if token is a 'R8Uint' format
bool IsFormatR8Uint() const { return type_ == Type::kFormatR8Uint; }
/// @returns true if token is a 'R8Unorm' format
bool IsFormatR8Unorm() const { return type_ == Type::kFormatR8Unorm; }
/// @returns true if token is a 'Rg11B10Float' format
bool IsFormatRg11B10Float() const {
return type_ == Type::kFormatRg11B10Float;
}
/// @returns true if token is a 'Rg16Float' format
bool IsFormatRg16Float() const { return type_ == Type::kFormatRg16Float; }
/// @returns true if token is a 'Rg16Sint' format
bool IsFormatRg16Sint() const { return type_ == Type::kFormatRg16Sint; }
/// @returns true if token is a 'Rg16Uint' format
bool IsFormatRg16Uint() const { return type_ == Type::kFormatRg16Uint; }
/// @returns true if token is a 'Rg32Float' format
bool IsFormatRg32Float() const { return type_ == Type::kFormatRg32Float; }
/// @returns true if token is a 'Rg32Sint' format
bool IsFormatRg32Sint() const { return type_ == Type::kFormatRg32Sint; }
/// @returns true if token is a 'Rg32Uint' format
bool IsFormatRg32Uint() const { return type_ == Type::kFormatRg32Uint; }
/// @returns true if token is a 'Rg8Sint' format
bool IsFormatRg8Sint() const { return type_ == Type::kFormatRg8Sint; }
/// @returns true if token is a 'Rg8Snorm' format
bool IsFormatRg8Snorm() const { return type_ == Type::kFormatRg8Snorm; }
/// @returns true if token is a 'Rg8Uint' format
bool IsFormatRg8Uint() const { return type_ == Type::kFormatRg8Uint; }
/// @returns true if token is a 'Rg8Unorm' format
bool IsFormatRg8Unorm() const { return type_ == Type::kFormatRg8Unorm; }
/// @returns true if token is a 'Rgb10A2Unorm' format
bool IsFormatRgb10A2Unorm() const {
return type_ == Type::kFormatRgb10A2Unorm;
}
/// @returns true if token is a 'Rgba16Float' format
bool IsFormatRgba16Float() const { return type_ == Type::kFormatRgba16Float; }
/// @returns true if token is a 'Rgba16Sint' format
bool IsFormatRgba16Sint() const { return type_ == Type::kFormatRgba16Sint; }
/// @returns true if token is a 'Rgba16Uint' format
bool IsFormatRgba16Uint() const { return type_ == Type::kFormatRgba16Uint; }
/// @returns true if token is a 'Rgba32Float' format
bool IsFormatRgba32Float() const { return type_ == Type::kFormatRgba32Float; }
/// @returns true if token is a 'Rgba32Sint' format
bool IsFormatRgba32Sint() const { return type_ == Type::kFormatRgba32Sint; }
/// @returns true if token is a 'Rgba32Uint' format
bool IsFormatRgba32Uint() const { return type_ == Type::kFormatRgba32Uint; }
/// @returns true if token is a 'Rgba8Sint' format
bool IsFormatRgba8Sint() const { return type_ == Type::kFormatRgba8Sint; }
/// @returns true if token is a 'Rgba8Snorm' format
bool IsFormatRgba8Snorm() const { return type_ == Type::kFormatRgba8Snorm; }
/// @returns true if token is a 'Rgba8Uint' format
bool IsFormatRgba8Uint() const { return type_ == Type::kFormatRgba8Uint; }
/// @returns true if token is a 'Rgba8Unorm' format
bool IsFormatRgba8Unorm() const { return type_ == Type::kFormatRgba8Unorm; }
/// @returns true if token is a 'Rgba8UnormSrgb' format
bool IsFormatRgba8UnormSrgb() const {
return type_ == Type::kFormatRgba8UnormSrgb;
}
/// @returns true if token is a 'fragment' /// @returns true if token is a 'fragment'
bool IsFragment() const { return type_ == Type::kFragment; } bool IsFragment() const { return type_ == Type::kFragment; }
/// @returns true if token is a 'function' /// @returns true if token is a 'function'

View File

@ -937,6 +937,9 @@ bool TypeDeterminer::DetermineStorageTextureSubtype(
ctx_.type_mgr().Get(std::make_unique<ast::type::F32Type>())); ctx_.type_mgr().Get(std::make_unique<ast::type::F32Type>()));
return true; return true;
} }
case ast::type::ImageFormat::kNone:
break;
} }
return false; return false;

View File

@ -2407,6 +2407,8 @@ SpvImageFormat Builder::convert_image_format_to_spv(
return SpvImageFormatRgba32i; return SpvImageFormatRgba32i;
case ast::type::ImageFormat::kRgba32Float: case ast::type::ImageFormat::kRgba32Float:
return SpvImageFormatRgba32f; return SpvImageFormatRgba32f;
case ast::type::ImageFormat::kNone:
return SpvImageFormatUnknown;
} }
return SpvImageFormatUnknown; return SpvImageFormatUnknown;
} }