+ /* Implement the formula of GL_SPHERE_MAP */
+ tmp.WriteMask = TGSI_WRITEMASK_XYZ;
+ aVtx_normed = ureg_DECL_temporary(ureg);
+ tmp2 = ureg_DECL_temporary(ureg);
+ ureg_normalize3(ureg, aVtx_normed, vs->aVtx);
+ ureg_DP3(ureg, tmp_x, ureg_src(aVtx_normed), vs->aNrm);
+ ureg_MUL(ureg, tmp, vs->aNrm, _X(tmp));
+ ureg_ADD(ureg, tmp, ureg_src(tmp), ureg_src(tmp));
+ ureg_ADD(ureg, tmp, ureg_src(aVtx_normed), ureg_negate(ureg_src(tmp)));
+ /* now tmp = normed(Vtx) - 2 dot3(normed(Vtx), Nrm) Nrm */
+ ureg_MOV(ureg, ureg_writemask(tmp2, TGSI_WRITEMASK_XYZ), ureg_src(tmp));
+ ureg_MUL(ureg, tmp2, ureg_src(tmp2), ureg_src(tmp2));
+ ureg_DP3(ureg, ureg_writemask(tmp2, TGSI_WRITEMASK_X), ureg_src(tmp2), ureg_src(tmp2));
+ ureg_RSQ(ureg, ureg_writemask(tmp2, TGSI_WRITEMASK_X), ureg_src(tmp2));
+ ureg_MUL(ureg, ureg_writemask(tmp2, TGSI_WRITEMASK_X), ureg_src(tmp2), ureg_imm1f(ureg, 0.5f));
+ /* tmp2 = 0.5 / sqrt(tmp.x^2 + tmp.y^2 + (tmp.z+1)^2)
+ * TODO: z coordinates are a bit different gl vs d3d, should the formula be adapted ? */
+ ureg_MUL(ureg, tmp, ureg_src(tmp), _X(tmp2));
+ ureg_ADD(ureg, ureg_writemask(input_coord, TGSI_WRITEMASK_XY), ureg_src(tmp), ureg_imm1f(ureg, 0.5f));
+ ureg_MOV(ureg, ureg_writemask(input_coord, TGSI_WRITEMASK_ZW), ureg_imm4f(ureg, 0.0f, 0.0f, 0.0f, 1.0f));
+ ureg_release_temporary(ureg, aVtx_normed);
+ ureg_release_temporary(ureg, tmp2);
+ dim_input = 4;
+ tmp.WriteMask = TGSI_WRITEMASK_XYZW;