Skip to content

Commit 5f51d9f

Browse files
committed
Fix glitchy shadows
1 parent 2d4c464 commit 5f51d9f

File tree

1 file changed

+46
-2
lines changed

1 file changed

+46
-2
lines changed

impl.cpp

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ struct ATFIX_RESOURCE_INFO {
2828
uint32_t CPUFlags;
2929
};
3030

31+
static bool isPowerOfTwo(UINT value) {
32+
return (value & (value - 1)) == 0;
33+
}
34+
3135
void* ptroffset(void* base, ptrdiff_t offset) {
3236
auto address = reinterpret_cast<uintptr_t>(base) + offset;
3337
return reinterpret_cast<void*>(address);
@@ -744,9 +748,7 @@ class DeviceWrapper final : public ID3D11Device, IDXGIDevice1 {
744748
HRESULT STDMETHODCALLTYPE SetMaximumFrameLatency(UINT MaxLatency) override { return dxgi->SetMaximumFrameLatency(MaxLatency); }
745749
HRESULT STDMETHODCALLTYPE GetMaximumFrameLatency(UINT* pMaxLatency) override { return dxgi->GetMaximumFrameLatency(pMaxLatency); }
746750

747-
HRESULT STDMETHODCALLTYPE CreateShaderResourceView(ID3D11Resource* pResource, const D3D11_SHADER_RESOURCE_VIEW_DESC* pDesc, ID3D11ShaderResourceView** ppSRView) override { return dev->CreateShaderResourceView(pResource, pDesc, ppSRView); }
748751
HRESULT STDMETHODCALLTYPE CreateUnorderedAccessView(ID3D11Resource* pResource, const D3D11_UNORDERED_ACCESS_VIEW_DESC* pDesc, ID3D11UnorderedAccessView** ppUAView) override { return dev->CreateUnorderedAccessView(pResource, pDesc, ppUAView); }
749-
HRESULT STDMETHODCALLTYPE CreateRenderTargetView(ID3D11Resource* pResource, const D3D11_RENDER_TARGET_VIEW_DESC* pDesc, ID3D11RenderTargetView** ppRTView) override { return dev->CreateRenderTargetView(pResource, pDesc, ppRTView); }
750752
HRESULT STDMETHODCALLTYPE CreateDepthStencilView(ID3D11Resource* pResource, const D3D11_DEPTH_STENCIL_VIEW_DESC* pDesc, ID3D11DepthStencilView** ppDepthStencilView) override { return dev->CreateDepthStencilView(pResource, pDesc, ppDepthStencilView); }
751753
HRESULT STDMETHODCALLTYPE CreateInputLayout(const D3D11_INPUT_ELEMENT_DESC* pInputElementDescs, UINT NumElements, const void* pShaderBytecodeWithInputSignature, SIZE_T BytecodeLength, ID3D11InputLayout** ppInputLayout) override { return dev->CreateInputLayout(pInputElementDescs, NumElements, pShaderBytecodeWithInputSignature, BytecodeLength, ppInputLayout); }
752754
HRESULT STDMETHODCALLTYPE CreateVertexShader(const void* pShaderBytecode, SIZE_T BytecodeLength, ID3D11ClassLinkage* pClassLinkage, ID3D11VertexShader** ppVertexShader) override { return dev->CreateVertexShader(pShaderBytecode, BytecodeLength, pClassLinkage, ppVertexShader); }
@@ -777,6 +779,40 @@ class DeviceWrapper final : public ID3D11Device, IDXGIDevice1 {
777779
HRESULT STDMETHODCALLTYPE SetExceptionMode(UINT RaiseFlags) override { return dev->SetExceptionMode(RaiseFlags); }
778780
UINT STDMETHODCALLTYPE GetExceptionMode(void) override { return dev->GetExceptionMode(); }
779781

782+
HRESULT STDMETHODCALLTYPE CreateShaderResourceView(ID3D11Resource* pResource, const D3D11_SHADER_RESOURCE_VIEW_DESC* pDesc, ID3D11ShaderResourceView** ppSRView) override {
783+
ID3D11Texture2D* tex = nullptr;
784+
D3D11_SHADER_RESOURCE_VIEW_DESC desc;
785+
if (SUCCEEDED(pResource->QueryInterface(IID_PPV_ARGS(&tex)))) {
786+
D3D11_TEXTURE2D_DESC tdesc;
787+
tex->GetDesc(&tdesc);
788+
if (tdesc.Format == DXGI_FORMAT_R16G16B16A16_UNORM && pDesc->Format == DXGI_FORMAT_B8G8R8A8_UNORM) {
789+
// Our modified shadow texture
790+
desc = *pDesc;
791+
desc.Format = DXGI_FORMAT_R16G16B16A16_UNORM;
792+
pDesc = &desc;
793+
}
794+
tex->Release();
795+
}
796+
return dev->CreateShaderResourceView(pResource, pDesc, ppSRView);
797+
}
798+
799+
HRESULT STDMETHODCALLTYPE CreateRenderTargetView(ID3D11Resource* pResource, const D3D11_RENDER_TARGET_VIEW_DESC* pDesc, ID3D11RenderTargetView** ppRTView) override {
800+
ID3D11Texture2D* tex = nullptr;
801+
D3D11_RENDER_TARGET_VIEW_DESC desc;
802+
if (SUCCEEDED(pResource->QueryInterface(IID_PPV_ARGS(&tex)))) {
803+
D3D11_TEXTURE2D_DESC tdesc;
804+
tex->GetDesc(&tdesc);
805+
if (tdesc.Format == DXGI_FORMAT_R16G16B16A16_UNORM && pDesc->Format == DXGI_FORMAT_B8G8R8A8_UNORM) {
806+
// Our modified shadow texture
807+
desc = *pDesc;
808+
desc.Format = DXGI_FORMAT_R16G16B16A16_UNORM;
809+
pDesc = &desc;
810+
}
811+
tex->Release();
812+
}
813+
return dev->CreateRenderTargetView(pResource, pDesc, ppRTView);
814+
}
815+
780816
HRESULT STDMETHODCALLTYPE CreatePixelShader(const void* pShaderBytecode, SIZE_T BytecodeLength, ID3D11ClassLinkage* pClassLinkage, ID3D11PixelShader** ppPixelShader) override {
781817
void* converted = nullptr;
782818
if (config.msaaSamples > 1 && shouldUseSampleRate(pShaderBytecode, BytecodeLength))
@@ -852,6 +888,14 @@ class DeviceWrapper final : public ID3D11Device, IDXGIDevice1 {
852888
pDesc = &desc;
853889
}
854890

891+
if (pDesc && isPowerOfTwo(pDesc->Width) && isPowerOfTwo(pDesc->Height) && pDesc->Format == DXGI_FORMAT_B8G8R8A8_TYPELESS && (pDesc->BindFlags & D3D11_BIND_RENDER_TARGET)) {
892+
// Unless someone has a really weird display resolution, this is the shadow texture
893+
// Increase its bit depth to prevent glitchy shadows
894+
desc = *pDesc;
895+
desc.Format = DXGI_FORMAT_R16G16B16A16_UNORM;
896+
pDesc = &desc;
897+
}
898+
855899
return dev->CreateTexture2D(pDesc, pData, ppTexture);
856900
}
857901

0 commit comments

Comments
 (0)