Skip to content

Commit cfa4bd6

Browse files
committed
GS/HW: Allow baking shaders into executable.
1 parent 43e073a commit cfa4bd6

File tree

8 files changed

+297
-29
lines changed

8 files changed

+297
-29
lines changed

cmake/ShaderToCpp.cmake

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
function(shader_to_cpp SHADER_FILES_OUT SHADER_FILES_CPP_OUT CPP_OUTPUT_DIR_OUT)
2+
set(SHADER_FILES "")
3+
set(SHADER_FILES_CPP "")
4+
set(CPP_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/shaders_cpp")
5+
file(MAKE_DIRECTORY ${CPP_OUTPUT_DIR})
6+
file(GLOB_RECURSE DIR_FILES "${CMAKE_CURRENT_SOURCE_DIR}/../bin/resources/shaders/*")
7+
foreach(path IN LISTS DIR_FILES)
8+
if(NOT ("${path}" MATCHES ".*\.glsl$" OR "${path}" MATCHES ".*\.fx$"))
9+
continue()
10+
endif()
11+
if (NOT WIN32 AND "${path}" MATCHES "/dx11/") # Don't include unneccessary stuff
12+
continue()
13+
endif()
14+
get_filename_component(DIR ${path} DIRECTORY)
15+
get_filename_component(API ${DIR} NAME)
16+
get_filename_component(BASE ${path} NAME_WE)
17+
set(cpp_path "${CPP_OUTPUT_DIR}/${API}_${BASE}.cpp")
18+
add_custom_command(
19+
OUTPUT ${cpp_path}
20+
COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/../tools/shader_to_cpp.py ${path} ${cpp_path} "${API}_${BASE}"
21+
DEPENDS ${path} ${CMAKE_CURRENT_SOURCE_DIR}/../tools/shader_to_cpp.py
22+
COMMENT "Shader to CPP: ${path} -> ${cpp_path}"
23+
VERBATIM
24+
)
25+
list(APPEND SHADER_FILES ${path})
26+
list(APPEND SHADER_FILES_CPP ${cpp_path})
27+
endforeach()
28+
set(${SHADER_FILES_OUT} ${SHADER_FILES} PARENT_SCOPE)
29+
set(${SHADER_FILES_CPP_OUT} ${SHADER_FILES_CPP} PARENT_SCOPE)
30+
set(${CPP_OUTPUT_DIR_OUT} ${CPP_OUTPUT_DIR} PARENT_SCOPE)
31+
endfunction()

common/vsprops/ShaderToCpp.props

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<PropertyGroup Label="UserMacros">
4+
<BakeShadersInCpp>true</BakeShadersInCpp>
5+
<ShaderCppDir>$(OutDir)shaders_cpp\</ShaderCppDir>
6+
</PropertyGroup>
7+
<ItemGroup>
8+
<BuildMacro Include="BakeShadersInCpp">
9+
<Value>$(BakeShadersInCpp)</Value>
10+
</BuildMacro>
11+
</ItemGroup>
12+
<ItemDefinitionGroup>
13+
<ClCompile>
14+
<PreprocessorDefinitions Condition="'$(BakeShadersInCpp)'=='true'">BAKE_SHADERS_IN_CPP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
15+
<AdditionalIncludeDirectories Condition="'$(BakeShadersInCpp)'=='true'">%(AdditionalIncludeDirectories);$(ShaderCppDir)</AdditionalIncludeDirectories>
16+
</ClCompile>
17+
</ItemDefinitionGroup>
18+
<Target Name="ShaderToCpp" BeforeTargets="ClCompile" Condition="'@(ShaderToCpp)'!='' And '$(BakeShadersInCpp)'=='true'">
19+
<!--Ensure output directory exists-->
20+
<MakeDir Directories="$(ShaderCppDir)" Condition="!Exists('$(ShaderCppDir)')" />
21+
<!--Setup metadata for following tasks-->
22+
<ItemGroup>
23+
<ShaderToCpp>
24+
<Command>
25+
"python" "$(SolutionDir)\tools\shader_to_cpp.py" "%(Identity)" "$(ShaderCppDir)%(VarName).cpp" "%(VarName)"
26+
</Command>
27+
<Outputs>$(ShaderCppDir)%(VarName).cpp</Outputs>
28+
</ShaderToCpp>
29+
</ItemGroup>
30+
<!--Helper for dealing with tlogs-->
31+
<!--https://learn.microsoft.com/en-us/visualstudio/msbuild/getoutofdateitems-task?view=vs-2022-->
32+
<GetOutOfDateItems Sources="@(ShaderToCpp)" OutputsMetadataName="Outputs" CommandMetadataName="Command" TLogDirectory="$(TLogLocation)" TLogNamePrefix="ShaderToCpp">
33+
<Output TaskParameter="OutOfDateSources" ItemName="OutOfDateShaderToCpp" />
34+
</GetOutOfDateItems>
35+
<CustomBuild Condition="'@(OutOfDateShaderToCpp)'!=''" Sources="@(OutOfDateShaderToCpp)" />
36+
<Message Text="Shader to CPP: '%(OutOfDateShaderToCpp.Identity)' -&gt; '$(ShaderCppDir)%(OutOfDateShaderToCpp.VarName).cpp'" Importance="high" Condition="'@(OutOfDateShaderToCpp)'!=''" />
37+
</Target>
38+
<Target Name="ShaderToCppClean">
39+
<Delete Files="@(ShaderToCpp->'$(ShaderCppDir)%(VarName).cpp')" />
40+
</Target>
41+
</Project>

common/vsprops/ShaderToCpp.targets

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<PropertyGroup>
4+
<CleanDependsOn>ShaderToCppClean;$(CleanDependsOn)</CleanDependsOn>
5+
</PropertyGroup>
6+
</Project>

pcsx2/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ if(WIN32)
5151
)
5252
endif(WIN32)
5353

