From e490c3c7f7bb5461cfa78a214827aa534fb43a3e Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Sat, 21 Mar 2015 21:19:34 +0100
Subject: Bump OculusVR RIFT SDK to 0.4.4

---
 LibOVR/Src/CAPI/GL/CAPI_GL_DistortionShaders.h | 180 +++++++++++++++++++++----
 1 file changed, 155 insertions(+), 25 deletions(-)

(limited to 'LibOVR/Src/CAPI/GL/CAPI_GL_DistortionShaders.h')

diff --git a/LibOVR/Src/CAPI/GL/CAPI_GL_DistortionShaders.h b/LibOVR/Src/CAPI/GL/CAPI_GL_DistortionShaders.h
index 03fd174..6f48122 100644
--- a/LibOVR/Src/CAPI/GL/CAPI_GL_DistortionShaders.h
+++ b/LibOVR/Src/CAPI/GL/CAPI_GL_DistortionShaders.h
@@ -5,11 +5,22 @@
  Created     :   November 11, 2013
  Authors     :   David Borel, Volga Aksoy
  
- Copyright   :   Copyright 2013 Oculus VR, Inc. All Rights reserved.
- 
- Use of this software is subject to the terms of the Oculus Inc license
- agreement provided at the time of installation or download, or which
- otherwise accompanies this software in either electronic or hard copy form.
+ Copyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.
+
+Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License"); 
+you may not use the Oculus VR Rift SDK except in compliance with the License, 
+which is provided at the time of installation or download, or which 
+otherwise accompanies this software in either electronic or hard copy form.
+
+You may obtain a copy of the License at
+
+http://www.oculusvr.com/licenses/LICENSE-3.2 
+
+Unless required by applicable law or agreed to in writing, the Oculus VR SDK 
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
  
  ************************************************************************************/
 
