Skip to content

Commit

Permalink
feat(mods::shader): support [cpv]s_5_x syntax for dx11+dx12 shaders
Browse files Browse the repository at this point in the history
  • Loading branch information
clshortfuse committed Jan 18, 2025
1 parent 9f121f0 commit dfd704a
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 48 deletions.
126 changes: 91 additions & 35 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ function(build_shader_target ADDON ADDON_PATH)
foreach(FILE ${SHADER_SOURCES})
cmake_path(GET FILE FILENAME FILENAME)
cmake_path(GET FILE PARENT_PATH TARGET_PATH)
string(REGEX MATCH "(.*)\\.([pcv]s_[0-9]_[0-9])\\.hlsl$" _ ${FILENAME})
string(REGEX MATCH "(.*)\\.([pcv]s_[0-9]_[0-9x])\\.hlsl$" _ ${FILENAME})
set(SHADER_NAME ${CMAKE_MATCH_1})
set(SHADER_TARGET ${CMAKE_MATCH_2})
if(SHADER_NAME)
Expand All @@ -94,44 +94,101 @@ function(build_shader_target ADDON ADDON_PATH)
if(SHADER_TARGET AND (SHADER_HASH OR SHADER_NAME))
string(SUBSTRING ${SHADER_TARGET} 3 1 SHADER_TARGET_MAJOR)
string(SUBSTRING ${SHADER_TARGET} 5 1 SHADER_TARGET_MINOR)
set(SHADER_COMPILER ${FXC_BIN})
unset(SHADER_FLAGS)
if(SHADER_TARGET_MAJOR GREATER_EQUAL "6")
set(SHADER_COMPILER ${DXC_BIN})
set(SHADER_FLAGS "/HV 2021") # Ovewrite flags
else()
if(SHADER_TARGET_MAJOR STREQUAL "5" AND SHADER_TARGET_MINOR STREQUAL "x")

string(SUBSTRING ${SHADER_TARGET} 0 2 SHADER_TARGET_TYPE)

# Add dependencies
unset(HLSL_DEPENDENCIES)
unset(HLSL_CHILD_DEPENDENCIES)
list(APPEND HLSL_DEPENDENCIES ${FILE})
inspect_hlsl_imports(${FILE} HLSL_CHILD_DEPENDENCIES ".")
list(APPEND HLSL_DEPENDENCIES ${HLSL_CHILD_DEPENDENCIES})

#DX11
set(SHADER_COMPILER ${FXC_BIN})
unset(SHADER_FLAGS)
set(SHADER_FLAGS ${SHADER_FLAGS} /D __SHADER_TARGET_MAJOR=${SHADER_TARGET_MAJOR})
set(SHADER_FLAGS ${SHADER_FLAGS} /D __SHADER_TARGET_MINOR=${SHADER_TARGET_MINOR})
if(SHADER_TARGET_MAJOR EQUAL "5")
if(SHADER_TARGET_MINOR EQUAL "0")
set(SHADER_FLAGS ${SHADER_FLAGS} /Gec)
endif()
set(SHADER_FLAGS ${SHADER_FLAGS} /D __SHADER_TARGET_MINOR=0)
set(SHADER_FLAGS ${SHADER_FLAGS} /Gec)

if(SHADER_HASH)
add_custom_command(
OUTPUT ${EMBED_FOLDER}/${SHADER_HASH}_dx11.cso
COMMAND ${SHADER_COMPILER} ${FILE} -T ${SHADER_TARGET_TYPE}_5_0 ${SHADER_FLAGS} /nologo /O3 /Qstrip_reflect -E main -Fo ${EMBED_FOLDER}/${SHADER_HASH}_dx11.cso
DEPENDS ${HLSL_DEPENDENCIES}
)
list(APPEND SHADER_BINARIES ${EMBED_FOLDER}/${SHADER_HASH}_dx11.cso)
else()
set(SHADER_FLAGS ${SHADER_FLAGS} /Gec)
add_custom_command(
OUTPUT ${EMBED_FOLDER}/${SHADER_NAME}_dx11.cso
COMMAND ${SHADER_COMPILER} ${FILE} -T ${SHADER_TARGET_TYPE}_5_0 ${SHADER_FLAGS} /nologo /O3 /Qstrip_reflect -E main -Fo ${EMBED_FOLDER}/${SHADER_NAME}_dx11.cso
DEPENDS ${HLSL_DEPENDENCIES}
)
list(APPEND SHADER_BINARIES ${EMBED_FOLDER}/${SHADER_NAME}_dx11.cso)
endif()