54+
option(BAKE_SHADERS_IN_CPP "Bake shaders into C++ source files" OFF)
55+
if(BAKE_SHADERS_IN_CPP)
56+
include(ShaderToCpp)
57+
shader_to_cpp(SHADER_FILES SHADER_FILES_CPP CPP_OUTPUT_DIR)
58+
add_custom_target(GeneratedShaders DEPENDS ${SHADER_FILES} ${SHADER_FILES_CPP})
59+
add_dependencies(PCSX2 GeneratedShaders)
60+
target_compile_definitions(PCSX2_FLAGS INTERFACE BAKE_SHADERS_IN_CPP=1)
61+
target_include_directories(PCSX2_FLAGS INTERFACE ${CPP_OUTPUT_DIR})
62+
endif()
63+
5464
# Main pcsx2 source
5565
set(pcsx2Sources
5666
Achievements.cpp

pcsx2/GS/Renderers/Common/GSDevice.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,8 +312,69 @@ void GSDevice::GenerateExpansionIndexBuffer(void* buffer)
312312
}
313313
}
314314

315+
#ifdef BAKE_SHADERS_IN_CPP
316+
#include "common_fxaa.cpp"
317+
#include "vulkan_convert.cpp"
318+
#include "vulkan_imgui.cpp"
319+
#include "vulkan_interlace.cpp"
320+
#include "vulkan_merge.cpp"
321+
#include "vulkan_present.cpp"
322+
#include "vulkan_shadeboost.cpp"
323+
#include "vulkan_tfx.cpp"
324+
#include "opengl_convert.cpp"
325+
#include "opengl_imgui.cpp"
326+
#include "opengl_interlace.cpp"
327+
#include "opengl_merge.cpp"
328+
#include "opengl_present.cpp"
329+
#include "opengl_shadeboost.cpp"
330+
#include "opengl_tfx_fs.cpp"
331+
#include "opengl_tfx_vgs.cpp"
332+
#ifdef _WIN32
333+
#include "dx11_convert.cpp"
334+
#include "dx11_imgui.cpp"
335+
#include "dx11_interlace.cpp"
336+
#include "dx11_merge.cpp"
337+
#include "dx11_present.cpp"
338+
#include "dx11_shadeboost.cpp"
339+
#include "dx11_tfx.cpp"
340+
#endif
341+
342+
static const std::map<std::string, const unsigned char*> baked_shaders = {
343+
{ "shaders/common/fxaa.fx" , common_fxaa},
344+
{ "shaders/vulkan/convert.glsl" , vulkan_convert},
345+
{ "shaders/vulkan/imgui.glsl" , vulkan_imgui},
346+
{ "shaders/vulkan/interlace.glsl" , vulkan_interlace},
347+
{ "shaders/vulkan/merge.glsl" , vulkan_merge },
348+
{ "shaders/vulkan/present.glsl" , vulkan_present },
349+
{ "shaders/vulkan/shadeboost.glsl" , vulkan_shadeboost },
350+
{ "shaders/vulkan/tfx.glsl" , vulkan_tfx },
351+
{ "shaders/opengl/convert.glsl" , opengl_convert },
352+
{ "shaders/opengl/imgui.glsl" , opengl_imgui },
353+
{ "shaders/opengl/interlace.glsl" , opengl_interlace },
354+
{ "shaders/opengl/merge.glsl" , opengl_merge },
355+
{ "shaders/opengl/present.glsl" , opengl_present },
356+
{ "shaders/opengl/shadeboost.glsl" , opengl_shadeboost },
357+
{ "shaders/opengl/tfx_fs.glsl" , opengl_tfx_fs },
358+
{ "shaders/opengl/tfx_vgs.glsl" , opengl_tfx_vgs },
359+
#ifdef _WIN32
360+
{ "shaders/direct3d/convert.fx" , dx11_convert },
361+
{ "shaders/direct3d/imgui.fx" , dx11_imgui },
362+
{ "shaders/direct3d/interlace.fx" , dx11_interlace },
363+
{ "shaders/direct3d/merge.fx" , dx11_merge },
364+
{ "shaders/direct3d/present.fx" , dx11_present },
365+
{ "shaders/direct3d/shadeboost.fx" , dx11_shadeboost },
366+
{ "shaders/direct3d/tfx.fx" , dx11_tfx },
367+
#endif
368+
};
369+
#endif
370+
315371
std::optional<std::string> GSDevice::ReadShaderSource(const char* filename)
316372
{
373+
#ifdef BAKE_SHADERS_IN_CPP
374+
const auto it = baked_shaders.find(filename);
375+
if (it != baked_shaders.end())
376+
return reinterpret_cast<const char*>(it->second);
377+
#endif
317378
return FileSystem::ReadFileToString(Path::Combine(EmuFolders::Resources, filename).c_str());
318379
}
319380

