Module: Mesa
Branch: staging/20.3
Commit: b2c70c3b116cc8874c71e4a1d903ff62e4484f16
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=b2c70c3b116cc8874c71e4a1d903ff62e4484f16

Author: Jason Ekstrand <[email protected]>
Date:   Mon Nov 23 10:07:17 2020 -0600

spirv: Call repair SSA for OpTerminateInvocation

Fixes: 886d2d1a9abcb "spirv: Handle SpvOpTerminateInvocation"

Reviewed-by: Caio Marcelo de Oliveira Filho <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7734>
(cherry picked from commit 66685679b7c047398d3f593db86a24eba38db3b9)

---

 .pick_status.json                |  2 +-
 src/compiler/spirv/vtn_cfg.c     |  6 ++++--
 src/compiler/spirv/vtn_private.h | 14 +++++++++++++-
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index fdcb77fda17..d7f2811c588 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -481,7 +481,7 @@
         "description": "spirv: Call repair SSA for OpTerminateInvocation",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": "886d2d1a9abcb0572a957c24ae44de4d6c055bc0"
     },
diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c
index 41622752f36..4d68f8f34da 100644
--- a/src/compiler/spirv/vtn_cfg.c
+++ b/src/compiler/spirv/vtn_cfg.c
@@ -687,11 +687,12 @@ vtn_process_block(struct vtn_builder *b,
       return NULL;
 
    case SpvOpKill:
-      b->has_kill = true;
+      b->has_early_terminate = true;
       block->branch_type = vtn_branch_type_discard;
       return NULL;
 
    case SpvOpTerminateInvocation:
+      b->has_early_terminate = true;
       block->branch_type = vtn_branch_type_terminate;
       return NULL;
 
@@ -1377,7 +1378,8 @@ vtn_function_emit(struct vtn_builder *b, struct 
vtn_function *func,
     * but instructions in the continue may use SSA defs in the loop body.
     * Therefore, we need to repair SSA to insert the needed phi nodes.
     */
-   if (b->func->impl->structured && (b->has_loop_continue || b->has_kill))
+   if (b->func->impl->structured &&
+       (b->has_loop_continue || b->has_early_terminate))
       nir_repair_ssa_impl(func->impl);
 
    func->emitted = true;
diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h
index 45187a092c7..c136db2d5bb 100644
--- a/src/compiler/spirv/vtn_private.h
+++ b/src/compiler/spirv/vtn_private.h
@@ -693,7 +693,19 @@ struct vtn_builder {
    unsigned func_param_idx;
 
    bool has_loop_continue;
-   bool has_kill;
+
+   /** True if this shader has any early termination instructions like OpKill
+    *
+    * In the SPIR-V, the following instructions are block terminators:
+    *
+    *  - OpKill
+    *  - OpTerminateInvocation
+    *
+    * However, in NIR, they're represented by regular intrinsics with no
+    * control-flow semantics.  This means that the SSA form from the SPIR-V
+    * may not 100% match NIR and we have to fix it up at the end.
+    */
+   bool has_early_terminate;
 
    /* false by default, set to true by the ContractionOff execution mode */
    bool exact;

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to