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/reader/spirv/enum_converter.h" 16 17 namespace tint { 18 namespace reader { 19 namespace spirv { 20 EnumConverter(const FailStream & fs)21EnumConverter::EnumConverter(const FailStream& fs) : fail_stream_(fs) {} 22 23 EnumConverter::~EnumConverter() = default; 24 ToPipelineStage(SpvExecutionModel model)25ast::PipelineStage EnumConverter::ToPipelineStage(SpvExecutionModel model) { 26 switch (model) { 27 case SpvExecutionModelVertex: 28 return ast::PipelineStage::kVertex; 29 case SpvExecutionModelFragment: 30 return ast::PipelineStage::kFragment; 31 case SpvExecutionModelGLCompute: 32 return ast::PipelineStage::kCompute; 33 default: 34 break; 35 } 36 37 Fail() << "unknown SPIR-V execution model: " << uint32_t(model); 38 return ast::PipelineStage::kNone; 39 } 40 ToStorageClass(const SpvStorageClass sc)41ast::StorageClass EnumConverter::ToStorageClass(const SpvStorageClass sc) { 42 switch (sc) { 43 case SpvStorageClassInput: 44 return ast::StorageClass::kInput; 45 case SpvStorageClassOutput: 46 return ast::StorageClass::kOutput; 47 case SpvStorageClassUniform: 48 return ast::StorageClass::kUniform; 49 case SpvStorageClassWorkgroup: 50 return ast::StorageClass::kWorkgroup; 51 case SpvStorageClassUniformConstant: 52 return ast::StorageClass::kNone; 53 case SpvStorageClassStorageBuffer: 54 return ast::StorageClass::kStorage; 55 case SpvStorageClassImage: 56 return ast::StorageClass::kImage; 57 case SpvStorageClassPrivate: 58 return ast::StorageClass::kPrivate; 59 case SpvStorageClassFunction: 60 return ast::StorageClass::kFunction; 61 default: 62 break; 63 } 64 65 Fail() << "unknown SPIR-V storage class: " << uint32_t(sc); 66 return ast::StorageClass::kInvalid; 67 } 68 ToBuiltin(SpvBuiltIn b)69ast::Builtin EnumConverter::ToBuiltin(SpvBuiltIn b) { 70 switch (b) { 71 case SpvBuiltInPosition: 72 return ast::Builtin::kPosition; 73 case SpvBuiltInVertexIndex: 74 return ast::Builtin::kVertexIndex; 75 case SpvBuiltInInstanceIndex: 76 return ast::Builtin::kInstanceIndex; 77 case SpvBuiltInFrontFacing: 78 return ast::Builtin::kFrontFacing; 79 case SpvBuiltInFragCoord: 80 return ast::Builtin::kPosition; 81 case SpvBuiltInFragDepth: 82 return ast::Builtin::kFragDepth; 83 case SpvBuiltInLocalInvocationId: 84 return ast::Builtin::kLocalInvocationId; 85 case SpvBuiltInLocalInvocationIndex: 86 return ast::Builtin::kLocalInvocationIndex; 87 case SpvBuiltInGlobalInvocationId: 88 return ast::Builtin::kGlobalInvocationId; 89 case SpvBuiltInWorkgroupId: 90 return ast::Builtin::kWorkgroupId; 91 case SpvBuiltInSampleId: 92 return ast::Builtin::kSampleIndex; 93 case SpvBuiltInSampleMask: 94 return ast::Builtin::kSampleMask; 95 default: 96 break; 97 } 98 99 Fail() << "unknown SPIR-V builtin: " << uint32_t(b); 100 return ast::Builtin::kNone; 101 } 102 ToDim(SpvDim dim,bool arrayed)103ast::TextureDimension EnumConverter::ToDim(SpvDim dim, bool arrayed) { 104 if (arrayed) { 105 switch (dim) { 106 case SpvDim2D: 107 return ast::TextureDimension::k2dArray; 108 case SpvDimCube: 109 return ast::TextureDimension::kCubeArray; 110 default: 111 break; 112 } 113 Fail() << "arrayed dimension must be 2D or Cube. Got " << int(dim); 114 return ast::TextureDimension::kNone; 115 } 116 // Assume non-arrayed 117 switch (dim) { 118 case SpvDim1D: 119 return ast::TextureDimension::k1d; 120 case SpvDim2D: 121 return ast::TextureDimension::k2d; 122 case SpvDim3D: 123 return ast::TextureDimension::k3d; 124 case SpvDimCube: 125 return ast::TextureDimension::kCube; 126 default: 127 break; 128 } 129 Fail() << "invalid dimension: " << int(dim); 130 return ast::TextureDimension::kNone; 131 } 132 ToImageFormat(SpvImageFormat fmt)133ast::ImageFormat EnumConverter::ToImageFormat(SpvImageFormat fmt) { 134 switch (fmt) { 135 case SpvImageFormatUnknown: 136 return ast::ImageFormat::kNone; 137 138 // 8 bit channels 139 case SpvImageFormatRgba8: 140 return ast::ImageFormat::kRgba8Unorm; 141 case SpvImageFormatRgba8Snorm: 142 return ast::ImageFormat::kRgba8Snorm; 143 case SpvImageFormatRgba8ui: 144 return ast::ImageFormat::kRgba8Uint; 145 case SpvImageFormatRgba8i: 146 return ast::ImageFormat::kRgba8Sint; 147 148 // 16 bit channels 149 case SpvImageFormatRgba16ui: 150 return ast::ImageFormat::kRgba16Uint; 151 case SpvImageFormatRgba16i: 152 return ast::ImageFormat::kRgba16Sint; 153 case SpvImageFormatRgba16f: 154 return ast::ImageFormat::kRgba16Float; 155 156 // 32 bit channels 157 case SpvImageFormatR32ui: 158 return ast::ImageFormat::kR32Uint; 159 case SpvImageFormatR32i: 160 return ast::ImageFormat::kR32Sint; 161 case SpvImageFormatR32f: 162 return ast::ImageFormat::kR32Float; 163 case SpvImageFormatRg32ui: 164 return ast::ImageFormat::kRg32Uint; 165 case SpvImageFormatRg32i: 166 return ast::ImageFormat::kRg32Sint; 167 case SpvImageFormatRg32f: 168 return ast::ImageFormat::kRg32Float; 169 case SpvImageFormatRgba32ui: 170 return ast::ImageFormat::kRgba32Uint; 171 case SpvImageFormatRgba32i: 172 return ast::ImageFormat::kRgba32Sint; 173 case SpvImageFormatRgba32f: 174 return ast::ImageFormat::kRgba32Float; 175 default: 176 break; 177 } 178 Fail() << "invalid image format: " << int(fmt); 179 return ast::ImageFormat::kNone; 180 } 181 182 } // namespace spirv 183 } // namespace reader 184 } // namespace tint 185