diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 4e4f29f67..5519be49f 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -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]; diff --git a/src/d3d9/d3d9_util.cpp b/src/d3d9/d3d9_util.cpp index ba0eaf663..bba628593 100644 --- a/src/d3d9/d3d9_util.cpp +++ b/src/d3d9/d3d9_util.cpp @@ -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: diff --git a/src/d3d9/d3d9_util.h b/src/d3d9/d3d9_util.h index 0bdfb2b9b..5f71d8d72 100644 --- a/src/d3d9/d3d9_util.h +++ b/src/d3d9/d3d9_util.h @@ -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);