@@ -25,21 +36,39 @@ namespace OVR { namespace CAPI { namespace GL {
     static const char glsl2Prefix[] =
     "#version 110\n"
     "#extension GL_ARB_shader_texture_lod : enable\n"
+    "#extension GL_ARB_draw_buffers : enable\n"
+    "#extension GL_EXT_gpu_shader4 : enable\n"
     "#define _FRAGCOLOR_DECLARATION\n"
+    "#define _MRTFRAGCOLOR0_DECLARATION\n"
+    "#define _MRTFRAGCOLOR1_DECLARATION\n"
+    "#define _GLFRAGCOORD_DECLARATION\n"
     "#define _VS_IN attribute\n"
     "#define _VS_OUT varying\n"
     "#define _FS_IN varying\n"
     "#define _TEXTURELOD texture2DLod\n"
-    "#define _FRAGCOLOR gl_FragColor\n";
+    "#define _TEXTURE texture2D\n"
+    "#define _FRAGCOLOR gl_FragColor\n"
+    "#define _MRTFRAGCOLOR0 gl_FragData[0]\n"
+    "#define _MRTFRAGCOLOR1 gl_FragData[1]\n"       // The texture coordinate [0.0,1.0] for texel i of a texture of size N is: (2i + 1)/2N
+    "#ifdef GL_EXT_gpu_shader4\n"
+    "  #define _TEXELFETCHDECL vec4 texelFetch(sampler2D tex, ivec2 coord, int lod){ ivec2 size = textureSize2D(tex, lod); return texture2D(tex, vec2(float((coord.x * 2) + 1) / float(size.x * 2), float((coord.y * 2) + 1) / float(size.y * 2))); }\n"
+    "#endif\n";
     
     static const char glsl3Prefix[] =
     "#version 150\n"
     "#define _FRAGCOLOR_DECLARATION out vec4 FragColor;\n"
+    "#define _MRTFRAGCOLOR0_DECLARATION out vec4 FragData0;\n"
+    "#define _MRTFRAGCOLOR1_DECLARATION out vec4 FragData1;\n"
+    "#define _GLFRAGCOORD_DECLARATION in vec4 gl_FragCoord;\n"
     "#define _VS_IN in\n"
     "#define _VS_OUT out\n"
     "#define _FS_IN in\n"
     "#define _TEXTURELOD textureLod\n"
-    "#define _FRAGCOLOR FragColor\n";
+    "#define _TEXTURE texture\n"
+    "#define _FRAGCOLOR FragColor\n"
+    "#define _MRTFRAGCOLOR0 FragData0\n"
+    "#define _MRTFRAGCOLOR1 FragData1\n"
+    "#define _TEXELFETCHDECL\n";
     
     static const char SimpleQuad_vs[] =
     "uniform vec2 PositionOffset;\n"
@@ -72,7 +101,70 @@ namespace OVR { namespace CAPI { namespace GL {
     {
         { "Color", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 16 },
     };
+
+    static const char SimpleQuadGamma_fs[] =
+        "uniform vec4 Color;\n"
+
+        "_FRAGCOLOR_DECLARATION\n"
+
+        "void main()\n"
+        "{\n"
+        "    _FRAGCOLOR.rgb = pow(Color.rgb, vec3(2.2));\n"
+        "    _FRAGCOLOR.a = Color.a;\n"
+        "}\n";
+
+    const OVR::CAPI::GL::ShaderBase::Uniform SimpleQuadGamma_fs_refl[] =
+    {
+        { "Color", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 16 },
+    };
+
+    // This must be prefixed with glsl2Prefix or glsl3Prefix before being compiled.
+    static const char SimpleTexturedQuad_vs[] =
+        "uniform vec2 PositionOffset;\n"
+        "uniform vec2 Scale;\n"
+
+        "_VS_IN vec3 Position;\n"
+        "_VS_IN vec4 Color;\n"
+        "_VS_IN vec2 TexCoord;\n"
+  
+        "_VS_OUT vec4 oColor;\n"
+        "_VS_OUT vec2 oTexCoord;\n"
+
+        "void main()\n"
+        "{\n"
+	    "	gl_Position = vec4(Position.xy * Scale + PositionOffset, 0.5, 1.0);\n"
+        "   oColor = Color;\n"
+        "   oTexCoord = TexCoord;\n"
+        "}\n";
+
+    // The following declaration is copied from the generated D3D SimpleTexturedQuad_vs_refl.h file, with D3D_NS renamed to GL.
+    const OVR::CAPI::GL::ShaderBase::Uniform SimpleTexturedQuad_vs_refl[] =
+    {
+	    { "PositionOffset", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 8 },
+	    { "Scale",          OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 8, 8 },
+    };
+
+
+    // This must be prefixed with glsl2Prefix or glsl3Prefix before being compiled.
+    static const char SimpleTexturedQuad_ps[] =
+        "uniform sampler2D Texture0;\n"
+    
+        "_FS_IN vec4 oColor;\n"
+        "_FS_IN vec2 oTexCoord;\n"
     
+        "_FRAGCOLOR_DECLARATION\n"
+
+        "void main()\n"
+        "{\n"
+        "   _FRAGCOLOR = oColor * _TEXTURE(Texture0, oTexCoord);\n"
+        "}\n";
+
+    // The following is copied from the generated D3D SimpleTexturedQuad_ps_refl.h file, with D3D_NS renamed to GL.
+    const OVR::CAPI::GL::ShaderBase::Uniform SimpleTexturedQuad_ps_refl[] =
+    {
+	    { "Color", 	OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 16 },
+    };
+
     
     static const char Distortion_vs[] =
     "uniform vec2 EyeToSourceUVScale;\n"
@@ -94,7 +186,6 @@ namespace OVR { namespace CAPI { namespace GL {
     // Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).
     // Scale them into the correct [0-1],[0-1] UV lookup space (depending on eye)
     "   oTexCoord0 = TexCoord0 * EyeToSourceUVScale + EyeToSourceUVOffset;\n"
-    "   oTexCoord0.y = 1.0 - oTexCoord0.y;\n"
     "   oColor = Color;\n"              // Used for vignette fade.
     "}\n";
     
@@ -114,7 +205,7 @@ namespace OVR { namespace CAPI { namespace GL {
     
     "void main()\n"
     "{\n"
-    "   _FRAGCOLOR = _TEXTURELOD(Texture0, oTexCoord0, 0.0);\n"
+    "   _FRAGCOLOR = _TEXTURE(Texture0, oTexCoord0, 0.0);\n"
     "   _FRAGCOLOR.a = 1.0;\n"
     "}\n";
     
@@ -129,8 +220,8 @@ namespace OVR { namespace CAPI { namespace GL {
     "_VS_IN vec4 Color;\n"
     "_VS_IN vec2 TexCoord0;\n"
     
-    "_FS_IN vec4 oColor;\n"
-    "_FS_IN vec2 oTexCoord0;\n"
+    "_VS_OUT vec4 oColor;\n"
+    "_VS_OUT vec2 oTexCoord0;\n"
     
     "void main()\n"
     "{\n"
@@ -163,7 +254,6 @@ namespace OVR { namespace CAPI { namespace GL {
     // Scale them into the correct [0-1],[0-1] UV lookup space (depending on eye)
     "   vec2 SrcCoord = Flattened * EyeToSourceUVScale + EyeToSourceUVOffset;\n"
     "   oTexCoord0 = SrcCoord;\n"
-    "   oTexCoord0.y = 1.0-oTexCoord0.y;\n"
     "   oColor = vec4(Color.r, Color.r, Color.r, Color.r);\n"              // Used for vignette fade.
     "}\n";
 
@@ -199,11 +289,8 @@ namespace OVR { namespace CAPI { namespace GL {
     // Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).
     // Scale them into the correct [0-1],[0-1] UV lookup space (depending on eye)
     "   oTexCoord0 = TexCoord0 * EyeToSourceUVScale + EyeToSourceUVOffset;\n"
-    "   oTexCoord0.y = 1.0-oTexCoord0.y;\n"
     "   oTexCoord1 = TexCoord1 * EyeToSourceUVScale + EyeToSourceUVOffset;\n"
-    "   oTexCoord1.y = 1.0-oTexCoord1.y;\n"
     "   oTexCoord2 = TexCoord2 * EyeToSourceUVScale + EyeToSourceUVOffset;\n"
-    "   oTexCoord2.y = 1.0-oTexCoord2.y;\n"
     
     "   oColor = Color;\n" // Used for vignette fade.
     "}\n";
@@ -216,23 +303,69 @@ namespace OVR { namespace CAPI { namespace GL {
     
     static const char DistortionChroma_fs[] =
     "uniform sampler2D Texture0;\n"
-    
+    "uniform sampler2D Texture1;\n"
+    "uniform vec3 OverdriveScales_IsSrgb;\n"
+
     "_FS_IN vec4 oColor;\n"
     "_FS_IN vec2 oTexCoord0;\n"
     "_FS_IN vec2 oTexCoord1;\n"
     "_FS_IN vec2 oTexCoord2;\n"
     
-    "_FRAGCOLOR_DECLARATION\n"
+    "_MRTFRAGCOLOR0_DECLARATION\n"   // Desired color (next frame's "PrevTexture")
+    "_MRTFRAGCOLOR1_DECLARATION\n"   // Overdriven color (Back-buffer)
+    "_GLFRAGCOORD_DECLARATION\n"
+
+    "#ifdef _TEXELFETCHDECL\n"
+    "_TEXELFETCHDECL\n"
+    "#endif\n"
     
     "void main()\n"
     "{\n"
-    "   float ResultR = _TEXTURELOD(Texture0, oTexCoord0, 0.0).r;\n"
-    "   float ResultG = _TEXTURELOD(Texture0, oTexCoord1, 0.0).g;\n"
-    "   float ResultB = _TEXTURELOD(Texture0, oTexCoord2, 0.0).b;\n"
-    
-    "   _FRAGCOLOR = vec4(ResultR * oColor.r, ResultG * oColor.g, ResultB * oColor.b, 1.0);\n"
+    "   float ResultR = _TEXTURE(Texture0, oTexCoord0, 0.0).r;\n"
+    "   float ResultG = _TEXTURE(Texture0, oTexCoord1, 0.0).g;\n"
+    "   float ResultB = _TEXTURE(Texture0, oTexCoord2, 0.0).b;\n"
+    "   vec3 newColor = vec3(ResultR * oColor.r, ResultG * oColor.g, ResultB * oColor.b);\n"
+
+    "   _MRTFRAGCOLOR0 = vec4(newColor, 1);\n"
+    "   _MRTFRAGCOLOR1 = _MRTFRAGCOLOR0;\n"
+
+    "   #ifdef _TEXELFETCHDECL\n"
+    // pixel luminance overdrive
+    "   if(OverdriveScales_IsSrgb.x > 0.0)\n"
+    "   {\n"
+    "       ivec2 pixelCoord = ivec2(gl_FragCoord.x, gl_FragCoord.y);\n"
+    "       vec3 oldColor = texelFetch(Texture1, pixelCoord, 0).rgb;\n"
+
+    "       vec3 adjustedScales;\n"
+    "       adjustedScales.x = newColor.x > oldColor.x ? OverdriveScales_IsSrgb.x : OverdriveScales_IsSrgb.y;\n"
+    "       adjustedScales.y = newColor.y > oldColor.y ? OverdriveScales_IsSrgb.x : OverdriveScales_IsSrgb.y;\n"
+    "       adjustedScales.z = newColor.z > oldColor.z ? OverdriveScales_IsSrgb.x : OverdriveScales_IsSrgb.y;\n"
+
+	// overdrive is tuned for gamma space so if we're in linear space fix gamma before doing the calculation
+	"		vec3 overdriveColor;\n"
+	"       if(OverdriveScales_IsSrgb.z > 0.0)\n"
+	"		{\n"
+	"           oldColor = pow(oldColor, vec3(1.0/2.2, 1.0/2.2, 1.0/2.2));\n"
+	"			newColor = pow(newColor, vec3(1.0/2.2, 1.0/2.2, 1.0/2.2));\n"
+    "			overdriveColor = clamp(newColor + (newColor - oldColor) * adjustedScales, 0.0, 1.0);\n"
+    "           overdriveColor = pow(overdriveColor, vec3(2.2, 2.2, 2.2));\n"
+	"		}\n"
+	"		else\n"
+	"			overdriveColor = clamp(newColor + (newColor - oldColor) * adjustedScales, 0.0, 1.0);\n"
+
+    "       _MRTFRAGCOLOR1 = vec4(overdriveColor, 1.0);\n"
+    "   }\n"
+    "   #else\n"
+    // If statement to keep OverdriveScales_IsSrgb from being optimized out.
+    "   if(OverdriveScales_IsSrgb.x > 0.0)\n"
+    "     _MRTFRAGCOLOR1 = vec4(newColor, 1);\n"
+    "   #endif\n"
     "}\n";
 
+    const OVR::CAPI::GL::ShaderBase::Uniform DistortionChroma_ps_refl[] =
+    {
+        { "OverdriveScales_IsSrgb", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 12 },
+    };
     
     static const char DistortionTimewarpChroma_vs[] =
     "uniform vec2 EyeToSourceUVScale;\n"
@@ -303,11 +436,8 @@ namespace OVR { namespace CAPI { namespace GL {
     "   vec2 SrcCoordB = FlattenedB * EyeToSourceUVScale + EyeToSourceUVOffset;\n"
     
     "   oTexCoord0 = SrcCoordR;\n"
-    "   oTexCoord0.y = 1.0-oTexCoord0.y;\n"
     "   oTexCoord1 = SrcCoordG;\n"
-    "   oTexCoord1.y = 1.0-oTexCoord1.y;\n"
     "   oTexCoord2 = SrcCoordB;\n"
-    "   oTexCoord2.y = 1.0-oTexCoord2.y;\n"
     
     "   oColor = vec4(Color.r, Color.r, Color.r, Color.r);\n"              // Used for vignette fade.
     "}\n";
-- 
cgit v1.2.3