writer/spirv: Do not add Flat to fragment outputs
Use the sanitizer to add the decoration only to the variables that are vertex outputs and fragment inputs. Bug: dawn:963, tint:746 Change-Id: I1b91cf3550fb3c6f583d69e822444534a576e0cd Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/56460 Reviewed-by: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: James Price <jrprice@google.com>
This commit is contained in:
parent
9432c97070
commit
d18f2e0d6e
|
@ -320,6 +320,14 @@ Symbol Spirv::HoistToInputVariables(
|
||||||
new_decorations.push_back(
|
new_decorations.push_back(
|
||||||
ctx.dst->ASTNodes().Create<ast::DisableValidationDecoration>(
|
ctx.dst->ASTNodes().Create<ast::DisableValidationDecoration>(
|
||||||
ctx.dst->ID(), ast::DisabledValidation::kIgnoreStorageClass));
|
ctx.dst->ID(), ast::DisabledValidation::kIgnoreStorageClass));
|
||||||
|
if (ty->is_integer_scalar_or_vector() &&
|
||||||
|
ast::HasDecoration<ast::LocationDecoration>(new_decorations) &&
|
||||||
|
func->pipeline_stage() == ast::PipelineStage::kFragment) {
|
||||||
|
// Vulkan requires that integer user-defined fragment inputs are
|
||||||
|
// always decorated with `Flat`.
|
||||||
|
new_decorations.push_back(ctx.dst->Interpolate(
|
||||||
|
ast::InterpolationType::kFlat, ast::InterpolationSampling::kNone));
|
||||||
|
}
|
||||||
auto global_var_symbol = ctx.dst->Sym();
|
auto global_var_symbol = ctx.dst->Sym();
|
||||||
auto* global_var =
|
auto* global_var =
|
||||||
ctx.dst->Var(global_var_symbol, ctx.Clone(declared_ty),
|
ctx.dst->Var(global_var_symbol, ctx.Clone(declared_ty),
|
||||||
|
@ -378,6 +386,14 @@ void Spirv::HoistToOutputVariables(CloneContext& ctx,
|
||||||
new_decorations.push_back(
|
new_decorations.push_back(
|
||||||
ctx.dst->ASTNodes().Create<ast::DisableValidationDecoration>(
|
ctx.dst->ASTNodes().Create<ast::DisableValidationDecoration>(
|
||||||
ctx.dst->ID(), ast::DisabledValidation::kIgnoreStorageClass));
|
ctx.dst->ID(), ast::DisabledValidation::kIgnoreStorageClass));
|
||||||
|
if (ty->is_integer_scalar_or_vector() &&
|
||||||
|
ast::HasDecoration<ast::LocationDecoration>(new_decorations) &&
|
||||||
|
func->pipeline_stage() == ast::PipelineStage::kVertex) {
|
||||||
|
// Vulkan requires that integer user-defined vertex outputs are
|
||||||
|
// always decorated with `Flat`.
|
||||||
|
new_decorations.push_back(ctx.dst->Interpolate(
|
||||||
|
ast::InterpolationType::kFlat, ast::InterpolationSampling::kNone));
|
||||||
|
}
|
||||||
auto global_var_symbol = ctx.dst->Sym();
|
auto global_var_symbol = ctx.dst->Sym();
|
||||||
auto* global_var =
|
auto* global_var =
|
||||||
ctx.dst->Var(global_var_symbol, ctx.Clone(declared_ty),
|
ctx.dst->Var(global_var_symbol, ctx.Clone(declared_ty),
|
||||||
|
|
|
@ -125,7 +125,7 @@ fn frag_main([[location(0)]] loc_in : u32) -> [[location(0)]] f32 {
|
||||||
)";
|
)";
|
||||||
|
|
||||||
auto* expect = R"(
|
auto* expect = R"(
|
||||||
[[location(0), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol : u32;
|
[[location(0), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol : u32;
|
||||||
|
|
||||||
[[location(0), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_2 : f32;
|
[[location(0), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_2 : f32;
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ fn frag_main([[location(0)]] loc_in : u32) -> [[location(0)]] myf32 {
|
||||||
auto* expect = R"(
|
auto* expect = R"(
|
||||||
type myf32 = f32;
|
type myf32 = f32;
|
||||||
|
|
||||||
[[location(0), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol : u32;
|
[[location(0), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol : u32;
|
||||||
|
|
||||||
[[location(0), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_2 : myf32;
|
[[location(0), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_2 : myf32;
|
||||||
|
|
||||||
|
@ -472,6 +472,135 @@ fn frag_main() {
|
||||||
EXPECT_EQ(expect, str(got));
|
EXPECT_EQ(expect, str(got));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(SpirvTest, HandleEntryPointIOTypes_InterpolateAttributes_Integers) {
|
||||||
|
// Test that we add a Flat attribute to integers that are vertex outputs and
|
||||||
|
// fragment inputs, but not vertex inputs or fragment outputs.
|
||||||
|
auto* src = R"(
|
||||||
|
struct VertexIn {
|
||||||
|
[[location(0)]] i : i32;
|
||||||
|
[[location(1)]] u : u32;
|
||||||
|
[[location(2)]] vi : vec4<i32>;
|
||||||
|
[[location(3)]] vu : vec4<u32>;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VertexOut {
|
||||||
|
[[location(0)]] i : i32;
|
||||||
|
[[location(1)]] u : u32;
|
||||||
|
[[location(2)]] vi : vec4<i32>;
|
||||||
|
[[location(3)]] vu : vec4<u32>;
|
||||||
|
[[builtin(position)]] pos : vec4<f32>;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FragmentInterface {
|
||||||
|
[[location(0)]] i : i32;
|
||||||
|
[[location(1)]] u : u32;
|
||||||
|
[[location(2)]] vi : vec4<i32>;
|
||||||
|
[[location(3)]] vu : vec4<u32>;
|
||||||
|
};
|
||||||
|
|
||||||
|
[[stage(vertex)]]
|
||||||
|
fn vert_main(in : VertexIn) -> VertexOut {
|
||||||
|
return VertexOut(in.i, in.u, in.vi, in.vu);
|
||||||
|
}
|
||||||
|
|
||||||
|
[[stage(fragment)]]
|
||||||
|
fn frag_main(inputs : FragmentInterface) -> FragmentInterface {
|
||||||
|
return inputs;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
auto* expect = R"(
|
||||||
|
struct VertexIn {
|
||||||
|
i : i32;
|
||||||
|
u : u32;
|
||||||
|
vi : vec4<i32>;
|
||||||
|
vu : vec4<u32>;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VertexOut {
|
||||||
|
i : i32;
|
||||||
|
u : u32;
|
||||||
|
vi : vec4<i32>;
|
||||||
|
vu : vec4<u32>;
|
||||||
|
pos : vec4<f32>;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FragmentInterface {
|
||||||
|
i : i32;
|
||||||
|
u : u32;
|
||||||
|
vi : vec4<i32>;
|
||||||
|
vu : vec4<u32>;
|
||||||
|
};
|
||||||
|
|
||||||
|
[[location(0), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol : i32;
|
||||||
|
|
||||||
|
[[location(1), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol_1 : u32;
|
||||||
|
|
||||||
|
[[location(2), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol_2 : vec4<i32>;
|
||||||
|
|
||||||
|
[[location(3), internal(disable_validation__ignore_storage_class)]] var<in> tint_symbol_3 : vec4<u32>;
|
||||||
|
|
||||||
|
[[location(0), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<out> tint_symbol_6 : i32;
|
||||||
|
|
||||||
|
[[location(1), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<out> tint_symbol_7 : u32;
|
||||||
|
|
||||||
|
[[location(2), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<out> tint_symbol_8 : vec4<i32>;
|
||||||
|
|
||||||
|
[[location(3), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<out> tint_symbol_9 : vec4<u32>;
|
||||||
|
|
||||||
|
[[builtin(position), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_10 : vec4<f32>;
|
||||||
|
|
||||||
|
fn tint_symbol_11(tint_symbol_5 : VertexOut) {
|
||||||
|
tint_symbol_6 = tint_symbol_5.i;
|
||||||
|
tint_symbol_7 = tint_symbol_5.u;
|
||||||
|
tint_symbol_8 = tint_symbol_5.vi;
|
||||||
|
tint_symbol_9 = tint_symbol_5.vu;
|
||||||
|
tint_symbol_10 = tint_symbol_5.pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[stage(vertex)]]
|
||||||
|
fn vert_main() {
|
||||||
|
let tint_symbol_4 : VertexIn = VertexIn(tint_symbol, tint_symbol_1, tint_symbol_2, tint_symbol_3);
|
||||||
|
tint_symbol_11(VertexOut(tint_symbol_4.i, tint_symbol_4.u, tint_symbol_4.vi, tint_symbol_4.vu));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[location(0), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol_12 : i32;
|
||||||
|
|
||||||
|
[[location(1), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol_13 : u32;
|
||||||
|
|
||||||
|
[[location(2), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol_14 : vec4<i32>;
|
||||||
|
|
||||||
|
[[location(3), internal(disable_validation__ignore_storage_class), interpolate(flat)]] var<in> tint_symbol_15 : vec4<u32>;
|
||||||
|
|
||||||
|
[[location(0), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_18 : i32;
|
||||||
|
|
||||||
|
[[location(1), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_19 : u32;
|
||||||
|
|
||||||
|
[[location(2), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_20 : vec4<i32>;
|
||||||
|
|
||||||
|
[[location(3), internal(disable_validation__ignore_storage_class)]] var<out> tint_symbol_21 : vec4<u32>;
|
||||||
|
|
||||||
|
fn tint_symbol_22(tint_symbol_17 : FragmentInterface) {
|
||||||
|
tint_symbol_18 = tint_symbol_17.i;
|
||||||
|
tint_symbol_19 = tint_symbol_17.u;
|
||||||
|
tint_symbol_20 = tint_symbol_17.vi;
|
||||||
|
tint_symbol_21 = tint_symbol_17.vu;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[stage(fragment)]]
|
||||||
|
fn frag_main() {
|
||||||
|
let tint_symbol_16 : FragmentInterface = FragmentInterface(tint_symbol_12, tint_symbol_13, tint_symbol_14, tint_symbol_15);
|
||||||
|
tint_symbol_22(tint_symbol_16);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
auto got = Run<Spirv>(src);
|
||||||
|
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(SpirvTest, HandleEntryPointIOTypes_StructLayoutDecorations) {
|
TEST_F(SpirvTest, HandleEntryPointIOTypes_StructLayoutDecorations) {
|
||||||
auto* src = R"(
|
auto* src = R"(
|
||||||
[[block]]
|
[[block]]
|
||||||
|
|
|
@ -848,11 +848,6 @@ bool Builder::GenerateGlobalVariable(ast::Variable* var) {
|
||||||
push_annot(spv::Op::OpDecorate,
|
push_annot(spv::Op::OpDecorate,
|
||||||
{Operand::Int(var_id), Operand::Int(SpvDecorationLocation),
|
{Operand::Int(var_id), Operand::Int(SpvDecorationLocation),
|
||||||
Operand::Int(location->value())});
|
Operand::Int(location->value())});
|
||||||
if (type->is_integer_scalar_or_vector()) {
|
|
||||||
// Vulkan requires that integers are always decorated with `Flat`.
|
|
||||||
AddInterpolationDecorations(var_id, ast::InterpolationType::kFlat,
|
|
||||||
ast::InterpolationSampling::kNone);
|
|
||||||
}
|
|
||||||
} else if (auto* interpolate = deco->As<ast::InterpolateDecoration>()) {
|
} else if (auto* interpolate = deco->As<ast::InterpolateDecoration>()) {
|
||||||
AddInterpolationDecorations(var_id, interpolate->type(),
|
AddInterpolationDecorations(var_id, interpolate->type(),
|
||||||
interpolate->sampling());
|
interpolate->sampling());
|
||||||
|
|
|
@ -30,9 +30,7 @@
|
||||||
OpName %tint_symbol_9 "tint_symbol_9"
|
OpName %tint_symbol_9 "tint_symbol_9"
|
||||||
OpName %main3 "main3"
|
OpName %main3 "main3"
|
||||||
OpDecorate %tint_symbol_1 Location 0
|
OpDecorate %tint_symbol_1 Location 0
|
||||||
OpDecorate %tint_symbol_1 Flat
|
|
||||||
OpDecorate %tint_symbol_4 Location 1
|
OpDecorate %tint_symbol_4 Location 1
|
||||||
OpDecorate %tint_symbol_4 Flat
|
|
||||||
OpDecorate %tint_symbol_7 Location 2
|
OpDecorate %tint_symbol_7 Location 2
|
||||||
OpDecorate %tint_symbol_10 Location 3
|
OpDecorate %tint_symbol_10 Location 3
|
||||||
%int = OpTypeInt 32 1
|
%int = OpTypeInt 32 1
|
||||||
|
|
|
@ -20,9 +20,7 @@
|
||||||
OpName %tint_symbol "tint_symbol"
|
OpName %tint_symbol "tint_symbol"
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %tint_symbol_1 Location 0
|
OpDecorate %tint_symbol_1 Location 0
|
||||||
OpDecorate %tint_symbol_1 Flat
|
|
||||||
OpDecorate %tint_symbol_2 Location 1
|
OpDecorate %tint_symbol_2 Location 1
|
||||||
OpDecorate %tint_symbol_2 Flat
|
|
||||||
OpDecorate %tint_symbol_3 Location 2
|
OpDecorate %tint_symbol_3 Location 2
|
||||||
OpDecorate %tint_symbol_4 Location 3
|
OpDecorate %tint_symbol_4 Location 3
|
||||||
OpMemberDecorate %FragmentOutputs 0 Offset 0
|
OpMemberDecorate %FragmentOutputs 0 Offset 0
|
||||||
|
|
|
@ -25,10 +25,8 @@
|
||||||
OpName %tint_symbol "tint_symbol"
|
OpName %tint_symbol "tint_symbol"
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %tint_symbol_1 Location 0
|
OpDecorate %tint_symbol_1 Location 0
|
||||||
OpDecorate %tint_symbol_1 Flat
|
|
||||||
OpDecorate %tint_symbol_2 BuiltIn FragDepth
|
OpDecorate %tint_symbol_2 BuiltIn FragDepth
|
||||||
OpDecorate %tint_symbol_3 Location 1
|
OpDecorate %tint_symbol_3 Location 1
|
||||||
OpDecorate %tint_symbol_3 Flat
|
|
||||||
OpDecorate %tint_symbol_4 Location 2
|
OpDecorate %tint_symbol_4 Location 2
|
||||||
OpDecorate %_arr_uint_uint_1 ArrayStride 4
|
OpDecorate %_arr_uint_uint_1 ArrayStride 4
|
||||||
OpDecorate %tint_symbol_5 BuiltIn SampleMask
|
OpDecorate %tint_symbol_5 BuiltIn SampleMask
|
||||||
|
|
|
@ -12,5 +12,6 @@ fn vert_main() -> Interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
[[stage(fragment)]]
|
[[stage(fragment)]]
|
||||||
fn frag_main(inputs : Interface) {
|
fn frag_main(inputs : Interface) -> [[location(0)]] i32 {
|
||||||
|
return inputs.i;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,8 @@ struct tint_symbol {
|
||||||
|
|
||||||
tint_symbol vert_main() {
|
tint_symbol vert_main() {
|
||||||
const Interface tint_symbol_1 = {0, 0u, int4(0, 0, 0, 0), uint4(0u, 0u, 0u, 0u), float4(0.0f, 0.0f, 0.0f, 0.0f)};
|
const Interface tint_symbol_1 = {0, 0u, int4(0, 0, 0, 0), uint4(0u, 0u, 0u, 0u), float4(0.0f, 0.0f, 0.0f, 0.0f)};
|
||||||
const tint_symbol tint_symbol_4 = {tint_symbol_1.i, tint_symbol_1.u, tint_symbol_1.vi, tint_symbol_1.vu, tint_symbol_1.pos};
|
const tint_symbol tint_symbol_5 = {tint_symbol_1.i, tint_symbol_1.u, tint_symbol_1.vi, tint_symbol_1.vu, tint_symbol_1.pos};
|
||||||
return tint_symbol_4;
|
return tint_symbol_5;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tint_symbol_3 {
|
struct tint_symbol_3 {
|
||||||
|
@ -26,8 +26,12 @@ struct tint_symbol_3 {
|
||||||
uint4 vu : TEXCOORD3;
|
uint4 vu : TEXCOORD3;
|
||||||
float4 pos : SV_Position;
|
float4 pos : SV_Position;
|
||||||
};
|
};
|
||||||
|
struct tint_symbol_4 {
|
||||||
|
int value : SV_Target0;
|
||||||
|
};
|
||||||
|
|
||||||
void frag_main(tint_symbol_3 tint_symbol_2) {
|
tint_symbol_4 frag_main(tint_symbol_3 tint_symbol_2) {
|
||||||
const Interface inputs = {tint_symbol_2.i, tint_symbol_2.u, tint_symbol_2.vi, tint_symbol_2.vu, tint_symbol_2.pos};
|
const Interface inputs = {tint_symbol_2.i, tint_symbol_2.u, tint_symbol_2.vi, tint_symbol_2.vu, tint_symbol_2.pos};
|
||||||
return;
|
const tint_symbol_4 tint_symbol_6 = {inputs.i};
|
||||||
|
return tint_symbol_6;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,15 +21,19 @@ struct tint_symbol_4 {
|
||||||
int4 vi [[user(locn2)]];
|
int4 vi [[user(locn2)]];
|
||||||
uint4 vu [[user(locn3)]];
|
uint4 vu [[user(locn3)]];
|
||||||
};
|
};
|
||||||
|
struct tint_symbol_5 {
|
||||||
|
int value [[color(0)]];
|
||||||
|
};
|
||||||
|
|
||||||
vertex tint_symbol vert_main() {
|
vertex tint_symbol vert_main() {
|
||||||
Interface const tint_symbol_1 = {};
|
Interface const tint_symbol_1 = {};
|
||||||
tint_symbol const tint_symbol_5 = {.i=tint_symbol_1.i, .u=tint_symbol_1.u, .vi=tint_symbol_1.vi, .vu=tint_symbol_1.vu, .pos=tint_symbol_1.pos};
|
tint_symbol const tint_symbol_6 = {.i=tint_symbol_1.i, .u=tint_symbol_1.u, .vi=tint_symbol_1.vi, .vu=tint_symbol_1.vu, .pos=tint_symbol_1.pos};
|
||||||
return tint_symbol_5;
|
return tint_symbol_6;
|
||||||
}
|
}
|
||||||
|
|
||||||
fragment void frag_main(float4 tint_symbol_3 [[position]], tint_symbol_4 tint_symbol_2 [[stage_in]]) {
|
fragment tint_symbol_5 frag_main(float4 tint_symbol_3 [[position]], tint_symbol_4 tint_symbol_2 [[stage_in]]) {
|
||||||
Interface const inputs = {.i=tint_symbol_2.i, .u=tint_symbol_2.u, .vi=tint_symbol_2.vi, .vu=tint_symbol_2.vu, .pos=tint_symbol_3};
|
Interface const inputs = {.i=tint_symbol_2.i, .u=tint_symbol_2.u, .vi=tint_symbol_2.vi, .vu=tint_symbol_2.vu, .pos=tint_symbol_3};
|
||||||
return;
|
tint_symbol_5 const tint_symbol_7 = {.value=inputs.i};
|
||||||
|
return tint_symbol_7;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 54
|
; Bound: 67
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint Vertex %vert_main "vert_main" %tint_pointsize %tint_symbol_1 %tint_symbol_2 %tint_symbol_3 %tint_symbol_4 %tint_symbol_5
|
OpEntryPoint Vertex %vert_main "vert_main" %tint_pointsize %tint_symbol_1 %tint_symbol_2 %tint_symbol_3 %tint_symbol_4 %tint_symbol_5
|
||||||
OpEntryPoint Fragment %frag_main "frag_main"
|
OpEntryPoint Fragment %frag_main "frag_main" %tint_symbol_7 %tint_symbol_8 %tint_symbol_9 %tint_symbol_10 %tint_symbol_11 %tint_symbol_14
|
||||||
OpExecutionMode %frag_main OriginUpperLeft
|
OpExecutionMode %frag_main OriginUpperLeft
|
||||||
OpName %tint_pointsize "tint_pointsize"
|
OpName %tint_pointsize "tint_pointsize"
|
||||||
OpName %tint_symbol_1 "tint_symbol_1"
|
OpName %tint_symbol_1 "tint_symbol_1"
|
||||||
|
@ -19,6 +19,7 @@
|
||||||
OpName %tint_symbol_9 "tint_symbol_9"
|
OpName %tint_symbol_9 "tint_symbol_9"
|
||||||
OpName %tint_symbol_10 "tint_symbol_10"
|
OpName %tint_symbol_10 "tint_symbol_10"
|
||||||
OpName %tint_symbol_11 "tint_symbol_11"
|
OpName %tint_symbol_11 "tint_symbol_11"
|
||||||
|
OpName %tint_symbol_14 "tint_symbol_14"
|
||||||
OpName %Interface "Interface"
|
OpName %Interface "Interface"
|
||||||
OpMemberName %Interface 0 "i"
|
OpMemberName %Interface 0 "i"
|
||||||
OpMemberName %Interface 1 "u"
|
OpMemberName %Interface 1 "u"
|
||||||
|
@ -28,6 +29,8 @@
|
||||||
OpName %tint_symbol_6 "tint_symbol_6"
|
OpName %tint_symbol_6 "tint_symbol_6"
|
||||||
OpName %tint_symbol "tint_symbol"
|
OpName %tint_symbol "tint_symbol"
|
||||||
OpName %vert_main "vert_main"
|
OpName %vert_main "vert_main"
|
||||||
|
OpName %tint_symbol_15 "tint_symbol_15"
|
||||||
|
OpName %tint_symbol_13 "tint_symbol_13"
|
||||||
OpName %frag_main "frag_main"
|
OpName %frag_main "frag_main"
|
||||||
OpDecorate %tint_pointsize BuiltIn PointSize
|
OpDecorate %tint_pointsize BuiltIn PointSize
|
||||||
OpDecorate %tint_symbol_1 Location 0
|
OpDecorate %tint_symbol_1 Location 0
|
||||||
|
@ -48,6 +51,7 @@
|
||||||
OpDecorate %tint_symbol_10 Location 3
|
OpDecorate %tint_symbol_10 Location 3
|
||||||
OpDecorate %tint_symbol_10 Flat
|
OpDecorate %tint_symbol_10 Flat
|
||||||
OpDecorate %tint_symbol_11 BuiltIn FragCoord
|
OpDecorate %tint_symbol_11 BuiltIn FragCoord
|
||||||
|
OpDecorate %tint_symbol_14 Location 0
|
||||||
OpMemberDecorate %Interface 0 Offset 0
|
OpMemberDecorate %Interface 0 Offset 0
|
||||||
OpMemberDecorate %Interface 1 Offset 4
|
OpMemberDecorate %Interface 1 Offset 4
|
||||||
OpMemberDecorate %Interface 2 Offset 16
|
OpMemberDecorate %Interface 2 Offset 16
|
||||||
|
@ -87,34 +91,50 @@
|
||||||
%tint_symbol_10 = OpVariable %_ptr_Input_v4uint Input
|
%tint_symbol_10 = OpVariable %_ptr_Input_v4uint Input
|
||||||
%_ptr_Input_v4float = OpTypePointer Input %v4float
|
%_ptr_Input_v4float = OpTypePointer Input %v4float
|
||||||
%tint_symbol_11 = OpVariable %_ptr_Input_v4float Input
|
%tint_symbol_11 = OpVariable %_ptr_Input_v4float Input
|
||||||
|
%tint_symbol_14 = OpVariable %_ptr_Output_int Output %8
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%Interface = OpTypeStruct %int %uint %v4int %v4uint %v4float
|
%Interface = OpTypeStruct %int %uint %v4int %v4uint %v4float
|
||||||
%35 = OpTypeFunction %void %Interface
|
%36 = OpTypeFunction %void %Interface
|
||||||
%46 = OpTypeFunction %void
|
%47 = OpTypeFunction %void
|
||||||
%float_1 = OpConstant %float 1
|
%float_1 = OpConstant %float 1
|
||||||
%51 = OpConstantNull %Interface
|
%52 = OpConstantNull %Interface
|
||||||
%tint_symbol_6 = OpFunction %void None %35
|
%53 = OpTypeFunction %void %int
|
||||||
|
%tint_symbol_6 = OpFunction %void None %36
|
||||||
%tint_symbol = OpFunctionParameter %Interface
|
%tint_symbol = OpFunctionParameter %Interface
|
||||||
%40 = OpLabel
|
%41 = OpLabel
|
||||||
%41 = OpCompositeExtract %int %tint_symbol 0
|
%42 = OpCompositeExtract %int %tint_symbol 0
|
||||||
OpStore %tint_symbol_1 %41
|
OpStore %tint_symbol_1 %42
|
||||||
%42 = OpCompositeExtract %uint %tint_symbol 1
|
%43 = OpCompositeExtract %uint %tint_symbol 1
|
||||||
OpStore %tint_symbol_2 %42
|
OpStore %tint_symbol_2 %43
|
||||||
%43 = OpCompositeExtract %v4int %tint_symbol 2
|
%44 = OpCompositeExtract %v4int %tint_symbol 2
|
||||||
OpStore %tint_symbol_3 %43
|
OpStore %tint_symbol_3 %44
|
||||||
%44 = OpCompositeExtract %v4uint %tint_symbol 3
|
%45 = OpCompositeExtract %v4uint %tint_symbol 3
|
||||||
OpStore %tint_symbol_4 %44
|
OpStore %tint_symbol_4 %45
|
||||||
%45 = OpCompositeExtract %v4float %tint_symbol 4
|
%46 = OpCompositeExtract %v4float %tint_symbol 4
|
||||||
OpStore %tint_symbol_5 %45
|
OpStore %tint_symbol_5 %46
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
%vert_main = OpFunction %void None %46
|
%vert_main = OpFunction %void None %47
|
||||||
%48 = OpLabel
|
%49 = OpLabel
|
||||||
OpStore %tint_pointsize %float_1
|
OpStore %tint_pointsize %float_1
|
||||||
%50 = OpFunctionCall %void %tint_symbol_6 %51
|
%51 = OpFunctionCall %void %tint_symbol_6 %52
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
%frag_main = OpFunction %void None %46
|
%tint_symbol_15 = OpFunction %void None %53
|
||||||
%53 = OpLabel
|
%tint_symbol_13 = OpFunctionParameter %int
|
||||||
|
%56 = OpLabel
|
||||||
|
OpStore %tint_symbol_14 %tint_symbol_13
|
||||||
|
OpReturn
|
||||||
|
OpFunctionEnd
|
||||||
|
%frag_main = OpFunction %void None %47
|
||||||
|
%58 = OpLabel
|
||||||
|
%59 = OpLoad %int %tint_symbol_7
|
||||||
|
%60 = OpLoad %uint %tint_symbol_8
|
||||||
|
%61 = OpLoad %v4int %tint_symbol_9
|
||||||
|
%62 = OpLoad %v4uint %tint_symbol_10
|
||||||
|
%63 = OpLoad %v4float %tint_symbol_11
|
||||||
|
%64 = OpCompositeConstruct %Interface %59 %60 %61 %62 %63
|
||||||
|
%66 = OpCompositeExtract %int %64 0
|
||||||
|
%65 = OpFunctionCall %void %tint_symbol_15 %66
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
|
|
@ -17,5 +17,6 @@ fn vert_main() -> Interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
[[stage(fragment)]]
|
[[stage(fragment)]]
|
||||||
fn frag_main(inputs : Interface) {
|
fn frag_main(inputs : Interface) -> [[location(0)]] i32 {
|
||||||
|
return inputs.i;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,7 @@
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %tint_pointsize BuiltIn PointSize
|
OpDecorate %tint_pointsize BuiltIn PointSize
|
||||||
OpDecorate %tint_symbol Location 0
|
OpDecorate %tint_symbol Location 0
|
||||||
OpDecorate %tint_symbol Flat
|
|
||||||
OpDecorate %tint_symbol_1 Location 1
|
OpDecorate %tint_symbol_1 Location 1
|
||||||
OpDecorate %tint_symbol_1 Flat
|
|
||||||
OpDecorate %tint_symbol_2 Location 2
|
OpDecorate %tint_symbol_2 Location 2
|
||||||
OpDecorate %tint_symbol_3 Location 3
|
OpDecorate %tint_symbol_3 Location 3
|
||||||
OpDecorate %tint_symbol_5 BuiltIn Position
|
OpDecorate %tint_symbol_5 BuiltIn Position
|
||||||
|
|
|
@ -22,9 +22,7 @@
|
||||||
OpMemberName %VertexInputs 3 "loc3"
|
OpMemberName %VertexInputs 3 "loc3"
|
||||||
OpDecorate %tint_pointsize BuiltIn PointSize
|
OpDecorate %tint_pointsize BuiltIn PointSize
|
||||||
OpDecorate %tint_symbol Location 0
|
OpDecorate %tint_symbol Location 0
|
||||||
OpDecorate %tint_symbol Flat
|
|
||||||
OpDecorate %tint_symbol_1 Location 1
|
OpDecorate %tint_symbol_1 Location 1
|
||||||
OpDecorate %tint_symbol_1 Flat
|
|
||||||
OpDecorate %tint_symbol_2 Location 2
|
OpDecorate %tint_symbol_2 Location 2
|
||||||
OpDecorate %tint_symbol_3 Location 3
|
OpDecorate %tint_symbol_3 Location 3
|
||||||
OpDecorate %tint_symbol_6 BuiltIn Position
|
OpDecorate %tint_symbol_6 BuiltIn Position
|
||||||
|
|
|
@ -26,9 +26,7 @@
|
||||||
OpDecorate %tint_pointsize BuiltIn PointSize
|
OpDecorate %tint_pointsize BuiltIn PointSize
|
||||||
OpDecorate %tint_symbol BuiltIn VertexIndex
|
OpDecorate %tint_symbol BuiltIn VertexIndex
|
||||||
OpDecorate %tint_symbol_1 Location 0
|
OpDecorate %tint_symbol_1 Location 0
|
||||||
OpDecorate %tint_symbol_1 Flat
|
|
||||||
OpDecorate %tint_symbol_3 Location 1
|
OpDecorate %tint_symbol_3 Location 1
|
||||||
OpDecorate %tint_symbol_3 Flat
|
|
||||||
OpDecorate %tint_symbol_4 BuiltIn InstanceIndex
|
OpDecorate %tint_symbol_4 BuiltIn InstanceIndex
|
||||||
OpDecorate %tint_symbol_5 Location 2
|
OpDecorate %tint_symbol_5 Location 2
|
||||||
OpDecorate %tint_symbol_6 Location 3
|
OpDecorate %tint_symbol_6 Location 3
|
||||||
|
|
Loading…
Reference in New Issue