Skip to content

Commit

Permalink
[spirv-reader][ir] Add derivative operations.
Browse files Browse the repository at this point in the history
Add conversions of the SPIR-V derivative operations to their WGSL
equivalents.

Bug: 394879910, 394879124, 394879573, 394878868, 394879956, 394879469
Bug: 394879245, 394879834, 3948798250
Change-Id: I93c74c2ccc8b5d0803e1f88eb308cebdbdbd5c2a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/225954
Reviewed-by: James Price <[email protected]>
Commit-Queue: dan sinclair <[email protected]>
  • Loading branch information
dj2 authored and Dawn LUCI CQ committed Feb 11, 2025
1 parent f2ec705 commit c2d1a5d
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 0 deletions.
88 changes: 88 additions & 0 deletions src/tint/lang/spirv/reader/parser/builtin_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1322,5 +1322,93 @@ TEST_F(SpirvParserTest, Any) {
)");
}

struct BuiltinData {
const std::string spirv;
const std::string ir;
};
inline std::ostream& operator<<(std::ostream& out, BuiltinData data) {
out << data.spirv << "," << data.ir;
return out;
}

using SpirvParser_DerivativeTest = SpirvParserTestWithParam<BuiltinData>;

TEST_P(SpirvParser_DerivativeTest, Scalar) {
auto& builtin = GetParam();

EXPECT_IR(R"(
OpCapability DerivativeControl
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main"
OpExecutionMode %main OriginUpperLeft
%void = OpTypeVoid
%float = OpTypeFloat 32
%float_50 = OpConstant %float 50
%ep_type = OpTypeFunction %void
%main = OpFunction %void None %ep_type
%entry = OpLabel
%1 = )" + builtin.spirv +
R"( %float %float_50
OpReturn
OpFunctionEnd
)",
R"(
%main = @fragment func():void {
$B1: {
%2:f32 = )" + builtin.ir +
R"( 50.0f
ret
}
}
)");
}

TEST_P(SpirvParser_DerivativeTest, Vector) {
auto& builtin = GetParam();

EXPECT_IR(R"(
OpCapability DerivativeControl
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main"
OpExecutionMode %main OriginUpperLeft
%void = OpTypeVoid
%float = OpTypeFloat 32
%v2float = OpTypeVector %float 2
%float_50 = OpConstant %float 50
%float_60 = OpConstant %float 60
%v2float_50_60 = OpConstantComposite %v2float %float_50 %float_60
%ep_type = OpTypeFunction %void
%main = OpFunction %void None %ep_type
%entry = OpLabel
%1 = )" +
builtin.spirv + R"( %v2float %v2float_50_60
OpReturn
OpFunctionEnd
)",
R"(
%main = @fragment func():void {
$B1: {
%2:vec2<f32> = )" +
builtin.ir + R"( vec2<f32>(50.0f, 60.0f)
ret
}
}
)");
}

INSTANTIATE_TEST_SUITE_P(SpirvParserTest,
SpirvParser_DerivativeTest,
testing::Values(BuiltinData{"OpDPdx", "dpdx"},
BuiltinData{"OpDPdy", "dpdy"},
BuiltinData{"OpFwidth", "fwidth"},
BuiltinData{"OpDPdxFine", "dpdxFine"},
BuiltinData{"OpDPdyFine", "dpdyFine"},
BuiltinData{"OpFwidthFine", "fwidthFine"},
BuiltinData{"OpDPdxCoarse", "dpdxCoarse"},
BuiltinData{"OpDPdyCoarse", "dpdyCoarse"},
BuiltinData{"OpFwidthCoarse", "fwidthCoarse"}));

} // namespace
} // namespace tint::spirv::reader
27 changes: 27 additions & 0 deletions src/tint/lang/spirv/reader/parser/parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -643,6 +643,33 @@ class Parser {
case spv::Op::OpAny:
EmitBuiltinCall(inst, core::BuiltinFn::kAny);
break;
case spv::Op::OpDPdx:
EmitBuiltinCall(inst, core::BuiltinFn::kDpdx);
break;
case spv::Op::OpDPdy:
EmitBuiltinCall(inst, core::BuiltinFn::kDpdy);
break;
case spv::Op::OpFwidth:
EmitBuiltinCall(inst, core::BuiltinFn::kFwidth);
break;
case spv::Op::OpDPdxFine:
EmitBuiltinCall(inst, core::BuiltinFn::kDpdxFine);
break;
case spv::Op::OpDPdyFine:
EmitBuiltinCall(inst, core::BuiltinFn::kDpdyFine);
break;
case spv::Op::OpFwidthFine:
EmitBuiltinCall(inst, core::BuiltinFn::kFwidthFine);
break;
case spv::Op::OpDPdxCoarse:
EmitBuiltinCall(inst, core::BuiltinFn::kDpdxCoarse);
break;
case spv::Op::OpDPdyCoarse:
EmitBuiltinCall(inst, core::BuiltinFn::kDpdyCoarse);
break;
case spv::Op::OpFwidthCoarse:
EmitBuiltinCall(inst, core::BuiltinFn::kFwidthCoarse);
break;
default:
TINT_UNIMPLEMENTED()
<< "unhandled SPIR-V instruction: " << static_cast<uint32_t>(inst.opcode());
Expand Down

0 comments on commit c2d1a5d

Please sign in to comment.