Implement shadow samplers and dFdx(), dFdy() code generation.
[mesa.git] / src / mesa / shader / slang / library / slang_fragment_builtin.gc
old mode 100755 (executable)
new mode 100644 (file)
index 8b619cd..0346723
@@ -1,26 +1,26 @@
-/*\r
- * Mesa 3-D graphics library\r
- * Version:  6.5\r
- *\r
- * Copyright (C) 2006  Brian Paul   All Rights Reserved.\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\r
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
+/*
+ * 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.
+ */
 
 //
 // TODO:
@@ -42,131 +42,197 @@ varying vec4 gl_SecondaryColor;
 varying vec4 gl_TexCoord[gl_MaxTextureCoords];
 varying float gl_FogFragCoord;
 
-//
-// 8.7 Texture Lookup Functions
-//
 
-vec4 texture1D (sampler1D sampler, float coord, float bias) {\r
-    vec4 texel;\r
-    __asm vec4_tex1d texel, sampler, coord, bias;\r
-    return texel;
-}\r
 
-vec4 texture1DProj (sampler1D sampler, vec2 coord, float bias) {
-    return texture1D (sampler, coord.s / coord.t, bias);
-}\r
+//// 8.7 Texture Lookup Functions (with bias)
 
-vec4 texture1DProj (sampler1D sampler, vec4 coord, float bias) {
-    return texture1D (sampler, coord.s / coord.q, bias);
+vec4 texture1D(const sampler1D sampler, const float coord, const float bias)
+{
+   vec4 coord4;
+   coord4.x = coord;
+   coord4.w = bias;
+   __asm vec4_texb1d __retVal, sampler, coord4;
 }
 
-vec4 texture2D (sampler2D sampler, vec2 coord, float bias) {\r
-    vec4 texel;\r
-    __asm vec4_tex2d texel, sampler, coord, bias;\r
-    return texel;
-}\r
+vec4 texture1DProj(const sampler1D sampler, const vec2 coord, const float bias)
+{
+   // do projection here (there's no vec4_texbp1d instruction)
+   vec4 pcoord;
+   pcoord.x = coord.x / coord.y;
+   pcoord.w = bias;
+   __asm vec4_texb1d __retVal, sampler, pcoord;
+}
 
-vec4 texture2DProj (sampler2D sampler, vec3 coord, float bias) {\r
-    return texture2D (sampler, vec2 (coord.s / coord.p, coord.t / coord.p), bias);
-}\r
+vec4 texture1DProj(const sampler1D sampler, const vec4 coord, const float bias)
+{
+   // do projection here (there's no vec4_texbp1d instruction)
+   vec4 pcoord;
+   pcoord.x = coord.x / coord.z;
+   pcoord.w = bias;
+   __asm vec4_texb1d __retVal, sampler, pcoord;
+}
 
-vec4 texture2DProj (sampler2D sampler, vec4 coord, float bias) {\r
-    return texture2D (sampler, vec2 (coord.s / coord.q, coord.t / coord.q), bias);
+
+vec4 texture2D(const sampler2D sampler, const vec2 coord, const float bias)
+{
+   vec4 coord4;
+   coord4.xy = coord.xy;
+   coord4.w = bias;
+   __asm vec4_texb2d __retVal, sampler, coord4;
 }
 
-vec4 texture3D (sampler3D sampler, vec3 coord, float bias) {\r
-    vec4 texel;\r
-    __asm vec4_tex3d texel, sampler, coord, bias;\r
-    return texel;
-}\r
+vec4 texture2DProj(const sampler2D sampler, const vec3 coord, const float bias)
+{
+   // do projection here (there's no vec4_texbp2d instruction)
+   vec4 pcoord;
+   pcoord.xy = coord.xy / coord.z;
+   pcoord.w = bias;
+   __asm vec4_texb2d __retVal, sampler, pcoord;
+}
 
-vec4 texture3DProj (sampler3D sampler, vec4 coord, float bias) {\r
-    return texture3D (sampler, vec3 (coord.s / coord.q, coord.t / coord.q, coord.p / coord.q), bias);
+vec4 texture2DProj(const sampler2D sampler, const vec4 coord, const float bias)
+{
+   // do projection here (there's no vec4_texbp2d instruction)
+   vec4 pcoord;
+   pcoord.xy = coord.xy / coord.w;
+   pcoord.w = bias;
+   __asm vec4_texb2d __retVal, sampler, pcoord;
 }
 
-vec4 textureCube (samplerCube sampler, vec3 coord, float bias) {\r
-    vec4 texel;\r
-    __asm vec4_texcube texel, sampler, coord, bias;\r
-    return texel;
+
+vec4 texture3D(const sampler3D sampler, const vec3 coord, const float bias)
+{
+   vec4 coord4;
+   coord4.xyz = coord.xyz;
+   coord4.w = bias;
+   __asm vec4_texb3d __retVal, sampler, coord4;
+}
+
+vec4 texture3DProj(const sampler3D sampler, const vec4 coord, const float bias)
+{
+   // do projection here (there's no vec4_texbp3d instruction)
+   vec4 pcoord;
+   pcoord.xyz = coord.xyz / coord.w;
+   pcoord.w = bias;
+   __asm vec4_texb3d __retVal, sampler, pcoord;
+}
+
+
+vec4 textureCube(const samplerCube sampler, const vec3 coord, const float bias)
+{
+   vec4 coord4;
+   coord4.xyz = coord;
+   coord4.w = bias;
+   __asm vec4_texcube __retVal, sampler, coord4;
 }
 
-vec4 shadow1D (sampler1DShadow sampler, vec3 coord, float bias) {\r
-    vec4 texel;\r
-    __asm vec4_shad1d texel, sampler, coord, bias;\r
-    return texel;
-}\r
 
-vec4 shadow1DProj (sampler1DShadow sampler, vec4 coord, float bias) {\r
-    return shadow1D (sampler, vec3 (coord.s / coord.q, 0.0, coord.p / coord.q), bias);\r
-}\r
-\r
-vec4 shadow2D (sampler2DShadow sampler, vec3 coord, float bias) {\r
-    vec4 texel;\r
-    __asm vec4_shad2d texel, sampler, coord, bias;\r
-    return texel;
-}\r
+// For shadow textures, we use the regular tex instructions since they should
+// do the depth comparison step.
 
-vec4 shadow2DProj (sampler2DShadow sampler, vec4 coord, float bias) {\r
-    return shadow2D (sampler, vec3 (coord.s / coord.q, coord.t / coord.q, coord.p / coord.q), bias);
+vec4 shadow1D(const sampler1DShadow sampler, const vec3 coord, const float bias)
+{
+   vec4 coord4;
+   coord4.xyz = coord;
+   coord4.w = bias;
+   __asm vec4_texb1d __retVal, sampler, coord4;
 }
 
+vec4 shadow1DProj(const sampler1DShadow sampler, const vec4 coord, const float bias)
+{
+   vec4 pcoord;
+   pcoord.x = coord.x / coord.w;
+   pcoord.z = coord.z;
+   pcoord.w = bias;
+   __asm vec4_texb1d __retVal, sampler, pcoord;
+}
+
+vec4 shadow2D(const sampler2DShadow sampler, const vec3 coord, const float bias)
+{
+   vec4 coord4;
+   coord4.xyz = coord;
+   coord4.w = bias;
+   __asm vec4_texb2d __retVal, sampler, coord4;
+}
+
+vec4 shadow2DProj(const sampler2DShadow sampler, const vec4 coord, const float bias)
+{
+   vec4 pcoord;
+   pcoord.xy = coord.xy / coord.w;
+   pcoord.z = coord.z;
+   pcoord.w = bias;
+   __asm vec4_texb2d __retVal, sampler, pcoord;
+}
+
+
+
+
+
 //
 // 8.8 Fragment Processing Functions
 //
 
-float dFdx (float p) {\r
-    // XXX:
-    return 0.0;
+float dFdx(const float p)
+{
+   __asm vec4_ddx __retVal.x, p.xxxx;
 }
 
-vec2 dFdx (vec2 p) {\r
-    // XXX:
-    return vec2 (0.0);
+vec2 dFdx(const vec2 p)
+{
+   __asm vec4_ddx __retVal.xy, p.xyyy;
 }
 
-vec3 dFdx (vec3 p) {\r
-    // XXX:
-    return vec3 (0.0);
+vec3 dFdx(const vec3 p)
+{
+   __asm vec4_ddx __retVal.xyz, p.xyzz;
 }
 
-vec4 dFdx (vec4 p) {\r
-    // XXX:
-    return vec4 (0.0);
+vec4 dFdx(const vec4 p)
+{
+   __asm vec4_ddx __retVal, p;
 }
 
-float dFdy (float p) {\r
-    // XXX:
-    return 0.0;
+float dFdy(const float p)
+{
+   __asm vec4_ddy __retVal.x, p.xxxx;
 }
 
-vec2 dFdy (vec2 p) {\r
-    // XXX:
-    return vec2 (0.0);
+vec2 dFdy(const vec2 p)
+{
+   __asm vec4_ddy __retVal.xy, p.xyyy;
 }
 
-vec3 dFdy (vec3 p) {\r
-    // XXX:
-    return vec3 (0.0);
+vec3 dFdy(const vec3 p)
+{
+   __asm vec4_ddy __retVal.xyz, p.xyzz;
 }
 
-vec4 dFdy (vec4 p) {\r
-    // XXX:
-    return vec4 (0.0);
+vec4 dFdy(const vec4 p)
+{
+   __asm vec4_ddy __retVal, p;
 }
 
-float fwidth (float p) {
-    return abs (dFdx (p)) + abs (dFdy (p));
-}\r
+float fwidth (const float p)
+{
+   // XXX hand-write with __asm
+   return abs(dFdx(p)) + abs(dFdy(p));
+}
 
-vec2 fwidth (vec2 p) {
-    return abs (dFdx (p)) + abs (dFdy (p));
-}\r
+vec2 fwidth(const vec2 p)
+{
+   // XXX hand-write with __asm
+   return abs(dFdx(p)) + abs(dFdy(p));
+}
 
-vec3 fwidth (vec3 p) {
-    return abs (dFdx (p)) + abs (dFdy (p));
-}\r
+vec3 fwidth(const vec3 p)
+{
+   // XXX hand-write with __asm
+   return abs(dFdx(p)) + abs(dFdy(p));
+}
 
-vec4 fwidth (vec4 p) {
-    return abs (dFdx (p)) + abs (dFdy (p));
+vec4 fwidth(const vec4 p)
+{
+   // XXX hand-write with __asm
+   return abs(dFdx(p)) + abs(dFdy(p));
 }