Skip to content

Commit

Permalink
Review + Fixed no weaving in DX12
Browse files Browse the repository at this point in the history
  • Loading branch information
BramTeurlings committed Aug 31, 2024
1 parent 415c662 commit 1c55195
Show file tree
Hide file tree
Showing 11 changed files with 48 additions and 72 deletions.
14 changes: 8 additions & 6 deletions gamebridge_reshade/src/delayLoader.h
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
//
// Created by BramTeurlings on 22-8-2024.
//
/*
* This file falls under the GNU General Public License v3.0 license: See the LICENSE.txt in the root of this project for more info.
* Summary:
* Permissions of this strong copyleft license are conditioned on making available complete source code of licensed works and modifications, which include larger works using a licensed work, under the same license.
* Copyright and license notices must be preserved. Contributors provide an express grant of patent rights. Modifications to the source code must be disclosed publicly.
*/

#pragma once

#include <Windows.h>
#include <delayimp.h>

// Todo: This can just be a single string instead, checking this for each DLL seems horribly inefficient.
std::vector<std::string> sr_dll_names = {"Glog.dll", "Opencv_world343.dll", "DimencoWeaving.dll", "SimulatedRealityCore.dll", "SimulatedRealityDisplays.dll", "SimulatedRealityFacetrackers.dll", "SimulatedRealityDirectX.dll", "DimencoWeaving32.dll", "SimulatedRealityCore32.dll", "SimulatedRealityDisplays32.dll", "SimulatedRealityFacetrackers32.dll", "SimulatedRealityDirectX32.dll"};
std::array<std::string, 12> sr_dll_names = {"Glog.dll", "Opencv_world343.dll", "DimencoWeaving.dll", "SimulatedRealityCore.dll", "SimulatedRealityDisplays.dll", "SimulatedRealityFacetrackers.dll", "SimulatedRealityDirectX.dll", "DimencoWeaving32.dll", "SimulatedRealityCore32.dll", "SimulatedRealityDisplays32.dll", "SimulatedRealityFacetrackers32.dll", "SimulatedRealityDirectX32.dll"};

