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.
This commit is contained in:
Jules Blok
2014-12-03 22:35:34 +01:00
parent fd6b588627
commit cec5b0ce01
3 changed files with 27 additions and 29 deletions

View File

@ -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");