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:
parent
c7dab6a442
commit
543b5c7af8
@ -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];
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user