mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-03 11:46:09 +00:00
spirv-reader: support GLSL.std.450 instruction FindILsb
Fixed: tint:1057 Change-Id: Iacaefb9d634b60745f163061424090b041fccc68 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/104901 Reviewed-by: Dan Sinclair <dsinclair@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com> Auto-Submit: David Neto <dneto@google.com> Commit-Queue: David Neto <dneto@google.com>
This commit is contained in:
parent
2ad747dedd
commit
542d27d874
@ -327,6 +327,8 @@ std::string GetGlslStd450FuncName(uint32_t ext_opcode) {
|
|||||||
return "exp2";
|
return "exp2";
|
||||||
case GLSLstd450FaceForward:
|
case GLSLstd450FaceForward:
|
||||||
return "faceForward";
|
return "faceForward";
|
||||||
|
case GLSLstd450FindILsb:
|
||||||
|
return "firstTrailingBit";
|
||||||
case GLSLstd450Floor:
|
case GLSLstd450Floor:
|
||||||
return "floor";
|
return "floor";
|
||||||
case GLSLstd450Fma:
|
case GLSLstd450Fma:
|
||||||
@ -427,7 +429,6 @@ std::string GetGlslStd450FuncName(uint32_t ext_opcode) {
|
|||||||
case GLSLstd450PackDouble2x32:
|
case GLSLstd450PackDouble2x32:
|
||||||
case GLSLstd450UnpackDouble2x32:
|
case GLSLstd450UnpackDouble2x32:
|
||||||
|
|
||||||
case GLSLstd450FindILsb:
|
|
||||||
case GLSLstd450FindSMsb:
|
case GLSLstd450FindSMsb:
|
||||||
case GLSLstd450FindUMsb:
|
case GLSLstd450FindUMsb:
|
||||||
|
|
||||||
|
@ -179,6 +179,8 @@ using SpvParserTest_GlslStd450_Inting_IntingInting =
|
|||||||
SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>;
|
SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>;
|
||||||
using SpvParserTest_GlslStd450_Inting_IntingIntingInting =
|
using SpvParserTest_GlslStd450_Inting_IntingIntingInting =
|
||||||
SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>;
|
SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>;
|
||||||
|
using SpvParserTest_GlslStd450_Uinting_Uinting =
|
||||||
|
SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>;
|
||||||
using SpvParserTest_GlslStd450_Uinting_UintingUinting =
|
using SpvParserTest_GlslStd450_Uinting_UintingUinting =
|
||||||
SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>;
|
SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>;
|
||||||
using SpvParserTest_GlslStd450_Uinting_UintingUintingUinting =
|
using SpvParserTest_GlslStd450_Uinting_UintingUintingUinting =
|
||||||
@ -580,7 +582,8 @@ TEST_P(SpvParserTest_GlslStd450_Inting_IntingIntingInting, Vector) {
|
|||||||
|
|
||||||
INSTANTIATE_TEST_SUITE_P(Samples,
|
INSTANTIATE_TEST_SUITE_P(Samples,
|
||||||
SpvParserTest_GlslStd450_Inting_Inting,
|
SpvParserTest_GlslStd450_Inting_Inting,
|
||||||
::testing::Values(GlslStd450Case{"SAbs", "abs"}));
|
::testing::Values(GlslStd450Case{"SAbs", "abs"},
|
||||||
|
GlslStd450Case{"FindILsb", "firstTrailingBit"}));
|
||||||
|
|
||||||
INSTANTIATE_TEST_SUITE_P(Samples,
|
INSTANTIATE_TEST_SUITE_P(Samples,
|
||||||
SpvParserTest_GlslStd450_Inting_IntingInting,
|
SpvParserTest_GlslStd450_Inting_IntingInting,
|
||||||
@ -591,6 +594,41 @@ INSTANTIATE_TEST_SUITE_P(Samples,
|
|||||||
SpvParserTest_GlslStd450_Inting_IntingIntingInting,
|
SpvParserTest_GlslStd450_Inting_IntingIntingInting,
|
||||||
::testing::Values(GlslStd450Case{"SClamp", "clamp"}));
|
::testing::Values(GlslStd450Case{"SClamp", "clamp"}));
|
||||||
|
|
||||||
|
TEST_P(SpvParserTest_GlslStd450_Uinting_Uinting, Scalar) {
|
||||||
|
const auto assembly = Preamble() + R"(
|
||||||
|
%1 = OpExtInst %uint %glsl )" +
|
||||||
|
GetParam().opcode +
|
||||||
|
R"( %u1
|
||||||
|
OpReturn
|
||||||
|
OpFunctionEnd
|
||||||
|
)";
|
||||||
|
auto p = parser(test::Assemble(assembly));
|
||||||
|
ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
|
||||||
|
auto fe = p->function_emitter(100);
|
||||||
|
EXPECT_TRUE(fe.EmitBody()) << p->error();
|
||||||
|
auto ast_body = fe.ast_body();
|
||||||
|
const auto body = test::ToString(p->program(), ast_body);
|
||||||
|
EXPECT_THAT(body, HasSubstr("let x_1 : u32 = " + GetParam().wgsl_func + "(u1);")) << body;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(SpvParserTest_GlslStd450_Uinting_Uinting, Vector) {
|
||||||
|
const auto assembly = Preamble() + R"(
|
||||||
|
%1 = OpExtInst %v2uint %glsl )" +
|
||||||
|
GetParam().opcode +
|
||||||
|
R"( %v2u1
|
||||||
|
OpReturn
|
||||||
|
OpFunctionEnd
|
||||||
|
)";
|
||||||
|
auto p = parser(test::Assemble(assembly));
|
||||||
|
ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
|
||||||
|
auto fe = p->function_emitter(100);
|
||||||
|
EXPECT_TRUE(fe.EmitBody()) << p->error();
|
||||||
|
auto ast_body = fe.ast_body();
|
||||||
|
const auto body = test::ToString(p->program(), ast_body);
|
||||||
|
EXPECT_THAT(body, HasSubstr("let x_1 : vec2<u32> = " + GetParam().wgsl_func + "(v2u1);"))
|
||||||
|
<< body;
|
||||||
|
}
|
||||||
|
|
||||||
TEST_P(SpvParserTest_GlslStd450_Uinting_UintingUinting, Scalar) {
|
TEST_P(SpvParserTest_GlslStd450_Uinting_UintingUinting, Scalar) {
|
||||||
const auto assembly = Preamble() + R"(
|
const auto assembly = Preamble() + R"(
|
||||||
%1 = OpExtInst %uint %glsl )" +
|
%1 = OpExtInst %uint %glsl )" +
|
||||||
@ -661,6 +699,10 @@ TEST_P(SpvParserTest_GlslStd450_Uinting_UintingUintingUinting, Vector) {
|
|||||||
<< body;
|
<< body;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_SUITE_P(Samples,
|
||||||
|
SpvParserTest_GlslStd450_Uinting_Uinting,
|
||||||
|
::testing::Values(GlslStd450Case{"FindILsb", "firstTrailingBit"}));
|
||||||
|
|
||||||
INSTANTIATE_TEST_SUITE_P(Samples,
|
INSTANTIATE_TEST_SUITE_P(Samples,
|
||||||
SpvParserTest_GlslStd450_Uinting_UintingUinting,
|
SpvParserTest_GlslStd450_Uinting_UintingUinting,
|
||||||
::testing::Values(GlslStd450Case{"UMax", "max"},
|
::testing::Values(GlslStd450Case{"UMax", "max"},
|
||||||
@ -907,6 +949,34 @@ TEST_F(SpvParserTest, RectifyOperandsAndResult_UClamp) {
|
|||||||
<< body;
|
<< body;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(SpvParserTest, RectifyOperandsAndResult_FindILsb) {
|
||||||
|
// Check conversion of:
|
||||||
|
// signed results to unsigned result to match first arg.
|
||||||
|
// unsigned results to signed result to match first arg.
|
||||||
|
// This is the first extended instruction we've supported which goes both
|
||||||
|
// ways.
|
||||||
|
const auto assembly = Preamble() + R"(
|
||||||
|
%1 = OpExtInst %uint %glsl FindILsb %i1
|
||||||
|
%2 = OpExtInst %v2uint %glsl FindILsb %v2i1
|
||||||
|
%3 = OpExtInst %int %glsl FindILsb %u1
|
||||||
|
%4 = OpExtInst %v2int %glsl FindILsb %v2u1
|
||||||
|
OpReturn
|
||||||
|
OpFunctionEnd
|
||||||
|
)";
|
||||||
|
auto p = parser(test::Assemble(assembly));
|
||||||
|
ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
|
||||||
|
auto fe = p->function_emitter(100);
|
||||||
|
EXPECT_TRUE(fe.EmitBody()) << p->error();
|
||||||
|
auto ast_body = fe.ast_body();
|
||||||
|
const auto body = test::ToString(p->program(), ast_body);
|
||||||
|
EXPECT_THAT(body, HasSubstr(R"(
|
||||||
|
let x_1 : u32 = bitcast<u32>(firstTrailingBit(i1));
|
||||||
|
let x_2 : vec2<u32> = bitcast<vec2<u32>>(firstTrailingBit(v2i1));
|
||||||
|
let x_3 : i32 = bitcast<i32>(firstTrailingBit(u1));
|
||||||
|
let x_4 : vec2<i32> = bitcast<vec2<i32>>(firstTrailingBit(v2u1));)"))
|
||||||
|
<< body;
|
||||||
|
}
|
||||||
|
|
||||||
struct DataPackingCase {
|
struct DataPackingCase {
|
||||||
std::string opcode;
|
std::string opcode;
|
||||||
std::string wgsl_func;
|
std::string wgsl_func;
|
||||||
|
@ -221,6 +221,7 @@ bool AssumesResultSignednessMatchesFirstOperand(GLSLstd450 extended_opcode) {
|
|||||||
case GLSLstd450UMin:
|
case GLSLstd450UMin:
|
||||||
case GLSLstd450UMax:
|
case GLSLstd450UMax:
|
||||||
case GLSLstd450UClamp:
|
case GLSLstd450UClamp:
|
||||||
|
case GLSLstd450FindILsb:
|
||||||
// TODO(dneto): FindSMsb?
|
// TODO(dneto): FindSMsb?
|
||||||
// TODO(dneto): FindUMsb?
|
// TODO(dneto): FindUMsb?
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user