Skip to content

Commit d6acbd7

Browse files
committed
nonuniform: add nonuniform declaration to all image operations, remove decoration during linking if undesired
1 parent 2a726f1 commit d6acbd7

File tree

8 files changed

+178
-52
lines changed

8 files changed

+178
-52
lines changed

crates/rustc_codegen_spirv/src/linker/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,11 @@ pub fn link(
472472
duplicates::remove_duplicate_debuginfo(&mut output);
473473
}
474474

475+
{
476+
let _timer = sess.timer("link_remove_non_uniform");
477+
simple_passes::remove_non_uniform_decorations(sess, &mut output)?;
478+
}
479+
475480
// NOTE(eddyb) SPIR-T pipeline is entirely limited to this block.
476481
{
477482
let (spv_words, module_or_err, lower_from_spv_timer) =

crates/rustc_codegen_spirv/src/linker/simple_passes.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use super::{Result, get_name, get_names};
22
use rspirv::dr::{Block, Function, Module};
3-
use rspirv::spirv::{ExecutionModel, Op, Word};
3+
use rspirv::spirv::{Decoration, ExecutionModel, Op, Word};
4+
use rustc_codegen_spirv_types::Capability;
45
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
56
use rustc_session::Session;
67
use std::iter::once;
@@ -264,3 +265,19 @@ pub fn check_fragment_insts(sess: &Session, module: &Module) -> Result<()> {
264265
}
265266
}
266267
}
268+
269+
/// Remove all [`Decoration::NonUniform`] if this module does *not* have [`Capability::ShaderNonUniform`].
270+
/// This allows image asm to always declare `NonUniform` and not worry about conditional compilation.
271+
pub fn remove_non_uniform_decorations(_sess: &Session, module: &mut Module) -> Result<()> {
272+
let has_shader_non_uniform_capability = module.capabilities.iter().any(|inst| {
273+
inst.class.opcode == Op::Capability
274+
&& inst.operands[0].unwrap_capability() == Capability::ShaderNonUniform
275+
});
276+
if !has_shader_non_uniform_capability {
277+
module.annotations.retain(|inst| {
278+
!(inst.class.opcode == Op::Decorate
279+
&& inst.operands[1].unwrap_decoration() == Decoration::NonUniform)
280+
});
281+
}
282+
Ok(())
283+
}