#DX12
unset(SHADER_FLAGS)
set(SHADER_FLAGS ${SHADER_FLAGS} /D __SHADER_TARGET_MAJOR=${SHADER_TARGET_MAJOR})
set(SHADER_FLAGS ${SHADER_FLAGS} /D __SHADER_TARGET_MINOR=1)

if(SHADER_HASH)
add_custom_command(
OUTPUT ${EMBED_FOLDER}/${SHADER_HASH}_dx12.cso
COMMAND ${SHADER_COMPILER} ${FILE} -T ${SHADER_TARGET_TYPE}_5_1 ${SHADER_FLAGS} /nologo /O3 /Qstrip_reflect -E main -Fo ${EMBED_FOLDER}/${SHADER_HASH}_dx12.cso
DEPENDS ${HLSL_DEPENDENCIES}
)
list(APPEND SHADER_BINARIES ${EMBED_FOLDER}/${SHADER_HASH}_dx12.cso)
else()
add_custom_command(
OUTPUT ${EMBED_FOLDER}/${SHADER_NAME}_dx12.cso
COMMAND ${SHADER_COMPILER} ${FILE} -T ${SHADER_TARGET_TYPE}_5_1 ${SHADER_FLAGS} /nologo /O3 /Qstrip_reflect -E main -Fo ${EMBED_FOLDER}/${SHADER_NAME}_dx12.cso
DEPENDS ${HLSL_DEPENDENCIES}
)
list(APPEND SHADER_BINARIES ${EMBED_FOLDER}/${SHADER_NAME}_dx12.cso)
endif()
endif()

unset(HLSL_DEPENDENCIES)
unset(HLSL_CHILD_DEPENDENCIES)
list(APPEND HLSL_DEPENDENCIES ${FILE})
# message("Building HLSL dependencies for " ${FILE})
inspect_hlsl_imports(${FILE} HLSL_CHILD_DEPENDENCIES ".")
list(APPEND HLSL_DEPENDENCIES ${HLSL_CHILD_DEPENDENCIES})
if(SHADER_HASH)
# message("Registering: " ${FILE} " => " ${EMBED_FOLDER}/${SHADER_HASH}.cso)
add_custom_command(
OUTPUT ${EMBED_FOLDER}/${SHADER_HASH}.cso
COMMAND ${SHADER_COMPILER} ${FILE} -T ${SHADER_TARGET} ${SHADER_FLAGS} /nologo /O3 /Qstrip_reflect -E main -Fo ${EMBED_FOLDER}/${SHADER_HASH}.cso
DEPENDS ${HLSL_DEPENDENCIES}
)
list(APPEND SHADER_BINARIES ${EMBED_FOLDER}/${SHADER_HASH}.cso)
else()
add_custom_command(
OUTPUT ${EMBED_FOLDER}/${SHADER_NAME}.cso
COMMAND ${SHADER_COMPILER} ${FILE} -T ${SHADER_TARGET} ${SHADER_FLAGS} /nologo /O3 /Qstrip_reflect -E main -Fo ${EMBED_FOLDER}/${SHADER_NAME}.cso
DEPENDS ${HLSL_DEPENDENCIES}
)
list(APPEND SHADER_BINARIES ${EMBED_FOLDER}/${SHADER_NAME}.cso)
set(SHADER_COMPILER ${FXC_BIN})
unset(SHADER_FLAGS)
if(SHADER_TARGET_MAJOR GREATER_EQUAL "6")
set(SHADER_COMPILER ${DXC_BIN})
set(SHADER_FLAGS "/HV 2021") # Ovewrite flags
else()
set(SHADER_FLAGS ${SHADER_FLAGS} /D __SHADER_TARGET_MAJOR=${SHADER_TARGET_MAJOR})
set(SHADER_FLAGS ${SHADER_FLAGS} /D __SHADER_TARGET_MINOR=${SHADER_TARGET_MINOR})
if(SHADER_TARGET_MAJOR EQUAL "5")
if(SHADER_TARGET_MINOR EQUAL "0")
set(SHADER_FLAGS ${SHADER_FLAGS} /Gec)
endif()
else()
set(SHADER_FLAGS ${SHADER_FLAGS} /Gec)
endif()
endif()

