1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-20 19:54:19 +01:00

[d3d9] Optimize sampler state decoding

This code is rather hot now, so make sure it's fast.
This commit is contained in:
Philip Rebohle 2024-09-27 17:01:28 +02:00 committed by Philip Rebohle
parent c7dab6a442
commit 543b5c7af8
3 changed files with 19 additions and 60 deletions

View File

@ -6647,7 +6647,7 @@ namespace dxvk {
key.setFilter(
DecodeFilter(minFilter),
DecodeFilter(magFilter),
DecodeMipFilter(mipFilter).MipFilter);
DecodeMipFilter(mipFilter));
if (m_cubeTextures & (1u << Sampler)) {
key.setAddressModes(
@ -6665,7 +6665,7 @@ namespace dxvk {
key.setDepthCompare(m_depthTextures & (1u << Sampler), VK_COMPARE_OP_LESS_OR_EQUAL);
if (mipFilter != D3DTEXF_NONE) {
if (mipFilter) {
// Anisotropic filtering doesn't make any sense with only one mip
uint32_t anisotropy = state[D3DSAMP_MAXANISOTROPY];

View File

@ -198,55 +198,6 @@ namespace dxvk {
}
VkFilter DecodeFilter(D3DTEXTUREFILTERTYPE Filter) {
switch (Filter) {
case D3DTEXF_NONE:
case D3DTEXF_POINT:
return VK_FILTER_NEAREST;
default:
return VK_FILTER_LINEAR;
}
}
D3D9MipFilter DecodeMipFilter(D3DTEXTUREFILTERTYPE Filter) {
D3D9MipFilter filter;
filter.MipsEnabled = Filter != D3DTEXF_NONE;
switch (Filter) {
case D3DTEXF_POINT:
case D3DTEXF_NONE:
filter.MipFilter = VK_SAMPLER_MIPMAP_MODE_NEAREST; break;
default:
filter.MipFilter = VK_SAMPLER_MIPMAP_MODE_LINEAR; break;
}
return filter;
}
bool IsAnisotropic(D3DTEXTUREFILTERTYPE Filter) {
return Filter == D3DTEXF_ANISOTROPIC;
}
VkSamplerAddressMode DecodeAddressMode(D3DTEXTUREADDRESS Mode) {
switch (Mode) {
default:
case D3DTADDRESS_WRAP:
return VK_SAMPLER_ADDRESS_MODE_REPEAT;
case D3DTADDRESS_MIRROR:
return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
case D3DTADDRESS_CLAMP:
return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
case D3DTADDRESS_BORDER:
return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
case D3DTADDRESS_MIRRORONCE:
return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
}
}
VkCompareOp DecodeCompareOp(D3DCMPFUNC Func) {
switch (Func) {
default:

View File

@ -25,11 +25,6 @@ namespace dxvk {
static constexpr D3D9ShaderMasks FixedFunctionMask =
{ 0b1111111, 0b1 };
struct D3D9MipFilter {
bool MipsEnabled;
VkSamplerMipmapMode MipFilter;
};
struct D3D9BlendState {
D3DBLEND Src;
D3DBLEND Dst;
@ -146,13 +141,26 @@ namespace dxvk {
VkBlendOp DecodeBlendOp(D3DBLENDOP BlendOp);
VkFilter DecodeFilter(D3DTEXTUREFILTERTYPE Filter);
inline VkFilter DecodeFilter(D3DTEXTUREFILTERTYPE Filter) {
return Filter > D3DTEXF_POINT ? VK_FILTER_LINEAR : VK_FILTER_NEAREST;
}
D3D9MipFilter DecodeMipFilter(D3DTEXTUREFILTERTYPE Filter);
inline VkSamplerMipmapMode DecodeMipFilter(D3DTEXTUREFILTERTYPE Filter) {
return Filter > D3DTEXF_POINT ? VK_SAMPLER_MIPMAP_MODE_LINEAR : VK_SAMPLER_MIPMAP_MODE_NEAREST;
}
bool IsAnisotropic(D3DTEXTUREFILTERTYPE Filter);
inline VkSamplerAddressMode DecodeAddressMode(D3DTEXTUREADDRESS Mode) {
constexpr uint32_t Lut =
(uint32_t(VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT) << (3 * D3DTADDRESS_MIRROR)) |
(uint32_t(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE) << (3 * D3DTADDRESS_CLAMP)) |
(uint32_t(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) << (3 * D3DTADDRESS_BORDER)) |
(uint32_t(VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE) << (3 * D3DTADDRESS_MIRRORONCE));
VkSamplerAddressMode DecodeAddressMode(D3DTEXTUREADDRESS Mode);
// VK_SAMPLER_ADDRESS_MODE_REPEAT has a value of 0, so we
// get it for free if the app passes an unsupported value
uint32_t shift = std::min(uint32_t(Mode) * 3u, 31u);
return VkSamplerAddressMode((uint32_t(Lut) >> shift) & 0x7u);
}
VkCompareOp DecodeCompareOp(D3DCMPFUNC Func);