mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-11-23 04:00:05 +00:00
Assembler test for Dim, ImageFormat enums.
Adds SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT, and the translation tables for its values from the spv::ImageFormat values.
This commit is contained in:
parent
8382de2670
commit
b30a0c529b
@ -158,6 +158,7 @@ typedef enum spv_operand_type_t {
|
||||
SPV_OPERAND_TYPE_DIMENSIONALITY,
|
||||
SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
|
||||
SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
|
||||
SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
|
||||
SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
|
||||
SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
|
||||
SPV_OPERAND_TYPE_LINKAGE_TYPE,
|
||||
@ -169,7 +170,10 @@ typedef enum spv_operand_type_t {
|
||||
SPV_OPERAND_TYPE_LOOP_CONTROL,
|
||||
SPV_OPERAND_TYPE_FUNCTION_CONTROL,
|
||||
SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
|
||||
|
||||
// The ID for an execution scope value.
|
||||
SPV_OPERAND_TYPE_EXECUTION_SCOPE,
|
||||
|
||||
SPV_OPERAND_TYPE_GROUP_OPERATION,
|
||||
SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
|
||||
SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
|
||||
|
@ -115,7 +115,7 @@ spv_operand_type_t convertOperandClassToType(spv::Op opcode,
|
||||
case OperandDimensionality: return SPV_OPERAND_TYPE_DIMENSIONALITY;
|
||||
case OperandSamplerAddressingMode: return SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE;
|
||||
case OperandSamplerFilterMode: return SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE;
|
||||
case OperandSamplerImageFormat: return SPV_OPERAND_TYPE_NONE; //TODO
|
||||
case OperandSamplerImageFormat: return SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT;
|
||||
case OperandImageChannelOrder: return SPV_OPERAND_TYPE_NONE; //TODO
|
||||
case OperandImageChannelDataType: return SPV_OPERAND_TYPE_NONE; //TODO
|
||||
case OperandImageOperands: return SPV_OPERAND_TYPE_NONE; //TODO
|
||||
|
@ -410,6 +410,62 @@ static const spv_operand_desc_t samplerFilterModeEntries[] = {
|
||||
{SPV_OPERAND_TYPE_NONE}},
|
||||
};
|
||||
|
||||
static const spv_operand_desc_t samplerImageFormatEntries[] = {
|
||||
// In Rev31, all the cases depend on the Shader capability.
|
||||
// TODO(dneto): In Rev32, many of these depend on the AdvancedFormats
|
||||
// capability instead.
|
||||
#define CASE(NAME) \
|
||||
{ \
|
||||
#NAME, ImageFormat##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, \
|
||||
{ \
|
||||
SPV_OPERAND_TYPE_NONE \
|
||||
} \
|
||||
}
|
||||
// clang-format off
|
||||
CASE(Unknown),
|
||||
CASE(Rgba32f),
|
||||
CASE(Rgba16f),
|
||||
CASE(R32f),
|
||||
CASE(Rgba8),
|
||||
CASE(Rgba8Snorm),
|
||||
CASE(Rg32f),
|
||||
CASE(Rg16f),
|
||||
CASE(R11fG11fB10f),
|
||||
CASE(R16f),
|
||||
CASE(Rgba16),
|
||||
CASE(Rgb10A2),
|
||||
CASE(Rg16),
|
||||
CASE(Rg8),
|
||||
CASE(R16),
|
||||
CASE(R8),
|
||||
CASE(Rgba16Snorm),
|
||||
CASE(Rg16Snorm),
|
||||
CASE(Rg8Snorm),
|
||||
CASE(R16Snorm),
|
||||
CASE(R8Snorm),
|
||||
CASE(Rgba32i),
|
||||
CASE(Rgba16i),
|
||||
CASE(Rgba8i),
|
||||
CASE(R32i),
|
||||
CASE(Rg32i),
|
||||
CASE(Rg16i),
|
||||
CASE(Rg8i),
|
||||
CASE(R16i),
|
||||
CASE(R8i),
|
||||
CASE(Rgba32ui),
|
||||
CASE(Rgba16ui),
|
||||
CASE(Rgba8ui),
|
||||
CASE(R32ui),
|
||||
CASE(Rgb10a2ui),
|
||||
CASE(Rg32ui),
|
||||
CASE(Rg16ui),
|
||||
CASE(Rg8ui),
|
||||
CASE(R16ui),
|
||||
CASE(R8ui),
|
||||
// clang-format on
|
||||
#undef CASE
|
||||
};
|
||||
|
||||
static const spv_operand_desc_t fpFastMathModeEntries[] = {
|
||||
{"None",
|
||||
FPFastMathModeMaskNone,
|
||||
@ -1333,6 +1389,9 @@ static const spv_operand_desc_group_t opcodeEntryTypes[] = {
|
||||
{SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
|
||||
sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
|
||||
samplerFilterModeEntries},
|
||||
{SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
|
||||
sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
|
||||
samplerImageFormatEntries},
|
||||
{SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
|
||||
sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
|
||||
fpFastMathModeEntries},
|
||||
@ -1477,6 +1536,8 @@ const char *spvOperandTypeStr(spv_operand_type_t type) {
|
||||
return "addressing mode";
|
||||
case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
|
||||
return "sampler filter mode";
|
||||
case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
|
||||
return "sampler image format";
|
||||
case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
|
||||
return "floating pointer fast math mode";
|
||||
case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
|
||||
|
@ -44,7 +44,100 @@ struct EnumCase {
|
||||
const std::string name;
|
||||
};
|
||||
|
||||
// Test OpTypePipe
|
||||
// Test Dim enums via OpTypeImage
|
||||
|
||||
using DimTest = test_fixture::TextToBinaryTestBase<
|
||||
::testing::TestWithParam<EnumCase<spv::Dim>>>;
|
||||
|
||||
TEST_P(DimTest, AnyDim) {
|
||||
std::string input = "%imageType = OpTypeImage %sampledType " +
|
||||
GetParam().name + " 2 3 0 4 Rgba8";
|
||||
EXPECT_THAT(
|
||||
CompiledInstructions(input),
|
||||
Eq(MakeInstruction(spv::OpTypeImage, {1, 2, GetParam().value, 2, 3, 0, 4,
|
||||
spv::ImageFormatRgba8})));
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
#define CASE(NAME) {spv::Dim##NAME, #NAME}
|
||||
INSTANTIATE_TEST_CASE_P(
|
||||
TextToBinaryDim, DimTest,
|
||||
::testing::ValuesIn(std::vector<EnumCase<spv::Dim>>{
|
||||
CASE(1D),
|
||||
CASE(2D),
|
||||
CASE(3D),
|
||||
CASE(Cube),
|
||||
CASE(Rect),
|
||||
CASE(Buffer),
|
||||
// TODO(dneto): Rev32 adds InputTarget.
|
||||
}));
|
||||
#undef CASE
|
||||
// clang-format on
|
||||
|
||||
// Test ImageFormat enums via OpTypeImage
|
||||
|
||||
using ImageFormatTest = test_fixture::TextToBinaryTestBase<
|
||||
::testing::TestWithParam<EnumCase<spv::ImageFormat>>>;
|
||||
|
||||
TEST_P(ImageFormatTest, AnyImageFormat) {
|
||||
std::string input =
|
||||
"%imageType = OpTypeImage %sampledType 1D 2 3 0 4 " + GetParam().name;
|
||||
EXPECT_THAT(CompiledInstructions(input),
|
||||
Eq(MakeInstruction(spv::OpTypeImage, {1, 2, spv::Dim1D, 2, 3, 0,
|
||||
4, GetParam().value})));
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
#define CASE(NAME) {spv::ImageFormat##NAME, #NAME}
|
||||
INSTANTIATE_TEST_CASE_P(
|
||||
TextToBinaryImageFormat, ImageFormatTest,
|
||||
::testing::ValuesIn(std::vector<EnumCase<spv::ImageFormat>>{
|
||||
CASE(Unknown),
|
||||
CASE(Rgba32f),
|
||||
CASE(Rgba16f),
|
||||
CASE(R32f),
|
||||
CASE(Rgba8),
|
||||
CASE(Rgba8Snorm),
|
||||
CASE(Rg32f),
|
||||
CASE(Rg16f),
|
||||
CASE(R11fG11fB10f),
|
||||
CASE(R16f),
|
||||
CASE(Rgba16),
|
||||
CASE(Rgb10A2),
|
||||
CASE(Rg16),
|
||||
CASE(Rg8),
|
||||
CASE(R16),
|
||||
CASE(R8),
|
||||
CASE(Rgba16Snorm),
|
||||
CASE(Rg16Snorm),
|
||||
CASE(Rg8Snorm),
|
||||
CASE(R16Snorm),
|
||||
CASE(R8Snorm),
|
||||
CASE(Rgba32i),
|
||||
CASE(Rgba16i),
|
||||
CASE(Rgba8i),
|
||||
CASE(R32i),
|
||||
CASE(Rg32i),
|
||||
CASE(Rg16i),
|
||||
CASE(Rg8i),
|
||||
CASE(R16i),
|
||||
CASE(R8i),
|
||||
CASE(Rgba32ui),
|
||||
CASE(Rgba16ui),
|
||||
CASE(Rgba8ui),
|
||||
CASE(R32ui),
|
||||
CASE(Rgb10a2ui),
|
||||
CASE(Rg32ui),
|
||||
CASE(Rg16ui),
|
||||
CASE(Rg8ui),
|
||||
CASE(R16ui),
|
||||
CASE(R8ui),
|
||||
// TODO(dneto): Rev32 adds InputTarget.
|
||||
}));
|
||||
#undef CASE
|
||||
// clang-format on
|
||||
|
||||
// Test AccessQualifier enums via OpTypePipe.
|
||||
|
||||
using OpTypePipeTest = test_fixture::TextToBinaryTestBase<
|
||||
::testing::TestWithParam<EnumCase<spv::AccessQualifier>>>;
|
||||
@ -69,6 +162,9 @@ INSTANTIATE_TEST_CASE_P(
|
||||
#undef CASE
|
||||
// clang-format on
|
||||
|
||||
// TODO(dneto): error message test for sampler addressing mode
|
||||
// TODO(dneto): error message test for sampler image format
|
||||
|
||||
// TODO(dneto): OpTypeVoid
|
||||
// TODO(dneto): OpTypeBool
|
||||
// TODO(dneto): OpTypeInt
|
||||
|
Loading…
Reference in New Issue
Block a user