spirv-reader: convert coordinate type when unsigned
In SPIR-V, coordinates for ImageRead, ImageFetch, ImageWrite are integral. When they are unsigned, they must be converted to signed. Fix tests for image sampling and dref sampling that used integer coordinates. SPIR-V requires them to be floating point. Bug: tint:109 Fixed: tint:346 Change-Id: If33c8970b9d8f7d934d3e582194fe6ed83eff7e8 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/35560 Commit-Queue: David Neto <dneto@google.com> Reviewed-by: Ben Clayton <bclayton@google.com> Auto-Submit: David Neto <dneto@google.com>
This commit is contained in:
parent
24bbbbb25f
commit
2353bd0d3d
|
@ -3868,11 +3868,6 @@ bool FunctionEmitter::EmitImageAccess(const spvtools::opt::Instruction& inst) {
|
||||||
arg_index++;
|
arg_index++;
|
||||||
|
|
||||||
// Push the coordinates operands.
|
// Push the coordinates operands.
|
||||||
// TODO(dneto): For explicit-Lod variations, we may have to convert from
|
|
||||||
// integral coordinates to floating point coordinates.
|
|
||||||
// In WGSL, integer (unnormalized) coordinates are only used for texture
|
|
||||||
// fetch (textureLoad on sampled image) or textureLoad or textureStore
|
|
||||||
// on storage images.
|
|
||||||
auto coords = MakeCoordinateOperandsForImageAccess(inst);
|
auto coords = MakeCoordinateOperandsForImageAccess(inst);
|
||||||
if (coords.empty()) {
|
if (coords.empty()) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -3951,15 +3946,13 @@ bool FunctionEmitter::EmitImageAccess(const spvtools::opt::Instruction& inst) {
|
||||||
}
|
}
|
||||||
if (arg_index < num_args && (image_operands_mask & SpvImageOperandsLodMask)) {
|
if (arg_index < num_args && (image_operands_mask & SpvImageOperandsLodMask)) {
|
||||||
builtin_name += "Level";
|
builtin_name += "Level";
|
||||||
auto* lod_operand = MakeOperand(inst, arg_index).expr;
|
TypedExpression lod = MakeOperand(inst, arg_index);
|
||||||
// When sampling from a depth texture, the Lod operand must be an unsigned
|
// When sampling from a depth texture, the Lod operand must be an I32.
|
||||||
// integer.
|
|
||||||
if (texture_type->Is<ast::type::DepthTexture>()) {
|
if (texture_type->Is<ast::type::DepthTexture>()) {
|
||||||
// Convert it to a signed integer type.
|
// Convert it to a signed integer type.
|
||||||
lod_operand = create<ast::TypeConstructorExpression>(
|
lod = ToI32(lod);
|
||||||
Source{}, create<ast::type::I32>(), ast::ExpressionList{lod_operand});
|
|
||||||
}
|
}
|
||||||
params.push_back(lod_operand);
|
params.push_back(lod.expr);
|
||||||
image_operands_mask ^= SpvImageOperandsLodMask;
|
image_operands_mask ^= SpvImageOperandsLodMask;
|
||||||
arg_index++;
|
arg_index++;
|
||||||
}
|
}
|
||||||
|
@ -4053,6 +4046,17 @@ ast::ExpressionList FunctionEmitter::MakeCoordinateOperandsForImageAccess(
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// In SPIR-V for Shader, coordinates are:
|
||||||
|
// - floating point for sampling, dref sampling, gather, dref gather
|
||||||
|
// - integral for fetch, read, write
|
||||||
|
// In WGSL:
|
||||||
|
// - floating point for sampling, dref sampling, gather, dref gather
|
||||||
|
// - signed integral for textureLoad, textureStore
|
||||||
|
//
|
||||||
|
// The only conversions we have to do for WGSL are:
|
||||||
|
// - When the coordinates are unsigned integral, convert them to signed.
|
||||||
|
// - Array index is always i32
|
||||||
|
|
||||||
// The coordinates parameter is always in position 1.
|
// The coordinates parameter is always in position 1.
|
||||||
TypedExpression raw_coords(MakeOperand(inst, 1));
|
TypedExpression raw_coords(MakeOperand(inst, 1));
|
||||||
if (!raw_coords.type) {
|
if (!raw_coords.type) {
|
||||||
|
@ -4107,11 +4111,13 @@ ast::ExpressionList FunctionEmitter::MakeCoordinateOperandsForImageAccess(
|
||||||
assert(num_axes <= 3);
|
assert(num_axes <= 3);
|
||||||
const auto num_coords_required = num_axes + (is_arrayed ? 1 : 0);
|
const auto num_coords_required = num_axes + (is_arrayed ? 1 : 0);
|
||||||
uint32_t num_coords_supplied = 0;
|
uint32_t num_coords_supplied = 0;
|
||||||
if (raw_coords.type->is_float_scalar() ||
|
auto* component_type = raw_coords.type;
|
||||||
raw_coords.type->is_integer_scalar()) {
|
if (component_type->is_float_scalar() ||
|
||||||
|
component_type->is_integer_scalar()) {
|
||||||
num_coords_supplied = 1;
|
num_coords_supplied = 1;
|
||||||
} else if (auto* vec_ty = raw_coords.type->As<ast::type::Vector>()) {
|
} else if (auto* vec_type = raw_coords.type->As<ast::type::Vector>()) {
|
||||||
num_coords_supplied = vec_ty->size();
|
component_type = vec_type->type();
|
||||||
|
num_coords_supplied = vec_type->size();
|
||||||
}
|
}
|
||||||
if (num_coords_supplied == 0) {
|
if (num_coords_supplied == 0) {
|
||||||
Fail() << "bad or unsupported coordinate type for image access: "
|
Fail() << "bad or unsupported coordinate type for image access: "
|
||||||
|
@ -4127,29 +4133,41 @@ ast::ExpressionList FunctionEmitter::MakeCoordinateOperandsForImageAccess(
|
||||||
|
|
||||||
ast::ExpressionList result;
|
ast::ExpressionList result;
|
||||||
|
|
||||||
// TODO(dneto): Convert coordinate component type if needed.
|
// Generates the expression for the WGSL coordinates, when it is a prefix
|
||||||
|
// swizzle with num_axes. If the result would be unsigned, also converts
|
||||||
|
// it to a signed value of the same shape (scalar or vector).
|
||||||
|
// Use a lambda to make it easy to only generate the expressions when we
|
||||||
|
// will actually use them.
|
||||||
|
auto prefix_swizzle_expr = [this, num_axes, component_type,
|
||||||
|
raw_coords]() -> ast::Expression* {
|
||||||
|
auto* swizzle_type =
|
||||||
|
(num_axes == 1) ? component_type
|
||||||
|
: create<ast::type::Vector>(component_type, num_axes);
|
||||||
|
auto* swizzle = create<ast::MemberAccessorExpression>(
|
||||||
|
Source{}, raw_coords.expr, PrefixSwizzle(num_axes));
|
||||||
|
return ToSignedIfUnsigned({swizzle_type, swizzle}).expr;
|
||||||
|
};
|
||||||
|
|
||||||
if (is_arrayed) {
|
if (is_arrayed) {
|
||||||
// The source must be a vector, because it has enough components and has an
|
// The source must be a vector. It has at least one coordinate component
|
||||||
// array component. Use a vector swizzle to get the first `num_axes`
|
// and it must have an array component. Use a vector swizzle to get the
|
||||||
// components.
|
// first `num_axes` components.
|
||||||
result.push_back(create<ast::MemberAccessorExpression>(
|
result.push_back(prefix_swizzle_expr());
|
||||||
Source{}, raw_coords.expr, PrefixSwizzle(num_axes)));
|
|
||||||
|
|
||||||
// Now get the array index.
|
// Now get the array index.
|
||||||
ast::Expression* array_index = create<ast::MemberAccessorExpression>(
|
ast::Expression* array_index = create<ast::MemberAccessorExpression>(
|
||||||
Source{}, raw_coords.expr, Swizzle(num_axes));
|
Source{}, raw_coords.expr, Swizzle(num_axes));
|
||||||
// Convert it to a signed integer type.
|
// Convert it to a signed integer type, if needed
|
||||||
result.push_back(create<ast::TypeConstructorExpression>(
|
result.push_back(ToI32({component_type, array_index}).expr);
|
||||||
Source{}, create<ast::type::I32>(), ast::ExpressionList{array_index}));
|
|
||||||
} else {
|
} else {
|
||||||
if (num_coords_supplied == num_coords_required) {
|
if (num_coords_supplied == num_coords_required) {
|
||||||
// Pass the value through.
|
// Pass the value through, with possible unsigned->signed conversion.
|
||||||
result.push_back(std::move(raw_coords.expr));
|
result.push_back(ToSignedIfUnsigned(raw_coords).expr);
|
||||||
} else {
|
} else {
|
||||||
// There are more coordinates supplied than needed. So the source type is
|
// There are more coordinates supplied than needed. So the source type
|
||||||
// a vector. Use a vector swizzle to get the first `num_axes` components.
|
// is a vector. Use a vector swizzle to get the first `num_axes`
|
||||||
result.push_back(create<ast::MemberAccessorExpression>(
|
// components.
|
||||||
Source{}, raw_coords.expr, PrefixSwizzle(num_axes)));
|
result.push_back(prefix_swizzle_expr());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -4249,6 +4267,18 @@ TypedExpression FunctionEmitter::ToI32(TypedExpression value) {
|
||||||
Source{}, i32_, ast::ExpressionList{value.expr})};
|
Source{}, i32_, ast::ExpressionList{value.expr})};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TypedExpression FunctionEmitter::ToSignedIfUnsigned(TypedExpression value) {
|
||||||
|
if (!value.type || !value.type->is_unsigned_scalar_or_vector()) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
if (auto* vec_type = value.type->As<ast::type::Vector>()) {
|
||||||
|
auto* new_type = create<ast::type::Vector>(i32_, vec_type->size());
|
||||||
|
return {new_type, create<ast::TypeConstructorExpression>(
|
||||||
|
Source{}, new_type, ast::ExpressionList{value.expr})};
|
||||||
|
}
|
||||||
|
return ToI32(value);
|
||||||
|
}
|
||||||
|
|
||||||
FunctionEmitter::FunctionDeclaration::FunctionDeclaration() = default;
|
FunctionEmitter::FunctionDeclaration::FunctionDeclaration() = default;
|
||||||
FunctionEmitter::FunctionDeclaration::~FunctionDeclaration() = default;
|
FunctionEmitter::FunctionDeclaration::~FunctionDeclaration() = default;
|
||||||
|
|
||||||
|
|
|
@ -701,6 +701,14 @@ class FunctionEmitter {
|
||||||
/// @returns the value as an I32 value.
|
/// @returns the value as an I32 value.
|
||||||
TypedExpression ToI32(TypedExpression value);
|
TypedExpression ToI32(TypedExpression value);
|
||||||
|
|
||||||
|
/// Returns the given value as a signed integer type of the same shape
|
||||||
|
/// if the value is unsigned scalar or vector, by wrapping the value
|
||||||
|
/// with a TypeConstructor expression. Returns the value itself if the
|
||||||
|
/// value otherwise.
|
||||||
|
/// @param value the value to pass through or convert
|
||||||
|
/// @returns the value itself, or converted to signed integral
|
||||||
|
TypedExpression ToSignedIfUnsigned(TypedExpression value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// FunctionDeclaration contains the parsed information for a function header.
|
/// FunctionDeclaration contains the parsed information for a function header.
|
||||||
struct FunctionDeclaration {
|
struct FunctionDeclaration {
|
||||||
|
|
|
@ -2389,7 +2389,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
SpvParserTest_ImageAccessTest,
|
SpvParserTest_ImageAccessTest,
|
||||||
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
||||||
// OpImageWrite with no extra params
|
// OpImageWrite with no extra params
|
||||||
{"%float 2D 0 0 0 2 Rgba32f", "OpImageWrite %im %vu12 %vf1234",
|
{"%float 2D 0 0 0 2 Rgba32f", "OpImageWrite %im %vi12 %vf1234",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2404,13 +2404,13 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
Identifier[not set]{vf1234}
|
Identifier[not set]{vf1234}
|
||||||
)
|
)
|
||||||
})"},
|
})"},
|
||||||
// OpImageWrite with ConstOffset
|
// OpImageWrite with ConstOffset
|
||||||
{"%float 2D 0 0 0 2 Rgba32f",
|
{"%float 2D 0 0 0 2 Rgba32f",
|
||||||
"OpImageWrite %im %vu12 %vf1234 ConstOffset %offsets2d",
|
"OpImageWrite %im %vi12 %vf1234 ConstOffset %offsets2d",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2425,7 +2425,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
Identifier[not set]{vf1234}
|
Identifier[not set]{vf1234}
|
||||||
Identifier[not set]{offsets2d}
|
Identifier[not set]{offsets2d}
|
||||||
)
|
)
|
||||||
|
@ -2439,7 +2439,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
SpvParserTest_ImageAccessTest,
|
SpvParserTest_ImageAccessTest,
|
||||||
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
||||||
// Source 1 component, dest 1 component
|
// Source 1 component, dest 1 component
|
||||||
{"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vu12 %f1",
|
{"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vi12 %f1",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2454,12 +2454,12 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
Identifier[not set]{f1}
|
Identifier[not set]{f1}
|
||||||
)
|
)
|
||||||
})"},
|
})"},
|
||||||
// Source 2 component, dest 1 component
|
// Source 2 component, dest 1 component
|
||||||
{"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vu12 %vf12",
|
{"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vi12 %vf12",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2474,7 +2474,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
MemberAccessor[not set]{
|
MemberAccessor[not set]{
|
||||||
Identifier[not set]{vf12}
|
Identifier[not set]{vf12}
|
||||||
Identifier[not set]{x}
|
Identifier[not set]{x}
|
||||||
|
@ -2482,7 +2482,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
)
|
)
|
||||||
})"},
|
})"},
|
||||||
// Source 3 component, dest 1 component
|
// Source 3 component, dest 1 component
|
||||||
{"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vu12 %vf123",
|
{"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vi12 %vf123",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2497,7 +2497,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
MemberAccessor[not set]{
|
MemberAccessor[not set]{
|
||||||
Identifier[not set]{vf123}
|
Identifier[not set]{vf123}
|
||||||
Identifier[not set]{x}
|
Identifier[not set]{x}
|
||||||
|
@ -2505,7 +2505,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
)
|
)
|
||||||
})"},
|
})"},
|
||||||
// Source 4 component, dest 1 component
|
// Source 4 component, dest 1 component
|
||||||
{"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vu12 %vf1234",
|
{"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vi12 %vf1234",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2520,7 +2520,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
MemberAccessor[not set]{
|
MemberAccessor[not set]{
|
||||||
Identifier[not set]{vf1234}
|
Identifier[not set]{vf1234}
|
||||||
Identifier[not set]{x}
|
Identifier[not set]{x}
|
||||||
|
@ -2528,7 +2528,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
)
|
)
|
||||||
})"},
|
})"},
|
||||||
// Source 2 component, dest 2 component
|
// Source 2 component, dest 2 component
|
||||||
{"%float 2D 0 0 0 2 Rg32f", "OpImageWrite %im %vu12 %vf12",
|
{"%float 2D 0 0 0 2 Rg32f", "OpImageWrite %im %vi12 %vf12",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2543,12 +2543,12 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
Identifier[not set]{vf12}
|
Identifier[not set]{vf12}
|
||||||
)
|
)
|
||||||
})"},
|
})"},
|
||||||
// Source 3 component, dest 2 component
|
// Source 3 component, dest 2 component
|
||||||
{"%float 2D 0 0 0 2 Rg32f", "OpImageWrite %im %vu12 %vf123",
|
{"%float 2D 0 0 0 2 Rg32f", "OpImageWrite %im %vi12 %vf123",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2563,7 +2563,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
MemberAccessor[not set]{
|
MemberAccessor[not set]{
|
||||||
Identifier[not set]{vf123}
|
Identifier[not set]{vf123}
|
||||||
Identifier[not set]{xy}
|
Identifier[not set]{xy}
|
||||||
|
@ -2571,7 +2571,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
)
|
)
|
||||||
})"},
|
})"},
|
||||||
// Source 4 component, dest 2 component
|
// Source 4 component, dest 2 component
|
||||||
{"%float 2D 0 0 0 2 Rg32f", "OpImageWrite %im %vu12 %vf1234",
|
{"%float 2D 0 0 0 2 Rg32f", "OpImageWrite %im %vi12 %vf1234",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2586,7 +2586,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
MemberAccessor[not set]{
|
MemberAccessor[not set]{
|
||||||
Identifier[not set]{vf1234}
|
Identifier[not set]{vf1234}
|
||||||
Identifier[not set]{xy}
|
Identifier[not set]{xy}
|
||||||
|
@ -2595,7 +2595,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
})"},
|
})"},
|
||||||
// WGSL does not support 3-component storage textures.
|
// WGSL does not support 3-component storage textures.
|
||||||
// Source 4 component, dest 4 component
|
// Source 4 component, dest 4 component
|
||||||
{"%float 2D 0 0 0 2 Rgba32f", "OpImageWrite %im %vu12 %vf1234",
|
{"%float 2D 0 0 0 2 Rgba32f", "OpImageWrite %im %vi12 %vf1234",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2610,7 +2610,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
Identifier[not set]{vf1234}
|
Identifier[not set]{vf1234}
|
||||||
)
|
)
|
||||||
})"}}));
|
})"}}));
|
||||||
|
@ -2761,7 +2761,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
SpvParserTest_ImageAccessTest,
|
SpvParserTest_ImageAccessTest,
|
||||||
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
||||||
// Sampled type is unsigned int, texel is unsigned int
|
// Sampled type is unsigned int, texel is unsigned int
|
||||||
{"%uint 2D 0 0 0 2 Rgba32ui", "OpImageWrite %im %vu12 %vu1234",
|
{"%uint 2D 0 0 0 2 Rgba32ui", "OpImageWrite %im %vi12 %vu1234",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2776,12 +2776,12 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
Identifier[not set]{vu1234}
|
Identifier[not set]{vu1234}
|
||||||
)
|
)
|
||||||
})"},
|
})"},
|
||||||
// Sampled type is unsigned int, texel is signed int
|
// Sampled type is unsigned int, texel is signed int
|
||||||
{"%uint 2D 0 0 0 2 Rgba32ui", "OpImageWrite %im %vu12 %vi1234",
|
{"%uint 2D 0 0 0 2 Rgba32ui", "OpImageWrite %im %vi12 %vi1234",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2796,14 +2796,14 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
Bitcast[not set]<__vec_4__u32>{
|
Bitcast[not set]<__vec_4__u32>{
|
||||||
Identifier[not set]{vi1234}
|
Identifier[not set]{vi1234}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
})"},
|
})"},
|
||||||
// Sampled type is signed int, texel is unsigned int
|
// Sampled type is signed int, texel is unsigned int
|
||||||
{"%int 2D 0 0 0 2 Rgba32i", "OpImageWrite %im %vu12 %vu1234",
|
{"%int 2D 0 0 0 2 Rgba32i", "OpImageWrite %im %vi12 %vu1234",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2818,14 +2818,14 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
Bitcast[not set]<__vec_4__i32>{
|
Bitcast[not set]<__vec_4__i32>{
|
||||||
Identifier[not set]{vu1234}
|
Identifier[not set]{vu1234}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
})"},
|
})"},
|
||||||
// Sampled type is signed int, texel is signed int
|
// Sampled type is signed int, texel is signed int
|
||||||
{"%int 2D 0 0 0 2 Rgba32i", "OpImageWrite %im %vu12 %vi1234",
|
{"%int 2D 0 0 0 2 Rgba32i", "OpImageWrite %im %vi12 %vi1234",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -2840,7 +2840,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureStore}
|
Identifier[not set]{textureStore}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
Identifier[not set]{vi1234}
|
Identifier[not set]{vi1234}
|
||||||
)
|
)
|
||||||
})"}}));
|
})"}}));
|
||||||
|
@ -2850,7 +2850,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
SpvParserTest_ImageAccessTest,
|
SpvParserTest_ImageAccessTest,
|
||||||
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
||||||
// OpImageRead with no extra params
|
// OpImageRead with no extra params
|
||||||
{"%float 2D 0 0 0 2 Rgba32f", "%99 = OpImageRead %v4float %im %vu12",
|
{"%float 2D 0 0 0 2 Rgba32f", "%99 = OpImageRead %v4float %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -2870,7 +2870,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2878,7 +2878,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
})"},
|
})"},
|
||||||
// OpImageRead with ConstOffset
|
// OpImageRead with ConstOffset
|
||||||
{"%float 2D 0 0 0 2 Rgba32f",
|
{"%float 2D 0 0 0 2 Rgba32f",
|
||||||
"%99 = OpImageRead %v4float %im %vu12 ConstOffset %offsets2d",
|
"%99 = OpImageRead %v4float %im %vi12 ConstOffset %offsets2d",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -2898,7 +2898,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
Identifier[not set]{offsets2d}
|
Identifier[not set]{offsets2d}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -2911,7 +2911,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
SpvParserTest_ImageAccessTest,
|
SpvParserTest_ImageAccessTest,
|
||||||
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
||||||
// OpImageFetch with no extra params
|
// OpImageFetch with no extra params
|
||||||
{"%float 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4float %im %vu12",
|
{"%float 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4float %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -2931,7 +2931,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2940,7 +2940,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
// OpImageFetch with ConstOffset
|
// OpImageFetch with ConstOffset
|
||||||
// TODO(dneto): Seems this is not valid in WGSL.
|
// TODO(dneto): Seems this is not valid in WGSL.
|
||||||
{"%float 2D 0 0 0 1 Unknown",
|
{"%float 2D 0 0 0 1 Unknown",
|
||||||
"%99 = OpImageFetch %v4float %im %vu12 ConstOffset %offsets2d",
|
"%99 = OpImageFetch %v4float %im %vi12 ConstOffset %offsets2d",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -2960,7 +2960,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
Identifier[not set]{offsets2d}
|
Identifier[not set]{offsets2d}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -3030,12 +3030,9 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{vi123}
|
Identifier[not set]{vi123}
|
||||||
Identifier[not set]{xy}
|
Identifier[not set]{xy}
|
||||||
}
|
}
|
||||||
TypeConstructor[not set]{
|
MemberAccessor[not set]{
|
||||||
__i32
|
Identifier[not set]{vi123}
|
||||||
MemberAccessor[not set]{
|
Identifier[not set]{z}
|
||||||
Identifier[not set]{vi123}
|
|
||||||
Identifier[not set]{z}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Identifier[not set]{i1}
|
Identifier[not set]{i1}
|
||||||
)
|
)
|
||||||
|
@ -3099,7 +3096,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
//
|
//
|
||||||
|
|
||||||
// OpImageFetch requires no conversion, float -> v4float
|
// OpImageFetch requires no conversion, float -> v4float
|
||||||
{"%float 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4float %im %vu12",
|
{"%float 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4float %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -3119,14 +3116,14 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})"},
|
})"},
|
||||||
// OpImageFetch requires no conversion, uint -> v4uint
|
// OpImageFetch requires no conversion, uint -> v4uint
|
||||||
{"%uint 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4uint %im %vu12",
|
{"%uint 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4uint %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -3146,14 +3143,14 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})"},
|
})"},
|
||||||
// OpImageFetch requires conversion, uint -> v4int
|
// OpImageFetch requires conversion, uint -> v4int
|
||||||
{"%uint 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4int %im %vu12",
|
{"%uint 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4int %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -3174,7 +3171,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3182,7 +3179,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
}
|
}
|
||||||
})"},
|
})"},
|
||||||
// OpImageFetch requires no conversion, int -> v4int
|
// OpImageFetch requires no conversion, int -> v4int
|
||||||
{"%int 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4int %im %vu12",
|
{"%int 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4int %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -3202,14 +3199,14 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})"},
|
})"},
|
||||||
// OpImageFetch requires conversion, int -> v4uint
|
// OpImageFetch requires conversion, int -> v4uint
|
||||||
{"%int 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4uint %im %vu12",
|
{"%int 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4uint %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -3230,7 +3227,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3243,7 +3240,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
//
|
//
|
||||||
|
|
||||||
// OpImageRead requires no conversion, float -> v4float
|
// OpImageRead requires no conversion, float -> v4float
|
||||||
{"%float 2D 0 0 0 1 Rgba32f", "%99 = OpImageRead %v4float %im %vu12",
|
{"%float 2D 0 0 0 1 Rgba32f", "%99 = OpImageRead %v4float %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -3263,14 +3260,14 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})"},
|
})"},
|
||||||
// OpImageRead requires no conversion, uint -> v4uint
|
// OpImageRead requires no conversion, uint -> v4uint
|
||||||
{"%uint 2D 0 0 0 1 Rgba32ui", "%99 = OpImageRead %v4uint %im %vu12",
|
{"%uint 2D 0 0 0 1 Rgba32ui", "%99 = OpImageRead %v4uint %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -3290,14 +3287,14 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})"},
|
})"},
|
||||||
// OpImageRead requires conversion, uint -> v4int
|
// OpImageRead requires conversion, uint -> v4int
|
||||||
{"%uint 2D 0 0 0 1 Rgba32ui", "%99 = OpImageRead %v4int %im %vu12",
|
{"%uint 2D 0 0 0 1 Rgba32ui", "%99 = OpImageRead %v4int %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -3318,7 +3315,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3326,7 +3323,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
}
|
}
|
||||||
})"},
|
})"},
|
||||||
// OpImageRead requires no conversion, int -> v4int
|
// OpImageRead requires no conversion, int -> v4int
|
||||||
{"%int 2D 0 0 0 1 Rgba32i", "%99 = OpImageRead %v4int %im %vu12",
|
{"%int 2D 0 0 0 1 Rgba32i", "%99 = OpImageRead %v4int %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -3346,14 +3343,14 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})"},
|
})"},
|
||||||
// OpImageRead requires conversion, int -> v4uint
|
// OpImageRead requires conversion, int -> v4uint
|
||||||
{"%int 2D 0 0 0 1 Rgba32i", "%99 = OpImageRead %v4uint %im %vu12",
|
{"%int 2D 0 0 0 1 Rgba32i", "%99 = OpImageRead %v4uint %im %vi12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -3374,7 +3371,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Identifier[not set]{textureLoad}
|
Identifier[not set]{textureLoad}
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vi12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3388,7 +3385,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
|
|
||||||
// OpImageSampleImplicitLod requires no conversion, float -> v4float
|
// OpImageSampleImplicitLod requires no conversion, float -> v4float
|
||||||
{"%float 2D 0 0 0 1 Unknown",
|
{"%float 2D 0 0 0 1 Unknown",
|
||||||
"%99 = OpImageSampleImplicitLod %v4float %sampled_image %vu12",
|
"%99 = OpImageSampleImplicitLod %v4float %sampled_image %vf12",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -3419,7 +3416,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{x_10}
|
Identifier[not set]{x_10}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vf12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3427,7 +3424,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
})"},
|
})"},
|
||||||
// OpImageSampleImplicitLod requires no conversion, uint -> v4uint
|
// OpImageSampleImplicitLod requires no conversion, uint -> v4uint
|
||||||
{"%uint 2D 0 0 0 1 Unknown",
|
{"%uint 2D 0 0 0 1 Unknown",
|
||||||
"%99 = OpImageSampleImplicitLod %v4uint %sampled_image %vu12",
|
"%99 = OpImageSampleImplicitLod %v4uint %sampled_image %vf12",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -3458,7 +3455,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{x_10}
|
Identifier[not set]{x_10}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vf12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3466,7 +3463,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
})"},
|
})"},
|
||||||
// OpImageSampleImplicitLod requires conversion, uint -> v4int
|
// OpImageSampleImplicitLod requires conversion, uint -> v4int
|
||||||
{"%uint 2D 0 0 0 1 Unknown",
|
{"%uint 2D 0 0 0 1 Unknown",
|
||||||
"%99 = OpImageSampleImplicitLod %v4int %sampled_image %vu12",
|
"%99 = OpImageSampleImplicitLod %v4int %sampled_image %vf12",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -3498,7 +3495,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{x_10}
|
Identifier[not set]{x_10}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vf12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3507,7 +3504,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
})"},
|
})"},
|
||||||
// OpImageSampleImplicitLod requires no conversion, int -> v4int
|
// OpImageSampleImplicitLod requires no conversion, int -> v4int
|
||||||
{"%int 2D 0 0 0 1 Unknown",
|
{"%int 2D 0 0 0 1 Unknown",
|
||||||
"%99 = OpImageSampleImplicitLod %v4int %sampled_image %vu12",
|
"%99 = OpImageSampleImplicitLod %v4int %sampled_image %vf12",
|
||||||
R"(
|
R"(
|
||||||
Variable{
|
Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
|
@ -3538,7 +3535,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{x_10}
|
Identifier[not set]{x_10}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vf12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3546,7 +3543,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
})"},
|
})"},
|
||||||
// OpImageSampleImplicitLod requires conversion, int -> v4uint
|
// OpImageSampleImplicitLod requires conversion, int -> v4uint
|
||||||
{"%int 2D 0 0 0 1 Unknown",
|
{"%int 2D 0 0 0 1 Unknown",
|
||||||
"%99 = OpImageSampleImplicitLod %v4uint %sampled_image %vu12",
|
"%99 = OpImageSampleImplicitLod %v4uint %sampled_image %vf12",
|
||||||
R"(Variable{
|
R"(Variable{
|
||||||
Decorations{
|
Decorations{
|
||||||
SetDecoration{2}
|
SetDecoration{2}
|
||||||
|
@ -3568,7 +3565,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
(
|
(
|
||||||
Identifier[not set]{x_20}
|
Identifier[not set]{x_20}
|
||||||
Identifier[not set]{x_10}
|
Identifier[not set]{x_10}
|
||||||
Identifier[not set]{vu12}
|
Identifier[not set]{vf12}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3604,6 +3601,14 @@ TEST_P(SpvParserTest_ImageCoordsTest, MakeCoordinateOperandsForImageAccess) {
|
||||||
OpExecutionMode %100 OriginUpperLeft
|
OpExecutionMode %100 OriginUpperLeft
|
||||||
OpName %float_var "float_var"
|
OpName %float_var "float_var"
|
||||||
OpName %ptr_float "ptr_float"
|
OpName %ptr_float "ptr_float"
|
||||||
|
OpName %i1 "i1"
|
||||||
|
OpName %vi12 "vi12"
|
||||||
|
OpName %vi123 "vi123"
|
||||||
|
OpName %vi1234 "vi1234"
|
||||||
|
OpName %u1 "u1"
|
||||||
|
OpName %vu12 "vu12"
|
||||||
|
OpName %vu123 "vu123"
|
||||||
|
OpName %vu1234 "vu1234"
|
||||||
OpName %f1 "f1"
|
OpName %f1 "f1"
|
||||||
OpName %vf12 "vf12"
|
OpName %vf12 "vf12"
|
||||||
OpName %vf123 "vf123"
|
OpName %vf123 "vf123"
|
||||||
|
@ -3635,6 +3640,16 @@ TEST_P(SpvParserTest_ImageCoordsTest, MakeCoordinateOperandsForImageAccess) {
|
||||||
|
|
||||||
%float_var = OpVariable %ptr_float Function
|
%float_var = OpVariable %ptr_float Function
|
||||||
|
|
||||||
|
%i1 = OpCopyObject %int %int_1
|
||||||
|
%vi12 = OpCopyObject %v2int %the_vi12
|
||||||
|
%vi123 = OpCopyObject %v3int %the_vi123
|
||||||
|
%vi1234 = OpCopyObject %v4int %the_vi1234
|
||||||
|
|
||||||
|
%u1 = OpCopyObject %uint %uint_1
|
||||||
|
%vu12 = OpCopyObject %v2uint %the_vu12
|
||||||
|
%vu123 = OpCopyObject %v3uint %the_vu123
|
||||||
|
%vu1234 = OpCopyObject %v4uint %the_vu1234
|
||||||
|
|
||||||
%f1 = OpCopyObject %float %float_1
|
%f1 = OpCopyObject %float %float_1
|
||||||
%vf12 = OpCopyObject %v2float %the_vf12
|
%vf12 = OpCopyObject %v2float %the_vf12
|
||||||
%vf123 = OpCopyObject %v3float %the_vf123
|
%vf123 = OpCopyObject %v3float %the_vf123
|
||||||
|
@ -3912,6 +3927,333 @@ INSTANTIATE_TEST_SUITE_P(Good_CubeArray,
|
||||||
}
|
}
|
||||||
)"}}}));
|
)"}}}));
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
PreserveFloatCoords_NonArrayed,
|
||||||
|
// In SPIR-V, sampling and dref sampling operations use floating point
|
||||||
|
// coordinates. Prove that we preserve floating point-ness.
|
||||||
|
// Test across all such instructions.
|
||||||
|
SpvParserTest_ImageCoordsTest,
|
||||||
|
::testing::ValuesIn(std::vector<ImageCoordsCase>{
|
||||||
|
// Scalar cases
|
||||||
|
{"%float 1D 0 0 0 1 Unknown",
|
||||||
|
"%result = OpImageSampleImplicitLod %v4float %sampled_image %f1",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{f1}\n"}},
|
||||||
|
{"%float 1D 0 0 0 1 Unknown",
|
||||||
|
"%result = OpImageSampleExplicitLod %v4float %sampled_image %f1 Lod "
|
||||||
|
"%f1",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{f1}\n"}},
|
||||||
|
// WGSL does not support depth textures with 1D coordinates
|
||||||
|
// Vector cases
|
||||||
|
{"%float 2D 0 0 0 1 Unknown",
|
||||||
|
"%result = OpImageSampleImplicitLod %v4float %sampled_image %vf12",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{vf12}\n"}},
|
||||||
|
{"%float 2D 0 0 0 1 Unknown",
|
||||||
|
"%result = OpImageSampleExplicitLod %v4float %sampled_image %vf12 Lod "
|
||||||
|
"%f1",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{vf12}\n"}},
|
||||||
|
{"%float 2D 1 0 0 1 Unknown",
|
||||||
|
"%result = OpImageSampleDrefImplicitLod %v4float %sampled_image %vf12 "
|
||||||
|
"%depth",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{vf12}\n"}},
|
||||||
|
{"%float 2D 1 0 0 1 Unknown",
|
||||||
|
"%result = OpImageSampleDrefExplicitLod %v4float %sampled_image %vf12 "
|
||||||
|
"%depth Lod %f1",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{vf12}\n"}},
|
||||||
|
}));
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
PreserveFloatCoords_Arrayed,
|
||||||
|
// In SPIR-V, sampling and dref sampling operations use floating point
|
||||||
|
// coordinates. Prove that we preserve floating point-ness of the
|
||||||
|
// coordinate part, but convert the array index to signed integer. Test
|
||||||
|
// across all such instructions.
|
||||||
|
SpvParserTest_ImageCoordsTest,
|
||||||
|
::testing::ValuesIn(std::vector<ImageCoordsCase>{
|
||||||
|
{"%float 2D 0 1 0 1 Unknown",
|
||||||
|
"%result = OpImageSampleImplicitLod %v4float %sampled_image %vf123",
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
R"(MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vf123}
|
||||||
|
Identifier[not set]{xy}
|
||||||
|
}
|
||||||
|
)",
|
||||||
|
R"(TypeConstructor[not set]{
|
||||||
|
__i32
|
||||||
|
MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vf123}
|
||||||
|
Identifier[not set]{z}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
|
||||||
|
{"%float 2D 0 1 0 1 Unknown",
|
||||||
|
"%result = OpImageSampleExplicitLod %v4float %sampled_image %vf123 "
|
||||||
|
"Lod %f1",
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
R"(MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vf123}
|
||||||
|
Identifier[not set]{xy}
|
||||||
|
}
|
||||||
|
)",
|
||||||
|
R"(TypeConstructor[not set]{
|
||||||
|
__i32
|
||||||
|
MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vf123}
|
||||||
|
Identifier[not set]{z}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
{"%float 2D 1 1 0 1 Unknown",
|
||||||
|
"%result = OpImageSampleDrefImplicitLod %v4float %sampled_image "
|
||||||
|
"%vf123 %depth",
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
R"(MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vf123}
|
||||||
|
Identifier[not set]{xy}
|
||||||
|
}
|
||||||
|
)",
|
||||||
|
R"(TypeConstructor[not set]{
|
||||||
|
__i32
|
||||||
|
MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vf123}
|
||||||
|
Identifier[not set]{z}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
{"%float 2D 1 1 0 1 Unknown",
|
||||||
|
"%result = OpImageSampleDrefExplicitLod %v4float %sampled_image "
|
||||||
|
"%vf123 %depth Lod %f1",
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
R"(MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vf123}
|
||||||
|
Identifier[not set]{xy}
|
||||||
|
}
|
||||||
|
)",
|
||||||
|
R"(TypeConstructor[not set]{
|
||||||
|
__i32
|
||||||
|
MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vf123}
|
||||||
|
Identifier[not set]{z}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)"}}}));
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
PreserveIntCoords_NonArrayed,
|
||||||
|
// In SPIR-V, image read, fetch, and write use integer coordinates.
|
||||||
|
// Prove that we preserve signed integer coordinates.
|
||||||
|
SpvParserTest_ImageCoordsTest,
|
||||||
|
::testing::ValuesIn(std::vector<ImageCoordsCase>{
|
||||||
|
// Scalar cases
|
||||||
|
{"%float 1D 0 0 0 1 Unknown",
|
||||||
|
"%result = OpImageFetch %float %im %i1",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{i1}\n"}},
|
||||||
|
{"%float 1D 0 0 0 2 R32f",
|
||||||
|
"%result = OpImageRead %float %im %i1",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{i1}\n"}},
|
||||||
|
{"%float 1D 0 0 0 2 R32f",
|
||||||
|
"OpImageWrite %im %i1 %float_1",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{i1}\n"}},
|
||||||
|
// Vector cases
|
||||||
|
{"%float 2D 0 0 0 1 Unknown",
|
||||||
|
"%result = OpImageFetch %float %im %vi12",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{vi12}\n"}},
|
||||||
|
{"%float 2D 0 0 0 2 R32f",
|
||||||
|
"%result = OpImageRead %float %im %vi12",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{vi12}\n"}},
|
||||||
|
{"%float 2D 0 0 0 2 R32f",
|
||||||
|
"OpImageWrite %im %vi12 %float_1",
|
||||||
|
"",
|
||||||
|
{"Identifier[not set]{vi12}\n"}}}));
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
PreserveIntCoords_Arrayed,
|
||||||
|
// In SPIR-V, image read, fetch, and write use integer coordinates.
|
||||||
|
// Prove that we preserve signed integer coordinates.
|
||||||
|
SpvParserTest_ImageCoordsTest,
|
||||||
|
::testing::ValuesIn(std::vector<ImageCoordsCase>{
|
||||||
|
{"%float 2D 0 1 0 1 Unknown",
|
||||||
|
"%result = OpImageFetch %float %im %vi123",
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
R"(MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vi123}
|
||||||
|
Identifier[not set]{xy}
|
||||||
|
}
|
||||||
|
)",
|
||||||
|
R"(MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vi123}
|
||||||
|
Identifier[not set]{z}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
{"%float 2D 0 1 0 2 R32f",
|
||||||
|
"%result = OpImageRead %float %im %vi123",
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
R"(MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vi123}
|
||||||
|
Identifier[not set]{xy}
|
||||||
|
}
|
||||||
|
)",
|
||||||
|
R"(MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vi123}
|
||||||
|
Identifier[not set]{z}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
{"%float 2D 0 1 0 2 R32f",
|
||||||
|
"OpImageWrite %im %vi123 %float_1",
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
R"(MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vi123}
|
||||||
|
Identifier[not set]{xy}
|
||||||
|
}
|
||||||
|
)",
|
||||||
|
R"(MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vi123}
|
||||||
|
Identifier[not set]{z}
|
||||||
|
}
|
||||||
|
)"}}}));
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
ConvertUintCoords_NonArrayed,
|
||||||
|
// In SPIR-V, image read, fetch, and write use integer coordinates.
|
||||||
|
// Prove that we convert unsigned integer coordinates to signed.
|
||||||
|
SpvParserTest_ImageCoordsTest,
|
||||||
|
::testing::ValuesIn(std::vector<ImageCoordsCase>{
|
||||||
|
// Scalar cases
|
||||||
|
{"%float 1D 0 0 0 1 Unknown",
|
||||||
|
"%result = OpImageFetch %float %im %u1",
|
||||||
|
"",
|
||||||
|
{R"(TypeConstructor[not set]{
|
||||||
|
__i32
|
||||||
|
Identifier[not set]{u1}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
{"%float 1D 0 0 0 2 R32f",
|
||||||
|
"%result = OpImageRead %float %im %u1",
|
||||||
|
"",
|
||||||
|
{R"(TypeConstructor[not set]{
|
||||||
|
__i32
|
||||||
|
Identifier[not set]{u1}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
{"%float 1D 0 0 0 2 R32f",
|
||||||
|
"OpImageWrite %im %u1 %float_1",
|
||||||
|
"",
|
||||||
|
{R"(TypeConstructor[not set]{
|
||||||
|
__i32
|
||||||
|
Identifier[not set]{u1}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
// Vector cases
|
||||||
|
{"%float 2D 0 0 0 1 Unknown",
|
||||||
|
"%result = OpImageFetch %float %im %vu12",
|
||||||
|
"",
|
||||||
|
{R"(TypeConstructor[not set]{
|
||||||
|
__vec_2__i32
|
||||||
|
Identifier[not set]{vu12}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
{"%float 2D 0 0 0 2 R32f",
|
||||||
|
"%result = OpImageRead %float %im %vu12",
|
||||||
|
"",
|
||||||
|
{R"(TypeConstructor[not set]{
|
||||||
|
__vec_2__i32
|
||||||
|
Identifier[not set]{vu12}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
{"%float 2D 0 0 0 2 R32f",
|
||||||
|
"OpImageWrite %im %vu12 %float_1",
|
||||||
|
"",
|
||||||
|
{R"(TypeConstructor[not set]{
|
||||||
|
__vec_2__i32
|
||||||
|
Identifier[not set]{vu12}
|
||||||
|
}
|
||||||
|
)"}}}));
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
ConvertUintCoords_Arrayed,
|
||||||
|
// In SPIR-V, image read, fetch, and write use integer coordinates.
|
||||||
|
// Prove that we convert unsigned integer coordinates to signed.
|
||||||
|
SpvParserTest_ImageCoordsTest,
|
||||||
|
::testing::ValuesIn(std::vector<ImageCoordsCase>{
|
||||||
|
{"%float 2D 0 1 0 1 Unknown",
|
||||||
|
"%result = OpImageFetch %float %im %vu123",
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
R"(TypeConstructor[not set]{
|
||||||
|
__vec_2__i32
|
||||||
|
MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vu123}
|
||||||
|
Identifier[not set]{xy}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)",
|
||||||
|
R"(TypeConstructor[not set]{
|
||||||
|
__i32
|
||||||
|
MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vu123}
|
||||||
|
Identifier[not set]{z}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
{"%float 2D 0 1 0 2 R32f",
|
||||||
|
"%result = OpImageRead %float %im %vu123",
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
R"(TypeConstructor[not set]{
|
||||||
|
__vec_2__i32
|
||||||
|
MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vu123}
|
||||||
|
Identifier[not set]{xy}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)",
|
||||||
|
R"(TypeConstructor[not set]{
|
||||||
|
__i32
|
||||||
|
MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vu123}
|
||||||
|
Identifier[not set]{z}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)"}},
|
||||||
|
{"%float 2D 0 1 0 2 R32f",
|
||||||
|
"OpImageWrite %im %vu123 %float_1",
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
R"(TypeConstructor[not set]{
|
||||||
|
__vec_2__i32
|
||||||
|
MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vu123}
|
||||||
|
Identifier[not set]{xy}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)",
|
||||||
|
R"(TypeConstructor[not set]{
|
||||||
|
__i32
|
||||||
|
MemberAccessor[not set]{
|
||||||
|
Identifier[not set]{vu123}
|
||||||
|
Identifier[not set]{z}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)"}}}));
|
||||||
|
|
||||||
INSTANTIATE_TEST_SUITE_P(
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
BadInstructions,
|
BadInstructions,
|
||||||
SpvParserTest_ImageCoordsTest,
|
SpvParserTest_ImageCoordsTest,
|
||||||
|
@ -3924,7 +4266,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
{"%float 1D 0 0 0 1 Unknown",
|
{"%float 1D 0 0 0 1 Unknown",
|
||||||
"%50 = OpCopyObject %float %float_1",
|
"%50 = OpCopyObject %float %float_1",
|
||||||
"internal error: couldn't find image for "
|
"internal error: couldn't find image for "
|
||||||
"%50 = OpCopyObject %9 %36",
|
"%50 = OpCopyObject %18 %44",
|
||||||
{}},
|
{}},
|
||||||
{"%float 1D 0 0 0 1 Unknown",
|
{"%float 1D 0 0 0 1 Unknown",
|
||||||
"OpStore %float_var %float_1",
|
"OpStore %float_var %float_1",
|
||||||
|
@ -3939,40 +4281,40 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
Bad_Coordinate,
|
Bad_Coordinate,
|
||||||
SpvParserTest_ImageCoordsTest,
|
SpvParserTest_ImageCoordsTest,
|
||||||
::testing::ValuesIn(std::vector<ImageCoordsCase>{
|
::testing::ValuesIn(std::vector<ImageCoordsCase>{
|
||||||
{"%float 2D 0 0 0 1 Unknown",
|
{"%float 1D 0 0 0 1 Unknown",
|
||||||
"%result = OpImageSampleImplicitLod "
|
"%result = OpImageSampleImplicitLod "
|
||||||
// bad type for coordinate: not a number
|
// bad type for coordinate: not a number
|
||||||
"%v4float %sampled_image %float_var",
|
"%v4float %sampled_image %float_var",
|
||||||
"bad or unsupported coordinate type for image access: %63 = "
|
"bad or unsupported coordinate type for image access: %71 = "
|
||||||
"OpImageSampleImplicitLod %34 %62 %1",
|
"OpImageSampleImplicitLod %42 %70 %1",
|
||||||
{}},
|
{}},
|
||||||
{"%float 1D 0 1 0 1 Unknown", // 1DArray
|
{"%float 1D 0 1 0 1 Unknown", // 1DArray
|
||||||
"%result = OpImageSampleImplicitLod "
|
"%result = OpImageSampleImplicitLod "
|
||||||
// 1 component, but need 2
|
// 1 component, but need 2
|
||||||
"%v4float %sampled_image %f1",
|
"%v4float %sampled_image %f1",
|
||||||
"image access required 2 coordinate components, but only 1 provided, "
|
"image access required 2 coordinate components, but only 1 provided, "
|
||||||
"in: %63 = OpImageSampleImplicitLod %34 %62 %3",
|
"in: %71 = OpImageSampleImplicitLod %42 %70 %12",
|
||||||
{}},
|
{}},
|
||||||
{"%float 2D 0 0 0 1 Unknown", // 2D
|
{"%float 2D 0 0 0 1 Unknown", // 2D
|
||||||
"%result = OpImageSampleImplicitLod "
|
"%result = OpImageSampleImplicitLod "
|
||||||
// 1 component, but need 2
|
// 1 component, but need 2
|
||||||
"%v4float %sampled_image %f1",
|
"%v4float %sampled_image %f1",
|
||||||
"image access required 2 coordinate components, but only 1 provided, "
|
"image access required 2 coordinate components, but only 1 provided, "
|
||||||
"in: %63 = OpImageSampleImplicitLod %34 %62 %3",
|
"in: %71 = OpImageSampleImplicitLod %42 %70 %12",
|
||||||
{}},
|
{}},
|
||||||
{"%float 2D 0 1 0 1 Unknown", // 2DArray
|
{"%float 2D 0 1 0 1 Unknown", // 2DArray
|
||||||
"%result = OpImageSampleImplicitLod "
|
"%result = OpImageSampleImplicitLod "
|
||||||
// 2 component, but need 3
|
// 2 component, but need 3
|
||||||
"%v4float %sampled_image %vf12",
|
"%v4float %sampled_image %vf12",
|
||||||
"image access required 3 coordinate components, but only 2 provided, "
|
"image access required 3 coordinate components, but only 2 provided, "
|
||||||
"in: %63 = OpImageSampleImplicitLod %34 %62 %4",
|
"in: %71 = OpImageSampleImplicitLod %42 %70 %13",
|
||||||
{}},
|
{}},
|
||||||
{"%float 3D 0 0 0 1 Unknown", // 3D
|
{"%float 3D 0 0 0 1 Unknown", // 3D
|
||||||
"%result = OpImageSampleImplicitLod "
|
"%result = OpImageSampleImplicitLod "
|
||||||
// 2 components, but need 3
|
// 2 components, but need 3
|
||||||
"%v4float %sampled_image %vf12",
|
"%v4float %sampled_image %vf12",
|
||||||
"image access required 3 coordinate components, but only 2 provided, "
|
"image access required 3 coordinate components, but only 2 provided, "
|
||||||
"in: %63 = OpImageSampleImplicitLod %34 %62 %4",
|
"in: %71 = OpImageSampleImplicitLod %42 %70 %13",
|
||||||
{}},
|
{}},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue