[spirv-reader][ir] Add operand mask helpers.
Add a couple helpers for operand mask and mask comparison.
Bug: 407384500
Change-Id: Ibffa335b90d083e30a8976e980619b53f778d4c5
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/241774
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/lang/spirv/reader/lower/texture.cc b/src/tint/lang/spirv/reader/lower/texture.cc
index 9f8c6c2..50eb2e2 100644
--- a/src/tint/lang/spirv/reader/lower/texture.cc
+++ b/src/tint/lang/spirv/reader/lower/texture.cc
@@ -184,6 +184,19 @@
new_args.Push(offset);
}
+ uint32_t GetOperandMask(core::ir::Value* val) {
+ auto* op = val->As<core::ir::Constant>();
+ TINT_ASSERT(op);
+ return op->Value()->ValueAs<uint32_t>();
+ }
+
+ bool HasBias(uint32_t mask) {
+ return (mask & static_cast<uint32_t>(ImageOperandsMask::kBias)) != 0;
+ }
+ bool HasConstOffset(uint32_t mask) {
+ return (mask & static_cast<uint32_t>(ImageOperandsMask::kConstOffset)) != 0;
+ }
+
void ImageGather(spirv::ir::BuiltinCall* call) {
const auto& args = call->Args();
@@ -195,6 +208,8 @@
auto* coords = args[1];
auto* component = args[2];
+ uint32_t operand_mask = GetOperandMask(args[3]);
+
Vector<core::ir::Value*, 5> new_args;
if (!tex->Type()->Is<core::type::DepthTexture>()) {
new_args.Push(component);
@@ -204,7 +219,7 @@
ProcessCoords(tex->Type(), coords, new_args);
- if (args.Length() > 4) {
+ if (HasConstOffset(operand_mask)) {
ProcessOffset(args[4], new_args);
}
@@ -223,10 +238,7 @@
std::tie(tex, sampler) = GetTextureSampler(sampled_image);
auto* coords = args[1];
- auto* operand_mask_value = args[2]->As<core::ir::Constant>();
- TINT_ASSERT(operand_mask_value);
-
- uint32_t operand_mask = operand_mask_value->Value()->ValueAs<uint32_t>();
+ uint32_t operand_mask = GetOperandMask(args[2]);
uint32_t idx = 3;
b.InsertBefore(call, [&] {
@@ -237,11 +249,11 @@
ProcessCoords(tex->Type(), coords, new_args);
core::BuiltinFn fn = core::BuiltinFn::kTextureSample;
- if ((operand_mask & static_cast<uint32_t>(ImageOperandsMask::kBias)) != 0) {
+ if (HasBias(operand_mask)) {
fn = core::BuiltinFn::kTextureSampleBias;
new_args.Push(args[idx++]);
}
- if ((operand_mask & static_cast<uint32_t>(ImageOperandsMask::kConstOffset)) != 0) {
+ if (HasConstOffset(operand_mask)) {
ProcessOffset(args[idx++], new_args);
}