255 lines
8.4 KiB
C++
255 lines
8.4 KiB
C++
// 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.
|
|
|
|
#ifndef SRC_AST_INTRINSIC_TEXTURE_HELPER_TEST_H_
|
|
#define SRC_AST_INTRINSIC_TEXTURE_HELPER_TEST_H_
|
|
|
|
#include <vector>
|
|
|
|
#include "src/ast/access_control.h"
|
|
#include "src/program_builder.h"
|
|
#include "src/sem/storage_texture_type.h"
|
|
|
|
namespace tint {
|
|
namespace ast {
|
|
namespace intrinsic {
|
|
namespace test {
|
|
|
|
enum class TextureKind { kRegular, kDepth, kMultisampled, kStorage };
|
|
enum class TextureDataType { kF32, kU32, kI32 };
|
|
|
|
std::ostream& operator<<(std::ostream& out, const TextureKind& kind);
|
|
std::ostream& operator<<(std::ostream& out, const TextureDataType& ty);
|
|
|
|
/// Non-exhaustive list of valid texture overloads
|
|
enum class ValidTextureOverload {
|
|
kDimensions1d,
|
|
kDimensions2d,
|
|
kDimensions2dLevel,
|
|
kDimensions2dArray,
|
|
kDimensions2dArrayLevel,
|
|
kDimensions3d,
|
|
kDimensions3dLevel,
|
|
kDimensionsCube,
|
|
kDimensionsCubeLevel,
|
|
kDimensionsCubeArray,
|
|
kDimensionsCubeArrayLevel,
|
|
kDimensionsMultisampled2d,
|
|
kDimensionsDepth2d,
|
|
kDimensionsDepth2dLevel,
|
|
kDimensionsDepth2dArray,
|
|
kDimensionsDepth2dArrayLevel,
|
|
kDimensionsDepthCube,
|
|
kDimensionsDepthCubeLevel,
|
|
kDimensionsDepthCubeArray,
|
|
kDimensionsDepthCubeArrayLevel,
|
|
kDimensionsStorageRO1d,
|
|
kDimensionsStorageRO2d,
|
|
kDimensionsStorageRO2dArray,
|
|
kDimensionsStorageRO3d,
|
|
kDimensionsStorageWO1d,
|
|
kDimensionsStorageWO2d,
|
|
kDimensionsStorageWO2dArray,
|
|
kDimensionsStorageWO3d,
|
|
kNumLayers2dArray,
|
|
kNumLayersCubeArray,
|
|
kNumLayersDepth2dArray,
|
|
kNumLayersDepthCubeArray,
|
|
kNumLayersStorageWO2dArray,
|
|
kNumLevels2d,
|
|
kNumLevels2dArray,
|
|
kNumLevels3d,
|
|
kNumLevelsCube,
|
|
kNumLevelsCubeArray,
|
|
kNumLevelsDepth2d,
|
|
kNumLevelsDepth2dArray,
|
|
kNumLevelsDepthCube,
|
|
kNumLevelsDepthCubeArray,
|
|
kNumSamplesMultisampled2d,
|
|
kSample1dF32,
|
|
kSample2dF32,
|
|
kSample2dOffsetF32,
|
|
kSample2dArrayF32,
|
|
kSample2dArrayOffsetF32,
|
|
kSample3dF32,
|
|
kSample3dOffsetF32,
|
|
kSampleCubeF32,
|
|
kSampleCubeArrayF32,
|
|
kSampleDepth2dF32,
|
|
kSampleDepth2dOffsetF32,
|
|
kSampleDepth2dArrayF32,
|
|
kSampleDepth2dArrayOffsetF32,
|
|
kSampleDepthCubeF32,
|
|
kSampleDepthCubeArrayF32,
|
|
kSampleBias2dF32,
|
|
kSampleBias2dOffsetF32,
|
|
kSampleBias2dArrayF32,
|
|
kSampleBias2dArrayOffsetF32,
|
|
kSampleBias3dF32,
|
|
kSampleBias3dOffsetF32,
|
|
kSampleBiasCubeF32,
|
|
kSampleBiasCubeArrayF32,
|
|
kSampleLevel2dF32,
|
|
kSampleLevel2dOffsetF32,
|
|
kSampleLevel2dArrayF32,
|
|
kSampleLevel2dArrayOffsetF32,
|
|
kSampleLevel3dF32,
|
|
kSampleLevel3dOffsetF32,
|
|
kSampleLevelCubeF32,
|
|
kSampleLevelCubeArrayF32,
|
|
kSampleLevelDepth2dF32,
|
|
kSampleLevelDepth2dOffsetF32,
|
|
kSampleLevelDepth2dArrayF32,
|
|
kSampleLevelDepth2dArrayOffsetF32,
|
|
kSampleLevelDepthCubeF32,
|
|
kSampleLevelDepthCubeArrayF32,
|
|
kSampleGrad2dF32,
|
|
kSampleGrad2dOffsetF32,
|
|
kSampleGrad2dArrayF32,
|
|
kSampleGrad2dArrayOffsetF32,
|
|
kSampleGrad3dF32,
|
|
kSampleGrad3dOffsetF32,
|
|
kSampleGradCubeF32,
|
|
kSampleGradCubeArrayF32,
|
|
kSampleCompareDepth2dF32,
|
|
kSampleCompareDepth2dOffsetF32,
|
|
kSampleCompareDepth2dArrayF32,
|
|
kSampleCompareDepth2dArrayOffsetF32,
|
|
kSampleCompareDepthCubeF32,
|
|
kSampleCompareDepthCubeArrayF32,
|
|
kLoad1dLevelF32,
|
|
kLoad1dLevelU32,
|
|
kLoad1dLevelI32,
|
|
kLoad2dLevelF32,
|
|
kLoad2dLevelU32,
|
|
kLoad2dLevelI32,
|
|
kLoad2dArrayLevelF32,
|
|
kLoad2dArrayLevelU32,
|
|
kLoad2dArrayLevelI32,
|
|
kLoad3dLevelF32,
|
|
kLoad3dLevelU32,
|
|
kLoad3dLevelI32,
|
|
kLoadMultisampled2dF32,
|
|
kLoadMultisampled2dU32,
|
|
kLoadMultisampled2dI32,
|
|
kLoadDepth2dLevelF32,
|
|
kLoadDepth2dArrayLevelF32,
|
|
kLoadStorageRO1dRgba32float, // Not permutated for all texel formats
|
|
kLoadStorageRO2dRgba8unorm,
|
|
kLoadStorageRO2dRgba8snorm,
|
|
kLoadStorageRO2dRgba8uint,
|
|
kLoadStorageRO2dRgba8sint,
|
|
kLoadStorageRO2dRgba16uint,
|
|
kLoadStorageRO2dRgba16sint,
|
|
kLoadStorageRO2dRgba16float,
|
|
kLoadStorageRO2dR32uint,
|
|
kLoadStorageRO2dR32sint,
|
|
kLoadStorageRO2dR32float,
|
|
kLoadStorageRO2dRg32uint,
|
|
kLoadStorageRO2dRg32sint,
|
|
kLoadStorageRO2dRg32float,
|
|
kLoadStorageRO2dRgba32uint,
|
|
kLoadStorageRO2dRgba32sint,
|
|
kLoadStorageRO2dRgba32float,
|
|
kLoadStorageRO2dArrayRgba32float, // Not permutated for all texel formats
|
|
kLoadStorageRO3dRgba32float, // Not permutated for all texel formats
|
|
kStoreWO1dRgba32float, // Not permutated for all texel formats
|
|
kStoreWO2dRgba32float, // Not permutated for all texel formats
|
|
kStoreWO2dArrayRgba32float, // Not permutated for all texel formats
|
|
kStoreWO3dRgba32float, // Not permutated for all texel formats
|
|
};
|
|
|
|
/// Describes a texture intrinsic overload
|
|
struct TextureOverloadCase {
|
|
/// Constructor for textureSample...() functions
|
|
TextureOverloadCase(ValidTextureOverload,
|
|
const char*,
|
|
TextureKind,
|
|
ast::SamplerKind,
|
|
ast::TextureDimension,
|
|
TextureDataType,
|
|
const char*,
|
|
std::function<ExpressionList(ProgramBuilder*)>);
|
|
/// Constructor for textureLoad() functions with non-storage textures
|
|
TextureOverloadCase(ValidTextureOverload,
|
|
const char*,
|
|
TextureKind,
|
|
ast::TextureDimension,
|
|
TextureDataType,
|
|
const char*,
|
|
std::function<ExpressionList(ProgramBuilder*)>);
|
|
/// Constructor for textureLoad() with storage textures
|
|
TextureOverloadCase(ValidTextureOverload,
|
|
const char*,
|
|
AccessControl::Access,
|
|
ast::ImageFormat,
|
|
ast::TextureDimension,
|
|
TextureDataType,
|
|
const char*,
|
|
std::function<ExpressionList(ProgramBuilder*)>);
|
|
/// Copy constructor
|
|
TextureOverloadCase(const TextureOverloadCase&);
|
|
/// Destructor
|
|
~TextureOverloadCase();
|
|
|
|
/// @return a vector containing a large number (non-exhaustive) of valid
|
|
/// texture overloads.
|
|
static std::vector<TextureOverloadCase> ValidCases();
|
|
|
|
/// @param builder the AST builder used for the test
|
|
/// @returns the vector component type of the texture function return value
|
|
ast::Type* buildResultVectorComponentType(ProgramBuilder* builder) const;
|
|
/// @param builder the AST builder used for the test
|
|
/// @returns a variable holding the test texture, automatically registered as
|
|
/// a global variable.
|
|
ast::Variable* buildTextureVariable(ProgramBuilder* builder) const;
|
|
/// @param builder the AST builder used for the test
|
|
/// @returns a Variable holding the test sampler, automatically registered as
|
|
/// a global variable.
|
|
ast::Variable* buildSamplerVariable(ProgramBuilder* builder) const;
|
|
|
|
/// The enumerator for this overload
|
|
ValidTextureOverload const overload;
|
|
/// A human readable description of the overload
|
|
const char* const description;
|
|
/// The texture kind for the texture parameter
|
|
TextureKind const texture_kind;
|
|
/// The sampler kind for the sampler parameter
|
|
/// Used only when texture_kind is not kStorage
|
|
ast::SamplerKind const sampler_kind = ast::SamplerKind::kSampler;
|
|
/// The access control for the storage texture
|
|
/// Used only when texture_kind is kStorage
|
|
AccessControl::Access const access_control = AccessControl::kReadWrite;
|
|
/// The image format for the storage texture
|
|
/// Used only when texture_kind is kStorage
|
|
ast::ImageFormat const image_format = ast::ImageFormat::kNone;
|
|
/// The dimensions of the texture parameter
|
|
ast::TextureDimension const texture_dimension;
|
|
/// The data type of the texture parameter
|
|
TextureDataType const texture_data_type;
|
|
/// Name of the function. e.g. `textureSample`, `textureSampleGrad`, etc
|
|
const char* const function;
|
|
/// A function that builds the AST arguments for the overload
|
|
std::function<ExpressionList(ProgramBuilder*)> const args;
|
|
};
|
|
|
|
std::ostream& operator<<(std::ostream& out, const TextureOverloadCase& data);
|
|
|
|
} // namespace test
|
|
} // namespace intrinsic
|
|
} // namespace ast
|
|
} // namespace tint
|
|
|
|
#endif // SRC_AST_INTRINSIC_TEXTURE_HELPER_TEST_H_
|