st/nine: Fix setting of the shift modifier in nine_shader
authorAxel Davy <axel.davy@ens.fr>
Mon, 24 Nov 2014 23:38:10 +0000 (00:38 +0100)
committerEmil Velikov <emil.l.velikov@gmail.com>
Wed, 26 Nov 2014 20:09:12 +0000 (20:09 +0000)
It is an sint_4, but it was stored in a uint_8...
The code using it was acting as if it was signed.

Problem found thanks to Coverity

Cc: "10.4" <mesa-stable@lists.freedesktop.org>
Tested-by: David Heidelberg <david@ixit.cz>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Axel Davy <axel.davy@ens.fr>
src/gallium/state_trackers/nine/nine_shader.c

index 268612eea056c5bd39162f9037bbc418c83122cd..4f78f6e933ba03807ae658f228e66d8f40fc120e 100644 (file)
@@ -239,7 +239,7 @@ struct sm1_dst_param
     BYTE file;
     BYTE mask;
     BYTE mod;
-    BYTE shift; /* sint4 */
+    int8_t shift; /* sint4 */
     BYTE type;
 };
 
@@ -2527,6 +2527,7 @@ sm1_parse_get_param(struct shader_translator *tx, DWORD *reg, DWORD *rel)
 static void
 sm1_parse_dst_param(struct sm1_dst_param *dst, DWORD tok)
 {
+    uint8_t shift;
     dst->file =
         (tok & D3DSP_REGTYPE_MASK)  >> D3DSP_REGTYPE_SHIFT |
         (tok & D3DSP_REGTYPE_MASK2) >> D3DSP_REGTYPE_SHIFT2;
@@ -2535,7 +2536,8 @@ sm1_parse_dst_param(struct sm1_dst_param *dst, DWORD tok)
     dst->rel = NULL;
     dst->mask = (tok & NINED3DSP_WRITEMASK_MASK) >> NINED3DSP_WRITEMASK_SHIFT;
     dst->mod = (tok & D3DSP_DSTMOD_MASK) >> D3DSP_DSTMOD_SHIFT;
-    dst->shift = (tok & D3DSP_DSTSHIFT_MASK) >> D3DSP_DSTSHIFT_SHIFT;
+    shift = (tok & D3DSP_DSTSHIFT_MASK) >> D3DSP_DSTSHIFT_SHIFT;
+    dst->shift = (shift & 0x8) ? -(shift & 0x7) : shift & 0x7;
 }
 
 static void