• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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