VideoCommon: Don't pass structs between shaders, use the interface blocks instead.

This commit is contained in:
Jules Blok
2014-12-21 12:52:14 +01:00
parent 2c0bee5da9
commit 7eb353b3bd
5 changed files with 74 additions and 44 deletions

View File

@ -221,9 +221,13 @@ private:
};
template<class T>
static void DefineOutputStructMember(T& object, API_TYPE api_type, const char* type, const char* name, int var_index, const char* semantic = "", int semantic_index = -1)
static 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)
{
object.Write(" %s %s", type, name);
if (qualifier != nullptr)
object.Write("\t%s %s %s", qualifier, type, name);
else
object.Write("\t%s %s", type, name);
if (var_index != -1)
object.Write("%d", var_index);
@ -239,23 +243,35 @@ static void DefineOutputStructMember(T& object, API_TYPE api_type, const char* t
}
template<class T>
static inline void GenerateVSOutputStruct(T& object, API_TYPE api_type)
static inline void GenerateVSOutputMembers(T& object, API_TYPE api_type, const char* qualifier = nullptr)
{
object.Write("struct VS_OUTPUT {\n");
DefineOutputStructMember(object, api_type, "float4", "pos", -1, "POSITION");
DefineOutputStructMember(object, api_type, "float4", "colors_", 0, "COLOR", 0);
DefineOutputStructMember(object, api_type, "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)
DefineOutputStructMember(object, api_type, "float3", "tex", i, "TEXCOORD", i);
DefineOutputMember(object, api_type, qualifier, "float3", "tex", i, "TEXCOORD", i);
DefineOutputStructMember(object, api_type, "float4", "clipPos", -1, "TEXCOORD", xfmem.numTexGen.numTexGens);
DefineOutputMember(object, api_type, qualifier, "float4", "clipPos", -1, "TEXCOORD", xfmem.numTexGen.numTexGens);
if (g_ActiveConfig.bEnablePixelLighting)
DefineOutputStructMember(object, api_type, "float4", "Normal", -1, "TEXCOORD", xfmem.numTexGen.numTexGens + 1);
DefineOutputMember(object, api_type, qualifier, "float4", "Normal", -1, "TEXCOORD", xfmem.numTexGen.numTexGens + 1);
}
object.Write("};\n");
template<class T>
static inline void AssignVSOutputMembers(T& object, const char* a, const char* b)
{
object.Write("\t%s.pos = %s.pos;\n", a, b);
object.Write("\t%s.colors_0 = %s.colors_0;\n", a, b);
object.Write("\t%s.colors_1 = %s.colors_1;\n", a, b);
for (unsigned int i = 0; i < xfmem.numTexGen.numTexGens; ++i)
object.Write("\t%s.tex%d = %s.tex%d;\n", a, i, b, i);
object.Write("\t%s.clipPos = %s.clipPos;\n", a, b);
if (g_ActiveConfig.bEnablePixelLighting)
object.Write("\t%s.Normal = %s.Normal;\n", a, b);
}
// Constant variable names