unset(HLSL_DEPENDENCIES)
unset(HLSL_CHILD_DEPENDENCIES)
list(APPEND HLSL_DEPENDENCIES ${FILE})
# message("Building HLSL dependencies for " ${FILE})
inspect_hlsl_imports(${FILE} HLSL_CHILD_DEPENDENCIES ".")
list(APPEND HLSL_DEPENDENCIES ${HLSL_CHILD_DEPENDENCIES})
if(SHADER_HASH)
# message("Registering: " ${FILE} " => " ${EMBED_FOLDER}/${SHADER_HASH}.cso)
add_custom_command(
OUTPUT ${EMBED_FOLDER}/${SHADER_HASH}.cso
COMMAND ${SHADER_COMPILER} ${FILE} -T ${SHADER_TARGET} ${SHADER_FLAGS} /nologo /O3 /Qstrip_reflect -E main -Fo ${EMBED_FOLDER}/${SHADER_HASH}.cso
DEPENDS ${HLSL_DEPENDENCIES}
)
list(APPEND SHADER_BINARIES ${EMBED_FOLDER}/${SHADER_HASH}.cso)
else()
add_custom_command(
OUTPUT ${EMBED_FOLDER}/${SHADER_NAME}.cso
COMMAND ${SHADER_COMPILER} ${FILE} -T ${SHADER_TARGET} ${SHADER_FLAGS} /nologo /O3 /Qstrip_reflect -E main -Fo ${EMBED_FOLDER}/${SHADER_NAME}.cso
DEPENDS ${HLSL_DEPENDENCIES}
)
list(APPEND SHADER_BINARIES ${EMBED_FOLDER}/${SHADER_NAME}.cso)
endif()
endif()
endif()
endforeach()
Expand Down Expand Up @@ -195,7 +252,6 @@ function(build_shader_target ADDON ADDON_PATH)
list(JOIN SHADER_HEADER_FILES " " SHADER_HEADER_FILE_ITEMS)
add_custom_target(${ADDON}-shaders DEPENDS ${SHADER_HEADER_FILES})


if(SHADERS_H_OUTPUT)
file(GENERATE OUTPUT ${EMBED_FOLDER}/shaders.h CONTENT "${SHADERS_H_OUTPUT}")
endif()
Expand Down
48 changes: 35 additions & 13 deletions src/mods/shader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,17 +48,29 @@ struct CustomShader {
// return false to abort
std::function<bool(reshade::api::command_list*)> on_draw = nullptr;
std::function<void(reshade::api::command_list*)> on_drawn = nullptr;
std::unordered_map<reshade::api::device_api, std::vector<uint8_t>> code_by_device;
};

using CustomShaders = std::unordered_map<uint32_t, CustomShader>;