pcsx2/pcsx2.vcxproj

Lines changed: 83 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<Import Condition="$(Configuration.Contains(Devel))" Project="$(SolutionDir)common\vsprops\CodeGen_Devel.props" />
2525
<Import Condition="$(Configuration.Contains(Release))" Project="$(SolutionDir)common\vsprops\CodeGen_Release.props" />
2626
<Import Condition="!$(Configuration.Contains(Release))" Project="$(SolutionDir)common\vsprops\IncrementalLinking.props" />
27+
<Import Project="$(SolutionDir)common\vsprops\ShaderToCpp.props" />
2728
</ImportGroup>
2829
<PropertyGroup Label="UserMacros" />
2930
<PropertyGroup>
@@ -70,29 +71,101 @@
7071
</ClCompile>
7172
</ItemDefinitionGroup>
7273
<ItemGroup>
74+
<ShaderToCpp Include="..\bin\resources\shaders\vulkan\convert.glsl">
75+
<VarName>vulkan_convert</VarName>
76+
</ShaderToCpp>
77+
<ShaderToCpp Include="..\bin\resources\shaders\vulkan\imgui.glsl">
78+
<VarName>vulkan_imgui</VarName>
79+
</ShaderToCpp>
80+
<ShaderToCpp Include="..\bin\resources\shaders\vulkan\interlace.glsl">
81+
<VarName>vulkan_interlace</VarName>
82+
</ShaderToCpp>
83+
<ShaderToCpp Include="..\bin\resources\shaders\vulkan\merge.glsl">
84+
<VarName>vulkan_merge</VarName>
85+
</ShaderToCpp>
86+
<ShaderToCpp Include="..\bin\resources\shaders\vulkan\present.glsl">
87+
<VarName>vulkan_present</VarName>
88+
</ShaderToCpp>
89+
<ShaderToCpp Include="..\bin\resources\shaders\vulkan\shadeboost.glsl">
90+
<VarName>vulkan_shadeboost</VarName>
91+
</ShaderToCpp>
92+
<ShaderToCpp Include="..\bin\resources\shaders\vulkan\tfx.glsl">
93+
<VarName>vulkan_tfx</VarName>
94+
</ShaderToCpp>
95+
<ShaderToCpp Include="..\bin\resources\shaders\opengl\convert.glsl">
96+
<VarName>opengl_convert</VarName>
97+
</ShaderToCpp>
98+
<ShaderToCpp Include="..\bin\resources\shaders\opengl\imgui.glsl">
99+
<VarName>opengl_imgui</VarName>
100+
</ShaderToCpp>
101+
<ShaderToCpp Include="..\bin\resources\shaders\opengl\interlace.glsl">
102+
<VarName>opengl_interlace</VarName>
103+
</ShaderToCpp>
104+
<ShaderToCpp Include="..\bin\resources\shaders\opengl\merge.glsl">
105+
<VarName>opengl_merge</VarName>
106+
</ShaderToCpp>
107+
<ShaderToCpp Include="..\bin\resources\shaders\opengl\shadeboost.glsl">
108+
<VarName>opengl_shadeboost</VarName>
109+
</ShaderToCpp>
110+
<ShaderToCpp Include="..\bin\resources\shaders\opengl\tfx_fs.glsl">
111+
<VarName>opengl_tfx_fs</VarName>
112+
</ShaderToCpp>
113+
<ShaderToCpp Include="..\bin\resources\shaders\opengl\tfx_vgs.glsl">
114+
<VarName>opengl_tfx_vgs</VarName>
115+
</ShaderToCpp>
116+
<ShaderToCpp Include="..\bin\resources\shaders\opengl\present.glsl">
117+
<VarName>opengl_present</VarName>
118+
</ShaderToCpp>
119+
<ShaderToCpp Include="..\bin\resources\shaders\dx11\convert.fx">
120+
<VarName>dx11_convert</VarName>
121+
</ShaderToCpp>
122+
<ShaderToCpp Include="..\bin\resources\shaders\dx11\interlace.fx">
123+
<VarName>dx11_interlace</VarName>
124+
</ShaderToCpp>
125+
<ShaderToCpp Include="..\bin\resources\shaders\dx11\merge.fx">
126+
<VarName>dx11_merge</VarName>
127+
</ShaderToCpp>
128+
<ShaderToCpp Include="..\bin\resources\shaders\dx11\shadeboost.fx">
129+
<VarName>dx11_shadeboost</VarName>
130+
</ShaderToCpp>
131+
<ShaderToCpp Include="..\bin\resources\shaders\dx11\tfx.fx">
132+
<VarName>dx11_tfx</VarName>
133+
</ShaderToCpp>
134+
<ShaderToCpp Include="..\bin\resources\shaders\dx11\imgui.fx">
135+
<VarName>dx11_imgui</VarName>
136+
</ShaderToCpp>
137+
<ShaderToCpp Include="..\bin\resources\shaders\dx11\present.fx">
138+
<VarName>dx11_present</VarName>
139+
</ShaderToCpp>
140+
<ShaderToCpp Include="..\bin\resources\shaders\common\fxaa.fx">
141+
<VarName>common_fxaa</VarName>
142+
</ShaderToCpp>
143+
<None Include="..\bin\resources\shaders\common\fxaa.fx" />
144+
<None Include="..\bin\resources\shaders\opengl\cas.glsl" />
145+
<None Include="..\bin\resources\shaders\opengl\convert.glsl" />
73146
<None Include="..\bin\resources\shaders\opengl\imgui.glsl" />
147+
<None Include="..\bin\resources\shaders\opengl\interlace.glsl" />
148+
<None Include="..\bin\resources\shaders\opengl\merge.glsl" />
74149
<None Include="..\bin\resources\shaders\opengl\present.glsl" />
150+
<None Include="..\bin\resources\shaders\opengl\shadeboost.glsl" />
151+
<None Include="..\bin\resources\shaders\opengl\tfx_fs.glsl" />
152+
<None Include="..\bin\resources\shaders\opengl\tfx_vgs.glsl" />
153+
<None Include="..\bin\resources\shaders\vulkan\cas.glsl" />
75154
<None Include="..\bin\resources\shaders\vulkan\convert.glsl" />
76155
<None Include="..\bin\resources\shaders\vulkan\imgui.glsl" />
77156
<None Include="..\bin\resources\shaders\vulkan\interlace.glsl" />
78157
<None Include="..\bin\resources\shaders\vulkan\merge.glsl" />
79158
<None Include="..\bin\resources\shaders\vulkan\present.glsl" />
80159
<None Include="..\bin\resources\shaders\vulkan\shadeboost.glsl" />
81160
<None Include="..\bin\resources\shaders\vulkan\tfx.glsl" />
82-
<None Include="..\bin\resources\shaders\opengl\convert.glsl" />
83-
<None Include="..\bin\resources\shaders\opengl\interlace.glsl" />
84-
<None Include="..\bin\resources\shaders\opengl\merge.glsl" />
85-
<None Include="..\bin\resources\shaders\opengl\shadeboost.glsl" />
86-
<None Include="..\bin\resources\shaders\opengl\tfx_fs.glsl" />
87-
<None Include="..\bin\resources\shaders\opengl\tfx_vgs.glsl" />
88161
<None Include="..\bin\resources\shaders\dx11\convert.fx" />
89-
<None Include="..\bin\resources\shaders\common\fxaa.fx" />
162+
<None Include="..\bin\resources\shaders\dx11\imgui.fx" />
90163
<None Include="..\bin\resources\shaders\dx11\interlace.fx" />
91164
<None Include="..\bin\resources\shaders\dx11\merge.fx" />
165+
<None Include="..\bin\resources\shaders\dx11\present.fx" />
92166
<None Include="..\bin\resources\shaders\dx11\shadeboost.fx" />
93167
<None Include="..\bin\resources\shaders\dx11\tfx.fx" />
94-
<None Include="..\bin\resources\shaders\dx11\imgui.fx" />
95-
<None Include="..\bin\resources\shaders\dx11\present.fx" />
168+
<None Include="..\bin\resources\shaders\dx11\cas.hlsl" />
96169
<None Include="GS\Renderers\Vulkan\VKEntryPoints.inl">
97170
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
98171
</None>
@@ -1031,5 +1104,6 @@
10311104
</ItemGroup>
10321105
<Import Condition="$(Configuration.Contains(Debug)) Or $(Configuration.Contains(Devel))" Project="$(SolutionDir)3rdparty\winpixeventruntime\WinPixEventRuntime.props" />
10331106
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
1107+
<Import Project="$(SolutionDir)common\vsprops\ShaderToCpp.targets" />
10341108
<ImportGroup Label="ExtensionTargets" />
10351109
</Project>

0 commit comments

Comments
 (0)