mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-03 03:35:59 +00:00
[spirv-writer] Generate loads for call parameters.
This CL updates the call code to emit an OpLoad if the parameter being passed is a pointer. Bug: tint:5 Change-Id: I19c2ffa1b55697173ded6d5509fecd37442e7966 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/20501 Reviewed-by: David Neto <dneto@google.com>
This commit is contained in:
parent
228392558f
commit
40aa8d64aa
@ -904,7 +904,7 @@ uint32_t Builder::GenerateCallExpression(ast::CallExpression* expr) {
|
|||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ops.push_back(Operand::Int(id));
|
ops.push_back(Operand::Int(GenerateLoadIfNeeded(param->result_type(), id)));
|
||||||
}
|
}
|
||||||
|
|
||||||
push_function_inst(spv::Op::OpExtInst, std::move(ops));
|
push_function_inst(spv::Op::OpExtInst, std::move(ops));
|
||||||
|
@ -75,6 +75,55 @@ OpFunctionEnd
|
|||||||
)");
|
)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(BuilderTest, Call_GLSLMethod_WithLoad) {
|
||||||
|
ast::type::F32Type f32;
|
||||||
|
ast::type::VoidType void_type;
|
||||||
|
|
||||||
|
auto var = std::make_unique<ast::Variable>("ident",
|
||||||
|
ast::StorageClass::kPrivate, &f32);
|
||||||
|
|
||||||
|
ast::ExpressionList params;
|
||||||
|
params.push_back(std::make_unique<ast::IdentifierExpression>("ident"));
|
||||||
|
|
||||||
|
ast::CallExpression expr(std::make_unique<ast::IdentifierExpression>(
|
||||||
|
std::vector<std::string>{"std", "round"}),
|
||||||
|
std::move(params));
|
||||||
|
|
||||||
|
Context ctx;
|
||||||
|
ast::Module mod;
|
||||||
|
TypeDeterminer td(&ctx, &mod);
|
||||||
|
td.RegisterVariableForTesting(var.get());
|
||||||
|
|
||||||
|
auto imp = std::make_unique<ast::Import>("GLSL.std.450", "std");
|
||||||
|
auto* glsl = imp.get();
|
||||||
|
mod.AddImport(std::move(imp));
|
||||||
|
|
||||||
|
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
|
||||||
|
|
||||||
|
ast::Function func("a_func", {}, &void_type);
|
||||||
|
|
||||||
|
Builder b(&mod);
|
||||||
|
b.GenerateImport(glsl);
|
||||||
|
ASSERT_TRUE(b.GenerateGlobalVariable(var.get())) << b.error();
|
||||||
|
ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
|
||||||
|
|
||||||
|
EXPECT_EQ(b.GenerateCallExpression(&expr), 9u) << b.error();
|
||||||
|
EXPECT_EQ(DumpBuilder(b), R"(%1 = OpExtInstImport "GLSL.std.450"
|
||||||
|
OpName %2 "ident"
|
||||||
|
OpName %7 "a_func"
|
||||||
|
%4 = OpTypeFloat 32
|
||||||
|
%3 = OpTypePointer Private %4
|
||||||
|
%2 = OpVariable %3 Private
|
||||||
|
%6 = OpTypeVoid
|
||||||
|
%5 = OpTypeFunction %6
|
||||||
|
%7 = OpFunction %6 None %5
|
||||||
|
%8 = OpLabel
|
||||||
|
%10 = OpLoad %4 %2
|
||||||
|
%9 = OpExtInst %4 %1 Round %10
|
||||||
|
OpFunctionEnd
|
||||||
|
)");
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace spirv
|
} // namespace spirv
|
||||||
} // namespace writer
|
} // namespace writer
|
||||||
|
Loading…
x
Reference in New Issue
Block a user