mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-12 14:46:08 +00:00
writer/msl: Fix texture intrinsic generation
Wrap the texture expression in parentheses when it has lower precendence than the function call operator. Cast integer coordinates to unsigned integers as required by MSL. Fixed: tint:536 Change-Id: I957e6be3c51044959e25e0be96c2d2c65db18187 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/53962 Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: James Price <jrprice@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
committed by
Tint LUCI CQ
parent
830b97ffa9
commit
0f1efe04c3
@@ -531,6 +531,27 @@ bool GeneratorImpl::EmitTextureCall(ast::CallExpression* expr,
|
||||
|
||||
auto* texture_type = TypeOf(texture)->UnwrapRef()->As<sem::Texture>();
|
||||
|
||||
// Helper to emit the texture expression, wrapped in parentheses if the
|
||||
// expression includes an operator with lower precedence than the member
|
||||
// accessor used for the function calls.
|
||||
auto texture_expr = [&]() {
|
||||
bool paren_lhs =
|
||||
!texture
|
||||
->IsAnyOf<ast::ArrayAccessorExpression, ast::CallExpression,
|
||||
ast::IdentifierExpression, ast::MemberAccessorExpression,
|
||||
ast::TypeConstructorExpression>();
|
||||
if (paren_lhs) {
|
||||
out_ << "(";
|
||||
}
|
||||
if (!EmitExpression(texture)) {
|
||||
return false;
|
||||
}
|
||||
if (paren_lhs) {
|
||||
out_ << ")";
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
switch (intrinsic->Type()) {
|
||||
case sem::IntrinsicType::kTextureDimensions: {
|
||||
std::vector<const char*> dims;
|
||||
@@ -557,7 +578,7 @@ bool GeneratorImpl::EmitTextureCall(ast::CallExpression* expr,
|
||||
}
|
||||
|
||||
auto get_dim = [&](const char* name) {
|
||||
if (!EmitExpression(texture)) {
|
||||
if (!texture_expr()) {
|
||||
return false;
|
||||
}
|
||||
out_ << ".get_" << name << "(";
|
||||
@@ -589,7 +610,7 @@ bool GeneratorImpl::EmitTextureCall(ast::CallExpression* expr,
|
||||
}
|
||||
case sem::IntrinsicType::kTextureNumLayers: {
|
||||
out_ << "int(";
|
||||
if (!EmitExpression(texture)) {
|
||||
if (!texture_expr()) {
|
||||
return false;
|
||||
}
|
||||
out_ << ".get_array_size())";
|
||||
@@ -597,7 +618,7 @@ bool GeneratorImpl::EmitTextureCall(ast::CallExpression* expr,
|
||||
}
|
||||
case sem::IntrinsicType::kTextureNumLevels: {
|
||||
out_ << "int(";
|
||||
if (!EmitExpression(texture)) {
|
||||
if (!texture_expr()) {
|
||||
return false;
|
||||
}
|
||||
out_ << ".get_num_mip_levels())";
|
||||
@@ -605,7 +626,7 @@ bool GeneratorImpl::EmitTextureCall(ast::CallExpression* expr,
|
||||
}
|
||||
case sem::IntrinsicType::kTextureNumSamples: {
|
||||
out_ << "int(";
|
||||
if (!EmitExpression(texture)) {
|
||||
if (!texture_expr()) {
|
||||
return false;
|
||||
}
|
||||
out_ << ".get_num_samples())";
|
||||
@@ -615,8 +636,9 @@ bool GeneratorImpl::EmitTextureCall(ast::CallExpression* expr,
|
||||
break;
|
||||
}
|
||||
|
||||
if (!EmitExpression(texture))
|
||||
if (!texture_expr()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool lod_param_is_named = true;
|
||||
|
||||
@@ -655,9 +677,38 @@ bool GeneratorImpl::EmitTextureCall(ast::CallExpression* expr,
|
||||
{Usage::kValue, Usage::kSampler, Usage::kCoords, Usage::kArrayIndex,
|
||||
Usage::kDepthRef, Usage::kSampleIndex}) {
|
||||
if (auto* e = arg(usage)) {
|
||||
auto* sem_e = program_->Sem().Get(e);
|
||||
|
||||
maybe_write_comma();
|
||||
|
||||
// Cast the coordinates to unsigned integers if necessary.
|
||||
bool casted = false;
|
||||
if (usage == Usage::kCoords &&
|
||||
sem_e->Type()->UnwrapRef()->is_integer_scalar_or_vector()) {
|
||||
casted = true;
|
||||
switch (texture_type->dim()) {
|
||||
case ast::TextureDimension::k1d:
|
||||
out_ << "uint(";
|
||||
break;
|
||||
case ast::TextureDimension::k2d:
|
||||
case ast::TextureDimension::k2dArray:
|
||||
out_ << "uint2(";
|
||||
break;
|
||||
case ast::TextureDimension::k3d:
|
||||
out_ << "uint3(";
|
||||
break;
|
||||
default:
|
||||
TINT_ICE(diagnostics_) << "unhandled texture dimensionality";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!EmitExpression(e))
|
||||
return false;
|
||||
|
||||
if (casted) {
|
||||
out_ << ")";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -181,41 +181,41 @@ std::string expected_texture_overload(
|
||||
case ValidTextureOverload::kSampleCompareDepthCubeArrayF32:
|
||||
return R"(texture.sample_compare(sampler, float3(1.0f, 2.0f, 3.0f), 4, 5.0f))";
|
||||
case ValidTextureOverload::kLoad1dLevelF32:
|
||||
return R"(texture.read(1, 3))";
|
||||
return R"(texture.read(uint(1), 3))";
|
||||
case ValidTextureOverload::kLoad1dLevelU32:
|
||||
return R"(texture.read(1, 3))";
|
||||
return R"(texture.read(uint(1), 3))";
|
||||
case ValidTextureOverload::kLoad1dLevelI32:
|
||||
return R"(texture.read(1, 3))";
|
||||
return R"(texture.read(uint(1), 3))";
|
||||
case ValidTextureOverload::kLoad2dLevelF32:
|
||||
return R"(texture.read(int2(1, 2), 3))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3))";
|
||||
case ValidTextureOverload::kLoad2dLevelU32:
|
||||
return R"(texture.read(int2(1, 2), 3))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3))";
|
||||
case ValidTextureOverload::kLoad2dLevelI32:
|
||||
return R"(texture.read(int2(1, 2), 3))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3))";
|
||||
case ValidTextureOverload::kLoad2dArrayLevelF32:
|
||||
return R"(texture.read(int2(1, 2), 3, 4))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3, 4))";
|
||||
case ValidTextureOverload::kLoad2dArrayLevelU32:
|
||||
return R"(texture.read(int2(1, 2), 3, 4))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3, 4))";
|
||||
case ValidTextureOverload::kLoad2dArrayLevelI32:
|
||||
return R"(texture.read(int2(1, 2), 3, 4))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3, 4))";
|
||||
case ValidTextureOverload::kLoad3dLevelF32:
|
||||
return R"(texture.read(int3(1, 2, 3), 4))";
|
||||
return R"(texture.read(uint3(int3(1, 2, 3)), 4))";
|
||||
case ValidTextureOverload::kLoad3dLevelU32:
|
||||
return R"(texture.read(int3(1, 2, 3), 4))";
|
||||
return R"(texture.read(uint3(int3(1, 2, 3)), 4))";
|
||||
case ValidTextureOverload::kLoad3dLevelI32:
|
||||
return R"(texture.read(int3(1, 2, 3), 4))";
|
||||
return R"(texture.read(uint3(int3(1, 2, 3)), 4))";
|
||||
case ValidTextureOverload::kLoadMultisampled2dF32:
|
||||
return R"(texture.read(int2(1, 2), 3))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3))";
|
||||
case ValidTextureOverload::kLoadMultisampled2dU32:
|
||||
return R"(texture.read(int2(1, 2), 3))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3))";
|
||||
case ValidTextureOverload::kLoadMultisampled2dI32:
|
||||
return R"(texture.read(int2(1, 2), 3))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3))";
|
||||
case ValidTextureOverload::kLoadDepth2dLevelF32:
|
||||
return R"(texture.read(int2(1, 2), 3))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3))";
|
||||
case ValidTextureOverload::kLoadDepth2dArrayLevelF32:
|
||||
return R"(texture.read(int2(1, 2), 3, 4))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3, 4))";
|
||||
case ValidTextureOverload::kLoadStorageRO1dRgba32float:
|
||||
return R"(texture.read(1))";
|
||||
return R"(texture.read(uint(1)))";
|
||||
case ValidTextureOverload::kLoadStorageRO2dRgba8unorm:
|
||||
case ValidTextureOverload::kLoadStorageRO2dRgba8snorm:
|
||||
case ValidTextureOverload::kLoadStorageRO2dRgba8uint:
|
||||
@@ -232,19 +232,19 @@ std::string expected_texture_overload(
|
||||
case ValidTextureOverload::kLoadStorageRO2dRgba32uint:
|
||||
case ValidTextureOverload::kLoadStorageRO2dRgba32sint:
|
||||
case ValidTextureOverload::kLoadStorageRO2dRgba32float:
|
||||
return R"(texture.read(int2(1, 2)))";
|
||||
return R"(texture.read(uint2(int2(1, 2))))";
|
||||
case ValidTextureOverload::kLoadStorageRO2dArrayRgba32float:
|
||||
return R"(texture.read(int2(1, 2), 3))";
|
||||
return R"(texture.read(uint2(int2(1, 2)), 3))";
|
||||
case ValidTextureOverload::kLoadStorageRO3dRgba32float:
|
||||
return R"(texture.read(int3(1, 2, 3)))";
|
||||
return R"(texture.read(uint3(int3(1, 2, 3))))";
|
||||
case ValidTextureOverload::kStoreWO1dRgba32float:
|
||||
return R"(texture.write(float4(2.0f, 3.0f, 4.0f, 5.0f), 1))";
|
||||
return R"(texture.write(float4(2.0f, 3.0f, 4.0f, 5.0f), uint(1)))";
|
||||
case ValidTextureOverload::kStoreWO2dRgba32float:
|
||||
return R"(texture.write(float4(3.0f, 4.0f, 5.0f, 6.0f), int2(1, 2)))";
|
||||
return R"(texture.write(float4(3.0f, 4.0f, 5.0f, 6.0f), uint2(int2(1, 2))))";
|
||||
case ValidTextureOverload::kStoreWO2dArrayRgba32float:
|
||||
return R"(texture.write(float4(4.0f, 5.0f, 6.0f, 7.0f), int2(1, 2), 3))";
|
||||
return R"(texture.write(float4(4.0f, 5.0f, 6.0f, 7.0f), uint2(int2(1, 2)), 3))";
|
||||
case ValidTextureOverload::kStoreWO3dRgba32float:
|
||||
return R"(texture.write(float4(4.0f, 5.0f, 6.0f, 7.0f), int3(1, 2, 3)))";
|
||||
return R"(texture.write(float4(4.0f, 5.0f, 6.0f, 7.0f), uint3(int3(1, 2, 3))))";
|
||||
}
|
||||
return "<unmatched texture overload>";
|
||||
} // NOLINT - Ignore the length of this function
|
||||
|
||||
Reference in New Issue
Block a user