crates/spirv-std/src/image.rs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ impl<
149149
let mut result = SampledType::Vec4::default();
150150
unsafe {
151151
asm! {
152+
"OpDecorate %image NonUniform",
153+
"OpDecorate %result NonUniform",
152154
"%image = OpLoad _ {this}",
153155
"%coordinate = OpLoad _ {coordinate}",
154156
"%result = OpImageFetch typeof*{result} %image %coordinate",
@@ -200,6 +202,10 @@ impl<
200202
let mut result = SampledType::Vec4::default();
201203
unsafe {
202204
asm! {
205+
"OpDecorate %image NonUniform",
206+
"OpDecorate %sampler NonUniform",
207+
"OpDecorate %sampledImage NonUniform",
208+
"OpDecorate %result NonUniform",
203209
"%typeSampledImage = OpTypeSampledImage typeof*{this}",
204210
"%image = OpLoad _ {this}",
205211
"%sampler = OpLoad _ {sampler}",
@@ -230,6 +236,10 @@ impl<
230236
unsafe {
231237
let mut result = SampledType::Vec4::default();
232238
asm!(
239+
"OpDecorate %image NonUniform",
240+
"OpDecorate %sampler NonUniform",
241+
"OpDecorate %sampledImage NonUniform",
242+
"OpDecorate %result NonUniform",
233243
"%typeSampledImage = OpTypeSampledImage typeof*{1}",
234244
"%image = OpLoad typeof*{1} {1}",
235245
"%sampler = OpLoad typeof*{2} {2}",
@@ -262,6 +272,10 @@ impl<
262272
let mut result = SampledType::Vec4::default();
263273

264274
asm!(
275+
"OpDecorate %image NonUniform",
276+
"OpDecorate %sampler NonUniform",
277+
"OpDecorate %sampledImage NonUniform",
278+
"OpDecorate %result NonUniform",
265279
"%typeSampledImage = OpTypeSampledImage typeof*{1}",
266280
"%image = OpLoad typeof*{1} {1}",
267281
"%sampler = OpLoad typeof*{2} {2}",
@@ -295,6 +309,10 @@ impl<
295309
let mut result = SampledType::Vec4::default();
296310
unsafe {
297311
asm!(
312+
"OpDecorate %image NonUniform",
313+
"OpDecorate %sampler NonUniform",
314+
"OpDecorate %sampledImage NonUniform",
315+
"OpDecorate %result NonUniform",
298316
"%image = OpLoad _ {this}",
299317
"%sampler = OpLoad _ {sampler}",
300318
"%coordinate = OpLoad _ {coordinate}",
@@ -328,6 +346,10 @@ impl<
328346
let mut result = SampledType::Vec4::default();
329347
unsafe {
330348
asm!(
349+
"OpDecorate %image NonUniform",
350+
"OpDecorate %sampler NonUniform",
351+
"OpDecorate %sampledImage NonUniform",
352+
"OpDecorate %result NonUniform",
331353
"%image = OpLoad _ {this}",
332354
"%sampler = OpLoad _ {sampler}",
333355
"%coordinate = OpLoad _ {coordinate}",
@@ -362,6 +384,10 @@ impl<
362384
let mut result = Default::default();
363385
unsafe {
364386
asm!(
387+
"OpDecorate %image NonUniform",
388+
"OpDecorate %sampler NonUniform",
389+
"OpDecorate %sampledImage NonUniform",
390+
"OpDecorate %result NonUniform",
365391
"%image = OpLoad _ {this}",
366392
"%sampler = OpLoad _ {sampler}",
367393
"%coordinate = OpLoad _ {coordinate}",
@@ -395,6 +421,10 @@ impl<
395421
let mut result = Default::default();
396422
unsafe {
397423
asm!(
424+
"OpDecorate %image NonUniform",
425+
"OpDecorate %sampler NonUniform",
426+
"OpDecorate %sampledImage NonUniform",
427+
"OpDecorate %result NonUniform",
398428
"%image = OpLoad _ {this}",
399429
"%sampler = OpLoad _ {sampler}",
400430
"%coordinate = OpLoad _ {coordinate}",
@@ -432,6 +462,10 @@ impl<
432462
let mut result = Default::default();
433463
unsafe {
434464
asm!(
465+
"OpDecorate %image NonUniform",
466+
"OpDecorate %sampler NonUniform",
467+
"OpDecorate %sampledImage NonUniform",
468+
"OpDecorate %result NonUniform",
435469
"%image = OpLoad _ {this}",
436470
"%sampler = OpLoad _ {sampler}",
437471
"%coordinate = OpLoad _ {coordinate}",
@@ -487,6 +521,10 @@ impl<
487521
unsafe {
488522
let mut result = SampledType::Vec4::default();
489523
asm!(
524+
"OpDecorate %image NonUniform",
525+
"OpDecorate %sampler NonUniform",
526+
"OpDecorate %sampledImage NonUniform",
527+
"OpDecorate %result NonUniform",
490528
"%image = OpLoad _ {this}",
491529
"%sampler = OpLoad _ {sampler}",
492530
"%project_coordinate = OpLoad _ {project_coordinate}",
@@ -517,6 +555,10 @@ impl<
517555
let mut result = Default::default();
518556
unsafe {
519557
asm!(
558+
"OpDecorate %image NonUniform",
559+
"OpDecorate %sampler NonUniform",
560+
"OpDecorate %sampledImage NonUniform",
561+
"OpDecorate %result NonUniform",
520562
"%image = OpLoad _ {this}",
521563
"%sampler = OpLoad _ {sampler}",
522564
"%project_coordinate = OpLoad _ {project_coordinate}",
@@ -550,6 +592,10 @@ impl<
550592
let mut result = Default::default();
551593
unsafe {
552594
asm!(
595+
"OpDecorate %image NonUniform",
596+
"OpDecorate %sampler NonUniform",
597+
"OpDecorate %sampledImage NonUniform",
598+
"OpDecorate %result NonUniform",
553599
"%image = OpLoad _ {this}",
554600
"%sampler = OpLoad _ {sampler}",
555601
"%project_coordinate = OpLoad _ {project_coordinate}",
@@ -584,6 +630,10 @@ impl<
584630
let mut result = Default::default();
585631
unsafe {
586632
asm!(
633+
"OpDecorate %image NonUniform",
634+
"OpDecorate %sampler NonUniform",
635+
"OpDecorate %sampledImage NonUniform",
636+
"OpDecorate %result NonUniform",
587637
"%image = OpLoad _ {this}",
588638
"%sampler = OpLoad _ {sampler}",
589639
"%project_coordinate = OpLoad _ {project_coordinate}",
@@ -617,6 +667,10 @@ impl<
617667
let mut result = Default::default();
618668
unsafe {
619669
asm!(
670+
"OpDecorate %image NonUniform",
671+
"OpDecorate %sampler NonUniform",
672+
"OpDecorate %sampledImage NonUniform",
673+
"OpDecorate %result NonUniform",
620674
"%image = OpLoad _ {this}",
621675
"%sampler = OpLoad _ {sampler}",
622676
"%coordinate = OpLoad _ {coordinate}",
@@ -654,6 +708,10 @@ impl<
654708
let mut result = Default::default();
655709
unsafe {
656710
asm!(
711+
"OpDecorate %image NonUniform",
712+
"OpDecorate %sampler NonUniform",
713+
"OpDecorate %sampledImage NonUniform",
714+
"OpDecorate %result NonUniform",
657715
"%image = OpLoad _ {this}",
658716
"%sampler = OpLoad _ {sampler}",
659717
"%coordinate = OpLoad _ {coordinate}",
@@ -710,6 +768,8 @@ impl<
710768

711769
unsafe {
712770
asm! {
771+
"OpDecorate %image NonUniform",
772+
"OpDecorate %result NonUniform",
713773
"%image = OpLoad _ {this}",
714774
"%coordinate = OpLoad _ {coordinate}",
715775
"%result = OpImageRead typeof*{result} %image %coordinate",
@@ -735,6 +795,7 @@ impl<
735795
{
736796
unsafe {
737797
asm! {
798+
"OpDecorate %image NonUniform",
738799
"%image = OpLoad _ {this}",
739800
"%coordinate = OpLoad _ {coordinate}",
740801
"%texels = OpLoad _ {texels}",
@@ -781,6 +842,8 @@ impl<
781842

782843
unsafe {
783844
asm! {
845+
"OpDecorate %image NonUniform",
846+
"OpDecorate %result NonUniform",
784847
"%image = OpLoad _ {this}",
785848
"%coordinate = OpLoad _ {coordinate}",
786849
"%result = OpImageRead typeof*{result} %image %coordinate",
@@ -806,6 +869,7 @@ impl<
806869
{
807870
unsafe {
808871
asm! {
872+
"OpDecorate %image NonUniform",
809873
"%image = OpLoad _ {this}",
810874
"%coordinate = OpLoad _ {coordinate}",
811875
"%texels = OpLoad _ {texels}",
@@ -852,6 +916,8 @@ impl<
852916

853917
unsafe {
854918
asm! {
919+
"OpDecorate %image NonUniform",
920+
"OpDecorate %result NonUniform",
855921
"%image = OpLoad _ {this}",
856922
"%coordinate = OpLoad _ {coordinate}",
857923
"%result = OpImageRead typeof*{result} %image %coordinate",
@@ -887,6 +953,8 @@ impl<
887953
let mut result = Default::default();
888954
unsafe {
889955
asm! {
956+
"OpDecorate %image NonUniform",
957+
"OpDecorate %result NonUniform",
890958
"%image = OpLoad _ {this}",
891959
"%result = OpImageQueryLevels typeof*{result} %image",
892960
"OpStore {result} %result",
@@ -919,6 +987,10 @@ impl<
919987
let mut result = Default::default();
920988
unsafe {
921989
asm! {
990+
"OpDecorate %image NonUniform",
991+
"OpDecorate %sampler NonUniform",
992+
"OpDecorate %sampledImage NonUniform",
993+
"OpDecorate %result NonUniform",
922994
"%typeSampledImage = OpTypeSampledImage typeof*{this}",
923995
"%image = OpLoad _ {this}",
924996
"%sampler = OpLoad _ {sampler}",
@@ -945,6 +1017,8 @@ impl<
9451017
let mut result: Size = Default::default();
9461018
unsafe {
9471019
asm! {
1020+
"OpDecorate %image NonUniform",
1021+
"OpDecorate %result NonUniform",
9481022
"%image = OpLoad _ {this}",
9491023
"%result = OpImageQuerySize typeof*{result} %image",
9501024
"OpStore {result} %result",
@@ -989,6 +1063,8 @@ impl<
9891063
let mut result: Size = Default::default();
9901064
unsafe {
9911065
asm! {
1066+
"OpDecorate %image NonUniform",
1067+
"OpDecorate %result NonUniform",
9921068
"%image = OpLoad _ {this}",
9931069
"%result = OpImageQuerySizeLod typeof*{result} %image {lod}",
9941070
"OpStore {result} %result",
@@ -1027,6 +1103,8 @@ impl<
10271103
let mut result = Default::default();
10281104
unsafe {
10291105
asm! {
1106+
"OpDecorate %image NonUniform",
1107+
"OpDecorate %result NonUniform",
10301108
"%image = OpLoad _ {this}",
10311109
"%result = OpImageQuerySamples typeof*{result} %image",
10321110
"OpStore {result} %result",
@@ -1085,6 +1163,8 @@ impl<
10851163
let mut result = SampledType::Vec4::default();
10861164
unsafe {
10871165
asm!(
1166+
"OpDecorate %sampledImage NonUniform",
1167+
"OpDecorate %result NonUniform",
10881168
"%sampledImage = OpLoad typeof*{1} {1}",
10891169
"%coord = OpLoad typeof*{2} {2}",
10901170
"%result = OpImageSampleImplicitLod typeof*{0} %sampledImage %coord",
@@ -1110,6 +1190,8 @@ impl<
11101190
let mut result = SampledType::Vec4::default();
11111191
unsafe {
11121192
asm!(
1193+
"OpDecorate %sampledImage NonUniform",
1194+
"OpDecorate %result NonUniform",
11131195
"%sampledImage = OpLoad typeof*{1} {1}",
11141196
"%coord = OpLoad typeof*{2} {2}",
11151197
"%lod = OpLoad typeof*{3} {3}",
@@ -1244,6 +1326,8 @@ impl<
12441326
let mut result = SampledType::Vec4::default();
12451327
unsafe {
12461328
asm! {
1329+
"OpDecorate %image NonUniform",
1330+
"OpDecorate %result NonUniform",
12471331
"%image = OpLoad _ {this}",
12481332
"%coordinate = OpLoad _ {coordinate}",
12491333
"%result = OpImageFetch typeof*{result} %image %coordinate $PARAMS",
@@ -1274,6 +1358,10 @@ impl<
12741358
let mut result = SampledType::Vec4::default();
12751359
unsafe {
12761360
asm! {
1361+
"OpDecorate %image NonUniform",
1362+
"OpDecorate %sampler NonUniform",
1363+
"OpDecorate %sampledImage NonUniform",
1364+
"OpDecorate %result NonUniform",
12771365
"%typeSampledImage = OpTypeSampledImage typeof*{this}",
12781366
"%image = OpLoad _ {this}",
12791367
"%sampler = OpLoad _ {sampler}",
@@ -1305,6 +1393,10 @@ impl<
13051393
unsafe {
13061394
let mut result = SampledType::Vec4::default();
13071395
asm!(
1396+
"OpDecorate %image NonUniform",
1397+
"OpDecorate %sampler NonUniform",
1398+
"OpDecorate %sampledImage NonUniform",
1399+
"OpDecorate %result NonUniform",
13081400
"%typeSampledImage = OpTypeSampledImage typeof*{this}",
13091401
"%image = OpLoad _ {this}",
13101402
"%sampler = OpLoad _ {sampler}",
@@ -1337,6 +1429,10 @@ impl<
13371429
let mut result = Default::default();
13381430
unsafe {
13391431
asm!(
1432+
"OpDecorate %image NonUniform",
1433+
"OpDecorate %sampler NonUniform",
1434+
"OpDecorate %sampledImage NonUniform",
1435+
"OpDecorate %result NonUniform",
13401436
"%image = OpLoad _ {this}",
13411437
"%sampler = OpLoad _ {sampler}",
13421438
"%coordinate = OpLoad _ {coordinate}",
@@ -1369,6 +1465,10 @@ impl<
13691465
unsafe {
13701466
let mut result = SampledType::Vec4::default();
13711467
asm!(
1468+
"OpDecorate %image NonUniform",
1469+
"OpDecorate %sampler NonUniform",
1470+
"OpDecorate %sampledImage NonUniform",
1471+
"OpDecorate %result NonUniform",
13721472
"%image = OpLoad _ {this}",
13731473
"%sampler = OpLoad _ {sampler}",
13741474
"%project_coordinate = OpLoad _ {project_coordinate}",
@@ -1400,6 +1500,10 @@ impl<
14001500
let mut result = Default::default();
14011501
unsafe {
14021502
asm!(
1503+
"OpDecorate %image NonUniform",
1504+
"OpDecorate %sampler NonUniform",
1505+
"OpDecorate %sampledImage NonUniform",
1506+
"OpDecorate %result NonUniform",
14031507
"%image = OpLoad _ {this}",
14041508
"%sampler = OpLoad _ {sampler}",
14051509
"%project_coordinate = OpLoad _ {project_coordinate}",

0 commit comments

Comments
 (0)