diff options
| author | Scott Mansell <phiren@gmail.com> | 2016-01-16 23:49:39 +1300 |
|---|---|---|
| committer | Scott Mansell <phiren@gmail.com> | 2016-06-26 16:13:21 +1200 |
| commit | 28c7113e41a70e278e033094d3088e58eeb00c88 (patch) | |
| tree | 57039ebcb4e98b9a7a51397dd6be783c43e6e553 /Source/Core/VideoCommon/GeometryShaderGen.cpp | |
| parent | fa02f47729b0caeec455a47dcd032d663a47a645 (diff) | |
Multithreadded Shadergen: Second Pass over geometery Shadergen
Diffstat (limited to 'Source/Core/VideoCommon/GeometryShaderGen.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/GeometryShaderGen.cpp | 89 |
1 files changed, 42 insertions, 47 deletions
diff --git a/Source/Core/VideoCommon/GeometryShaderGen.cpp b/Source/Core/VideoCommon/GeometryShaderGen.cpp index 6aa6b4951b..f509072f8e 100644 --- a/Source/Core/VideoCommon/GeometryShaderGen.cpp +++ b/Source/Core/VideoCommon/GeometryShaderGen.cpp @@ -20,34 +20,40 @@ static void EmitVertex(T& out, const char* vertex, API_TYPE ApiType, bool first_ template <class T> static void EndPrimitive(T& out, API_TYPE ApiType); -template <class T> -static void EmitVertex(T& out, geometry_shader_uid_data* uid_data, const char* vertex, - API_TYPE ApiType, bool first_vertex = false); -template <class T> -static void EndPrimitive(T& out, geometry_shader_uid_data* uid_data, API_TYPE ApiType); +GeometryShaderUid GetGeometryShaderUid(u32 primitive_type) +{ + ShaderUid<geometry_shader_uid_data> out; + geometry_shader_uid_data* uid_data = out.GetUidData<geometry_shader_uid_data>(); + memset(uid_data, 0, sizeof(geometry_shader_uid_data)); -template <class T> -static T GenerateGeometryShader(u32 primitive_type, API_TYPE ApiType) + uid_data->primitive_type = primitive_type; + uid_data->wireframe = g_ActiveConfig.bWireFrame; + uid_data->msaa = g_ActiveConfig.iMultisamples > 1; + uid_data->ssaa = g_ActiveConfig.iMultisamples > 1 && g_ActiveConfig.bSSAA; + uid_data->stereo = g_ActiveConfig.iStereoMode > 0; + uid_data->numTexGens = xfmem.numTexGen.numTexGens; + uid_data->pixel_lighting = g_ActiveConfig.bEnablePixelLighting; + + return out; +} + +static void EmitVertex(ShaderCode& out, const geometry_shader_uid_data* uid_data, + const char* vertex, API_TYPE ApiType, bool first_vertex = false); +static void EndPrimitive(ShaderCode& out, const geometry_shader_uid_data* uid_data, + API_TYPE ApiType); + +ShaderCode GenerateGeometryShaderCode(u32 primitive_type, API_TYPE ApiType, + const geometry_shader_uid_data* uid_data) { - T out; + ShaderCode out; // Non-uid template parameters will write to the dummy data (=> gets optimized out) - geometry_shader_uid_data dummy_data; - geometry_shader_uid_data* uid_data = out.template GetUidData<geometry_shader_uid_data>(); - if (uid_data == nullptr) - uid_data = &dummy_data; - memset(uid_data, 0, sizeof(*uid_data)); - uid_data->primitive_type = primitive_type; const unsigned int vertex_in = primitive_type + 1; unsigned int vertex_out = primitive_type == PRIMITIVE_TRIANGLES ? 3 : 4; - uid_data->wireframe = g_ActiveConfig.bWireFrame; if (uid_data->wireframe) vertex_out++; - uid_data->msaa = g_ActiveConfig.iMultisamples > 1; - uid_data->ssaa = g_ActiveConfig.iMultisamples > 1 && g_ActiveConfig.bSSAA; - uid_data->stereo = g_ActiveConfig.iStereoMode > 0; if (ApiType == API_OPENGL) { // Insert layout parameters @@ -80,11 +86,10 @@ static T GenerateGeometryShader(u32 primitive_type, API_TYPE ApiType) "\tint4 " I_TEXOFFSET ";\n" "};\n"); - uid_data->numTexGens = xfmem.numTexGen.numTexGens; - uid_data->pixel_lighting = g_ActiveConfig.bEnablePixelLighting; out.Write("struct VS_OUTPUT {\n"); - GenerateVSOutputMembers<T>(out, ApiType, uid_data->numTexGens, uid_data->pixel_lighting, ""); + GenerateVSOutputMembers<ShaderCode>(out, ApiType, uid_data->numTexGens, uid_data->pixel_lighting, + ""); out.Write("};\n"); if (ApiType == API_OPENGL) @@ -93,13 +98,13 @@ static T GenerateGeometryShader(u32 primitive_type, API_TYPE ApiType) out.Write("#define InstanceID gl_InvocationID\n"); out.Write("in VertexData {\n"); - GenerateVSOutputMembers<T>( + GenerateVSOutputMembers<ShaderCode>( out, ApiType, uid_data->numTexGens, uid_data->pixel_lighting, GetInterpolationQualifier(uid_data->msaa, uid_data->ssaa, true, true)); out.Write("} vs[%d];\n", vertex_in); out.Write("out VertexData {\n"); - GenerateVSOutputMembers<T>( + GenerateVSOutputMembers<ShaderCode>( out, ApiType, uid_data->numTexGens, uid_data->pixel_lighting, GetInterpolationQualifier(uid_data->msaa, uid_data->ssaa, false, true)); @@ -248,8 +253,8 @@ static T GenerateGeometryShader(u32 primitive_type, API_TYPE ApiType) } out.Write("\t}\n"); - EmitVertex<T>(out, uid_data, "l", ApiType, true); - EmitVertex<T>(out, uid_data, "r", ApiType); + EmitVertex(out, uid_data, "l", ApiType, true); + EmitVertex(out, uid_data, "r", ApiType); } else if (primitive_type == PRIMITIVE_POINTS) { @@ -277,19 +282,19 @@ static T GenerateGeometryShader(u32 primitive_type, API_TYPE ApiType) } out.Write("\t}\n"); - EmitVertex<T>(out, uid_data, "ll", ApiType, true); - EmitVertex<T>(out, uid_data, "lr", ApiType); - EmitVertex<T>(out, uid_data, "ul", ApiType); - EmitVertex<T>(out, uid_data, "ur", ApiType); + EmitVertex(out, uid_data, "ll", ApiType, true); + EmitVertex(out, uid_data, "lr", ApiType); + EmitVertex(out, uid_data, "ul", ApiType); + EmitVertex(out, uid_data, "ur", ApiType); } else { - EmitVertex<T>(out, uid_data, "f", ApiType, true); + EmitVertex(out, uid_data, "f", ApiType, true); } out.Write("\t}\n"); - EndPrimitive<T>(out, uid_data, ApiType); + EndPrimitive(out, uid_data, ApiType); if (uid_data->stereo && !g_ActiveConfig.backend_info.bSupportsGSInstancing) out.Write("\t}\n"); @@ -299,9 +304,8 @@ static T GenerateGeometryShader(u32 primitive_type, API_TYPE ApiType) return out; } -template <class T> -static void EmitVertex(T& out, geometry_shader_uid_data* uid_data, const char* vertex, - API_TYPE ApiType, bool first_vertex) +static void EmitVertex(ShaderCode& out, const geometry_shader_uid_data* uid_data, + const char* vertex, API_TYPE ApiType, bool first_vertex) { if (uid_data->wireframe && first_vertex) out.Write("\tif (i == 0) first = %s;\n", vertex); @@ -321,24 +325,15 @@ static void EmitVertex(T& out, geometry_shader_uid_data* uid_data, const char* v else out.Write("\toutput.Append(ps);\n"); } -template <class T> -static void EndPrimitive(T& out, geometry_shader_uid_data* uid_data, API_TYPE ApiType) + +static void EndPrimitive(ShaderCode& out, const geometry_shader_uid_data* uid_data, + API_TYPE ApiType) { if (uid_data->wireframe) - EmitVertex<T>(out, uid_data, "first", ApiType); + EmitVertex(out, uid_data, "first", ApiType); if (ApiType == API_OPENGL) out.Write("\tEndPrimitive();\n"); else out.Write("\toutput.RestartStrip();\n"); } - -GeometryShaderUid GetGeometryShaderUid(u32 primitive_type, API_TYPE ApiType) -{ - return GenerateGeometryShader<GeometryShaderUid>(primitive_type, ApiType); -} - -ShaderCode GenerateGeometryShaderCode(u32 primitive_type, API_TYPE ApiType) -{ - return GenerateGeometryShader<ShaderCode>(primitive_type, ApiType); -} |
