1 // Copyright 2020 The Tint Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "src/writer/spirv/spv_dump.h"
16 #include "src/writer/spirv/test_helper.h"
17
18 namespace tint {
19 namespace writer {
20 namespace spirv {
21 namespace {
22
23 struct TestData {
24 ast::ImageFormat ast_format;
25 SpvImageFormat_ spv_format;
26 bool extended_format = false;
27 };
operator <<(std::ostream & out,TestData data)28 inline std::ostream& operator<<(std::ostream& out, TestData data) {
29 out << data.ast_format;
30 return out;
31 }
32 using ImageFormatConversionTest = TestParamHelper<TestData>;
33
TEST_P(ImageFormatConversionTest,ImageFormatConversion)34 TEST_P(ImageFormatConversionTest, ImageFormatConversion) {
35 auto param = GetParam();
36
37 spirv::Builder& b = Build();
38
39 EXPECT_EQ(b.convert_image_format_to_spv(param.ast_format), param.spv_format);
40
41 if (param.extended_format) {
42 EXPECT_EQ(DumpInstructions(b.capabilities()),
43 R"(OpCapability StorageImageExtendedFormats
44 )");
45 } else {
46 EXPECT_EQ(DumpInstructions(b.capabilities()), "");
47 }
48 }
49
50 INSTANTIATE_TEST_SUITE_P(
51 BuilderTest,
52 ImageFormatConversionTest,
53 testing::Values(
54 TestData{ast::ImageFormat::kR8Unorm, SpvImageFormatR8, true},
55 TestData{ast::ImageFormat::kR8Snorm, SpvImageFormatR8Snorm, true},
56 TestData{ast::ImageFormat::kR8Uint, SpvImageFormatR8ui, true},
57 TestData{ast::ImageFormat::kR8Sint, SpvImageFormatR8i, true},
58 TestData{ast::ImageFormat::kR16Uint, SpvImageFormatR16ui, true},
59 TestData{ast::ImageFormat::kR16Sint, SpvImageFormatR16i, true},
60 TestData{ast::ImageFormat::kR16Float, SpvImageFormatR16f, true},
61 TestData{ast::ImageFormat::kRg8Unorm, SpvImageFormatRg8, true},
62 TestData{ast::ImageFormat::kRg8Snorm, SpvImageFormatRg8Snorm, true},
63 TestData{ast::ImageFormat::kRg8Uint, SpvImageFormatRg8ui, true},
64 TestData{ast::ImageFormat::kRg8Sint, SpvImageFormatRg8i, true},
65 TestData{ast::ImageFormat::kR32Uint, SpvImageFormatR32ui},
66 TestData{ast::ImageFormat::kR32Sint, SpvImageFormatR32i},
67 TestData{ast::ImageFormat::kR32Float, SpvImageFormatR32f},
68 TestData{ast::ImageFormat::kRg16Uint, SpvImageFormatRg16ui, true},
69 TestData{ast::ImageFormat::kRg16Sint, SpvImageFormatRg16i, true},
70 TestData{ast::ImageFormat::kRg16Float, SpvImageFormatRg16f, true},
71 TestData{ast::ImageFormat::kRgba8Unorm, SpvImageFormatRgba8},
72 TestData{ast::ImageFormat::kRgba8UnormSrgb, SpvImageFormatUnknown},
73 TestData{ast::ImageFormat::kRgba8Snorm, SpvImageFormatRgba8Snorm},
74 TestData{ast::ImageFormat::kRgba8Uint, SpvImageFormatRgba8ui},
75 TestData{ast::ImageFormat::kRgba8Sint, SpvImageFormatRgba8i},
76 TestData{ast::ImageFormat::kBgra8Unorm, SpvImageFormatUnknown},
77 TestData{ast::ImageFormat::kBgra8UnormSrgb, SpvImageFormatUnknown},
78 TestData{ast::ImageFormat::kRgb10A2Unorm, SpvImageFormatRgb10A2, true},
79 TestData{ast::ImageFormat::kRg11B10Float, SpvImageFormatR11fG11fB10f,
80 true},
81 TestData{ast::ImageFormat::kRg32Uint, SpvImageFormatRg32ui, true},
82 TestData{ast::ImageFormat::kRg32Sint, SpvImageFormatRg32i, true},
83 TestData{ast::ImageFormat::kRg32Float, SpvImageFormatRg32f, true},
84 TestData{ast::ImageFormat::kRgba16Uint, SpvImageFormatRgba16ui},
85 TestData{ast::ImageFormat::kRgba16Sint, SpvImageFormatRgba16i},
86 TestData{ast::ImageFormat::kRgba16Float, SpvImageFormatRgba16f},
87 TestData{ast::ImageFormat::kRgba32Uint, SpvImageFormatRgba32ui},
88 TestData{ast::ImageFormat::kRgba32Sint, SpvImageFormatRgba32i},
89 TestData{ast::ImageFormat::kRgba32Float, SpvImageFormatRgba32f}));
90
91 } // namespace
92 } // namespace spirv
93 } // namespace writer
94 } // namespace tint
95