From 07591e7d5cf1a909a1691492337cda55025c0d20 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Thu, 20 Jul 2017 14:15:07 +1000 Subject: [PATCH] PixelShaderGen: Move header generation to seperate function --- Source/Core/VideoCommon/PixelShaderGen.cpp | 86 ++++++++++++---------- Source/Core/VideoCommon/PixelShaderGen.h | 2 + 2 files changed, 48 insertions(+), 40 deletions(-) diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp index d70806153e..fe0932ba70 100644 --- a/Source/Core/VideoCommon/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/PixelShaderGen.cpp @@ -333,33 +333,8 @@ PixelShaderUid GetPixelShaderUid() return out; } -static void WriteStage(ShaderCode& out, const pixel_shader_uid_data* uid_data, int n, - APIType ApiType, bool stereo); -static void WriteTevRegular(ShaderCode& out, const char* components, int bias, int op, int clamp, - int shift, bool alpha); -static void SampleTexture(ShaderCode& out, const char* texcoords, const char* texswap, int texmap, - bool stereo, APIType ApiType); -static void WriteAlphaTest(ShaderCode& out, const pixel_shader_uid_data* uid_data, APIType ApiType, - bool per_pixel_depth, bool use_dual_source); -static void WriteFog(ShaderCode& out, const pixel_shader_uid_data* uid_data); -static void WriteColor(ShaderCode& out, const pixel_shader_uid_data* uid_data, - bool use_dual_source); - -ShaderCode GeneratePixelShaderCode(APIType ApiType, const ShaderHostConfig& host_config, - const pixel_shader_uid_data* uid_data) +void WritePixelShaderCommonHeader(ShaderCode& out, APIType ApiType, bool bounding_box) { - ShaderCode out; - - const bool per_pixel_lighting = g_ActiveConfig.bEnablePixelLighting; - const bool msaa = host_config.msaa; - const bool ssaa = host_config.ssaa; - const bool stereo = host_config.stereo; - const u32 numStages = uid_data->genMode_numtevstages + 1; - - out.Write("//Pixel Shader for TEV stages\n"); - out.Write("//%i TEV stages, %i texgens, %i IND stages\n", numStages, uid_data->genMode_numtexgens, - uid_data->genMode_numindstages); - // dot product for integer vectors out.Write("int idot(int3 x, int3 y)\n" "{\n" @@ -422,20 +397,7 @@ ShaderCode GeneratePixelShaderCode(APIType ApiType, const ShaderHostConfig& host "\tfloat4 " I_EFBSCALE ";\n" "};\n"); - if (per_pixel_lighting) - { - out.Write("%s", s_lighting_struct); - - if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan) - out.Write("UBO_BINDING(std140, 2) uniform VSBlock {\n"); - else - out.Write("cbuffer VSBlock : register(b1) {\n"); - - out.Write(s_shader_uniforms); - out.Write("};\n"); - } - - if (uid_data->bounding_box) + if (bounding_box) { if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan) { @@ -448,6 +410,50 @@ ShaderCode GeneratePixelShaderCode(APIType ApiType, const ShaderHostConfig& host out.Write("globallycoherent RWBuffer bbox_data : register(u2);\n"); } } +} + +static void WriteStage(ShaderCode& out, const pixel_shader_uid_data* uid_data, int n, + APIType ApiType, bool stereo); +static void WriteTevRegular(ShaderCode& out, const char* components, int bias, int op, int clamp, + int shift, bool alpha); +static void SampleTexture(ShaderCode& out, const char* texcoords, const char* texswap, int texmap, + bool stereo, APIType ApiType); +static void WriteAlphaTest(ShaderCode& out, const pixel_shader_uid_data* uid_data, APIType ApiType, + bool per_pixel_depth, bool use_dual_source); +static void WriteFog(ShaderCode& out, const pixel_shader_uid_data* uid_data); +static void WriteColor(ShaderCode& out, const pixel_shader_uid_data* uid_data, + bool use_dual_source); + +ShaderCode GeneratePixelShaderCode(APIType ApiType, const ShaderHostConfig& host_config, + const pixel_shader_uid_data* uid_data) +{ + ShaderCode out; + + const bool per_pixel_lighting = g_ActiveConfig.bEnablePixelLighting; + const bool msaa = host_config.msaa; + const bool ssaa = host_config.ssaa; + const bool stereo = host_config.stereo; + const u32 numStages = uid_data->genMode_numtevstages + 1; + + out.Write("//Pixel Shader for TEV stages\n"); + out.Write("//%i TEV stages, %i texgens, %i IND stages\n", numStages, uid_data->genMode_numtexgens, + uid_data->genMode_numindstages); + + // Stuff that is shared between ubershaders and pixelgen. + WritePixelShaderCommonHeader(out, ApiType, uid_data->bounding_box); + + if (per_pixel_lighting) + { + out.Write("%s", s_lighting_struct); + + if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan) + out.Write("UBO_BINDING(std140, 2) uniform VSBlock {\n"); + else + out.Write("cbuffer VSBlock : register(b2) {\n"); + + out.Write(s_shader_uniforms); + out.Write("};\n"); + } out.Write("struct VS_OUTPUT {\n"); GenerateVSOutputMembers(out, ApiType, uid_data->genMode_numtexgens, per_pixel_lighting, ""); diff --git a/Source/Core/VideoCommon/PixelShaderGen.h b/Source/Core/VideoCommon/PixelShaderGen.h index 23de4635e1..17d2353a36 100644 --- a/Source/Core/VideoCommon/PixelShaderGen.h +++ b/Source/Core/VideoCommon/PixelShaderGen.h @@ -159,4 +159,6 @@ typedef ShaderUid PixelShaderUid; ShaderCode GeneratePixelShaderCode(APIType ApiType, const ShaderHostConfig& host_config, const pixel_shader_uid_data* uid_data); +void WritePixelShaderCommonHeader(ShaderCode& out, APIType ApiType, bool bounding_box); +ShaderCode GeneratePixelShaderCode(APIType ApiType, const pixel_shader_uid_data* uid_data); PixelShaderUid GetPixelShaderUid();