Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 64 additions & 2 deletions src/Deferred.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,21 @@ void Deferred::SetupResources()
SetupRenderTarget(NORMALROUGHNESS, texDesc, srvDesc, rtvDesc, uavDesc, DXGI_FORMAT_R10G10B10A2_UNORM, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE);
// Masks
SetupRenderTarget(MASKS, texDesc, srvDesc, rtvDesc, uavDesc, DXGI_FORMAT_R8G8B8A8_UNORM, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE);

texDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
texDesc.Width = 2;
texDesc.Height = 2;

adaptationTextures[0] = new Texture2D(texDesc);
adaptationTextures[1] = new Texture2D(texDesc);

srvDesc.Format = texDesc.Format;
adaptationTextures[0]->CreateSRV(srvDesc);
adaptationTextures[1]->CreateSRV(srvDesc);

rtvDesc.Format = texDesc.Format;
adaptationTextures[0]->CreateRTV(rtvDesc);
adaptationTextures[1]->CreateRTV(rtvDesc);
}

{
Expand Down Expand Up @@ -751,9 +766,56 @@ ID3D11ComputeShader* Deferred::GetComputeMainCompositeInterior()
return mainCompositeInteriorCS;
}

// Testing code for imagespace shaders
void Deferred::BindLUT()
void Deferred::HDRShaderHacks()
{
if (globals::state->currentShader && globals::state->currentShader->shaderType.get() == RE::BSShader::Type::ImageSpace) {
const auto& isShader = static_cast<const RE::BSImagespaceShader&>(*globals::state->currentShader);

enum class ShaderAction
{
Adaptation,
HDR
};

static const ankerl::unordered_dense::map<std::string_view, ShaderAction> shaderMap{
{ "BSImagespaceShaderHDRDownSample4LightAdapt", ShaderAction::Adaptation },
{ "BSImagespaceShaderHDRDownSample16LightAdapt", ShaderAction::Adaptation },
{ "BSImagespaceShaderHDRTonemapBlendCinematic", ShaderAction::HDR },
{ "BSImagespaceShaderHDRTonemapBlendCinematicFade", ShaderAction::HDR }
};

auto it = shaderMap.find(isShader.name);
if (it != shaderMap.cend()) {
switch (it->second) {
case ShaderAction::Adaptation:
BindAdaptationShader();
break;
case ShaderAction::HDR:
BindHDRShader();
break;
}
}
}
}

void Deferred::BindAdaptationShader()
{
uint frameSwap = (globals::state->frameCount % 2);

auto srv = adaptationTextures[frameSwap]->srv.get();
globals::d3d::context->PSSetShaderResources(1, 1, &srv);

auto rtv = adaptationTextures[!frameSwap]->rtv.get();
globals::d3d::context->OMSetRenderTargets(1, &rtv, nullptr);
}
Comment thread
doodlum marked this conversation as resolved.

void Deferred::BindHDRShader()
{
uint frameSwap = (globals::state->frameCount % 2);

auto srv = adaptationTextures[!frameSwap]->srv.get();
globals::d3d::context->PSSetShaderResources(2, 1, &srv);

auto view = lutTexture.get();
if (view)
globals::d3d::context->PSSetShaderResources(100, 1, &view);
Expand Down
31 changes: 7 additions & 24 deletions src/Deferred.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ class Deferred

ID3D11ComputeShader* GetComputeMainCompositeInterior();

void HDRShaderHacks();

void BindAdaptationShader();

void BindHDRShader();

ID3D11BlendState* deferredBlendStates[7][2][13][2];
ID3D11BlendState* forwardBlendStates[7][2][13][2];

Expand Down Expand Up @@ -73,8 +79,8 @@ class Deferred
Buffer* perShadow = nullptr;
ID3D11ShaderResourceView* shadowView = nullptr;

Texture2D* adaptationTextures[2];
winrt::com_ptr<ID3D11ShaderResourceView> lutTexture = nullptr;
void BindLUT();

struct Hooks
{
Expand Down Expand Up @@ -108,26 +114,6 @@ class Deferred
static inline REL::Relocation<decltype(thunk)> func;
};

struct BSImagespaceShaderHDRTonemapBlendCinematic_SetupTechnique
{
static void thunk(RE::BSShader* a_shader, RE::BSShaderMaterial* a_material)
{
GetSingleton()->BindLUT();
func(a_shader, a_material);
}
static inline REL::Relocation<decltype(thunk)> func;
};

struct BSImagespaceShaderHDRTonemapBlendCinematicFade_SetupTechnique
{
static void thunk(RE::BSShader* a_shader, RE::BSShaderMaterial* a_material)
{
GetSingleton()->BindLUT();
func(a_shader, a_material);
}
static inline REL::Relocation<decltype(thunk)> func;
};

struct Main_RenderFirstPersonView
{
static void thunk(bool a1, bool a2);
Expand Down Expand Up @@ -155,9 +141,6 @@ class Deferred

stl::detour_thunk<Renderer_ResetState>(REL::RelocationID(75570, 77371));

stl::write_vfunc<0x2, BSImagespaceShaderHDRTonemapBlendCinematic_SetupTechnique>(RE::VTABLE_BSImagespaceShaderHDRTonemapBlendCinematic[0]);
stl::write_vfunc<0x2, BSImagespaceShaderHDRTonemapBlendCinematicFade_SetupTechnique>(RE::VTABLE_BSImagespaceShaderHDRTonemapBlendCinematicFade[0]);

logger::info("[Deferred] Installed hooks");
}
};
Expand Down
2 changes: 2 additions & 0 deletions src/State.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ void State::Draw()

truePBR->SetShaderResouces(context);

globals::deferred->HDRShaderHacks();

if (permutationData != permutationDataPrevious) {
permutationCB->Update(permutationData);
permutationDataPrevious = permutationData;
Expand Down