From 561254b51df4f5ae24f6a9b2c3d8c5dc8cfbceb5 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Wed, 27 May 2020 08:57:01 +0100 Subject: [PATCH] [d3d9] Support RENDERTARGET and AUTOGENMIPMAP together Fixes funky water in Trackmania Closes #1642 --- src/d3d9/d3d9_device.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 46a4576c..d12477fd 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -1133,11 +1133,11 @@ namespace dxvk { return D3DERR_INVALIDCALL; D3D9Surface* rt = static_cast(pRenderTarget); - const auto* desc = rt != nullptr - ? rt->GetCommonTexture()->Desc() + D3D9CommonTexture* texInfo = rt != nullptr + ? rt->GetCommonTexture() : nullptr; - if (unlikely(desc && !(desc->Usage & D3DUSAGE_RENDERTARGET))) + if (unlikely(rt != nullptr && !(texInfo->Desc()->Usage & D3DUSAGE_RENDERTARGET))) return D3DERR_INVALIDCALL; if (RenderTargetIndex == 0) { @@ -1185,14 +1185,19 @@ namespace dxvk { m_alphaSwizzleRTs &= ~(1 << RenderTargetIndex); - if (rt != nullptr && rt->GetCommonTexture()->GetMapping().Swizzle.a == VK_COMPONENT_SWIZZLE_ONE) - m_alphaSwizzleRTs |= 1 << RenderTargetIndex; + if (rt != nullptr) { + if (texInfo->GetMapping().Swizzle.a == VK_COMPONENT_SWIZZLE_ONE) + m_alphaSwizzleRTs |= 1 << RenderTargetIndex; + + if (texInfo->IsAutomaticMip()) + texInfo->SetNeedsMipGen(true); + } if (originalAlphaSwizzleRTs != m_alphaSwizzleRTs) m_flags.set(D3D9DeviceFlag::DirtyBlendState); if (RenderTargetIndex == 0) { - bool validSampleMask = desc->MultiSample > D3DMULTISAMPLE_NONMASKABLE; + bool validSampleMask = texInfo->Desc()->MultiSample > D3DMULTISAMPLE_NONMASKABLE; if (validSampleMask != m_flags.test(D3D9DeviceFlag::ValidSampleMask)) { m_flags.clr(D3D9DeviceFlag::ValidSampleMask);