@@ -28,6 +28,10 @@ struct ATFIX_RESOURCE_INFO {
28
28
uint32_t CPUFlags;
29
29
};
30
30
31
+ static bool isPowerOfTwo (UINT value) {
32
+ return (value & (value - 1 )) == 0 ;
33
+ }
34
+
31
35
void * ptroffset (void * base, ptrdiff_t offset) {
32
36
auto address = reinterpret_cast <uintptr_t >(base) + offset;
33
37
return reinterpret_cast <void *>(address);
@@ -744,9 +748,7 @@ class DeviceWrapper final : public ID3D11Device, IDXGIDevice1 {
744
748
HRESULT STDMETHODCALLTYPE SetMaximumFrameLatency (UINT MaxLatency) override { return dxgi->SetMaximumFrameLatency (MaxLatency); }
745
749
HRESULT STDMETHODCALLTYPE GetMaximumFrameLatency (UINT* pMaxLatency) override { return dxgi->GetMaximumFrameLatency (pMaxLatency); }
746
750
747
- HRESULT STDMETHODCALLTYPE CreateShaderResourceView (ID3D11Resource* pResource, const D3D11_SHADER_RESOURCE_VIEW_DESC* pDesc, ID3D11ShaderResourceView** ppSRView) override { return dev->CreateShaderResourceView (pResource, pDesc, ppSRView); }
748
751
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); }
750
752
HRESULT STDMETHODCALLTYPE CreateDepthStencilView (ID3D11Resource* pResource, const D3D11_DEPTH_STENCIL_VIEW_DESC* pDesc, ID3D11DepthStencilView** ppDepthStencilView) override { return dev->CreateDepthStencilView (pResource, pDesc, ppDepthStencilView); }
751
753
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); }
752
754
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 {
777
779
HRESULT STDMETHODCALLTYPE SetExceptionMode (UINT RaiseFlags) override { return dev->SetExceptionMode (RaiseFlags); }
778
780
UINT STDMETHODCALLTYPE GetExceptionMode (void ) override { return dev->GetExceptionMode (); }
779
781
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
+
780
816
HRESULT STDMETHODCALLTYPE CreatePixelShader (const void * pShaderBytecode, SIZE_T BytecodeLength, ID3D11ClassLinkage* pClassLinkage, ID3D11PixelShader** ppPixelShader) override {
781
817
void * converted = nullptr ;
782
818
if (config.msaaSamples > 1 && shouldUseSampleRate (pShaderBytecode, BytecodeLength))
@@ -852,6 +888,14 @@ class DeviceWrapper final : public ID3D11Device, IDXGIDevice1 {
852
888
pDesc = &desc;
853
889
}
854
890
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
+
855
899
return dev->CreateTexture2D (pDesc, pData, ppTexture);
856
900
}
857
901
0 commit comments