diff options
| author | Jules Blok <jules.blok@gmail.com> | 2014-12-03 22:35:34 +0100 |
|---|---|---|
| committer | Jules Blok <jules.blok@gmail.com> | 2014-12-14 13:28:50 +0100 |
| commit | cec5b0ce01abbcee654c7c8ca609cb66d5af4cf0 (patch) | |
| tree | 80bbe094a992ef3f0f147b77f1898f490965723a /Source/Core/VideoCommon/GeometryShaderGen.cpp | |
| parent | fd6b5886270a1433cc315895f30036e4bd4729f0 (diff) | |
ShaderGen: Remove the GS_OUTPUT struct for OpenGL.
And remove the generator for it since it is no longer used outside of the geometry shader.
Diffstat (limited to 'Source/Core/VideoCommon/GeometryShaderGen.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/GeometryShaderGen.cpp | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/Source/Core/VideoCommon/GeometryShaderGen.cpp b/Source/Core/VideoCommon/GeometryShaderGen.cpp index 187af8b088..57009aedaa 100644 --- a/Source/Core/VideoCommon/GeometryShaderGen.cpp +++ b/Source/Core/VideoCommon/GeometryShaderGen.cpp @@ -53,17 +53,22 @@ static inline void GenerateGeometryShader(T& out, u32 components, API_TYPE ApiTy uid_data->pixel_lighting = g_ActiveConfig.bEnablePixelLighting; GenerateVSOutputStruct<T>(out, ApiType); - GenerateGSOutputStruct<T>(out, ApiType); if (ApiType == API_OPENGL) { out.Write("centroid in VS_OUTPUT o[3];\n"); - out.Write("centroid out GS_OUTPUT gs;\n"); + out.Write("centroid out VS_OUTPUT vs;\n"); + out.Write("flat out int layer;\n"); out.Write("void main()\n{\n"); } else // D3D { + out.Write("struct GS_OUTPUT {\n"); + out.Write("\tVS_OUTPUT vs;\n"); + out.Write("\tuint layer : SV_RenderTargetArrayIndex;\n"); + out.Write("};\n"); + if (g_ActiveConfig.backend_info.bSupportsGSInstancing) { out.Write("[maxvertexcount(3)]\n[instance(%d)]\n", g_ActiveConfig.iStereoMode > 0 ? 2 : 1); @@ -85,19 +90,23 @@ static inline void GenerateGeometryShader(T& out, u32 components, API_TYPE ApiTy if (g_ActiveConfig.backend_info.bSupportsGSInstancing) { if (ApiType == API_OPENGL) - out.Write("\tint layer = gl_InvocationID;\n"); + out.Write("\tint eye = gl_InvocationID;\n"); else - out.Write("\tint layer = InstanceID;\n"); + out.Write("\tint eye = InstanceID;\n"); } else - out.Write("\tfor (int layer = 0; layer < %d; ++layer) {\n", g_ActiveConfig.iStereoMode > 0 ? 2 : 1); + out.Write("\tfor (int eye = 0; eye < %d; ++eye) {\n", g_ActiveConfig.iStereoMode > 0 ? 2 : 1); out.Write("\tfor (int i = 0; i < 3; ++i) {\n"); // Select the output layer - out.Write("\t\tgs.layer = layer;\n"); if (ApiType == API_OPENGL) - out.Write("\t\tgl_Layer = layer;\n"); + { + out.Write("\t\tgl_Layer = eye;\n"); + out.Write("\t\tlayer = eye;\n"); + } + else + out.Write("\t\tgs.layer = eye;\n"); out.Write("\t\tf = o[i];\n"); out.Write("\t\tfloat4 pos = o[i].pos;\n"); @@ -111,8 +120,8 @@ 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 = o[i].clipPos.x + " I_STEREOPARAMS"[layer] * (o[i].clipPos.w - " I_STEREOPARAMS"[2]);\n"); - out.Write("\t\tpos.x = o[i].pos.x + " I_STEREOPARAMS"[layer] * (o[i].pos.w - " I_STEREOPARAMS"[2]);\n"); + out.Write("\t\tf.clipPos.x = o[i].clipPos.x + " I_STEREOPARAMS"[eye] * (o[i].clipPos.w - " I_STEREOPARAMS"[2]);\n"); + out.Write("\t\tpos.x = o[i].pos.x + " I_STEREOPARAMS"[eye] * (o[i].pos.w - " I_STEREOPARAMS"[2]);\n"); } out.Write("\t\tf.pos.x = pos.x;\n"); @@ -120,7 +129,7 @@ static inline void GenerateGeometryShader(T& out, u32 components, API_TYPE ApiTy if (ApiType == API_OPENGL) out.Write("\t\tgl_Position = pos;\n"); - out.Write("\t\tgs.vs = f;\n"); + out.Write("\t\t%s = f;\n", (ApiType == API_OPENGL) ? "vs" : "gs.vs"); if (ApiType == API_OPENGL) out.Write("\t\tEmitVertex();\n"); |
