mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-22 16:54:27 +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(
|
key.setFilter(
|
||||||
DecodeFilter(minFilter),
|
DecodeFilter(minFilter),
|
||||||
DecodeFilter(magFilter),
|
DecodeFilter(magFilter),
|
||||||
DecodeMipFilter(mipFilter).MipFilter);
|
DecodeMipFilter(mipFilter));
|
||||||
|
|
||||||
if (m_cubeTextures & (1u << Sampler)) {
|
if (m_cubeTextures & (1u << Sampler)) {
|
||||||
key.setAddressModes(
|
key.setAddressModes(
|
||||||
@ -6665,7 +6665,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
key.setDepthCompare(m_depthTextures & (1u << Sampler), VK_COMPARE_OP_LESS_OR_EQUAL);
|
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
|
// Anisotropic filtering doesn't make any sense with only one mip
|
||||||
uint32_t anisotropy = state[D3DSAMP_MAXANISOTROPY];
|
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) {
|
VkCompareOp DecodeCompareOp(D3DCMPFUNC Func) {
|
||||||
switch (Func) {
|
switch (Func) {
|
||||||
default:
|
default:
|
||||||
|
@ -25,11 +25,6 @@ namespace dxvk {
|
|||||||
static constexpr D3D9ShaderMasks FixedFunctionMask =
|
static constexpr D3D9ShaderMasks FixedFunctionMask =
|
||||||
{ 0b1111111, 0b1 };
|
{ 0b1111111, 0b1 };
|
||||||
|
|
||||||
struct D3D9MipFilter {
|
|
||||||
bool MipsEnabled;
|
|
||||||
VkSamplerMipmapMode MipFilter;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct D3D9BlendState {
|
struct D3D9BlendState {
|
||||||
D3DBLEND Src;
|
D3DBLEND Src;
|
||||||
D3DBLEND Dst;
|
D3DBLEND Dst;
|
||||||
@ -146,13 +141,26 @@ namespace dxvk {
|
|||||||
|
|
||||||
VkBlendOp DecodeBlendOp(D3DBLENDOP BlendOp);
|
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);
|
VkCompareOp DecodeCompareOp(D3DCMPFUNC Func);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user