Skip to content

Commit cbe1905

Browse files
committed
shader_recompiler: Reduce CompositeConstruct to constants where possible.
1 parent 4d81b41 commit cbe1905

File tree

2 files changed

+31
-27
lines changed

2 files changed

+31
-27
lines changed

src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@
66

77
namespace Shader::Backend::SPIRV {
88

9-
Id EmitCompositeConstructU32x2(EmitContext& ctx, Id e1, Id e2) {
10-
return ctx.OpCompositeConstruct(ctx.U32[2], e1, e2);
9+
#define CompositeConstructImpl(...) \
10+
inst->AreAllArgsImmediates() ? ctx.ConstantComposite(__VA_ARGS__) \
11+
: ctx.OpCompositeConstruct(__VA_ARGS__)
12+
13+
Id EmitCompositeConstructU32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) {
14+
return CompositeConstructImpl(ctx.U32[2], e1, e2);
1115
}
1216

13-
Id EmitCompositeConstructU32x3(EmitContext& ctx, Id e1, Id e2, Id e3) {
14-
return ctx.OpCompositeConstruct(ctx.U32[3], e1, e2, e3);
17+
Id EmitCompositeConstructU32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3) {
18+
return CompositeConstructImpl(ctx.U32[3], e1, e2, e3);
1519
}
1620

17-
Id EmitCompositeConstructU32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4) {
18-
return ctx.OpCompositeConstruct(ctx.U32[4], e1, e2, e3, e4);
21+
Id EmitCompositeConstructU32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4) {
22+
return CompositeConstructImpl(ctx.U32[4], e1, e2, e3, e4);
1923
}
2024

2125
Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index) {
@@ -56,16 +60,16 @@ Id EmitCompositeShuffleU32x4(EmitContext& ctx, Id composite1, Id composite2, u32
5660
return ctx.OpVectorShuffle(ctx.U32[4], composite1, composite2, comp0, comp1, comp2, comp3);
5761
}
5862

59-
Id EmitCompositeConstructF16x2(EmitContext& ctx, Id e1, Id e2) {
60-
return ctx.OpCompositeConstruct(ctx.F16[2], e1, e2);
63+
Id EmitCompositeConstructF16x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) {
64+
return CompositeConstructImpl(ctx.F16[2], e1, e2);
6165
}
6266

63-
Id EmitCompositeConstructF16x3(EmitContext& ctx, Id e1, Id e2, Id e3) {
64-
return ctx.OpCompositeConstruct(ctx.F16[3], e1, e2, e3);
67+
Id EmitCompositeConstructF16x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3) {
68+
return CompositeConstructImpl(ctx.F16[3], e1, e2, e3);
6569
}
6670

67-
Id EmitCompositeConstructF16x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4) {
68-
return ctx.OpCompositeConstruct(ctx.F16[4], e1, e2, e3, e4);
71+
Id EmitCompositeConstructF16x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4) {
72+
return CompositeConstructImpl(ctx.F16[4], e1, e2, e3, e4);
6973
}
7074

7175
Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index) {
@@ -106,16 +110,16 @@ Id EmitCompositeShuffleF16x4(EmitContext& ctx, Id composite1, Id composite2, u32
106110
return ctx.OpVectorShuffle(ctx.F16[4], composite1, composite2, comp0, comp1, comp2, comp3);
107111
}
108112

109-
Id EmitCompositeConstructF32x2(EmitContext& ctx, Id e1, Id e2) {
110-
return ctx.OpCompositeConstruct(ctx.F32[2], e1, e2);
113+
Id EmitCompositeConstructF32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) {
114+
return CompositeConstructImpl(ctx.F32[2], e1, e2);
111115
}
112116

113-
Id EmitCompositeConstructF32x3(EmitContext& ctx, Id e1, Id e2, Id e3) {
114-
return ctx.OpCompositeConstruct(ctx.F32[3], e1, e2, e3);
117+
Id EmitCompositeConstructF32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3) {
118+
return CompositeConstructImpl(ctx.F32[3], e1, e2, e3);
115119
}
116120

117-
Id EmitCompositeConstructF32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4) {
118-
return ctx.OpCompositeConstruct(ctx.F32[4], e1, e2, e3, e4);
121+
Id EmitCompositeConstructF32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4) {
122+
return CompositeConstructImpl(ctx.F32[4], e1, e2, e3, e4);
119123
}
120124

121125
Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index) {

src/shader_recompiler/backend/spirv/emit_spirv_instructions.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ Id EmitSharedAtomicSMin32(EmitContext& ctx, Id offset, Id value);
118118
Id EmitSharedAtomicAnd32(EmitContext& ctx, Id offset, Id value);
119119
Id EmitSharedAtomicOr32(EmitContext& ctx, Id offset, Id value);
120120
Id EmitSharedAtomicXor32(EmitContext& ctx, Id offset, Id value);
121-
Id EmitCompositeConstructU32x2(EmitContext& ctx, Id e1, Id e2);
122-
Id EmitCompositeConstructU32x3(EmitContext& ctx, Id e1, Id e2, Id e3);
123-
Id EmitCompositeConstructU32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
121+
Id EmitCompositeConstructU32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2);
122+
Id EmitCompositeConstructU32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3);
123+
Id EmitCompositeConstructU32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4);
124124
Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index);
125125
Id EmitCompositeExtractU32x3(EmitContext& ctx, Id composite, u32 index);
126126
Id EmitCompositeExtractU32x4(EmitContext& ctx, Id composite, u32 index);
@@ -132,9 +132,9 @@ Id EmitCompositeShuffleU32x3(EmitContext& ctx, Id composite1, Id composite2, u32
132132
u32 comp2);
133133
Id EmitCompositeShuffleU32x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
134134
u32 comp2, u32 comp3);
135-
Id EmitCompositeConstructF16x2(EmitContext& ctx, Id e1, Id e2);
136-
Id EmitCompositeConstructF16x3(EmitContext& ctx, Id e1, Id e2, Id e3);
137-
Id EmitCompositeConstructF16x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
135+
Id EmitCompositeConstructF16x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2);
136+
Id EmitCompositeConstructF16x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3);
137+
Id EmitCompositeConstructF16x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4);
138138
Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index);
139139
Id EmitCompositeExtractF16x3(EmitContext& ctx, Id composite, u32 index);
140140
Id EmitCompositeExtractF16x4(EmitContext& ctx, Id composite, u32 index);
@@ -146,9 +146,9 @@ Id EmitCompositeShuffleF16x3(EmitContext& ctx, Id composite1, Id composite2, u32
146146
u32 comp2);
147147
Id EmitCompositeShuffleF16x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
148148
u32 comp2, u32 comp3);
149-
Id EmitCompositeConstructF32x2(EmitContext& ctx, Id e1, Id e2);
150-
Id EmitCompositeConstructF32x3(EmitContext& ctx, Id e1, Id e2, Id e3);
151-
Id EmitCompositeConstructF32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
149+
Id EmitCompositeConstructF32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2);
150+
Id EmitCompositeConstructF32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3);
151+
Id EmitCompositeConstructF32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4);
152152
Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index);
153153
Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index);
154154
Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index);

0 commit comments

Comments
 (0)