st/nine: Ignore D3DSIO_RET if it is the last instruction in a shader
authorDanylo Piliaiev <danylo.piliaiev@globallogic.com>
Tue, 24 Sep 2019 11:12:39 +0000 (14:12 +0300)
committerDanylo Piliaiev <danylo.piliaiev@gmail.com>
Wed, 25 Sep 2019 18:24:01 +0000 (18:24 +0000)
RET as a last instruction could be safely ignored.
Remove it to prevent crashes/warnings in case underlying driver
doesn't implement arbitrary returns.

A better way would be to remove the RET after the whole shader
is parsed which will handle a possible case when the last RET is
followed by a comment.

CC: <mesa-stable@lists.freedesktop.org>
Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com>
Reviewed-by: Axel Davy <davyaxel0@gmail.com>
src/gallium/state_trackers/nine/nine_shader.c

index 93910f90741f821bab1e5441ea22dbcb794a6f7f..1117b55faa17c44456cee63a78babddfff22ad37 100644 (file)
@@ -1803,7 +1803,13 @@ DECL_SPECIAL(LOOP)
 
 DECL_SPECIAL(RET)
 {
-    ureg_RET(tx->ureg);
+    /* RET as a last instruction could be safely ignored.
+     * Remove it to prevent crashes/warnings in case underlying
+     * driver doesn't implement arbitrary returns.
+     */
+    if (*(tx->parse_next) != NINED3DSP_END) {
+        ureg_RET(tx->ureg);
+    }
     return D3D_OK;
 }