From cec5b0ce01abbcee654c7c8ca609cb66d5af4cf0 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 3 Dec 2014 22:35:34 +0100 Subject: 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. --- Source/Core/VideoCommon/GeometryShaderGen.cpp | 29 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'Source/Core/VideoCommon/GeometryShaderGen.cpp') 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(out, ApiType); - GenerateGSOutputStruct(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"); -- cgit v1.2.3