1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 07:29:17 +01:00

[d3d9] Convert border color to float in CS thread

It's cheaper to look up sampler keys this way
This commit is contained in:
Joshua Ashton 2020-05-07 13:11:59 +01:00
parent fd75775197
commit f88f424da4
3 changed files with 7 additions and 18 deletions

View File

@ -5308,7 +5308,7 @@ namespace dxvk {
key.MaxAnisotropy = state[D3DSAMP_MAXANISOTROPY]; key.MaxAnisotropy = state[D3DSAMP_MAXANISOTROPY];
key.MipmapLodBias = bit::cast<float>(state[D3DSAMP_MIPMAPLODBIAS]); key.MipmapLodBias = bit::cast<float>(state[D3DSAMP_MIPMAPLODBIAS]);
key.MaxMipLevel = state[D3DSAMP_MAXMIPLEVEL]; key.MaxMipLevel = state[D3DSAMP_MAXMIPLEVEL];
DecodeD3DCOLOR(D3DCOLOR(state[D3DSAMP_BORDERCOLOR]), key.BorderColor); key.BorderColor = D3DCOLOR(state[D3DSAMP_BORDERCOLOR]);
if (m_d3d9Options.samplerAnisotropy != -1) { if (m_d3d9Options.samplerAnisotropy != -1) {
if (key.MagFilter == D3DTEXF_LINEAR) if (key.MagFilter == D3DTEXF_LINEAR)
@ -5362,8 +5362,8 @@ namespace dxvk {
colorInfo.mipmapLodMin = mipFilter.MipsEnabled ? float(cKey.MaxMipLevel) : 0; colorInfo.mipmapLodMin = mipFilter.MipsEnabled ? float(cKey.MaxMipLevel) : 0;
colorInfo.mipmapLodMax = mipFilter.MipsEnabled ? FLT_MAX : 0; colorInfo.mipmapLodMax = mipFilter.MipsEnabled ? FLT_MAX : 0;
colorInfo.usePixelCoord = VK_FALSE; 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) { if (!m_dxvkDevice->features().extCustomBorderColor.customBorderColorWithoutFormat) {
// HACK: Let's get OPAQUE_WHITE border color over // HACK: Let's get OPAQUE_WHITE border color over

View File

@ -19,10 +19,7 @@ namespace dxvk {
state.add(dhash (key.MaxAnisotropy)); state.add(dhash (key.MaxAnisotropy));
state.add(fhash (key.MipmapLodBias)); state.add(fhash (key.MipmapLodBias));
state.add(dhash (key.MaxMipLevel)); state.add(dhash (key.MaxMipLevel));
state.add(fhash (key.BorderColor[0])); state.add(dhash (key.BorderColor));
state.add(fhash (key.BorderColor[1]));
state.add(fhash (key.BorderColor[2]));
state.add(fhash (key.BorderColor[3]));
return state; return state;
} }
@ -38,10 +35,7 @@ namespace dxvk {
&& a.MaxAnisotropy == b.MaxAnisotropy && a.MaxAnisotropy == b.MaxAnisotropy
&& a.MipmapLodBias == b.MipmapLodBias && a.MipmapLodBias == b.MipmapLodBias
&& a.MaxMipLevel == b.MaxMipLevel && a.MaxMipLevel == b.MaxMipLevel
&& a.BorderColor[0] == b.BorderColor[0] && a.BorderColor == b.BorderColor;
&& a.BorderColor[1] == b.BorderColor[1]
&& a.BorderColor[2] == b.BorderColor[2]
&& a.BorderColor[3] == b.BorderColor[3];
} }
} }

View File

@ -20,7 +20,7 @@ namespace dxvk {
DWORD MaxAnisotropy; DWORD MaxAnisotropy;
float MipmapLodBias; float MipmapLodBias;
DWORD MaxMipLevel; DWORD MaxMipLevel;
float BorderColor[4]; D3DCOLOR BorderColor;
}; };
struct D3D9SamplerKeyHash { struct D3D9SamplerKeyHash {
@ -63,12 +63,7 @@ namespace dxvk {
if (key.AddressU != D3DTADDRESS_BORDER if (key.AddressU != D3DTADDRESS_BORDER
&& key.AddressV != D3DTADDRESS_BORDER && key.AddressV != D3DTADDRESS_BORDER
&& key.AddressW != D3DTADDRESS_BORDER) { && key.AddressW != D3DTADDRESS_BORDER) {
for (auto& val : key.BorderColor) key.BorderColor = 0;
val = 0.0f;
}
else {
for (auto& val : key.BorderColor)
val = val >= 0.5f ? 1.0f : 0.0f;
} }
} }