summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/GeometryShaderGen.cpp
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2014-11-16 09:21:19 +0100
committerJules Blok <jules.blok@gmail.com>2014-11-23 14:30:12 +0100
commited9f258b275b61f4ee154e19412efee34f2f8759 (patch)
tree65528a6e52de6e3be15fb9aa30093081136505a1 /Source/Core/VideoCommon/GeometryShaderGen.cpp
parent106df04e8e87939014fb6ac8dcb35bb5f952176f (diff)
GeometryShader: Don't read from output variables
Diffstat (limited to 'Source/Core/VideoCommon/GeometryShaderGen.cpp')
-rw-r--r--Source/Core/VideoCommon/GeometryShaderGen.cpp19
1 files changed, 10 insertions, 9 deletions
diff --git a/Source/Core/VideoCommon/GeometryShaderGen.cpp b/Source/Core/VideoCommon/GeometryShaderGen.cpp
index b3ba0d7962..afaa16582b 100644
--- a/Source/Core/VideoCommon/GeometryShaderGen.cpp
+++ b/Source/Core/VideoCommon/GeometryShaderGen.cpp
@@ -74,15 +74,15 @@ static inline void GenerateGeometryShader(T& out, u32 components, API_TYPE ApiTy
// If the GPU supports invocation we don't need a for loop and can simply use the
// invocation identifier to determine which layer we're rendering.
if (g_ActiveConfig.backend_info.bSupportsGSInstancing)
- out.Write("\tlayer = gl_InvocationID;\n");
+ out.Write("\tint l = gl_InvocationID;\n");
else
- out.Write("\tfor (layer = 0; layer < %d; ++layer) {\n", g_ActiveConfig.iStereoMode > 0 ? 2 : 1);
+ out.Write("\tfor (int l = 0; l < %d; ++l) {\n", g_ActiveConfig.iStereoMode > 0 ? 2 : 1);
- // Select the output layer
- out.Write("\tgl_Layer = layer;\n");
-
- out.Write("\tfor (int i = 0; i < gl_in.length(); ++i) {\n");
+ out.Write("\tfor (int i = 0; i < 3; ++i) {\n");
+ out.Write("\t\tlayer = l;\n");
+ out.Write("\t\tgl_Layer = l;\n");
out.Write("\t\tf = o[i];\n");
+ out.Write("\t\tfloat4 pos = o[i].pos;\n");
if (g_ActiveConfig.iStereoMode > 0)
{
@@ -93,11 +93,12 @@ static inline void GenerateGeometryShader(T& out, u32 components, API_TYPE ApiTy
// the depth value. This results in objects at a distance smaller than the convergence
// distance to seemingly appear in front of the screen.
// This formula is based on page 13 of the "Nvidia 3D Vision Automatic, Best Practices Guide"
- out.Write("\t\tf.clipPos.x += " I_STEREOPARAMS"[layer] * (f.clipPos.w - " I_STEREOPARAMS"[2]);\n");
- out.Write("\t\tf.pos.x += " I_STEREOPARAMS"[layer] * (f.pos.w - " I_STEREOPARAMS"[2]);\n");
+ out.Write("\t\tf.clipPos.x = o[i].clipPos.x + " I_STEREOPARAMS"[l] * (o[i].clipPos.w - " I_STEREOPARAMS"[2]);\n");
+ out.Write("\t\tpos.x = o[i].pos.x + " I_STEREOPARAMS"[l] * (o[i].pos.w - " I_STEREOPARAMS"[2]);\n");
}
- out.Write("\t\tgl_Position = f.pos;\n");
+ out.Write("\t\tf.pos.x = pos.x;\n");
+ out.Write("\t\tgl_Position = pos;\n");
out.Write("\t\tEmitVertex();\n");
out.Write("\t}\n");
out.Write("\tEndPrimitive();\n");