glsl: rewrite sqrt(x) intrinsic to handle x=0
[mesa.git] / src / mesa / shader / slang / library / slang_vertex_builtin.gc
old mode 100755 (executable)
new mode 100644 (file)
index ae3e071..9ad5f35
@@ -1,10 +1,26 @@
-
-//
-// TODO:
-// - what to do with ftransform? can it stay in the current form?
-// - implement texture1DLod, texture2DLod, texture3DLod, textureCubeLod,
-// - implement shadow1DLod, shadow2DLod,
-//
+/*
+ * Mesa 3-D graphics library
+ * Version:  6.5
+ *
+ * Copyright (C) 2006  Brian Paul   All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
 
 //
 // From Shader Spec, ver. 1.10, rev. 59
@@ -38,87 +54,137 @@ varying float gl_FogFragCoord;
 //
 // Geometric Functions
 //
-\r
-vec4 ftransform () {
-    return gl_ModelViewProjectionMatrix * gl_Vertex;
+
+vec4 ftransform()
+{
+   __retVal = gl_ModelViewProjectionMatrix[0] * gl_Vertex.xxxx
+            + gl_ModelViewProjectionMatrix[1] * gl_Vertex.yyyy
+            + gl_ModelViewProjectionMatrix[2] * gl_Vertex.zzzz
+            + gl_ModelViewProjectionMatrix[3] * gl_Vertex.wwww;
 }
 
+
+
 //
 // 8.7 Texture Lookup Functions
+// These are pretty much identical to the ones in slang_fragment_builtin.gc
+// When used in a vertex program, the texture sample instructions should not
+// be using a LOD term so it's effectively zero.  Adding 'lod' to that does
+// what we want.
 //
 
-vec4 texture1DLod (sampler1D sampler, float coord, float lod) {\r
-       // XXX:
-    return vec4 (0.0);
-}\r
+vec4 texture1DLod(const sampler1D sampler, const float coord, const float lod)
+{
+   vec4 coord4;
+   coord4.x = coord;
+   coord4.w = lod;
+   __asm vec4_tex_1d_bias __retVal, sampler, coord4;
+}
 
-vec4 texture1DProjLod (sampler1D sampler, vec2 coord, float lod) {
-    return texture1DLod (sampler, coord.s / coord.t, lod);
-}\r
+vec4 texture1DProjLod(const sampler1D sampler, const vec2 coord, const float lod)
+{
+   vec4 pcoord;
+   pcoord.x = coord.x / coord.y;
+   pcoord.w = lod;
+   __asm vec4_tex_1d_bias __retVal, sampler, pcoord;
+}
 
-vec4 texture1DProjLod (sampler1D sampler, vec4 coord, float lod) {
-    return texture1DLod (sampler, coord.s / coord.q, lod);
+vec4 texture1DProjLod(const sampler1D sampler, const vec4 coord, const float lod)
+{
+   vec4 pcoord;
+   pcoord.x = coord.x / coord.z;
+   pcoord.w = lod;
+   __asm vec4_tex_1d_bias __retVal, sampler, pcoord;
 }
 
-vec4 texture2DLod (sampler2D sampler, vec2 coord, float lod) {\r
-       // XXX:
-    return vec4 (0.0);
-}\r
-
-vec4 texture2DProjLod (sampler2D sampler, vec3 coord, float lod) {\r
-       vec2 u;\r
-       u.s = coord.s / coord.p;\r
-       u.t = coord.t / coord.p;
-    return texture2DLod (sampler, u, lod);
-}\r
-
-vec4 texture2DProjLod (sampler2D sampler, vec4 coord, float lod) {\r
-       vec2 u;\r
-       u.s = coord.s / coord.q;\r
-       u.t = coord.t / coord.q;
-    return texture2DLod (sampler, u, lod);
+
+
+vec4 texture2DLod(const sampler2D sampler, const vec2 coord, const float lod)
+{
+   vec4 coord4;
+   coord4.xy = coord.xy;
+   coord4.w = lod;
+   __asm vec4_tex_2d_bias __retVal, sampler, coord4;
 }
 
-vec4 texture3DLod (sampler3D sampler, vec3 coord, float lod) {\r
-       // XXX:
-    return vec4 (0.0);
+vec4 texture2DProjLod(const sampler2D sampler, const vec3 coord, const float lod)
+{
+   vec4 pcoord;
+   pcoord.xy = coord.xy / coord.z;
+   pcoord.w = lod;
+   __asm vec4_tex_2d_bias __retVal, sampler, pcoord;
 }
-vec4 texture3DProjLod (sampler3D sampler, vec4 coord, float lod) {\r
-       vec3 u;\r
-       u.s = coord.s / coord.q;\r
-       u.t = coord.t / coord.q;\r
-       u.p = coord.p / coord.q;
-    return texture3DLod (sampler, u, lod);
+
+vec4 texture2DProjLod(const sampler2D sampler, const vec4 coord, const float lod)
+{
+   vec4 pcoord;
+   pcoord.xy = coord.xy / coord.z;
+   pcoord.w = lod;
+   __asm vec4_tex_2d_bias __retVal, sampler, pcoord;
 }
 
-vec4 textureCubeLod (samplerCube sampler, vec3 coord, float lod) {\r
-       // XXX:
-    return vec4 (0.0);
+
+vec4 texture3DLod(const sampler3D sampler, const vec3 coord, const float lod)
+{
+   vec4 coord4;
+   coord4.xyz = coord.xyz;
+   coord4.w = lod;
+   __asm vec4_tex_3d_bias __retVal, sampler, coord4;
 }
 
-vec4 shadow1DLod (sampler1DShadow sampler, vec3 coord, float lod) {\r
-       // XXX:
-    return vec4 (0.0);
+vec4 texture3DProjLod(const sampler3D sampler, const vec4 coord, const float lod)
+{
+   // do projection here (there's no vec4_tex_3d_bias_proj instruction)
+   vec4 pcoord;
+   pcoord.xyz = coord.xyz / coord.w;
+   pcoord.w = lod;
+   __asm vec4_tex_3d_bias __retVal, sampler, pcoord;
+}
+
+
+vec4 textureCubeLod(const samplerCube sampler, const vec3 coord, const float lod)
+{
+   vec4 coord4;
+   coord4.xyz = coord;
+   coord4.w = lod;
+   __asm vec4_tex_cube __retVal, sampler, coord4;
+}
+
+
+vec4 shadow1DLod(const sampler1DShadow sampler, const vec3 coord, const float lod)
+{
+   vec4 coord4;
+   coord4.xyz = coord;
+   coord4.w = lod;
+   __asm vec4_tex_1d_bias_shadow __retVal, sampler, coord4;
+}
+
+vec4 shadow1DProjLod(const sampler1DShadow sampler, const vec4 coord,
+                     const float lod)
+{
+   vec4 pcoord;
+   pcoord.x = coord.x / coord.w;
+   pcoord.z = coord.z;
+   pcoord.w = lod;
+   __asm vec4_tex_1d_bias_shadow __retVal, sampler, pcoord;
+}
+
+
+vec4 shadow2DLod(const sampler2DShadow sampler, const vec3 coord, const float lod)
+{
+   vec4 coord4;
+   coord4.xyz = coord;
+   coord4.w = lod;
+   __asm vec4_tex_2d_bias_shadow __retVal, sampler, coord4;
 }
 
-vec4 shadow2DLod (sampler2DShadow sampler, vec3 coord, float lod) {\r
-       // XXX:
-    return vec4 (0.0);
-}\r
-
-vec4 shadow1DProjLod (sampler1DShadow sampler, vec4 coord, float lod) {\r
-       vec3 u;\r
-       u.s = coord.s / coord.q;\r
-       u.t = 0.0;\r
-       u.p = coord.p / coord.q;
-    return shadow1DLod (sampler, u, lod);
-}\r
-
-vec4 shadow2DProjLod (sampler2DShadow sampler, vec4 coord, float lod) {\r
-       vec3 u;\r
-       u.s = coord.s / coord.q;\r
-       u.t = coord.t / coord.q;\r
-       u.p = coord.p / coord.q;
-    return shadow2DLod (sampler, u, lod);
+vec4 shadow2DProjLod(const sampler2DShadow sampler, const vec4 coord,
+                     const float lod)
+{
+   vec4 pcoord;
+   pcoord.xy = coord.xy / coord.w;
+   pcoord.z = coord.z;
+   pcoord.w = lod;
+   __asm vec4_tex_2d_bias_shadow __retVal, sampler, pcoord;
 }