FARPROC WINAPI delayHook(unsigned dliNotify, PDelayLoadInfo pdli) {
std::string requested_dll;
Expand All @@ -31,7 +33,7 @@ FARPROC WINAPI delayHook(unsigned dliNotify, PDelayLoadInfo pdli) {
// Check if the DLL in question is one we want to delayed load.
requested_dll = pdli->szDll;
for (int i = 0; i < sr_dll_names.size(); i++) {
if (sr_dll_names[i].find(requested_dll) != std::string::npos) {
if (std::strcmp(sr_dll_names[i].c_str(), requested_dll.c_str()) == 0) {
// DLL matches one we want to load, let's load it
const HMODULE hModule = LoadLibraryA((requested_dll + ".dll").c_str());
const DWORD errorCode = GetLastError();
Expand Down
6 changes: 3 additions & 3 deletions gamebridge_reshade/src/directx10weaver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ bool DirectX10Weaver::create_effect_copy_buffer(const reshade::api::resource_des
return true;
}

ReturnCodes DirectX10Weaver::init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::command_list* cmd_list) {
GbResult DirectX10Weaver::init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::command_list* cmd_list) {
if (weaver_initialized) {
return SUCCESS;
}
Expand Down Expand Up @@ -116,7 +116,7 @@ void DirectX10Weaver::draw_status_overlay(reshade::api::effect_runtime *runtime)
ImGui::TextUnformatted(s.c_str());
}

ReturnCodes DirectX10Weaver::on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) {
GbResult DirectX10Weaver::on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) {
reshade::api::resource_view chosen_rtv;

if (use_srgb_rtv) {
Expand Down Expand Up @@ -177,7 +177,7 @@ ReturnCodes DirectX10Weaver::on_reshade_finish_effects(reshade::api::effect_runt
check_color_format(desc);

create_effect_copy_buffer(desc);
ReturnCodes result = init_weaver(runtime, effect_frame_copy, cmd_list);
GbResult result = init_weaver(runtime, effect_frame_copy, cmd_list);
if (result == SUCCESS) {
// Set context and input frame buffer again to make sure they are correct
weaver->setInputFrameBuffer((ID3D10ShaderResourceView*)effect_frame_copy_srv.handle);
Expand Down
4 changes: 2 additions & 2 deletions gamebridge_reshade/src/directx10weaver.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class DirectX10Weaver: public IGraphicsApi {
/// \param rtv Represents the current render target view
/// \param cmd_list Represents the current command list from ReShade
/// \return A bool representing if the weaver was initialized successfully
ReturnCodes init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::command_list* cmd_list);
GbResult init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::command_list* cmd_list);

/// \brief Creates and reset the effect copy resource so it is similar to the back buffer resource, then use it as weaver input.
/// \param effect_resource_desc ReShade resource representing the currently selected back buffer description
Expand All @@ -65,7 +65,7 @@ class DirectX10Weaver: public IGraphicsApi {

// Inherited via IGraphicsApi
void draw_status_overlay(reshade::api::effect_runtime *runtime) override;
ReturnCodes on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) override;
GbResult on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) override;
void on_init_effect_runtime(reshade::api::effect_runtime* runtime) override;
void do_weave(bool do_weave) override;
bool set_latency_in_frames(int32_t number_of_frames) override;
Expand Down
8 changes: 4 additions & 4 deletions gamebridge_reshade/src/directx11weaver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ bool DirectX11Weaver::create_effect_copy_buffer(const reshade::api::resource_des
return true;
}

ReturnCodes DirectX11Weaver::init_weaver(reshade::api::effect_runtime *runtime, reshade::api::resource rtv,
reshade::api::command_list *cmd_list) {
GbResult DirectX11Weaver::init_weaver(reshade::api::effect_runtime *runtime, reshade::api::resource rtv,
reshade::api::command_list *cmd_list) {
if (weaver_initialized) {
return SUCCESS;
}
Expand Down Expand Up @@ -124,7 +124,7 @@ void DirectX11Weaver::draw_status_overlay(reshade::api::effect_runtime *runtime)
ImGui::TextUnformatted(s.c_str());
}

ReturnCodes DirectX11Weaver::on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) {
GbResult DirectX11Weaver::on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) {
reshade::api::resource_view chosen_rtv;

if (use_srgb_rtv) {
Expand Down Expand Up @@ -186,7 +186,7 @@ ReturnCodes DirectX11Weaver::on_reshade_finish_effects(reshade::api::effect_runt
check_color_format(desc);

create_effect_copy_buffer(desc);
ReturnCodes result = init_weaver(runtime, effect_frame_copy, cmd_list);
GbResult result = init_weaver(runtime, effect_frame_copy, cmd_list);
if (result == SUCCESS) {
// Set context and input frame buffer again to make sure they are correct
weaver->setContext((ID3D11DeviceContext*)cmd_list->get_native());
Expand Down
6 changes: 3 additions & 3 deletions gamebridge_reshade/src/directx11weaver.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ class DirectX11Weaver: public IGraphicsApi {
/// \param rtv Represents the current render target view
/// \param cmd_list Represents the current command list from ReShade
/// \return An enum representing the return code
ReturnCodes init_weaver(reshade::api::effect_runtime *runtime, reshade::api::resource rtv,
reshade::api::command_list *cmd_list);
GbResult init_weaver(reshade::api::effect_runtime *runtime, reshade::api::resource rtv,
reshade::api::command_list *cmd_list);

/// \brief Creates and reset the effect copy resource so it is similar to the back buffer resource, then use it as weaver input.
/// \param effect_resource_desc ReShade resource representing the currently selected back buffer description
Expand All @@ -66,7 +66,7 @@ class DirectX11Weaver: public IGraphicsApi {

// Inherited via IGraphicsApi
void draw_status_overlay(reshade::api::effect_runtime *runtime) override;
ReturnCodes on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) override;
GbResult on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) override;
void on_init_effect_runtime(reshade::api::effect_runtime* runtime) override;
void do_weave(bool do_weave) override;
bool set_latency_in_frames(int32_t number_of_frames) override;
Expand Down
17 changes: 14 additions & 3 deletions gamebridge_reshade/src/directx12weaver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ DirectX12Weaver::DirectX12Weaver(SR::SRContext* context) {
weaving_enabled = true;
}

ReturnCodes DirectX12Weaver::init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::resource back_buffer) {
GbResult DirectX12Weaver::init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::resource back_buffer) {
if (weaver_initialized) {
return SUCCESS;
}
Expand Down Expand Up @@ -119,7 +119,7 @@ bool DirectX12Weaver::create_effect_copy_buffer(const reshade::api::resource_des
return true;
}

ReturnCodes DirectX12Weaver::on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) {
GbResult DirectX12Weaver::on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) {
reshade::api::resource_view chosen_rtv;

if (use_srgb_rtv) {
Expand All @@ -132,6 +132,15 @@ ReturnCodes DirectX12Weaver::on_reshade_finish_effects(reshade::api::effect_runt
reshade::api::resource rtv_resource = d3d12_device->get_resource_from_view(chosen_rtv);
reshade::api::resource_desc desc = d3d12_device->get_resource_desc(rtv_resource);

// Bind a viewport for the weaver in case there isn't one defined already. This happens when no effects are enabled in ReShade.
const reshade::api::viewport viewport = {
0.0f, 0.0f,
static_cast<float>(desc.texture.width),
static_cast<float>(desc.texture.height),
0.0f, 1.0f
};
cmd_list->bind_viewports(0, 1, &viewport);

if (weaver_initialized) {
// Check if we need to set the latency in frames.
if (get_latency_mode() == LatencyModes::LATENCY_IN_FRAMES_AUTOMATIC) {
Expand Down Expand Up @@ -170,6 +179,7 @@ ReturnCodes DirectX12Weaver::on_reshade_finish_effects(reshade::api::effect_runt
}
else {
if (weaving_enabled) {
cmd_list->bind_descriptor_tables(reshade::api::shader_stage::all, reshade::api::pipeline_layout {}, 0, 0, nullptr);
weaver->setCommandList((ID3D12GraphicsCommandList*)cmd_list->get_native());

// Create copy of the effect buffer
Expand All @@ -184,6 +194,7 @@ ReturnCodes DirectX12Weaver::on_reshade_finish_effects(reshade::api::effect_runt

// Weave to back buffer
cmd_list->barrier(effect_frame_copy, reshade::api::resource_usage::copy_dest, reshade::api::resource_usage::unordered_access);

weaver->weave(desc.texture.width, desc.texture.height);

// Check if the descriptor heap offset is set. If it is, we have to reset the descriptor heaps to ensure the ReShade overlay can render.
Expand All @@ -199,7 +210,7 @@ ReturnCodes DirectX12Weaver::on_reshade_finish_effects(reshade::api::effect_runt
check_color_format(desc);

create_effect_copy_buffer(desc);
ReturnCodes result = init_weaver(runtime, effect_frame_copy, d3d12_device->get_resource_from_view(chosen_rtv));
GbResult result = init_weaver(runtime, effect_frame_copy, d3d12_device->get_resource_from_view(chosen_rtv));
if (result == SUCCESS) {
// Set command list and input frame buffer again to make sure they are correct
weaver->setCommandList((ID3D12GraphicsCommandList*)cmd_list->get_native());
Expand Down
4 changes: 2 additions & 2 deletions gamebridge_reshade/src/directx12weaver.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class DirectX12Weaver: public IGraphicsApi {
/// \param rtv Represents the buffer that the weaver uses as a source to weave with
/// \param back_buffer Represents the current back buffer from ReShade
/// \return A bool representing if the weaver was initialized successfully
ReturnCodes init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::resource back_buffer);
GbResult init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::resource back_buffer);

/// \brief Creates and reset the effect copy resource so it is similar to the back buffer resource, then use it as weaver input.
/// \param effect_resource_desc ReShade resource representing the currently selected back buffer description
Expand All @@ -64,7 +64,7 @@ class DirectX12Weaver: public IGraphicsApi {

// Inherited via IGraphicsApi
void draw_status_overlay(reshade::api::effect_runtime *runtime) override;
ReturnCodes on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view) override;
GbResult on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view) override;
void on_init_effect_runtime(reshade::api::effect_runtime* runtime) override;
void do_weave(bool do_weave) override;
bool set_latency_in_frames(int32_t number_of_frames) override;
Expand Down
6 changes: 3 additions & 3 deletions gamebridge_reshade/src/directx9weaver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ bool DirectX9Weaver::create_effect_copy_buffer(const reshade::api::resource_desc
return true;
}

ReturnCodes DirectX9Weaver::init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::command_list* cmd_list) {
GbResult DirectX9Weaver::init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::command_list* cmd_list) {
if (weaver_initialized) {
return SUCCESS;
}
Expand Down Expand Up @@ -104,7 +104,7 @@ void DirectX9Weaver::draw_status_overlay(reshade::api::effect_runtime *runtime)
ImGui::TextUnformatted(s.c_str());
}

ReturnCodes DirectX9Weaver::on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) {
GbResult DirectX9Weaver::on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) {
reshade::api::resource_view chosen_rtv;

if (use_srgb_rtv) {
Expand Down Expand Up @@ -171,7 +171,7 @@ ReturnCodes DirectX9Weaver::on_reshade_finish_effects(reshade::api::effect_runti
check_color_format(desc);

create_effect_copy_buffer(desc);
ReturnCodes result = init_weaver(runtime, effect_frame_copy, cmd_list);
GbResult result = init_weaver(runtime, effect_frame_copy, cmd_list);
if (result == SUCCESS) {
// Set context and input frame buffer again to make sure they are correct
weaver->setInputFrameBuffer((IDirect3DTexture9*)effect_frame_copy.handle);
Expand Down
4 changes: 2 additions & 2 deletions gamebridge_reshade/src/directx9weaver.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class DirectX9Weaver: public IGraphicsApi {
/// \param rtv Represents the current render target view
/// \param cmd_list Represents the current command list from ReShade
/// \return A bool representing if the weaver was initialized successfully
ReturnCodes init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::command_list* cmd_list);
GbResult init_weaver(reshade::api::effect_runtime* runtime, reshade::api::resource rtv, reshade::api::command_list* cmd_list);

/// \brief Creates and reset the effect copy resource so it is similar to the back buffer resource, then use it as weaver input.
/// \param effect_resource_desc ReShade resource representing the currently selected back buffer description
Expand All @@ -64,7 +64,7 @@ class DirectX9Weaver: public IGraphicsApi {

// Inherited via IGraphicsApi
void draw_status_overlay(reshade::api::effect_runtime *runtime) override;
ReturnCodes on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) override;
GbResult on_reshade_finish_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list, reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) override;
void on_init_effect_runtime(reshade::api::effect_runtime* runtime) override;
void do_weave(bool do_weave) override;
bool set_latency_in_frames(int32_t number_of_frames) override;
Expand Down
Loading

0 comments on commit 1c55195

Please sign in to comment.