nir/spirv/glsl450: Implement Cross built-in.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 29 Dec 2015 07:39:14 +0000 (23:39 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 29 Dec 2015 23:27:03 +0000 (15:27 -0800)
src/glsl/nir/spirv/vtn_glsl450.c

index 2d5faa7d574dc549f7fc50a399830ac94e4caaad..cec7592a5e8475855d7ff0ea25bb2c7c6b114ace 100644 (file)
@@ -165,6 +165,17 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint,
       val->ssa->def = nir_imin(nb, nir_imax(nb, src[0], src[1]), src[2]);
       return;
 
+   case GLSLstd450Cross: {
+      unsigned yzx[4] = { 1, 2, 0, 0 };
+      unsigned zxy[4] = { 2, 0, 1, 0 };
+      val->ssa->def =
+         nir_fsub(nb, nir_fmul(nb, nir_swizzle(nb, src[0], yzx, 3, true),
+                                   nir_swizzle(nb, src[1], zxy, 3, true)),
+                      nir_fmul(nb, nir_swizzle(nb, src[0], zxy, 3, true),
+                                   nir_swizzle(nb, src[1], yzx, 3, true)));
+      return;
+   }
+
    case GLSLstd450Asin:
    case GLSLstd450Acos:
    case GLSLstd450Atan:
@@ -179,7 +190,6 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint,
    case GLSLstd450Frexp:
    case GLSLstd450PackDouble2x32:
    case GLSLstd450UnpackDouble2x32:
-   case GLSLstd450Cross:
    case GLSLstd450FaceForward:
    case GLSLstd450Reflect:
    case GLSLstd450Refract: