blob: 7f9961e71d404c9f6d019b8ee708a2e6eac2dcdb [file] [log] [blame]
// 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 "src/reader/spirv/enum_converter.h"
namespace tint {
namespace reader {
namespace spirv {
EnumConverter::EnumConverter(const FailStream& fs) : fail_stream_(fs) {}
EnumConverter::~EnumConverter() = default;
ast::PipelineStage EnumConverter::ToPipelineStage(SpvExecutionModel model) {
switch (model) {
case SpvExecutionModelVertex:
return ast::PipelineStage::kVertex;
case SpvExecutionModelFragment:
return ast::PipelineStage::kFragment;
case SpvExecutionModelGLCompute:
return ast::PipelineStage::kCompute;
default:
break;
}
Fail() << "unknown SPIR-V execution model: " << uint32_t(model);
return ast::PipelineStage::kNone;
}
ast::StorageClass EnumConverter::ToStorageClass(const SpvStorageClass sc) {
switch (sc) {
case SpvStorageClassInput:
return ast::StorageClass::kInput;
case SpvStorageClassOutput:
return ast::StorageClass::kOutput;
case SpvStorageClassUniform:
return ast::StorageClass::kUniform;
case SpvStorageClassWorkgroup:
return ast::StorageClass::kWorkgroup;
case SpvStorageClassUniformConstant:
return ast::StorageClass::kNone;
case SpvStorageClassStorageBuffer:
return ast::StorageClass::kStorage;
case SpvStorageClassPrivate:
return ast::StorageClass::kPrivate;
case SpvStorageClassFunction:
return ast::StorageClass::kFunction;
default:
break;
}
Fail() << "unknown SPIR-V storage class: " << uint32_t(sc);
return ast::StorageClass::kInvalid;
}
ast::Builtin EnumConverter::ToBuiltin(SpvBuiltIn b) {
switch (b) {
case SpvBuiltInPosition:
return ast::Builtin::kPosition;
case SpvBuiltInVertexIndex:
return ast::Builtin::kVertexIndex;
case SpvBuiltInInstanceIndex:
return ast::Builtin::kInstanceIndex;
case SpvBuiltInFrontFacing:
return ast::Builtin::kFrontFacing;
case SpvBuiltInFragCoord:
return ast::Builtin::kPosition;
case SpvBuiltInFragDepth:
return ast::Builtin::kFragDepth;
case SpvBuiltInLocalInvocationId:
return ast::Builtin::kLocalInvocationId;
case SpvBuiltInLocalInvocationIndex:
return ast::Builtin::kLocalInvocationIndex;
case SpvBuiltInGlobalInvocationId:
return ast::Builtin::kGlobalInvocationId;
case SpvBuiltInWorkgroupId:
return ast::Builtin::kWorkgroupId;
case SpvBuiltInSampleId:
return ast::Builtin::kSampleIndex;
case SpvBuiltInSampleMask:
return ast::Builtin::kSampleMask;
default:
break;
}
Fail() << "unknown SPIR-V builtin: " << uint32_t(b);
return ast::Builtin::kNone;
}
ast::TextureDimension EnumConverter::ToDim(SpvDim dim, bool arrayed) {
if (arrayed) {
switch (dim) {
case SpvDim2D:
return ast::TextureDimension::k2dArray;
case SpvDimCube:
return ast::TextureDimension::kCubeArray;
default:
break;
}
Fail() << "arrayed dimension must be 2D or Cube. Got " << int(dim);
return ast::TextureDimension::kNone;
}
// Assume non-arrayed
switch (dim) {
case SpvDim1D:
return ast::TextureDimension::k1d;
case SpvDim2D:
return ast::TextureDimension::k2d;
case SpvDim3D:
return ast::TextureDimension::k3d;
case SpvDimCube:
return ast::TextureDimension::kCube;
default:
break;
}
Fail() << "invalid dimension: " << int(dim);
return ast::TextureDimension::kNone;
}
ast::TexelFormat EnumConverter::ToTexelFormat(SpvImageFormat fmt) {
switch (fmt) {
case SpvImageFormatUnknown:
return ast::TexelFormat::kNone;
// 8 bit channels
case SpvImageFormatRgba8:
return ast::TexelFormat::kRgba8Unorm;
case SpvImageFormatRgba8Snorm:
return ast::TexelFormat::kRgba8Snorm;
case SpvImageFormatRgba8ui:
return ast::TexelFormat::kRgba8Uint;
case SpvImageFormatRgba8i:
return ast::TexelFormat::kRgba8Sint;
// 16 bit channels
case SpvImageFormatRgba16ui:
return ast::TexelFormat::kRgba16Uint;
case SpvImageFormatRgba16i:
return ast::TexelFormat::kRgba16Sint;
case SpvImageFormatRgba16f:
return ast::TexelFormat::kRgba16Float;
// 32 bit channels
case SpvImageFormatR32ui:
return ast::TexelFormat::kR32Uint;
case SpvImageFormatR32i:
return ast::TexelFormat::kR32Sint;
case SpvImageFormatR32f:
return ast::TexelFormat::kR32Float;
case SpvImageFormatRg32ui:
return ast::TexelFormat::kRg32Uint;
case SpvImageFormatRg32i:
return ast::TexelFormat::kRg32Sint;
case SpvImageFormatRg32f:
return ast::TexelFormat::kRg32Float;
case SpvImageFormatRgba32ui:
return ast::TexelFormat::kRgba32Uint;
case SpvImageFormatRgba32i:
return ast::TexelFormat::kRgba32Sint;
case SpvImageFormatRgba32f:
return ast::TexelFormat::kRgba32Float;
default:
break;
}
Fail() << "invalid image format: " << int(fmt);
return ast::TexelFormat::kNone;
}
} // namespace spirv
} // namespace reader
} // namespace tint