diff --git a/Source/Core/VideoCommon/GeometryShaderGen.cpp b/Source/Core/VideoCommon/GeometryShaderGen.cpp index de76557d5e..4d551f5d16 100644 --- a/Source/Core/VideoCommon/GeometryShaderGen.cpp +++ b/Source/Core/VideoCommon/GeometryShaderGen.cpp @@ -90,16 +90,15 @@ static T GenerateGeometryShader(u32 primitive_type, API_TYPE ApiType) if (g_ActiveConfig.backend_info.bSupportsGSInstancing) out.Write("#define InstanceID gl_InvocationID\n"); - out.Write("// The interface block qualifier is duplicated to its member due to Apple OS X bug 24983074\n"); out.Write("in VertexData {\n"); - GenerateVSOutputMembers(out, ApiType, "in", GetInterpolationQualifier()); + GenerateVSOutputMembers(out, ApiType, GetInterpolationQualifier(true, true)); out.Write("} vs[%d];\n", vertex_in); out.Write("out VertexData {\n"); - GenerateVSOutputMembers(out, ApiType, "out", GetInterpolationQualifier()); + GenerateVSOutputMembers(out, ApiType, GetInterpolationQualifier(true, false)); if (g_ActiveConfig.iStereoMode > 0) - out.Write("\tflat out int layer;\n"); + out.Write("\tflat int layer;\n"); out.Write("} ps;\n"); diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp index cc0ab52422..5ae79e0733 100644 --- a/Source/Core/VideoCommon/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/PixelShaderGen.cpp @@ -354,12 +354,11 @@ static T GeneratePixelShader(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType) uid_data->stereo = g_ActiveConfig.iStereoMode > 0; if (g_ActiveConfig.backend_info.bSupportsGeometryShaders) { - out.Write("// The interface block qualifier is duplicated to its member due to Apple OS X bug 24983074\n"); out.Write("in VertexData {\n"); - GenerateVSOutputMembers(out, ApiType, "in", GetInterpolationQualifier()); + GenerateVSOutputMembers(out, ApiType, GetInterpolationQualifier(true, true)); if (g_ActiveConfig.iStereoMode > 0) - out.Write("\tflat in int layer;\n"); + out.Write("\tflat int layer;\n"); out.Write("};\n"); } diff --git a/Source/Core/VideoCommon/ShaderGenCommon.h b/Source/Core/VideoCommon/ShaderGenCommon.h index 9283cdc8cc..18c40af41e 100644 --- a/Source/Core/VideoCommon/ShaderGenCommon.h +++ b/Source/Core/VideoCommon/ShaderGenCommon.h @@ -214,12 +214,9 @@ private: }; template -inline void DefineOutputMember(T& object, API_TYPE api_type, const char* qualifier, const char* in_out, const char* type, const char* name, int var_index, const char* semantic = "", int semantic_index = -1) +inline void DefineOutputMember(T& object, API_TYPE api_type, const char* qualifier, const char* type, const char* name, int var_index, const char* semantic = "", int semantic_index = -1) { - if (qualifier != nullptr) - object.Write("\t%s %s %s %s", qualifier, in_out, type, name); - else - object.Write("\t%s %s %s", in_out, type, name); + object.Write("\t%s %s %s", qualifier, type, name); if (var_index != -1) object.Write("%d", var_index); @@ -236,21 +233,21 @@ inline void DefineOutputMember(T& object, API_TYPE api_type, const char* qualifi } template -inline void GenerateVSOutputMembers(T& object, API_TYPE api_type, const char* in_out, const char* qualifier = nullptr) +inline void GenerateVSOutputMembers(T& object, API_TYPE api_type, const char* qualifier) { - DefineOutputMember(object, api_type, qualifier, in_out, "float4", "pos", -1, "POSITION"); - DefineOutputMember(object, api_type, qualifier, in_out, "float4", "colors_", 0, "COLOR", 0); - DefineOutputMember(object, api_type, qualifier, in_out, "float4", "colors_", 1, "COLOR", 1); + DefineOutputMember(object, api_type, qualifier, "float4", "pos", -1, "POSITION"); + DefineOutputMember(object, api_type, qualifier, "float4", "colors_", 0, "COLOR", 0); + DefineOutputMember(object, api_type, qualifier, "float4", "colors_", 1, "COLOR", 1); for (unsigned int i = 0; i < xfmem.numTexGen.numTexGens; ++i) - DefineOutputMember(object, api_type, qualifier, in_out, "float3", "tex", i, "TEXCOORD", i); + DefineOutputMember(object, api_type, qualifier, "float3", "tex", i, "TEXCOORD", i); - DefineOutputMember(object, api_type, qualifier, in_out, "float4", "clipPos", -1, "TEXCOORD", xfmem.numTexGen.numTexGens); + DefineOutputMember(object, api_type, qualifier, "float4", "clipPos", -1, "TEXCOORD", xfmem.numTexGen.numTexGens); if (g_ActiveConfig.bEnablePixelLighting) { - DefineOutputMember(object, api_type, qualifier, in_out, "float3", "Normal", -1, "TEXCOORD", xfmem.numTexGen.numTexGens + 1); - DefineOutputMember(object, api_type, qualifier, in_out, "float3", "WorldPos", -1, "TEXCOORD", xfmem.numTexGen.numTexGens + 2); + DefineOutputMember(object, api_type, qualifier, "float3", "Normal", -1, "TEXCOORD", xfmem.numTexGen.numTexGens + 1); + DefineOutputMember(object, api_type, qualifier, "float3", "WorldPos", -1, "TEXCOORD", xfmem.numTexGen.numTexGens + 2); } } @@ -281,15 +278,27 @@ inline void AssignVSOutputMembers(T& object, const char* a, const char* b) // As a workaround, we interpolate at the centroid of the coveraged pixel, which // is always inside the primitive. // Without MSAA, this flag is defined to have no effect. -inline const char* GetInterpolationQualifier() +inline const char* GetInterpolationQualifier(bool in_glsl_interface_block = false, bool in = false) { if (g_ActiveConfig.iMultisamples <= 1) return ""; - if (!g_ActiveConfig.bSSAA) - return "centroid"; - - return "sample"; + // Without GL_ARB_shading_language_420pack support, the interpolation qualifier must be + // "centroid in" and not "centroid", even within an interface block. + if (in_glsl_interface_block && !g_ActiveConfig.backend_info.bSupportsBindingLayout) + { + if (!g_ActiveConfig.bSSAA) + return in ? "centroid in" : "centroid out"; + else + return in ? "sample in" : "sample out"; + } + else + { + if (!g_ActiveConfig.bSSAA) + return "centroid"; + else + return "sample"; + } } // Constant variable names diff --git a/Source/Core/VideoCommon/VertexShaderGen.cpp b/Source/Core/VideoCommon/VertexShaderGen.cpp index 1b436bf852..5a31a6e16c 100644 --- a/Source/Core/VideoCommon/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/VertexShaderGen.cpp @@ -74,9 +74,8 @@ static T GenerateVertexShader(API_TYPE api_type) if (g_ActiveConfig.backend_info.bSupportsGeometryShaders) { - out.Write("// The interface block qualifier is duplicated to its member due to Apple OS X bug 24983074\n"); out.Write("out VertexData {\n"); - GenerateVSOutputMembers(out, api_type, "out", GetInterpolationQualifier()); + GenerateVSOutputMembers(out, api_type, GetInterpolationQualifier(true, false)); out.Write("} vs;\n"); } else