// clang-format off
#define BypassShaderEntry(__crc32__) { __crc32__, { .crc32 = __crc32__, .on_draw = &renodx::mods::shader::internal::OnBypassShaderDraw } }
#define CustomShaderEntry(crc32) { crc32, { crc32, __##crc32 } }
#define CustomCountedShader(crc32, index) { crc32, { crc32, __##crc32, ##index} }
#define CustomSwapchainShader(crc32) { crc32, { crc32, __##crc32, -1, &renodx::utils::swapchain::HasBackBufferRenderTarget } }
#define CustomShaderEntryCallback(crc32, callback) { crc32, { crc32, __##crc32, -1, callback} }
#define BypassShaderEntry(__crc32__) {__crc32__, {.crc32 = __crc32__, .on_draw = &renodx::mods::shader::internal::OnBypassShaderDraw}}
#define CustomShaderEntry(crc32) {crc32, {crc32, __##crc32}}
#define CustomCountedShader(crc32, index) {crc32, {crc32, __##crc32, ##index}}
#define CustomSwapchainShader(crc32) {crc32, {crc32, __##crc32, -1, &renodx::utils::swapchain::HasBackBufferRenderTarget}}
#define CustomShaderEntryCallback(crc32, callback) {crc32, {crc32, __##crc32, -1, callback}}
// clang-format on
#define RENODX_JOIN_MACRO(x, y) x##y
#define CustomDirectXShaders(__crc32__) \
{ \
__crc32__, { \
.crc32 = __crc32__, \
.code_by_device = { \
{reshade::api::device_api::d3d11, RENODX_JOIN_MACRO(__##__crc32__, _dx11)}, \
{reshade::api::device_api::d3d12, RENODX_JOIN_MACRO(__##__crc32__, _dx12)}, \
}, \
} \
}

static thread_local std::vector<reshade::api::pipeline_layout_param*> created_params;
static thread_local std::unordered_map<uint32_t, reshade::api::pipeline_layout_param*> rebuilt_params;
Expand Down Expand Up @@ -980,9 +992,9 @@ static bool attached = false;

template <typename T = float*>
static void Use(DWORD fdw_reason, CustomShaders new_custom_shaders, T* new_injections = nullptr) {
renodx::utils::resource::Use(fdw_reason);
renodx::utils::shader::Use(fdw_reason);
renodx::utils::swapchain::Use(fdw_reason);
renodx::utils::resource::Use(fdw_reason);

switch (fdw_reason) {
case DLL_PROCESS_ATTACH:
Expand Down Expand Up @@ -1011,17 +1023,27 @@ static void Use(DWORD fdw_reason, CustomShaders new_custom_shaders, T* new_injec
if (!manual_shader_scheduling) {
if (force_pipeline_cloning || use_pipeline_layout_cloning) {
for (const auto& [hash, shader] : (new_custom_shaders)) {
if (shader.code.empty()) continue;
renodx::utils::shader::QueueRuntimeReplacement(hash, shader.code);
for (const auto& [device, code] : shader.code_by_device) {
renodx::utils::shader::UpdateReplacements({{hash, code}}, false, true, {device});
}
if (!shader.code.empty()) {
renodx::utils::shader::QueueRuntimeReplacement(hash, shader.code);
}
}
} else {
for (const auto& [hash, shader] : (new_custom_shaders)) {
if (shader.code.empty()) continue;
if (shader.on_replace == nullptr && shader.index == -1) {
renodx::utils::shader::QueueCompileTimeReplacement(hash, shader.code);
bool compile_supported = shader.on_replace == nullptr && shader.index == -1;
for (const auto& [device, code] : shader.code_by_device) {
renodx::utils::shader::UpdateReplacements({{hash, code}}, compile_supported, true, {device});
}

if (!shader.code.empty()) {
if (compile_supported) {
renodx::utils::shader::QueueCompileTimeReplacement(hash, shader.code);
}
// Use Runtime as fallback
renodx::utils::shader::QueueRuntimeReplacement(hash, shader.code);
}
// Use Runtime as fallback
renodx::utils::shader::QueueRuntimeReplacement(hash, shader.code);
}
}
}
Expand Down

0 comments on commit dfd704a

Please sign in to comment.