From f88f424da47ae9631c781165f3809e42fc7c476e Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Thu, 7 May 2020 13:11:59 +0100 Subject: [PATCH] [d3d9] Convert border color to float in CS thread It's cheaper to look up sampler keys this way --- src/d3d9/d3d9_device.cpp | 6 +++--- src/d3d9/d3d9_sampler.cpp | 10 ++-------- src/d3d9/d3d9_sampler.h | 9 ++------- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 97084075..973ac5d8 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -5308,7 +5308,7 @@ namespace dxvk { key.MaxAnisotropy = state[D3DSAMP_MAXANISOTROPY]; key.MipmapLodBias = bit::cast(state[D3DSAMP_MIPMAPLODBIAS]); key.MaxMipLevel = state[D3DSAMP_MAXMIPLEVEL]; - DecodeD3DCOLOR(D3DCOLOR(state[D3DSAMP_BORDERCOLOR]), key.BorderColor); + key.BorderColor = D3DCOLOR(state[D3DSAMP_BORDERCOLOR]); if (m_d3d9Options.samplerAnisotropy != -1) { if (key.MagFilter == D3DTEXF_LINEAR) @@ -5362,8 +5362,8 @@ namespace dxvk { colorInfo.mipmapLodMin = mipFilter.MipsEnabled ? float(cKey.MaxMipLevel) : 0; colorInfo.mipmapLodMax = mipFilter.MipsEnabled ? FLT_MAX : 0; colorInfo.usePixelCoord = VK_FALSE; - for (uint32_t i = 0; i < 4; i++) - colorInfo.borderColor.float32[i] = cKey.BorderColor[i]; + + DecodeD3DCOLOR(cKey.BorderColor, colorInfo.borderColor.float32); if (!m_dxvkDevice->features().extCustomBorderColor.customBorderColorWithoutFormat) { // HACK: Let's get OPAQUE_WHITE border color over diff --git a/src/d3d9/d3d9_sampler.cpp b/src/d3d9/d3d9_sampler.cpp index 79d23af9..cc16ed46 100644 --- a/src/d3d9/d3d9_sampler.cpp +++ b/src/d3d9/d3d9_sampler.cpp @@ -19,10 +19,7 @@ namespace dxvk { state.add(dhash (key.MaxAnisotropy)); state.add(fhash (key.MipmapLodBias)); state.add(dhash (key.MaxMipLevel)); - state.add(fhash (key.BorderColor[0])); - state.add(fhash (key.BorderColor[1])); - state.add(fhash (key.BorderColor[2])); - state.add(fhash (key.BorderColor[3])); + state.add(dhash (key.BorderColor)); return state; } @@ -38,10 +35,7 @@ namespace dxvk { && a.MaxAnisotropy == b.MaxAnisotropy && a.MipmapLodBias == b.MipmapLodBias && a.MaxMipLevel == b.MaxMipLevel - && a.BorderColor[0] == b.BorderColor[0] - && a.BorderColor[1] == b.BorderColor[1] - && a.BorderColor[2] == b.BorderColor[2] - && a.BorderColor[3] == b.BorderColor[3]; + && a.BorderColor == b.BorderColor; } } \ No newline at end of file diff --git a/src/d3d9/d3d9_sampler.h b/src/d3d9/d3d9_sampler.h index 26fec0f6..6083a124 100644 --- a/src/d3d9/d3d9_sampler.h +++ b/src/d3d9/d3d9_sampler.h @@ -20,7 +20,7 @@ namespace dxvk { DWORD MaxAnisotropy; float MipmapLodBias; DWORD MaxMipLevel; - float BorderColor[4]; + D3DCOLOR BorderColor; }; struct D3D9SamplerKeyHash { @@ -63,12 +63,7 @@ namespace dxvk { if (key.AddressU != D3DTADDRESS_BORDER && key.AddressV != D3DTADDRESS_BORDER && key.AddressW != D3DTADDRESS_BORDER) { - for (auto& val : key.BorderColor) - val = 0.0f; - } - else { - for (auto& val : key.BorderColor) - val = val >= 0.5f ? 1.0f : 0.0f; + key.BorderColor = 0; } }