|
|
|
@ -952,28 +952,28 @@ void RasterizerVulkan::UpdateDynamicStates() { |
|
|
|
UpdateDepthBiasEnable(regs); |
|
|
|
} |
|
|
|
if (device.IsExtExtendedDynamicState3EnablesSupported()) { |
|
|
|
using namespace Tegra::Engines; |
|
|
|
|
|
|
|
if (device.GetDriverID() == VkDriverIdKHR::VK_DRIVER_ID_AMD_OPEN_SOURCE |
|
|
|
|| device.GetDriverID() == VkDriverIdKHR::VK_DRIVER_ID_AMD_PROPRIETARY) { |
|
|
|
struct In { |
|
|
|
const Maxwell3D::Regs::VertexAttribute::Type d; |
|
|
|
In(Maxwell3D::Regs::VertexAttribute::Type n) : d(n) {} |
|
|
|
bool operator()(Maxwell3D::Regs::VertexAttribute n) const { |
|
|
|
return n.type == d; |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
auto has_float = std::any_of( |
|
|
|
regs.vertex_attrib_format.begin(), regs.vertex_attrib_format.end(), |
|
|
|
In(Maxwell3D::Regs::VertexAttribute::Type::Float)); |
|
|
|
|
|
|
|
if (regs.logic_op.enable) |
|
|
|
regs.logic_op.enable = static_cast<u32>(!has_float); |
|
|
|
|
|
|
|
UpdateLogicOpEnable(regs); |
|
|
|
} else |
|
|
|
UpdateLogicOpEnable(regs); |
|
|
|
using namespace Tegra::Engines; |
|
|
|
|
|
|
|
if (device.GetDriverID() == VkDriverIdKHR::VK_DRIVER_ID_AMD_OPEN_SOURCE |
|
|
|
|| device.GetDriverID() == VkDriverIdKHR::VK_DRIVER_ID_AMD_PROPRIETARY) { |
|
|
|
struct In { |
|
|
|
const Maxwell3D::Regs::VertexAttribute::Type d; |
|
|
|
In(Maxwell3D::Regs::VertexAttribute::Type n) : d(n) {} |
|
|
|
bool operator()(Maxwell3D::Regs::VertexAttribute n) const { |
|
|
|
return n.type == d; |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
auto has_float = std::any_of( |
|
|
|
regs.vertex_attrib_format.begin(), regs.vertex_attrib_format.end(), |
|
|
|
In(Maxwell3D::Regs::VertexAttribute::Type::Float)); |
|
|
|
|
|
|
|
if (regs.logic_op.enable) |
|
|
|
regs.logic_op.enable = static_cast<u32>(!has_float); |
|
|
|
|
|
|
|
UpdateLogicOpEnable(regs); |
|
|
|
} else |
|
|
|
UpdateLogicOpEnable(regs); |
|
|
|
UpdateDepthClampEnable(regs); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -1103,15 +1103,23 @@ void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs) { |
|
|
|
regs.zeta.format == Tegra::DepthFormat::X8Z24_UNORM || |
|
|
|
regs.zeta.format == Tegra::DepthFormat::S8Z24_UNORM || |
|
|
|
regs.zeta.format == Tegra::DepthFormat::V8Z24_UNORM; |
|
|
|
if (is_d24 && !device.SupportsD24DepthBuffer() && program_id == 0x1006A800016E000ULL) { |
|
|
|
// Only activate this in Super Smash Brothers Ultimate
|
|
|
|
|
|
|
|
size_t length = sizeof(NEEDS_D24) / sizeof(u64); |
|
|
|
bool needs_convert = false; |
|
|
|
for (size_t i = 0; i < length; ++i) { |
|
|
|
if (NEEDS_D24[i] == program_id) { |
|
|
|
needs_convert = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (is_d24 && !device.SupportsD24DepthBuffer() && needs_convert) { |
|
|
|
// the base formulas can be obtained from here:
|
|
|
|
// https://docs.microsoft.com/en-us/windows/win32/direct3d11/d3d10-graphics-programming-guide-output-merger-stage-depth-bias
|
|
|
|
const double rescale_factor = |
|
|
|
static_cast<double>(1ULL << (32 - 24)) / (static_cast<double>(0x1.ep+127)); |
|
|
|
const double rescale_factor = static_cast<double>(1ULL << (32 - 24)) |
|
|
|
/ (static_cast<double>(0x1.ep+127)); |
|
|
|
units = static_cast<float>(static_cast<double>(units) * rescale_factor); |
|
|
|
} |
|
|
|
scheduler.Record([constant = units, clamp = regs.depth_bias_clamp, |
|
|
|
} scheduler.Record([constant = units, clamp = regs.depth_bias_clamp, |
|
|
|
factor = regs.slope_scale_depth_bias](vk::CommandBuffer cmdbuf) { |
|
|
|
cmdbuf.SetDepthBias(constant, clamp, factor); |
|
|
|
}); |
|
|
|
|